diff --git a/remote/src/main/java/tools/vitruv/framework/remote/common/json/JsonDeserializationHelper.java b/remote/src/main/java/tools/vitruv/framework/remote/common/json/JsonDeserializationHelper.java new file mode 100644 index 0000000..9199e26 --- /dev/null +++ b/remote/src/main/java/tools/vitruv/framework/remote/common/json/JsonDeserializationHelper.java @@ -0,0 +1,18 @@ +package tools.vitruv.framework.remote.common.json; + +import java.io.IOException; +import java.util.List; + +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; + +public interface JsonDeserializationHelper { + T deserialize(JsonNode node, Class clazz) throws IOException; + + List deserializeArrayOf(String json, Class clazz) throws JsonProcessingException; + + Resource deserializeResource(String json, String id, ResourceSet set) throws JsonProcessingException; +} diff --git a/remote/src/main/java/tools/vitruv/framework/remote/common/json/JsonMapper.java b/remote/src/main/java/tools/vitruv/framework/remote/common/json/JsonMapper.java index a7c7833..ccdb3a2 100644 --- a/remote/src/main/java/tools/vitruv/framework/remote/common/json/JsonMapper.java +++ b/remote/src/main/java/tools/vitruv/framework/remote/common/json/JsonMapper.java @@ -29,7 +29,7 @@ * This mapper can be used to serialize objects and deserialize JSON in the context of Vitruvius. * It has custom De-/Serializers for {@link ResourceSet}s, {@link Resource}s and {@link VitruviusChange}s. */ -public class JsonMapper { +public class JsonMapper implements JsonDeserializationHelper { private final ObjectMapper mapper = new ObjectMapper(); public JsonMapper(Path vsumPath) { @@ -89,7 +89,7 @@ public T deserialize(String json, Class clazz) throws JsonProcessingExcep * @throws JsonProcessingException If the JSON node cannot be processed. * @throws IOException If there is an IO exception during deserialization. */ - public T deserialize(JsonNode json, Class clazz) throws JsonProcessingException, IOException { + public T deserialize(JsonNode json, Class clazz) throws IOException { return mapper.reader().forType(clazz).readValue(json); } diff --git a/remote/src/main/java/tools/vitruv/framework/remote/common/json/deserializer/VitruviusChangeDeserializer.java b/remote/src/main/java/tools/vitruv/framework/remote/common/json/deserializer/VitruviusChangeDeserializer.java index 299f7d1..dd1f0d4 100644 --- a/remote/src/main/java/tools/vitruv/framework/remote/common/json/deserializer/VitruviusChangeDeserializer.java +++ b/remote/src/main/java/tools/vitruv/framework/remote/common/json/deserializer/VitruviusChangeDeserializer.java @@ -18,33 +18,36 @@ import tools.vitruv.change.interaction.UserInteractionBase; import tools.vitruv.framework.remote.common.json.ChangeType; import tools.vitruv.framework.remote.common.json.IdTransformation; +import tools.vitruv.framework.remote.common.json.JsonDeserializationHelper; import tools.vitruv.framework.remote.common.json.JsonFieldName; -import tools.vitruv.framework.remote.common.json.JsonMapper; import tools.vitruv.framework.remote.common.util.ResourceUtil; public class VitruviusChangeDeserializer extends JsonDeserializer> { - private final IdTransformation transformation; - private final JsonMapper mapper; - - public VitruviusChangeDeserializer(JsonMapper mapper, IdTransformation transformation) { - this.mapper = mapper; - this.transformation = transformation; - } + private final IdTransformation transformation; + private final JsonDeserializationHelper mapper; - @Override + public VitruviusChangeDeserializer(JsonDeserializationHelper mapper, IdTransformation transformation) { + this.mapper = mapper; + this.transformation = transformation; + } + + @Override public VitruviusChange deserialize(JsonParser parser, DeserializationContext context) throws IOException { var rootNode = parser.getCodec().readTree(parser); - var type = ChangeType.valueOf(((TextNode)rootNode.get(JsonFieldName.CHANGE_TYPE)).asText()); + var type = ChangeType.valueOf(((TextNode) rootNode.get(JsonFieldName.CHANGE_TYPE)).asText()); VitruviusChange change; if (type == ChangeType.TRANSACTIONAL) { var resourceNode = rootNode.get(JsonFieldName.E_CHANGES); - var changesResource = mapper.deserializeResource(resourceNode.toString(), JsonFieldName.TEMP_VALUE, ResourceUtil.createJsonResourceSet()); + var changesResource = mapper.deserializeResource(resourceNode.toString(), JsonFieldName.TEMP_VALUE, + ResourceUtil.createJsonResourceSet()); @SuppressWarnings("unchecked") - List> changes = changesResource.getContents().stream().map(e -> (EChange) e).toList(); + List> changes = changesResource.getContents().stream() + .map(e -> (EChange) e).toList(); transformation.allToGlobal(changes); change = VitruviusChangeFactory.getInstance().createTransactionalChange(changes); - var interactions = mapper.deserializeArrayOf(rootNode.get(JsonFieldName.U_INTERACTIONS).toString(), UserInteractionBase.class); + var interactions = mapper.deserializeArrayOf(rootNode.get(JsonFieldName.U_INTERACTIONS).toString(), + UserInteractionBase.class); ((TransactionalChange) change).setUserInteractions(interactions); } else if (type == ChangeType.COMPOSITE) { var changesNode = (ArrayNode) rootNode.get(JsonFieldName.V_CHANGES);