[Major] Total refactoring of StrolchElementVisitor hierarchy

This commit is contained in:
Robert von Burg 2017-05-17 09:20:27 +02:00
parent 464fa8ac4a
commit 3622339896
48 changed files with 506 additions and 900 deletions

View File

@ -53,7 +53,7 @@ public class AuditingActivityMap extends AuditingElementMapFacade<Activity> impl
DBC.PRE.assertNotNull("activityVisitor on query", activityVisitor); DBC.PRE.assertNotNull("activityVisitor on query", activityVisitor);
query.setActivityVisitor(activity -> { query.setActivityVisitor(activity -> {
this.read.add(activity); this.read.add(activity);
return activityVisitor.visit(activity); return activity.accept(activityVisitor);
}); });
return getElementMap().doQuery(tx, query); return getElementMap().doQuery(tx, query);

View File

@ -53,7 +53,7 @@ public class AuditingOrderMap extends AuditingElementMapFacade<Order> implements
DBC.PRE.assertNotNull("orderVisitor on query", orderVisitor); DBC.PRE.assertNotNull("orderVisitor on query", orderVisitor);
query.setOrderVisitor(order -> { query.setOrderVisitor(order -> {
this.read.add(order); this.read.add(order);
return orderVisitor.visit(order); return order.accept(orderVisitor);
}); });
return getElementMap().doQuery(tx, query); return getElementMap().doQuery(tx, query);

View File

