package com.c2kernel.lifecycle.instance.predefined.entitycreation; import java.util.ArrayList; import org.custommonkey.xmlunit.Diff; import org.custommonkey.xmlunit.XMLUnit; import com.c2kernel.collection.MembershipException; import com.c2kernel.common.CannotManageException; import com.c2kernel.common.InvalidDataException; import com.c2kernel.common.ObjectAlreadyExistsException; import com.c2kernel.common.ObjectCannotBeUpdated; import com.c2kernel.common.ObjectNotFoundException; import com.c2kernel.entity.TraceableEntity; import com.c2kernel.events.Event; import com.c2kernel.events.History; import com.c2kernel.lifecycle.CompositeActivityDef; import com.c2kernel.lifecycle.instance.stateMachine.States; import com.c2kernel.lifecycle.instance.stateMachine.Transitions; import com.c2kernel.lookup.DomainPath; import com.c2kernel.lookup.EntityPath; import com.c2kernel.persistency.ClusterStorage; import com.c2kernel.persistency.ClusterStorageException; import com.c2kernel.persistency.outcome.Viewpoint; import com.c2kernel.process.Gateway; import com.c2kernel.process.module.ModuleImport; import com.c2kernel.property.Property; import com.c2kernel.property.PropertyArrayList; import com.c2kernel.utils.LocalObjectLoader; import com.c2kernel.utils.Logger; /** * Complete Structure for new item * * @version $Revision: 1.8 $ $Date: 2006/03/03 13:52:21 $ */ public class NewItem extends ModuleImport { public String initialPath; public String workflow; public ArrayList properties = new ArrayList(); public ArrayList aggregationList = new ArrayList(); public ArrayList dependencyList = new ArrayList(); public ArrayList outcomes = new ArrayList(); private String ns; public NewItem() { } public NewItem(String name, String initialPath, String wf) { this(); this.name = name; this.initialPath = initialPath; this.workflow = wf; } public void setNamespace(String ns) { this.ns = ns; if (initialPath == null) initialPath = "/desc/"+ns; } public String getNamespace() { return ns; } public void create(int agentId, boolean reset) throws ObjectCannotBeUpdated, ObjectNotFoundException, CannotManageException, ObjectAlreadyExistsException { DomainPath domPath = new DomainPath(new DomainPath(initialPath), name); EntityPath entPath; TraceableEntity newItem; if (domPath.exists()) { entPath = domPath.getEntity(); newItem = Gateway.getCorbaServer().getItem(entPath.getSysKey()); } else { // create item entPath = Gateway.getLDAPLookup().getNextKeyManager().generateNextEntityKey(); newItem = (TraceableEntity)Gateway.getCorbaServer().createEntity(entPath); Gateway.getLDAPLookup().add(entPath); } // set the name property properties.add(new Property("Name", name)); // init the new item try { // find workflow def CompositeActivityDef compact = (CompositeActivityDef)LocalObjectLoader.getActDef(workflow, "0"); newItem.initialise( agentId, Gateway.getMarshaller().marshall(new PropertyArrayList(properties)), Gateway.getMarshaller().marshall(compact.instantiate())); } catch (Exception ex) { Logger.error("Error initialising new item"); Logger.error(ex); throw new CannotManageException("Problem initialising new item. See server log.", ""); } // import outcomes XMLUnit.setIgnoreWhitespace(true); XMLUnit.setIgnoreComments(true); History hist = new History(entPath.getSysKey(), null); for (Outcome thisOutcome : outcomes) { com.c2kernel.persistency.outcome.Outcome newOutcome = new com.c2kernel.persistency.outcome.Outcome(-1, thisOutcome.getData(ns), thisOutcome.schema, thisOutcome.version); Viewpoint impView; try { impView = (Viewpoint)Gateway.getStorage().get(entPath.getSysKey(), ClusterStorage.VIEWPOINT+"/"+thisOutcome.schema+"/"+thisOutcome.viewname, null); Diff xmlDiff = new Diff(newOutcome.getDOM(), impView.getOutcome().getDOM()); if (xmlDiff.identical()) { Logger.msg(5, "NewItem.create() - View "+thisOutcome.schema+"/"+thisOutcome.viewname+" in "+name+" identical, no update required"); continue; } else { Logger.msg("NewItem.create() - Difference found in view "+thisOutcome.schema+"/"+thisOutcome.viewname+" in "+name+": "+xmlDiff.toString()); if (!reset && !impView.getEvent().getStepPath().equals("Import")) { Logger.msg("Last edit was not done by import, and reset not requested. Not overwriting."); continue; } } } catch (ObjectNotFoundException ex) { Logger.msg(3, "View "+thisOutcome.schema+"/"+thisOutcome.viewname+" not found in "+name+". Creating."); impView = new Viewpoint(entPath.getSysKey(), thisOutcome.schema, thisOutcome.viewname, thisOutcome.version, -1); } catch (ClusterStorageException e) { throw new ObjectCannotBeUpdated("Could not check data for view "+thisOutcome.schema+"/"+thisOutcome.viewname+" in "+name); } catch (InvalidDataException e) { throw new ObjectCannotBeUpdated("Could not check previous event for view "+thisOutcome.schema+"/"+thisOutcome.viewname+" in "+name); } // write new view/outcome/event Event newEvent = hist.addEvent("system", "Admin", Transitions.DONE, "Import", "Import", "Import", thisOutcome.schema, thisOutcome.version, thisOutcome.viewname, States.FINISHED); newOutcome.setID(newEvent.getID()); impView.setEventId(newEvent.getID()); try { Gateway.getStorage().put(entPath.getSysKey(), newOutcome, null); Gateway.getStorage().put(entPath.getSysKey(), impView, null); } catch (ClusterStorageException e) { throw new ObjectCannotBeUpdated("Could not store data for view "+thisOutcome.schema+"/"+thisOutcome.viewname+" in "+name); } } // register domain path (before collections in case of recursive collections) if (!domPath.exists()) { domPath.setEntity(entPath); Gateway.getLDAPLookup().add(domPath); } // create collections for (Dependency element: dependencyList) { try { com.c2kernel.collection.Dependency newDep = element.create(); if (!reset) { try { Gateway.getStorage().get(entPath.getSysKey(), ClusterStorage.COLLECTION+"/"+newDep.getName(), null); Logger.msg("Not overwriting dependency "+newDep.getName()); continue; // TODO: a proper compare here } catch (ObjectNotFoundException ex) { } // doesn't exist, ok to create } Gateway.getStorage().put(entPath.getSysKey(), element.create(), null); } catch (ClusterStorageException ex) { Logger.error(ex); throw new CannotManageException("Could not create Dependency "+element.name, ""); } catch (MembershipException ex) { Logger.error(ex); throw new CannotManageException("A specified member is not of the correct type in "+element.name, ""); } } for (Aggregation element : aggregationList) { try { com.c2kernel.collection.Aggregation newAgg = element.create(); if (!reset) { try { Gateway.getStorage().get(entPath.getSysKey(), ClusterStorage.COLLECTION+"/"+newAgg.getName(), null); Logger.msg("Not overwriting aggregation "+newAgg.getName()); continue; // TODO: a proper compare here } catch (ObjectNotFoundException ex) { } // doesn't exist, ok to create } Gateway.getStorage().put(entPath.getSysKey(), newAgg, null); } catch (ClusterStorageException ex) { Logger.error(ex); throw new CannotManageException("Could not create Aggregation "+element.name, ""); } catch (MembershipException ex) { Logger.error(ex); throw new CannotManageException("A specified member is not of the correct type in "+element.name, ""); } } } }