Implementing Referential integrity
git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/information-system/resource-registry@135078 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
bcad10fe05
commit
78213468eb
|
@ -61,7 +61,6 @@ import com.tinkerpop.blueprints.Element;
|
||||||
import com.tinkerpop.blueprints.Vertex;
|
import com.tinkerpop.blueprints.Vertex;
|
||||||
import com.tinkerpop.blueprints.impls.orient.OrientBaseGraph;
|
import com.tinkerpop.blueprints.impls.orient.OrientBaseGraph;
|
||||||
import com.tinkerpop.blueprints.impls.orient.OrientEdge;
|
import com.tinkerpop.blueprints.impls.orient.OrientEdge;
|
||||||
import com.tinkerpop.blueprints.impls.orient.OrientElement;
|
|
||||||
import com.tinkerpop.blueprints.impls.orient.OrientGraph;
|
import com.tinkerpop.blueprints.impls.orient.OrientGraph;
|
||||||
import com.tinkerpop.blueprints.impls.orient.OrientVertex;
|
import com.tinkerpop.blueprints.impls.orient.OrientVertex;
|
||||||
|
|
||||||
|
@ -956,7 +955,7 @@ public class EntityManagementImpl implements EntityManagement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean deleteFacet(UUID uuid) throws FacetNotFoundException,
|
public boolean deleteFacet(UUID uuid) throws FacetNotFoundException,
|
||||||
ResourceRegistryException {
|
ResourceRegistryException {
|
||||||
|
@ -1364,6 +1363,86 @@ public class EntityManagementImpl implements EntityManagement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private String getTraverseQueryToSelectEntityToDelete(String relationName, UUID uuid){
|
||||||
|
/*
|
||||||
|
* SELECT FROM (
|
||||||
|
* TRAVERSE outE('Relation') FROM
|
||||||
|
* //( SELECT FROM Resource WHERE header.uuid = 'c2001636-9227-425e-a3f5-67902c6fe301' )
|
||||||
|
* #<cluster>:<position>
|
||||||
|
* )
|
||||||
|
*
|
||||||
|
* WHERE (
|
||||||
|
* relationProperty.referentialIntegrity = 'onDeleteCascade' OR
|
||||||
|
* (
|
||||||
|
* relationProperty.referentialIntegrity = 'onDeleteCascadeWhenOrphan' AND
|
||||||
|
* inV().inE().size()=1
|
||||||
|
* )
|
||||||
|
*)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
String query =
|
||||||
|
"SELECT FROM ("
|
||||||
|
+ "TRAVERSE outE('" + relationName +"') FROM "
|
||||||
|
+ "(SELECT FROM " + Resource.NAME + " WHERE " + Resource.HEADER_PROPERTY + "." + Header.UUID_PROPERTY + " = '" + uuid.toString() + "'" + ")"
|
||||||
|
//+ rid
|
||||||
|
+ ") "
|
||||||
|
+ "WHERE ("
|
||||||
|
+ Relation.RELATION_PROPERTY + "." + RelationProperty.REFERENTIAL_INTEGRITY + " = '" + ReferentiaIntegrity.onDeleteCascade.toString() + "' OR ("
|
||||||
|
+ Relation.RELATION_PROPERTY + "." + RelationProperty.REFERENTIAL_INTEGRITY + " = '" + ReferentiaIntegrity.onDeleteCascadeWhenOrphan.toString() + "' AND "
|
||||||
|
+ "inV().inE().size()=1"
|
||||||
|
+ ")"
|
||||||
|
+ ")";
|
||||||
|
|
||||||
|
return query;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void internalDeleteResource(OrientGraph orientGraph, UUID uuid, Set<UUID> excludes) throws ResourceNotFoundException, ResourceRegistryException{
|
||||||
|
if(excludes == null){
|
||||||
|
excludes = new HashSet<>();
|
||||||
|
}
|
||||||
|
excludes.add(uuid);
|
||||||
|
|
||||||
|
Vertex resource = getEntity(orientGraph, uuid, null, Resource.class);
|
||||||
|
|
||||||
|
String query = getTraverseQueryToSelectEntityToDelete(IsRelatedTo.NAME, uuid);
|
||||||
|
|
||||||
|
OSQLSynchQuery<OrientEdge> osqlSynchQuery = new OSQLSynchQuery<>(query);
|
||||||
|
Iterable<OrientEdge> iterable = orientGraph.command(osqlSynchQuery).execute();
|
||||||
|
if (iterable != null && iterable.iterator() != null) {
|
||||||
|
Iterator<OrientEdge> iterator = iterable.iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
OrientEdge relation = iterator.next();
|
||||||
|
ODocument oDocument = relation.getInVertex().getRecord();
|
||||||
|
ODocument header = oDocument.field(Entity.HEADER_PROPERTY);
|
||||||
|
String uuidString = header.field(Header.UUID_PROPERTY);
|
||||||
|
UUID resourceUUID = UUID.fromString(uuidString);
|
||||||
|
if (uuid.compareTo(resourceUUID)!=0 && !excludes.contains(resourceUUID)){
|
||||||
|
internalDeleteResource(orientGraph, resourceUUID, excludes);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
query = getTraverseQueryToSelectEntityToDelete(ConsistsOf.NAME, uuid);
|
||||||
|
osqlSynchQuery = new OSQLSynchQuery<>(query);
|
||||||
|
iterable = orientGraph.command(osqlSynchQuery).execute();
|
||||||
|
if (iterable != null && iterable.iterator() !=null) {
|
||||||
|
Iterator<OrientEdge> iterator = iterable.iterator();
|
||||||
|
while(iterator.hasNext()){
|
||||||
|
OrientEdge relation = iterator.next();
|
||||||
|
ODocument oDocument = relation.getInVertex().getRecord();
|
||||||
|
oDocument.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource.remove();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean deleteResource(UUID uuid) throws ResourceNotFoundException,
|
public boolean deleteResource(UUID uuid) throws ResourceNotFoundException,
|
||||||
ResourceRegistryException {
|
ResourceRegistryException {
|
||||||
|
@ -1376,62 +1455,10 @@ public class EntityManagementImpl implements EntityManagement {
|
||||||
orientGraph = ContextUtility
|
orientGraph = ContextUtility
|
||||||
.getActualSecurityContextGraph(PermissionMode.WRITER);
|
.getActualSecurityContextGraph(PermissionMode.WRITER);
|
||||||
|
|
||||||
Vertex resource = getEntity(orientGraph, uuid, null, Resource.class);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SELECT FROM (
|
|
||||||
* TRAVERSE outE('ConsistsOf') FROM
|
|
||||||
* #<cluster>:<position>
|
|
||||||
* // Use this instead of the previous if you want to skip getEntity
|
|
||||||
* // ( SELECT FROM Resource WHERE header.uuid = 'c2001636-9227-425e-a3f5-67902c6fe301' )
|
|
||||||
* )
|
|
||||||
*
|
|
||||||
* WHERE (
|
|
||||||
* relationProperty IS null OR
|
|
||||||
* relationProperty.referentialIntegrity IS null OR
|
|
||||||
* relationProperty.referentialIntegrity = 'onDeleteCascade' OR (
|
|
||||||
* relationProperty.referentialIntegrity = 'onDeleteCascadeWhenOrphan' AND
|
|
||||||
* inV().inE().size()=1
|
|
||||||
* )
|
|
||||||
*)
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
String query =
|
internalDeleteResource(orientGraph, uuid, null);
|
||||||
"SELECT FROM ("
|
|
||||||
+ "TRAVERSE outE('" + ConsistsOf.NAME +"') FROM "
|
|
||||||
+ resource.getId()
|
|
||||||
//+ "SELECT FROM " + Resource.NAME + " WHERE " + Resource.HEADER_PROPERTY + "." + Header.UUID_PROPERTY + " = '" + uuid.toString() + "'" + ")"
|
|
||||||
+ ") "
|
|
||||||
+ "WHERE ("
|
|
||||||
+ Relation.RELATION_PROPERTY + " IS null OR "
|
|
||||||
+ Relation.RELATION_PROPERTY + "." + RelationProperty.REFERENTIAL_INTEGRITY + " IS null OR "
|
|
||||||
+ Relation.RELATION_PROPERTY + "." + RelationProperty.REFERENTIAL_INTEGRITY + " = '" + ReferentiaIntegrity.onDeleteCascade.toString() + "' OR ("
|
|
||||||
+ Relation.RELATION_PROPERTY + "." + RelationProperty.REFERENTIAL_INTEGRITY + " = '" + ReferentiaIntegrity.onDeleteCascadeWhenOrphan.toString() + "' AND "
|
|
||||||
+ "inV().inE().size()=1"
|
|
||||||
+ ")"
|
|
||||||
+ ")";
|
|
||||||
|
|
||||||
OSQLSynchQuery<OrientElement> osqlSynchQuery = new OSQLSynchQuery<>(query);
|
|
||||||
Iterable<OrientElement> iterable = orientGraph.command(osqlSynchQuery).execute();
|
|
||||||
if (iterable != null && iterable.iterator() !=null) {
|
|
||||||
Iterator<OrientElement> iterator = iterable.iterator();
|
|
||||||
while(iterator.hasNext()){
|
|
||||||
OrientElement element = iterator.next();
|
|
||||||
if(element instanceof OrientVertex){
|
|
||||||
continue;
|
|
||||||
}else{
|
|
||||||
OrientEdge consistsOf = (OrientEdge) element;
|
|
||||||
consistsOf.getInVertex().getRecord().delete();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
resource.remove();
|
|
||||||
|
|
||||||
orientGraph.commit();
|
orientGraph.commit();
|
||||||
|
|
||||||
logger.info("{} with UUID {} was successfully deleted.",
|
logger.info("{} with UUID {} was successfully deleted.",
|
||||||
Resource.NAME, uuid);
|
Resource.NAME, uuid);
|
||||||
|
|
||||||
|
|
|
@ -213,7 +213,7 @@ public class ContextManagementImplTest {
|
||||||
logger.debug("The DB should be now clean");
|
logger.debug("The DB should be now clean");
|
||||||
}
|
}
|
||||||
|
|
||||||
//@Test
|
@Test
|
||||||
public void createDevContext() throws ContextNotFoundException,
|
public void createDevContext() throws ContextNotFoundException,
|
||||||
ContextException, InternalException, JsonParseException,
|
ContextException, InternalException, JsonParseException,
|
||||||
JsonMappingException, IOException {
|
JsonMappingException, IOException {
|
||||||
|
|
|
@ -24,6 +24,7 @@ import java.util.regex.Pattern;
|
||||||
|
|
||||||
import org.gcube.common.scope.api.ScopeProvider;
|
import org.gcube.common.scope.api.ScopeProvider;
|
||||||
import org.gcube.informationsystem.impl.embedded.HeaderImpl;
|
import org.gcube.informationsystem.impl.embedded.HeaderImpl;
|
||||||
|
import org.gcube.informationsystem.impl.embedded.RelationPropertyImpl;
|
||||||
import org.gcube.informationsystem.impl.entity.facet.CPUFacetImpl;
|
import org.gcube.informationsystem.impl.entity.facet.CPUFacetImpl;
|
||||||
import org.gcube.informationsystem.impl.entity.facet.ContainerStateFacetImpl;
|
import org.gcube.informationsystem.impl.entity.facet.ContainerStateFacetImpl;
|
||||||
import org.gcube.informationsystem.impl.entity.facet.MemoryFacetImpl;
|
import org.gcube.informationsystem.impl.entity.facet.MemoryFacetImpl;
|
||||||
|
@ -31,11 +32,13 @@ import org.gcube.informationsystem.impl.entity.facet.NetworkingFacetImpl;
|
||||||
import org.gcube.informationsystem.impl.entity.facet.SimplePropertyFacetImpl;
|
import org.gcube.informationsystem.impl.entity.facet.SimplePropertyFacetImpl;
|
||||||
import org.gcube.informationsystem.impl.entity.facet.SoftwareFacetImpl;
|
import org.gcube.informationsystem.impl.entity.facet.SoftwareFacetImpl;
|
||||||
import org.gcube.informationsystem.impl.entity.resource.HostingNodeImpl;
|
import org.gcube.informationsystem.impl.entity.resource.HostingNodeImpl;
|
||||||
|
import org.gcube.informationsystem.impl.relation.ConsistsOfImpl;
|
||||||
import org.gcube.informationsystem.impl.relation.IsIdentifiedByImpl;
|
import org.gcube.informationsystem.impl.relation.IsIdentifiedByImpl;
|
||||||
import org.gcube.informationsystem.impl.relation.consistsof.HasPersistentMemoryImpl;
|
import org.gcube.informationsystem.impl.relation.consistsof.HasPersistentMemoryImpl;
|
||||||
import org.gcube.informationsystem.impl.relation.consistsof.HasVolatileMemoryImpl;
|
import org.gcube.informationsystem.impl.relation.consistsof.HasVolatileMemoryImpl;
|
||||||
import org.gcube.informationsystem.impl.utils.Entities;
|
import org.gcube.informationsystem.impl.utils.Entities;
|
||||||
import org.gcube.informationsystem.model.embedded.Header;
|
import org.gcube.informationsystem.model.embedded.Header;
|
||||||
|
import org.gcube.informationsystem.model.embedded.RelationProperty;
|
||||||
import org.gcube.informationsystem.model.entity.Facet;
|
import org.gcube.informationsystem.model.entity.Facet;
|
||||||
import org.gcube.informationsystem.model.entity.Resource;
|
import org.gcube.informationsystem.model.entity.Resource;
|
||||||
import org.gcube.informationsystem.model.entity.facet.CPUFacet;
|
import org.gcube.informationsystem.model.entity.facet.CPUFacet;
|
||||||
|
@ -52,7 +55,6 @@ import org.gcube.informationsystem.model.relation.IsIdentifiedBy;
|
||||||
import org.gcube.informationsystem.model.relation.consistsof.HasPersistentMemory;
|
import org.gcube.informationsystem.model.relation.consistsof.HasPersistentMemory;
|
||||||
import org.gcube.informationsystem.model.relation.consistsof.HasVolatileMemory;
|
import org.gcube.informationsystem.model.relation.consistsof.HasVolatileMemory;
|
||||||
import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException;
|
import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException;
|
||||||
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.resource.ResourceNotFoundException;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -127,15 +129,19 @@ public class SmartgearResourcesTest {
|
||||||
}
|
}
|
||||||
networkingFacet.setHostName("pc-frosini.isti.cnr.it");
|
networkingFacet.setHostName("pc-frosini.isti.cnr.it");
|
||||||
networkingFacet.setDomainName(getDomain(networkingFacet.getHostName()));
|
networkingFacet.setDomainName(getDomain(networkingFacet.getHostName()));
|
||||||
|
|
||||||
networkingFacet.setAdditionalProperty("Port", 8080);
|
networkingFacet.setAdditionalProperty("Port", 8080);
|
||||||
|
|
||||||
|
RelationProperty relationProperty = new RelationPropertyImpl();
|
||||||
|
relationProperty.setReferentialIntegrity(RelationProperty.ReferentiaIntegrity.onDeleteCascadeWhenOrphan);
|
||||||
|
|
||||||
IsIdentifiedBy<HostingNode, NetworkingFacet> isIdentifiedBy =
|
IsIdentifiedBy<HostingNode, NetworkingFacet> isIdentifiedBy =
|
||||||
new IsIdentifiedByImpl<>(hostingNode, networkingFacet, null);
|
new IsIdentifiedByImpl<>(hostingNode, networkingFacet, relationProperty);
|
||||||
hostingNode.addFacet(isIdentifiedBy);
|
hostingNode.addFacet(isIdentifiedBy);
|
||||||
|
|
||||||
List<CPUFacet> cpuFacets = getCPUFacets();
|
List<CPUFacet> cpuFacets = getCPUFacets();
|
||||||
for (CPUFacet cpuFacet: cpuFacets) {
|
for (CPUFacet cpuFacet: cpuFacets) {
|
||||||
hostingNode.addFacet(cpuFacet);
|
ConsistsOf<HostingNode, CPUFacet> consistsOf = new ConsistsOfImpl<HostingNode, CPUFacet>(hostingNode, cpuFacet, relationProperty);
|
||||||
|
hostingNode.addFacet(consistsOf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -144,11 +150,13 @@ public class SmartgearResourcesTest {
|
||||||
softwareFacet.setGroup(mxbean.getName()); // softwareFacet.setGroup(System.getProperty("os.name"));
|
softwareFacet.setGroup(mxbean.getName()); // softwareFacet.setGroup(System.getProperty("os.name"));
|
||||||
softwareFacet.setName(mxbean.getArch()); // softwareFacet.setName(System.getProperty("os.arch"));
|
softwareFacet.setName(mxbean.getArch()); // softwareFacet.setName(System.getProperty("os.arch"));
|
||||||
softwareFacet.setVersion(mxbean.getVersion()); // softwareFacet.setName(System.getProperty("os.version"));
|
softwareFacet.setVersion(mxbean.getVersion()); // softwareFacet.setName(System.getProperty("os.version"));
|
||||||
hostingNode.addFacet(softwareFacet);
|
ConsistsOf<HostingNode, SoftwareFacet> sfR = new ConsistsOfImpl<HostingNode, SoftwareFacet>(hostingNode, softwareFacet, relationProperty);
|
||||||
|
hostingNode.addFacet(sfR);
|
||||||
|
|
||||||
|
|
||||||
SimplePropertyFacet simplePropertyFacet = addEnvironmentVariables();
|
SimplePropertyFacet simplePropertyFacet = addEnvironmentVariables();
|
||||||
hostingNode.addFacet(simplePropertyFacet);
|
ConsistsOf<HostingNode, SimplePropertyFacet> spfR = new ConsistsOfImpl<HostingNode, SimplePropertyFacet>(hostingNode, simplePropertyFacet, relationProperty);
|
||||||
|
hostingNode.addFacet(spfR);
|
||||||
|
|
||||||
ContainerStateFacet containerStateFacet = getContainerStateFacet(null);
|
ContainerStateFacet containerStateFacet = getContainerStateFacet(null);
|
||||||
hostingNode.addFacet(containerStateFacet);
|
hostingNode.addFacet(containerStateFacet);
|
||||||
|
@ -157,20 +165,20 @@ public class SmartgearResourcesTest {
|
||||||
MemoryFacet ramFacet = getRamInfo(null);
|
MemoryFacet ramFacet = getRamInfo(null);
|
||||||
HasVolatileMemory<HostingNode, MemoryFacet> hasVolatileRAMMemory =
|
HasVolatileMemory<HostingNode, MemoryFacet> hasVolatileRAMMemory =
|
||||||
new HasVolatileMemoryImpl<HostingNode, MemoryFacet>(
|
new HasVolatileMemoryImpl<HostingNode, MemoryFacet>(
|
||||||
hostingNode, ramFacet, null);
|
hostingNode, ramFacet, relationProperty);
|
||||||
hasVolatileRAMMemory.setAdditionalProperty(MEMORY_TYPE, MEMORY_TYPE_RAM);
|
hasVolatileRAMMemory.setAdditionalProperty(MEMORY_TYPE, MEMORY_TYPE_RAM);
|
||||||
hostingNode.addFacet(hasVolatileRAMMemory);
|
hostingNode.addFacet(hasVolatileRAMMemory);
|
||||||
|
|
||||||
MemoryFacet jvmMemoryFacet = getJVMMemoryInfo(null);
|
MemoryFacet jvmMemoryFacet = getJVMMemoryInfo(null);
|
||||||
HasVolatileMemory<HostingNode, MemoryFacet> hasVolatileJVMMemory =
|
HasVolatileMemory<HostingNode, MemoryFacet> hasVolatileJVMMemory =
|
||||||
new HasVolatileMemoryImpl<HostingNode, MemoryFacet>(
|
new HasVolatileMemoryImpl<HostingNode, MemoryFacet>(
|
||||||
hostingNode, jvmMemoryFacet, null);
|
hostingNode, jvmMemoryFacet, relationProperty);
|
||||||
hasVolatileJVMMemory.setAdditionalProperty(MEMORY_TYPE, MEMORY_TYPE_JVM);
|
hasVolatileJVMMemory.setAdditionalProperty(MEMORY_TYPE, MEMORY_TYPE_JVM);
|
||||||
hostingNode.addFacet(hasVolatileJVMMemory);
|
hostingNode.addFacet(hasVolatileJVMMemory);
|
||||||
|
|
||||||
MemoryFacet disk = getDiskSpace(null);
|
MemoryFacet disk = getDiskSpace(null);
|
||||||
HasPersistentMemory<HostingNode, MemoryFacet> hasPersistentMemory =
|
HasPersistentMemory<HostingNode, MemoryFacet> hasPersistentMemory =
|
||||||
new HasPersistentMemoryImpl<HostingNode, MemoryFacet>(hostingNode, disk, null);
|
new HasPersistentMemoryImpl<HostingNode, MemoryFacet>(hostingNode, disk, relationProperty);
|
||||||
hostingNode.addFacet(hasPersistentMemory);
|
hostingNode.addFacet(hasPersistentMemory);
|
||||||
|
|
||||||
String json = entityManagementImpl.createResource(HostingNode.NAME, Entities.marshal(hostingNode));
|
String json = entityManagementImpl.createResource(HostingNode.NAME, Entities.marshal(hostingNode));
|
||||||
|
@ -228,12 +236,6 @@ public class SmartgearResourcesTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testDelete() throws ResourceNotFoundException, ResourceRegistryException{
|
|
||||||
ScopeProvider.instance.set("/gcube/devNext");
|
|
||||||
entityManagementImpl.deleteResource(UUID.fromString("9a2cedcb-2df2-49d7-93b9-f2b34d70fc06"));
|
|
||||||
}
|
|
||||||
|
|
||||||
private ContainerStateFacet getContainerStateFacet(ContainerStateFacet containerStateFacet){
|
private ContainerStateFacet getContainerStateFacet(ContainerStateFacet containerStateFacet){
|
||||||
if(containerStateFacet == null){
|
if(containerStateFacet == null){
|
||||||
containerStateFacet = new ContainerStateFacetImpl();
|
containerStateFacet = new ContainerStateFacetImpl();
|
||||||
|
|
Loading…
Reference in New Issue