@Override public void finalizeComplete(GraphProcess process) { process.setState(ProcessState.Completed); NodeToken parentToken = process.getParentToken(); if (parentToken != null) { Engine engine = getParentEngine() == null ? newEngine(false) : getParentEngine(); engine.complete(parentToken, Arc.DEFAULT_ARC); } }
private NodeToken backtrackCompletedToken( final NodeToken token, final ExecutionType executionType) { token.markBacktracked(); NodeTokenEvent.fireBacktrackedEvent(engine, token); List<ArcToken> parents = new ArrayList<ArcToken>(token.getChildTokens().size()); for (ArcToken childToken : token.getChildTokens()) { ArcToken parent = arcTokenMap.get(childToken); if (parent == null) { throw new RuntimeException("No backtrack found for: " + childToken); } parents.add(parent); } NodeToken backtrackToken = engine .getFactory() .newNodeToken(token.getProcess(), token.getNode(), executionType, parents, token); NodeTokenEvent.fireCreatedEvent(engine, backtrackToken); token.getProcess().addNodeToken(backtrackToken); shareTokenSets(backtrackToken, token); for (ArcToken parent : parents) { token.getProcess().removeActiveArcToken(parent); parent.markBacktracked(); ArcTokenEvent.fireBacktrackedEvent(engine, parent); parent.markComplete(backtrackToken); ArcTokenEvent.fireCompletedEvent(engine, parent); } return backtrackToken; }
private void shareTokenSets(final ArcToken newToken, final ArcToken origToken) { for (ArcTokenSetMember setMember : origToken.getTokenSetMemberships()) { TokenSet tokenSet = setMember.getTokenSet(); ArcTokenSetMember newSetMember = engine.getFactory().newArcTokenSetMember(tokenSet, newToken, setMember.getMemberIndex()); newToken.getTokenSetMemberships().add(newSetMember); tokenSet.getActiveArcTokens(engine).add(newToken); tokenSets.add(tokenSet); } }
public NodeToken backtrackDeadEnd(final NodeToken token) { token.markBacktracked(); NodeTokenEvent.fireBacktrackedEvent(engine, token); List<ArcToken> parents = new ArrayList<ArcToken>(token.getParentTokens().size()); for (ArcToken parent : token.getParentTokens()) { parent.markBacktracked(); ArcTokenEvent.fireBacktrackedEvent(engine, parent); ArcToken backtrackArcToken = engine .getFactory() .newArcToken(token.getProcess(), parent.getArc(), ExecutionType.UTurn, token); ArcTokenEvent.fireCreatedEvent(engine, backtrackArcToken); token.getChildTokens().add(backtrackArcToken); parents.add(backtrackArcToken); shareTokenSets(backtrackArcToken, parent); } NodeToken backtrackToken = engine .getFactory() .newNodeToken( token.getProcess(), token.getNode(), ExecutionType.Forward, parents, token); NodeTokenEvent.fireCreatedEvent(engine, backtrackToken); token.getProcess().addNodeToken(backtrackToken); shareTokenSets(backtrackToken, token); for (ArcToken parent : parents) { parent.markProcessed(); ArcTokenEvent.fireProcessedEvent(engine, parent); parent.markComplete(backtrackToken); ArcTokenEvent.fireCompletedEvent(engine, parent); } reactivateTokenSets(); return backtrackToken; }
private NodeToken backtrackToken(final NodeToken token) { NodeToken backtrackToken = token; if (!token.isComplete()) { token.markComplete(); NodeTokenEvent.fireCompletedEvent(engine, backtrackToken, null); token.markBacktracked(); NodeTokenEvent.fireBacktrackedEvent(engine, token); token.getProcess().removeActiveNodeToken(token); } else if (!token.getExecutionType().isBacktracked()) { if (token.getChildTokens().isEmpty()) { token.markBacktracked(); NodeTokenEvent.fireBacktrackedEvent(engine, token); } else { backtrackToken = backtrackCompletedToken(token, ExecutionType.Backtracked); backtrackToken.setGuardAction(GuardAction.SkipNode); NodeTokenEvent.fireSkippedEvent(engine, backtrackToken, null); } } for (ArcToken parent : getParents(token)) { boolean backtrackParent = visited.contains(parent.getParentToken()); token.getProcess().removeActiveArcToken(parent); parent.markBacktracked(); ArcTokenEvent.fireBacktrackedEvent(engine, parent); ArcToken backtrackArcToken = engine .getFactory() .newArcToken( token.getProcess(), parent.getArc(), backtrackParent ? ExecutionType.Backtracked : ExecutionType.UTurn, backtrackToken); ArcTokenEvent.fireCreatedEvent(engine, backtrackArcToken); backtrackToken.getChildTokens().add(backtrackArcToken); shareTokenSets(backtrackArcToken, parent); if (backtrackParent && parent.getExecutionType() != ExecutionType.Forward) { ArcToken mirror = backtrackMirror.getMirror(parent); arcTokenMap.put(mirror, backtrackArcToken); finishArcTokenBacktrack(backtrackArcToken, mirror); } else { finishArcTokenBacktrack(backtrackArcToken, parent); } } return backtrackToken; }