[Major] Implemented opt-in versioning

- Implemented marshalling of Version
- Added further tests for marshalled version
- added version in deep equals
- fixing further tests
This commit is contained in:
Robert von Burg 2016-08-07 17:47:52 +02:00
parent 7bdeac179c
commit 8c4c8e539e
61 changed files with 873 additions and 508 deletions

View File

@ -20,9 +20,9 @@ import java.util.List;
import li.strolch.agent.api.ActivityMap;
import li.strolch.agent.api.AuditTrail;
import li.strolch.agent.api.ElementMap;
import li.strolch.model.ActivityVisitor;
import li.strolch.model.activity.Activity;
import li.strolch.model.query.ActivityQuery;
import li.strolch.model.visitor.ActivityVisitor;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.utils.dbc.DBC;

View File

@ -21,8 +21,8 @@ import li.strolch.agent.api.AuditTrail;
import li.strolch.agent.api.ElementMap;
import li.strolch.agent.api.OrderMap;
import li.strolch.model.Order;
import li.strolch.model.OrderVisitor;
import li.strolch.model.query.OrderQuery;
import li.strolch.model.visitor.OrderVisitor;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.utils.dbc.DBC;

View File

@ -21,8 +21,8 @@ import li.strolch.agent.api.AuditTrail;
import li.strolch.agent.api.ElementMap;
import li.strolch.agent.api.ResourceMap;
import li.strolch.model.Resource;
import li.strolch.model.ResourceVisitor;
import li.strolch.model.query.ResourceQuery;
import li.strolch.model.visitor.ResourceVisitor;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.utils.dbc.DBC;

View File

@ -26,13 +26,10 @@ import li.strolch.agent.api.StrolchLockException;
import li.strolch.agent.api.StrolchRealm;
import li.strolch.agent.impl.DataStoreMode;
import li.strolch.exception.StrolchException;
import li.strolch.model.ActivityVisitor;
import li.strolch.model.Locator;
import li.strolch.model.Order;
import li.strolch.model.OrderVisitor;
import li.strolch.model.ParameterBag;
import li.strolch.model.Resource;
import li.strolch.model.ResourceVisitor;
import li.strolch.model.StrolchElement;
import li.strolch.model.StrolchRootElement;
import li.strolch.model.Tags;
@ -47,6 +44,9 @@ import li.strolch.model.parameter.StringParameter;
import li.strolch.model.query.ActivityQuery;
import li.strolch.model.query.OrderQuery;
import li.strolch.model.query.ResourceQuery;
import li.strolch.model.visitor.ActivityVisitor;
import li.strolch.model.visitor.OrderVisitor;
import li.strolch.model.visitor.ResourceVisitor;
import li.strolch.privilege.model.Certificate;
import li.strolch.runtime.StrolchConstants;
import li.strolch.service.api.Command;

View File

