From 37c8241f7e54694b255f366c8fc8b899a08b921f Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Thu, 13 Feb 2014 10:34:53 +0100 Subject: 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 --- .../predefined/PredefinedStepContainer.java | 1 + .../instance/predefined/WriteViewpoint.java | 67 ++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 src/main/java/com/c2kernel/lifecycle/instance/predefined/WriteViewpoint.java (limited to 'src/main/java/com/c2kernel/lifecycle/instance') 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; + } + +} -- cgit v1.2.3