package alien4cloud.json.deserializer; import java.util.Map; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import alien4cloud.topology.task.AbstractRelationshipTask; import alien4cloud.topology.task.AbstractTask; import alien4cloud.topology.task.ArtifactTask; import alien4cloud.topology.task.InputArtifactTask; import alien4cloud.topology.task.LocationPolicyTask; import alien4cloud.topology.task.NodeFiltersTask; import alien4cloud.topology.task.PropertiesTask; import alien4cloud.topology.task.RequirementsTask; import alien4cloud.topology.task.ScalableTask; import alien4cloud.topology.task.SuggestionsTask; import alien4cloud.topology.task.TaskCode; import alien4cloud.topology.task.TopologyTask; import alien4cloud.topology.task.WorkflowTask; /** * Custom deserializer to handle multiple {@link AbstractTask} types. */ public class TaskDeserializer extends AbstractFieldValueDiscriminatorPolymorphicDeserializer<AbstractTask> { public TaskDeserializer() { super("code", AbstractTask.class); addToRegistry(PropertiesTask.class, TaskCode.INPUT_PROPERTY, TaskCode.PROPERTIES, TaskCode.ORCHESTRATOR_PROPERTY); addToRegistry(ScalableTask.class, TaskCode.SCALABLE_CAPABILITY_INVALID); addToRegistry(LocationPolicyTask.class, TaskCode.LOCATION_POLICY); addToRegistry(NodeFiltersTask.class, TaskCode.NODE_FILTER_INVALID); addToRegistry(RequirementsTask.class, TaskCode.SATISFY_LOWER_BOUND); addToRegistry(WorkflowTask.class, TaskCode.WORKFLOW_INVALID); addToRegistry(SuggestionsTask.class, TaskCode.REPLACE, TaskCode.IMPLEMENT); addToRegistry(ArtifactTask.class, TaskCode.ARTIFACT_INVALID); addToRegistry(InputArtifactTask.class, TaskCode.INPUT_ARTIFACT_INVALID); addToRegistry(AbstractRelationshipTask.class, TaskCode.IMPLEMENT_RELATIONSHIP); } @Override protected AbstractTask deserializeAfterRead(JsonParser jp, DeserializationContext ctxt, ObjectMapper mapper, ObjectNode root) throws JsonProcessingException { AbstractTask result = super.deserializeAfterRead(jp, ctxt, mapper, root); if (result == null) { Map data = mapper.treeToValue(root, Map.class); if (data.containsKey("nodeTemplateName")) { result = mapper.treeToValue(root, TopologyTask.class); } else { failedToFindImplementation(jp, root); } } return result; } private void addToRegistry(Class<? extends AbstractTask> clazz, TaskCode... taskCodes) { for (TaskCode taskCode : taskCodes) { addToRegistry(taskCode.toString(), clazz); } } }