From 0baa46d5ee4f62adb58f436af4978d9468454870 Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Fri, 22 Jun 2012 10:11:17 +0200 Subject: Modules and entitycreation support Aggregations, collection properties and class identifiers --- .../java/com/c2kernel/collection/Aggregation.java | 8 +- .../collection/AggregationDescription.java | 3 +- .../c2kernel/collection/CollectionDescription.java | 4 +- .../c2kernel/collection/DependencyDescription.java | 3 +- .../com/c2kernel/collection/RelationshipUtils.java | 2 +- .../predefined/entitycreation/Aggregation.java | 33 ++++- .../predefined/entitycreation/Dependency.java | 19 ++- .../predefined/entitycreation/NewItem.java | 5 +- .../c2kernel/persistency/XMLClusterStorage.java | 1 - .../java/com/c2kernel/process/module/Module.java | 37 +++++- .../com/c2kernel/process/module/ModuleAgent.java | 9 ++ .../com/c2kernel/process/module/ModuleImport.java | 5 + .../com/c2kernel/process/module/ModuleItem.java | 17 +++ .../com/c2kernel/process/module/ModuleManager.java | 1 + .../c2kernel/process/module/ModuleResource.java | 6 + .../com/c2kernel/property/PropertyUtility.java | 5 +- src/main/resources/boot/OD/Module.xsd | 133 +++++++++++++++------ 17 files changed, 233 insertions(+), 58 deletions(-) create mode 100644 src/main/java/com/c2kernel/process/module/ModuleAgent.java create mode 100644 src/main/java/com/c2kernel/process/module/ModuleImport.java create mode 100644 src/main/java/com/c2kernel/process/module/ModuleItem.java create mode 100644 src/main/java/com/c2kernel/process/module/ModuleResource.java diff --git a/src/main/java/com/c2kernel/collection/Aggregation.java b/src/main/java/com/c2kernel/collection/Aggregation.java index e869621..f840d41 100644 --- a/src/main/java/com/c2kernel/collection/Aggregation.java +++ b/src/main/java/com/c2kernel/collection/Aggregation.java @@ -73,8 +73,10 @@ abstract public class Aggregation extends Parent2ChildCollection -1) { + aggMem.assignEntity(entityKey); + aggMem.setIsComposite( RelationshipUtils.getIsComposite(entityKey) ); + } // create vertex com.c2kernel.graph.model.Vertex vertex = new com.c2kernel.graph.model.Vertex(); vertex.setHeight(h); vertex.setWidth(w); @@ -82,7 +84,7 @@ abstract public class Aggregation extends Parent2ChildCollection extends Collection { - public Collection newInstance(); + public Collection newInstance() throws ObjectNotFoundException; } diff --git a/src/main/java/com/c2kernel/collection/DependencyDescription.java b/src/main/java/com/c2kernel/collection/DependencyDescription.java index 547a286..681e98b 100644 --- a/src/main/java/com/c2kernel/collection/DependencyDescription.java +++ b/src/main/java/com/c2kernel/collection/DependencyDescription.java @@ -1,5 +1,6 @@ package com.c2kernel.collection; +import com.c2kernel.common.ObjectNotFoundException; import com.c2kernel.property.PropertyDescriptionList; import com.c2kernel.property.PropertyUtility; import com.c2kernel.utils.CastorHashMap; @@ -17,7 +18,7 @@ public class DependencyDescription extends Dependency implements CollectionDescr } @Override - public Collection newInstance() { + public Collection newInstance() throws ObjectNotFoundException{ String depName = getName().replaceFirst("\'$", ""); // HACK: Knock the special 'prime' off the end for the case of descriptions of descriptions Dependency newDep = new Dependency(depName); if (mMembers.list.size() == 1) { // constrain the members based on the property description diff --git a/src/main/java/com/c2kernel/collection/RelationshipUtils.java b/src/main/java/com/c2kernel/collection/RelationshipUtils.java index 6e35ac8..0151b7e 100644 --- a/src/main/java/com/c2kernel/collection/RelationshipUtils.java +++ b/src/main/java/com/c2kernel/collection/RelationshipUtils.java @@ -19,7 +19,7 @@ public class RelationshipUtils if (entityKey == -1) return false; try { - if ( ((Aggregation) Gateway.getProxyManager().getProxy(new EntityPath(entityKey)).getObject(ClusterStorage.COLLECTION+"/Composition" )).size() > 0 ) + if ( Gateway.getProxyManager().getProxy(new EntityPath(entityKey)).getContents(ClusterStorage.COLLECTION).length > 0 ) return true; } catch (Exception ex) diff --git a/src/main/java/com/c2kernel/lifecycle/instance/predefined/entitycreation/Aggregation.java b/src/main/java/com/c2kernel/lifecycle/instance/predefined/entitycreation/Aggregation.java index 2de12e0..b99e898 100644 --- a/src/main/java/com/c2kernel/lifecycle/instance/predefined/entitycreation/Aggregation.java +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/entitycreation/Aggregation.java @@ -2,6 +2,15 @@ package com.c2kernel.lifecycle.instance.predefined.entitycreation; 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; +import com.c2kernel.utils.CastorHashMap; + public class Aggregation implements java.io.Serializable { public boolean isDescription; @@ -19,7 +28,27 @@ public class Aggregation implements java.io.Serializable { this.isDescription = isDescription; } - public com.c2kernel.collection.Aggregation create() { - return new com.c2kernel.collection.AggregationInstance(); + 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 (AggregationMember thisMem : aggregationMemberList) { + CastorHashMap props = new CastorHashMap(); + 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) { + 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, 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/lifecycle/instance/predefined/entitycreation/Dependency.java b/src/main/java/com/c2kernel/lifecycle/instance/predefined/entitycreation/Dependency.java index 1124ede..5993f62 100644 --- a/src/main/java/com/c2kernel/lifecycle/instance/predefined/entitycreation/Dependency.java +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/entitycreation/Dependency.java @@ -3,8 +3,12 @@ package com.c2kernel.lifecycle.instance.predefined.entitycreation; 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; public class Dependency implements java.io.Serializable { @@ -26,12 +30,21 @@ public class Dependency implements java.io.Serializable { /** * @return */ - public com.c2kernel.collection.Dependency create() throws MembershipException{ + 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) { - PropertyUtility.getPropertyDescriptionOutcome(new DomainPath(itemDescriptionPath).getSysKey()); - //TODO: set props and class identifiers + PropertyDescriptionList propList = PropertyUtility.getPropertyDescriptionOutcome(new DomainPath(itemDescriptionPath).getSysKey()); + CastorHashMap props = new CastorHashMap(); + 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 (DependencyMember thisMem : dependencyMemberList) { int syskey = new DomainPath(thisMem.itemPath).getSysKey(); if (syskey == -1) diff --git a/src/main/java/com/c2kernel/lifecycle/instance/predefined/entitycreation/NewItem.java b/src/main/java/com/c2kernel/lifecycle/instance/predefined/entitycreation/NewItem.java index f155ced..16f6cbf 100644 --- a/src/main/java/com/c2kernel/lifecycle/instance/predefined/entitycreation/NewItem.java +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/entitycreation/NewItem.java @@ -132,7 +132,10 @@ public class NewItem { } 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, ""); + } } // register domain path domPath.setEntity(entPath); diff --git a/src/main/java/com/c2kernel/persistency/XMLClusterStorage.java b/src/main/java/com/c2kernel/persistency/XMLClusterStorage.java index 5cfa63c..01c7b90 100644 --- a/src/main/java/com/c2kernel/persistency/XMLClusterStorage.java +++ b/src/main/java/com/c2kernel/persistency/XMLClusterStorage.java @@ -72,7 +72,6 @@ public class XMLClusterStorage extends ClusterStorage { } } catch (Exception e) { - Logger.error(e); Logger.msg(3,"XMLClusterStorage.get() - The path "+path+" from "+sysKey+" does not exist.: "+e.getMessage()); } return null; diff --git a/src/main/java/com/c2kernel/process/module/Module.java b/src/main/java/com/c2kernel/process/module/Module.java index 08ea4dc..d015aea 100644 --- a/src/main/java/com/c2kernel/process/module/Module.java +++ b/src/main/java/com/c2kernel/process/module/Module.java @@ -18,8 +18,11 @@ import com.c2kernel.common.ObjectNotFoundException; import com.c2kernel.entity.proxy.ItemProxy; import com.c2kernel.events.Event; import com.c2kernel.events.History; +import com.c2kernel.lifecycle.instance.predefined.entitycreation.Aggregation; +import com.c2kernel.lifecycle.instance.predefined.entitycreation.AggregationMember; import com.c2kernel.lifecycle.instance.predefined.entitycreation.Dependency; import com.c2kernel.lifecycle.instance.predefined.entitycreation.DependencyMember; +import com.c2kernel.lifecycle.instance.predefined.entitycreation.Geometry; import com.c2kernel.lifecycle.instance.predefined.entitycreation.NewAgent; import com.c2kernel.lifecycle.instance.predefined.entitycreation.NewItem; import com.c2kernel.lifecycle.instance.predefined.entitycreation.Property; @@ -134,6 +137,10 @@ public class Module { else if (type.equals("Item")) { ModuleItem newItem = new ModuleItem(); newItem.workflow = imp.getAttribute("workflow"); + if (imp.hasAttribute("initialPath")) + newItem.initialPath = imp.getAttribute("initialPath"); + else + newItem.initialPath = "/desc/"+ns; NodeList pnl = imp.getElementsByTagName("Property"); for (int j=0; j roles = new ArrayList(); +} \ No newline at end of file diff --git a/src/main/java/com/c2kernel/process/module/ModuleImport.java b/src/main/java/com/c2kernel/process/module/ModuleImport.java new file mode 100644 index 0000000..f505a40 --- /dev/null +++ b/src/main/java/com/c2kernel/process/module/ModuleImport.java @@ -0,0 +1,5 @@ +package com.c2kernel.process.module; + +public abstract class ModuleImport { + String importName; +} \ No newline at end of file diff --git a/src/main/java/com/c2kernel/process/module/ModuleItem.java b/src/main/java/com/c2kernel/process/module/ModuleItem.java new file mode 100644 index 0000000..f74788d --- /dev/null +++ b/src/main/java/com/c2kernel/process/module/ModuleItem.java @@ -0,0 +1,17 @@ +package com.c2kernel.process.module; + +import java.util.ArrayList; +import java.util.HashMap; + +import com.c2kernel.lifecycle.instance.predefined.entitycreation.Aggregation; +import com.c2kernel.lifecycle.instance.predefined.entitycreation.Dependency; +import com.c2kernel.lifecycle.instance.predefined.entitycreation.Property; + +public class ModuleItem extends ModuleImport { + ArrayList props = new ArrayList(); + HashMap outcomes = new HashMap(); + ArrayList deps = new ArrayList(); + ArrayList aggs = new ArrayList(); + String workflow; + String initialPath; +} \ No newline at end of file diff --git a/src/main/java/com/c2kernel/process/module/ModuleManager.java b/src/main/java/com/c2kernel/process/module/ModuleManager.java index b99b325..aa598fa 100644 --- a/src/main/java/com/c2kernel/process/module/ModuleManager.java +++ b/src/main/java/com/c2kernel/process/module/ModuleManager.java @@ -46,6 +46,7 @@ public class ModuleManager { } Logger.debug(5, "Checking dependencies"); + //TODO: order the importing so each modules dependencies are imported ahead of it boolean depFailed = false; for (Module thisMod : modules) { ArrayList deps = thisMod.getDependencies(); diff --git a/src/main/java/com/c2kernel/process/module/ModuleResource.java b/src/main/java/com/c2kernel/process/module/ModuleResource.java new file mode 100644 index 0000000..98d15d4 --- /dev/null +++ b/src/main/java/com/c2kernel/process/module/ModuleResource.java @@ -0,0 +1,6 @@ +package com.c2kernel.process.module; + +public class ModuleResource extends ModuleImport { + String resourceType; + String resourceLocation; +} \ No newline at end of file diff --git a/src/main/java/com/c2kernel/property/PropertyUtility.java b/src/main/java/com/c2kernel/property/PropertyUtility.java index f8e714c..497e5d3 100644 --- a/src/main/java/com/c2kernel/property/PropertyUtility.java +++ b/src/main/java/com/c2kernel/property/PropertyUtility.java @@ -12,6 +12,7 @@ package com.c2kernel.property; import java.util.ArrayList; import java.util.Iterator; +import com.c2kernel.common.ObjectNotFoundException; import com.c2kernel.persistency.ClusterStorage; import com.c2kernel.persistency.outcome.Outcome; import com.c2kernel.process.Gateway; @@ -54,7 +55,7 @@ public class PropertyUtility } - static public PropertyDescriptionList getPropertyDescriptionOutcome(int entityKey) + static public PropertyDescriptionList getPropertyDescriptionOutcome(int entityKey) throws ObjectNotFoundException { try { @@ -64,7 +65,7 @@ public class PropertyUtility catch (Exception ex) { Logger.error(ex); - return null; + throw new ObjectNotFoundException("Problem getting PropertyDescription from "+entityKey, ""); } } diff --git a/src/main/resources/boot/OD/Module.xsd b/src/main/resources/boot/OD/Module.xsd index 6cd84e0..10a0155 100644 --- a/src/main/resources/boot/OD/Module.xsd +++ b/src/main/resources/boot/OD/Module.xsd @@ -1,28 +1,34 @@ - - + + - - - + + + - + - Configuration parameters to add to the Cristal VM on launch. May target either client or server processes. + Configuration parameters to add to the Cristal + VM on launch. May target either client or server processes. + - - + + @@ -31,16 +37,17 @@ - - - + + + - Items to import into or verify within the Cristal server upon launch. + Items to import into or verify within the + Cristal server upon launch. @@ -48,14 +55,14 @@ - + - - - - + + + + @@ -66,11 +73,13 @@ - + - + @@ -79,41 +88,87 @@ - - - + + + - + - + - - + + + + + + + A new collection with layout + + + + + + + + + + + + + + + + + + + + + + + + - - + + + - + - - + + - + Prefix for module components @@ -124,18 +179,18 @@ - - + + - - - - + + + + -- cgit v1.2.3