From e73468fd08cc27aa31f76a27c916e45d5987c628 Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Thu, 5 Jun 2014 16:47:41 +0200 Subject: Moved old entitycreation package from the predefined step package to a new 'imports' package under entity. Renamed most classed with an 'Import' prefix to avoid clashes with other API classes. Fixes #194 --- .../java/com/c2kernel/entity/imports/Geometry.java | 29 ++++ .../com/c2kernel/entity/imports/ImportAgent.java | 60 +++++++ .../c2kernel/entity/imports/ImportAggregation.java | 51 ++++++ .../entity/imports/ImportAggregationMember.java | 33 ++++ .../c2kernel/entity/imports/ImportDependency.java | 66 ++++++++ .../entity/imports/ImportDependencyMember.java | 29 ++++ .../com/c2kernel/entity/imports/ImportItem.java | 187 +++++++++++++++++++++ .../com/c2kernel/entity/imports/ImportOutcome.java | 27 +++ .../com/c2kernel/entity/imports/ImportRole.java | 19 +++ 9 files changed, 501 insertions(+) create mode 100644 src/main/java/com/c2kernel/entity/imports/Geometry.java create mode 100644 src/main/java/com/c2kernel/entity/imports/ImportAgent.java create mode 100644 src/main/java/com/c2kernel/entity/imports/ImportAggregation.java create mode 100644 src/main/java/com/c2kernel/entity/imports/ImportAggregationMember.java create mode 100644 src/main/java/com/c2kernel/entity/imports/ImportDependency.java create mode 100644 src/main/java/com/c2kernel/entity/imports/ImportDependencyMember.java create mode 100644 src/main/java/com/c2kernel/entity/imports/ImportItem.java create mode 100644 src/main/java/com/c2kernel/entity/imports/ImportOutcome.java create mode 100644 src/main/java/com/c2kernel/entity/imports/ImportRole.java (limited to 'src/main/java/com/c2kernel/entity') diff --git a/src/main/java/com/c2kernel/entity/imports/Geometry.java b/src/main/java/com/c2kernel/entity/imports/Geometry.java new file mode 100644 index 0000000..cb973d3 --- /dev/null +++ b/src/main/java/com/c2kernel/entity/imports/Geometry.java @@ -0,0 +1,29 @@ + + +package com.c2kernel.entity.imports; + + + +public class Geometry implements java.io.Serializable { + + + public int x; + + public int y; + + public int width; + + public int height; + + public Geometry() { + super(); + } + + public Geometry(int x, int y, int width, int height) { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + +} diff --git a/src/main/java/com/c2kernel/entity/imports/ImportAgent.java b/src/main/java/com/c2kernel/entity/imports/ImportAgent.java new file mode 100644 index 0000000..26e3325 --- /dev/null +++ b/src/main/java/com/c2kernel/entity/imports/ImportAgent.java @@ -0,0 +1,60 @@ +package com.c2kernel.entity.imports; + +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; + +import com.c2kernel.common.CannotManageException; +import com.c2kernel.common.ObjectAlreadyExistsException; +import com.c2kernel.common.ObjectCannotBeUpdated; +import com.c2kernel.common.ObjectNotFoundException; +import com.c2kernel.entity.agent.ActiveEntity; +import com.c2kernel.lookup.AgentPath; +import com.c2kernel.lookup.RolePath; +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.Logger; + +public class ImportAgent extends ModuleImport implements java.io.Serializable { + + public String password; + + public ArrayList roles = new ArrayList(); + public ArrayList properties = new ArrayList(); + + public ImportAgent() { + } + + public ImportAgent(String name, String password) { + this.name = name; + this.password = password; + } + + public void create(int agentId) throws ObjectNotFoundException, ObjectCannotBeUpdated, NoSuchAlgorithmException, CannotManageException, ObjectAlreadyExistsException { + AgentPath newAgent = Gateway.getNextKeyManager().generateNextAgentKey(); + newAgent.setAgentName(name); + newAgent.setPassword(password); + ActiveEntity newAgentEnt = (ActiveEntity)Gateway.getCorbaServer().createEntity(newAgent); + Gateway.getLookup().add(newAgent); + // assemble properties + properties.add(new com.c2kernel.property.Property("Name", name, true)); + properties.add(new com.c2kernel.property.Property("Type", "Agent", false)); + try { + newAgentEnt.initialise(agentId, Gateway.getMarshaller().marshall(new PropertyArrayList(properties)), null, null); + } catch (Exception ex) { + Logger.error(ex); + throw new CannotManageException("Error initialising new agent"); + } + for (String role : roles) { + RolePath thisRole; + try { + thisRole = Gateway.getLookup().getRolePath(role); + } catch (ObjectNotFoundException ex) { + throw new ObjectNotFoundException("Role "+role+" does not exist."); + } + thisRole.addAgent(newAgent); + } + + } +} diff --git a/src/main/java/com/c2kernel/entity/imports/ImportAggregation.java b/src/main/java/com/c2kernel/entity/imports/ImportAggregation.java new file mode 100644 index 0000000..1c75990 --- /dev/null +++ b/src/main/java/com/c2kernel/entity/imports/ImportAggregation.java @@ -0,0 +1,51 @@ +package com.c2kernel.entity.imports; + +import java.util.ArrayList; + +import com.c2kernel.collection.MembershipException; +import com.c2kernel.common.ObjectNotFoundException; +import com.c2kernel.graph.model.GraphPoint; +import com.c2kernel.lookup.DomainPath; +import com.c2kernel.property.PropertyDescription; +import com.c2kernel.property.PropertyDescriptionList; +import com.c2kernel.property.PropertyUtility; + +public class ImportAggregation implements java.io.Serializable { + + public boolean isDescription; + public ArrayList aggregationMemberList = new ArrayList(); + public String name; + + public ImportAggregation() { + super(); + } + + public ImportAggregation(String name, boolean isDescription) { + this(); + this.name = name; + this.isDescription = isDescription; + } + + public com.c2kernel.collection.Aggregation create() throws MembershipException, ObjectNotFoundException { + com.c2kernel.collection.Aggregation newAgg = isDescription?new com.c2kernel.collection.AggregationDescription(name):new com.c2kernel.collection.AggregationInstance(name); + newAgg.setName(name); + for (ImportAggregationMember thisMem : aggregationMemberList) { + StringBuffer classProps = new StringBuffer(); + if (thisMem.itemDescriptionPath != null && thisMem.itemDescriptionPath.length()>0) { + PropertyDescriptionList propList = PropertyUtility.getPropertyDescriptionOutcome(new DomainPath(thisMem.itemDescriptionPath).getSysKey()); + for (PropertyDescription pd : propList.list) { + thisMem.props.put(pd.getName(), pd.getDefaultValue()); + if (pd.getIsClassIdentifier()) + classProps.append((classProps.length()>0?",":"")).append(pd.getName()); + } + } + if (thisMem.itemPath != null && thisMem.itemPath.length()>0) { + int syskey = new DomainPath(thisMem.itemPath).getSysKey(); + if (syskey == -1) + throw new MembershipException("Cannot find "+thisMem.itemPath+" specified for collection."); + newAgg.addMember(syskey, thisMem.props, classProps.toString(), new GraphPoint(thisMem.geometry.x, thisMem.geometry.y), thisMem.geometry.width, thisMem.geometry.height); + } + } + return newAgg; + } +} diff --git a/src/main/java/com/c2kernel/entity/imports/ImportAggregationMember.java b/src/main/java/com/c2kernel/entity/imports/ImportAggregationMember.java new file mode 100644 index 0000000..7a1cf21 --- /dev/null +++ b/src/main/java/com/c2kernel/entity/imports/ImportAggregationMember.java @@ -0,0 +1,33 @@ +package com.c2kernel.entity.imports; + +import com.c2kernel.utils.CastorHashMap; +import com.c2kernel.utils.KeyValuePair; + +public class ImportAggregationMember implements java.io.Serializable { + + public int slotNo; + public String itemDescriptionPath; + public String itemPath; + public Geometry geometry; + public CastorHashMap props = new CastorHashMap(); + + + public ImportAggregationMember() { + super(); + } + + public ImportAggregationMember(int slotNo, String itemDescPath, String itemPath, Geometry geometry) { + this.slotNo = slotNo; + this.itemDescriptionPath = itemDescPath; + this.itemPath = itemPath; + this.geometry = geometry; + } + + public KeyValuePair[] getKeyValuePairs() { + return props.getKeyValuePairs(); + } + + public void setKeyValuePairs(KeyValuePair[] pairs) { + props.setKeyValuePairs(pairs); + } +} diff --git a/src/main/java/com/c2kernel/entity/imports/ImportDependency.java b/src/main/java/com/c2kernel/entity/imports/ImportDependency.java new file mode 100644 index 0000000..e6ce909 --- /dev/null +++ b/src/main/java/com/c2kernel/entity/imports/ImportDependency.java @@ -0,0 +1,66 @@ +package com.c2kernel.entity.imports; + +import java.util.ArrayList; + +import com.c2kernel.collection.MembershipException; +import com.c2kernel.common.ObjectNotFoundException; +import com.c2kernel.lookup.DomainPath; +import com.c2kernel.property.PropertyDescription; +import com.c2kernel.property.PropertyDescriptionList; +import com.c2kernel.property.PropertyUtility; +import com.c2kernel.utils.CastorHashMap; +import com.c2kernel.utils.KeyValuePair; + +public class ImportDependency implements java.io.Serializable { + + public String name; + public boolean isDescription; + public String itemDescriptionPath; + public ArrayList dependencyMemberList = new ArrayList(); + public CastorHashMap props = new CastorHashMap(); + + public ImportDependency() { + super(); + } + + public ImportDependency(String name) { + this(); + this.name = name; + } + + public KeyValuePair[] getKeyValuePairs() { + return props.getKeyValuePairs(); + } + + public void setKeyValuePairs(KeyValuePair[] pairs) { + props.setKeyValuePairs(pairs); + } + + /** + * @return + */ + public com.c2kernel.collection.Dependency create() throws MembershipException, ObjectNotFoundException { + com.c2kernel.collection.Dependency newDep = isDescription?new com.c2kernel.collection.DependencyDescription(name):new com.c2kernel.collection.Dependency(name); + if (itemDescriptionPath != null && itemDescriptionPath.length()>0) { + PropertyDescriptionList propList = PropertyUtility.getPropertyDescriptionOutcome(new DomainPath(itemDescriptionPath).getSysKey()); + StringBuffer classProps = new StringBuffer(); + for (PropertyDescription pd : propList.list) { + props.put(pd.getName(), pd.getDefaultValue()); + if (pd.getIsClassIdentifier()) + classProps.append((classProps.length()>0?",":"")).append(pd.getName()); + } + newDep.setProperties(props); + newDep.setClassProps(classProps.toString()); + } + + for (ImportDependencyMember thisMem : dependencyMemberList) { + int syskey = new DomainPath(thisMem.itemPath).getSysKey(); + if (syskey == -1) + throw new MembershipException("Cannot find "+thisMem.itemPath+" specified for collection."); + com.c2kernel.collection.DependencyMember newDepMem = newDep.addMember(syskey); + newDepMem.getProperties().putAll(thisMem.props); + } + return newDep; + } + +} diff --git a/src/main/java/com/c2kernel/entity/imports/ImportDependencyMember.java b/src/main/java/com/c2kernel/entity/imports/ImportDependencyMember.java new file mode 100644 index 0000000..6fc6b5a --- /dev/null +++ b/src/main/java/com/c2kernel/entity/imports/ImportDependencyMember.java @@ -0,0 +1,29 @@ + +package com.c2kernel.entity.imports; + +import com.c2kernel.utils.CastorHashMap; +import com.c2kernel.utils.KeyValuePair; + +public class ImportDependencyMember implements java.io.Serializable { + + + public String itemPath; + public CastorHashMap props = new CastorHashMap(); + + public ImportDependencyMember() { + super(); + } + + public ImportDependencyMember(String itemPath) { + this.itemPath = itemPath; + + } + + public KeyValuePair[] getKeyValuePairs() { + return props.getKeyValuePairs(); + } + + public void setKeyValuePairs(KeyValuePair[] pairs) { + props.setKeyValuePairs(pairs); + } +} diff --git a/src/main/java/com/c2kernel/entity/imports/ImportItem.java b/src/main/java/com/c2kernel/entity/imports/ImportItem.java new file mode 100644 index 0000000..a27d88d --- /dev/null +++ b/src/main/java/com/c2kernel/entity/imports/ImportItem.java @@ -0,0 +1,187 @@ +package com.c2kernel.entity.imports; + + +import java.util.ArrayList; + +import org.custommonkey.xmlunit.Diff; +import org.custommonkey.xmlunit.XMLUnit; + +import com.c2kernel.collection.CollectionArrayList; +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.Transition; +import com.c2kernel.lookup.DomainPath; +import com.c2kernel.lookup.ItemPath; +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 ImportItem extends ModuleImport { + + public String initialPath; + public String workflow; + public Integer workflowVer; + public ArrayList properties = new ArrayList(); + public ArrayList aggregationList = new ArrayList(); + public ArrayList dependencyList = new ArrayList(); + public ArrayList outcomes = new ArrayList(); + private String ns; + + public ImportItem() { + } + + public ImportItem(String name, String initialPath, String wf, int wfVer) { + this(); + this.name = name; + this.initialPath = initialPath; + this.workflow = wf; + this.workflowVer = wfVer; + } + + 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); + + ItemPath entPath; TraceableEntity newItem; + if (domPath.exists()) { + entPath = domPath.getEntity(); + newItem = Gateway.getCorbaServer().getItem(entPath.getSysKey()); + } + else { + // create item + entPath = Gateway.getNextKeyManager().generateNextEntityKey(); + newItem = (TraceableEntity)Gateway.getCorbaServer().createEntity(entPath); + Gateway.getLookup().add(entPath); + } + + // set the name property + properties.add(new Property("Name", name, true)); + + // find workflow def + CompositeActivityDef compact; + // default workflow version is 0 if not given + int usedWfVer; + if (workflowVer == null) usedWfVer = 0; + else usedWfVer = workflowVer.intValue(); + try { + compact = (CompositeActivityDef)LocalObjectLoader.getActDef(workflow, usedWfVer); + } catch (ObjectNotFoundException ex) { + throw new CannotManageException("Could not find workflow "+workflow+"v"+usedWfVer+" for item "+domPath, ""); + } catch (InvalidDataException e) { + throw new CannotManageException("Workflow def "+workflow+" v"+usedWfVer+" for item "+domPath+" was not valid", ""); + } + + // create collections + CollectionArrayList colls = new CollectionArrayList(); + for (ImportDependency element: dependencyList) { + try { + com.c2kernel.collection.Dependency newDep = element.create(); + colls.put(newDep); + } catch (MembershipException ex) { + Logger.error(ex); + throw new CannotManageException("A specified member is not of the correct type in "+element.name, ""); + } + } + + for (ImportAggregation element : aggregationList) { + try { + com.c2kernel.collection.Aggregation newAgg = element.create(); + colls.put(newAgg); + } catch (MembershipException ex) { + Logger.error(ex); + throw new CannotManageException("A specified member is not of the correct type in "+element.name, ""); + } + } + + // (re)initialise the new item with properties, workflow and collections + try { + newItem.initialise( + agentId, + Gateway.getMarshaller().marshall(new PropertyArrayList(properties)), + Gateway.getMarshaller().marshall(compact.instantiate()), + Gateway.getMarshaller().marshall(colls)); + } catch (Exception ex) { + Logger.error("Error initialising new item "+name ); + 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 (ImportOutcome 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 + Transition predefDone = new Transition(0, "Done", 0, 0); + Event newEvent = hist.addEvent("system", "Admin", "Import", "Import", "Import", thisOutcome.schema, thisOutcome.version, "PredefinedStep", 0, predefDone, thisOutcome.viewname); + 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.getLookup().add(domPath); + } + } +} diff --git a/src/main/java/com/c2kernel/entity/imports/ImportOutcome.java b/src/main/java/com/c2kernel/entity/imports/ImportOutcome.java new file mode 100644 index 0000000..1428483 --- /dev/null +++ b/src/main/java/com/c2kernel/entity/imports/ImportOutcome.java @@ -0,0 +1,27 @@ +package com.c2kernel.entity.imports; + +import com.c2kernel.common.ObjectNotFoundException; +import com.c2kernel.process.Gateway; + +public class ImportOutcome { + public String schema, viewname, path, data; + public int version; + + public ImportOutcome() { + } + + public ImportOutcome(String schema, int version, String viewname, String path) { + super(); + this.schema = schema; + this.version = version; + this.viewname = viewname; + this.path = path; + } + + public String getData(String ns) throws ObjectNotFoundException { + if (data == null) + data = Gateway.getResource().getTextResource(ns, path); + return data; + } + +} diff --git a/src/main/java/com/c2kernel/entity/imports/ImportRole.java b/src/main/java/com/c2kernel/entity/imports/ImportRole.java new file mode 100644 index 0000000..8313c24 --- /dev/null +++ b/src/main/java/com/c2kernel/entity/imports/ImportRole.java @@ -0,0 +1,19 @@ +package com.c2kernel.entity.imports; + +import com.c2kernel.common.ObjectAlreadyExistsException; +import com.c2kernel.common.ObjectCannotBeUpdated; +import com.c2kernel.process.Gateway; +import com.c2kernel.process.module.ModuleImport; + +public class ImportRole extends ModuleImport { + + public boolean jobList; + + public ImportRole() { + } + + public void create(int agentId) throws ObjectAlreadyExistsException, ObjectCannotBeUpdated { + Gateway.getLookup().createRole(name, jobList); + } + +} -- cgit v1.2.3