Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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> T deserialize(JsonNode node, Class<T> clazz) throws IOException;

<T> List<T> deserializeArrayOf(String json, Class<T> clazz) throws JsonProcessingException;

Resource deserializeResource(String json, String id, ResourceSet set) throws JsonProcessingException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -89,7 +89,7 @@ public <T> T deserialize(String json, Class<T> clazz) throws JsonProcessingExcep
* @throws JsonProcessingException If the JSON node cannot be processed.
* @throws IOException If there is an IO exception during deserialization.
*/
public <T> T deserialize(JsonNode json, Class<T> clazz) throws JsonProcessingException, IOException {
public <T> T deserialize(JsonNode json, Class<T> clazz) throws IOException {
return mapper.reader().forType(clazz).readValue(json);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<VitruviusChange<?>> {
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<EChange<HierarchicalId>> changes = changesResource.getContents().stream().map(e -> (EChange<HierarchicalId>) e).toList();
List<EChange<HierarchicalId>> changes = changesResource.getContents().stream()
.map(e -> (EChange<HierarchicalId>) 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);
Expand Down
Loading