[Minor] [New] Implemented and fixed remaining policy tests

This commit is contained in:
Robert von Burg 2015-08-22 11:56:43 +02:00
parent ac1885883a
commit 0e3b3b2a1e
11 changed files with 110 additions and 12 deletions

View File

@ -38,7 +38,7 @@
</TimedState>
<Policies>
<Policy Type="PlanningPolicy" Value="key:SimplePlanningPolicy" />
<Policy Type="ExecutionPolicy" Value="java:li.strolch.policy.execution.TestSimulatedExecutionPolicy" />
<Policy Type="ExecutionPolicy" Value="java:li.strolch.policytest.TestSimulatedExecutionPolicy" />
<Policy Type="ConfirmationPolicy" Value="key:NoConfirmation" />
</Policies>
</Resource>

View File

@ -118,6 +118,9 @@ public class Order extends GroupedParameterizedElement implements StrolchRootEle
clone.setDate(this.date);
clone.setState(this.state);
if (this.policyDefs != null)
clone.setPolicyDefs(this.policyDefs.getClone());
return clone;
}

View File

@ -132,6 +132,9 @@ public class Resource extends GroupedParameterizedElement implements StrolchRoot
}
}
if (this.policyDefs != null)
clone.setPolicyDefs(this.policyDefs.getClone());
return clone;
}

View File

@ -242,6 +242,10 @@ public class Activity extends GroupedParameterizedElement
for (IActivityElement element : this.elements.values()) {
clone.addElement(element.getClone());
}
if (this.policyDefs != null)
clone.setPolicyDefs(this.policyDefs.getClone());
return clone;
}

View File

