Checking if an entity with the same UUID already exist. Throwing an exception in such a case

git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/information-system/resource-registry@135011 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Luca Frosini 2016-11-28 17:17:14 +00:00
parent a576d3d8fa
commit ee136fb6a6
7 changed files with 89 additions and 20 deletions

View File

@ -14,8 +14,8 @@ import org.gcube.informationsystem.resourceregistry.api.Query;
import org.gcube.informationsystem.resourceregistry.api.SchemaManagement; import org.gcube.informationsystem.resourceregistry.api.SchemaManagement;
import org.gcube.informationsystem.resourceregistry.api.exceptions.InvalidQueryException; import org.gcube.informationsystem.resourceregistry.api.exceptions.InvalidQueryException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException; import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.FacetNotFoundException; import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.facet.FacetNotFoundException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.ResourceNotFoundException; import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.resource.ResourceNotFoundException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaNotFoundException; import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaNotFoundException;
import org.gcube.informationsystem.resourceregistry.api.rest.AccessPath; import org.gcube.informationsystem.resourceregistry.api.rest.AccessPath;
import org.gcube.informationsystem.resourceregistry.resources.impl.EntityManagementImpl; import org.gcube.informationsystem.resourceregistry.resources.impl.EntityManagementImpl;

View File

@ -19,8 +19,8 @@ import org.gcube.informationsystem.resourceregistry.api.EntityManagement;
import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException; import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.context.ContextNotFoundException; import org.gcube.informationsystem.resourceregistry.api.exceptions.context.ContextNotFoundException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.EntityException; import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.EntityException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.FacetNotFoundException; import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.facet.FacetNotFoundException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.ResourceNotFoundException; import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.resource.ResourceNotFoundException;
import org.gcube.informationsystem.resourceregistry.api.rest.EntityPath; import org.gcube.informationsystem.resourceregistry.api.rest.EntityPath;
import org.gcube.informationsystem.resourceregistry.resources.impl.EntityManagementImpl; import org.gcube.informationsystem.resourceregistry.resources.impl.EntityManagementImpl;
import org.gcube.informationsystem.resourceregistry.resources.utils.ContextUtility; import org.gcube.informationsystem.resourceregistry.resources.utils.ContextUtility;

View File