@ -22,7 +22,7 @@ import li.strolch.agent.api.ElementMap;
import li.strolch.agent.api.ResourceMap; import li.strolch.agent.api.ResourceMap;
import li.strolch.model.Resource; import li.strolch.model.Resource;
import li.strolch.model.query.ResourceQuery; import li.strolch.model.query.ResourceQuery;
import li.strolch.model.visitor.ResourceVisitor; import li.strolch.model.visitor.StrolchElementVisitor;
import li.strolch.persistence.api.StrolchTransaction; import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.utils.dbc.DBC; import li.strolch.utils.dbc.DBC;
@ -49,11 +49,11 @@ public class AuditingResourceMap extends AuditingElementMapFacade<Resource> impl
@Override @Override
public <U> List<U> doQuery(StrolchTransaction tx, ResourceQuery<U> query) { public <U> List<U> doQuery(StrolchTransaction tx, ResourceQuery<U> query) {
ResourceVisitor<U> resourceVisitor = query.getResourceVisitor(); StrolchElementVisitor<U> resourceVisitor = query.getResourceVisitor();
DBC.PRE.assertNotNull("resourceVisitor on query", resourceVisitor); DBC.PRE.assertNotNull("resourceVisitor on query", resourceVisitor);
query.setResourceVisitor(resource -> { query.setResourceVisitor(resource -> {
this.read.add(resource); this.read.add(resource);
return resourceVisitor.visit(resource); return resource.accept(resourceVisitor);
}); });
return getElementMap().doQuery(tx, query); return getElementMap().doQuery(tx, query);

View File

@ -33,14 +33,14 @@ public class InMemoryQuery<T extends StrolchRootElement, U> {
private Navigator<T> navigator; private Navigator<T> navigator;
private Selector<T> selector; private Selector<T> selector;
private StrolchElementVisitor<T, U> elementVisitor; private StrolchElementVisitor<U> elementVisitor;
private Comparator<T> comparator; private Comparator<T> comparator;
public InMemoryQuery() { public InMemoryQuery() {
// empty constructor // empty constructor
} }
public InMemoryQuery(Navigator<T> navigator, Selector<T> selector, StrolchElementVisitor<T, U> elementVisitor, public InMemoryQuery(Navigator<T> navigator, Selector<T> selector, StrolchElementVisitor<U> elementVisitor,
Comparator<T> comparator) { Comparator<T> comparator) {
this.navigator = navigator; this.navigator = navigator;
this.selector = selector; this.selector = selector;
@ -68,7 +68,7 @@ public class InMemoryQuery<T extends StrolchRootElement, U> {
* @param elementVisitor * @param elementVisitor
* the elementVisitor to set * the elementVisitor to set
*/ */
public void setElementVisitor(StrolchElementVisitor<T, U> elementVisitor) { public void setElementVisitor(StrolchElementVisitor<U> elementVisitor) {
this.elementVisitor = elementVisitor; this.elementVisitor = elementVisitor;
} }
@ -86,7 +86,7 @@ public class InMemoryQuery<T extends StrolchRootElement, U> {
while (iter.hasNext()) { while (iter.hasNext()) {
T element = iter.next(); T element = iter.next();
if (this.selector.select(element)) { if (this.selector.select(element)) {
U returnValue = this.elementVisitor.visit(element); U returnValue = element.accept(this.elementVisitor);
DBC.INTERIM.assertNotNull("Visitor may not return null in query!", returnValue); //$NON-NLS-1$ DBC.INTERIM.assertNotNull("Visitor may not return null in query!", returnValue); //$NON-NLS-1$
result.add(returnValue); result.add(returnValue);
} }

View File

@ -3,7 +3,6 @@ package li.strolch.model;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import li.strolch.model.json.StrolchElementToFlatJsonVisitor;
import li.strolch.model.json.StrolchElementToJsonVisitor; import li.strolch.model.json.StrolchElementToJsonVisitor;
import li.strolch.model.xml.StrolchElementToXmlStringVisitor; import li.strolch.model.xml.StrolchElementToXmlStringVisitor;
@ -21,7 +20,7 @@ public abstract class AbstractStrolchRootElement extends GroupedParameterizedEle
@Override @Override
public String toXmlString() { public String toXmlString() {
return this.accept(new StrolchElementToXmlStringVisitor()); return accept(new StrolchElementToXmlStringVisitor());
} }
@Override @Override
@ -33,6 +32,6 @@ public abstract class AbstractStrolchRootElement extends GroupedParameterizedEle
@Override @Override
public String toFlatJsonString() { public String toFlatJsonString() {
Gson gson = new GsonBuilder().setPrettyPrinting().create(); Gson gson = new GsonBuilder().setPrettyPrinting().create();
return gson.toJson(this.accept(new StrolchElementToFlatJsonVisitor())); return gson.toJson(this.accept(new StrolchElementToJsonVisitor().flat()));
} }
} }

View File

@ -22,7 +22,7 @@ import li.strolch.exception.StrolchPolicyException;
import li.strolch.model.Locator.LocatorBuilder; import li.strolch.model.Locator.LocatorBuilder;
import li.strolch.model.policy.PolicyDef; import li.strolch.model.policy.PolicyDef;
import li.strolch.model.policy.PolicyDefs; import li.strolch.model.policy.PolicyDefs;
import li.strolch.model.visitor.StrolchRootElementVisitor; import li.strolch.model.visitor.StrolchElementVisitor;
import li.strolch.utils.iso8601.ISO8601FormatFactory; import li.strolch.utils.iso8601.ISO8601FormatFactory;
/** /**
@ -188,7 +188,7 @@ public class Order extends AbstractStrolchRootElement implements StrolchRootElem
} }
@Override @Override
public <T> T accept(StrolchRootElementVisitor<T> visitor) { public <T> T accept(StrolchElementVisitor<T> visitor) {
return visitor.visitOrder(this); return visitor.visitOrder(this);
} }

View File

@ -31,7 +31,7 @@ import li.strolch.model.policy.PolicyDef;
import li.strolch.model.policy.PolicyDefs; import li.strolch.model.policy.PolicyDefs;
import li.strolch.model.timedstate.StrolchTimedState; import li.strolch.model.timedstate.StrolchTimedState;
import li.strolch.model.timevalue.IValue; import li.strolch.model.timevalue.IValue;
import li.strolch.model.visitor.StrolchRootElementVisitor; import li.strolch.model.visitor.StrolchElementVisitor;
/** /**
* @author Robert von Burg <eitch@eitchnet.ch> * @author Robert von Burg <eitch@eitchnet.ch>
@ -208,7 +208,7 @@ public class Resource extends AbstractStrolchRootElement implements StrolchRootE
} }
@Override @Override
public <T> T accept(StrolchRootElementVisitor<T> visitor) { public <T> T accept(StrolchElementVisitor<T> visitor) {
return visitor.visitResource(this); return visitor.visitResource(this);
} }

View File

@ -15,6 +15,7 @@
*/ */
package li.strolch.model; package li.strolch.model;
import li.strolch.model.visitor.StrolchElementVisitor;
import li.strolch.model.visitor.StrolchRootElementVisitor; import li.strolch.model.visitor.StrolchRootElementVisitor;
/** /**
@ -68,7 +69,7 @@ public interface StrolchRootElement extends StrolchElement, PolicyContainer, Par
* *
* @return the result of the visitation * @return the result of the visitation
*/ */
public <T> T accept(StrolchRootElementVisitor<T> visitor); public <T> T accept(StrolchElementVisitor<T> visitor);
/** /**
* Formats this {@link StrolchRootElement} as an XML string * Formats this {@link StrolchRootElement} as an XML string

View File

@ -310,6 +310,6 @@ public class Action extends GroupedParameterizedElement implements IActivityElem
@Override @Override
public <T> T accept(IActivityElementVisitor<T> visitor) { public <T> T accept(IActivityElementVisitor<T> visitor) {
return visitor.visit(this); return visitor.visitAction(this);
} }
} }

View File

@ -38,7 +38,7 @@ import li.strolch.model.parameter.Parameter;
import li.strolch.model.policy.PolicyDef; import li.strolch.model.policy.PolicyDef;
import li.strolch.model.policy.PolicyDefs; import li.strolch.model.policy.PolicyDefs;
import li.strolch.model.visitor.IActivityElementVisitor; import li.strolch.model.visitor.IActivityElementVisitor;
import li.strolch.model.visitor.StrolchRootElementVisitor; import li.strolch.model.visitor.StrolchElementVisitor;
import li.strolch.utils.dbc.DBC; import li.strolch.utils.dbc.DBC;
/** /**
@ -373,13 +373,13 @@ public class Activity extends AbstractStrolchRootElement
} }
@Override @Override
public <T> T accept(StrolchRootElementVisitor<T> visitor) { public <T> T accept(StrolchElementVisitor<T> visitor) {
return visitor.visitActivity(this); return visitor.visitActivity(this);
} }
@Override @Override
public <T> T accept(IActivityElementVisitor<T> visitor) { public <T> T accept(IActivityElementVisitor<T> visitor) {
return visitor.visit(this); return visitor.visitActivity(this);
} }
@Override @Override

View File

@ -1,53 +0,0 @@
package li.strolch.model.json;
import java.util.function.BiConsumer;
import com.google.gson.JsonObject;
import li.strolch.model.Tags;
import li.strolch.model.activity.Activity;
import li.strolch.model.visitor.ActivityVisitor;
public class ActivityToFlatJsonVisitor extends ToFlatJsonVisitor<Activity> implements ActivityVisitor<JsonObject> {
public ActivityToFlatJsonVisitor() {
super();
}
@Override
public ActivityToFlatJsonVisitor withVersion() {
super.withVersion();
return this;
}
@Override
public ActivityToFlatJsonVisitor withoutElementName() {
super.withoutElementName();
return this;
}
@Override
public ActivityToFlatJsonVisitor hook(BiConsumer<Activity, JsonObject> hook) {
super.hook(hook);
return this;
}
@Override
public ActivityToFlatJsonVisitor ignoreBag(String bagId) {
super.ignoreBag(bagId);
return this;
}
@Override
public ActivityToFlatJsonVisitor ignoreParameter(String bagId, String paramId) {
super.ignoreParameter(bagId, paramId);
return this;
}
@Override
public JsonObject visit(Activity element) {
JsonObject jsonObject = toJson(element);
jsonObject.addProperty(Tags.Json.STATE, element.getState().getName());
return jsonObject;
}
}

View File

@ -1,29 +0,0 @@
package li.strolch.model.json;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import li.strolch.model.activity.Activity;
import li.strolch.model.visitor.ActivityVisitor;
public class ActivityToJsonVisitor extends StrolchElementToJsonVisitor implements ActivityVisitor<JsonObject> {
private JsonObject jsonObject;
public JsonObject getJsonObject() {
return this.jsonObject;
}
@Override
public JsonObject visit(Activity element) {
this.jsonObject = toJson(element);
return this.jsonObject;
}
public static String toJsonString(Activity element) {
ActivityToJsonVisitor visitor = new ActivityToJsonVisitor();
JsonObject jsonObject = visitor.visit(element);
String entity = new Gson().toJson(jsonObject);
return entity;
}
}

View File

@ -1,57 +0,0 @@
package li.strolch.model.json;
import java.util.function.BiConsumer;
import com.google.gson.JsonObject;
import li.strolch.model.Order;
import li.strolch.model.Tags;
import li.strolch.model.visitor.OrderVisitor;
import li.strolch.utils.iso8601.ISO8601FormatFactory;
public class OrderToFlatJsonVisitor extends ToFlatJsonVisitor<Order> implements OrderVisitor<JsonObject> {
public OrderToFlatJsonVisitor() {
super();
}
@Override
public OrderToFlatJsonVisitor withVersion() {
super.withVersion();
return this;
}
@Override
public OrderToFlatJsonVisitor withoutElementName() {
super.withoutElementName();
return this;
}
@Override
public OrderToFlatJsonVisitor hook(BiConsumer<Order, JsonObject> hook) {
super.hook(hook);
return this;
}
@Override
public OrderToFlatJsonVisitor ignoreBag(String bagId) {
super.ignoreBag(bagId);
return this;
}
@Override
public OrderToFlatJsonVisitor ignoreParameter(String bagId, String paramId) {
super.ignoreParameter(bagId, paramId);
return this;
}
@Override
public JsonObject visit(Order element) {
JsonObject jsonObject = toJson(element);
jsonObject.addProperty(Tags.Json.DATE, ISO8601FormatFactory.getInstance().formatDate(element.getDate()));
jsonObject.addProperty(Tags.Json.STATE, element.getState().getName());
return jsonObject;
}
}

View File

@ -1,29 +0,0 @@
package li.strolch.model.json;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import li.strolch.model.Order;
import li.strolch.model.visitor.OrderVisitor;
public class OrderToJsonVisitor extends StrolchElementToJsonVisitor implements OrderVisitor<JsonObject> {
private JsonObject jsonObject;
public JsonObject getJsonObject() {
return this.jsonObject;
}
@Override
public JsonObject visit(Order element) {
this.jsonObject = toJson(element);
return this.jsonObject;
}
public static String toJsonString(Order element) {
OrderToJsonVisitor visitor = new OrderToJsonVisitor();
JsonObject jsonObject = visitor.visit(element);
String entity = new Gson().toJson(jsonObject);
return entity;
}
}

View File

@ -1,104 +0,0 @@
package li.strolch.model.json;
import java.util.HashSet;
import java.util.Set;
import java.util.function.BiConsumer;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import li.strolch.exception.StrolchModelException;
import li.strolch.model.Resource;
import li.strolch.model.Tags;
import li.strolch.model.timedstate.StrolchTimedState;
import li.strolch.model.timevalue.ITimeValue;
import li.strolch.model.timevalue.ITimeVariable;
import li.strolch.model.timevalue.IValue;
import li.strolch.model.visitor.ResourceVisitor;
import li.strolch.utils.iso8601.ISO8601FormatFactory;
public class ResourceToFlatJsonVisitor extends ToFlatJsonVisitor<Resource> implements ResourceVisitor<JsonObject> {
private Set<String> ignoredStates;
private boolean withoutTimedStates;
public ResourceToFlatJsonVisitor() {
super();
this.ignoredStates = new HashSet<>();
}
@Override
public ResourceToFlatJsonVisitor withVersion() {
super.withVersion();
return this;
}
public ResourceToFlatJsonVisitor withoutTimedStates() {
this.withoutTimedStates = true;
return this;
}
@Override
public ResourceToFlatJsonVisitor withoutElementName() {
super.withoutElementName();
return this;
}
@Override
public ResourceToFlatJsonVisitor hook(BiConsumer<Resource, JsonObject> hook) {
super.hook(hook);
return this;
}
@Override
public ResourceToFlatJsonVisitor ignoreBag(String bagId) {
super.ignoreBag(bagId);
return this;
}
@Override
public ResourceToFlatJsonVisitor ignoreParameter(String bagId, String paramId) {
super.ignoreParameter(bagId, paramId);
return this;
}
@Override
public JsonObject visit(Resource element) {
if (this.withoutTimedStates || !element.hasTimedStates())
return toJson(element);
JsonObject jsonObject = toJson(element);
addStates(element, jsonObject);
return jsonObject;
}
private void addStates(Resource element, JsonObject jsonObject) {
for (String stateKey : element.getTimedStateKeySet()) {
// see if we have to ignore this state
if (this.ignoredStates.contains(stateKey))
continue;
// get values
StrolchTimedState<IValue<?>> stateT = element.getTimedState(stateKey);
ITimeVariable<IValue<?>> timeEvolution = stateT.getTimeEvolution();
if (jsonObject.has(stateKey)) {
throw new StrolchModelException(
"JsonObject already has a member with ID " + stateKey + ": " + stateT.getLocator());
}
// build JSON data
JsonArray arrayJ = new JsonArray();
for (ITimeValue<IValue<?>> v : timeEvolution.getValues()) {
JsonObject obj = new JsonObject();
obj.addProperty(Tags.Json.DATE, ISO8601FormatFactory.getInstance().formatDate(v.getTime()));
obj.addProperty(Tags.Json.VALUE, v.getValue().getValueAsString());
arrayJ.add(obj);
}
jsonObject.add(stateKey, arrayJ);
}
}
}

View File

@ -1,29 +0,0 @@
package li.strolch.model.json;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import li.strolch.model.Resource;
import li.strolch.model.visitor.ResourceVisitor;
public class ResourceToJsonVisitor extends StrolchElementToJsonVisitor implements ResourceVisitor<JsonObject> {
private JsonObject jsonObject;
public JsonObject getJsonObject() {
return this.jsonObject;
}
@Override
public JsonObject visit(Resource element) {
this.jsonObject = toJson(element);
return this.jsonObject;
}
public static String toJsonString(Resource element) {
ResourceToJsonVisitor visitor = new ResourceToJsonVisitor();
JsonObject jsonObject = visitor.visit(element);
String entity = new Gson().toJson(jsonObject);
return entity;
}
}

View File

@ -1,26 +0,0 @@
package li.strolch.model.json;
import com.google.gson.JsonObject;
import li.strolch.model.Order;
import li.strolch.model.Resource;
import li.strolch.model.activity.Activity;
import li.strolch.model.visitor.StrolchRootElementVisitor;
public class StrolchElementToFlatJsonVisitor implements StrolchRootElementVisitor<JsonObject> {
@Override
public JsonObject visitOrder(Order order) {
return new OrderToFlatJsonVisitor().toJson(order);
}
@Override
public JsonObject visitResource(Resource resource) {
return new ResourceToFlatJsonVisitor().toJson(resource);
}
@Override
public JsonObject visitActivity(Activity activity) {
return new ActivityToFlatJsonVisitor().toJson(activity);
}
}

View File

@ -1,13 +1,18 @@
package li.strolch.model.json; package li.strolch.model.json;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set;
import java.util.SortedSet; import java.util.SortedSet;
import java.util.function.BiConsumer;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import li.strolch.exception.StrolchModelException;
import li.strolch.model.AbstractStrolchElement; import li.strolch.model.AbstractStrolchElement;
import li.strolch.model.GroupedParameterizedElement; import li.strolch.model.GroupedParameterizedElement;
import li.strolch.model.Order; import li.strolch.model.Order;
@ -16,6 +21,7 @@ import li.strolch.model.PolicyContainer;
import li.strolch.model.Resource; import li.strolch.model.Resource;
import li.strolch.model.StrolchModelConstants; import li.strolch.model.StrolchModelConstants;
import li.strolch.model.StrolchRootElement; import li.strolch.model.StrolchRootElement;
import li.strolch.model.StrolchValueType;
import li.strolch.model.Tags; import li.strolch.model.Tags;
import li.strolch.model.Version; import li.strolch.model.Version;
import li.strolch.model.activity.Action; import li.strolch.model.activity.Action;
@ -26,12 +32,100 @@ import li.strolch.model.policy.PolicyDef;
import li.strolch.model.policy.PolicyDefs; import li.strolch.model.policy.PolicyDefs;
import li.strolch.model.timedstate.StrolchTimedState; import li.strolch.model.timedstate.StrolchTimedState;
import li.strolch.model.timevalue.ITimeValue; import li.strolch.model.timevalue.ITimeValue;
import li.strolch.model.timevalue.ITimeVariable;
import li.strolch.model.timevalue.IValue; import li.strolch.model.timevalue.IValue;
import li.strolch.model.timevalue.IValueChange; import li.strolch.model.timevalue.IValueChange;
import li.strolch.model.visitor.IActivityElementVisitor;
import li.strolch.model.visitor.StrolchRootElementVisitor; import li.strolch.model.visitor.StrolchRootElementVisitor;
import li.strolch.utils.collections.MapOfSets;
import li.strolch.utils.iso8601.ISO8601FormatFactory; import li.strolch.utils.iso8601.ISO8601FormatFactory;
public class StrolchElementToJsonVisitor implements StrolchRootElementVisitor<JsonObject> { public class StrolchElementToJsonVisitor
implements StrolchRootElementVisitor<JsonObject>, IActivityElementVisitor<JsonObject> {
private MapOfSets<String, String> ignoredKeys;
private Set<String> ignoredStates;
private BiConsumer<Resource, JsonObject> resourceHook;
private BiConsumer<Order, JsonObject> orderHook;
private BiConsumer<Activity, JsonObject> activityHook;
private BiConsumer<Action, JsonObject> actionHook;
private boolean flat;
private boolean withoutElementName;
private boolean withVersion;
private boolean withoutPolicies;
public StrolchElementToJsonVisitor() {
this.ignoredKeys = new MapOfSets<>();
this.ignoredStates = new HashSet<>();
}
public boolean isFlat() {
return this.flat;
}
public boolean isWithVersion() {
return this.withVersion;
}
public boolean isWithoutElementName() {
return this.withoutElementName;
}
public boolean isWithoutPolicies() {
return this.withoutPolicies;
}
public StrolchElementToJsonVisitor withVersion() {
this.withVersion = true;
return this;
}
public StrolchElementToJsonVisitor withoutElementName() {
this.withoutElementName = true;
return this;
}
public StrolchElementToJsonVisitor withoutPolicies() {
this.withoutPolicies = true;
return this;
}
public StrolchElementToJsonVisitor flat() {
this.flat = true;
return this;
}
public StrolchElementToJsonVisitor ignoreBag(String bagId) {
this.ignoredKeys.addSet(bagId, Collections.emptySet());
return this;
}
public StrolchElementToJsonVisitor ignoreParameter(String bagId, String paramId) {
this.ignoredKeys.addElement(bagId, paramId);
return this;
}
public StrolchElementToJsonVisitor resourceHook(BiConsumer<Resource, JsonObject> hook) {
this.resourceHook = hook;
return this;
}
public StrolchElementToJsonVisitor orderHook(BiConsumer<Order, JsonObject> hook) {
this.orderHook = hook;
return this;
}
public StrolchElementToJsonVisitor activityHook(BiConsumer<Activity, JsonObject> hook) {
this.activityHook = hook;
return this;
}
public StrolchElementToJsonVisitor actionHook(BiConsumer<Action, JsonObject> hook) {
this.actionHook = hook;
return this;
}
@Override @Override
public JsonObject visitResource(Resource resource) { public JsonObject visitResource(Resource resource) {
@ -48,6 +142,11 @@ public class StrolchElementToJsonVisitor implements StrolchRootElementVisitor<Js
return toJson(activity); return toJson(activity);
} }
@Override
public JsonObject visitAction(Action action) {
return toJson(action);
}
protected JsonObject toJson(Resource element) { protected JsonObject toJson(Resource element) {
JsonObject rootJ = new JsonObject(); JsonObject rootJ = new JsonObject();
@ -56,10 +155,13 @@ public class StrolchElementToJsonVisitor implements StrolchRootElementVisitor<Js
toJson(element, rootJ); toJson(element, rootJ);
addVersion(element, rootJ); addVersion(element, rootJ);
addParameterBags(element, rootJ); addParameters(element, rootJ);
addTimedStates(element, rootJ); addStates(element, rootJ);
addPolicies(element, rootJ); addPolicies(element, rootJ);
if (this.resourceHook != null)
this.resourceHook.accept(element, rootJ);
return rootJ; return rootJ;
} }
@ -73,15 +175,17 @@ public class StrolchElementToJsonVisitor implements StrolchRootElementVisitor<Js
rootJ.addProperty(Tags.Json.STATE, element.getState().getName()); rootJ.addProperty(Tags.Json.STATE, element.getState().getName());
addVersion(element, rootJ); addVersion(element, rootJ);
addParameterBags(element, rootJ); addParameters(element, rootJ);
addPolicies(element, rootJ); addPolicies(element, rootJ);
if (this.orderHook != null)
this.orderHook.accept(element, rootJ);
return rootJ; return rootJ;
} }
protected JsonObject toJson(Activity element) { protected JsonObject toJson(Activity element) {
JsonObject rootJ = new JsonObject(); JsonObject rootJ = new JsonObject();
addVersion(element, rootJ);
return toJson(element, rootJ); return toJson(element, rootJ);
} }
@ -94,16 +198,20 @@ public class StrolchElementToJsonVisitor implements StrolchRootElementVisitor<Js
rootJ.addProperty(Tags.Json.OBJECT_TYPE, Tags.Json.ACTIVITY); rootJ.addProperty(Tags.Json.OBJECT_TYPE, Tags.Json.ACTIVITY);
toJson((AbstractStrolchElement) element, rootJ);
rootJ.addProperty(Tags.Json.TIME_ORDERING, element.getTimeOrdering().getName()); rootJ.addProperty(Tags.Json.TIME_ORDERING, element.getTimeOrdering().getName());
rootJ.addProperty(Tags.Json.STATE, element.getState().getName()); rootJ.addProperty(Tags.Json.STATE, element.getState().getName());
rootJ.addProperty(Tags.Json.START, formatDate(element.getStart())); rootJ.addProperty(Tags.Json.START, formatDate(element.getStart()));
rootJ.addProperty(Tags.Json.END, formatDate(element.getEnd())); rootJ.addProperty(Tags.Json.END, formatDate(element.getEnd()));
toJson((AbstractStrolchElement) element, rootJ); if (element.isRootElement())
addVersion(element, rootJ);
addParameterBags(element, rootJ); addParameters(element, rootJ);
addPolicies(element, rootJ); addPolicies(element, rootJ);
if (this.activityHook != null)
this.activityHook.accept(element, rootJ);
Iterator<Entry<String, IActivityElement>> iter = element.elementIterator(); Iterator<Entry<String, IActivityElement>> iter = element.elementIterator();
if (iter.hasNext()) { if (iter.hasNext()) {
@ -141,9 +249,12 @@ public class StrolchElementToJsonVisitor implements StrolchRootElementVisitor<Js
rootJ.addProperty(Tags.Json.START, formatDate(element.getStart())); rootJ.addProperty(Tags.Json.START, formatDate(element.getStart()));
rootJ.addProperty(Tags.Json.END, formatDate(element.getEnd())); rootJ.addProperty(Tags.Json.END, formatDate(element.getEnd()));
addParameterBags(element, rootJ); addParameters(element, rootJ);
addPolicies(element, rootJ); addPolicies(element, rootJ);
if (this.actionHook != null)
this.actionHook.accept(element, rootJ);
// value changes // value changes
Iterator<IValueChange<? extends IValue<?>>> iter = element.getChanges().iterator(); Iterator<IValueChange<? extends IValue<?>>> iter = element.getChanges().iterator();
if (iter.hasNext()) { if (iter.hasNext()) {
@ -171,6 +282,8 @@ public class StrolchElementToJsonVisitor implements StrolchRootElementVisitor<Js
protected void addPolicies(PolicyContainer policyContainer, JsonObject rootJ) { protected void addPolicies(PolicyContainer policyContainer, JsonObject rootJ) {
if (!policyContainer.hasPolicyDefs() || !policyContainer.getPolicyDefs().hasPolicyDefs()) if (!policyContainer.hasPolicyDefs() || !policyContainer.getPolicyDefs().hasPolicyDefs())
return; return;
if (isWithoutPolicies())
return;
PolicyDefs policyDefs = policyContainer.getPolicyDefs(); PolicyDefs policyDefs = policyContainer.getPolicyDefs();
@ -186,13 +299,61 @@ public class StrolchElementToJsonVisitor implements StrolchRootElementVisitor<Js
protected JsonObject toJson(AbstractStrolchElement element, JsonObject rootJ) { protected JsonObject toJson(AbstractStrolchElement element, JsonObject rootJ) {
rootJ.addProperty(Tags.Json.ID, element.getId()); rootJ.addProperty(Tags.Json.ID, element.getId());
rootJ.addProperty(Tags.Json.NAME, element.getName());
if (!isWithoutElementName())
rootJ.addProperty(Tags.Json.NAME, element.getName());
rootJ.addProperty(Tags.Json.TYPE, element.getType()); rootJ.addProperty(Tags.Json.TYPE, element.getType());
return rootJ; return rootJ;
} }
protected void addParameterBags(GroupedParameterizedElement element, JsonObject rootJ) { protected void addParameters(GroupedParameterizedElement element, JsonObject rootJ) {
if (isFlat())
addParametersFlat(element, rootJ);
else
addParameterFull(element, rootJ);
}
protected void addParametersFlat(GroupedParameterizedElement element, JsonObject rootJ) {
Set<String> bagKeySet = element.getParameterBagKeySet();
for (String bagId : bagKeySet) {
// see if we have to ignore this bag i.e. empty set existing
Set<String> ignoredParamIds = this.ignoredKeys.getSet(bagId);
if (ignoredParamIds != null && ignoredParamIds.isEmpty())
continue;
ParameterBag parameterBag = element.getParameterBag(bagId);
Set<String> parameterKeySet = parameterBag.getParameterKeySet();
for (String paramId : parameterKeySet) {
// see if this parameter must be ignored
if (ignoredParamIds != null && ignoredParamIds.contains(paramId))
continue;
if (rootJ.has(paramId)) {
throw new StrolchModelException(
"JsonObject already has a member with ID " + paramId + ": " + parameterBag.getLocator());
}
Parameter<?> param = parameterBag.getParameter(paramId);
StrolchValueType type = StrolchValueType.parse(param.getType());
if (type.isBoolean()) {
rootJ.addProperty(paramId, (Boolean) param.getValue());
} else if (type.isNumber()) {
rootJ.addProperty(paramId, (Number) param.getValue());
} else {
rootJ.addProperty(paramId, param.getValueAsString());
}
}
}
}
protected void addParameterFull(GroupedParameterizedElement element, JsonObject rootJ) {
if (!element.hasParameterBags()) if (!element.hasParameterBags())
return; return;
@ -239,7 +400,14 @@ public class StrolchElementToJsonVisitor implements StrolchRootElementVisitor<Js
} }
} }
protected void addTimedStates(Resource element, JsonObject rootJ) { protected void addStates(Resource resource, JsonObject rootJ) {
if (isFlat())
addTimedStatesFlat(resource, rootJ);
else
addTimedStatesFull(resource, rootJ);
}
protected void addTimedStatesFull(Resource element, JsonObject rootJ) {
if (!element.hasTimedStates()) if (!element.hasTimedStates())
return; return;
@ -248,6 +416,11 @@ public class StrolchElementToJsonVisitor implements StrolchRootElementVisitor<Js
rootJ.add(Tags.Json.TIMED_STATES, timedStatesJ); rootJ.add(Tags.Json.TIMED_STATES, timedStatesJ);
for (String stateKey : element.getTimedStateKeySet()) { for (String stateKey : element.getTimedStateKeySet()) {
// see if we have to ignore this state
if (this.ignoredStates.contains(stateKey))
continue;
StrolchTimedState<IValue<?>> state = element.getTimedState(stateKey); StrolchTimedState<IValue<?>> state = element.getTimedState(stateKey);
JsonObject stateJ = new JsonObject(); JsonObject stateJ = new JsonObject();
@ -273,9 +446,45 @@ public class StrolchElementToJsonVisitor implements StrolchRootElementVisitor<Js
} }
} }
public static void addVersion(StrolchRootElement element, JsonObject rootJ) { private void addTimedStatesFlat(Resource element, JsonObject jsonObject) {
if (!element.hasTimedStates())
return;
for (String stateKey : element.getTimedStateKeySet()) {
// see if we have to ignore this state
if (this.ignoredStates.contains(stateKey))
continue;
// get values
StrolchTimedState<IValue<?>> stateT = element.getTimedState(stateKey);
ITimeVariable<IValue<?>> timeEvolution = stateT.getTimeEvolution();
if (jsonObject.has(stateKey)) {
throw new StrolchModelException(
"JsonObject already has a member with ID " + stateKey + ": " + stateT.getLocator());
}
// build JSON data
JsonArray arrayJ = new JsonArray();
for (ITimeValue<IValue<?>> v : timeEvolution.getValues()) {
JsonObject obj = new JsonObject();
obj.addProperty(Tags.Json.DATE, ISO8601FormatFactory.getInstance().formatDate(v.getTime()));
obj.addProperty(Tags.Json.VALUE, v.getValue().getValueAsString());
arrayJ.add(obj);
}
jsonObject.add(stateKey, arrayJ);
}
}
protected void addVersion(StrolchRootElement element, JsonObject rootJ) {
if (!element.hasVersion()) if (!element.hasVersion())
return; return;
if (!isWithVersion())
return;
Version version = element.getVersion(); Version version = element.getVersion();
@ -286,7 +495,6 @@ public class StrolchElementToJsonVisitor implements StrolchRootElementVisitor<Js
versionJ.addProperty(Tags.Json.DELETED, version.isDeleted()); versionJ.addProperty(Tags.Json.DELETED, version.isDeleted());
rootJ.add(Tags.Json.VERSION, versionJ); rootJ.add(Tags.Json.VERSION, versionJ);
} }
private static String formatDate(Date date) { private static String formatDate(Date date) {
return ISO8601FormatFactory.getInstance().formatDate(date); return ISO8601FormatFactory.getInstance().formatDate(date);

View File

@ -1,142 +0,0 @@
package li.strolch.model.json;
import static li.strolch.model.Tags.Json.ID;
import static li.strolch.model.Tags.Json.NAME;
import static li.strolch.model.Tags.Json.OBJECT_TYPE;
import static li.strolch.model.Tags.Json.TYPE;
import static li.strolch.model.json.StrolchElementToJsonVisitor.addVersion;
import java.util.Collections;
import java.util.Set;
import java.util.function.BiConsumer;
import com.google.gson.JsonObject;
import li.strolch.exception.StrolchModelException;
import li.strolch.model.ParameterBag;
import li.strolch.model.StrolchRootElement;
import li.strolch.model.StrolchValueType;
import li.strolch.model.parameter.Parameter;
import li.strolch.utils.collections.MapOfSets;
/**
* <p>
* Maps a given {@link StrolchRootElement} to a {@link JsonObject}. All {@link Parameter Parameters} are mapped to a
* member of the {@link JsonObject}, {@link ParameterBag ParameterBags} are thus removed
* </p>
*
* <p>
* To ignore {@link Parameter Parameters} or {@link ParameterBag ParameterBags} use the
* {@link #ignoreParameter(String, String)} and {@link #ignoreBag(String)} methods
* </p>
*
* <p>
* The mapping can be extended by setting hook:
* </p>
*
* <pre>
* visitor.setHook((element, jsonObject) -> {
* // do work
* });
* </pre>
*
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class ToFlatJsonVisitor<T extends StrolchRootElement> {
private MapOfSets<String, String> ignoredKeys;
private BiConsumer<T, JsonObject> hook;
private boolean withoutElementName;
private boolean withVersion;
public ToFlatJsonVisitor() {
this.ignoredKeys = new MapOfSets<>();
}
public boolean isWithVersion() {
return this.withVersion;
}
public boolean isWithoutElementName() {
return this.withoutElementName;
}
public ToFlatJsonVisitor<T> withVersion() {
this.withVersion = true;
return this;
}
public ToFlatJsonVisitor<T> withoutElementName() {
this.withoutElementName = true;
return this;
}
public ToFlatJsonVisitor<T> hook(BiConsumer<T, JsonObject> hook) {
this.hook = hook;
return this;
}
public ToFlatJsonVisitor<T> ignoreBag(String bagId) {
this.ignoredKeys.addSet(bagId, Collections.emptySet());
return this;
}
public ToFlatJsonVisitor<T> ignoreParameter(String bagId, String paramId) {
this.ignoredKeys.addElement(bagId, paramId);
return this;
}
protected JsonObject toJson(T element) {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty(ID, element.getId());
if (!this.withoutElementName)
jsonObject.addProperty(NAME, element.getName());
jsonObject.addProperty(TYPE, element.getType());
jsonObject.addProperty(OBJECT_TYPE, element.getClass().getSimpleName());
Set<String> bagKeySet = element.getParameterBagKeySet();
for (String bagId : bagKeySet) {
// see if we have to ignore this bag i.e. empty set existing
Set<String> ignoredParamIds = this.ignoredKeys.getSet(bagId);
if (ignoredParamIds != null && ignoredParamIds.isEmpty())
continue;
ParameterBag parameterBag = element.getParameterBag(bagId);
Set<String> parameterKeySet = parameterBag.getParameterKeySet();
for (String paramId : parameterKeySet) {
// see if this parameter must be ignored
if (ignoredParamIds != null && ignoredParamIds.contains(paramId))
continue;
if (jsonObject.has(paramId)) {
throw new StrolchModelException(
"JsonObject already has a member with ID " + paramId + ": " + parameterBag.getLocator());
}
Parameter<?> param = parameterBag.getParameter(paramId);
StrolchValueType type = StrolchValueType.parse(param.getType());
if (type.isBoolean()) {
jsonObject.addProperty(paramId, (Boolean) param.getValue());
} else if (type.isNumber()) {
jsonObject.addProperty(paramId, (Number) param.getValue());
} else {
jsonObject.addProperty(paramId, param.getValueAsString());
}
}
}
if (this.hook != null)
this.hook.accept(element, jsonObject);
if (this.withVersion)
addVersion(element, jsonObject);
return jsonObject;
}
}

View File

@ -19,6 +19,7 @@ import li.strolch.model.activity.Action;
import li.strolch.model.activity.Activity; import li.strolch.model.activity.Activity;
import li.strolch.model.query.ordering.StrolchQueryOrdering; import li.strolch.model.query.ordering.StrolchQueryOrdering;
import li.strolch.model.visitor.ActivityVisitor; import li.strolch.model.visitor.ActivityVisitor;
import li.strolch.model.visitor.StrolchElementVisitor;
import li.strolch.utils.dbc.DBC; import li.strolch.utils.dbc.DBC;
/** /**
@ -73,6 +74,12 @@ public class ActivityQuery<U> extends StrolchElementQuery<ActivityQueryVisitor>
return this; return this;
} }
public ActivityQuery<U> setVisitor(StrolchElementVisitor<U> visitor) {
DBC.PRE.assertNotNull("visitor", visitor);
this.activityVisitor = visitor.asActivityVisitor();
return this;
}
public ActivityQuery<U> setActivityVisitor(ActivityVisitor<U> activityVisitor) { public ActivityQuery<U> setActivityVisitor(ActivityVisitor<U> activityVisitor) {
DBC.PRE.assertNotNull("activityVisitor", activityVisitor); DBC.PRE.assertNotNull("activityVisitor", activityVisitor);
this.activityVisitor = activityVisitor; this.activityVisitor = activityVisitor;

View File

@ -19,6 +19,7 @@ import li.strolch.model.Order;
import li.strolch.model.parameter.Parameter; import li.strolch.model.parameter.Parameter;
import li.strolch.model.query.ordering.StrolchQueryOrdering; import li.strolch.model.query.ordering.StrolchQueryOrdering;
import li.strolch.model.visitor.OrderVisitor; import li.strolch.model.visitor.OrderVisitor;
import li.strolch.model.visitor.StrolchElementVisitor;
import li.strolch.utils.dbc.DBC; import li.strolch.utils.dbc.DBC;
/** /**
@ -73,6 +74,12 @@ public class OrderQuery<U> extends StrolchElementQuery<OrderQueryVisitor> {
return this; return this;
} }
public OrderQuery<U> setVisitor(StrolchElementVisitor<U> visitor) {
DBC.PRE.assertNotNull("visitor", visitor);
this.orderVisitor = visitor.asOrderVisitor();
return this;
}
public OrderQuery<U> setOrderVisitor(OrderVisitor<U> orderVisitor) { public OrderQuery<U> setOrderVisitor(OrderVisitor<U> orderVisitor) {
DBC.PRE.assertNotNull("orderVisitor", orderVisitor); DBC.PRE.assertNotNull("orderVisitor", orderVisitor);
this.orderVisitor = orderVisitor; this.orderVisitor = orderVisitor;

View File

@ -19,6 +19,7 @@ import li.strolch.model.Resource;
import li.strolch.model.parameter.Parameter; import li.strolch.model.parameter.Parameter;
import li.strolch.model.query.ordering.StrolchQueryOrdering; import li.strolch.model.query.ordering.StrolchQueryOrdering;
import li.strolch.model.visitor.ResourceVisitor; import li.strolch.model.visitor.ResourceVisitor;
import li.strolch.model.visitor.StrolchElementVisitor;
import li.strolch.utils.dbc.DBC; import li.strolch.utils.dbc.DBC;
/** /**
@ -73,6 +74,12 @@ public class ResourceQuery<U> extends StrolchElementQuery<ResourceQueryVisitor>
return this; return this;
} }
public ResourceQuery<U> setVisitor(StrolchElementVisitor<U> visitor) {
DBC.PRE.assertNotNull("visitor", visitor);
this.resourceVisitor = visitor.asResourceVisitor();
return this;
}
public ResourceQuery<U> setResourceVisitor(ResourceVisitor<U> resourceVisitor) { public ResourceQuery<U> setResourceVisitor(ResourceVisitor<U> resourceVisitor) {
DBC.PRE.assertNotNull("resourceVisitor", resourceVisitor); DBC.PRE.assertNotNull("resourceVisitor", resourceVisitor);
this.resourceVisitor = resourceVisitor; this.resourceVisitor = resourceVisitor;

View File

@ -1,40 +0,0 @@
/*
* 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.visitor;
import java.util.List;
import li.strolch.model.Locator;
import li.strolch.model.activity.Activity;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class ActivityDeepEqualsVisitor extends StrolchElementDeepEqualsVisitor implements
ActivityVisitor<List<Locator>> {
private Activity sourceActivity;
public ActivityDeepEqualsVisitor(Activity sourceActivity) {
this.sourceActivity = sourceActivity;
}
@Override
public List<Locator> visit(Activity dstActivity) {
deepEquals(this.sourceActivity, dstActivity);
return getMismatchedLocators();
}
}

View File

@ -15,14 +15,28 @@
*/ */
package li.strolch.model.visitor; package li.strolch.model.visitor;
import li.strolch.model.activity.Activity; import li.strolch.model.Order;
import li.strolch.model.Resource;
import li.strolch.model.activity.Action;
/** /**
* @author Robert von Burg <eitch@eitchnet.ch> * @author Robert von Burg <eitch@eitchnet.ch>
* @param <U> * @param <U>
*/ */
public interface ActivityVisitor<U> extends StrolchElementVisitor<Activity, U> { public interface ActivityVisitor<U> extends StrolchElementVisitor<U> {
@Override @Override
public U visit(Activity element); public default U visitAction(Action action) {
throw new UnsupportedOperationException(getClass().getName() + " can not handle " + action.getClass());
}
@Override
public default U visitOrder(Order order) {
throw new UnsupportedOperationException(getClass().getName() + " can not handle " + order.getClass());
}
@Override
public default U visitResource(Resource resource) {
throw new UnsupportedOperationException(getClass().getName() + " can not handle " + resource.getClass());
}
} }

View File

@ -1,11 +1,17 @@
package li.strolch.model.visitor; package li.strolch.model.visitor;
import li.strolch.model.activity.Action; import li.strolch.model.Order;
import li.strolch.model.activity.Activity; import li.strolch.model.Resource;
public interface IActivityElementVisitor<T> { public interface IActivityElementVisitor<T> extends StrolchElementVisitor<T> {
public T visit(Activity activity); @Override
public default T visitOrder(Order order) {
throw new UnsupportedOperationException(getClass().getName() + " can not handle " + order.getClass());
}
public T visit(Action action); @Override
public default T visitResource(Resource resource) {
throw new UnsupportedOperationException(getClass().getName() + " can not handle " + resource.getClass());
}
} }

View File

@ -1,29 +0,0 @@
/*
* Copyright 2015 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.visitor;
import li.strolch.model.activity.Activity;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class NoStrategyActivityVisitor implements ActivityVisitor<Activity> {
@Override
public Activity visit(Activity element) {
return element;
}
}

View File

@ -1,29 +0,0 @@
/*
* 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.visitor;
import li.strolch.model.Order;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class NoStrategyOrderVisitor implements OrderVisitor<Order> {
@Override
public Order visit(Order element) {
return element;
}
}

View File

@ -1,29 +0,0 @@
/*
* 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.visitor;
import li.strolch.model.Resource;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class NoStrategyResourceVisitor implements ResourceVisitor<Resource> {
@Override
public Resource visit(Resource element) {
return element;
}
}

View File

@ -1,29 +0,0 @@
/*
* 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.visitor;
import li.strolch.model.StrolchElement;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class NoStrategyVisitor<T extends StrolchElement> implements StrolchElementVisitor<T, T> {
@Override
public T visit(T element) {
return element;
}
}

View File

@ -1,39 +0,0 @@
/*
* 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.visitor;
import java.util.List;
import li.strolch.model.Locator;
import li.strolch.model.Order;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class OrderDeepEqualsVisitor extends StrolchElementDeepEqualsVisitor implements OrderVisitor<List<Locator>> {
private Order srcOrder;
public OrderDeepEqualsVisitor(Order srcOrder) {
this.srcOrder = srcOrder;
}
@Override
public List<Locator> visit(Order dstOrder) {
deepEquals(this.srcOrder, dstOrder);
return getMismatchedLocators();
}
}

View File

@ -15,13 +15,27 @@
*/ */
package li.strolch.model.visitor; package li.strolch.model.visitor;
import li.strolch.model.Order; import li.strolch.model.Resource;
import li.strolch.model.activity.Action;
import li.strolch.model.activity.Activity;
/** /**
* @author Robert von Burg <eitch@eitchnet.ch> * @author Robert von Burg <eitch@eitchnet.ch>
*/ */
public interface OrderVisitor<U> extends StrolchElementVisitor<Order, U> { public interface OrderVisitor<U> extends StrolchElementVisitor<U> {
@Override @Override
public U visit(Order element); public default U visitAction(Action action) {
throw new UnsupportedOperationException(getClass().getName() + " can not handle " + action.getClass());
}
@Override
public default U visitActivity(Activity activity) {
throw new UnsupportedOperationException(getClass().getName() + " can not handle " + activity.getClass());
}
@Override
public default U visitResource(Resource resource) {
throw new UnsupportedOperationException(getClass().getName() + " can not handle " + resource.getClass());
}
} }

View File

@ -1,40 +0,0 @@
/*
* 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.visitor;
import java.util.List;
import li.strolch.model.Locator;
import li.strolch.model.Resource;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class ResourceDeepEqualsVisitor extends StrolchElementDeepEqualsVisitor implements
ResourceVisitor<List<Locator>> {
private Resource srcRes;
public ResourceDeepEqualsVisitor(Resource sourceRes) {
this.srcRes = sourceRes;
}
@Override
public List<Locator> visit(Resource dstRes) {
deepEquals(this.srcRes, dstRes);
return getMismatchedLocators();
}
}

View File

@ -15,14 +15,28 @@
*/ */
package li.strolch.model.visitor; package li.strolch.model.visitor;
import li.strolch.model.Resource; import li.strolch.model.Order;
import li.strolch.model.activity.Action;
import li.strolch.model.activity.Activity;
/** /**
* @author Robert von Burg <eitch@eitchnet.ch> * @author Robert von Burg <eitch@eitchnet.ch>
* @param <U> * @param <U>
*/ */
public interface ResourceVisitor<U> extends StrolchElementVisitor<Resource, U> { public interface ResourceVisitor<U> extends StrolchElementVisitor<U> {
@Override @Override
public U visit(Resource element); public default U visitAction(Action action) {
throw new UnsupportedOperationException(getClass().getName() + " can not handle " + action.getClass());
}
@Override
public default U visitActivity(Activity activity) {
throw new UnsupportedOperationException(getClass().getName() + " can not handle " + activity.getClass());
}
@Override
public default U visitOrder(Order order) {
throw new UnsupportedOperationException(getClass().getName() + " can not handle " + order.getClass());
}
} }

View File

@ -47,11 +47,13 @@ import li.strolch.utils.dbc.DBC;
* *
* @author Robert von Burg <eitch@eitchnet.ch> * @author Robert von Burg <eitch@eitchnet.ch>
*/ */
public class StrolchElementDeepEqualsVisitor { public class StrolchElementDeepEqualsVisitor implements StrolchElementVisitor<List<Locator>> {
private List<Locator> mismatchedLocators; private List<Locator> mismatchedLocators;
private StrolchElement srcElement;
public StrolchElementDeepEqualsVisitor() { public StrolchElementDeepEqualsVisitor(StrolchElement srcElement) {
this.srcElement = srcElement;
this.mismatchedLocators = new ArrayList<>(); this.mismatchedLocators = new ArrayList<>();
} }
@ -335,20 +337,42 @@ public class StrolchElementDeepEqualsVisitor {
} }
public static boolean isEqual(Order srcOrder, Order dstOrder) { public static boolean isEqual(Order srcOrder, Order dstOrder) {
OrderDeepEqualsVisitor visitor = new OrderDeepEqualsVisitor(srcOrder); return srcOrder.accept(new StrolchElementDeepEqualsVisitor(dstOrder)).isEmpty();
visitor.visit(dstOrder);
return visitor.isEqual();
} }
public static boolean isEqual(Resource srcRes, Resource dstRes) { public static boolean isEqual(Resource srcRes, Resource dstRes) {
ResourceDeepEqualsVisitor visitor = new ResourceDeepEqualsVisitor(srcRes); return srcRes.accept(new StrolchElementDeepEqualsVisitor(dstRes)).isEmpty();
visitor.visit(dstRes);
return visitor.isEqual();
} }
public static boolean isEqual(Activity srcAct, Activity dstAct) { public static boolean isEqual(Activity srcAct, Activity dstAct) {
ActivityDeepEqualsVisitor visitor = new ActivityDeepEqualsVisitor(srcAct); return srcAct.accept(new StrolchElementDeepEqualsVisitor(dstAct)).isEmpty();
visitor.visit(dstAct); }
return visitor.isEqual();
@Override
public List<Locator> visitOrder(Order order) {
DBC.PRE.assertEquals("Can't compare apples with pairs =)", this.srcElement.getClass(), order.getClass());
deepEquals((Order) this.srcElement, order);
return getMismatchedLocators();
}
@Override
public List<Locator> visitResource(Resource resource) {
DBC.PRE.assertEquals("Can't compare apples with pairs =)", this.srcElement.getClass(), resource.getClass());
deepEquals((Resource) this.srcElement, resource);
return getMismatchedLocators();
}
@Override
public List<Locator> visitActivity(Activity activity) {
DBC.PRE.assertEquals("Can't compare apples with pairs =)", this.srcElement.getClass(), activity.getClass());
deepEquals((Activity) this.srcElement, activity);
return getMismatchedLocators();
}
@Override
public List<Locator> visitAction(Action action) {
DBC.PRE.assertEquals("Can't compare apples with pairs =)", this.srcElement.getClass(), action.getClass());
deepEquals((Action) this.srcElement, action);
return getMismatchedLocators();
} }
} }

View File

@ -15,12 +15,33 @@
*/ */
package li.strolch.model.visitor; package li.strolch.model.visitor;
import li.strolch.model.StrolchElement; import li.strolch.model.Order;
import li.strolch.model.Resource;
import li.strolch.model.activity.Action;
import li.strolch.model.activity.Activity;
/** /**
* @author Robert von Burg <eitch@eitchnet.ch> * @author Robert von Burg <eitch@eitchnet.ch>
*/ */
public interface StrolchElementVisitor<T extends StrolchElement, U> extends StrolchVisitor { public interface StrolchElementVisitor<T> extends StrolchVisitor {
public U visit(T element); public T visitOrder(Order order);
public T visitResource(Resource resource);
public T visitActivity(Activity activity);
public T visitAction(Action action);
public default ResourceVisitor<T> asResourceVisitor() {
return resource -> this.visitResource(resource);
}
public default OrderVisitor<T> asOrderVisitor() {
return order -> this.visitOrder(order);
}
public default ActivityVisitor<T> asActivityVisitor() {
return activity -> this.visitActivity(activity);
}
} }

View File

@ -17,16 +17,22 @@ package li.strolch.model.visitor;
import li.strolch.model.Order; import li.strolch.model.Order;
import li.strolch.model.Resource; import li.strolch.model.Resource;
import li.strolch.model.activity.Action;
import li.strolch.model.activity.Activity; import li.strolch.model.activity.Activity;
/** /**
* @author Robert von Burg <eitch@eitchnet.ch> * @author Robert von Burg <eitch@eitchnet.ch>
*/ */
public interface StrolchRootElementVisitor<T> extends StrolchVisitor { public interface StrolchRootElementVisitor<T> extends StrolchElementVisitor<T> {
public T visitOrder(Order order); public T visitOrder(Order order);
public T visitResource(Resource resource); public T visitResource(Resource resource);
public T visitActivity(Activity activity); public T visitActivity(Activity activity);
@Override
public default T visitAction(Action action) {
throw new UnsupportedOperationException(getClass().getName() + " can not handle " + action.getClass());
}
} }

View File

@ -96,9 +96,7 @@ import li.strolch.model.timevalue.IValueChange;
import li.strolch.model.timevalue.impl.BooleanValue; import li.strolch.model.timevalue.impl.BooleanValue;
import li.strolch.model.timevalue.impl.IntegerValue; import li.strolch.model.timevalue.impl.IntegerValue;
import li.strolch.model.timevalue.impl.ValueChange; import li.strolch.model.timevalue.impl.ValueChange;
import li.strolch.model.visitor.ActivityDeepEqualsVisitor; import li.strolch.model.visitor.StrolchElementDeepEqualsVisitor;
import li.strolch.model.visitor.OrderDeepEqualsVisitor;
import li.strolch.model.visitor.ResourceDeepEqualsVisitor;
@SuppressWarnings("nls") @SuppressWarnings("nls")
public class ModelTest { public class ModelTest {
@ -242,18 +240,18 @@ public class ModelTest {
public void shouldPerformDeepActivityEquals() { public void shouldPerformDeepActivityEquals() {
Activity srcActivity = createActivity("@act01", "Test Activity", "MyType", TimeOrdering.SERIES); Activity srcActivity = createActivity("@act01", "Test Activity", "MyType", TimeOrdering.SERIES);
Activity dstActivity = createActivity("@act01", "Test Activity", "MyType", TimeOrdering.SERIES); Activity dstActivity = createActivity("@act01", "Test Activity", "MyType", TimeOrdering.SERIES);
ActivityDeepEqualsVisitor visitor = new ActivityDeepEqualsVisitor(srcActivity); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(srcActivity);
visitor.visit(dstActivity); List<Locator> mismatches = dstActivity.accept(visitor);
assertTrue("Same Activity should be deep equal!", visitor.isEqual()); assertTrue("Same Activity should be deep equal!", mismatches.isEmpty());
} }
@Test @Test
public void shouldPerformActivityClone() { public void shouldPerformActivityClone() {
Activity srcActivity = createActivity("@act01", "Test Activity", "MyType", TimeOrdering.SERIES); Activity srcActivity = createActivity("@act01", "Test Activity", "MyType", TimeOrdering.SERIES);
Activity dstActivity = srcActivity.getClone(); Activity dstActivity = srcActivity.getClone();
ActivityDeepEqualsVisitor visitor = new ActivityDeepEqualsVisitor(srcActivity); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(srcActivity);
visitor.visit(dstActivity); List<Locator> mismatches = dstActivity.accept(visitor);
assertTrue("Cloned Activity should be deep equal: " + visitor.getMismatchedLocators(), visitor.isEqual()); assertTrue("Cloned Activity should be deep equal: " + mismatches, mismatches.isEmpty());
} }
@Test @Test
@ -267,10 +265,10 @@ public class ModelTest {
FloatParameter fParam = bag.getParameter(PARAM_FLOAT_ID); FloatParameter fParam = bag.getParameter(PARAM_FLOAT_ID);
fParam.setValue(23434234.234); fParam.setValue(23434234.234);
fParam.setName("Ohla"); fParam.setName("Ohla");
ActivityDeepEqualsVisitor visitor = new ActivityDeepEqualsVisitor(srcActivity); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(srcActivity);
visitor.visit(dstActivity); List<Locator> mismatches = dstActivity.accept(visitor);
assertFalse("Activity should not be same if something has been changed", visitor.isEqual()); assertFalse("Activity should not be same if something has been changed", mismatches.isEmpty());
assertEquals("Multiple changes should be registered", 6, visitor.getMismatchedLocators().size()); assertEquals("Multiple changes should be registered", 6, mismatches.size());
} }
@Test @Test
@ -297,28 +295,28 @@ public class ModelTest {
action = activity.getElement("action1_" + "@act01"); action = activity.getElement("action1_" + "@act01");
action.addChange(new ValueChange<>(1234567890L, new IntegerValue(12345), STATE_INTEGER_ID)); action.addChange(new ValueChange<>(1234567890L, new IntegerValue(12345), STATE_INTEGER_ID));
ActivityDeepEqualsVisitor visitor = new ActivityDeepEqualsVisitor(srcActivity); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(srcActivity);
visitor.visit(dstActivity); List<Locator> mismatches = dstActivity.accept(visitor);
assertFalse("Activity should not be same if something has been changed", visitor.isEqual()); assertFalse("Activity should not be same if something has been changed", mismatches.isEmpty());
assertEquals("Multiple changes should be registered", 9, visitor.getMismatchedLocators().size()); assertEquals("Multiple changes should be registered", 9, mismatches.size());
} }
@Test @Test
public void shouldPerformDeepResourceEquals() { public void shouldPerformDeepResourceEquals() {
Resource srcRes = createResource("@res01", "Test resource", "MyType"); Resource srcRes = createResource("@res01", "Test resource", "MyType");
Resource dstRes = createResource("@res01", "Test resource", "MyType"); Resource dstRes = createResource("@res01", "Test resource", "MyType");
ResourceDeepEqualsVisitor visitor = new ResourceDeepEqualsVisitor(srcRes); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(srcRes);
visitor.visit(dstRes); List<Locator> mismatches = dstRes.accept(visitor);
assertTrue("Same Resource should be deep equal!", visitor.isEqual()); assertTrue("Same Resource should be deep equal!", mismatches.isEmpty());
} }
@Test @Test
public void shouldPerformResourceClone() { public void shouldPerformResourceClone() {
Resource srcRes = createResource("@res01", "Test resource", "MyType"); Resource srcRes = createResource("@res01", "Test resource", "MyType");
Resource dstRes = srcRes.getClone(); Resource dstRes = srcRes.getClone();
ResourceDeepEqualsVisitor visitor = new ResourceDeepEqualsVisitor(srcRes); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(srcRes);
visitor.visit(dstRes); List<Locator> mismatches = dstRes.accept(visitor);
assertTrue("Cloned Resource should be deep equal!", visitor.isEqual()); assertTrue("Cloned Resource should be deep equal!", mismatches.isEmpty());
} }
@Test @Test
@ -330,10 +328,10 @@ public class ModelTest {
FloatParameter fParam = bag.getParameter(PARAM_FLOAT_ID); FloatParameter fParam = bag.getParameter(PARAM_FLOAT_ID);
fParam.setValue(23434234.234); fParam.setValue(23434234.234);
fParam.setName("Ohla"); fParam.setName("Ohla");
ResourceDeepEqualsVisitor visitor = new ResourceDeepEqualsVisitor(srcRes); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(srcRes);
visitor.visit(dstRes); List<Locator> mismatches = dstRes.accept(visitor);
assertFalse("Resource should not be same if param is changed!", visitor.isEqual()); assertFalse("Resource should not be same if param is changed!", mismatches.isEmpty());
assertEquals("Multiple changes should be registered", 3, visitor.getMismatchedLocators().size()); assertEquals("Multiple changes should be registered", 3, mismatches.size());
} }
@Test @Test
@ -343,10 +341,10 @@ public class ModelTest {
BooleanTimedState timedState = dstRes.getTimedState(STATE_BOOLEAN_ID); BooleanTimedState timedState = dstRes.getTimedState(STATE_BOOLEAN_ID);
timedState.applyChange(new ValueChange<>(System.currentTimeMillis(), new BooleanValue(Boolean.FALSE))); timedState.applyChange(new ValueChange<>(System.currentTimeMillis(), new BooleanValue(Boolean.FALSE)));
timedState.setName("Ohla"); timedState.setName("Ohla");
ResourceDeepEqualsVisitor visitor = new ResourceDeepEqualsVisitor(srcRes); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(srcRes);
visitor.visit(dstRes); List<Locator> mismatches = dstRes.accept(visitor);
assertFalse("Resource should not be same if param is changed!", visitor.isEqual()); assertFalse("Resource should not be same if param is changed!", visitor.isEqual());
assertEquals("Multiple change should be registered!", 2, visitor.getMismatchedLocators().size()); assertEquals("Multiple change should be registered!", 2, mismatches.size());
} }
@Test @Test
@ -354,9 +352,9 @@ public class ModelTest {
Date date = new Date(); Date date = new Date();
Order srcOrder = createOrder("@ord01", "Test Order", "MyType", date, State.CREATED); Order srcOrder = createOrder("@ord01", "Test Order", "MyType", date, State.CREATED);
Order dstOrder = createOrder("@ord01", "Test Order", "MyType", date, State.CREATED); Order dstOrder = createOrder("@ord01", "Test Order", "MyType", date, State.CREATED);
OrderDeepEqualsVisitor visitor = new OrderDeepEqualsVisitor(srcOrder); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(srcOrder);
visitor.visit(dstOrder); List<Locator> mismatches = dstOrder.accept(visitor);
assertTrue("Same Order should be deep equal: " + visitor.getMismatchedLocators(), visitor.isEqual()); assertTrue("Same Order should be deep equal: " + mismatches, visitor.isEqual());
} }
@Test @Test
@ -364,9 +362,9 @@ public class ModelTest {
Date date = new Date(); Date date = new Date();
Order srcOrder = createOrder("@ord01", "Test Order", "MyType", date, State.CREATED); Order srcOrder = createOrder("@ord01", "Test Order", "MyType", date, State.CREATED);
Order dstOrder = srcOrder.getClone(); Order dstOrder = srcOrder.getClone();
OrderDeepEqualsVisitor visitor = new OrderDeepEqualsVisitor(srcOrder); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(srcOrder);
visitor.visit(dstOrder); List<Locator> mismatches = dstOrder.accept(visitor);
assertTrue("Cloned Order should be deep equal: " + visitor.getMismatchedLocators(), visitor.isEqual()); assertTrue("Cloned Order should be deep equal: " + mismatches, visitor.isEqual());
} }
@Test @Test
@ -381,10 +379,10 @@ public class ModelTest {
FloatParameter fParam = bag.getParameter(PARAM_FLOAT_ID); FloatParameter fParam = bag.getParameter(PARAM_FLOAT_ID);
fParam.setValue(23434234.234); fParam.setValue(23434234.234);
fParam.setName("Ohla"); fParam.setName("Ohla");
OrderDeepEqualsVisitor visitor = new OrderDeepEqualsVisitor(srcOrder); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(srcOrder);
visitor.visit(dstOrder); List<Locator> mismatches = dstOrder.accept(visitor);
assertFalse("Order should not be same if something has been changed", visitor.isEqual()); assertFalse("Order should not be same if something has been changed", visitor.isEqual());
assertEquals("Multiple changes should be registered", 5, visitor.getMismatchedLocators().size()); assertEquals("Multiple changes should be registered", 5, mismatches.size());
} }
public static void validateBag(ParameterBag bag) { public static void validateBag(ParameterBag bag) {

View File

@ -17,12 +17,12 @@ package li.strolch.model;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import java.util.List;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import li.strolch.model.activity.Activity; import li.strolch.model.activity.Activity;
import li.strolch.model.visitor.ActivityDeepEqualsVisitor; import li.strolch.model.visitor.StrolchElementDeepEqualsVisitor;
import li.strolch.model.visitor.OrderDeepEqualsVisitor;
import li.strolch.model.visitor.ResourceDeepEqualsVisitor;
import li.strolch.model.xml.ActivityFromDomVisitor; import li.strolch.model.xml.ActivityFromDomVisitor;
import li.strolch.model.xml.OrderFromDomVisitor; import li.strolch.model.xml.OrderFromDomVisitor;
import li.strolch.model.xml.ResourceFromDomVisitor; import li.strolch.model.xml.ResourceFromDomVisitor;
@ -40,10 +40,9 @@ public class ModelToDomTest extends ModelMarshallingTest {
Resource parsedResource = new ResourceFromDomVisitor().visit(document); Resource parsedResource = new ResourceFromDomVisitor().visit(document);
ResourceDeepEqualsVisitor visitor = new ResourceDeepEqualsVisitor(resource); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(resource);
visitor.visit(parsedResource); List<Locator> mismatches = parsedResource.accept(visitor);
assertTrue("To DOM and back should equal same Resource:\n" + visitor.getMismatchedLocators(), assertTrue("To DOM and back should equal same Resource:\n" + mismatches, mismatches.isEmpty());
visitor.isEqual());
return parsedResource; return parsedResource;
} }
@ -54,9 +53,9 @@ public class ModelToDomTest extends ModelMarshallingTest {
Order parsedOrder = new OrderFromDomVisitor().visit(document); Order parsedOrder = new OrderFromDomVisitor().visit(document);
OrderDeepEqualsVisitor visitor = new OrderDeepEqualsVisitor(order); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(order);
visitor.visit(parsedOrder); List<Locator> mismatches = parsedOrder.accept(visitor);
assertTrue("To DOM and back should equal same Order:\n" + visitor.getMismatchedLocators(), visitor.isEqual()); assertTrue("To DOM and back should equal same Order:\n" + mismatches, mismatches.isEmpty());
return parsedOrder; return parsedOrder;
} }
@ -67,10 +66,9 @@ public class ModelToDomTest extends ModelMarshallingTest {
Activity parsedActivity = new ActivityFromDomVisitor().visit(document); Activity parsedActivity = new ActivityFromDomVisitor().visit(document);
ActivityDeepEqualsVisitor visitor = new ActivityDeepEqualsVisitor(activity); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(activity);
visitor.visit(parsedActivity); List<Locator> mismatches = parsedActivity.accept(visitor);
assertTrue("To DOM and back should equal same Activity:\n" + visitor.getMismatchedLocators(), assertTrue("To DOM and back should equal same Activity:\n" + mismatches, mismatches.isEmpty());
visitor.isEqual());
return parsedActivity; return parsedActivity;
} }

View File

@ -17,32 +17,29 @@ package li.strolch.model;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import java.util.List;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import li.strolch.model.activity.Activity; import li.strolch.model.activity.Activity;
import li.strolch.model.json.ActivityFromJsonVisitor; import li.strolch.model.json.ActivityFromJsonVisitor;
import li.strolch.model.json.ActivityToJsonVisitor;
import li.strolch.model.json.OrderFromJsonVisitor; import li.strolch.model.json.OrderFromJsonVisitor;
import li.strolch.model.json.OrderToJsonVisitor;
import li.strolch.model.json.ResourceFromJsonVisitor; import li.strolch.model.json.ResourceFromJsonVisitor;
import li.strolch.model.json.ResourceToJsonVisitor; import li.strolch.model.json.StrolchElementToJsonVisitor;
import li.strolch.model.visitor.ActivityDeepEqualsVisitor; import li.strolch.model.visitor.StrolchElementDeepEqualsVisitor;
import li.strolch.model.visitor.OrderDeepEqualsVisitor;
import li.strolch.model.visitor.ResourceDeepEqualsVisitor;
public class ModelToJsonTest extends ModelMarshallingTest { public class ModelToJsonTest extends ModelMarshallingTest {
@Override @Override
protected Order formatAndParseOrder(Order order) { protected Order formatAndParseOrder(Order order) {
OrderToJsonVisitor jsonVisitor = new OrderToJsonVisitor(); StrolchElementToJsonVisitor jsonVisitor = new StrolchElementToJsonVisitor().withVersion();
jsonVisitor.visit(order); JsonObject jsonObject = order.accept(jsonVisitor);
JsonObject jsonObject = jsonVisitor.getJsonObject();
Order parsedOrder = new OrderFromJsonVisitor().visit(jsonObject); Order parsedOrder = new OrderFromJsonVisitor().visit(jsonObject);
OrderDeepEqualsVisitor visitor = new OrderDeepEqualsVisitor(order); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(order);
visitor.visit(parsedOrder); List<Locator> mismatches = parsedOrder.accept(visitor);
assertTrue("To JSON and back should equal same Order:\n" + visitor.getMismatchedLocators(), visitor.isEqual()); assertTrue("To JSON and back should equal same Order:\n" + mismatches, mismatches.isEmpty());
return parsedOrder; return parsedOrder;
} }
@ -50,16 +47,14 @@ public class ModelToJsonTest extends ModelMarshallingTest {
@Override @Override
protected Resource formatAndParseResource(Resource resource) { protected Resource formatAndParseResource(Resource resource) {
ResourceToJsonVisitor jsonVisitor = new ResourceToJsonVisitor(); StrolchElementToJsonVisitor jsonVisitor = new StrolchElementToJsonVisitor().withVersion();
jsonVisitor.visit(resource); JsonObject jsonObject = resource.accept(jsonVisitor);
JsonObject jsonObject = jsonVisitor.getJsonObject();
Resource parsedResource = new ResourceFromJsonVisitor().visit(jsonObject); Resource parsedResource = new ResourceFromJsonVisitor().visit(jsonObject);
ResourceDeepEqualsVisitor visitor = new ResourceDeepEqualsVisitor(resource); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(resource);
visitor.visit(parsedResource); List<Locator> mismatches = parsedResource.accept(visitor);
assertTrue("To JSON and back should equal same Resource:\n" + visitor.getMismatchedLocators(), assertTrue("To JSON and back should equal same Resource:\n" + mismatches, mismatches.isEmpty());
visitor.isEqual());
return parsedResource; return parsedResource;
} }
@ -67,16 +62,14 @@ public class ModelToJsonTest extends ModelMarshallingTest {
@Override @Override
protected Activity formatAndParseActivity(Activity activity) { protected Activity formatAndParseActivity(Activity activity) {
ActivityToJsonVisitor jsonVisitor = new ActivityToJsonVisitor(); StrolchElementToJsonVisitor jsonVisitor = new StrolchElementToJsonVisitor().withVersion();
jsonVisitor.visit(activity); JsonObject jsonObject = activity.accept(jsonVisitor);
JsonObject jsonObject = jsonVisitor.getJsonObject();
Activity parsedActivity = new ActivityFromJsonVisitor().visit(jsonObject); Activity parsedActivity = new ActivityFromJsonVisitor().visit(jsonObject);
ActivityDeepEqualsVisitor visitor = new ActivityDeepEqualsVisitor(activity); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(activity);
visitor.visit(parsedActivity); List<Locator> mismatches = parsedActivity.accept(visitor);
assertTrue("To JSON and back should equal same Activity:\n" + visitor.getMismatchedLocators(), assertTrue("To JSON and back should equal same Activity:\n" + mismatches, mismatches.isEmpty());
visitor.isEqual());
return parsedActivity; return parsedActivity;
} }

View File

@ -19,11 +19,10 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import li.strolch.model.activity.Activity; import li.strolch.model.activity.Activity;
import li.strolch.model.visitor.ActivityDeepEqualsVisitor; import li.strolch.model.visitor.StrolchElementDeepEqualsVisitor;
import li.strolch.model.visitor.OrderDeepEqualsVisitor;
import li.strolch.model.visitor.ResourceDeepEqualsVisitor;
import li.strolch.model.xml.SimpleStrolchElementListener; import li.strolch.model.xml.SimpleStrolchElementListener;
import li.strolch.model.xml.StrolchElementToSaxVisitor; import li.strolch.model.xml.StrolchElementToSaxVisitor;
import li.strolch.model.xml.XmlModelSaxReader; import li.strolch.model.xml.XmlModelSaxReader;
@ -47,9 +46,9 @@ public class ModelToSaxTest extends ModelMarshallingTest {
assertEquals(Collections.emptyList(), listener.getActivities()); assertEquals(Collections.emptyList(), listener.getActivities());
Order parsedOrder = listener.getOrders().get(0); Order parsedOrder = listener.getOrders().get(0);
OrderDeepEqualsVisitor visitor = new OrderDeepEqualsVisitor(order); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(order);
visitor.visit(parsedOrder); List<Locator> mismatches = parsedOrder.accept(visitor);
assertTrue("To DOM and back should equal same Order:\n" + visitor.getMismatchedLocators(), visitor.isEqual()); assertTrue("To DOM and back should equal same Order:\n" + mismatches, mismatches.isEmpty());
return parsedOrder; return parsedOrder;
} }
@ -67,10 +66,9 @@ public class ModelToSaxTest extends ModelMarshallingTest {
assertEquals(Collections.emptyList(), listener.getOrders()); assertEquals(Collections.emptyList(), listener.getOrders());
Resource parsedResource = listener.getResources().get(0); Resource parsedResource = listener.getResources().get(0);
ResourceDeepEqualsVisitor visitor = new ResourceDeepEqualsVisitor(resource); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(resource);
visitor.visit(parsedResource); List<Locator> mismatches = parsedResource.accept(visitor);
assertTrue("To DOM and back should equal same Resource:\n" + visitor.getMismatchedLocators(), assertTrue("To DOM and back should equal same Resource:\n" + mismatches, mismatches.isEmpty());
visitor.isEqual());
return parsedResource; return parsedResource;
} }
@ -88,10 +86,9 @@ public class ModelToSaxTest extends ModelMarshallingTest {
assertEquals(Collections.emptyList(), listener.getOrders()); assertEquals(Collections.emptyList(), listener.getOrders());
Activity parsedActivity = listener.getActivities().get(0); Activity parsedActivity = listener.getActivities().get(0);
ActivityDeepEqualsVisitor visitor = new ActivityDeepEqualsVisitor(activity); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(activity);
visitor.visit(parsedActivity); List<Locator> mismatches = parsedActivity.accept(visitor);
assertTrue("To DOM and back should equal same Activity:\n" + visitor.getMismatchedLocators(), assertTrue("To DOM and back should equal same Activity:\n" + mismatches, mismatches.isEmpty());
visitor.isEqual());
return parsedActivity; return parsedActivity;
} }

View File

@ -21,13 +21,12 @@ import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import javax.xml.stream.XMLStreamWriter; import javax.xml.stream.XMLStreamWriter;
import li.strolch.model.activity.Activity; import li.strolch.model.activity.Activity;
import li.strolch.model.visitor.ActivityDeepEqualsVisitor; import li.strolch.model.visitor.StrolchElementDeepEqualsVisitor;
import li.strolch.model.visitor.OrderDeepEqualsVisitor;
import li.strolch.model.visitor.ResourceDeepEqualsVisitor;
import li.strolch.model.xml.SimpleStrolchElementListener; import li.strolch.model.xml.SimpleStrolchElementListener;
import li.strolch.model.xml.StrolchElementToSaxWriterVisitor; import li.strolch.model.xml.StrolchElementToSaxWriterVisitor;
import li.strolch.model.xml.StrolchXmlHelper; import li.strolch.model.xml.StrolchXmlHelper;
@ -57,9 +56,9 @@ public class ModelToSaxWriterTest extends ModelMarshallingTest {
assertEquals(Collections.emptyList(), listener.getActivities()); assertEquals(Collections.emptyList(), listener.getActivities());
Order parsedOrder = listener.getOrders().get(0); Order parsedOrder = listener.getOrders().get(0);
OrderDeepEqualsVisitor visitor = new OrderDeepEqualsVisitor(order); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(order);
visitor.visit(parsedOrder); List<Locator> mismatches = parsedOrder.accept(visitor);
assertTrue("To DOM and back should equal same Order:\n" + visitor.getMismatchedLocators(), visitor.isEqual()); assertTrue("To DOM and back should equal same Order:\n" + mismatches, mismatches.isEmpty());
return parsedOrder; return parsedOrder;
} }
@ -82,10 +81,9 @@ public class ModelToSaxWriterTest extends ModelMarshallingTest {
assertEquals(Collections.emptyList(), listener.getOrders()); assertEquals(Collections.emptyList(), listener.getOrders());
Resource parsedResource = listener.getResources().get(0); Resource parsedResource = listener.getResources().get(0);
ResourceDeepEqualsVisitor visitor = new ResourceDeepEqualsVisitor(resource); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(resource);
visitor.visit(parsedResource); List<Locator> mismatches = parsedResource.accept(visitor);
assertTrue("To DOM and back should equal same Resource:\n" + visitor.getMismatchedLocators(), assertTrue("To DOM and back should equal same Resource:\n" + mismatches, mismatches.isEmpty());
visitor.isEqual());
return parsedResource; return parsedResource;
} }
@ -110,10 +108,9 @@ public class ModelToSaxWriterTest extends ModelMarshallingTest {
assertEquals(Collections.emptyList(), listener.getOrders()); assertEquals(Collections.emptyList(), listener.getOrders());
Activity parsedActivity = listener.getActivities().get(0); Activity parsedActivity = listener.getActivities().get(0);
ActivityDeepEqualsVisitor visitor = new ActivityDeepEqualsVisitor(activity); StrolchElementDeepEqualsVisitor visitor = new StrolchElementDeepEqualsVisitor(activity);
visitor.visit(parsedActivity); List<Locator> mismatches = parsedActivity.accept(visitor);
assertTrue("To DOM and back should equal same Activity:\n" + visitor.getMismatchedLocators(), assertTrue("To DOM and back should equal same Activity:\n" + mismatches, mismatches.isEmpty());
visitor.isEqual());
return parsedActivity; return parsedActivity;
} }

