From 45beeff1ef59f02461b4191aa4571e2e53f45063 Mon Sep 17 00:00:00 2001 From: Luca Frosini Date: Mon, 28 Oct 2019 17:36:09 +0100 Subject: [PATCH] Fixing json serialization/deserialization issues --- .classpath | 2 +- .settings/org.eclipse.core.resources.prefs | 6 +++++ .settings/org.eclipse.jdt.core.prefs | 5 ++++ .../base/reference/AccessType.java | 17 +++++++++---- .../informationsystem/types/TypeBinder.java | 25 +++++++++++++------ .../types/impl/TypeDefinitionImpl.java | 10 +++++--- .../entities/EntityTypeDefinitionImpl.java | 6 ++++- .../properties/PropertyDefinitionImpl.java | 4 ++- .../PropertyTypeDefinitionImpl.java | 12 ++++++--- .../relations/RelationTypeDefinitionImpl.java | 6 ++++- ...niton.java => PropertyTypeDefinition.java} | 4 +-- .../informationsystem/utils/ISMapper.java | 8 +++++- .../utils/discovery/ISMDiscovery.java | 9 ++++--- 13 files changed, 84 insertions(+), 30 deletions(-) create mode 100644 .settings/org.eclipse.core.resources.prefs create mode 100644 .settings/org.eclipse.jdt.core.prefs rename src/main/java/org/gcube/informationsystem/types/reference/properties/{PropertyTypeDefiniton.java => PropertyTypeDefinition.java} (70%) diff --git a/.classpath b/.classpath index 8e795b1..fae1a2b 100644 --- a/.classpath +++ b/.classpath @@ -22,7 +22,7 @@ - + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..29abf99 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..714351a --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/src/main/java/org/gcube/informationsystem/base/reference/AccessType.java b/src/main/java/org/gcube/informationsystem/base/reference/AccessType.java index c7f3daa..247d983 100644 --- a/src/main/java/org/gcube/informationsystem/base/reference/AccessType.java +++ b/src/main/java/org/gcube/informationsystem/base/reference/AccessType.java @@ -5,6 +5,8 @@ package org.gcube.informationsystem.base.reference; import java.util.Arrays; +import org.gcube.informationsystem.base.impl.properties.BasePropertyImpl; +import org.gcube.informationsystem.base.reference.properties.BaseProperty; import org.gcube.informationsystem.context.impl.entities.ContextImpl; import org.gcube.informationsystem.context.impl.relations.IsParentOfImpl; import org.gcube.informationsystem.context.reference.entities.Context; @@ -27,13 +29,15 @@ import org.gcube.informationsystem.model.reference.properties.Property; import org.gcube.informationsystem.model.reference.relations.ConsistsOf; import org.gcube.informationsystem.model.reference.relations.IsRelatedTo; import org.gcube.informationsystem.model.reference.relations.Relation; +import org.gcube.informationsystem.types.impl.TypeDefinitionImpl; import org.gcube.informationsystem.types.impl.entities.EntityTypeDefinitionImpl; import org.gcube.informationsystem.types.impl.properties.PropertyDefinitionImpl; import org.gcube.informationsystem.types.impl.properties.PropertyTypeDefinitionImpl; import org.gcube.informationsystem.types.impl.relations.RelationTypeDefinitionImpl; +import org.gcube.informationsystem.types.reference.TypeDefinition; import org.gcube.informationsystem.types.reference.entities.EntityTypeDefinition; import org.gcube.informationsystem.types.reference.properties.PropertyDefinition; -import org.gcube.informationsystem.types.reference.properties.PropertyTypeDefiniton; +import org.gcube.informationsystem.types.reference.properties.PropertyTypeDefinition; import org.gcube.informationsystem.types.reference.relations.RelationTypeDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,17 +48,20 @@ import org.slf4j.LoggerFactory; * Enumerates the basic type names. */ public enum AccessType { - - PROPERTY_DEFINITION(PropertyDefinition.class, PropertyDefinition.NAME, PropertyDefinitionImpl.class, null), - PROPERTY_TYPE_DEFINITION(PropertyTypeDefiniton.class, PropertyTypeDefiniton.NAME, PropertyTypeDefinitionImpl.class, null), + + BASE_PROPERTY(BaseProperty.class, BaseProperty.NAME, BasePropertyImpl.class, null), PROPERTY(Property.class, Property.NAME, PropertyImpl.class, DummyProperty.class), CONTEXT(Context.class, Context.NAME, ContextImpl.class, null), IS_PARENT_OF(IsParentOf.class, IsParentOf.NAME, IsParentOfImpl.class, null), + PROPERTY_DEFINITION(PropertyDefinition.class, PropertyDefinition.NAME, PropertyDefinitionImpl.class, null), + + TYPE_DEFINITION(TypeDefinition.class, TypeDefinition.NAME, TypeDefinitionImpl.class, null), + PROPERTY_TYPE_DEFINITION(PropertyTypeDefinition.class, PropertyTypeDefinition.NAME, PropertyTypeDefinitionImpl.class, null), ENTITY_TYPE_DEFINITION(EntityTypeDefinition.class, EntityTypeDefinition.NAME, EntityTypeDefinitionImpl.class, null), RELATION_TYPE_DEFINITION(RelationTypeDefinition.class, RelationTypeDefinition.NAME, RelationTypeDefinitionImpl.class, null), - + ENTITY(Entity.class, Entity.NAME, EntityImpl.class, null), RESOURCE(Resource.class, Resource.NAME, ResourceImpl.class, DummyResource.class), FACET(Facet.class, Facet.NAME, FacetImpl.class, DummyFacet.class), diff --git a/src/main/java/org/gcube/informationsystem/types/TypeBinder.java b/src/main/java/org/gcube/informationsystem/types/TypeBinder.java index 95ef275..c74ecc5 100644 --- a/src/main/java/org/gcube/informationsystem/types/TypeBinder.java +++ b/src/main/java/org/gcube/informationsystem/types/TypeBinder.java @@ -1,7 +1,6 @@ package org.gcube.informationsystem.types; import java.lang.reflect.Field; -import java.util.ArrayList; import java.util.List; import org.gcube.informationsystem.base.reference.ISManageable; @@ -9,9 +8,6 @@ import org.gcube.informationsystem.types.impl.TypeDefinitionImpl; import org.gcube.informationsystem.types.reference.TypeDefinition; import org.gcube.informationsystem.utils.ISMapper; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.ObjectMapper; - /** * @author Luca Frosini (ISTI - CNR) */ @@ -19,7 +15,8 @@ public class TypeBinder { private final static String NAME = "NAME"; - public static String serializeTypeDefinition(TypeDefinition typeDefinition) throws Exception{ + @SuppressWarnings("rawtypes") + public static String serializeTypeDefinition(TypeDefinition typeDefinition) throws Exception{ /* ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(typeDefinition); @@ -33,23 +30,37 @@ public class TypeBinder { return ISMapper.marshal(typeDefinition); } - public static TypeDefinition deserializeTypeDefinition(String json) throws Exception{ + @SuppressWarnings("rawtypes") + public static TypeDefinition deserializeTypeDefinition(String json) throws Exception{ + /* ObjectMapper mapper = new ObjectMapper(); @SuppressWarnings("unchecked") TypeDefinition readValue = mapper.readValue(json, TypeDefinition.class); + */ + TypeDefinition readValue = ISMapper.unmarshal(TypeDefinition.class, json); return readValue; } public static String serializeTypeDefinitions(List> typeDefinitions) throws Exception{ + /* ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(typeDefinitions); return json; + */ + String json = ISMapper.marshal(typeDefinitions); + return json; + } - public static List> deserializeTypeDefinitions(String json) throws Exception{ + @SuppressWarnings("rawtypes") + public static List deserializeTypeDefinitions(String json) throws Exception{ + /* ObjectMapper mapper = new ObjectMapper(); JavaType type = mapper.getTypeFactory().constructCollectionType(ArrayList.class, TypeDefinition.class) ; return mapper.readValue(json, type); + */ + List list = ISMapper.unmarshalList(TypeDefinition.class, json); + return list; } public static TypeDefinition createTypeDefinition(Class clz) { diff --git a/src/main/java/org/gcube/informationsystem/types/impl/TypeDefinitionImpl.java b/src/main/java/org/gcube/informationsystem/types/impl/TypeDefinitionImpl.java index 06ad821..d6be112 100644 --- a/src/main/java/org/gcube/informationsystem/types/impl/TypeDefinitionImpl.java +++ b/src/main/java/org/gcube/informationsystem/types/impl/TypeDefinitionImpl.java @@ -28,7 +28,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName; // @JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY) @JsonTypeName(value=TypeDefinition.NAME) -public class TypeDefinitionImpl extends ISManageableImpl implements TypeDefinition { +public abstract class TypeDefinitionImpl extends ISManageableImpl implements TypeDefinition { /** * Generated Serial Version UID @@ -50,7 +50,9 @@ public class TypeDefinitionImpl extends ISManageableIm Set interfaceList = new HashSet<>(); if(type==baseClass){ - interfaceList.add(topSuperClass); + if(topSuperClass!=null) { + interfaceList.add(topSuperClass); + } return interfaceList; } @@ -104,12 +106,14 @@ public class TypeDefinitionImpl extends ISManageableIm } else if(BaseProperty.class.isAssignableFrom(clz)){ return new PropertyTypeDefinitionImpl(clz); } else if(TypeDefinition.class.isAssignableFrom(clz)) { - return new TypeDefinitionImpl(clz); + return new DummyTypeDefinitionImpl(clz); } else { throw new RuntimeException("Serialization required"); } } + protected TypeDefinitionImpl() {} + protected TypeDefinitionImpl(Class clz) { this.name = TypeBinder.getType(clz); this.description = TypeBinder.getStaticStringFieldByName(clz, DESCRIPTION, ""); diff --git a/src/main/java/org/gcube/informationsystem/types/impl/entities/EntityTypeDefinitionImpl.java b/src/main/java/org/gcube/informationsystem/types/impl/entities/EntityTypeDefinitionImpl.java index bee6e51..41668d6 100644 --- a/src/main/java/org/gcube/informationsystem/types/impl/entities/EntityTypeDefinitionImpl.java +++ b/src/main/java/org/gcube/informationsystem/types/impl/entities/EntityTypeDefinitionImpl.java @@ -16,7 +16,7 @@ import org.gcube.informationsystem.utils.ISMapper; import com.fasterxml.jackson.annotation.JsonTypeName; @JsonTypeName(value=EntityTypeDefinition.NAME) -public class EntityTypeDefinitionImpl extends TypeDefinitionImpl implements EntityTypeDefinition { +public final class EntityTypeDefinitionImpl extends TypeDefinitionImpl implements EntityTypeDefinition { /** * Generated Serial Version UID @@ -25,6 +25,10 @@ public class EntityTypeDefinitionImpl extends TypeDefiniti private static final String VERTEX_CLASS_NAME = "V"; + protected EntityTypeDefinitionImpl() { + super(); + } + public EntityTypeDefinitionImpl(Class clz) { super(clz); diff --git a/src/main/java/org/gcube/informationsystem/types/impl/properties/PropertyDefinitionImpl.java b/src/main/java/org/gcube/informationsystem/types/impl/properties/PropertyDefinitionImpl.java index caffbbb..1c52cf0 100644 --- a/src/main/java/org/gcube/informationsystem/types/impl/properties/PropertyDefinitionImpl.java +++ b/src/main/java/org/gcube/informationsystem/types/impl/properties/PropertyDefinitionImpl.java @@ -65,7 +65,9 @@ public final class PropertyDefinitionImpl implements PropertyDefinition { return name; } - + protected PropertyDefinitionImpl() { + + } public PropertyDefinitionImpl(ISProperty propertyAnnotation, Method method) { String name = propertyAnnotation.name().isEmpty()?getPropertyNameFromMethodName(method):propertyAnnotation.name(); diff --git a/src/main/java/org/gcube/informationsystem/types/impl/properties/PropertyTypeDefinitionImpl.java b/src/main/java/org/gcube/informationsystem/types/impl/properties/PropertyTypeDefinitionImpl.java index a72517a..294f31c 100644 --- a/src/main/java/org/gcube/informationsystem/types/impl/properties/PropertyTypeDefinitionImpl.java +++ b/src/main/java/org/gcube/informationsystem/types/impl/properties/PropertyTypeDefinitionImpl.java @@ -3,22 +3,26 @@ package org.gcube.informationsystem.types.impl.properties; import org.gcube.informationsystem.base.reference.properties.BaseProperty; import org.gcube.informationsystem.types.impl.TypeDefinitionImpl; import org.gcube.informationsystem.types.reference.TypeDefinition; -import org.gcube.informationsystem.types.reference.properties.PropertyTypeDefiniton; +import org.gcube.informationsystem.types.reference.properties.PropertyTypeDefinition; import com.fasterxml.jackson.annotation.JsonTypeName; -@JsonTypeName(value=PropertyTypeDefiniton.NAME) -public class PropertyTypeDefinitionImpl

extends TypeDefinitionImpl

implements PropertyTypeDefiniton

{ +@JsonTypeName(value=PropertyTypeDefinition.NAME) +public final class PropertyTypeDefinitionImpl

extends TypeDefinitionImpl

implements PropertyTypeDefinition

{ /** * Generated Serial Version UID */ private static final long serialVersionUID = 7532701373450638829L; + protected PropertyTypeDefinitionImpl() { + super(); + } + public PropertyTypeDefinitionImpl(Class

clz) { super(clz); this.superClasses = retrieveSuperClasses(clz, BaseProperty.class, clz == BaseProperty.class ? null : BaseProperty.NAME); - if(PropertyTypeDefiniton.class.isAssignableFrom(clz)) { + if(PropertyTypeDefinition.class.isAssignableFrom(clz)) { this.superClasses.add(TypeDefinition.class.getSimpleName()); } } diff --git a/src/main/java/org/gcube/informationsystem/types/impl/relations/RelationTypeDefinitionImpl.java b/src/main/java/org/gcube/informationsystem/types/impl/relations/RelationTypeDefinitionImpl.java index 0399a4d..b6d41b7 100644 --- a/src/main/java/org/gcube/informationsystem/types/impl/relations/RelationTypeDefinitionImpl.java +++ b/src/main/java/org/gcube/informationsystem/types/impl/relations/RelationTypeDefinitionImpl.java @@ -20,7 +20,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonTypeName; @JsonTypeName(value=RelationTypeDefinition.NAME) -public class RelationTypeDefinitionImpl> +public final class RelationTypeDefinitionImpl> extends TypeDefinitionImpl implements RelationTypeDefinition { /** @@ -35,6 +35,10 @@ public class RelationTypeDefinitionImpl clz) { super(clz); diff --git a/src/main/java/org/gcube/informationsystem/types/reference/properties/PropertyTypeDefiniton.java b/src/main/java/org/gcube/informationsystem/types/reference/properties/PropertyTypeDefinition.java similarity index 70% rename from src/main/java/org/gcube/informationsystem/types/reference/properties/PropertyTypeDefiniton.java rename to src/main/java/org/gcube/informationsystem/types/reference/properties/PropertyTypeDefinition.java index 93b7efc..cb17ce1 100644 --- a/src/main/java/org/gcube/informationsystem/types/reference/properties/PropertyTypeDefiniton.java +++ b/src/main/java/org/gcube/informationsystem/types/reference/properties/PropertyTypeDefinition.java @@ -9,8 +9,8 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @JsonIgnoreProperties(ignoreUnknown = true) @JsonDeserialize(as = PropertyTypeDefinitionImpl.class) -public interface PropertyTypeDefiniton

extends TypeDefinition

, BaseProperty { +public interface PropertyTypeDefinition

extends TypeDefinition

, BaseProperty { - public static final String NAME = "PropertyTypeDefiniton"; // PropertyTypeDefiniton.class.getSimpleName(); + public static final String NAME = "PropertyTypeDefinition"; // PropertyTypeDefinition.class.getSimpleName(); } diff --git a/src/main/java/org/gcube/informationsystem/utils/ISMapper.java b/src/main/java/org/gcube/informationsystem/utils/ISMapper.java index 7a257c6..63b93de 100644 --- a/src/main/java/org/gcube/informationsystem/utils/ISMapper.java +++ b/src/main/java/org/gcube/informationsystem/utils/ISMapper.java @@ -63,7 +63,13 @@ public abstract class ISMapper { SchemaAction schemaAction = new ObjectMappingERAction(mapper); try { - ISMDiscovery.manageISM(schemaAction); + List packages = new ArrayList(); + for(AccessType accessType : accessTypes) { + Class clz = accessType.getTypeClass(); + packages.add(clz.getPackage()); + } + ISMDiscovery.manageISM(schemaAction, packages.toArray(new Package[]{})); + } catch(Exception e) { logger.error("Error registering types", e); } diff --git a/src/main/java/org/gcube/informationsystem/utils/discovery/ISMDiscovery.java b/src/main/java/org/gcube/informationsystem/utils/discovery/ISMDiscovery.java index 8a3f509..8f33096 100644 --- a/src/main/java/org/gcube/informationsystem/utils/discovery/ISMDiscovery.java +++ b/src/main/java/org/gcube/informationsystem/utils/discovery/ISMDiscovery.java @@ -13,7 +13,6 @@ import org.gcube.informationsystem.base.reference.ISManageable; import org.gcube.informationsystem.base.reference.entities.BaseEntity; import org.gcube.informationsystem.base.reference.properties.BaseProperty; import org.gcube.informationsystem.base.reference.relations.BaseRelation; -import org.gcube.informationsystem.model.reference.properties.Property; import org.gcube.informationsystem.types.annotations.ISProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -76,7 +75,7 @@ public class ISMDiscovery { analizeISM(parent); } - if(root == Property.class) { + if(root == BaseProperty.class) { for(Method m : clz.getDeclaredMethods()) { m.setAccessible(true); @@ -116,8 +115,9 @@ public class ISMDiscovery { @SuppressWarnings("unchecked") public static void manageISM(SchemaAction schemaAction, Package... packages) throws Exception { ISMDiscovery propertyDiscovery = new ISMDiscovery<>(BaseProperty.class); - if(Objects.nonNull(packages)) + if(Objects.nonNull(packages)) { Arrays.stream(packages).forEach(p -> propertyDiscovery.addPackage(p)); + } propertyDiscovery.discover(); for(Class property : propertyDiscovery.getDiscovered()) { logger.trace("Going to manage : {}", property); @@ -125,8 +125,9 @@ public class ISMDiscovery { } ISMDiscovery entityDiscovery = new ISMDiscovery<>(BaseEntity.class); - if(Objects.nonNull(packages)) + if(Objects.nonNull(packages)) { Arrays.stream(packages).forEach(p -> entityDiscovery.addPackage(p)); + } entityDiscovery.discover(); for(Class entity : entityDiscovery.getDiscovered()) {