summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Branson <andrew.branson@cern.ch>2014-02-13 10:34:53 +0100
committerAndrew Branson <andrew.branson@cern.ch>2014-02-13 10:34:53 +0100
commit37c8241f7e54694b255f366c8fc8b899a08b921f (patch)
tree701239a62590c4b7d3d325f6ce8939b4d97f61bb /src
parent0d4ecfc5d7bb0a606ab22a8c7f777f3f5bfd84b1 (diff)
New PredefinedStep: WriteViewpoint. Non-admin users may need to create
or replace named viewpoints during ordinary Item workflows. Previously, AddC2KObject was used, but as that is now Admin only, a new step is necessary to do this. Unlike the admin step, this checks that the target Outcome and Event exist and are of the correct schema before the Viewpoint is written. Fixes #154. Refs #152
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/c2kernel/lifecycle/instance/predefined/PredefinedStepContainer.java1
-rw-r--r--src/main/java/com/c2kernel/lifecycle/instance/predefined/WriteViewpoint.java67
-rw-r--r--src/main/resources/boot/SC/CreateNewNumberedVersionFromLast.xml8
3 files changed, 74 insertions, 2 deletions
diff --git a/src/main/java/com/c2kernel/lifecycle/instance/predefined/PredefinedStepContainer.java b/src/main/java/com/c2kernel/lifecycle/instance/predefined/PredefinedStepContainer.java
index b57dca4..8127113 100644
--- a/src/main/java/com/c2kernel/lifecycle/instance/predefined/PredefinedStepContainer.java
+++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/PredefinedStepContainer.java
@@ -22,6 +22,7 @@ public class PredefinedStepContainer extends CompositeActivity
predInit("AddC2KObject", "Adds or overwrites a C2Kernel object for this Item", new AddC2KObject());
predInit("RemoveC2KObject", "Removes the named C2Kernel object from this Item.", new RemoveC2KObject());
predInit("WriteProperty", "Writes a property to the Item", new WriteProperty());
+ predInit("WriteViewpoint", "Writes a viewpoint to the Item", new WriteViewpoint());
predInit("AddNewSlot", "Creates a new slot in the given aggregation, that holds instances of the item description of the given key", new AddNewSlot());
predInit("AssignItemToSlot", "Assigns the referenced entity to a pre-existing slot in an aggregation", new AssignItemToSlot());
predInit("ClearSlot", "Clears an aggregation member slot, given a slot no or entity key", new ClearSlot());
diff --git a/src/main/java/com/c2kernel/lifecycle/instance/predefined/WriteViewpoint.java b/src/main/java/com/c2kernel/lifecycle/instance/predefined/WriteViewpoint.java
new file mode 100644
index 0000000..741a9a2
--- /dev/null
+++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/WriteViewpoint.java
@@ -0,0 +1,67 @@
+package com.c2kernel.lifecycle.instance.predefined;
+
+import com.c2kernel.common.InvalidDataException;
+import com.c2kernel.common.ObjectNotFoundException;
+import com.c2kernel.events.Event;
+import com.c2kernel.lookup.AgentPath;
+import com.c2kernel.persistency.ClusterStorage;
+import com.c2kernel.persistency.ClusterStorageException;
+import com.c2kernel.persistency.outcome.Viewpoint;
+import com.c2kernel.process.Gateway;
+import com.c2kernel.utils.Logger;
+
+public class WriteViewpoint extends PredefinedStep {
+
+ public WriteViewpoint() {
+ super();
+ }
+
+ @Override
+ protected String runActivityLogic(AgentPath agent, int itemSysKey,
+ int transitionID, String requestData) throws InvalidDataException {
+
+ String schemaName;
+ String viewName;
+ int evId;
+
+ Logger.msg(1, "WriteViewpoint::request() - Starting.");
+ String[] params = getDataList(requestData);
+
+ // outcometype, name and evId. Event and Outcome should be checked so schema version should be discovered.
+ if (params.length != 3)
+ throw new InvalidDataException("WriteViewpoint usage: [ schemaName, viewName, eventId ]", "");
+
+ schemaName = params[0];
+ viewName = params[1];
+
+ try {
+ evId = Integer.parseInt(params[2]);
+ } catch (NumberFormatException ex) {
+ throw new InvalidDataException("Parameter 3 (EventId) must be an integer", "");
+ }
+
+ // Find event
+
+ Event ev;
+ try {
+ ev = (Event)Gateway.getStorage().get(itemSysKey, ClusterStorage.HISTORY+"/"+evId, null);
+ } catch (ObjectNotFoundException e) {
+ Logger.error(e);
+ throw new InvalidDataException("Event "+evId+" not found", "");
+ } catch (ClusterStorageException e) {
+ Logger.error(e);
+ throw new InvalidDataException("Exception loading event", "");
+ }
+
+ // Write new viewpoint
+ Viewpoint newView = new Viewpoint(itemSysKey, schemaName, viewName, ev.getSchemaVersion(), evId);
+ try {
+ Gateway.getStorage().put(itemSysKey, newView, null);
+ } catch (ClusterStorageException e) {
+ Logger.error(e);
+ throw new InvalidDataException("Could not store new viewpoint", "");
+ }
+ return requestData;
+ }
+
+}
diff --git a/src/main/resources/boot/SC/CreateNewNumberedVersionFromLast.xml b/src/main/resources/boot/SC/CreateNewNumberedVersionFromLast.xml
index 321855a..7a63b76 100644
--- a/src/main/resources/boot/SC/CreateNewNumberedVersionFromLast.xml
+++ b/src/main/resources/boot/SC/CreateNewNumberedVersionFromLast.xml
@@ -20,8 +20,12 @@
} catch (e) {
throw "No data found. You must submit at least one version before executing this activity.";
}
- existingLast.setName(lastView);
- agent.execute(item, "AddC2KObject", existingLast);
+
+ var params = new Array(3);
+ params[0] = viewName;
+ params[1] = lastView;
+ params[2] = existingLast.getEventId();
+ agent.execute(item, "WriteViewpoint", params);
]]></script>
</cristalscript>