View File

@ -249,7 +249,7 @@ public class PostgreSqlActivityDao extends PostgresqlDao<Activity> implements Ac
String id = result.getString("id"); String id = result.getString("id");
SQLXML sqlxml = result.getSQLXML("asxml"); SQLXML sqlxml = result.getSQLXML("asxml");
Activity t = parseFromXml(id, queryVisitor.getType(), sqlxml); Activity t = parseFromXml(id, queryVisitor.getType(), sqlxml);
list.add(query.getActivityVisitor().visit(t)); list.add(t.accept(query.getActivityVisitor()));
} }
} }
} catch (SQLException e) { } catch (SQLException e) {

View File

@ -249,7 +249,7 @@ public class PostgreSqlOrderDao extends PostgresqlDao<Order> implements OrderDao
String id = result.getString("id"); String id = result.getString("id");
SQLXML sqlxml = result.getSQLXML("asxml"); SQLXML sqlxml = result.getSQLXML("asxml");
Order t = parseFromXml(id, queryVisitor.getType(), sqlxml); Order t = parseFromXml(id, queryVisitor.getType(), sqlxml);
list.add(query.getOrderVisitor().visit(t)); list.add(t.accept(query.getOrderVisitor()));
} }
} }
} catch (SQLException e) { } catch (SQLException e) {

View File

@ -241,7 +241,7 @@ public class PostgreSqlResourceDao extends PostgresqlDao<Resource> implements Re
String id = result.getString("id"); String id = result.getString("id");
SQLXML sqlxml = result.getSQLXML("asxml"); SQLXML sqlxml = result.getSQLXML("asxml");
Resource t = parseFromXml(id, queryVisitor.getType(), sqlxml); Resource t = parseFromXml(id, queryVisitor.getType(), sqlxml);
list.add(query.getResourceVisitor().visit(t)); list.add(t.accept(query.getResourceVisitor()));
} }
} }
} catch (SQLException e) { } catch (SQLException e) {

View File

@ -53,9 +53,7 @@ import li.strolch.model.Order;
import li.strolch.model.Resource; import li.strolch.model.Resource;
import li.strolch.model.Tags; import li.strolch.model.Tags;
import li.strolch.model.activity.Activity; import li.strolch.model.activity.Activity;
import li.strolch.model.json.ActivityToJsonVisitor; import li.strolch.model.json.StrolchElementToJsonVisitor;
import li.strolch.model.json.OrderToJsonVisitor;
import li.strolch.model.json.ResourceToJsonVisitor;
import li.strolch.model.query.ActivityQuery; import li.strolch.model.query.ActivityQuery;
import li.strolch.model.query.OrderQuery; import li.strolch.model.query.OrderQuery;
import li.strolch.model.query.ResourceQuery; import li.strolch.model.query.ResourceQuery;
@ -391,7 +389,7 @@ public class Inspector {
RestfulHelper.doOrdering(queryData, resources); RestfulHelper.doOrdering(queryData, resources);
// build JSON response // build JSON response
ResourceToJsonVisitor toJsonVisitor = new ResourceToJsonVisitor(); StrolchElementToJsonVisitor toJsonVisitor = new StrolchElementToJsonVisitor();
JsonObject root = RestfulHelper.toJson(queryData, dataSetSize, resources, toJsonVisitor); JsonObject root = RestfulHelper.toJson(queryData, dataSetSize, resources, toJsonVisitor);
// marshall result // marshall result
@ -441,7 +439,7 @@ public class Inspector {
RestfulHelper.doOrdering(queryData, orders); RestfulHelper.doOrdering(queryData, orders);
// build JSON response // build JSON response
OrderToJsonVisitor toJsonVisitor = new OrderToJsonVisitor(); StrolchElementToJsonVisitor toJsonVisitor = new StrolchElementToJsonVisitor();
JsonObject root = RestfulHelper.toJson(queryData, dataSetSize, orders, toJsonVisitor); JsonObject root = RestfulHelper.toJson(queryData, dataSetSize, orders, toJsonVisitor);
// marshall result // marshall result
@ -477,7 +475,7 @@ public class Inspector {
RestfulHelper.doOrdering(queryData, activities); RestfulHelper.doOrdering(queryData, activities);
// build JSON response // build JSON response
ActivityToJsonVisitor toJsonVisitor = new ActivityToJsonVisitor(); StrolchElementToJsonVisitor toJsonVisitor = new StrolchElementToJsonVisitor();
JsonObject root = RestfulHelper.toJson(queryData, dataSetSize, activities, toJsonVisitor); JsonObject root = RestfulHelper.toJson(queryData, dataSetSize, activities, toJsonVisitor);
// marshall result // marshall result
@ -502,7 +500,8 @@ public class Inspector {
throw new StrolchException(MessageFormat.format("No Resource exists for {0}/{1}", type, id)); //$NON-NLS-1$ throw new StrolchException(MessageFormat.format("No Resource exists for {0}/{1}", type, id)); //$NON-NLS-1$
} }
return Response.ok().entity(ResourceToJsonVisitor.toJsonString(resource)).build(); StrolchElementToJsonVisitor visitor = new StrolchElementToJsonVisitor();
return Response.ok().entity(resource.accept(visitor)).build();
} }
@GET @GET
@ -584,7 +583,8 @@ public class Inspector {
throw new StrolchException(MessageFormat.format("No Order exists for {0}/{1}", type, id)); //$NON-NLS-1$ throw new StrolchException(MessageFormat.format("No Order exists for {0}/{1}", type, id)); //$NON-NLS-1$
} }
return Response.ok().entity(OrderToJsonVisitor.toJsonString(order)).build(); StrolchElementToJsonVisitor visitor = new StrolchElementToJsonVisitor();
return Response.ok().entity(order.accept(visitor)).build();
} }
@GET @GET
@ -684,7 +684,8 @@ public class Inspector {
throw new StrolchException(MessageFormat.format("No Activity exists for {0}/{1}", type, id)); //$NON-NLS-1$ throw new StrolchException(MessageFormat.format("No Activity exists for {0}/{1}", type, id)); //$NON-NLS-1$
} }
return Response.ok().entity(ActivityToJsonVisitor.toJsonString(activity)).build(); StrolchElementToJsonVisitor visitor = new StrolchElementToJsonVisitor();
return Response.ok().entity(activity.accept(visitor)).build();
} }
@GET @GET

