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 --- .../instance/predefined/WriteViewpoint.java | 67 ++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/main/java/com/c2kernel/lifecycle/instance/predefined/WriteViewpoint.java (limited to 'src/main/java/com/c2kernel/lifecycle/instance/predefined/WriteViewpoint.java') 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