/** * */ package org.gcube.informationsystem.model.impl.relations; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.gcube.informationsystem.base.impl.relations.BaseRelationImpl; import org.gcube.informationsystem.base.reference.ISManageable; import org.gcube.informationsystem.model.reference.entities.Entity; import org.gcube.informationsystem.model.reference.entities.Resource; import org.gcube.informationsystem.model.reference.properties.PropagationConstraint; import org.gcube.informationsystem.model.reference.properties.Property; import org.gcube.informationsystem.model.reference.relations.Relation; import org.gcube.informationsystem.utils.ISMapper; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonTypeName; /** * @author Luca Frosini (ISTI - CNR) */ @JsonTypeName(value = Relation.NAME) public abstract class RelationImpl extends BaseRelationImpl implements Relation { /** * */ private static final long serialVersionUID = -6249979476879235053L; protected PropagationConstraint propagationConstraint; @JsonIgnore protected Map additionalProperties; /** * Used to allow to have an additional property starting with '_' or '@' */ protected final Set allowedAdditionalKeys; protected RelationImpl() { super(); this.additionalProperties = new HashMap<>(); this.allowedAdditionalKeys = new HashSet<>(); this.allowedAdditionalKeys.add(SUPERCLASSES_PROPERTY); } protected RelationImpl(S source, T target, PropagationConstraint propagationConstraint) { this(); this.source = source; this.target = target; this.propagationConstraint = propagationConstraint; } @Override public PropagationConstraint getPropagationConstraint() { return this.propagationConstraint; } @Override public Map getAdditionalProperties() { return additionalProperties; } @Override public void setAdditionalProperties(Map additionalProperties) { this.additionalProperties = additionalProperties; } @Override public Object getAdditionalProperty(String key) { return additionalProperties.get(key); } @Override public void setAdditionalProperty(String key, Object value) { if (!allowedAdditionalKeys.contains(key)) { if (key.startsWith("_")) { return; } if (key.startsWith("@")) { return; } if (key.compareTo(PROPAGATION_CONSTRAINT) == 0) { return; } if (key.compareTo(TARGET_PROPERTY) == 0) { return; } if (key.compareTo(SOURCE_PROPERTY) == 0) { return; } } /* Additional properties are not deserialized to the proper Property type. The first attempt was to try to write a specific deserializer but it fails. This fix the issue. */ try { if(value instanceof Map) { @SuppressWarnings("unchecked") Map map = (Map) value; if(map.containsKey(ISManageable.CLASS_PROPERTY)) { String reserialized = ISMapper.getObjectMapper().writeValueAsString(map); Property property = ISMapper.unmarshal(Property.class, reserialized); value = property; } } }catch (Throwable e) { e.getMessage(); // Any type of error/exception must be catched } /* END of fix to properly deserialize Property types*/ this.additionalProperties.put(key, value); } }