summaryrefslogtreecommitdiff
path: root/src/main/java/com/c2kernel/lifecycle/instance/stateMachine
diff options
context:
space:
mode:
authorAndrew Branson <andrew.branson@cern.ch>2013-10-27 00:27:24 +0200
committerAndrew Branson <andrew.branson@cern.ch>2013-10-27 00:27:24 +0200
commit30cd736670a579985890d8c2dfe363bacbad7568 (patch)
tree152b34486ed4a77c6d6a3a49c13b796ae669f512 /src/main/java/com/c2kernel/lifecycle/instance/stateMachine
parent0f892332b19ba8741a7db66a5c4daa386b2b5c1e (diff)
Beta?
Diffstat (limited to 'src/main/java/com/c2kernel/lifecycle/instance/stateMachine')
-rw-r--r--src/main/java/com/c2kernel/lifecycle/instance/stateMachine/State.java5
-rw-r--r--src/main/java/com/c2kernel/lifecycle/instance/stateMachine/StateMachine.java41
-rw-r--r--src/main/java/com/c2kernel/lifecycle/instance/stateMachine/Transition.java21
3 files changed, 48 insertions, 19 deletions
diff --git a/src/main/java/com/c2kernel/lifecycle/instance/stateMachine/State.java b/src/main/java/com/c2kernel/lifecycle/instance/stateMachine/State.java
index 0325656..fd712f4 100644
--- a/src/main/java/com/c2kernel/lifecycle/instance/stateMachine/State.java
+++ b/src/main/java/com/c2kernel/lifecycle/instance/stateMachine/State.java
@@ -19,6 +19,11 @@ public class State implements Serializable {
public String getName() {
return name;
}
+
+ @Override
+ public String toString() {
+ return id+": "+name;
+ }
public void setName(String name) {
this.name = name;
diff --git a/src/main/java/com/c2kernel/lifecycle/instance/stateMachine/StateMachine.java b/src/main/java/com/c2kernel/lifecycle/instance/stateMachine/StateMachine.java
index 1506701..3896ac5 100644
--- a/src/main/java/com/c2kernel/lifecycle/instance/stateMachine/StateMachine.java
+++ b/src/main/java/com/c2kernel/lifecycle/instance/stateMachine/StateMachine.java
@@ -6,6 +6,7 @@ import java.util.HashMap;
import java.util.Map;
import com.c2kernel.common.AccessRightsException;
+import com.c2kernel.common.InvalidDataException;
import com.c2kernel.common.InvalidTransitionException;
import com.c2kernel.common.ObjectNotFoundException;
import com.c2kernel.lifecycle.instance.Activity;
@@ -20,7 +21,6 @@ public class StateMachine implements DescriptionObject
private ArrayList<State> states;
private ArrayList<Transition> transitions;
- private final HashMap<String, State> stateNames;
private final HashMap<Integer, State> stateCodes;
private final HashMap<Integer, Transition> transitionCodes;
@@ -31,32 +31,41 @@ public class StateMachine implements DescriptionObject
public StateMachine() {
states = new ArrayList<State>();
transitions = new ArrayList<Transition>();
- stateNames = new HashMap<String, State>();
stateCodes = new HashMap<Integer, State>();
transitionCodes = new HashMap<Integer, Transition>();
}
public void setStates(ArrayList<State> newStates) {
-
- isCoherent = true;
this.states = newStates;
- stateNames.clear();
-
- for (State state : states)
- stateNames.put(state.getName(), state);
-
- for (Transition trans : transitions)
- isCoherent &= trans.resolveStates(stateNames);
-
+ validate();
}
public void setTransitions(ArrayList<Transition> newTransitions) {
this.transitions = newTransitions;
+ validate();
+ }
+
+ public void validate() {
+ stateCodes.clear();
transitionCodes.clear();
+ isCoherent = true;
+
+ for (State state : states) {
+ Logger.debug(6, "State "+state.id+": "+state.name);
+ stateCodes.put(state.getId(), state);
+ }
+
+ if (stateCodes.containsKey(initialStateCode))
+ initialState = stateCodes.get(initialStateCode);
+ else
+ isCoherent = false;
for (Transition trans : transitions) {
+ Logger.debug(6, "Transition "+trans.id+": "+trans.name);
transitionCodes.put(trans.getId(), trans);
+ isCoherent &= trans.resolveStates(stateCodes);
}
+
}
public ArrayList<State> getStates() {
@@ -112,7 +121,7 @@ public class StateMachine implements DescriptionObject
return stateCodes.get(stateID);
}
- public Map<Transition, String> getPossibleTransitions(Activity act, AgentPath agent) throws ObjectNotFoundException {
+ public Map<Transition, String> getPossibleTransitions(Activity act, AgentPath agent) throws ObjectNotFoundException, InvalidDataException {
HashMap<Transition, String> returnList = new HashMap<Transition, String>();
State currentState = getState(act.getState());
for (Integer transCode : currentState.getPossibleTransitionIds()) {
@@ -128,7 +137,7 @@ public class StateMachine implements DescriptionObject
return returnList;
}
- public State traverse(Activity act, Transition transition, AgentPath agent) throws InvalidTransitionException, AccessRightsException, ObjectNotFoundException {
+ public State traverse(Activity act, Transition transition, AgentPath agent) throws InvalidTransitionException, AccessRightsException, ObjectNotFoundException, InvalidDataException {
State currentState = getState(act.getState());
if (transition.originState.equals(currentState)) {
transition.getPerformingRole(act, agent);
@@ -139,5 +148,9 @@ public class StateMachine implements DescriptionObject
}
+ public boolean isCoherent() {
+ return isCoherent;
+ }
+
} \ No newline at end of file
diff --git a/src/main/java/com/c2kernel/lifecycle/instance/stateMachine/Transition.java b/src/main/java/com/c2kernel/lifecycle/instance/stateMachine/Transition.java
index 01ede5a..e7bcba9 100644
--- a/src/main/java/com/c2kernel/lifecycle/instance/stateMachine/Transition.java
+++ b/src/main/java/com/c2kernel/lifecycle/instance/stateMachine/Transition.java
@@ -2,6 +2,8 @@ package com.c2kernel.lifecycle.instance.stateMachine;
import java.io.Serializable;
import java.util.HashMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import com.c2kernel.common.AccessRightsException;
import com.c2kernel.common.InvalidDataException;
@@ -13,6 +15,7 @@ import com.c2kernel.persistency.outcome.Schema;
import com.c2kernel.process.Gateway;
import com.c2kernel.utils.CastorHashMap;
import com.c2kernel.utils.LocalObjectLoader;
+import com.c2kernel.utils.Logger;
public class Transition implements Serializable {
@@ -127,7 +130,7 @@ public class Transition implements Serializable {
this.reservation = reservation;
}
- protected boolean resolveStates(HashMap<String, State> states) {
+ protected boolean resolveStates(HashMap<Integer, State> states) {
boolean allFound = true;
if (states.keySet().contains(originStateId)) {
originState = states.get(originStateId);
@@ -232,9 +235,17 @@ public class Transition implements Serializable {
private static String resolveValue(String key, CastorHashMap props) {
if (key==null) return null;
- if (key.startsWith("$"))
- return (String)props.get(key.substring(1));
- return key;
+ String result = key;
+ Pattern propField = Pattern.compile("\\$\\{(.+?)\\}");
+ Matcher propMatcher = propField.matcher(result);
+ while (propMatcher.find()) {
+ String propName = propMatcher.group(1);
+ Object propValue = props.get(propName);
+ Logger.debug("Replacing Property "+propName+" as "+propValue);
+ String propValString = propValue==null?"":propValue.toString();
+ result = result.replace("${"+propName+"}", propValString);
+ }
+ return result;
}
public boolean isEnabled(CastorHashMap props) {
@@ -255,7 +266,7 @@ public class Transition implements Serializable {
return LocalObjectLoader.getSchema(resolveValue(outcome.schemaName, actProps),
Integer.parseInt(resolveValue(outcome.schemaVersion, actProps)));
} catch (NumberFormatException ex) {
- throw new InvalidDataException("Bad schema version number: "+outcome.schemaVersion+" ("+resolveValue(outcome.schemaVersion, actProps));
+ throw new InvalidDataException("Bad schema version number: "+outcome.schemaVersion+" ("+resolveValue(outcome.schemaVersion, actProps), "");
}
else
return null;