summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorAndrew Branson <andrew.branson@cern.ch>2014-09-16 08:49:21 +0200
committerAndrew Branson <andrew.branson@cern.ch>2014-09-16 08:49:21 +0200
commit5e294dbd586034b23484adb3c0c4de0f6acd901c (patch)
treee5fac95eff998d6a9096383a97527b8dd0ef56cf /src/main
parent30a7e7b62147afe44fceaf3b52b75b04622ad19c (diff)
Abstract properties. Activities cannot be instantiated unless the slot
overrides them. Fixes #190
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/c2kernel/lifecycle/ActivitySlotDef.java19
-rw-r--r--src/main/java/com/c2kernel/lifecycle/WfVertexDef.java2
-rw-r--r--src/main/java/com/c2kernel/utils/CastorHashMap.java33
-rw-r--r--src/main/java/com/c2kernel/utils/KeyValuePair.java16
-rw-r--r--src/main/resources/boot/OD/CompositeActivityDef.xsd1
-rw-r--r--src/main/resources/boot/OD/ElementaryActivityDef.xsd3
-rw-r--r--src/main/resources/mapFiles/KeyValuePairMap.xml7
7 files changed, 71 insertions, 10 deletions
diff --git a/src/main/java/com/c2kernel/lifecycle/ActivitySlotDef.java b/src/main/java/com/c2kernel/lifecycle/ActivitySlotDef.java
index 85c942f..004d4c1 100644
--- a/src/main/java/com/c2kernel/lifecycle/ActivitySlotDef.java
+++ b/src/main/java/com/c2kernel/lifecycle/ActivitySlotDef.java
@@ -97,6 +97,18 @@ public class ActivitySlotDef extends WfVertexDef
}
}
}
+
+ KeyValuePair[] props;
+ try {
+ props = getTheActivityDef().getProperties().getKeyValuePairs();
+ for (KeyValuePair prop : props) {
+ if (prop.isAbstract() && !getProperties().containsKey(prop.getKey())) {
+ mErrors.add("Abstract property '"+prop.getKey()+"' not defined in slot");
+ err = false;
+ }
+ }
+ } catch (Exception ex) { }
+
// Loop check
Vertex[] outV = getOutGraphables();
@@ -138,11 +150,11 @@ public class ActivitySlotDef extends WfVertexDef
*
* @return CastorHashMap
*/
- public void configureInstance(Activity act)
+ private void configureInstance(Activity act)
{
KeyValuePair[] k = getProperties().getKeyValuePairs();
for (KeyValuePair element : k)
- act.getProperties().put(element.getKey(), element.getValue());
+ act.getProperties().put(element.getKey(), element.getValue(), element.isAbstract());
act.setCentrePoint(getCentrePoint());
act.setOutlinePoints(getOutlinePoints());
act.setInEdgeIds(getInEdgeIds());
@@ -160,6 +172,9 @@ public class ActivitySlotDef extends WfVertexDef
public WfVertex instantiate() throws ObjectNotFoundException, InvalidDataException {
Activity newActivity = (Activity)getTheActivityDef().instantiate();
configureInstance(newActivity);
+ if (newActivity.getProperties().getAbstract().size() > 0) {
+ throw new InvalidDataException("Abstract properties not overridden: "+newActivity.getProperties().getAbstract().toString(), "");
+ }
return newActivity;
}
}
diff --git a/src/main/java/com/c2kernel/lifecycle/WfVertexDef.java b/src/main/java/com/c2kernel/lifecycle/WfVertexDef.java
index b2bd306..b0a6938 100644
--- a/src/main/java/com/c2kernel/lifecycle/WfVertexDef.java
+++ b/src/main/java/com/c2kernel/lifecycle/WfVertexDef.java
@@ -33,7 +33,7 @@ public abstract class WfVertexDef extends GraphableVertex
public void configureInstance(WfVertex newVertex) {
KeyValuePair[] k = getProperties().getKeyValuePairs();
for (KeyValuePair element : k)
- newVertex.getProperties().put(element.getKey(), element.getValue());
+ newVertex.getProperties().put(element.getKey(), element.getValue(), element.isAbstract());
newVertex.setID(getID());
if (getIsLayoutable()) {
newVertex.setInEdgeIds(getInEdgeIds());
diff --git a/src/main/java/com/c2kernel/utils/CastorHashMap.java b/src/main/java/com/c2kernel/utils/CastorHashMap.java
index 25e5ab4..2ec64fe 100644
--- a/src/main/java/com/c2kernel/utils/CastorHashMap.java
+++ b/src/main/java/com/c2kernel/utils/CastorHashMap.java
@@ -1,5 +1,6 @@
package com.c2kernel.utils;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
@@ -12,6 +13,8 @@ public class CastorHashMap extends HashMap<String,Object>
{
clear();
}
+
+ ArrayList<String> abstractPropNames = new ArrayList<String>();
public KeyValuePair[] getKeyValuePairs()
{
@@ -24,8 +27,8 @@ public class CastorHashMap extends HashMap<String,Object>
for(i=0; i<numKeys; i++)
if (keyIter.hasNext())
{
- String tmp = keyIter.next();
- keyValuePairs[i] = new KeyValuePair(tmp,get(tmp));
+ String name = keyIter.next();
+ keyValuePairs[i] = new KeyValuePair(name ,get(name), abstractPropNames.contains(name));
}
return keyValuePairs;
@@ -46,9 +49,33 @@ public class CastorHashMap extends HashMap<String,Object>
}
}
- public void setKeyValuePair(KeyValuePair keyValuePair)
+ @Override
+ public void clear() {
+ super.clear();
+ abstractPropNames = new ArrayList<String>();
+ }
+
+
+ public void setKeyValuePair(KeyValuePair keyValuePair)
{
put(keyValuePair.getKey(), keyValuePair.getValue());
+ if (keyValuePair.isAbstract())
+ abstractPropNames.add(keyValuePair.getKey());
+ else
+ abstractPropNames.remove(keyValuePair.getKey());
}
+ public ArrayList<String> getAbstract() {
+ return abstractPropNames;
+ }
+
+
+ public void put(String key, Object value, boolean isAbstract) {
+ super.put(key, value);
+ if (isAbstract)
+ abstractPropNames.add(key);
+ else
+ abstractPropNames.remove(key);
+
+ }
}
diff --git a/src/main/java/com/c2kernel/utils/KeyValuePair.java b/src/main/java/com/c2kernel/utils/KeyValuePair.java
index 5e5a147..92777f6 100644
--- a/src/main/java/com/c2kernel/utils/KeyValuePair.java
+++ b/src/main/java/com/c2kernel/utils/KeyValuePair.java
@@ -5,13 +5,15 @@ public class KeyValuePair
{
private String mKey = null;
private Object mValue = null;
+ private boolean mAbstract = false;
- public KeyValuePair() {}
+ public KeyValuePair() {}
- public KeyValuePair(String key, Object value)
+ public KeyValuePair(String key, Object value, boolean isAbstract)
{
mKey = key;
mValue = value;
+ mAbstract = isAbstract;
}
public String getKey() {
@@ -30,7 +32,15 @@ public class KeyValuePair
mValue = value;
}
- public String getStringValue() {
+ public void setAbstract(boolean isAbstract) {
+ mAbstract = isAbstract;
+ }
+
+ public boolean isAbstract() {
+ return mAbstract;
+ }
+
+ public String getStringValue() {
if (mValue instanceof String)
return (String)mValue;
else
diff --git a/src/main/resources/boot/OD/CompositeActivityDef.xsd b/src/main/resources/boot/OD/CompositeActivityDef.xsd
index 2e041cd..9bf8c10 100644
--- a/src/main/resources/boot/OD/CompositeActivityDef.xsd
+++ b/src/main/resources/boot/OD/CompositeActivityDef.xsd
@@ -175,6 +175,7 @@
<xs:element name="KeyValuePair" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="Key" type="xs:string" use="required"/>
+ <xs:attribute name="isAbstract" type="xs:boolean" use="optional"/>
<xs:attribute name="String" type="xs:string" use="optional"/>
<xs:attribute name="Boolean" type="xs:boolean" use="optional"/>
<xs:attribute name="Integer" type="xs:int" use="optional"/>
diff --git a/src/main/resources/boot/OD/ElementaryActivityDef.xsd b/src/main/resources/boot/OD/ElementaryActivityDef.xsd
index ebe52a0..f6cce06 100644
--- a/src/main/resources/boot/OD/ElementaryActivityDef.xsd
+++ b/src/main/resources/boot/OD/ElementaryActivityDef.xsd
@@ -8,7 +8,8 @@
<xs:sequence>
<xs:element name="KeyValuePair" maxOccurs="unbounded">
<xs:complexType>
- <xs:attribute name="Key" type="xs:string" use="optional"/>
+ <xs:attribute name="Key" type="xs:string" use="required"/>
+ <xs:attribute name="isAbstract" type="xs:boolean" use="optional"/>
<xs:attribute name="Boolean" type="xs:boolean" use="optional"/>
<xs:attribute name="String" type="xs:string" use="optional"/>
<xs:attribute name="Integer" type="xs:int" use="optional"/>
diff --git a/src/main/resources/mapFiles/KeyValuePairMap.xml b/src/main/resources/mapFiles/KeyValuePairMap.xml
index f709663..2548154 100644
--- a/src/main/resources/mapFiles/KeyValuePairMap.xml
+++ b/src/main/resources/mapFiles/KeyValuePairMap.xml
@@ -10,6 +10,13 @@
set-method="setKey">
<bind-xml name="Key" node="attribute"/>
</field>
+ <field name="mAbstract"
+ type="boolean"
+ direct="false"
+ get-method="isAbstract"
+ set-method="setAbstract">
+ <bind-xml name="isAbstract" node="attribute"/>
+ </field>
<field name="IntegerValue"
type="java.lang.Integer"
direct="false">