From 30cd736670a579985890d8c2dfe363bacbad7568 Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Sun, 27 Oct 2013 00:27:24 +0200 Subject: Beta? --- .../lifecycle/instance/stateMachine/State.java | 5 +++ .../instance/stateMachine/StateMachine.java | 41 ++++++++++++++-------- .../instance/stateMachine/Transition.java | 21 ++++++++--- 3 files changed, 48 insertions(+), 19 deletions(-) (limited to 'src/main/java/com/c2kernel/lifecycle/instance/stateMachine') 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 states; private ArrayList transitions; - private final HashMap stateNames; private final HashMap stateCodes; private final HashMap transitionCodes; @@ -31,32 +31,41 @@ public class StateMachine implements DescriptionObject public StateMachine() { states = new ArrayList(); transitions = new ArrayList(); - stateNames = new HashMap(); stateCodes = new HashMap(); transitionCodes = new HashMap(); } public void setStates(ArrayList 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 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 getStates() { @@ -112,7 +121,7 @@ public class StateMachine implements DescriptionObject return stateCodes.get(stateID); } - public Map getPossibleTransitions(Activity act, AgentPath agent) throws ObjectNotFoundException { + public Map getPossibleTransitions(Activity act, AgentPath agent) throws ObjectNotFoundException, InvalidDataException { HashMap returnList = new HashMap(); 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 states) { + protected boolean resolveStates(HashMap 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; -- cgit v1.2.3