From 14e2fe28c2b7ecaae53a10d1aa7aa4b921b6efbc Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Wed, 11 Jun 2014 23:38:35 +0200 Subject: Separate PredefinedStepContainers for Agents and Items (and Server Item) --- .../predefined/item/CreateItemFromDescription.java | 171 +++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 src/main/java/com/c2kernel/lifecycle/instance/predefined/item/CreateItemFromDescription.java (limited to 'src/main/java/com/c2kernel/lifecycle/instance/predefined/item/CreateItemFromDescription.java') diff --git a/src/main/java/com/c2kernel/lifecycle/instance/predefined/item/CreateItemFromDescription.java b/src/main/java/com/c2kernel/lifecycle/instance/predefined/item/CreateItemFromDescription.java new file mode 100644 index 0000000..eb7b15f --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/item/CreateItemFromDescription.java @@ -0,0 +1,171 @@ +/************************************************************************** + * CreateItemFromDescription + * + * $Workfile$ + * $Revision: 1.47 $ + * $Date: 2005/10/13 08:13:58 $ + * + * Copyright (C) 2001 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ + +package com.c2kernel.lifecycle.instance.predefined.item; + +import java.util.ArrayList; + +import com.c2kernel.collection.Collection; +import com.c2kernel.collection.CollectionArrayList; +import com.c2kernel.collection.CollectionDescription; +import com.c2kernel.collection.CollectionMember; +import com.c2kernel.common.AccessRightsException; +import com.c2kernel.common.InvalidDataException; +import com.c2kernel.common.ObjectAlreadyExistsException; +import com.c2kernel.common.ObjectNotFoundException; +import com.c2kernel.entity.CorbaServer; +import com.c2kernel.entity.TraceableEntity; +import com.c2kernel.lifecycle.CompositeActivityDef; +import com.c2kernel.lifecycle.instance.predefined.PredefinedStep; +import com.c2kernel.lookup.AgentPath; +import com.c2kernel.lookup.DomainPath; +import com.c2kernel.lookup.ItemPath; +import com.c2kernel.persistency.ClusterStorage; +import com.c2kernel.persistency.TransactionManager; +import com.c2kernel.process.Gateway; +import com.c2kernel.property.Property; +import com.c2kernel.property.PropertyArrayList; +import com.c2kernel.property.PropertyDescriptionList; +import com.c2kernel.property.PropertyUtility; +import com.c2kernel.utils.LocalObjectLoader; +import com.c2kernel.utils.Logger; + +/************************************************************************** + * + * @author $Author: abranson $ $Date: 2005/10/13 08:13:58 $ + * @version $Revision: 1.47 $ + **************************************************************************/ +public class CreateItemFromDescription extends PredefinedStep +{ + public CreateItemFromDescription() + { + super(); + } + + //requestdata is xmlstring + @Override + protected String runActivityLogic(AgentPath agent, int itemSysKey, + int transitionID, String requestData) throws InvalidDataException { + + String[] input = getDataList(requestData); + String newName = input[0]; + String domPath = input[1]; + CompositeActivityDef wfDef; + String wfDefName = null; + int wfDefVer = -1; + if (input.length > 2) // override wf + wfDefName = input[2]; + + PropertyArrayList props = new PropertyArrayList(); + Logger.msg(1, "AddNewItem::request() - Starting."); + TransactionManager storage = Gateway.getStorage(); + + try { + // check if the path is already taken + DomainPath context = new DomainPath(new DomainPath(domPath), newName); + Logger.debug(8,"context "+context.getSysKey()+" "+context.getPath()+" "+context.getString()); + if (context.getSysKey()!=-1) + throw new ObjectAlreadyExistsException("The item name " +newName+ " exists already.", ""); + + // get init objects + + // loop through collections, collecting instantiated descriptions and finding the default workflow def + CollectionArrayList colls = new CollectionArrayList(); + String[] collNames = storage.getClusterContents(itemSysKey, ClusterStorage.COLLECTION); + for (String collName : collNames) { + Collection thisCol = (Collection)storage.get(itemSysKey, ClusterStorage.COLLECTION+"/"+collName, null); + if (thisCol instanceof CollectionDescription) { + CollectionDescription thisDesc = (CollectionDescription)thisCol; + colls.put(thisDesc.newInstance()); + } + else if (thisCol.getName().equalsIgnoreCase("workflow") && wfDefName == null) { + ArrayList members = thisCol.getMembers().list; + // get the first member from the wf collection + CollectionMember wfMember = members.get(0); + wfDefName = wfMember.resolveItem().getName(); + Object wfVerObj = wfMember.getProperties().get("Version"); + try { + wfDefVer = Integer.parseInt(wfVerObj.toString()); + } catch (NumberFormatException ex) { + throw new InvalidDataException("Invalid workflow version number: "+wfVerObj.toString(), ""); + } + } + } + + // load workflow def + if (wfDefName == null) + throw new InvalidDataException("No workflow given or defined", ""); + if (wfDefVer == -1) + throw new InvalidDataException("No workflow def version given",""); + + try { + wfDef = (CompositeActivityDef)LocalObjectLoader.getActDef(wfDefName, wfDefVer); + } catch (ObjectNotFoundException ex) { + throw new InvalidDataException("Workflow def '"+wfDefName+"' item not found", ""); + } catch (ClassCastException ex) { + throw new InvalidDataException("Activity def '"+wfDefName+"' was not Composite", ""); + } + + + // copy properties -- intend to create from propdesc + PropertyDescriptionList pdList = PropertyUtility.getPropertyDescriptionOutcome(itemSysKey); + props = pdList.instanciate(); + // set Name prop or create if not present + boolean foundName = false; + for (Property prop : props.list) { + if (prop.getName().equals("Name")) { + foundName = true; + prop.setValue(newName); + } + } + if (!foundName) props.list.add(new Property("Name", newName, true)); + props.list.add( new Property("Creator", agent.getAgentName(), false)); + + /* ITEM CREATION */ + + // generate new entity key + Logger.msg(6, "CreateItemFromDescription - Requesting new sysKey"); + ItemPath entityPath = Gateway.getNextKeyManager().generateNextEntityKey(); + + // resolve the item factory + Logger.msg(6, "CreateItemFromDescription - Resolving item factory"); + + // create the Item object + Logger.msg(3, "CreateItemFromDescription - Creating Item"); + CorbaServer factory = Gateway.getCorbaServer(); + if (factory == null) throw new AccessRightsException("This process cannot create new Items", ""); + TraceableEntity newItem = (TraceableEntity)factory.createEntity(entityPath); + Gateway.getLookup().add(entityPath); + + + // initialise it with its properties and workflow + + Logger.msg(3, "CreateItemFromDescription - Initializing Item"); + + newItem.initialise( + agent.getSysKey(), + Gateway.getMarshaller().marshall(props), + Gateway.getMarshaller().marshall(wfDef.instantiate()), + Gateway.getMarshaller().marshall(colls) + ); + + // add its domain path + Logger.msg(3, "CreateItemFromDescription - Creating "+context); + context.setEntity(entityPath); + Gateway.getLookup().add(context); + return requestData; + } catch (Exception e) { + Logger.error(e); + throw new InvalidDataException(e.getMessage(), ""); + } + + } +} -- cgit v1.2.3