private void dfs(Queue<Map<String, String>> queue, AtomicBoolean flag, PossibleState state) throws IOException { if (flag.get()) { return; } TransitionTarget nextState = state.nextState; // reached end of chart, valid assignment found if (nextState.getId().equalsIgnoreCase("end")) { queue.add(state.variables); if (queue.size() > 10000) { log.info("Queue size " + queue.size() + ", waiting"); try { Thread.sleep(500); } catch (InterruptedException ex) { log.info("Interrupted ", ex); } } return; } // run every action in series List<Map<String, String>> product = new LinkedList<>(); product.add(new HashMap<>(state.variables)); OnEntry entry = nextState.getOnEntry(); List<Action> actions = entry.getActions(); for (Action action : actions) { for (CustomTagExtension tagExtension : tagExtensionList) { if (tagExtension.getTagActionClass().isInstance(action)) { product = tagExtension.pipelinePossibleStates(action, product); } } } // go through every transition and see which of the products are valid, recursive searching on // them List<Transition> transitions = nextState.getTransitionsList(); for (Transition transition : transitions) { String condition = transition.getCond(); TransitionTarget target = ((List<TransitionTarget>) transition.getTargets()).get(0); for (Map<String, String> p : product) { Boolean pass; if (condition == null) { pass = true; } else { // scrub the context clean so we may use it to evaluate transition conditional Context context = this.getRootContext(); context.reset(); // set up new context for (Map.Entry<String, String> e : p.entrySet()) { context.set(e.getKey(), e.getValue()); } // evaluate condition try { pass = (Boolean) this.getEvaluator().eval(context, condition); } catch (SCXMLExpressionException ex) { pass = false; } } // transition condition satisfied, continue search recursively if (pass) { PossibleState result = new PossibleState(target, p); dfs(queue, flag, result); } } } }
private DataPipe dfs( SingleThreadedProcessing singleThreadedProcessing, AtomicBoolean flag, PossibleState state) throws IOException { /*if (flag.get()) { // Updates and comments by Shraddha Patel return; }*/ TransitionTarget nextState = state.nextState; // run every action in series List<Map<String, String>> product = new LinkedList<>(); product.add(new HashMap<String, String>(state.variables)); OnEntry entry = nextState.getOnEntry(); List<Action> actions = entry.getActions(); for (Action action : actions) { for (CustomTagExtension tagExtension : tagExtensionList) { if (tagExtension.getTagActionClass().isInstance(action)) { product = tagExtension.pipelinePossibleStates(action, product); } } } // go through every transition and see which of the products are valid, recursive searching on // them List<Transition> transitions = nextState.getTransitionsList(); for (Transition transition : transitions) { String condition = transition.getCond(); TransitionTarget target = ((List<TransitionTarget>) transition.getTargets()).get(0); for (Map<String, String> p : product) { Boolean pass; if (condition == null) { pass = true; } else { // scrub the context clean so we may use it to evaluate transition conditional Context context = this.getRootContext(); context.reset(); // set up new context for (Map.Entry<String, String> e : p.entrySet()) { context.set(e.getKey(), e.getValue()); } // evaluate condition try { pass = (Boolean) this.getEvaluator().eval(context, condition); } catch (SCXMLExpressionException ex) { pass = false; } } // transition condition satisfied, continue search recursively if (pass) { PossibleState result = new PossibleState(target, p); dfs(singleThreadedProcessing, flag, result); } } } if (nextState.getId().equalsIgnoreCase("end")) { System.out.println("State Variables: " + state.variables); dataPipe = singleThreadedProcessing.processOutput(state.variables, flag); // Commented this line } return dataPipe; }