@ -17,11 +17,11 @@ package li.strolch.runtime.query.inmemory;
import java.util.List;
import li.strolch.model.ActivityVisitor;
import li.strolch.model.activity.Activity;
import li.strolch.model.query.ActivityQuery;
import li.strolch.model.query.ActivityQueryVisitor;
import li.strolch.model.query.StrolchTypeNavigation;
import li.strolch.model.visitor.ActivityVisitor;
import li.strolch.utils.dbc.DBC;
/**

View File

@ -18,12 +18,12 @@ package li.strolch.runtime.query.inmemory;
import java.util.List;
import li.strolch.model.Order;
import li.strolch.model.OrderVisitor;
import li.strolch.model.query.DateSelection;
import li.strolch.model.query.OrderQuery;
import li.strolch.model.query.OrderQueryVisitor;
import li.strolch.model.query.StateSelection;
import li.strolch.model.query.StrolchTypeNavigation;
import li.strolch.model.visitor.OrderVisitor;
import li.strolch.utils.dbc.DBC;
/**

View File

@ -18,10 +18,10 @@ package li.strolch.runtime.query.inmemory;
import java.util.List;
import li.strolch.model.Resource;
import li.strolch.model.ResourceVisitor;
import li.strolch.model.query.ResourceQuery;
import li.strolch.model.query.ResourceQueryVisitor;
import li.strolch.model.query.StrolchTypeNavigation;
import li.strolch.model.visitor.ResourceVisitor;
import li.strolch.utils.dbc.DBC;
/**

View File

@ -379,7 +379,7 @@ public class ModelGenerator {
ParameterBag bag = createParameterBag(BAG_ID, BAG_NAME, BAG_TYPE);
rootActivity.addParameterBag(bag);
Action action = createAction("act_" + rootActivity.getId(), "Action " + rootActivity.getName(), "Use");
Action action = createAction("action_" + rootActivity.getId(), "Action " + rootActivity.getName(), "Use");
rootActivity.addElement(action);
Activity subActivity = new Activity("sub_" + id, "sub_" + name, type);
@ -387,7 +387,7 @@ public class ModelGenerator {
subActivity.addParameterBag(bag);
rootActivity.addElement(subActivity);
action = createAction("act_" + id, "Action " + name, "Use");
action = createAction("action_" + id, "Action " + name, "Use");
subActivity.addElement(action);
Activity subSubActivity = new Activity("subSub_" + id, "subSub_" + name, type);
@ -395,7 +395,7 @@ public class ModelGenerator {
subSubActivity.addParameterBag(bag);
subActivity.addElement(subSubActivity);
action = createAction("act_" + id, "Action " + name, "Use");
action = createAction("action_" + id, "Action " + name, "Use");
subSubActivity.addElement(action);
rootActivity.setPolicyDefs(createPolicyDefs());

View File

@ -80,6 +80,11 @@ public class Order extends GroupedParameterizedElement implements StrolchRootEle
setDate(date);
}
@Override
public boolean hasVersion() {
return this.version != null;
}
@Override
public Version getVersion() {
return this.version;

View File

@ -60,6 +60,11 @@ public class Resource extends GroupedParameterizedElement implements StrolchRoot
super(id, name, type);
}
@Override
public boolean hasVersion() {
return this.version != null;
}
@Override
public Version getVersion() {
return this.version;

View File

@ -25,6 +25,13 @@ import li.strolch.model.visitor.StrolchRootElementVisitor;
*/
public interface StrolchRootElement extends StrolchElement, PolicyContainer, ParameterBagContainer {
/**
* Returns true if this {@link StrolchRootElement} has a version set
*
* @return true if this {@link StrolchRootElement} has a version set
*/
public boolean hasVersion();
/**
* Returns the current version of this object, or null if no version is set
*

View File

@ -49,6 +49,10 @@ public class Tags {
public static final String POLICIES = "Policies";
public static final String POLICY = "Policy";
public static final String ELEMENTS = "Elements";
public static final String VERSION = "Version";
public static final String CREATED_AT = "CreatedAt";
public static final String CREATED_BY = "CreatedBy";
public static final String DELETED = "Deleted";
public static final String ACTIVITY = "Activity";
public static final String ACTION = "Action";

View File

@ -44,13 +44,28 @@ public class Version {
* the username of the creator of this object
*/
public Version(Locator locator, int version, String createdBy, boolean deleted) {
this(locator, version, createdBy, new Date(), deleted);
}
/**
* Creates a new version instance with the given values.
*
* @param version
* the integer version which must be >= 0 and should be incremented for each new version of an object
* @param createdBy
* the username of the creator of this object
* @param createdAt
* date when the version was created
*/
public Version(Locator locator, int version, String createdBy, Date createdAt, boolean deleted) {
DBC.PRE.assertTrue("Version must by >= 0", version >= 0);
DBC.PRE.assertNotNull("locator must be set!", locator);
DBC.PRE.assertNotNull("createdBy must be set!", createdBy);
DBC.PRE.assertNotNull("createdAt must be set!", createdAt);
this.locator = locator;
this.version = version;
this.createdBy = createdBy;
this.createdAt = new Date();
this.createdAt = createdAt;
this.deleted = deleted;
}
@ -207,7 +222,7 @@ public class Version {
* maps
*/
public static void updateVersionFor(StrolchRootElement element, String username, boolean deleted) {
int v = element.getVersion() == null ? 0 : element.getVersion().getVersion() + 1;
int v = !element.hasVersion() ? 0 : element.getVersion().getVersion() + 1;
Version version = new Version(element.getLocator(), v, username, deleted);
element.setVersion(version);
}

View File

@ -70,6 +70,11 @@ public class Activity extends GroupedParameterizedElement
super(id, name, type);
}
@Override
public boolean hasVersion() {
return this.version != null;
}
@Override
public Version getVersion() {
return this.version;

View File

@ -3,8 +3,8 @@ package li.strolch.model.json;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import li.strolch.model.ActivityVisitor;
import li.strolch.model.activity.Activity;
import li.strolch.model.visitor.ActivityVisitor;
public class ActivityToJsonVisitor extends StrolchElementToJsonVisitor implements ActivityVisitor<JsonObject> {

View File

@ -4,7 +4,7 @@ import com.google.gson.Gson;
import com.google.gson.JsonObject;
import li.strolch.model.Order;
import li.strolch.model.OrderVisitor;
import li.strolch.model.visitor.OrderVisitor;
public class OrderToJsonVisitor extends StrolchElementToJsonVisitor implements OrderVisitor<JsonObject> {

View File

@ -4,7 +4,7 @@ import com.google.gson.Gson;
import com.google.gson.JsonObject;
import li.strolch.model.Resource;
import li.strolch.model.ResourceVisitor;
import li.strolch.model.visitor.ResourceVisitor;
public class ResourceToJsonVisitor extends StrolchElementToJsonVisitor implements ResourceVisitor<JsonObject> {

View File

@ -16,6 +16,7 @@
package li.strolch.model.json;
import java.text.MessageFormat;
import java.util.Date;
import java.util.Map.Entry;
import java.util.Set;
@ -31,8 +32,10 @@ import li.strolch.model.ParameterBag;
import li.strolch.model.ParameterizedElement;
import li.strolch.model.Resource;
import li.strolch.model.State;
import li.strolch.model.StrolchRootElement;
import li.strolch.model.StrolchValueType;
import li.strolch.model.Tags;
import li.strolch.model.Version;
import li.strolch.model.activity.Action;
import li.strolch.model.activity.Activity;
import li.strolch.model.parameter.Parameter;
@ -52,6 +55,8 @@ public class StrolchElementFromJsonVisitor {
public void fillElement(JsonObject jsonObject, Order order) {
fillElement(jsonObject, (GroupedParameterizedElement) order);
parseVersion(order, jsonObject);
// policies
PolicyDefs defs = parsePolicies(jsonObject);
if (defs.hasPolicyDefs())
@ -75,6 +80,8 @@ public class StrolchElementFromJsonVisitor {
public void fillElement(JsonObject jsonObject, Resource resource) {
fillElement(jsonObject, (GroupedParameterizedElement) resource);
parseVersion(resource, jsonObject);
// policies
PolicyDefs defs = parsePolicies(jsonObject);
if (defs.hasPolicyDefs())
@ -139,6 +146,8 @@ public class StrolchElementFromJsonVisitor {
public void fillElement(JsonObject jsonObject, Activity activity) {
fillElement(jsonObject, (GroupedParameterizedElement) activity);
parseVersion(activity, jsonObject);
// policies
PolicyDefs defs = parsePolicies(jsonObject);
if (defs.hasPolicyDefs())
@ -349,4 +358,21 @@ public class StrolchElementFromJsonVisitor {
return policyDefs;
}
protected void parseVersion(StrolchRootElement rootElement, JsonObject jsonObject) {
if (!jsonObject.has(Tags.VERSION))
return;
JsonObject versionJ = jsonObject.getAsJsonObject(Tags.VERSION);
int v = versionJ.get(Tags.VERSION).getAsInt();
String createdBy = versionJ.get(Tags.CREATED_BY).getAsString();
String createdAtS = versionJ.get(Tags.CREATED_AT).getAsString();
Date createdAt = ISO8601FormatFactory.getInstance().parseDate(createdAtS);
boolean deleted = versionJ.get(Tags.DELETED).getAsBoolean();
Version version = new Version(rootElement.getLocator(), v, createdBy, createdAt, deleted);
rootElement.setVersion(version);
}
}

View File

@ -14,7 +14,9 @@ import li.strolch.model.ParameterBag;
import li.strolch.model.PolicyContainer;
import li.strolch.model.Resource;
import li.strolch.model.StrolchModelConstants;
import li.strolch.model.StrolchRootElement;
import li.strolch.model.Tags;
import li.strolch.model.Version;
import li.strolch.model.activity.Action;
import li.strolch.model.activity.Activity;
import li.strolch.model.activity.IActivityElement;
@ -36,6 +38,7 @@ public class StrolchElementToJsonVisitor {
toJson(element, rootJ);
addVersion(element, rootJ);
addParameterBags(element, rootJ);
addTimedStates(element, rootJ);
addPolicies(element, rootJ);
@ -52,6 +55,7 @@ public class StrolchElementToJsonVisitor {
rootJ.addProperty(Tags.DATE, ISO8601FormatFactory.getInstance().formatDate(element.getDate()));
rootJ.addProperty(Tags.STATE, element.getState().name());
addVersion(element, rootJ);
addParameterBags(element, rootJ);
addPolicies(element, rootJ);
@ -60,6 +64,7 @@ public class StrolchElementToJsonVisitor {
public JsonObject toJson(Activity element) {
JsonObject rootJ = new JsonObject();
addVersion(element, rootJ);
return toJson(element, rootJ);
}
@ -243,4 +248,18 @@ public class StrolchElementToJsonVisitor {
}
}
}
private void addVersion(StrolchRootElement element, JsonObject rootJ) {
if (!element.hasVersion())
return;
Version version = element.getVersion();
JsonObject versionJ = new JsonObject();
versionJ.addProperty(Tags.VERSION, version.getVersion());
versionJ.addProperty(Tags.CREATED_BY, version.getCreatedBy());
versionJ.addProperty(Tags.CREATED_AT, ISO8601FormatFactory.getInstance().formatDate(version.getCreatedAt()));
versionJ.addProperty(Tags.DELETED, version.isDeleted());
rootJ.add(Tags.VERSION, versionJ);
}
}

View File

@ -15,10 +15,10 @@
*/
package li.strolch.model.query;
import li.strolch.model.ActivityVisitor;
import li.strolch.model.activity.Action;
import li.strolch.model.activity.Activity;
import li.strolch.model.query.ordering.StrolchQueryOrdering;
import li.strolch.model.visitor.ActivityVisitor;
import li.strolch.model.visitor.NoStrategyActivityVisitor;
import li.strolch.utils.dbc.DBC;

View File

@ -16,10 +16,10 @@
package li.strolch.model.query;
import li.strolch.model.Order;
import li.strolch.model.OrderVisitor;
import li.strolch.model.parameter.Parameter;
import li.strolch.model.query.ordering.StrolchQueryOrdering;
import li.strolch.model.visitor.NoStrategyOrderVisitor;
import li.strolch.model.visitor.OrderVisitor;
import li.strolch.utils.dbc.DBC;
/**

View File

@ -16,10 +16,10 @@
package li.strolch.model.query;
import li.strolch.model.Resource;
import li.strolch.model.ResourceVisitor;
import li.strolch.model.parameter.Parameter;
import li.strolch.model.query.ordering.StrolchQueryOrdering;
import li.strolch.model.visitor.NoStrategyResourceVisitor;
import li.strolch.model.visitor.ResourceVisitor;
import li.strolch.utils.dbc.DBC;
/**

View File

@ -17,7 +17,6 @@ package li.strolch.model.visitor;
import java.util.List;
import li.strolch.model.ActivityVisitor;
import li.strolch.model.Locator;
import li.strolch.model.activity.Activity;

View File

@ -13,10 +13,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package li.strolch.model;
package li.strolch.model.visitor;
import li.strolch.model.activity.Activity;
import li.strolch.model.visitor.StrolchElementVisitor;
/**
* @author Robert von Burg <eitch@eitchnet.ch>

View File

@ -15,7 +15,6 @@
*/
package li.strolch.model.visitor;
import li.strolch.model.ActivityVisitor;
import li.strolch.model.activity.Activity;
/**

View File

@ -16,7 +16,6 @@
package li.strolch.model.visitor;
import li.strolch.model.Order;
import li.strolch.model.OrderVisitor;
/**
* @author Robert von Burg <eitch@eitchnet.ch>

View File

@ -16,7 +16,6 @@
package li.strolch.model.visitor;
import li.strolch.model.Resource;
import li.strolch.model.ResourceVisitor;
/**
* @author Robert von Burg <eitch@eitchnet.ch>

View File

@ -19,7 +19,6 @@ import java.util.List;
import li.strolch.model.Locator;
import li.strolch.model.Order;
import li.strolch.model.OrderVisitor;
/**
* @author Robert von Burg <eitch@eitchnet.ch>

View File

@ -13,9 +13,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package li.strolch.model;
package li.strolch.model.visitor;
import li.strolch.model.visitor.StrolchElementVisitor;
import li.strolch.model.Order;
/**
* @author Robert von Burg <eitch@eitchnet.ch>

View File

@ -19,7 +19,6 @@ import java.util.List;
import li.strolch.model.Locator;
import li.strolch.model.Resource;
import li.strolch.model.ResourceVisitor;
/**
* @author Robert von Burg <eitch@eitchnet.ch>

View File

@ -13,9 +13,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package li.strolch.model;
package li.strolch.model.visitor;
import li.strolch.model.visitor.StrolchElementVisitor;
import li.strolch.model.Resource;
/**
* @author Robert von Burg <eitch@eitchnet.ch>

View File

@ -27,7 +27,9 @@ import li.strolch.model.Order;
import li.strolch.model.ParameterBag;
import li.strolch.model.Resource;
import li.strolch.model.StrolchElement;
import li.strolch.model.StrolchRootElement;
import li.strolch.model.Tags;
import li.strolch.model.Version;
import li.strolch.model.activity.Action;
import li.strolch.model.activity.Activity;
import li.strolch.model.activity.IActivityElement;
@ -39,8 +41,11 @@ import li.strolch.model.timevalue.ITimeVariable;
import li.strolch.utils.dbc.DBC;
/**
* Visitor of {@link StrolchRootElement} to check if they are equal. This implementations stores a list of
* {@link Locator} for every element of an object which is not equal, thus making it easy to find the inconsistencies in
* objects.
*
* @author Robert von Burg <eitch@eitchnet.ch>
*
*/
public class StrolchElementDeepEqualsVisitor {
@ -57,79 +62,49 @@ public class StrolchElementDeepEqualsVisitor {
return this.mismatchedLocators;
}
/**
* Returns true if the objects are equal, i.e. no locators for mismatches are stored
*
* @return true if the objects are equal, i.e. no locators for mismatches are stored
*/
public boolean isEqual() {
return this.mismatchedLocators.isEmpty();
}
protected void deepEquals(StrolchElement srcElement, StrolchElement dstElement) {
DBC.PRE.assertEquals("Both elements should have the same ID", srcElement.getId(), dstElement.getId());
if (!srcElement.getName().equals(dstElement.getName())) {
this.mismatchedLocators.add(dstElement.getLocator().append(Tags.NAME));
}
if (!srcElement.getType().equals(dstElement.getType())) {
this.mismatchedLocators.add(dstElement.getLocator().append(Tags.TYPE));
}
/**
* Checks the given orders for deep equality
*
* @param srcOrder
* source order
* @param dstOrder
* destination order
*/
public void deepEquals(Order srcOrder, Order dstOrder) {
deepEquals((StrolchRootElement) srcOrder, (StrolchRootElement) dstOrder);
if (!srcOrder.getState().equals(dstOrder.getState()))
addLocator(dstOrder.getLocator().append(Tags.STATE));
if (!srcOrder.getDate().equals(dstOrder.getDate()))
addLocator(dstOrder.getLocator().append(Tags.DATE));
}
protected void deepEquals(Order srcOrder, Order dstOrder) {
deepEquals((StrolchElement) srcOrder, (StrolchElement) dstOrder);
if (!srcOrder.getState().equals(dstOrder.getState())) {
this.mismatchedLocators.add(dstOrder.getLocator().append(Tags.STATE));
}
if (!srcOrder.getDate().equals(dstOrder.getDate())) {
this.mismatchedLocators.add(dstOrder.getLocator().append(Tags.DATE));
}
deepEquals((GroupedParameterizedElement) srcOrder, (GroupedParameterizedElement) dstOrder);
if (srcOrder.hasPolicyDefs() && dstOrder.hasPolicyDefs())
deepEquals(srcOrder.getPolicyDefs(), dstOrder.getPolicyDefs());
else if (srcOrder.hasPolicyDefs() != dstOrder.hasPolicyDefs())
this.mismatchedLocators.add(srcOrder.getPolicyDefs().getLocator());
}
private void deepEquals(PolicyDefs srcPolicyDefs, PolicyDefs dstPolicyDefs) {
Set<String> srcTypes = srcPolicyDefs.getPolicyTypes();
for (String srcType : srcTypes) {
PolicyDef srcPolicyDef = srcPolicyDefs.getPolicyDef(srcType);
if (!dstPolicyDefs.hasPolicyDef(srcType)) {
this.mismatchedLocators.add(dstPolicyDefs.getLocator().append(srcType));
continue;
}
PolicyDef dstPolicyDef = dstPolicyDefs.getPolicyDef(srcType);
if (srcPolicyDef.getClass() != dstPolicyDef.getClass())
this.mismatchedLocators.add(dstPolicyDefs.getLocator().append(srcType));
if (!srcPolicyDef.getValue().equals(dstPolicyDef.getValue()))
this.mismatchedLocators.add(dstPolicyDefs.getLocator().append(srcType));
}
Set<String> dstTypes = dstPolicyDefs.getPolicyTypes();
for (String dstType : dstTypes) {
if (!srcPolicyDefs.hasPolicyDef(dstType)) {
this.mismatchedLocators.add(srcPolicyDefs.getLocator().append(dstType));
}
}
}
protected void deepEquals(Resource srcRes, Resource dstRes) {
deepEquals((StrolchElement) srcRes, (StrolchElement) dstRes);
deepEquals((GroupedParameterizedElement) srcRes, (GroupedParameterizedElement) dstRes);
if (srcRes.hasPolicyDefs() && dstRes.hasPolicyDefs())
deepEquals(srcRes.getPolicyDefs(), dstRes.getPolicyDefs());
else if (srcRes.hasPolicyDefs() != dstRes.hasPolicyDefs())
this.mismatchedLocators.add(srcRes.getPolicyDefs().getLocator());
/**
* Checks the given resources for deep equality
*
* @param srcRes
* source resource
* @param dstRes
* destination resource
*/
public void deepEquals(Resource srcRes, Resource dstRes) {
deepEquals((StrolchRootElement) srcRes, (StrolchRootElement) dstRes);
Set<String> srcTimedStateKeySet = srcRes.getTimedStateKeySet();
for (String timedStateKey : srcTimedStateKeySet) {
StrolchTimedState<?> srcTimedState = srcRes.getTimedState(timedStateKey);
if (!dstRes.hasTimedState(timedStateKey)) {
this.mismatchedLocators.add(srcTimedState.getLocator());
addLocator(srcTimedState.getLocator());
continue;
}
@ -141,96 +116,153 @@ public class StrolchElementDeepEqualsVisitor {
for (String timedStateKey : dstTimedStateKeySet) {
if (!srcRes.hasTimedState(timedStateKey)) {
StrolchTimedState<?> dstTimedState = dstRes.getTimedState(timedStateKey);
this.mismatchedLocators.add(dstTimedState.getLocator());
addLocator(dstTimedState.getLocator());
}
}
}
protected void deepEquals(Activity srcActivity, Activity dstActivity) {
deepEquals((StrolchElement) srcActivity, (StrolchElement) dstActivity);
deepEquals((GroupedParameterizedElement) srcActivity, (GroupedParameterizedElement) dstActivity);
if (srcActivity.hasPolicyDefs() && dstActivity.hasPolicyDefs())
deepEquals(srcActivity.getPolicyDefs(), dstActivity.getPolicyDefs());
else if (srcActivity.hasPolicyDefs() != dstActivity.hasPolicyDefs())
this.mismatchedLocators.add(srcActivity.getPolicyDefs().getLocator());
/**
* Checks the given activities for deep equality
*
* @param srcActivity
* source activity
* @param dstActivity
* destination activity
*/
public void deepEquals(Activity srcActivity, Activity dstActivity) {
deepEquals((StrolchRootElement) srcActivity, (StrolchRootElement) dstActivity);
Iterator<Entry<String, IActivityElement>> iter = srcActivity.elementIterator();
while (iter.hasNext()) {
IActivityElement srcActivityElement = iter.next().getValue();
if (!dstActivity.hasElement(srcActivityElement.getId())) {
this.mismatchedLocators.add(srcActivityElement.getLocator());
addLocator(srcActivityElement.getLocator());
continue;
}
IActivityElement dstActivityElement = dstActivity.getElement(srcActivityElement.getId());
if (!srcActivityElement.getClass().equals(dstActivityElement.getClass())) {
this.mismatchedLocators.add(srcActivityElement.getLocator());
addLocator(srcActivityElement.getLocator());
continue;
}
if (srcActivityElement instanceof Activity) {
if (srcActivityElement instanceof Activity)
deepEquals((Activity) srcActivityElement, (Activity) dstActivityElement);
} else if (srcActivityElement instanceof Action) {
else if (srcActivityElement instanceof Action)
deepEquals((Action) srcActivityElement, (Action) dstActivityElement);
} else {
else
throw new UnsupportedOperationException("Unhandled instance type " + srcActivityElement.getClass());
}
}
iter = dstActivity.elementIterator();
while (iter.hasNext()) {
IActivityElement activityElement = iter.next().getValue();
if (!srcActivity.hasElement(activityElement.getId())) {
this.mismatchedLocators.add(activityElement.getLocator());
}
if (!srcActivity.hasElement(activityElement.getId()))
addLocator(activityElement.getLocator());
}
}
protected void deepEquals(Action srcAction, Action dstAction) {
private void deepEquals(StrolchRootElement srcElement, StrolchRootElement dstElement) {
deepEquals((StrolchElement) srcElement, (StrolchElement) dstElement);
deepEquals((GroupedParameterizedElement) srcElement, (GroupedParameterizedElement) dstElement);
if (srcElement.hasVersion() && dstElement.hasVersion())
deepEquals(srcElement.getVersion(), dstElement.getVersion());
else if (!srcElement.hasVersion() && dstElement.hasVersion())
addLocator(dstElement.getLocator().append(Tags.VERSION));
else if (srcElement.hasVersion() && !dstElement.hasVersion())
addLocator(srcElement.getLocator().append(Tags.VERSION));
if (srcElement.hasPolicyDefs() && dstElement.hasPolicyDefs())
deepEquals(srcElement.getPolicyDefs(), dstElement.getPolicyDefs());
else if (srcElement.hasPolicyDefs() != dstElement.hasPolicyDefs())
addLocator(srcElement.getPolicyDefs().getLocator());
}
private void deepEquals(StrolchElement srcElement, StrolchElement dstElement) {
DBC.PRE.assertEquals("Both elements should have the same ID", srcElement.getId(), dstElement.getId());
if (!srcElement.getName().equals(dstElement.getName()))
addLocator(dstElement.getLocator().append(Tags.NAME));
if (!srcElement.getType().equals(dstElement.getType()))
addLocator(dstElement.getLocator().append(Tags.TYPE));
}
private void deepEquals(Version srcVersion, Version dstVersion) {
if (srcVersion.getVersion() != dstVersion.getVersion())
addLocator(srcVersion.getLocator().append(Tags.VERSION));
if (!srcVersion.getCreatedBy().equals(dstVersion.getCreatedBy()))
addLocator(srcVersion.getLocator().append(Tags.VERSION));
if (!srcVersion.getCreatedAt().equals(dstVersion.getCreatedAt()))
addLocator(srcVersion.getLocator().append(Tags.VERSION));
if (srcVersion.isDeleted() != dstVersion.isDeleted())
addLocator(srcVersion.getLocator().append(Tags.VERSION));
}
private void deepEquals(PolicyDefs srcPolicyDefs, PolicyDefs dstPolicyDefs) {
Set<String> srcTypes = srcPolicyDefs.getPolicyTypes();
for (String srcType : srcTypes) {
PolicyDef srcPolicyDef = srcPolicyDefs.getPolicyDef(srcType);
if (!dstPolicyDefs.hasPolicyDef(srcType)) {
addLocator(dstPolicyDefs.getLocator().append(srcType));
continue;
}
PolicyDef dstPolicyDef = dstPolicyDefs.getPolicyDef(srcType);
if (srcPolicyDef.getClass() != dstPolicyDef.getClass())
addLocator(dstPolicyDefs.getLocator().append(srcType));
if (!srcPolicyDef.getValue().equals(dstPolicyDef.getValue()))
addLocator(dstPolicyDefs.getLocator().append(srcType));
}
Set<String> dstTypes = dstPolicyDefs.getPolicyTypes();
for (String dstType : dstTypes) {
if (!srcPolicyDefs.hasPolicyDef(dstType))
addLocator(srcPolicyDefs.getLocator().append(dstType));
}
}
private void deepEquals(Action srcAction, Action dstAction) {
deepEquals((StrolchElement) srcAction, (StrolchElement) dstAction);
deepEquals((GroupedParameterizedElement) srcAction, (GroupedParameterizedElement) dstAction);
if (!srcAction.getResourceId().equals(dstAction.getResourceId())) {
this.mismatchedLocators.add(dstAction.getLocator().append(Tags.RESOURCE_ID));
}
if (!srcAction.getResourceType().equals(dstAction.getResourceType())) {
this.mismatchedLocators.add(dstAction.getLocator().append(Tags.RESOURCE_TYPE));
}
if (!srcAction.getState().equals(dstAction.getState())) {
this.mismatchedLocators.add(dstAction.getLocator().append(Tags.STATE));
}
if (!srcAction.getResourceId().equals(dstAction.getResourceId()))
addLocator(dstAction.getLocator().append(Tags.RESOURCE_ID));
if (!srcAction.getResourceType().equals(dstAction.getResourceType()))
addLocator(dstAction.getLocator().append(Tags.RESOURCE_TYPE));
if (!srcAction.getState().equals(dstAction.getState()))
addLocator(dstAction.getLocator().append(Tags.STATE));
if ((srcAction.getParent() == null && srcAction.getParent() != null)
|| (srcAction.getParent() != null && srcAction.getParent() == null)) {
this.mismatchedLocators.add(dstAction.getLocator());
} else if (!srcAction.getParent().getId().equals(dstAction.getParent().getId())) {
this.mismatchedLocators.add(dstAction.getLocator());
} else if (!srcAction.getParent().getType().equals(dstAction.getParent().getType())) {
this.mismatchedLocators.add(dstAction.getLocator());
}
|| (srcAction.getParent() != null && srcAction.getParent() == null))
addLocator(dstAction.getLocator());
else if (!srcAction.getParent().getId().equals(dstAction.getParent().getId()))
addLocator(dstAction.getLocator());
else if (!srcAction.getParent().getType().equals(dstAction.getParent().getType()))
addLocator(dstAction.getLocator());
if (srcAction.hasChanges() != dstAction.hasChanges()) {
this.mismatchedLocators.add(dstAction.getLocator().append(Tags.VALUE_CHANGES));
} else if (!srcAction.getChanges().equals(dstAction.getChanges())) {
this.mismatchedLocators.add(dstAction.getLocator().append(Tags.VALUE_CHANGES));
}
if (srcAction.hasChanges() != dstAction.hasChanges())
addLocator(dstAction.getLocator().append(Tags.VALUE_CHANGES));
else if (!srcAction.getChanges().equals(dstAction.getChanges()))
addLocator(dstAction.getLocator().append(Tags.VALUE_CHANGES));
if (srcAction.hasPolicyDefs() && dstAction.hasPolicyDefs())
deepEquals(srcAction.getPolicyDefs(), dstAction.getPolicyDefs());
else if (srcAction.hasPolicyDefs() != dstAction.hasPolicyDefs())
this.mismatchedLocators.add(dstAction.getPolicyDefs().getLocator());
addLocator(dstAction.getPolicyDefs().getLocator());
}
protected void deepEquals(GroupedParameterizedElement srcElement, GroupedParameterizedElement dstElement) {
private void deepEquals(GroupedParameterizedElement srcElement, GroupedParameterizedElement dstElement) {
Set<String> srcBagKeySet = srcElement.getParameterBagKeySet();
for (String bagKey : srcBagKeySet) {
ParameterBag srcBag = srcElement.getParameterBag(bagKey);
if (!dstElement.hasParameterBag(bagKey)) {
this.mismatchedLocators.add(srcBag.getLocator());
addLocator(srcBag.getLocator());
continue;
}
@ -242,19 +274,19 @@ public class StrolchElementDeepEqualsVisitor {
for (String bagKey : dstBagKeySet) {
if (!srcElement.hasParameterBag(bagKey)) {
ParameterBag dstBag = dstElement.getParameterBag(bagKey);
this.mismatchedLocators.add(dstBag.getLocator());
addLocator(dstBag.getLocator());
}
}
}
protected void deepEquals(ParameterBag srcBag, ParameterBag dstBag) {
private void deepEquals(ParameterBag srcBag, ParameterBag dstBag) {
deepEquals((StrolchElement) srcBag, (StrolchElement) dstBag);
Set<String> srcParamKeySet = srcBag.getParameterKeySet();
for (String paramKey : srcParamKeySet) {
Parameter<?> srcParam = srcBag.getParameter(paramKey);
if (!dstBag.hasParameter(paramKey)) {
this.mismatchedLocators.add(srcParam.getLocator());
addLocator(srcParam.getLocator());
continue;
}
@ -266,39 +298,37 @@ public class StrolchElementDeepEqualsVisitor {
for (String paramKey : dstParamKeySet) {
if (!srcBag.hasParameter(paramKey)) {
Parameter<?> dstParam = dstBag.getParameter(paramKey);
this.mismatchedLocators.add(dstParam.getLocator());
addLocator(dstParam.getLocator());
}
}
}
protected void deepEquals(Parameter<?> srcParam, Parameter<?> dstParam) {
private void deepEquals(Parameter<?> srcParam, Parameter<?> dstParam) {
deepEquals((StrolchElement) srcParam, (StrolchElement) dstParam);
if (!srcParam.getUom().equals(dstParam.getUom())) {
this.mismatchedLocators.add(dstParam.getLocator());
}
if (!srcParam.getInterpretation().equals(dstParam.getInterpretation())) {
this.mismatchedLocators.add(dstParam.getLocator());
}
if (srcParam.isHidden() != dstParam.isHidden()) {
this.mismatchedLocators.add(dstParam.getLocator());
}
if (srcParam.getIndex() != dstParam.getIndex()) {
this.mismatchedLocators.add(dstParam.getLocator());
}
if (!srcParam.getUom().equals(dstParam.getUom()))
addLocator(dstParam.getLocator());
if (!srcParam.getInterpretation().equals(dstParam.getInterpretation()))
addLocator(dstParam.getLocator());
if (srcParam.isHidden() != dstParam.isHidden())
addLocator(dstParam.getLocator());
if (srcParam.getIndex() != dstParam.getIndex())
addLocator(dstParam.getLocator());
if (!srcParam.getValue().equals(dstParam.getValue())) {
this.mismatchedLocators.add(dstParam.getLocator());
}
if (!srcParam.getValue().equals(dstParam.getValue()))
addLocator(dstParam.getLocator());
}
protected void deepEquals(StrolchTimedState<?> srcState, StrolchTimedState<?> dstState) {
private void deepEquals(StrolchTimedState<?> srcState, StrolchTimedState<?> dstState) {
deepEquals((StrolchElement) srcState, (StrolchElement) dstState);
final ITimeVariable<?> srcTimeEvolution = srcState.getTimeEvolution();
final ITimeVariable<?> dstTimeEvolution = dstState.getTimeEvolution();
if (!srcTimeEvolution.getValues().equals(dstTimeEvolution.getValues())) {
this.mismatchedLocators.add(dstState.getLocator().append(Tags.VALUES));
}
if (!srcTimeEvolution.getValues().equals(dstTimeEvolution.getValues()))
addLocator(dstState.getLocator().append(Tags.VALUES));
}
private void addLocator(Locator locator) {
this.mismatchedLocators.add(locator);
}
public static boolean isEqual(Order srcOrder, Order dstOrder) {
@ -312,4 +342,10 @@ public class StrolchElementDeepEqualsVisitor {
visitor.visit(dstRes);
return visitor.isEqual();
}
public static boolean isEqual(Activity srcAct, Activity dstAct) {
ActivityDeepEqualsVisitor visitor = new ActivityDeepEqualsVisitor(srcAct);
visitor.visit(dstAct);
return visitor.isEqual();
}
}

View File

@ -20,9 +20,9 @@ import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import li.strolch.model.ActivityVisitor;
import li.strolch.model.activity.Action;
import li.strolch.model.activity.Activity;
import li.strolch.model.visitor.ActivityVisitor;
import li.strolch.utils.helper.DomUtil;
/**

View File

@ -17,8 +17,8 @@ package li.strolch.model.xml;
import java.text.MessageFormat;
import li.strolch.model.ActivityVisitor;
import li.strolch.model.activity.Activity;
import li.strolch.model.visitor.ActivityVisitor;
import org.xml.sax.ContentHandler;

View File

@ -21,8 +21,8 @@ import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import li.strolch.exception.StrolchException;
import li.strolch.model.ActivityVisitor;
import li.strolch.model.activity.Activity;
import li.strolch.model.visitor.ActivityVisitor;
/**
* @author Robert von Burg <eitch@eitchnet.ch>

View File

@ -18,7 +18,7 @@ package li.strolch.model.xml;
import javax.xml.parsers.DocumentBuilder;
import li.strolch.model.Order;
import li.strolch.model.OrderVisitor;
import li.strolch.model.visitor.OrderVisitor;
import li.strolch.utils.helper.DomUtil;
import org.w3c.dom.Document;

View File

@ -18,7 +18,7 @@ package li.strolch.model.xml;
import java.text.MessageFormat;
import li.strolch.model.Order;
import li.strolch.model.OrderVisitor;
import li.strolch.model.visitor.OrderVisitor;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;

View File

@ -22,7 +22,7 @@ import javax.xml.stream.XMLStreamWriter;
import li.strolch.exception.StrolchException;
import li.strolch.model.Order;
import li.strolch.model.OrderVisitor;
import li.strolch.model.visitor.OrderVisitor;
/**
* @author Robert von Burg <eitch@eitchnet.ch>

View File

@ -23,8 +23,8 @@ import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamWriter;
import li.strolch.model.Order;
import li.strolch.model.OrderVisitor;
import li.strolch.model.StrolchModelConstants;
import li.strolch.model.visitor.OrderVisitor;
import li.strolch.utils.dbc.DBC;
/**

View File

@ -18,7 +18,7 @@ package li.strolch.model.xml;
import javax.xml.parsers.DocumentBuilder;
import li.strolch.model.Resource;
import li.strolch.model.ResourceVisitor;
import li.strolch.model.visitor.ResourceVisitor;
import li.strolch.utils.helper.DomUtil;
import org.w3c.dom.Document;

View File

@ -18,7 +18,7 @@ package li.strolch.model.xml;
import java.text.MessageFormat;
import li.strolch.model.Resource;
import li.strolch.model.ResourceVisitor;
import li.strolch.model.visitor.ResourceVisitor;
import org.xml.sax.ContentHandler;

View File

@ -22,7 +22,7 @@ import javax.xml.stream.XMLStreamWriter;
import li.strolch.exception.StrolchException;
import li.strolch.model.Resource;
import li.strolch.model.ResourceVisitor;
import li.strolch.model.visitor.ResourceVisitor;
/**
* @author Robert von Burg <eitch@eitchnet.ch>

View File

@ -22,8 +22,8 @@ import javax.xml.stream.XMLStreamWriter;
import javanet.staxutils.IndentingXMLStreamWriter;
import li.strolch.model.Resource;
import li.strolch.model.ResourceVisitor;
import li.strolch.model.StrolchModelConstants;
import li.strolch.model.visitor.ResourceVisitor;
import li.strolch.utils.dbc.DBC;
/**

View File

@ -30,8 +30,10 @@ import li.strolch.model.ParameterBag;
import li.strolch.model.ParameterizedElement;
import li.strolch.model.Resource;
import li.strolch.model.State;
import li.strolch.model.StrolchRootElement;
import li.strolch.model.StrolchValueType;
import li.strolch.model.Tags;
import li.strolch.model.Version;
import li.strolch.model.activity.Action;
import li.strolch.model.activity.Activity;
import li.strolch.model.parameter.Parameter;
@ -50,11 +52,7 @@ import li.strolch.utils.iso8601.ISO8601FormatFactory;
public class StrolchElementFromDomVisitor {
public void fillElement(Element element, Order order) {
fillElement(element, (GroupedParameterizedElement) order);
PolicyDefs defs = parsePolicies(element);
if (defs.hasPolicyDefs())
order.setPolicyDefs(defs);
fillElement(element, (StrolchRootElement) order);
String date = element.getAttribute(Tags.DATE);
String state = element.getAttribute(Tags.STATE);
@ -73,11 +71,7 @@ public class StrolchElementFromDomVisitor {
}
public void fillElement(Element resourceElement, Resource resource) {
fillElement(resourceElement, (GroupedParameterizedElement) resource);
PolicyDefs defs = parsePolicies(resourceElement);
if (defs.hasPolicyDefs())
resource.setPolicyDefs(defs);
fillElement(resourceElement, (StrolchRootElement) resource);
NodeList childNodes = resourceElement.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
@ -147,6 +141,38 @@ public class StrolchElementFromDomVisitor {
}
}
public void fillElement(Element activityElement, Activity activity) {
fillElement(activityElement, (StrolchRootElement) activity);
NodeList childNodes = activityElement.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
Node item = childNodes.item(i);
if (!(item instanceof Element))
continue;
Element childElem = (Element) item;
switch (childElem.getNodeName()) {
case Tags.ACTIVITY:
Activity childActivity = new Activity();
fillElement(childElem, childActivity);
activity.addElement(childActivity);
break;
case Tags.ACTION:
Action childAction = new Action();
fillElement(childElem, childAction);
activity.addElement(childAction);
break;
case Tags.PARAMETER_BAG:
case Tags.POLICIES:
case Tags.VERSION:
break;
default:
throw new IllegalArgumentException("Unexpected element tag " + childElem.getNodeName());
}
}
}
protected void fillElement(Element element, AbstractStrolchElement strolchElement) {
String id = element.getAttribute(Tags.ID);
String name = element.getAttribute(Tags.NAME);
@ -183,6 +209,16 @@ public class StrolchElementFromDomVisitor {
}
}
protected void fillElement(Element element, StrolchRootElement strolchRootElement) {
fillElement(element, (GroupedParameterizedElement) strolchRootElement);
parseVersion(strolchRootElement, element);
PolicyDefs defs = parsePolicies(element);
if (defs.hasPolicyDefs())
strolchRootElement.setPolicyDefs(defs);
}
protected void fillElement(Element element, ParameterizedElement parameterizedElement) {
fillElement(element, (AbstractStrolchElement) parameterizedElement);
@ -245,41 +281,6 @@ public class StrolchElementFromDomVisitor {
}
}
public void fillElement(Element activityElement, Activity activity) {
fillElement(activityElement, (GroupedParameterizedElement) activity);
PolicyDefs defs = parsePolicies(activityElement);
if (defs.hasPolicyDefs())
activity.setPolicyDefs(defs);
NodeList childNodes = activityElement.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
Node item = childNodes.item(i);
if (!(item instanceof Element))
continue;
Element childElem = (Element) item;
switch (childElem.getNodeName()) {
case Tags.ACTIVITY:
Activity childActivity = new Activity();
fillElement(childElem, childActivity);
activity.addElement(childActivity);
break;
case Tags.ACTION:
Action childAction = new Action();
fillElement(childElem, childAction);
activity.addElement(childAction);
break;
case Tags.PARAMETER_BAG:
case Tags.POLICIES:
break;
default:
throw new IllegalArgumentException("Unexpected element tag " + childElem.getNodeName());
}
}
}
protected void fillElement(Element element, Action action) {
fillElement(element, (GroupedParameterizedElement) action);
@ -353,4 +354,27 @@ public class StrolchElementFromDomVisitor {
return policyDefs;
}
protected void parseVersion(StrolchRootElement rootElement, Element element) {
NodeList childNodes = element.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
Node resourceChildItem = childNodes.item(i);
if (!(resourceChildItem instanceof Element))
continue;
Element versionElem = (Element) resourceChildItem;
if (!versionElem.getNodeName().equals(Tags.VERSION))
continue;
int v = Integer.parseInt(versionElem.getAttribute(Tags.VERSION));
String createdBy = versionElem.getAttribute(Tags.CREATED_BY);
String createdAtS = versionElem.getAttribute(Tags.CREATED_AT);
Date createdAt = ISO8601FormatFactory.getInstance().parseDate(createdAtS);
boolean deleted = StringHelper.parseBoolean(versionElem.getAttribute(Tags.DELETED));
Version version = new Version(rootElement.getLocator(), v, createdBy, createdAt, deleted);
rootElement.setVersion(version);
}
}
}

View File

@ -29,7 +29,9 @@ import li.strolch.model.ParameterBag;
import li.strolch.model.ParameterizedElement;
import li.strolch.model.Resource;
import li.strolch.model.StrolchModelConstants;
import li.strolch.model.StrolchRootElement;
import li.strolch.model.Tags;
import li.strolch.model.Version;
import li.strolch.model.activity.Action;
import li.strolch.model.activity.Activity;
import li.strolch.model.activity.IActivityElement;
@ -59,10 +61,7 @@ public class StrolchElementToDomVisitor {
asDom.setAttribute(Tags.DATE, ISO8601FormatFactory.getInstance().formatDate(order.getDate()));
asDom.setAttribute(Tags.STATE, order.getState().name());
fillElement(asDom, order);
if (order.hasPolicyDefs())
fillElement(asDom, order.getPolicyDefs());
fillElement(asDom, (StrolchRootElement) order);
return asDom;
}
@ -70,7 +69,7 @@ public class StrolchElementToDomVisitor {
protected Element toDom(Resource resource) {
Element asDom = document.createElement(Tags.RESOURCE);
fillElement(asDom, resource);
fillElement(asDom, (StrolchRootElement) resource);
if (resource.hasTimedStates()) {
for (String stateKey : resource.getTimedStateKeySet()) {
@ -80,18 +79,12 @@ public class StrolchElementToDomVisitor {
}
}
if (resource.hasPolicyDefs())
fillElement(asDom, resource.getPolicyDefs());
return asDom;
}
protected Element toDom(Activity activity) {
Element element = document.createElement(Tags.ACTIVITY);
fillElement(element, activity);
if (activity.hasPolicyDefs())
fillElement(element, activity.getPolicyDefs());
fillElement(element, (StrolchRootElement) activity);
if (activity.hasElements()) {
Iterator<Entry<String, IActivityElement>> iter = activity.elementIterator();
@ -204,18 +197,37 @@ public class StrolchElementToDomVisitor {
return element;
}
protected Element toDom(Version version) {
Element element = document.createElement(Tags.VERSION);
element.setAttribute(Tags.VERSION, Integer.toString(version.getVersion()));
element.setAttribute(Tags.CREATED_BY, version.getCreatedBy());
element.setAttribute(Tags.CREATED_AT, ISO8601FormatFactory.getInstance().formatDate(version.getCreatedAt()));
element.setAttribute(Tags.DELETED, Boolean.toString(version.isDeleted()));
return element;
}
protected void fillElement(Element element, AbstractStrolchElement strolchElement) {
element.setAttribute(Tags.ID, strolchElement.getId());
element.setAttribute(Tags.NAME, strolchElement.getName());
element.setAttribute(Tags.TYPE, strolchElement.getType());
}
protected void fillElement(Element element, GroupedParameterizedElement groupedParameterizedElement) {
fillElement(element, (AbstractStrolchElement) groupedParameterizedElement);
protected void fillElement(Element element, StrolchRootElement rootElement) {
fillElement(element, (GroupedParameterizedElement) rootElement);
if (groupedParameterizedElement.hasParameterBags()) {
for (String bagKey : groupedParameterizedElement.getParameterBagKeySet()) {
ParameterBag bag = groupedParameterizedElement.getParameterBag(bagKey);
if (rootElement.hasVersion())
element.appendChild(toDom(rootElement.getVersion()));
if (rootElement.hasPolicyDefs())
fillElement(element, rootElement.getPolicyDefs());
}
protected void fillElement(Element element, GroupedParameterizedElement rootElement) {
fillElement(element, (AbstractStrolchElement) rootElement);
if (rootElement.hasParameterBags()) {
for (String bagKey : rootElement.getParameterBagKeySet()) {
ParameterBag bag = rootElement.getParameterBag(bagKey);
Element bagElement = toDom(bag);
element.appendChild(bagElement);
}

View File

@ -33,7 +33,9 @@ import li.strolch.model.Order;
import li.strolch.model.ParameterBag;
import li.strolch.model.Resource;
import li.strolch.model.StrolchElement;
import li.strolch.model.StrolchRootElement;
import li.strolch.model.Tags;
import li.strolch.model.Version;
import li.strolch.model.activity.Action;
import li.strolch.model.activity.Activity;
import li.strolch.model.activity.IActivityElement;
@ -57,82 +59,10 @@ public abstract class StrolchElementToSaxVisitor {
this.contentHandler = contentHandler;
}
protected AttributesImpl attributesFor(StrolchElement element) {
AttributesImpl attributes = new AttributesImpl();
attributes.addAttribute(null, null, Tags.ID, Tags.CDATA, element.getId());
attributes.addAttribute(null, null, Tags.NAME, Tags.CDATA, element.getName());
attributes.addAttribute(null, null, Tags.TYPE, Tags.CDATA, element.getType());
return attributes;
}
protected AttributesImpl attributesFor(Parameter<?> parameter) {
AttributesImpl attributes = attributesFor((StrolchElement) parameter);
attributes.addAttribute(null, null, Tags.VALUE, Tags.CDATA, parameter.getValueAsString());
if (!UOM_NONE.equals(parameter.getUom())) {
attributes.addAttribute(null, null, Tags.UOM, Tags.CDATA, parameter.getUom());
}
if (!INTERPRETATION_NONE.equals(parameter.getInterpretation())) {
attributes.addAttribute(null, null, Tags.INTERPRETATION, Tags.CDATA, parameter.getInterpretation());
}
if (parameter.isHidden()) {
attributes.addAttribute(null, null, Tags.HIDDEN, Tags.CDATA, Boolean.toString(parameter.isHidden()));
}
if (parameter.getIndex() != 0) {
attributes.addAttribute(null, null, Tags.INDEX, Tags.CDATA, Integer.toString(parameter.getIndex()));
}
return attributes;
}
protected Attributes attributesFor(StrolchTimedState<IValue<?>> state) {
AttributesImpl attributes = attributesFor((StrolchElement) state);
if (!UOM_NONE.equals(state.getUom())) {
attributes.addAttribute(null, null, Tags.UOM, Tags.CDATA, state.getUom());
}
if (!INTERPRETATION_NONE.equals(state.getInterpretation())) {
attributes.addAttribute(null, null, Tags.INTERPRETATION, Tags.CDATA, state.getInterpretation());
}
if (state.isHidden()) {
attributes.addAttribute(null, null, Tags.HIDDEN, Tags.CDATA, Boolean.toString(state.isHidden()));
}
if (state.getIndex() != 0) {
attributes.addAttribute(null, null, Tags.INDEX, Tags.CDATA, Integer.toString(state.getIndex()));
}
return attributes;
}
protected Attributes attributesFor(ITimeValue<IValue<?>> value) {
AttributesImpl attributes = new AttributesImpl();
ISO8601FormatFactory df = ISO8601FormatFactory.getInstance();
attributes.addAttribute(null, null, Tags.TIME, Tags.CDATA, df.formatDate(value.getTime()));
attributes.addAttribute(null, null, Tags.VALUE, Tags.CDATA, value.getValue().getValueAsString());
return attributes;
}
protected void toSax(GroupedParameterizedElement parameterizedElement) throws SAXException {
Set<String> bagKeySet = parameterizedElement.getParameterBagKeySet();
for (String bagKey : bagKeySet) {
ParameterBag parameterBag = parameterizedElement.getParameterBag(bagKey);
this.contentHandler.startElement(null, null, Tags.PARAMETER_BAG, attributesFor(parameterBag));
Set<String> parameterKeySet = parameterBag.getParameterKeySet();
for (String paramKey : parameterKeySet) {
Parameter<?> parameter = parameterBag.getParameter(paramKey);
this.contentHandler.startElement(null, null, Tags.PARAMETER, attributesFor(parameter));
this.contentHandler.endElement(null, null, Tags.PARAMETER);
}
this.contentHandler.endElement(null, null, Tags.PARAMETER_BAG);
}
}
protected void toSax(Resource resource) throws SAXException {
this.contentHandler.startElement(null, null, Tags.RESOURCE, attributesFor(resource));
toSax((GroupedParameterizedElement) resource);
toSax((StrolchRootElement) resource);
Set<String> stateKeySet = resource.getTimedStateKeySet();
for (String stateKey : stateKeySet) {
@ -147,37 +77,21 @@ 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);
}
protected AttributesImpl attributesFor(Order order) {
AttributesImpl attributes = attributesFor((StrolchElement) order);
attributes.addAttribute(null, null, Tags.STATE, Tags.CDATA, order.getState().name());
attributes.addAttribute(null, null, Tags.DATE, Tags.CDATA,
ISO8601FormatFactory.getInstance().formatDate(order.getDate()));
return attributes;
}
protected void toSax(Order order) throws SAXException {
this.contentHandler.startElement(null, null, Tags.ORDER, attributesFor(order));
toSax((GroupedParameterizedElement) order);
if (order.hasPolicyDefs())
toSax(order.getPolicyDefs());
toSax((StrolchRootElement) order);
this.contentHandler.endElement(null, null, Tags.ORDER);
}
protected void toSax(Activity activity) throws SAXException {
this.contentHandler.startElement(null, null, Tags.ACTIVITY, attributesFor(activity));
toSax((GroupedParameterizedElement) activity);
if (activity.hasPolicyDefs())
toSax(activity.getPolicyDefs());
toSax((StrolchRootElement) activity);
Iterator<Entry<String, IActivityElement>> iter = activity.elementIterator();
while (iter.hasNext()) {
@ -197,6 +111,7 @@ public abstract class StrolchElementToSaxVisitor {
protected void toSax(Action action) throws SAXException {
this.contentHandler.startElement(null, null, Tags.ACTION, attributesFor(action));
toSax((GroupedParameterizedElement) action);
if (action.hasPolicyDefs())
@ -225,6 +140,113 @@ public abstract class StrolchElementToSaxVisitor {
this.contentHandler.endElement(null, null, Tags.POLICIES);
}
protected void toSax(StrolchRootElement rootElement) throws SAXException {
if (rootElement.hasPolicyDefs())
toSax(rootElement.getPolicyDefs());
if (rootElement.hasVersion())
toSax(rootElement.getVersion());
toSax((GroupedParameterizedElement) rootElement);
}
private void toSax(Version version) throws SAXException {
this.contentHandler.startElement(null, null, Tags.VERSION, attributesFor(version));
this.contentHandler.endElement(null, null, Tags.VERSION);
}
protected void toSax(GroupedParameterizedElement parameterizedElement) throws SAXException {
Set<String> bagKeySet = parameterizedElement.getParameterBagKeySet();
for (String bagKey : bagKeySet) {
ParameterBag parameterBag = parameterizedElement.getParameterBag(bagKey);
this.contentHandler.startElement(null, null, Tags.PARAMETER_BAG, attributesFor(parameterBag));
Set<String> parameterKeySet = parameterBag.getParameterKeySet();
for (String paramKey : parameterKeySet) {
Parameter<?> parameter = parameterBag.getParameter(paramKey);
this.contentHandler.startElement(null, null, Tags.PARAMETER, attributesFor(parameter));
this.contentHandler.endElement(null, null, Tags.PARAMETER);
}
this.contentHandler.endElement(null, null, Tags.PARAMETER_BAG);
}
}
protected Attributes attributesFor(StrolchTimedState<IValue<?>> state) {
AttributesImpl attributes = attributesFor((StrolchElement) state);
if (!UOM_NONE.equals(state.getUom())) {
attributes.addAttribute(null, null, Tags.UOM, Tags.CDATA, state.getUom());
}
if (!INTERPRETATION_NONE.equals(state.getInterpretation())) {
attributes.addAttribute(null, null, Tags.INTERPRETATION, Tags.CDATA, state.getInterpretation());
}
if (state.isHidden()) {
attributes.addAttribute(null, null, Tags.HIDDEN, Tags.CDATA, Boolean.toString(state.isHidden()));
}
if (state.getIndex() != 0) {
attributes.addAttribute(null, null, Tags.INDEX, Tags.CDATA, Integer.toString(state.getIndex()));
}
return attributes;
}
protected AttributesImpl attributesFor(StrolchElement element) {
AttributesImpl attributes = new AttributesImpl();
attributes.addAttribute(null, null, Tags.ID, Tags.CDATA, element.getId());
attributes.addAttribute(null, null, Tags.NAME, Tags.CDATA, element.getName());
attributes.addAttribute(null, null, Tags.TYPE, Tags.CDATA, element.getType());
return attributes;
}
protected AttributesImpl attributesFor(Order order) {
AttributesImpl attributes = attributesFor((StrolchElement) order);
attributes.addAttribute(null, null, Tags.STATE, Tags.CDATA, order.getState().name());
attributes.addAttribute(null, null, Tags.DATE, Tags.CDATA,
ISO8601FormatFactory.getInstance().formatDate(order.getDate()));
return attributes;
}
private Attributes attributesFor(Version version) {
AttributesImpl attributes = new AttributesImpl();
attributes.addAttribute(null, null, Tags.VERSION, Tags.CDATA, Integer.toString(version.getVersion()));
attributes.addAttribute(null, null, Tags.CREATED_BY, Tags.CDATA, version.getCreatedBy());
attributes.addAttribute(null, null, Tags.CREATED_AT, Tags.CDATA,
ISO8601FormatFactory.getInstance().formatDate(version.getCreatedAt()));
attributes.addAttribute(null, null, Tags.DELETED, Tags.CDATA, Boolean.toString(version.isDeleted()));
return attributes;
}
protected AttributesImpl attributesFor(Parameter<?> parameter) {
AttributesImpl attributes = attributesFor((StrolchElement) parameter);
attributes.addAttribute(null, null, Tags.VALUE, Tags.CDATA, parameter.getValueAsString());
if (!UOM_NONE.equals(parameter.getUom())) {
attributes.addAttribute(null, null, Tags.UOM, Tags.CDATA, parameter.getUom());
}
if (!INTERPRETATION_NONE.equals(parameter.getInterpretation())) {
attributes.addAttribute(null, null, Tags.INTERPRETATION, Tags.CDATA, parameter.getInterpretation());
}
if (parameter.isHidden()) {
attributes.addAttribute(null, null, Tags.HIDDEN, Tags.CDATA, Boolean.toString(parameter.isHidden()));
}
if (parameter.getIndex() != 0) {
attributes.addAttribute(null, null, Tags.INDEX, Tags.CDATA, Integer.toString(parameter.getIndex()));
}
return attributes;
}
protected Attributes attributesFor(ITimeValue<IValue<?>> value) {
AttributesImpl attributes = new AttributesImpl();
ISO8601FormatFactory df = ISO8601FormatFactory.getInstance();
attributes.addAttribute(null, null, Tags.TIME, Tags.CDATA, df.formatDate(value.getTime()));
attributes.addAttribute(null, null, Tags.VALUE, Tags.CDATA, value.getValue().getValueAsString());
return attributes;
}
protected AttributesImpl attributesFor(PolicyDef policyDef) {
AttributesImpl attributes = new AttributesImpl();
attributes.addAttribute(null, null, Tags.TYPE, Tags.CDATA, policyDef.getType());

View File

@ -36,7 +36,9 @@ import li.strolch.model.ParameterBag;
import li.strolch.model.ParameterizedElement;
import li.strolch.model.Resource;
import li.strolch.model.StrolchElement;
import li.strolch.model.StrolchRootElement;
import li.strolch.model.Tags;
import li.strolch.model.Version;
import li.strolch.model.activity.Action;
import li.strolch.model.activity.Activity;
import li.strolch.model.activity.IActivityElement;
@ -66,6 +68,9 @@ public abstract class StrolchElementToSaxWriterVisitor {
writeStartStrolchElement(Tags.RESOURCE, empty, resource);
if (resource.hasVersion())
writeVersion(resource);
if (resource.hasParameterBags())
writeParameterBags(resource);
@ -86,9 +91,11 @@ public abstract class StrolchElementToSaxWriterVisitor {
this.writer.writeAttribute(Tags.DATE, ISO8601FormatFactory.getInstance().formatDate(order.getDate()));
this.writer.writeAttribute(Tags.STATE, order.getState().name());
if (order.hasParameterBags()) {
if (order.hasVersion())
writeVersion(order);
if (order.hasParameterBags())
writeParameterBags(order);
}
if (order.hasPolicyDefs())
writePolicyDefs(order.getPolicyDefs());
@ -98,13 +105,16 @@ public abstract class StrolchElementToSaxWriterVisitor {
}
protected void writeElement(Activity activity) throws XMLStreamException {
boolean empty = !activity.hasParameterBags() && !activity.hasElements() && !activity.hasPolicyDefs();
boolean empty = activity.hasVersion() && !activity.hasParameterBags() && !activity.hasElements()
&& !activity.hasPolicyDefs();
writeStartStrolchElement(Tags.ACTIVITY, empty, activity);
if (activity.hasParameterBags()) {
if (activity.hasVersion())
writeVersion(activity);
if (activity.hasParameterBags())
writeParameterBags(activity);
}
if (activity.hasElements()) {
Iterator<Entry<String, IActivityElement>> iter = activity.elementIterator();
@ -126,6 +136,16 @@ public abstract class StrolchElementToSaxWriterVisitor {
this.writer.writeEndElement();
}
private void writeVersion(StrolchRootElement rootElement) throws XMLStreamException {
this.writer.writeEmptyElement(Tags.VERSION);
Version version = rootElement.getVersion();
this.writer.writeAttribute(Tags.VERSION, Integer.toString(version.getVersion()));
this.writer.writeAttribute(Tags.CREATED_BY, version.getCreatedBy());
this.writer.writeAttribute(Tags.CREATED_AT,
ISO8601FormatFactory.getInstance().formatDate(version.getCreatedAt()));
this.writer.writeAttribute(Tags.DELETED, Boolean.toString(version.isDeleted()));
}
protected <T> void writeElement(Action action) throws XMLStreamException {
boolean empty = !action.hasParameterBags() && !action.hasChanges() && !action.hasPolicyDefs();
@ -134,9 +154,8 @@ public abstract class StrolchElementToSaxWriterVisitor {
this.writer.writeAttribute(Tags.RESOURCE_ID, action.getResourceId());
this.writer.writeAttribute(Tags.RESOURCE_TYPE, action.getResourceType());
if (action.hasParameterBags()) {
if (action.hasParameterBags())
writeParameterBags(action);
}
if (action.hasChanges()) {
for (IValueChange<? extends IValue<?>> change : action.getChanges()) {
@ -144,7 +163,7 @@ public abstract class StrolchElementToSaxWriterVisitor {
this.writer.writeAttribute(Tags.STATE_ID, change.getStateId());
this.writer.writeAttribute(Tags.TIME, ISO8601FormatFactory.getInstance().formatDate(change.getTime()));
this.writer.writeAttribute(Tags.VALUE, change.getValue().getValueAsString());
this.writer.writeAttribute(Tags.TYPE, change.getValue().getClass().getName());
this.writer.writeAttribute(Tags.TYPE, change.getValue().getType());
}
}
@ -193,11 +212,10 @@ public abstract class StrolchElementToSaxWriterVisitor {
protected void writeStartStrolchElement(String tag, boolean empty, StrolchElement element)
throws XMLStreamException {
if (empty) {
if (empty)
this.writer.writeEmptyElement(tag);
} else {
else
this.writer.writeStartElement(tag);
}
this.writer.writeAttribute(Tags.ID, element.getId());
this.writer.writeAttribute(Tags.NAME, element.getName());
@ -224,18 +242,14 @@ public abstract class StrolchElementToSaxWriterVisitor {
for (Parameter<?> parameter : parameters) {
writeStartStrolchElement(Tags.PARAMETER, true, parameter);
if (!INTERPRETATION_NONE.equals(parameter.getInterpretation())) {
if (!INTERPRETATION_NONE.equals(parameter.getInterpretation()))
this.writer.writeAttribute(Tags.INTERPRETATION, parameter.getInterpretation());
}
if (!UOM_NONE.equals(parameter.getUom())) {
if (!UOM_NONE.equals(parameter.getUom()))
this.writer.writeAttribute(Tags.UOM, parameter.getUom());
}
if (parameter.isHidden()) {
if (parameter.isHidden())
this.writer.writeAttribute(Tags.HIDDEN, Boolean.toString(parameter.isHidden()));
}
if (parameter.getIndex() != 0) {
if (parameter.getIndex() != 0)
this.writer.writeAttribute(Tags.INDEX, Integer.toString(parameter.getIndex()));
}
this.writer.writeAttribute(Tags.VALUE, parameter.getValueAsString());
}

View File

@ -34,8 +34,10 @@ import li.strolch.model.Order;
import li.strolch.model.ParameterBag;
import li.strolch.model.Resource;
import li.strolch.model.State;
import li.strolch.model.StrolchRootElement;
import li.strolch.model.StrolchValueType;
import li.strolch.model.Tags;
import li.strolch.model.Version;
import li.strolch.model.activity.Action;
import li.strolch.model.activity.Activity;
import li.strolch.model.parameter.Parameter;
@ -92,6 +94,7 @@ public class XmlModelSaxReader extends DefaultHandler {
String resName = attributes.getValue(Tags.NAME);
String resType = attributes.getValue(Tags.TYPE);
Resource resource = new Resource(resId, resName, resType);
this.parameterizedElement = resource;
break;
@ -102,7 +105,9 @@ public class XmlModelSaxReader extends DefaultHandler {
String activityName = attributes.getValue(Tags.NAME);
String activityType = attributes.getValue(Tags.TYPE);
Activity activity = new Activity(activityId, activityName, activityType);
this.parameterizedElement = activity;
this.activityStack.push(activity);
break;
@ -153,6 +158,7 @@ public class XmlModelSaxReader extends DefaultHandler {
}
if (StringHelper.isNotEmpty(orderStateS))
order.setState(State.valueOf(orderStateS));
this.parameterizedElement = order;
break;
@ -242,6 +248,27 @@ public class XmlModelSaxReader extends DefaultHandler {
break;
case Tags.VERSION:
try {
String versionS = attributes.getValue(Tags.VERSION);
int v = Integer.parseInt(versionS);
String createdBy = attributes.getValue(Tags.CREATED_BY);
String createdAtS = attributes.getValue(Tags.CREATED_AT);
Date createdAt = ISO8601FormatFactory.getInstance().parseDate(createdAtS);
String deletedS = attributes.getValue(Tags.DELETED);
boolean deleted = StringHelper.parseBoolean(deletedS);
Version version = new Version(this.parameterizedElement.getLocator(), v, createdBy, createdAt, deleted);
((StrolchRootElement) this.parameterizedElement).setVersion(version);
} catch (Exception e) {
throw new StrolchException(
"Failed to Version for for bag " + this.parameterizedElement + " due to " + e.getMessage(), e);
}
break;
default:
throw new IllegalArgumentException(MessageFormat.format("The element ''{0}'' is unhandled!", qName)); //$NON-NLS-1$
}
@ -264,10 +291,11 @@ public class XmlModelSaxReader extends DefaultHandler {
if (this.activityStack.isEmpty()) {
this.listener.notifyActivity(activity);
this.statistics.nrOfActivities++;
this.parameterizedElement = null;
} else {
this.activityStack.peek().addElement(activity);
this.parameterizedElement = this.activityStack.peek();
}
this.parameterizedElement = null;
break;
@ -282,7 +310,7 @@ public class XmlModelSaxReader extends DefaultHandler {
case Tags.ACTION:
this.activityStack.peek().addElement((Action) parameterizedElement);
this.parameterizedElement = null;
this.parameterizedElement = this.activityStack.peek();
break;
@ -310,13 +338,13 @@ public class XmlModelSaxReader extends DefaultHandler {
} else if (this.parameterizedElement instanceof Action) {
((Action) this.parameterizedElement).setPolicyDefs(this.policies);
} else {
throw new StrolchPolicyException(
"Policies are currently not allowed on " + this.parameterizedElement.getClass());
throw new StrolchPolicyException("Policies are not allowed on " + this.parameterizedElement.getClass());
}
this.policies = null;
case Tags.POLICY:
case Tags.VERSION:
case Tags.PARAMETER:
case Tags.INCLUDE_FILE:
case Tags.VALUE:

View File

@ -0,0 +1,59 @@
package li.strolch.model;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import li.strolch.model.activity.Activity;
public abstract class ModelMarshallingTest {
@Test
public void shouldFormatAndParseOrder() throws Exception {
Order order = ModelGenerator.createOrder("@1", "My Order 1", "MyOrder");
formatAndParseOrder(order);
}
@Test
public void shouldFormatAndParseVersionedOrder() throws Exception {
Order order = ModelGenerator.createOrder("@1", "My Order 1", "MyOrder");
Version.setInitialVersionFor(order, "test");
Order parsed = formatAndParseOrder(order);
assertEquals(order.getVersion(), parsed.getVersion());
}
@Test
public void shouldFormatAndParseResource() throws Exception {
Resource resource = ModelGenerator.createResource("@1", "My Resource 1", "MyResource");
formatAndParseResource(resource);
}
@Test
public void shouldFormatAndParseVersionedResource() throws Exception {
Resource resource = ModelGenerator.createResource("@1", "My Resource 1", "MyResource");
Version.setInitialVersionFor(resource, "test");
Resource parsed = formatAndParseResource(resource);
assertEquals(resource.getVersion(), parsed.getVersion());
}
@Test
public void shouldFormatAndParseActivity() throws Exception {
Activity activity = ModelGenerator.createActivity("@1", "My Activity 1", "Transport");
formatAndParseActivity(activity);
}
@Test
public void shouldFormatAndParseVersionedActivity() throws Exception {
Activity activity = ModelGenerator.createActivity("@1", "My Activity 1", "Transport");
Version.setInitialVersionFor(activity, "test");
Activity parsed = formatAndParseActivity(activity);
assertEquals(activity.getVersion(), parsed.getVersion());
}
protected abstract Order formatAndParseOrder(Order order) throws Exception;
protected abstract Resource formatAndParseResource(Resource resource) throws Exception;
protected abstract Activity formatAndParseActivity(Activity activity) throws Exception;
}

View File

@ -157,8 +157,8 @@ public class ModelTest {
ParameterBag bag = activity.getParameterBag(BAG_ID);
validateBag(bag);
Action action = activity.getElement("act_" + actId);
assertEquals("act_" + actId, action.getId());
Action action = activity.getElement("action_" + actId);
assertEquals("action_" + actId, action.getId());
assertEquals("Action " + actName, action.getName());
assertEquals("Use", action.getType());
assertEquals(ACTION_RES_ID, action.getResourceId());
@ -172,8 +172,8 @@ public class ModelTest {
bag = activity.getParameterBag(BAG_ID);
validateBag(bag);
action = activity.getElement("act_" + actId);
assertEquals("act_" + actId, action.getId());
action = activity.getElement("action_" + actId);
assertEquals("action_" + actId, action.getId());
assertEquals("Action " + actName, action.getName());
assertEquals("Use", action.getType());
assertEquals(ACTION_RES_ID, action.getResourceId());
@ -187,8 +187,8 @@ public class ModelTest {
bag = activity.getParameterBag(BAG_ID);
validateBag(bag);
action = activity.getElement("act_" + actId);
assertEquals("act_" + actId, action.getId());
action = activity.getElement("action_" + actId);
assertEquals("action_" + actId, action.getId());
assertEquals("Action " + actName, action.getName());
assertEquals("Use", action.getType());
assertEquals(ACTION_RES_ID, action.getResourceId());
@ -256,7 +256,7 @@ public class ModelTest {
Activity srcActivity = createActivity("@act01", "Test Activity", "MyType");
Activity dstActivity = createActivity("@act01", "Test Activity", "MyType");
Action action = dstActivity.getElement("act_" + "@act01");
Action action = dstActivity.getElement("action_" + "@act01");
action.setResourceId("Bla");
action.setResourceType("Bla");
action.setType("Bla");
@ -266,13 +266,13 @@ public class ModelTest {
Activity activity = dstActivity.getElement("sub_" + "@act01");
activity.addElement(new Action("bla", "Bla", "Bla"));
action = activity.getElement("act_" + "@act01");
action = activity.getElement("action_" + "@act01");
action.addChange(new ValueChange<>(1234567890L, new IntegerValue(12345), STATE_INTEGER_ID));
activity = activity.getElement("subSub_" + "@act01");
activity.addElement(new Action("bla", "Bla", "Bla"));
action = activity.getElement("act_" + "@act01");
action = activity.getElement("action_" + "@act01");
action.addChange(new ValueChange<>(1234567890L, new IntegerValue(12345), STATE_INTEGER_ID));
ActivityDeepEqualsVisitor visitor = new ActivityDeepEqualsVisitor(srcActivity);

View File

@ -17,7 +17,6 @@ package li.strolch.model;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import org.w3c.dom.Document;
import li.strolch.model.activity.Activity;
@ -35,28 +34,9 @@ import li.strolch.model.xml.ResourceToDomVisitor;
* @author Robert von Burg <eitch@eitchnet.ch>
*/
@SuppressWarnings("nls")
public class ModelToDomTest extends ModelTest {
public class ModelToDomTest extends ModelMarshallingTest {
@Test
public void shouldFormatAndParseOrder() {
Order order = ModelGenerator.createOrder("@1", "My Order 1", "MyOrder");
OrderToDomVisitor domVisitor = new OrderToDomVisitor();
domVisitor.visit(order);
Document document = domVisitor.getDocument();
Order parsedOrder = new OrderFromDomVisitor().visit(document);
OrderDeepEqualsVisitor visitor = new OrderDeepEqualsVisitor(order);
visitor.visit(parsedOrder);
assertTrue("To DOM and back should equal same Order:\n" + visitor.getMismatchedLocators(), visitor.isEqual());
}
@Test
public void shouldFormatAndParseResource() {
Resource resource = ModelGenerator.createResource("@1", "My Resource 1", "MyResource");
protected Resource formatAndParseResource(Resource resource) {
ResourceToDomVisitor domVisitor = new ResourceToDomVisitor();
domVisitor.visit(resource);
@ -68,12 +48,25 @@ public class ModelToDomTest extends ModelTest {
visitor.visit(parsedResource);
assertTrue("To DOM and back should equal same Resource:\n" + visitor.getMismatchedLocators(),
visitor.isEqual());
return parsedResource;
}
@Test
public void shouldFormatAndParseActivity() {
protected Order formatAndParseOrder(Order order) {
OrderToDomVisitor domVisitor = new OrderToDomVisitor();
domVisitor.visit(order);
Document document = domVisitor.getDocument();
Activity activity = ModelGenerator.createActivity("@1", "My Activity 1", "Transport");
Order parsedOrder = new OrderFromDomVisitor().visit(document);
OrderDeepEqualsVisitor visitor = new OrderDeepEqualsVisitor(order);
visitor.visit(parsedOrder);
assertTrue("To DOM and back should equal same Order:\n" + visitor.getMismatchedLocators(), visitor.isEqual());
return parsedOrder;
}
protected Activity formatAndParseActivity(Activity activity) {
ActivityToDomVisitor domVisitor = new ActivityToDomVisitor();
domVisitor.visit(activity);
@ -85,5 +78,7 @@ public class ModelToDomTest extends ModelTest {
visitor.visit(parsedActivity);
assertTrue("To DOM and back should equal same Activity:\n" + visitor.getMismatchedLocators(),
visitor.isEqual());
return parsedActivity;
}
}

View File

@ -17,8 +17,6 @@ package li.strolch.model;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import com.google.gson.JsonObject;
import li.strolch.model.activity.Activity;
@ -32,13 +30,10 @@ import li.strolch.model.visitor.ActivityDeepEqualsVisitor;
import li.strolch.model.visitor.OrderDeepEqualsVisitor;
import li.strolch.model.visitor.ResourceDeepEqualsVisitor;
public class ModelToJsonTest {
@Test
public void shouldFormatAndParseOrder() {
Order order = ModelGenerator.createOrder("@1", "My Order 1", "MyOrder");
public class ModelToJsonTest extends ModelMarshallingTest {
@Override
protected Order formatAndParseOrder(Order order) {
OrderToJsonVisitor jsonVisitor = new OrderToJsonVisitor();
jsonVisitor.visit(order);
JsonObject jsonObject = jsonVisitor.getJsonObject();
@ -48,12 +43,12 @@ public class ModelToJsonTest {
OrderDeepEqualsVisitor visitor = new OrderDeepEqualsVisitor(order);
visitor.visit(parsedOrder);
assertTrue("To JSON and back should equal same Order:\n" + visitor.getMismatchedLocators(), visitor.isEqual());
return parsedOrder;
}
@Test
public void shouldFormatAndParseResource() {
Resource resource = ModelGenerator.createResource("@1", "My Resource 1", "MyResource");
@Override
protected Resource formatAndParseResource(Resource resource) {
ResourceToJsonVisitor jsonVisitor = new ResourceToJsonVisitor();
jsonVisitor.visit(resource);
@ -65,12 +60,12 @@ public class ModelToJsonTest {
visitor.visit(parsedResource);
assertTrue("To JSON and back should equal same Resource:\n" + visitor.getMismatchedLocators(),
visitor.isEqual());
return parsedResource;
}
@Test
public void shouldFormatAndParseActivity() {
Activity activity = ModelGenerator.createActivity("@1", "My Activity 1", "Transport");
@Override
protected Activity formatAndParseActivity(Activity activity) {
ActivityToJsonVisitor jsonVisitor = new ActivityToJsonVisitor();
jsonVisitor.visit(activity);
@ -82,5 +77,7 @@ public class ModelToJsonTest {
visitor.visit(parsedActivity);
assertTrue("To JSON and back should equal same Activity:\n" + visitor.getMismatchedLocators(),
visitor.isEqual());
return parsedActivity;
}
}

View File

@ -18,38 +18,26 @@ package li.strolch.model;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayOutputStream;
import java.util.Collections;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import li.strolch.model.activity.Activity;
import li.strolch.model.visitor.ActivityDeepEqualsVisitor;
import li.strolch.model.visitor.OrderDeepEqualsVisitor;
import li.strolch.model.visitor.ResourceDeepEqualsVisitor;
import li.strolch.model.xml.ActivityToSaxVisitor;
import li.strolch.model.xml.ActivityToSaxWriterVisitor;
import li.strolch.model.xml.OrderToSaxVisitor;
import li.strolch.model.xml.OrderToSaxWriterVisitor;
import li.strolch.model.xml.ResourceToSaxVisitor;
import li.strolch.model.xml.ResourceToSaxWriterVisitor;
import li.strolch.model.xml.SimpleStrolchElementListener;
import li.strolch.model.xml.XmlModelSaxReader;
import org.junit.Test;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
@SuppressWarnings("nls")
public class ModelToSaxTest extends ModelTest {
public class ModelToSaxTest extends ModelMarshallingTest {
@Test
public void shouldFormatAndParseOrder() {
Order order = ModelGenerator.createOrder("@1", "My Order 1", "MyOrder");
@Override
protected Order formatAndParseOrder(Order order) {
SimpleStrolchElementListener listener = new SimpleStrolchElementListener();
XmlModelSaxReader saxReader = new XmlModelSaxReader(listener);
@ -65,12 +53,12 @@ public class ModelToSaxTest extends ModelTest {
OrderDeepEqualsVisitor visitor = new OrderDeepEqualsVisitor(order);
visitor.visit(parsedOrder);
assertTrue("To DOM and back should equal same Order:\n" + visitor.getMismatchedLocators(), visitor.isEqual());
return parsedOrder;
}
@Test
public void shouldFormatAndParseResource() {
Resource resource = ModelGenerator.createResource("@1", "My Resource 1", "MyResource");
@Override
protected Resource formatAndParseResource(Resource resource) {
SimpleStrolchElementListener listener = new SimpleStrolchElementListener();
XmlModelSaxReader saxReader = new XmlModelSaxReader(listener);
@ -85,13 +73,14 @@ public class ModelToSaxTest extends ModelTest {
ResourceDeepEqualsVisitor visitor = new ResourceDeepEqualsVisitor(resource);
visitor.visit(parsedResource);
assertTrue("To DOM and back should equal same Resource:\n" + visitor.getMismatchedLocators(), visitor.isEqual());
assertTrue("To DOM and back should equal same Resource:\n" + visitor.getMismatchedLocators(),
visitor.isEqual());
return parsedResource;
}
@Test
public void shouldFormatAndParseActivity() {
Activity activity = ModelGenerator.createActivity("@1", "My Activity 1", "MyActivity");
@Override
protected Activity formatAndParseActivity(Activity activity) {
SimpleStrolchElementListener listener = new SimpleStrolchElementListener();
XmlModelSaxReader saxReader = new XmlModelSaxReader(listener);
@ -106,45 +95,9 @@ public class ModelToSaxTest extends ModelTest {
ActivityDeepEqualsVisitor visitor = new ActivityDeepEqualsVisitor(activity);
visitor.visit(parsedActivity);
assertTrue("To DOM and back should equal same Activity:\n" + visitor.getMismatchedLocators(), visitor.isEqual());
}
assertTrue("To DOM and back should equal same Activity:\n" + visitor.getMismatchedLocators(),
visitor.isEqual());
@Test
public void shouldToSaxOrder() throws XMLStreamException {
Order order = ModelGenerator.createOrder("@1", "My Order 1", "MyOrder");
XMLOutputFactory factory = XMLOutputFactory.newInstance();
ByteArrayOutputStream out = new ByteArrayOutputStream();
XMLStreamWriter writer = factory.createXMLStreamWriter(out, "UTF-8");
writer.writeStartDocument();
writer.writeStartElement(Tags.STROLCH_MODEL);
OrderToSaxWriterVisitor toSax = new OrderToSaxWriterVisitor(writer);
toSax.visit(order);
writer.writeEndDocument();
}
@Test
public void shouldToSaxResource() throws XMLStreamException {
Resource resource = ModelGenerator.createResource("@1", "My Resource 1", "MyResource");
XMLOutputFactory factory = XMLOutputFactory.newInstance();
ByteArrayOutputStream out = new ByteArrayOutputStream();
XMLStreamWriter writer = factory.createXMLStreamWriter(out, "UTF-8");
writer.writeStartDocument();
writer.writeStartElement(Tags.STROLCH_MODEL);
ResourceToSaxWriterVisitor toSax = new ResourceToSaxWriterVisitor(writer);
toSax.visit(resource);
writer.writeEndDocument();
}
@Test
public void shouldToSaxActivity() throws XMLStreamException {
Activity activity = ModelGenerator.createActivity("@1", "My Activity 1", "MyActivity");
XMLOutputFactory factory = XMLOutputFactory.newInstance();
ByteArrayOutputStream out = new ByteArrayOutputStream();
XMLStreamWriter writer = factory.createXMLStreamWriter(out, "UTF-8");
writer.writeStartDocument();
writer.writeStartElement(Tags.STROLCH_MODEL);
ActivityToSaxWriterVisitor toSax = new ActivityToSaxWriterVisitor(writer);
toSax.visit(activity);
writer.writeEndDocument();
return parsedActivity;
}
}

View File

@ -0,0 +1,135 @@
/*
* Copyright 2013 Robert von Burg <eitch@eitchnet.ch>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package li.strolch.model;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Collections;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamWriter;
import li.strolch.model.activity.Activity;
import li.strolch.model.visitor.ActivityDeepEqualsVisitor;
import li.strolch.model.visitor.OrderDeepEqualsVisitor;
import li.strolch.model.visitor.ResourceDeepEqualsVisitor;
import li.strolch.model.xml.ActivityToSaxWriterVisitor;
import li.strolch.model.xml.OrderToSaxWriterVisitor;
import li.strolch.model.xml.ResourceToSaxWriterVisitor;
import li.strolch.model.xml.SimpleStrolchElementListener;
import li.strolch.model.xml.XmlModelSaxStreamReader;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
@SuppressWarnings("nls")
public class ModelToSaxWriterTest extends ModelMarshallingTest {
@Override
protected Order formatAndParseOrder(Order order) throws Exception {
XMLOutputFactory factory = XMLOutputFactory.newInstance();
ByteArrayOutputStream out = new ByteArrayOutputStream();
XMLStreamWriter writer = factory.createXMLStreamWriter(out, "UTF-8");
writer.writeStartDocument();
writer.writeStartElement(Tags.STROLCH_MODEL);
OrderToSaxWriterVisitor toSax = new OrderToSaxWriterVisitor(writer);
toSax.visit(order);
writer.writeEndDocument();
SimpleStrolchElementListener listener = new SimpleStrolchElementListener();
XmlModelSaxStreamReader saxStreamReader = new XmlModelSaxStreamReader(listener,
new ByteArrayInputStream(out.toByteArray()));
saxStreamReader.parseStream();
assertEquals(1, listener.getOrders().size());
assertEquals(Collections.emptyList(), listener.getResources());
assertEquals(Collections.emptyList(), listener.getActivities());
Order parsedOrder = listener.getOrders().get(0);
OrderDeepEqualsVisitor visitor = new OrderDeepEqualsVisitor(order);
visitor.visit(parsedOrder);
assertTrue("To DOM and back should equal same Order:\n" + visitor.getMismatchedLocators(), visitor.isEqual());
return parsedOrder;
}
@Override
protected Resource formatAndParseResource(Resource resource) throws Exception {
XMLOutputFactory factory = XMLOutputFactory.newInstance();
ByteArrayOutputStream out = new ByteArrayOutputStream();
XMLStreamWriter writer = factory.createXMLStreamWriter(out, "UTF-8");
writer.writeStartDocument();
writer.writeStartElement(Tags.STROLCH_MODEL);
ResourceToSaxWriterVisitor toSax = new ResourceToSaxWriterVisitor(writer);
toSax.visit(resource);
writer.writeEndDocument();
SimpleStrolchElementListener listener = new SimpleStrolchElementListener();
XmlModelSaxStreamReader saxStreamReader = new XmlModelSaxStreamReader(listener,
new ByteArrayInputStream(out.toByteArray()));
saxStreamReader.parseStream();
assertEquals(1, listener.getResources().size());
assertEquals(Collections.emptyList(), listener.getActivities());
assertEquals(Collections.emptyList(), listener.getOrders());
Resource parsedResource = listener.getResources().get(0);
ResourceDeepEqualsVisitor visitor = new ResourceDeepEqualsVisitor(resource);
visitor.visit(parsedResource);
assertTrue("To DOM and back should equal same Resource:\n" + visitor.getMismatchedLocators(),
visitor.isEqual());
return parsedResource;
}
@Override
protected Activity formatAndParseActivity(Activity activity) throws Exception {
XMLOutputFactory factory = XMLOutputFactory.newInstance();
ByteArrayOutputStream out = new ByteArrayOutputStream();
XMLStreamWriter writer = factory.createXMLStreamWriter(out, "UTF-8");
writer.writeStartDocument();
writer.writeStartElement(Tags.STROLCH_MODEL);
ActivityToSaxWriterVisitor toSax = new ActivityToSaxWriterVisitor(writer);
toSax.visit(activity);
writer.writeEndDocument();
System.out.println(out.toString());
SimpleStrolchElementListener listener = new SimpleStrolchElementListener();
XmlModelSaxStreamReader saxStreamReader = new XmlModelSaxStreamReader(listener,
new ByteArrayInputStream(out.toByteArray()));
saxStreamReader.parseStream();
assertEquals(1, listener.getActivities().size());
assertEquals(Collections.emptyList(), listener.getResources());
assertEquals(Collections.emptyList(), listener.getOrders());
Activity parsedActivity = listener.getActivities().get(0);
ActivityDeepEqualsVisitor visitor = new ActivityDeepEqualsVisitor(activity);
visitor.visit(parsedActivity);
assertTrue("To DOM and back should equal same Activity:\n" + visitor.getMismatchedLocators(),
visitor.isEqual());
return parsedActivity;
}
}

View File

@ -25,14 +25,16 @@ import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import li.strolch.model.timevalue.impl.AString;
import li.strolch.model.timevalue.impl.StringSetValue;
import li.strolch.model.timevalue.impl.TimeVariable;
import li.strolch.model.timevalue.impl.ValueChange;
import org.junit.Before;
import org.junit.Test;
/**
* Basic tests for a {@link TimeVariable} with {@link StringValue}.
*
@ -40,6 +42,8 @@ import org.junit.Test;
*/
public class StringTimeVariableTest {
private static final Logger logger = LoggerFactory.getLogger(StringTimeVariableTest.class);
private static final Long MAX = 100L;
private static final Long STEP = 10L;
private static final Long PICK = 50L;
@ -105,11 +109,10 @@ public class StringTimeVariableTest {
// check the future values
Collection<ITimeValue<IValue<Set<AString>>>> futureValues = this.timeVariable.getFutureValues(0L);
for (ITimeValue<IValue<Set<AString>>> iTimeValue : futureValues) {
System.out.println("++ " + iTimeValue); //$NON-NLS-1$
logger.info("++ " + iTimeValue); //$NON-NLS-1$
}
assertEquals(1, futureValues.size()); // a empty one is left
}
@Test
@ -131,7 +134,5 @@ public class StringTimeVariableTest {
SortedSet<ITimeValue<IValue<Set<AString>>>> valuesCompacted = this.timeVariable.getFutureValues(0L);
assertEquals(1, valuesCompacted.size());
}
}

View File

@ -99,7 +99,7 @@ public class PostgreSqlActivityDao extends PostgresqlDao<Activity> implements Ac
protected void internalSave(final Activity activity) {
String sql = "insert into " + getTableName()
+ " (id, version, created_by, created_at, deleted, latest, name, type, asxml) values (?, ?, ?, ?, ?, true, ?, ?, ?)";
+ " (id, version, created_by, created_at, deleted, latest, name, type, asxml) values (?, ?, ?, ?, ?, ?, ?, ?, ?)";
try (PreparedStatement preparedStatement = tx().getConnection().prepareStatement(sql)) {
@ -113,12 +113,14 @@ public class PostgreSqlActivityDao extends PostgresqlDao<Activity> implements Ac
Calendar.getInstance());
preparedStatement.setBoolean(5, activity.getVersion().isDeleted());
preparedStatement.setBoolean(6, !activity.getVersion().isDeleted());
// attributes
preparedStatement.setString(6, activity.getName());
preparedStatement.setString(7, activity.getType());
preparedStatement.setString(7, activity.getName());
preparedStatement.setString(8, activity.getType());
SQLXML sqlxml = createSqlXml(activity, preparedStatement);
preparedStatement.setSQLXML(8, sqlxml);
preparedStatement.setSQLXML(9, sqlxml);
try {
int modCount = preparedStatement.executeUpdate();
@ -187,7 +189,7 @@ public class PostgreSqlActivityDao extends PostgresqlDao<Activity> implements Ac
}
String sql = "update " + getTableName()
+ " set created_by = ?, created_at = ?, deleted = ?, latest = true, name = ?, type = ?, asxml = ? where id = ? and version = ?";
+ " set created_by = ?, created_at = ?, deleted = ?, latest = ?, name = ?, type = ?, asxml = ? where id = ? and version = ?";
try (PreparedStatement preparedStatement = tx().getConnection().prepareStatement(sql)) {
@ -197,16 +199,18 @@ public class PostgreSqlActivityDao extends PostgresqlDao<Activity> implements Ac
Calendar.getInstance());
preparedStatement.setBoolean(3, activity.getVersion().isDeleted());
preparedStatement.setBoolean(4, !activity.getVersion().isDeleted());
// attributes
preparedStatement.setString(4, activity.getName());
preparedStatement.setString(5, activity.getType());
preparedStatement.setString(5, activity.getName());
preparedStatement.setString(6, activity.getType());
SQLXML sqlxml = createSqlXml(activity, preparedStatement);
preparedStatement.setSQLXML(6, sqlxml);
preparedStatement.setSQLXML(7, sqlxml);
// primary key
preparedStatement.setString(7, activity.getId());
preparedStatement.setInt(8, activity.getVersion().getVersion());
preparedStatement.setString(8, activity.getId());
preparedStatement.setInt(9, activity.getVersion().getVersion());
try {
int modCount = preparedStatement.executeUpdate();

View File

@ -98,7 +98,7 @@ public class PostgreSqlOrderDao extends PostgresqlDao<Order> implements OrderDao
protected void internalSave(final Order order) {
String sql = "insert into " + getTableName()
+ " (id, version, created_by, created_at, deleted, latest, name, type, state, date, asxml) values (?, ?, ?, ?, ?, true, ?, ?, ?::order_state, ?, ?)";
+ " (id, version, created_by, created_at, deleted, latest, name, type, state, date, asxml) values (?, ?, ?, ?, ?, ?, ?, ?, ?::order_state, ?, ?)";
try (PreparedStatement preparedStatement = tx().getConnection().prepareStatement(sql)) {
@ -112,14 +112,16 @@ public class PostgreSqlOrderDao extends PostgresqlDao<Order> implements OrderDao
Calendar.getInstance());
preparedStatement.setBoolean(5, order.getVersion().isDeleted());
preparedStatement.setBoolean(6, !order.getVersion().isDeleted());
// attributes
preparedStatement.setString(6, order.getName());
preparedStatement.setString(7, order.getType());
preparedStatement.setString(8, order.getState().name());
preparedStatement.setTimestamp(9, new Timestamp(order.getDate().getTime()), Calendar.getInstance());
preparedStatement.setString(7, order.getName());
preparedStatement.setString(8, order.getType());
preparedStatement.setString(9, order.getState().name());
preparedStatement.setTimestamp(10, new Timestamp(order.getDate().getTime()), Calendar.getInstance());
SQLXML sqlxml = createSqlXml(order, preparedStatement);
preparedStatement.setSQLXML(10, sqlxml);
preparedStatement.setSQLXML(11, sqlxml);
try {
int modCount = preparedStatement.executeUpdate();
@ -188,7 +190,7 @@ public class PostgreSqlOrderDao extends PostgresqlDao<Order> implements OrderDao
// now we update the existing object
String sql = "update " + getTableName()
+ " set created_by = ?, created_at = ?, deleted = ?, latest = true, name = ?, type = ?, state = ?::order_state, date = ?, asxml = ? where id = ? and version = ?";
+ " set created_by = ?, created_at = ?, deleted = ?, latest = ?, name = ?, type = ?, state = ?::order_state, date = ?, asxml = ? where id = ? and version = ?";
try (PreparedStatement preparedStatement = tx().getConnection().prepareStatement(sql)) {
// version
@ -197,18 +199,20 @@ public class PostgreSqlOrderDao extends PostgresqlDao<Order> implements OrderDao
Calendar.getInstance());
preparedStatement.setBoolean(3, order.getVersion().isDeleted());
preparedStatement.setBoolean(4, !order.getVersion().isDeleted());
// attributes
preparedStatement.setString(4, order.getName());
preparedStatement.setString(5, order.getType());
preparedStatement.setString(6, order.getState().name());
preparedStatement.setTimestamp(7, new Timestamp(order.getDate().getTime()), Calendar.getInstance());
preparedStatement.setString(5, order.getName());
preparedStatement.setString(6, order.getType());
preparedStatement.setString(7, order.getState().name());
preparedStatement.setTimestamp(8, new Timestamp(order.getDate().getTime()), Calendar.getInstance());
SQLXML sqlxml = createSqlXml(order, preparedStatement);
preparedStatement.setSQLXML(8, sqlxml);
preparedStatement.setSQLXML(9, sqlxml);
// primary key
preparedStatement.setString(9, order.getId());
preparedStatement.setInt(10, order.getVersion().getVersion());
preparedStatement.setString(10, order.getId());
preparedStatement.setInt(11, order.getVersion().getVersion());
try {
int modCount = preparedStatement.executeUpdate();

View File

@ -97,7 +97,7 @@ public class PostgreSqlResourceDao extends PostgresqlDao<Resource> implements Re
@Override
protected void internalSave(final Resource res) {
String sql = "insert into " + getTableName()
+ " (id, version, created_by, created_at, deleted, latest, name, type, asxml) values (?, ?, ?, ?, ?, true, ?, ?, ?)";
+ " (id, version, created_by, created_at, deleted, latest, name, type, asxml) values (?, ?, ?, ?, ?, ?, ?, ?, ?)";
try (PreparedStatement preparedStatement = tx().getConnection().prepareStatement(sql)) {
// id
@ -110,12 +110,14 @@ public class PostgreSqlResourceDao extends PostgresqlDao<Resource> implements Re
Calendar.getInstance());
preparedStatement.setBoolean(5, res.getVersion().isDeleted());
preparedStatement.setBoolean(6, !res.getVersion().isDeleted());
// attributes
preparedStatement.setString(6, res.getName());
preparedStatement.setString(7, res.getType());
preparedStatement.setString(7, res.getName());
preparedStatement.setString(8, res.getType());
SQLXML sqlxml = createSqlXml(res, preparedStatement);
preparedStatement.setSQLXML(8, sqlxml);
preparedStatement.setSQLXML(9, sqlxml);
try {
int modCount = preparedStatement.executeUpdate();
if (modCount != 1) {
@ -182,7 +184,7 @@ public class PostgreSqlResourceDao extends PostgresqlDao<Resource> implements Re
// now we update the existing object
String sql = "update " + getTableName()
+ " set created_by = ?, created_at = ?, deleted = ?, latest = true, name = ?, type = ?, asxml = ? where id = ? and version = ?";
+ " set created_by = ?, created_at = ?, deleted = ?, latest = ?, name = ?, type = ?, asxml = ? where id = ? and version = ?";
try (PreparedStatement preparedStatement = tx().getConnection().prepareStatement(sql)) {
// version
@ -191,16 +193,18 @@ public class PostgreSqlResourceDao extends PostgresqlDao<Resource> implements Re
Calendar.getInstance());
preparedStatement.setBoolean(3, resource.getVersion().isDeleted());
preparedStatement.setBoolean(4, !resource.getVersion().isDeleted());
// attributes
preparedStatement.setString(4, resource.getName());
preparedStatement.setString(5, resource.getType());
preparedStatement.setString(5, resource.getName());
preparedStatement.setString(6, resource.getType());
SQLXML sqlxml = createSqlXml(resource, preparedStatement);
preparedStatement.setSQLXML(6, sqlxml);
preparedStatement.setSQLXML(7, sqlxml);
// primary key
preparedStatement.setString(7, resource.getId());
preparedStatement.setInt(8, resource.getVersion().getVersion());
preparedStatement.setString(8, resource.getId());
preparedStatement.setInt(9, resource.getVersion().getVersion());
try {
int modCount = preparedStatement.executeUpdate();

View File

@ -238,8 +238,6 @@ public abstract class PostgresqlDao<T extends StrolchRootElement> implements Str
while (result.next()) {
SQLXML sqlxml = result.getSQLXML("asxml");
T t = parseFromXml(id, type, sqlxml);
if (result.next())
throw new StrolchPersistenceException("Non unique result for query: " + sql);
list.add(t);
}

View File

@ -39,14 +39,14 @@ import li.strolch.agent.api.ComponentContainer;
import li.strolch.agent.api.OrderMap;
import li.strolch.agent.api.ResourceMap;
import li.strolch.exception.StrolchException;
import li.strolch.model.ActivityVisitor;
import li.strolch.model.ModelStatistics;
import li.strolch.model.Order;
import li.strolch.model.OrderVisitor;
import li.strolch.model.Resource;
import li.strolch.model.ResourceVisitor;
import li.strolch.model.Tags;
import li.strolch.model.activity.Activity;
import li.strolch.model.visitor.ActivityVisitor;
import li.strolch.model.visitor.OrderVisitor;
import li.strolch.model.visitor.ResourceVisitor;
import li.strolch.model.xml.ActivityToSaxWriterVisitor;
import li.strolch.model.xml.OrderToSaxWriterVisitor;
import li.strolch.model.xml.ResourceToSaxWriterVisitor;

View File

@ -155,7 +155,7 @@ public class OrderModelTestRunner {
// fail to re-read
try (StrolchTransaction tx = this.runtimeMock.getRealm(this.realmName).openTx(this.certificate, "test");) {
Order order = tx.getOrderMap().getBy(tx, TYPE, ID);
assertNull("Should no read Order with id " + ID, order);
assertNull("Should not read Order with id " + ID, order);
}
}