@ -30,8 +30,12 @@ import org.gcube.informationsystem.resourceregistry.api.EntityManagement;
import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException; import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.context.ContextException; import org.gcube.informationsystem.resourceregistry.api.exceptions.context.ContextException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.context.ContextNotFoundException; import org.gcube.informationsystem.resourceregistry.api.exceptions.context.ContextNotFoundException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.FacetNotFoundException; import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.EntityAlreadyPresentException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.ResourceNotFoundException; import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.EntityNotFoundException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.facet.FacetAlreadyPresentException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.facet.FacetNotFoundException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.resource.ResourceAlreadyPresentException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.resource.ResourceNotFoundException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaNotFoundException; import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaNotFoundException;
import org.gcube.informationsystem.resourceregistry.context.SecurityContextMapper; import org.gcube.informationsystem.resourceregistry.context.SecurityContextMapper;
import org.gcube.informationsystem.resourceregistry.context.SecurityContextMapper.PermissionMode; import org.gcube.informationsystem.resourceregistry.context.SecurityContextMapper.PermissionMode;
@ -145,23 +149,30 @@ public class EntityManagementImpl implements EntityManagement {
protected Vertex getEntity(OrientGraph orientGraph, JsonNode jsonNode, protected Vertex getEntity(OrientGraph orientGraph, JsonNode jsonNode,
UUID uuid, Class<? extends Entity> entityClass) UUID uuid, Class<? extends Entity> entityClass)
throws JsonParseException, JsonMappingException, IOException, throws JsonParseException, JsonMappingException, IOException,
FacetNotFoundException, ResourceNotFoundException, EntityNotFoundException, ResourceRegistryException {
ResourceRegistryException {
String classProperty = getClassProperty(jsonNode); String classProperty = getClassProperty(jsonNode);
try { try {
SchemaManagementImpl.getTypeSchema(orientGraph, classProperty, SchemaManagementImpl.getTypeSchema(orientGraph, classProperty,
classProperty); entityClass.getSimpleName());
} catch (SchemaNotFoundException e) { } catch (SchemaNotFoundException e) {
throw e; throw e;
} }
Header header = HeaderUtility.getHeader(jsonNode, false); Header header = HeaderUtility.getHeader(jsonNode, false);
if (header != null) {
UUID resourceUUID = header.getUUID(); UUID resourceUUID = header.getUUID();
if (resourceUUID.compareTo(uuid) != 0) {
String error = String
.format("UUID provided in header (%s) differs from the one (%s) used to identify the %s instance",
resourceUUID.toString(), uuid.toString(),
classProperty);
throw new ResourceRegistryException(error);
Vertex vertex = getEntity(orientGraph, resourceUUID, classProperty, }
entityClass); }
Vertex vertex = getEntity(orientGraph, uuid, classProperty, entityClass);
return vertex; return vertex;
} }
@ -536,7 +547,8 @@ public class EntityManagementImpl implements EntityManagement {
private Vertex createVertexEntity(OrientGraph orientGraph, private Vertex createVertexEntity(OrientGraph orientGraph,
String entityType, Class<? extends Entity> entity, String entityType, Class<? extends Entity> entity,
String jsonRepresentation) throws ResourceRegistryException { String jsonRepresentation) throws EntityAlreadyPresentException,
ResourceRegistryException {
logger.trace("Going to create {} for {} ({}) using {}", logger.trace("Going to create {} for {} ({}) using {}",
Vertex.class.getSimpleName(), Vertex.class.getSimpleName(),
@ -566,6 +578,29 @@ public class EntityManagementImpl implements EntityManagement {
OrientVertex vertex = orientGraph.addVertex("class:" + entityType); OrientVertex vertex = orientGraph.addVertex("class:" + entityType);
try {
UUID uuid = org.gcube.informationsystem.impl.utils.Utility
.getUUIDFromJsonNode(jsonNode);
Vertex v = getEntity(orientGraph, jsonNode, uuid, entity);
if(v!=null){
String error = String.format("An %s with UUID %s already exist", entity.getSimpleName(), uuid.toString());
if (Facet.class.isAssignableFrom(entity)) {
throw new FacetAlreadyPresentException(error);
}
if (Resource.class.isAssignableFrom(entity)) {
throw new ResourceAlreadyPresentException(error);
}
throw new EntityAlreadyPresentException(error);
}
} catch (EntityAlreadyPresentException e) {
throw e;
} catch (Exception e) {
// no header or no header with uuid is provided and it is fine
}
Header entityHeader = HeaderUtility.getHeader(jsonNode, true); Header entityHeader = HeaderUtility.getHeader(jsonNode, true);
if (entityHeader != null) { if (entityHeader != null) {
vertex.setProperty(Entity.HEADER_PROPERTY, entityHeader); vertex.setProperty(Entity.HEADER_PROPERTY, entityHeader);
@ -600,7 +635,8 @@ public class EntityManagementImpl implements EntityManagement {
Utility.toJsonString((OrientVertex) vertex, true)); Utility.toJsonString((OrientVertex) vertex, true));
return vertex; return vertex;
} catch (ResourceRegistryException e) {
throw e;
} catch (Exception e) { } catch (Exception e) {
logger.trace("Error while creating {} for {} ({}) using {}", logger.trace("Error while creating {} for {} ({}) using {}",
Vertex.class.getSimpleName(), entity.getClass() Vertex.class.getSimpleName(), entity.getClass()
@ -787,7 +823,7 @@ public class EntityManagementImpl implements EntityManagement {
@Override @Override
public String createFacet(String facetType, String jsonRepresentation) public String createFacet(String facetType, String jsonRepresentation)
throws ResourceRegistryException { throws FacetAlreadyPresentException, ResourceRegistryException {
OrientGraph orientGraph = null; OrientGraph orientGraph = null;
try { try {
@ -1161,7 +1197,7 @@ public class EntityManagementImpl implements EntityManagement {
@Override @Override
public String createResource(String resourceType, String jsonRepresentation) public String createResource(String resourceType, String jsonRepresentation)
throws ResourceRegistryException { throws ResourceAlreadyPresentException, ResourceRegistryException {
logger.debug("Trying to create {} using {}", resourceType, logger.debug("Trying to create {} using {}", resourceType,
jsonRepresentation); jsonRepresentation);
@ -1415,15 +1451,30 @@ public class EntityManagementImpl implements EntityManagement {
} }
} }
@Override
public boolean addResourceToContext(UUID uuid) public boolean addResourceToContext(UUID uuid)
throws ResourceNotFoundException, ContextNotFoundException, throws ResourceNotFoundException, ContextNotFoundException,
ResourceRegistryException { ResourceRegistryException {
return addEntityToContext(Resource.class, uuid); return addEntityToContext(Resource.class, uuid);
} }
@Override
public boolean addFacetToContext(UUID uuid) throws FacetNotFoundException, public boolean addFacetToContext(UUID uuid) throws FacetNotFoundException,
ContextNotFoundException, ResourceRegistryException { ContextNotFoundException, ResourceRegistryException {
return addEntityToContext(Facet.class, uuid); return addEntityToContext(Facet.class, uuid);
} }
@Override
public boolean removeResourceFromContext(UUID uuid)
throws ResourceNotFoundException, ContextNotFoundException,
ResourceRegistryException {
throw new UnsupportedOperationException();
}
@Override
public boolean removeFacetFromContext(UUID uuid)
throws FacetNotFoundException, ContextNotFoundException,
ResourceRegistryException {
throw new UnsupportedOperationException();
}
} }

View File

@ -78,6 +78,8 @@ public class HeaderUtility {
} }
HeaderOrient header = null; HeaderOrient header = null;
if(creation){ if(creation){
// If an header is provided MUST contains and UUID otherwise is
// an invalid request so that let that an exception is raised
UUID uuid = UUID.fromString(headerNode.get(Header.UUID_PROPERTY).asText()); UUID uuid = UUID.fromString(headerNode.get(Header.UUID_PROPERTY).asText());
header = (HeaderOrient) createHeader(uuid); header = (HeaderOrient) createHeader(uuid);
}else{ }else{

View File

@ -5,8 +5,8 @@ import java.util.UUID;
import org.gcube.informationsystem.resourceregistry.api.EntityManagement; import org.gcube.informationsystem.resourceregistry.api.EntityManagement;
import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException; import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.context.ContextNotFoundException; import org.gcube.informationsystem.resourceregistry.api.exceptions.context.ContextNotFoundException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.FacetNotFoundException; import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.facet.FacetNotFoundException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.ResourceNotFoundException; import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.resource.ResourceNotFoundException;
import org.glassfish.hk2.api.Factory; import org.glassfish.hk2.api.Factory;
public class EntityManagementFactory implements Factory<EntityManagement> { public class EntityManagementFactory implements Factory<EntityManagement> {
@ -129,6 +129,22 @@ public class EntityManagementFactory implements Factory<EntityManagement> {
return null; return null;
} }
@Override
public boolean removeResourceFromContext(UUID uuid)
throws ResourceNotFoundException, ContextNotFoundException,
ResourceRegistryException {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean removeFacetFromContext(UUID uuid)
throws FacetNotFoundException, ContextNotFoundException,
ResourceRegistryException {
// TODO Auto-generated method stub
return false;
}
}; };
} }

View File

@ -43,7 +43,7 @@ import org.gcube.informationsystem.model.relation.ConsistsOf;
import org.gcube.informationsystem.model.relation.IsIdentifiedBy; import org.gcube.informationsystem.model.relation.IsIdentifiedBy;
import org.gcube.informationsystem.model.relation.Relation; import org.gcube.informationsystem.model.relation.Relation;
import org.gcube.informationsystem.model.relation.isrelatedto.Hosts; import org.gcube.informationsystem.model.relation.isrelatedto.Hosts;
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.FacetNotFoundException; import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.facet.FacetNotFoundException;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.slf4j.Logger; import org.slf4j.Logger;

View File

@ -42,7 +42,7 @@ import org.gcube.informationsystem.model.relation.consistsof.HasVolatileMemory;
import org.gcube.informationsystem.model.relation.isrelatedto.Hosts; import org.gcube.informationsystem.model.relation.isrelatedto.Hosts;
import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException; import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.context.ContextNotFoundException; import org.gcube.informationsystem.resourceregistry.api.exceptions.context.ContextNotFoundException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.ResourceNotFoundException; import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.resource.ResourceNotFoundException;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.slf4j.Logger; import org.slf4j.Logger;