From a825fe51afe7b5a3b2131c33dcab39890004d0c6 Mon Sep 17 00:00:00 2001 From: Luca Frosini Date: Mon, 20 Jan 2020 10:29:56 +0100 Subject: [PATCH] Fixed types creation to support resource schema definition. --- .../dbinitialization/DatabaseEnvironment.java | 27 ++++++++-- .../instances/base/ERManagement.java | 14 ++--- .../properties/BasePropertyManagement.java | 2 +- .../context/entities/ContextManagement.java | 2 +- .../model/entities/EntityManagement.java | 2 +- .../instances/type/SchemaManagementImpl.java | 54 ++++++++++++------- .../EntityTypeDefinitionManagement.java | 10 ++-- .../resourceregistry/utils/HeaderOrient.java | 2 +- .../resourceregistry/utils/HeaderUtility.java | 2 +- .../resourceregistry/utils/Utility.java | 2 +- .../context/ContextManagementTest.java | 2 +- .../instances/ERManagementTest.java | 2 +- .../instances/SmartgearResourcesTest.java | 4 +- .../type/SchemaManagementImplTest.java | 2 +- 14 files changed, 83 insertions(+), 44 deletions(-) diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/dbinitialization/DatabaseEnvironment.java b/src/main/java/org/gcube/informationsystem/resourceregistry/dbinitialization/DatabaseEnvironment.java index 4058de7..94bb3c6 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/dbinitialization/DatabaseEnvironment.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/dbinitialization/DatabaseEnvironment.java @@ -18,13 +18,12 @@ import org.gcube.informationsystem.base.reference.ISConstants; 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.properties.Header; import org.gcube.informationsystem.base.reference.relations.BaseRelation; +import org.gcube.informationsystem.model.reference.properties.Header; +import org.gcube.informationsystem.model.reference.properties.Property; import org.gcube.informationsystem.resourceregistry.instances.base.ERManagement; import org.gcube.informationsystem.resourceregistry.instances.context.ContextUtility; -import org.gcube.informationsystem.resourceregistry.instances.type.entities.EntityTypeDefinitionManagement; import org.gcube.informationsystem.resourceregistry.instances.type.properties.PropertyTypeDefinitionManagement; -import org.gcube.informationsystem.resourceregistry.instances.type.relations.RelationTypeDefinitionManagement; import org.gcube.informationsystem.resourceregistry.security.AdminSecurityContext; import org.gcube.informationsystem.resourceregistry.security.ContextSecurityContext; import org.gcube.informationsystem.resourceregistry.security.SchemaSecurityContext; @@ -32,8 +31,11 @@ import org.gcube.informationsystem.resourceregistry.security.SecurityContext.Per import org.gcube.informationsystem.types.TypeBinder; import org.gcube.informationsystem.types.reference.TypeDefinition; import org.gcube.informationsystem.types.reference.entities.EntityTypeDefinition; +import org.gcube.informationsystem.types.reference.entities.FacetTypeDefinition; +import org.gcube.informationsystem.types.reference.entities.ResourceTypeDefinition; import org.gcube.informationsystem.types.reference.properties.PropertyDefinition; import org.gcube.informationsystem.types.reference.properties.PropertyTypeDefinition; +import org.gcube.informationsystem.types.reference.properties.ResourceEntryDefinition; import org.gcube.informationsystem.types.reference.relations.RelationTypeDefinition; import org.gcube.informationsystem.utils.discovery.ISMDiscovery; import org.gcube.informationsystem.utils.discovery.RegistrationProvider; @@ -226,11 +228,15 @@ public class DatabaseEnvironment { List> definitionToBeCreated = new ArrayList<>(); definitionToBeCreated.add(BaseProperty.class); + definitionToBeCreated.add(Property.class); definitionToBeCreated.add(Header.class); definitionToBeCreated.add(PropertyDefinition.class); definitionToBeCreated.add(PropertyTypeDefinition.class); + definitionToBeCreated.add(ResourceEntryDefinition.class); definitionToBeCreated.add(BaseEntity.class); definitionToBeCreated.add(EntityTypeDefinition.class); + definitionToBeCreated.add(FacetTypeDefinition.class); + definitionToBeCreated.add(ResourceTypeDefinition.class); definitionToBeCreated.add(BaseRelation.class); definitionToBeCreated.add(RelationTypeDefinition.class); @@ -247,6 +253,7 @@ public class DatabaseEnvironment { } } + /* for(Class clz : definitionToBeCreated) { ERManagement erManagement = null; @@ -254,6 +261,9 @@ public class DatabaseEnvironment { erManagement = new PropertyTypeDefinitionManagement(); } else if(BaseEntity.class.isAssignableFrom(clz)) { erManagement = new EntityTypeDefinitionManagement(); + if(ResourceTypeDefinition.class.isAssignableFrom(clz)) { + erManagement.setElementType(ResourceTypeDefinition.NAME); + } } else if(BaseRelation.class.isAssignableFrom(clz)) { erManagement = new RelationTypeDefinitionManagement(); } @@ -261,6 +271,17 @@ public class DatabaseEnvironment { erManagement.setJson(TypeBinder.serializeType(clz)); erManagement.create(); } + */ + + + List> schemaToBeCreated = new ArrayList<>(); + schemaToBeCreated.add(Property.class); + schemaToBeCreated.add(Header.class); + for(Class clz : schemaToBeCreated) { + ERManagement erManagement = new PropertyTypeDefinitionManagement(); + erManagement.setJson(TypeBinder.serializeType(clz)); + erManagement.create(); + } List packages = new ArrayList(); diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/instances/base/ERManagement.java b/src/main/java/org/gcube/informationsystem/resourceregistry/instances/base/ERManagement.java index d298e22..d930597 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/instances/base/ERManagement.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/instances/base/ERManagement.java @@ -20,8 +20,8 @@ import javax.activation.UnsupportedDataTypeException; import org.gcube.informationsystem.base.reference.AccessType; import org.gcube.informationsystem.base.reference.ER; import org.gcube.informationsystem.base.reference.ISManageable; -import org.gcube.informationsystem.base.reference.properties.Header; import org.gcube.informationsystem.context.reference.entities.Context; +import org.gcube.informationsystem.model.reference.properties.Header; import org.gcube.informationsystem.resourceregistry.api.exceptions.AlreadyPresentException; import org.gcube.informationsystem.resourceregistry.api.exceptions.AvailableInAnotherContextException; import org.gcube.informationsystem.resourceregistry.api.exceptions.NotFoundException; @@ -182,16 +182,16 @@ public abstract class ERManagement { return oClass; } - public void setElementType(String erType) throws ResourceRegistryException { + public void setElementType(String elementType) throws ResourceRegistryException { if(this.elementType == null) { - if(erType == null || erType.compareTo("") == 0) { - erType = accessType.getName(); + if(elementType == null || elementType.compareTo("") == 0) { + elementType = accessType.getName(); } - this.elementType = erType; + this.elementType = elementType; } else { - if(elementType.compareTo(erType) != 0) { + if(elementType.compareTo(elementType) != 0) { throw new ResourceRegistryException( - "Provided type " + erType + " does not match with the one already known " + this.accessType); + "Provided type " + elementType + " does not match with the one already known " + this.accessType); } } diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/instances/base/properties/BasePropertyManagement.java b/src/main/java/org/gcube/informationsystem/resourceregistry/instances/base/properties/BasePropertyManagement.java index c48dd08..b6b7f1f 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/instances/base/properties/BasePropertyManagement.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/instances/base/properties/BasePropertyManagement.java @@ -6,9 +6,9 @@ import java.util.Set; import org.gcube.informationsystem.base.reference.AccessType; import org.gcube.informationsystem.base.reference.ISManageable; -import org.gcube.informationsystem.base.reference.properties.Header; import org.gcube.informationsystem.model.impl.properties.EncryptedImpl; import org.gcube.informationsystem.model.reference.properties.Encrypted; +import org.gcube.informationsystem.model.reference.properties.Header; import org.gcube.informationsystem.model.reference.properties.Property; import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException; import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaNotFoundException; diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/instances/context/entities/ContextManagement.java b/src/main/java/org/gcube/informationsystem/resourceregistry/instances/context/entities/ContextManagement.java index 8613da7..13f8aad 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/instances/context/entities/ContextManagement.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/instances/context/entities/ContextManagement.java @@ -5,9 +5,9 @@ import java.util.Iterator; import java.util.UUID; import org.gcube.informationsystem.base.reference.AccessType; -import org.gcube.informationsystem.base.reference.properties.Header; import org.gcube.informationsystem.context.reference.entities.Context; import org.gcube.informationsystem.context.reference.relations.IsParentOf; +import org.gcube.informationsystem.model.reference.properties.Header; import org.gcube.informationsystem.model.reference.relations.Relation; import org.gcube.informationsystem.resourceregistry.api.exceptions.AlreadyPresentException; import org.gcube.informationsystem.resourceregistry.api.exceptions.NotFoundException; diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/instances/model/entities/EntityManagement.java b/src/main/java/org/gcube/informationsystem/resourceregistry/instances/model/entities/EntityManagement.java index a36987f..bfab08c 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/instances/model/entities/EntityManagement.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/instances/model/entities/EntityManagement.java @@ -8,10 +8,10 @@ import java.util.UUID; import org.gcube.informationsystem.base.reference.AccessType; import org.gcube.informationsystem.base.reference.entities.BaseEntity; -import org.gcube.informationsystem.base.reference.properties.Header; import org.gcube.informationsystem.model.reference.entities.Entity; import org.gcube.informationsystem.model.reference.entities.Facet; import org.gcube.informationsystem.model.reference.entities.Resource; +import org.gcube.informationsystem.model.reference.properties.Header; import org.gcube.informationsystem.model.reference.relations.ConsistsOf; import org.gcube.informationsystem.model.reference.relations.Relation; import org.gcube.informationsystem.resourceregistry.api.exceptions.AvailableInAnotherContextException; diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/instances/type/SchemaManagementImpl.java b/src/main/java/org/gcube/informationsystem/resourceregistry/instances/type/SchemaManagementImpl.java index f66fbcd..037accc 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/instances/type/SchemaManagementImpl.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/instances/type/SchemaManagementImpl.java @@ -16,9 +16,9 @@ import org.gcube.informationsystem.base.reference.AccessType; 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.properties.Header; import org.gcube.informationsystem.base.reference.relations.BaseRelation; import org.gcube.informationsystem.model.reference.entities.Entity; +import org.gcube.informationsystem.model.reference.entities.Facet; import org.gcube.informationsystem.model.reference.entities.Resource; import org.gcube.informationsystem.model.reference.properties.Property; import org.gcube.informationsystem.model.reference.relations.Relation; @@ -35,10 +35,14 @@ import org.gcube.informationsystem.resourceregistry.security.AdminSecurityContex import org.gcube.informationsystem.resourceregistry.security.SecurityContext.PermissionMode; import org.gcube.informationsystem.types.Type; import org.gcube.informationsystem.types.TypeBinder; +import org.gcube.informationsystem.types.reference.PropertyCapableTypeDefinition; import org.gcube.informationsystem.types.reference.TypeDefinition; import org.gcube.informationsystem.types.reference.entities.EntityTypeDefinition; +import org.gcube.informationsystem.types.reference.entities.FacetTypeDefinition; +import org.gcube.informationsystem.types.reference.entities.ResourceTypeDefinition; import org.gcube.informationsystem.types.reference.properties.PropertyDefinition; import org.gcube.informationsystem.types.reference.properties.PropertyTypeDefinition; +import org.gcube.informationsystem.types.reference.properties.ResourceEntryDefinition; import org.gcube.informationsystem.types.reference.relations.RelationTypeDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -91,11 +95,13 @@ public class SchemaManagementImpl implements SchemaManagement { node.put(ISManageable.CLASS_PROPERTY, RelationTypeDefinition.NAME); } - ArrayNode arrayNode = (ArrayNode) node.get(TypeDefinition.PROPERTIES_PROPERTY); - Iterator iterator = arrayNode.iterator(); - while(iterator.hasNext()) { - ObjectNode propertyNode = (ObjectNode) iterator.next(); - propertyNode.put(ISManageable.CLASS_PROPERTY, PropertyDefinition.NAME); + if(!oClass.isSubClassOf(Resource.NAME)) { + ArrayNode arrayNode = (ArrayNode) node.get(PropertyCapableTypeDefinition.PROPERTIES_PROPERTY); + Iterator iterator = arrayNode.iterator(); + while(iterator.hasNext()) { + ObjectNode propertyNode = (ObjectNode) iterator.next(); + propertyNode.put(ISManageable.CLASS_PROPERTY, PropertyDefinition.NAME); + } } String managedJson = mapper.writeValueAsString(node); @@ -175,7 +181,7 @@ public class SchemaManagementImpl implements SchemaManagement { private static Set baseTypes; public static Set typeDefinitionTypes; - public static Set skipTypeDefinitionCreation; + // public static Set skipTypeDefinitionCreation; static { baseTypes = new HashSet(); @@ -185,13 +191,18 @@ public class SchemaManagementImpl implements SchemaManagement { typeDefinitionTypes = new HashSet(); typeDefinitionTypes.add(PropertyTypeDefinition.NAME); + typeDefinitionTypes.add(ResourceEntryDefinition.NAME); typeDefinitionTypes.add(EntityTypeDefinition.NAME); + typeDefinitionTypes.add(ResourceTypeDefinition.NAME); typeDefinitionTypes.add(RelationTypeDefinition.NAME); + /* skipTypeDefinitionCreation = new HashSet(); skipTypeDefinitionCreation.addAll(baseTypes); - skipTypeDefinitionCreation.add(Header.NAME); skipTypeDefinitionCreation.add(PropertyDefinition.NAME); + skipTypeDefinitionCreation.add(Property.NAME); + skipTypeDefinitionCreation.add(Header.NAME); + */ } protected void registerTypeSchema(TypeDefinition typeDefinition, AccessType baseType) @@ -255,12 +266,12 @@ public class SchemaManagementImpl implements SchemaManagement { oClass.setSuperClasses(oSuperclasses); } - Set propertyDefinitions = typeDefinition.getProperties(); - if(Resource.class.isAssignableFrom(baseType.getTypeClass())) { - if(propertyDefinitions != null && propertyDefinitions.size() > 0) { - throw new SchemaCreationException("A Resource cannot contains any properties."); - } - } else { + if(typeDefinition instanceof PropertyCapableTypeDefinition) { + // A Resource cannot contains any properties. + // + + Set propertyDefinitions = ((PropertyCapableTypeDefinition) typeDefinition).getProperties(); + for(PropertyDefinition propertyDefinition : propertyDefinitions) { OType oType = OType.getById(propertyDefinition.getType().byteValue()); @@ -370,7 +381,6 @@ public class SchemaManagementImpl implements SchemaManagement { oDatabaseDocument.close(); } } - } @Override @@ -390,17 +400,21 @@ public class SchemaManagementImpl implements SchemaManagement { ERManagement erManagement = null; - if(BaseEntity.class.isAssignableFrom(accessType.getTypeClass())) { + if(Entity.class.isAssignableFrom(accessType.getTypeClass())) { erManagement = new EntityTypeDefinitionManagement(); - } else if(BaseRelation.class.isAssignableFrom(accessType.getTypeClass())) { + if(Resource.class.isAssignableFrom(accessType.getTypeClass())) { + ((EntityTypeDefinitionManagement) erManagement).setElementTypeRaw(ResourceTypeDefinition.NAME); + }else if(Facet.class.isAssignableFrom(accessType.getTypeClass())) { + ((EntityTypeDefinitionManagement) erManagement).setElementTypeRaw(FacetTypeDefinition.NAME); + } + } else if(Relation.class.isAssignableFrom(accessType.getTypeClass())) { erManagement = new RelationTypeDefinitionManagement(); - } else if(BaseProperty.class.isAssignableFrom(accessType.getTypeClass())) { + } else if(Property.class.isAssignableFrom(accessType.getTypeClass())) { erManagement = new PropertyTypeDefinitionManagement(); } String ret = null; - if(!typeDefinitionTypes.contains(typeDefinition.getName()) - && !skipTypeDefinitionCreation.contains(typeDefinition.getName())) { + if(erManagement!=null) { erManagement.setJson(jsonSchema); ret = erManagement.create(); }else { diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/instances/type/entities/EntityTypeDefinitionManagement.java b/src/main/java/org/gcube/informationsystem/resourceregistry/instances/type/entities/EntityTypeDefinitionManagement.java index 984856c..5119cac 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/instances/type/entities/EntityTypeDefinitionManagement.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/instances/type/entities/EntityTypeDefinitionManagement.java @@ -45,6 +45,10 @@ public class EntityTypeDefinitionManagement extends BaseEntityManagement