/************************************************************************** * 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; import java.util.ArrayList; import java.util.Iterator; import com.c2kernel.collection.Collection; 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.lookup.AgentPath; import com.c2kernel.lookup.DomainPath; import com.c2kernel.lookup.EntityPath; import com.c2kernel.lookup.LDAPLookup; 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(); LDAPLookup lookup = Gateway.getLDAPLookup(); 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 String[] collNames = storage.getClusterContents(itemSysKey, ClusterStorage.COLLECTION); ArrayList collections = new ArrayList(); // loop through collections to instantiate for (String collName : collNames) { Collection thisCol = (Collection)storage.get(itemSysKey, ClusterStorage.COLLECTION+"/"+collName, null); if (thisCol instanceof CollectionDescription) { CollectionDescription thisDesc = (CollectionDescription)thisCol; collections.add(Gateway.getMarshaller().marshall(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.resolveEntity().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"); EntityPath entityPath = lookup.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.getLDAPLookup().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())); // add collections if (collections.size() > 0) { Logger.msg(6, "CreateItemFromDescription - Adding Collections"); String[] colls = new String[1]; for (Iterator iter = collections.iterator(); iter.hasNext();) { colls[0] = iter.next(); // TODO: initialize newItem.requestAction(agent.getSysKey(), "workflow/predefined/AddC2KObject", PredefinedStep.DONE, PredefinedStep.bundleData(colls)); } } // add its domain path Logger.msg(3, "CreateItemFromDescription - Creating "+context); context.setEntity(entityPath); Gateway.getLDAPLookup().add(context); return requestData; } catch (Exception e) { Logger.error(e); throw new InvalidDataException(e.getMessage(), ""); } } }