View File

@ -23,9 +23,7 @@ import li.strolch.agent.api.ResourceMap;
import li.strolch.model.Order; import li.strolch.model.Order;
import li.strolch.model.Resource; import li.strolch.model.Resource;
import li.strolch.model.activity.Activity; import li.strolch.model.activity.Activity;
import li.strolch.model.json.ActivityToJsonVisitor; import li.strolch.model.json.StrolchElementToJsonVisitor;
import li.strolch.model.json.OrderToJsonVisitor;
import li.strolch.model.json.ResourceToJsonVisitor;
import li.strolch.model.query.ActivityQuery; import li.strolch.model.query.ActivityQuery;
import li.strolch.model.query.OrderQuery; import li.strolch.model.query.OrderQuery;
import li.strolch.model.query.ResourceQuery; import li.strolch.model.query.ResourceQuery;
@ -87,8 +85,8 @@ public class ModelQuery {
RestfulHelper.doOrdering(queryData, resources); RestfulHelper.doOrdering(queryData, resources);
// build JSON response // build JSON response
ResourceToJsonVisitor toJsonVisitor = new ResourceToJsonVisitor(); StrolchElementToJsonVisitor visitor = new StrolchElementToJsonVisitor();
JsonObject root = RestfulHelper.toJson(queryData, dataSetSize, resources, toJsonVisitor); JsonObject root = RestfulHelper.toJson(queryData, dataSetSize, resources, visitor);
// marshall result // marshall result
Gson gson = new GsonBuilder().setPrettyPrinting().create(); Gson gson = new GsonBuilder().setPrettyPrinting().create();
@ -142,8 +140,8 @@ public class ModelQuery {
RestfulHelper.doOrdering(queryData, orders); RestfulHelper.doOrdering(queryData, orders);
// build JSON response // build JSON response
OrderToJsonVisitor toJsonVisitor = new OrderToJsonVisitor(); StrolchElementToJsonVisitor visitor = new StrolchElementToJsonVisitor();
JsonObject root = RestfulHelper.toJson(queryData, dataSetSize, orders, toJsonVisitor); JsonObject root = RestfulHelper.toJson(queryData, dataSetSize, orders, visitor);
// marshall result // marshall result
Gson gson = new GsonBuilder().setPrettyPrinting().create(); Gson gson = new GsonBuilder().setPrettyPrinting().create();
@ -198,8 +196,8 @@ public class ModelQuery {
RestfulHelper.doOrdering(queryData, activities); RestfulHelper.doOrdering(queryData, activities);
// build JSON response // build JSON response
ActivityToJsonVisitor toJsonVisitor = new ActivityToJsonVisitor(); StrolchElementToJsonVisitor visitor = new StrolchElementToJsonVisitor();
JsonObject root = RestfulHelper.toJson(queryData, dataSetSize, activities, toJsonVisitor); JsonObject root = RestfulHelper.toJson(queryData, dataSetSize, activities, visitor);
// marshall result // marshall result
Gson gson = new GsonBuilder().setPrettyPrinting().create(); Gson gson = new GsonBuilder().setPrettyPrinting().create();

View File

@ -57,7 +57,7 @@ public class RestfulHelper {
} }
public static <T extends StrolchRootElement> JsonObject toJson(QueryData queryData, long dataSetSize, public static <T extends StrolchRootElement> JsonObject toJson(QueryData queryData, long dataSetSize,
List<T> elements, StrolchElementVisitor<T, JsonObject> toJsonVisitor) { List<T> elements, StrolchElementVisitor<JsonObject> toJsonVisitor) {
// paging // paging
Paging<T> paging = Paging.asPage(elements, queryData.getOffset(), queryData.getLimit()); Paging<T> paging = Paging.asPage(elements, queryData.getOffset(), queryData.getLimit());
@ -83,7 +83,7 @@ public class RestfulHelper {
// add items // add items
JsonArray data = new JsonArray(); JsonArray data = new JsonArray();
for (T t : page) { for (T t : page) {
JsonObject element = toJsonVisitor.visit(t); JsonObject element = t.accept(toJsonVisitor);
data.add(element); data.add(element);
} }
root.add("data", data); root.add("data", data);

View File

@ -119,13 +119,13 @@ public abstract class ExecutionCommand extends Command implements TimeOrderingVi
} }
@Override @Override
public Void visit(Activity activity) { public Void visitActivity(Activity activity) {
activity.getTimeOrdering().accept(this, activity); activity.getTimeOrdering().accept(this, activity);
return null; return null;
} }
@Override @Override
public Void visit(Action action) { public Void visitAction(Action action) {
ExecutionPolicy executionPolicy = getExecutionPolicy(action); ExecutionPolicy executionPolicy = getExecutionPolicy(action);
if (executionPolicy.isExecutable(action)) { if (executionPolicy.isExecutable(action)) {