summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Branson <andrew.branson@cern.ch>2013-12-05 12:57:16 +0100
committerAndrew Branson <andrew.branson@cern.ch>2013-12-05 12:57:16 +0100
commit37bb1907aca2a3246a7b5d759df79b7fd97c276f (patch)
tree85d4d2a5e815c799a9592c410880c132bb6cd1bb
parentd43164830403245353080f5d6f838ed9f56d9a35 (diff)
Add itemSysKey as a variable of the workflow during initialization.
Use this for creating the shared History map. Lock event writing on the Workflow rather than the Activity to keep the History in the transaction.
-rw-r--r--src/main/java/com/c2kernel/lifecycle/instance/Activity.java9
-rw-r--r--src/main/java/com/c2kernel/lifecycle/instance/Workflow.java19
-rw-r--r--src/main/java/com/c2kernel/lifecycle/instance/predefined/Import.java8
-rw-r--r--src/main/resources/mapFiles/LifeCycleMap.xml3
4 files changed, 27 insertions, 12 deletions
diff --git a/src/main/java/com/c2kernel/lifecycle/instance/Activity.java b/src/main/java/com/c2kernel/lifecycle/instance/Activity.java
index 54df25c..42ffe79 100644
--- a/src/main/java/com/c2kernel/lifecycle/instance/Activity.java
+++ b/src/main/java/com/c2kernel/lifecycle/instance/Activity.java
@@ -177,20 +177,21 @@ public class Activity extends WfVertex
if (storeOutcome) {
Outcome newOutcome = new Outcome(newEvent.getID(), requestData, schema.docType, schema.docVersion);
- Gateway.getStorage().put(itemSysKey, newOutcome, this);
+ Gateway.getStorage().put(itemSysKey, newOutcome, getWf());
// update specific view if defined
if (viewName != null && !viewName.equals("")) {
Viewpoint currentView = new Viewpoint(itemSysKey, schema.docType, viewName, schema.docVersion, newEvent.getID());
- Gateway.getStorage().put(itemSysKey, currentView, this);
+ Gateway.getStorage().put(itemSysKey, currentView, getWf());
}
// update last view
Viewpoint currentView = new Viewpoint(itemSysKey, schema.docType, "last", schema.docVersion, newEvent.getID());
- Gateway.getStorage().put(itemSysKey, currentView, this);
+ Gateway.getStorage().put(itemSysKey, currentView, getWf());
}
- Gateway.getStorage().commit(this);
+ Gateway.getStorage().commit(getWf());
} catch (ClusterStorageException ex) {
Logger.error(ex);
+ Gateway.getStorage().abort(getWf());
throw new PersistencyException("Exception storing event data");
}
diff --git a/src/main/java/com/c2kernel/lifecycle/instance/Workflow.java b/src/main/java/com/c2kernel/lifecycle/instance/Workflow.java
index e3a6b7f..fa5e66b 100644
--- a/src/main/java/com/c2kernel/lifecycle/instance/Workflow.java
+++ b/src/main/java/com/c2kernel/lifecycle/instance/Workflow.java
@@ -24,6 +24,8 @@ import com.c2kernel.utils.Logger;
public class Workflow extends CompositeActivity implements C2KLocalObject
{
public History history;
+ private Integer itemSysKey = null;
+
/** TypeNameAndConstructionInfo[] variables added by Steve */
private final TypeNameAndConstructionInfo[] mVertexTypeNameAndConstructionInfo =
{
@@ -54,11 +56,11 @@ public class Workflow extends CompositeActivity implements C2KLocalObject
addChild(act, new GraphPoint(300, 100));
}
- public History getHistory() {
+ public History getHistory() throws InvalidDataException {
if (history == null) {
- Integer i = (Integer) (getProperties().get("ItemSystemKey"));
- if (i != null)
- history = new History(i, this);
+ if (itemSysKey == null)
+ throw new InvalidDataException("Workflow not initialized.", "");
+ history = new History(itemSysKey, this);
}
return history;
}
@@ -173,6 +175,7 @@ public class Workflow extends CompositeActivity implements C2KLocalObject
*/
public void initialise(int systemKey, AgentPath agent) throws InvalidDataException, InvalidTransitionException, AccessRightsException, ObjectNotFoundException
{
+ itemSysKey = systemKey;
try
{
runFirst(agent, systemKey);
@@ -186,6 +189,14 @@ public class Workflow extends CompositeActivity implements C2KLocalObject
}
}
+ public Integer getItemSysKey() {
+ return itemSysKey;
+ }
+
+ public void setItemSysKey(Integer itemSysKey) {
+ this.itemSysKey = itemSysKey;
+ }
+
/**
* if type = 0 only domain steps will be queried if type = 1 only predefined steps will be queried else both will be queried
* @param agent
diff --git a/src/main/java/com/c2kernel/lifecycle/instance/predefined/Import.java b/src/main/java/com/c2kernel/lifecycle/instance/predefined/Import.java
index 9b25546..29d4c54 100644
--- a/src/main/java/com/c2kernel/lifecycle/instance/predefined/Import.java
+++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/Import.java
@@ -76,16 +76,16 @@ public class Import extends PredefinedStep
Event event = hist.addEvent(agent.getAgentName(), getCurrentAgentRole(), getName(), getPath(), getType(), schemaName, schemaVersion, getStateMachine().getName(), getStateMachine().getVersion(), getStateMachine().getTransition(transitionID), viewpoint, timestamp);
try {
- storage.put(itemSysKey, new Outcome(event.getID(), requestData, schemaName, schemaVersion), this);
- storage.put(itemSysKey, new Viewpoint(itemSysKey, schemaName, viewpoint, schemaVersion, event.getID()), this);
+ storage.put(itemSysKey, new Outcome(event.getID(), requestData, schemaName, schemaVersion), locker);
+ storage.put(itemSysKey, new Viewpoint(itemSysKey, schemaName, viewpoint, schemaVersion, event.getID()), locker);
if (!"last".equals(viewpoint))
- storage.put(itemSysKey, new Viewpoint(itemSysKey, schemaName, "last", schemaVersion, event.getID()), this);
+ storage.put(itemSysKey, new Viewpoint(itemSysKey, schemaName, "last", schemaVersion, event.getID()), locker);
} catch (ClusterStorageException e) {
Logger.error(e);
storage.abort(locker);
throw new InvalidDataException("Could not store imported outcome. Rolled back.");
}
- storage.commit(this);
+ storage.commit(locker);
return requestData;
}
}
diff --git a/src/main/resources/mapFiles/LifeCycleMap.xml b/src/main/resources/mapFiles/LifeCycleMap.xml
index 472fe84..45256c1 100644
--- a/src/main/resources/mapFiles/LifeCycleMap.xml
+++ b/src/main/resources/mapFiles/LifeCycleMap.xml
@@ -66,6 +66,9 @@
</class>
<class name="com.c2kernel.lifecycle.instance.Workflow" extends="com.c2kernel.lifecycle.instance.CompositeActivity">
<map-to xml="Workflow"/>
+ <field name="itemSysKey" type="integer" direct="false">
+ <bind-xml name="itemSysKey" node="attribute"/>
+ </field>
</class>
<class name="com.c2kernel.lifecycle.instance.Join" extends="com.c2kernel.lifecycle.instance.WfVertex">
<map-to xml="Join"/>