1
package org.workcraft.plugins.son.algorithm;
3
import java.util.ArrayList;
4
import java.util.Collection;
5
import java.util.LinkedList;
8
import org.workcraft.dom.Node;
9
import org.workcraft.plugins.son.ONGroup;
10
import org.workcraft.plugins.son.Phase;
11
import org.workcraft.plugins.son.SON;
12
import org.workcraft.plugins.son.elements.Condition;
13
import org.workcraft.plugins.son.elements.TransitionNode;
15
public class ReachabilityAlg {
17
private BSONAlg bsonAlg;
18
private RelationAlgorithm relationAlg;
19
private Collection<ONGroup> upperGroups;
20
private Map<Condition, Collection<Phase>> phases;
22
private static Collection<Node> pathResult =new ArrayList<Node>();
24
public ReachabilityAlg(SON net) {
25
bsonAlg = new BSONAlg(net);
26
relationAlg = new RelationAlgorithm(net);
28
upperGroups = bsonAlg.getUpperGroups(net.getGroups());
29
phases = bsonAlg.getAllPhases();
32
//get path between a given initial node and a set of final nodes. (recursion)
33
private void dfs(LinkedList<Node> visited, Collection<Node> v, Collection<TransitionNode[]> before) {
34
LinkedList<Node> post = getCausalPreset(visited.getLast(), before);
36
if (v.contains(visited.getLast())) {
37
pathResult.addAll(visited);
41
for (Node node : post) {
42
if (visited.contains(node)) {
45
if (v.contains(node)) {
47
pathResult.addAll(visited);
52
// in depth-first, recursion needs to come after visiting post nodes
53
for (Node node : post) {
54
if (visited.contains(node) || node.equals(v)) {
57
visited.addLast(node);
58
dfs(visited, v, before);
64
public Collection<Node> getCausalPredecessors (Node s, Collection<Node> v){
66
LinkedList<Node> visited = new LinkedList<Node>();
67
Collection<TransitionNode[]> before = getBeforeRelations();
69
dfs(visited, v, before);
73
private Collection<TransitionNode[]> getBeforeRelations(){
74
Collection<TransitionNode[]> result = new ArrayList<TransitionNode[]>();
76
for(ONGroup group : upperGroups){
77
for(TransitionNode e : group.getTransitionNodes()){
78
result.addAll( bsonAlg.before(e, phases));
85
private LinkedList<Node> getCausalPreset(Node n, Collection<TransitionNode[]> before){
86
LinkedList<Node> result = new LinkedList<Node>();
88
if(relationAlg.isInitial(n) && (n instanceof Condition)){
89
result.addAll(relationAlg.getPostBhvSet((Condition)n));
92
for(TransitionNode[] pre : before){
97
result.addAll(relationAlg.getPrePNSet(n));
99
if(n instanceof TransitionNode){
100
result.addAll(relationAlg.getPreASynEvents((TransitionNode)n));