diff --git a/pom.xml b/pom.xml index 7c08ca3..2d763f3 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.gcube.information-system resource-registry - 4.0.0 + 4.0.1-SNAPSHOT Resource Registry Service The Resource Registry is a web-service which represent the core component of the gCube Information System war 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 6228b1c..9afa86c 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 @@ -2,8 +2,10 @@ package org.gcube.informationsystem.resourceregistry.instances.model.entities; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; import org.gcube.com.fasterxml.jackson.core.JsonProcessingException; @@ -25,6 +27,7 @@ import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegis import org.gcube.informationsystem.resourceregistry.api.exceptions.context.ContextException; import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.EntityAlreadyPresentException; import org.gcube.informationsystem.resourceregistry.api.exceptions.query.InvalidQueryException; +import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaException; import org.gcube.informationsystem.resourceregistry.contexts.security.SecurityContext; import org.gcube.informationsystem.resourceregistry.contexts.security.SecurityContext.PermissionMode; import org.gcube.informationsystem.resourceregistry.instances.base.ElementManagement; @@ -34,6 +37,7 @@ import org.gcube.informationsystem.resourceregistry.instances.model.relations.Re import org.gcube.informationsystem.resourceregistry.utils.Utility; import com.orientechnologies.orient.core.db.document.ODatabaseDocument; +import com.orientechnologies.orient.core.id.ORID; import com.orientechnologies.orient.core.metadata.schema.OClass; import com.orientechnologies.orient.core.record.ODirection; import com.orientechnologies.orient.core.record.OEdge; @@ -244,6 +248,32 @@ public abstract class EntityManagement extends EntityEl } } + public boolean propertyMatchRequestedVlaue(OVertex v, String key, String requestedValue, Object instanceValue) throws SchemaException, ResourceRegistryException { + return requestedValue.compareTo(instanceValue.toString())==0; + + + /* + OClass oClass = ElementManagement.getOClass(v); + OProperty oProperty = oClass.getProperty(key); + if(oProperty==null){ + // It is an additional property + return requestedValue.compareTo(instanceValue.toString())==0; + } + OType oType = oProperty.getType(); + switch (oType) { + case BOOLEAN: + Boolean requested = Boolean.valueOf(requestedValue.toLowerCase()); + return requested == (Boolean) instanceValue; + + case STRING: + return requestedValue.compareTo((String) instanceValue)==0; + + default: + return false; + } + */ + } + public String reallyQuery(String relationType, String referenceType, UUID referenceUUID, ODirection direction, boolean polymorphic, Map constraint) throws ResourceRegistryException { ObjectMapper objectMapper = new ObjectMapper(); @@ -282,8 +312,43 @@ public abstract class EntityManagement extends EntityEl references = oDatabaseDocument.browseClass(referenceType, polymorphic); } + Set analysed = new HashSet<>(); + for(Object r : references) { OVertex v = (OVertex) r; + + boolean skip = false; + // checking if the constraints are satisfied + for(String key : constraint.keySet()) { + String value = constraint.get(key); + Object o = v.getProperty(key); + if(value==null) { + if(o==null) { + //ok + }else { + skip = true; + break; + } + }else { + if(o==null) { + // The vertex has not a required property to be tested + // or the property is null + skip = true; + break; + }else { + skip = !propertyMatchRequestedVlaue(v, key, value, o); + if(skip) { + break; + } + } + } + } + + if(skip) { + continue; + } + + List directions = new ArrayList<>(); if(direction==ODirection.BOTH) { directions.add(ODirection.IN); @@ -298,16 +363,33 @@ public abstract class EntityManagement extends EntityEl for(OEdge edge : edges) { OVertex vertex = edge.getVertex(d); - if(v.getIdentity().compareTo(vertex.getIdentity()) == 0) { + ORID vertexORID = vertex.getIdentity(); + + if(analysed.contains(vertexORID)) { + continue; + } + analysed.add(vertexORID); + + if(v.getIdentity().compareTo(vertexORID) == 0) { continue; } OClass oClass = ElementManagement.getOClass(vertex); - if(polymorphic && oClass.isSubClassOf(elementType)) { - // OK - } else { - // excluding from results - continue; + + /* + * If the requested type (i.e. elementType) + * differs form the resulting type (i.e. oClass.getName()) + * we need to evaluate if polymorphism is requested and + * if the resulting type is a subclass of the requested type + * + */ + if(oClass.getName().compareTo(elementType)!=0) { + if(polymorphic && oClass.isSubClassOf(elementType)) { + // OK + } else { + // excluding from results + continue; + } } @SuppressWarnings("rawtypes") diff --git a/src/test/java/org/gcube/informationsystem/resourceregistry/rest/AccessTest.java b/src/test/java/org/gcube/informationsystem/resourceregistry/rest/AccessTest.java new file mode 100644 index 0000000..bff8400 --- /dev/null +++ b/src/test/java/org/gcube/informationsystem/resourceregistry/rest/AccessTest.java @@ -0,0 +1,51 @@ +package org.gcube.informationsystem.resourceregistry.rest; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import org.gcube.common.authorization.client.exceptions.ObjectNotFound; +import org.gcube.informationsystem.resourceregistry.ContextTest; +import org.gcube.informationsystem.resourceregistry.api.utils.Utility; +import org.gcube.informationsystem.resourceregistry.instances.base.ElementManagement; +import org.gcube.informationsystem.resourceregistry.instances.base.ElementManagementUtility; +import org.gcube.informationsystem.resourceregistry.instances.model.entities.ResourceManagement; +import org.gcube.resourcemanagement.model.reference.entities.facets.IdentifierFacet; +import org.gcube.resourcemanagement.model.reference.entities.resources.Configuration; +import org.gcube.resourcemanagement.model.reference.relations.consistsof.IsIdentifiedBy; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.orientechnologies.orient.core.record.ODirection; + +public class AccessTest { + + private static Logger logger = LoggerFactory.getLogger(AccessTest.class); + + // @Test + public void simulatGetAllResourcesHavingFacet() throws ObjectNotFound, Exception { + ContextTest.setContextByName("/gcube/devNext"); + + UUID refereceUUID = null; + ODirection directionEnum = ODirection.OUT; + Boolean polymorphic = false; + + String resourceType = Utility.getTypeName(Configuration.class); + String relationType = Utility.getTypeName(IsIdentifiedBy.class); + String referenceType = Utility.getTypeName(IdentifierFacet.class); + + Map constraint = new HashMap<>(); + constraint.put("value", "Aux"); + + + @SuppressWarnings("rawtypes") + ElementManagement erManagement = ElementManagementUtility.getERManagement(resourceType); + + String ret = ((ResourceManagement) erManagement).query(relationType, referenceType, refereceUUID, directionEnum, + polymorphic, constraint); + + logger.debug(ret); + } + +}