Skip to content

Commit

Permalink
Breaking change: make flowPosition and when in Flow optional
Browse files Browse the repository at this point in the history
Preparatory refactoring for #2
  • Loading branch information
bertilmuth committed May 11, 2017
1 parent 3a98225 commit 7ad6bc8
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 36 deletions.
Expand Up @@ -2,6 +2,7 @@

import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Collectors;

Expand All @@ -15,8 +16,8 @@
*/
public class Flow extends UseCaseModelElement {
private UseCase useCase;
private Predicate<UseCaseModelRunner> flowPositionPredicate;
private Predicate<UseCaseModelRunner> whenPredicate;
private Optional<Predicate<UseCaseModelRunner>> optionalFlowPosition;
private Optional<Predicate<UseCaseModelRunner>> optionalWhen;

/**
* Creates a use case flow with the specified name that belongs to the specified use case.
Expand All @@ -27,6 +28,8 @@ public class Flow extends UseCaseModelElement {
Flow(String name, UseCase useCase) {
super(name, useCase.getUseCaseModel());
this.useCase = useCase;
this.optionalFlowPosition = Optional.empty();
this.optionalWhen = Optional.empty();
}

/**
Expand All @@ -53,19 +56,19 @@ public List<Step> getSteps() {
return Collections.unmodifiableList(steps);
}

public void setFlowPosition(Predicate<UseCaseModelRunner> flowPositionPredicate) {
this.flowPositionPredicate = flowPositionPredicate;
public void setFlowPosition(Predicate<UseCaseModelRunner> flowPosition) {
this.optionalFlowPosition = Optional.of(flowPosition);
}

public Predicate<UseCaseModelRunner> getFlowPosition() {
return flowPositionPredicate;
public Optional<Predicate<UseCaseModelRunner>> getFlowPosition() {
return optionalFlowPosition;
}

public void setWhen(Predicate<UseCaseModelRunner> whenPredicate) {
this.whenPredicate = whenPredicate;
public void setWhen(Predicate<UseCaseModelRunner> when) {
this.optionalWhen = Optional.of(when);
}

public Predicate<UseCaseModelRunner> getWhen() {
return whenPredicate;
public Optional<Predicate<UseCaseModelRunner>> getWhen() {
return optionalWhen;
}
}
Expand Up @@ -68,28 +68,29 @@ private boolean hasDefaultPredicate() {

public Predicate<UseCaseModelRunner> getPredicate() {
Optional<Predicate<UseCaseModelRunner>> predicate = Optional.empty();

if (reactWhile.isPresent()) {
predicate = reactWhile;
} else if (isFirstStepInFlow()) {
Predicate<UseCaseModelRunner> flowPosition = getFlow().getFlowPosition();
Predicate<UseCaseModelRunner> when = getFlow().getWhen();
Optional<Predicate<UseCaseModelRunner>> flowPosition = getFlow().getFlowPosition();
Optional<Predicate<UseCaseModelRunner>> when = getFlow().getWhen();
predicate = getCompletePredicate(flowPosition, when);
}

return predicate.orElse(defaultPredicate);
}

private Optional<Predicate<UseCaseModelRunner>> getCompletePredicate(
Predicate<UseCaseModelRunner> flowPosition, Predicate<UseCaseModelRunner> when) {
Optional<Predicate<UseCaseModelRunner>> predicate = Optional.empty();
if (flowPosition != null || when != null) {
Predicate<UseCaseModelRunner> alwaysTrue = r -> true;
flowPosition = flowPosition != null ? flowPosition : alwaysTrue;
when = when != null ? when : alwaysTrue;
predicate = Optional.of(isRunnerInDifferentFlow().and(flowPosition).and(when));
Optional<Predicate<UseCaseModelRunner>> flowPosition,
Optional<Predicate<UseCaseModelRunner>> when) {
Optional<Predicate<UseCaseModelRunner>> completePredicate = Optional.empty();
if (flowPosition.isPresent() || when.isPresent()) {
Predicate<UseCaseModelRunner> flowPositionOrElseTrue = flowPosition.orElse(r -> true);
Predicate<UseCaseModelRunner> whenOrElseTrue = when.orElse(r -> true);
completePredicate =
Optional.of(isRunnerInDifferentFlow().and(flowPositionOrElseTrue).and(whenOrElseTrue));
}
return predicate;
return completePredicate;
}

private Predicate<UseCaseModelRunner> isRunnerInDifferentFlow() {
Expand Down
@@ -1,5 +1,5 @@
<#function flowPositionName flow><#return (flow.flowPosition.class.simpleName)!""/></#function>
<#function whenName flow><#return (flow.when.class.simpleName)!""/></#function>
<#function flowPositionName flow><#return (flow.flowPosition.get().class.simpleName)!""/></#function>
<#function whenName flow><#return (flow.when.get().class.simpleName)!""/></#function>
<#function predicateName step><#return (step.predicate.class.simpleName)!""/></#function>
<#function reactWhileConditionName step><#return (step.predicate.reactWhileCondition.class.simpleName)!""/></#function>
<#function userEventName step><#return (step.userEventClass.simpleName)!""/></#function>
Expand All @@ -17,22 +17,25 @@
</#function>

<#function flowPosition f>
<#local flowPositionWords = wordsOf(flowPositionName(f))/>
<#local stepName = (f.flowPosition.stepName)!""/>
<#local result = [flowPositionWords?lower_case, stepName]?join(" ")?trim/>
<#local result = ""/>
<#if f.flowPosition.isPresent()>
<#local flowPositionWords = wordsOf(flowPositionName(f))/>
<#local stepName = (f.flowPosition.get().stepName)!""/>
<#local result = [flowPositionWords?lower_case, stepName]?join(" ")?trim/>
</#if>
<#return result/>
</#function>

<#function flowPredicateSeparator f sep>
<#if flowPositionName(f) != "" && whenName(f) != "">
<#if flowPosition(f) != "" && when(f) != "">
<#local result = sep/>
</#if>
<#return result!""/>
</#function>

<#function when f>
<#local whenWords = ""/>
<#if f.when??>
<#if f.when.isPresent()>
<#local whenWords = "when " + wordsOf(whenName(f))/>
</#if>
<#return whenWords?lower_case/>
Expand Down
@@ -1,5 +1,5 @@
<#function flowPositionName flow><#return (flow.flowPosition.class.simpleName)!""/></#function>
<#function whenName flow><#return (flow.when.class.simpleName)!""/></#function>
<#function flowPositionName flow><#return (flow.flowPosition.get().class.simpleName)!""/></#function>
<#function whenName flow><#return (flow.when.get().class.simpleName)!""/></#function>
<#function predicateName step><#return (step.predicate.class.simpleName)!""/></#function>
<#function reactWhileConditionName step><#return (step.predicate.reactWhileCondition.class.simpleName)!""/></#function>
<#function userEventName step><#return (step.userEventClass.simpleName)!""/></#function>
Expand All @@ -17,22 +17,25 @@
</#function>

<#function flowPosition f>
<#local flowPositionWords = wordsOf(flowPositionName(f))/>
<#local stepName = (f.flowPosition.stepName)!""/>
<#local result = [flowPositionWords?lower_case, stepName]?join(" ")?trim/>
<#local result = ""/>
<#if f.flowPosition.isPresent()>
<#local flowPositionWords = wordsOf(flowPositionName(f))/>
<#local stepName = (f.flowPosition.get().stepName)!""/>
<#local result = [flowPositionWords?lower_case, stepName]?join(" ")?trim/>
</#if>
<#return result/>
</#function>

<#function flowPredicateSeparator f sep>
<#if flowPositionName(f) != "" && whenName(f) != "">
<#if flowPosition(f) != "" && when(f) != "">
<#local result = sep/>
</#if>
<#return result!""/>
</#function>

<#function when f>
<#local whenWords = ""/>
<#if f.when??>
<#if f.when.isPresent()>
<#local whenWords = "when " + wordsOf(whenName(f))/>
</#if>
<#return whenWords?lower_case/>
Expand Down

0 comments on commit 7ad6bc8

Please sign in to comment.