# HG changeset patch # User Sascha L. Teichmann # Date 1377611306 -7200 # Node ID cbe3dfd3e1a6f86bfdee27022f0aaa96200d5385 # Parent baffc9b6f3790f5639b8c8a1c83b30cb4a21b646 Framework: Added a method to the transition engine to recursively collect all state id for a given artifact identifer and a state id. Goal is to create a predicate dc:state-successors-contains($artifict-type-identifer, 'winfo.calculation.select, $current-state-id). diff -r baffc9b6f379 -r cbe3dfd3e1a6 artifact-database/src/main/java/org/dive4elements/artifactdatabase/transition/TransitionEngine.java --- a/artifact-database/src/main/java/org/dive4elements/artifactdatabase/transition/TransitionEngine.java Thu Aug 22 15:24:18 2013 +0200 +++ b/artifact-database/src/main/java/org/dive4elements/artifactdatabase/transition/TransitionEngine.java Tue Aug 27 15:48:26 2013 +0200 @@ -1,9 +1,13 @@ package org.dive4elements.artifactdatabase.transition; +import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Deque; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.log4j.Logger; @@ -105,6 +109,56 @@ return reachable; } + /** Returns all recursive reachable state ids for + * a given pair of artifact id and state id. + */ + public Set allRecursiveSuccessorStateIds( + String artifactIdentifier, + String stateId + ) { + HashSet result = new HashSet(); + + List trans = transitions.get(artifactIdentifier); + + if (trans == null) { + return result; + } + + Map> succs = new HashMap>(); + + for (Transition t: trans) { + String from = t.getFrom(); + String to = t.getTo(); + + Set s = succs.get(from); + if (s == null) { + s = new HashSet(); + succs.put(from, s); + } + s.add(to); + } + + Set start = succs.get(stateId); + + if (start == null) { + return result; + } + + Deque open = new ArrayDeque(start); + + while (!open.isEmpty()) { + String cand = open.pop(); + if (result.add(cand)) { + Set s = succs.get(cand); + if (s != null) { + open.addAll(s); + } + } + } + + return result; + } + /** * Determines if a state with a given identifier is reachable from a current