[New] New classes to flat map elements to/from Json

This commit is contained in:
Robert von Burg 2016-08-26 16:43:36 +02:00
parent d2de579b84
commit 313eaf0026
5 changed files with 213 additions and 0 deletions

View File

@ -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<JsonObject> {
@Override
public JsonObject visit(Activity element) {
return toJson(element);
}
}

View File

@ -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;
/**
* <p>
* 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}.
* </p>
*
* <p>
* 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.
* </p>
*
* @author Robert von Burg <eitch@eitchnet.ch>
*
* @param <T>
*/
public class FromFlatJsonVisitor<T extends StrolchRootElement> {
private MapOfSets<String, String> ignoredKeys;
public FromFlatJsonVisitor() {
this.ignoredKeys = new MapOfSets<>();
}
public FromFlatJsonVisitor(MapOfSets<String, String> 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<String> bagKeySet = element.getParameterBagKeySet();
for (String bagId : bagKeySet) {
// see if we have to ignore this bag i.e. empty set existing
Set<String> paramIds = this.ignoredKeys.getSet(bagId);
if (paramIds != null && paramIds.isEmpty())
continue;
ParameterBag parameterBag = element.getParameterBag(bagId);
Set<String> 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());
}
}
}
}

View File

@ -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<JsonObject> {
@Override
public JsonObject visit(Order element) {
return toJson(element);
}
}

View File

@ -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<JsonObject> {
@Override
public JsonObject visit(Resource element) {
return toJson(element);
}
}

View File

@ -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;
/**
* <p>
* Maps a given {@link StrolchRootElement} to a {@link JsonObject}. All {@link Parameter Parameters} are mapped to a
* member of the {@link JsonObject}.
* </p>
*
* <p>
* 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.
* </p>
*
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class ToFlatJsonVisitor {
private MapOfSets<String, String> ignoredKeys;
public ToFlatJsonVisitor() {
this.ignoredKeys = new MapOfSets<>();
}
public ToFlatJsonVisitor(MapOfSets<String, String> 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<String> bagKeySet = element.getParameterBagKeySet();
for (String bagId : bagKeySet) {
// see if we have to ignore this bag i.e. empty set existing
Set<String> paramIds = this.ignoredKeys.getSet(bagId);
if (paramIds != null && paramIds.isEmpty())
continue;
ParameterBag parameterBag = element.getParameterBag(bagId);
Set<String> 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;
}
}