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 org.alien4cloud.tosca.model.templates.AbstractPolicy; import org.alien4cloud.tosca.model.templates.GenericPolicy; import org.alien4cloud.tosca.model.templates.HaPolicy; import org.alien4cloud.tosca.model.templates.LocationPlacementPolicy; /** * Custom deserializer to handle multiple AbstractPolicy types. */ public class PolicyDeserializer extends AbstractFieldValueDiscriminatorPolymorphicDeserializer<AbstractPolicy> { public PolicyDeserializer() { super("type", AbstractPolicy.class); addToRegistry(HaPolicy.HA_POLICY, HaPolicy.class); addToRegistry(LocationPlacementPolicy.LOCATION_PLACEMENT_POLICY, LocationPlacementPolicy.class); } @Override protected AbstractPolicy deserializeAfterRead(JsonParser jp, DeserializationContext ctxt, ObjectMapper mapper, ObjectNode root) throws JsonProcessingException { AbstractPolicy result = super.deserializeAfterRead(jp, ctxt, mapper, root); if (result!=null) return result; // treat anything else as generic policy // all data is stored in the field data so extract that Map data = mapper.treeToValue(root, Map.class); if (data.containsKey("data")) data = (Map) data.get("data"); return new GenericPolicy( data ); } }