From 313eaf0026549d86fab57c5df2cc40c26c41b1df Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Fri, 26 Aug 2016 16:43:36 +0200 Subject: [PATCH] [New] New classes to flat map elements to/from Json --- .../visitor/ActivityToFlatJsonVisitor.java | 14 +++ .../rest/visitor/FromFlatJsonVisitor.java | 83 +++++++++++++++++ .../rest/visitor/OrderToFlatJsonVisitor.java | 14 +++ .../visitor/ResourceToFlatJsonVisitor.java | 14 +++ .../rest/visitor/ToFlatJsonVisitor.java | 88 +++++++++++++++++++ 5 files changed, 213 insertions(+) create mode 100644 li.strolch.rest/src/main/java/li/strolch/rest/visitor/ActivityToFlatJsonVisitor.java create mode 100644 li.strolch.rest/src/main/java/li/strolch/rest/visitor/FromFlatJsonVisitor.java create mode 100644 li.strolch.rest/src/main/java/li/strolch/rest/visitor/OrderToFlatJsonVisitor.java create mode 100644 li.strolch.rest/src/main/java/li/strolch/rest/visitor/ResourceToFlatJsonVisitor.java create mode 100644 li.strolch.rest/src/main/java/li/strolch/rest/visitor/ToFlatJsonVisitor.java diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/visitor/ActivityToFlatJsonVisitor.java b/li.strolch.rest/src/main/java/li/strolch/rest/visitor/ActivityToFlatJsonVisitor.java new file mode 100644 index 000000000..4c78ce2ed --- /dev/null +++ b/li.strolch.rest/src/main/java/li/strolch/rest/visitor/ActivityToFlatJsonVisitor.java @@ -0,0 +1,14 @@ +package li.strolch.rest.visitor; + +import com.google.gson.JsonObject; + +import li.strolch.model.activity.Activity; +import li.strolch.model.visitor.ActivityVisitor; + +public class ActivityToFlatJsonVisitor extends ToFlatJsonVisitor implements ActivityVisitor { + + @Override + public JsonObject visit(Activity element) { + return toJson(element); + } +} diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/visitor/FromFlatJsonVisitor.java b/li.strolch.rest/src/main/java/li/strolch/rest/visitor/FromFlatJsonVisitor.java new file mode 100644 index 000000000..7ffed4ed5 --- /dev/null +++ b/li.strolch.rest/src/main/java/li/strolch/rest/visitor/FromFlatJsonVisitor.java @@ -0,0 +1,83 @@ +package li.strolch.rest.visitor; + +import java.util.Collections; +import java.util.Set; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +import li.strolch.exception.StrolchModelException; +import li.strolch.model.ParameterBag; +import li.strolch.model.StrolchRootElement; +import li.strolch.model.parameter.Parameter; +import li.strolch.utils.collections.MapOfSets; + +/** + *

+ * Maps a given {@link JsonObject} to a {@link StrolchRootElement}. All {@link Parameter Parameters} on the element are + * iterated expected to be found as a member on the {@link JsonObject}. + *

+ * + *

+ * To not map a {@link Parameter} add it to the {@link MapOfSets}, to ignore a whole {@link ParameterBag} then add an + * empty set with the bag id. + *

+ * + * @author Robert von Burg + * + * @param + */ +public class FromFlatJsonVisitor { + + private MapOfSets ignoredKeys; + + public FromFlatJsonVisitor() { + this.ignoredKeys = new MapOfSets<>(); + } + + public FromFlatJsonVisitor(MapOfSets ignoredParams) { + this.ignoredKeys = new MapOfSets<>(); + } + + public void ignoreBag(String bagId) { + this.ignoredKeys.addSet(bagId, Collections.emptySet()); + } + + public void ignoreParameter(String bagId, String paramId) { + this.ignoredKeys.addElement(bagId, paramId); + } + + public void visit(T element, JsonObject jsonObject) { + + Set bagKeySet = element.getParameterBagKeySet(); + for (String bagId : bagKeySet) { + + // see if we have to ignore this bag i.e. empty set existing + Set paramIds = this.ignoredKeys.getSet(bagId); + if (paramIds != null && paramIds.isEmpty()) + continue; + + ParameterBag parameterBag = element.getParameterBag(bagId); + + Set parameterKeySet = parameterBag.getParameterKeySet(); + for (String paramId : parameterKeySet) { + + // see if this parameter must be ignored + if (paramIds != null && paramIds.contains(paramId)) + continue; + + JsonElement jsonElement = jsonObject.get(paramId); + if (jsonElement == null) + throw new StrolchModelException("JsonObject is missing member with ID " + paramId); + + if (!jsonElement.isJsonPrimitive()) { + throw new StrolchModelException("JsonElement " + paramId + " is not a json primitive but a " + + jsonElement.getClass().getName()); + } + + Parameter parameter = parameterBag.getParameter(paramId); + parameter.setValueFromString(jsonElement.getAsString()); + } + } + } +} diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/visitor/OrderToFlatJsonVisitor.java b/li.strolch.rest/src/main/java/li/strolch/rest/visitor/OrderToFlatJsonVisitor.java new file mode 100644 index 000000000..e9784ec3a --- /dev/null +++ b/li.strolch.rest/src/main/java/li/strolch/rest/visitor/OrderToFlatJsonVisitor.java @@ -0,0 +1,14 @@ +package li.strolch.rest.visitor; + +import com.google.gson.JsonObject; + +import li.strolch.model.Order; +import li.strolch.model.visitor.OrderVisitor; + +public class OrderToFlatJsonVisitor extends ToFlatJsonVisitor implements OrderVisitor { + + @Override + public JsonObject visit(Order element) { + return toJson(element); + } +} diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/visitor/ResourceToFlatJsonVisitor.java b/li.strolch.rest/src/main/java/li/strolch/rest/visitor/ResourceToFlatJsonVisitor.java new file mode 100644 index 000000000..adcdb63e3 --- /dev/null +++ b/li.strolch.rest/src/main/java/li/strolch/rest/visitor/ResourceToFlatJsonVisitor.java @@ -0,0 +1,14 @@ +package li.strolch.rest.visitor; + +import com.google.gson.JsonObject; + +import li.strolch.model.Resource; +import li.strolch.model.visitor.ResourceVisitor; + +public class ResourceToFlatJsonVisitor extends ToFlatJsonVisitor implements ResourceVisitor { + + @Override + public JsonObject visit(Resource element) { + return toJson(element); + } +} diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/visitor/ToFlatJsonVisitor.java b/li.strolch.rest/src/main/java/li/strolch/rest/visitor/ToFlatJsonVisitor.java new file mode 100644 index 000000000..3b9cc0e92 --- /dev/null +++ b/li.strolch.rest/src/main/java/li/strolch/rest/visitor/ToFlatJsonVisitor.java @@ -0,0 +1,88 @@ +package li.strolch.rest.visitor; + +import java.util.Collections; +import java.util.Set; + +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; + +/** + *

+ * Maps a given {@link StrolchRootElement} to a {@link JsonObject}. All {@link Parameter Parameters} are mapped to a + * member of the {@link JsonObject}. + *

+ * + *

+ * To not map a {@link Parameter} add it to the {@link MapOfSets}, to ignore a whole {@link ParameterBag} then add an + * empty set with the bag id. + *

+ * + * @author Robert von Burg + */ +public class ToFlatJsonVisitor { + + private MapOfSets ignoredKeys; + + public ToFlatJsonVisitor() { + this.ignoredKeys = new MapOfSets<>(); + } + + public ToFlatJsonVisitor(MapOfSets ignoredParams) { + this.ignoredKeys = new MapOfSets<>(); + } + + public void ignoreBag(String bagId) { + this.ignoredKeys.addSet(bagId, Collections.emptySet()); + } + + public void ignoreParameter(String bagId, String paramId) { + this.ignoredKeys.addElement(bagId, paramId); + } + + public JsonObject toJson(StrolchRootElement element) { + + JsonObject jsonObject = new JsonObject(); + + Set bagKeySet = element.getParameterBagKeySet(); + for (String bagId : bagKeySet) { + + // see if we have to ignore this bag i.e. empty set existing + Set paramIds = this.ignoredKeys.getSet(bagId); + if (paramIds != null && paramIds.isEmpty()) + continue; + + ParameterBag parameterBag = element.getParameterBag(bagId); + + Set parameterKeySet = parameterBag.getParameterKeySet(); + for (String paramId : parameterKeySet) { + + // see if this parameter must be ignored + if (paramIds != null && paramIds.contains(paramId)) + continue; + + if (jsonObject.has(paramId)) { + throw new StrolchModelException("JsonObject already has a member with ID " + paramId); + } + + 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()); + } + } + } + + return jsonObject; + } +}