@ -109,6 +109,9 @@ public class StrolchElementToDomVisitor {
Element element = document.createElement(Tags.ACTIVITY);
fillElement(element, activity);
if (activity.hasPolicyDefs())
fillElement(element, activity.getPolicyDefs());
if (activity.hasElements()) {
Iterator<Entry<String, IActivityElement>> iter = activity.elementIterator();
while (iter.hasNext()) {
@ -123,9 +126,6 @@ public class StrolchElementToDomVisitor {
}
}
if (activity.hasPolicyDefs())
fillElement(element, activity.getPolicyDefs());
return element;
}

View File

@ -23,6 +23,12 @@ import java.util.Map.Entry;
import java.util.Set;
import java.util.SortedSet;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
import ch.eitchnet.utils.iso8601.ISO8601FormatFactory;
import li.strolch.model.GroupedParameterizedElement;
import li.strolch.model.Order;
import li.strolch.model.ParameterBag;
@ -37,13 +43,8 @@ import li.strolch.model.timedstate.StrolchTimedState;
import li.strolch.model.timevalue.ITimeValue;
import li.strolch.model.timevalue.IValue;
import li.strolch.model.timevalue.IValueChange;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
import ch.eitchnet.utils.iso8601.ISO8601FormatFactory;
import li.strolch.policy.PolicyDef;
import li.strolch.policy.PolicyDefs;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
@ -146,6 +147,9 @@ public abstract class StrolchElementToSaxVisitor {
this.contentHandler.endElement(null, null, Tags.TIMED_STATE);
}
if (resource.hasPolicyDefs())
toSax(resource.getPolicyDefs());
this.contentHandler.endElement(null, null, Tags.RESOURCE);
}
@ -162,6 +166,9 @@ public abstract class StrolchElementToSaxVisitor {
toSax((GroupedParameterizedElement) order);
if (order.hasPolicyDefs())
toSax(order.getPolicyDefs());
this.contentHandler.endElement(null, null, Tags.ORDER);
}
@ -169,6 +176,9 @@ public abstract class StrolchElementToSaxVisitor {
this.contentHandler.startElement(null, null, Tags.ACTIVITY, attributesFor(activity));
toSax((GroupedParameterizedElement) activity);
if (activity.hasPolicyDefs())
toSax(activity.getPolicyDefs());
Iterator<Entry<String, IActivityElement>> iter = activity.elementIterator();
while (iter.hasNext()) {
IActivityElement activityElement = iter.next().getValue();
@ -185,6 +195,26 @@ public abstract class StrolchElementToSaxVisitor {
this.contentHandler.endElement(null, null, Tags.ACTIVITY);
}
private void toSax(PolicyDefs policyDefs) throws SAXException {
if (!policyDefs.hasPolicyDefs())
return;
this.contentHandler.startElement(null, null, Tags.POLICIES, null);
for (String type : policyDefs.getPolicyTypes()) {
PolicyDef policyDef = policyDefs.getPolicyDef(type);
this.contentHandler.startElement(null, null, Tags.POLICY, attributesFor(policyDef));
this.contentHandler.endElement(null, null, Tags.POLICY);
}
this.contentHandler.endElement(null, null, Tags.POLICIES);
}
protected AttributesImpl attributesFor(PolicyDef policyDef) {
AttributesImpl attributes = new AttributesImpl();
attributes.addAttribute(null, null, Tags.TYPE, Tags.CDATA, policyDef.getType());
attributes.addAttribute(null, null, Tags.VALUE, Tags.CDATA, policyDef.getValueForXml());
return attributes;
}
protected AttributesImpl attributesFor(Action action) {
AttributesImpl attributes = attributesFor((StrolchElement) action);
attributes.addAttribute(null, null, Tags.RESOURCE_ID, Tags.CDATA, action.getResourceId());

View File

@ -37,4 +37,9 @@ public class JavaPolicyDef extends PolicyDef {
public String getValueForXml() {
return XML_PREFIX + this.value;
}
@Override
public JavaPolicyDef getClone() {
return new JavaPolicyDef(this.type, this.value);
}
}

View File

@ -39,4 +39,9 @@ public class KeyPolicyDef extends PolicyDef {
public String getValueForXml() {
return XML_PREFIX + this.value;
}
@Override
public KeyPolicyDef getClone() {
return new KeyPolicyDef(this.type, this.value);
}
}

View File

@ -75,8 +75,21 @@ public abstract class PolicyDef {
*/
public abstract <T> T accept(PolicyDefVisitor visitor);
/**
* Returns the value formatted for XML marshalling, so that the {@link #valueOf(String, String)} can then again
* parse the value and instantiate a concrete {@link PolicyDef} instance
*
* @return the value formatted for XML marshalling
*/
public abstract String getValueForXml();
/**
* Return a clone of this {@link PolicyDef} instance
*
* @return a clone of this {@link PolicyDef} instance
*/
public abstract PolicyDef getClone();
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
@ -88,13 +101,35 @@ public abstract class PolicyDef {
return sb.toString();
}
/**
* Returns a {@link PolicyDef} instance which handles the given type of XML Value
*
* @param type
* the type
* @param xmlValue
* the XML formatted value with the prefix denoting the {@link PolicyDef} type
*
* @return a {@link PolicyDef} instance which handles the given type of XML Value
*/
public static PolicyDef valueOf(String type, String xmlValue) {
if (xmlValue.startsWith(JavaPolicyDef.XML_PREFIX)) {
String value = xmlValue.substring(JavaPolicyDef.XML_PREFIX.length());
try {
Class.forName(value);
} catch (ClassNotFoundException e) {
throw new StrolchPolicyException("Invalid policy configuration. Policy does not exist: " + value);
}
return new JavaPolicyDef(type, value);
} else if (xmlValue.startsWith(KeyPolicyDef.XML_PREFIX)) {
String value = xmlValue.substring(KeyPolicyDef.XML_PREFIX.length());
return new KeyPolicyDef(type, value);
} else {
throw new StrolchPolicyException("Unhandled PolicyDef from xml value " + xmlValue);
}

View File

@ -85,4 +85,17 @@ public class PolicyDefs {
sb.append("]");
return sb.toString();
}
/**
* Returns a clone of this {@link PolicyDefs}
*
* @return a clone of this {@link PolicyDefs}
*/
public PolicyDefs getClone() {
PolicyDefs clone = new PolicyDefs();
for (PolicyDef policyDef : this.policyDefMap.values()) {
clone.addOrUpdate(policyDef.getClone());
}
return clone;
}
}

View File

@ -12,7 +12,7 @@
</ParameterBag>
<Policies>
<Policy Type="PlanningPolicy" Value="key:SimplePlanningPolicy" />
<Policy Type="ExecutionPolicy" Value="java:li.strolch.policy.execution.TestSimulatedExecutionPolicy" />
<Policy Type="ExecutionPolicy" Value="java:li.strolch.policytest.TestSimulatedExecutionPolicy" />
<Policy Type="ConfirmationPolicy" Value="key:NoConfirmation" />
</Policies>
</Resource>