refs #6273: Manage Propagation Constraint on Resource Registry
https://support.d4science.org/issues/6273 git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/information-system/resource-registry@141292 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
19206b90b7
commit
7c4625c2d9
|
@ -3,7 +3,6 @@
|
|||
*/
|
||||
package org.gcube.informationsystem.resourceregistry.context;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.gcube.informationsystem.resourceregistry.dbinitialization.DatabaseEnvironment;
|
||||
|
@ -17,12 +16,9 @@ import com.orientechnologies.orient.core.metadata.security.OSecurity;
|
|||
import com.orientechnologies.orient.core.metadata.security.OSecurityRole.ALLOW_MODES;
|
||||
import com.orientechnologies.orient.core.metadata.security.OUser;
|
||||
import com.orientechnologies.orient.core.record.impl.ODocument;
|
||||
import com.tinkerpop.blueprints.Direction;
|
||||
import com.tinkerpop.blueprints.Edge;
|
||||
import com.tinkerpop.blueprints.Vertex;
|
||||
import com.tinkerpop.blueprints.impls.orient.OrientEdge;
|
||||
import com.tinkerpop.blueprints.Element;
|
||||
import com.tinkerpop.blueprints.impls.orient.OrientElement;
|
||||
import com.tinkerpop.blueprints.impls.orient.OrientGraph;
|
||||
import com.tinkerpop.blueprints.impls.orient.OrientVertex;
|
||||
|
||||
/**
|
||||
* @author Luca Frosini (ISTI - CNR)
|
||||
|
@ -37,42 +33,52 @@ public class SecurityContext {
|
|||
public static final String DEFAULT_READER_ROLE = "reader";
|
||||
|
||||
public static void addToSecurityContext(OrientGraph orientGraph,
|
||||
Vertex vertex, UUID context) {
|
||||
Element element, UUID context) {
|
||||
OSecurity oSecurity = orientGraph.getRawGraph().getMetadata()
|
||||
.getSecurity();
|
||||
SecurityContext.addToSecurityContext(oSecurity, vertex, context);
|
||||
SecurityContext.addToSecurityContext(oSecurity, element, context);
|
||||
}
|
||||
|
||||
public static void addToSecurityContext(OSecurity oSecurity, Vertex vertex,
|
||||
public static void addToSecurityContext(OSecurity oSecurity, Element element,
|
||||
UUID context) {
|
||||
OrientVertex orientVertex = (OrientVertex) vertex;
|
||||
|
||||
OrientElement orientElement = (OrientElement) element;
|
||||
SecurityContext.allowSecurityContextRoles(oSecurity,
|
||||
orientVertex.getRecord(), context);
|
||||
orientVertex.save();
|
||||
|
||||
Iterable<Edge> iterable = vertex.getEdges(Direction.BOTH);
|
||||
Iterator<Edge> iterator = iterable.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
OrientEdge edge = (OrientEdge) iterator.next();
|
||||
SecurityContext.allowSecurityContextRoles(oSecurity,
|
||||
edge.getRecord(), context);
|
||||
edge.save();
|
||||
}
|
||||
orientElement.getRecord(), context);
|
||||
orientElement.save();
|
||||
}
|
||||
|
||||
public static void addToSecurityContext(OrientGraph orientGraph, Edge edge,
|
||||
UUID context) {
|
||||
public static void removeFromSecurityContext(OrientGraph orientGraph,
|
||||
Element element, UUID context) {
|
||||
OSecurity oSecurity = orientGraph.getRawGraph().getMetadata()
|
||||
.getSecurity();
|
||||
SecurityContext.addToSecurityContext(oSecurity, edge, context);
|
||||
SecurityContext.removeFromSecurityContext(oSecurity, element, context);
|
||||
}
|
||||
|
||||
public static void removeFromSecurityContext(OSecurity oSecurity, Element element,
|
||||
UUID context) {
|
||||
OrientElement orientElement = (OrientElement) element;
|
||||
SecurityContext.disallowSecurityContextRoles(oSecurity,
|
||||
orientElement.getRecord(), context);
|
||||
orientElement.save();
|
||||
}
|
||||
|
||||
public static void addToSecurityContext(OSecurity oSecurity, Edge edge,
|
||||
UUID context) {
|
||||
OrientEdge orientEdge = (OrientEdge) edge;
|
||||
SecurityContext.allowSecurityContextRoles(oSecurity,
|
||||
orientEdge.getRecord(), context);
|
||||
protected static void disallowSecurityContextRoles(OSecurity oSecurity,
|
||||
ODocument oDocument, UUID context) {
|
||||
oSecurity.denyRole(oDocument, ORestrictedOperation.ALLOW_ALL,
|
||||
SecurityContextMapper.getSecurityRoleOrUserName(
|
||||
SecurityContextMapper.PermissionMode.WRITER,
|
||||
SecurityContextMapper.SecurityType.ROLE, context));
|
||||
|
||||
oSecurity.denyRole(oDocument, ORestrictedOperation.ALLOW_READ,
|
||||
SecurityContextMapper.getSecurityRoleOrUserName(
|
||||
SecurityContextMapper.PermissionMode.READER,
|
||||
SecurityContextMapper.SecurityType.ROLE, context));
|
||||
|
||||
oDocument.save();
|
||||
// oSecurity.denyRole(oDocument, ORestrictedOperation.ALLOW_ALL,
|
||||
// DEFAULT_WRITER_ROLE);
|
||||
// oSecurity.denyRole(oDocument, ORestrictedOperation.ALLOW_READ,
|
||||
// DEFAULT_READER_ROLE);
|
||||
}
|
||||
|
||||
protected static void allowSecurityContextRoles(OSecurity oSecurity,
|
||||
|
|
|
@ -21,7 +21,6 @@ import com.orientechnologies.orient.core.record.impl.ODocument;
|
|||
|
||||
/**
|
||||
* @author Luca Frosini (ISTI - CNR)
|
||||
*
|
||||
*/
|
||||
public class EmbeddedMangement {
|
||||
|
||||
|
|
|
@ -13,7 +13,6 @@ import org.gcube.informationsystem.model.embedded.Header;
|
|||
import org.gcube.informationsystem.model.entity.Entity;
|
||||
import org.gcube.informationsystem.model.entity.Facet;
|
||||
import org.gcube.informationsystem.model.entity.Resource;
|
||||
import org.gcube.informationsystem.model.relation.ConsistsOf;
|
||||
import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException;
|
||||
import org.gcube.informationsystem.resourceregistry.api.exceptions.context.ContextException;
|
||||
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.EntityAlreadyPresentException;
|
||||
|
@ -301,16 +300,11 @@ public abstract class EntityManagement<E extends Entity> {
|
|||
|
||||
public boolean reallyAddToContext() throws ContextException,
|
||||
ResourceRegistryException {
|
||||
getVertex();
|
||||
|
||||
ContextUtility.addToActualContext(orientGraph, vertex);
|
||||
ContextUtility.addToActualContext(orientGraph, getVertex());
|
||||
|
||||
Iterable<Edge> edges = vertex.getEdges(Direction.OUT, ConsistsOf.NAME);
|
||||
Iterable<Edge> edges = vertex.getEdges(Direction.OUT);
|
||||
|
||||
/*
|
||||
* Use this when the add integrity directive are inserted Iterable<Edge>
|
||||
* edges = vertex.getEdges(Direction.OUT);
|
||||
*/
|
||||
for (Edge edge : edges) {
|
||||
@SuppressWarnings("rawtypes")
|
||||
RelationManagement relationManagement = RelationManagement
|
||||
|
@ -323,7 +317,19 @@ public abstract class EntityManagement<E extends Entity> {
|
|||
|
||||
public boolean reallyRemoveFromContext() throws ContextException,
|
||||
ResourceRegistryException {
|
||||
throw new UnsupportedOperationException();
|
||||
|
||||
ContextUtility.removeFromActualContext(orientGraph, getVertex());
|
||||
|
||||
Iterable<Edge> edges = vertex.getEdges(Direction.OUT);
|
||||
|
||||
for (Edge edge : edges) {
|
||||
@SuppressWarnings("rawtypes")
|
||||
RelationManagement relationManagement = RelationManagement
|
||||
.getRelationManagement(orientGraph, edge);
|
||||
relationManagement.reallyRemoveFromContext();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
|
@ -337,7 +343,7 @@ public abstract class EntityManagement<E extends Entity> {
|
|||
entityManagement = new FacetManagement(orientGraph);
|
||||
} else {
|
||||
String error = String.format("{%s is not a %s nor a %s. "
|
||||
+ "This is really strange ad should not occur. "
|
||||
+ "This is really strange and should not occur. "
|
||||
+ "Please Investigate it.", vertex, Resource.NAME,
|
||||
Facet.NAME);
|
||||
throw new ResourceRegistryException(error);
|
||||
|
|
|
@ -52,8 +52,7 @@ public class FacetManagement extends EntityManagement<Facet> {
|
|||
}
|
||||
|
||||
public boolean reallyDelete() throws FacetNotFoundException, ResourceRegistryException {
|
||||
Vertex facet = getVertex();
|
||||
facet.remove();
|
||||
getVertex().remove();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -193,7 +193,7 @@ public class ResourceManagement extends EntityManagement<Resource> {
|
|||
|
||||
}
|
||||
|
||||
((OrientVertex) vertex).remove();
|
||||
vertex.remove();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@ import org.codehaus.jettison.json.JSONException;
|
|||
import org.codehaus.jettison.json.JSONObject;
|
||||
import org.gcube.informationsystem.model.embedded.Header;
|
||||
import org.gcube.informationsystem.model.embedded.PropagationConstraint;
|
||||
import org.gcube.informationsystem.model.embedded.PropagationConstraint.AddConstraint;
|
||||
import org.gcube.informationsystem.model.embedded.PropagationConstraint.RemoveConstraint;
|
||||
import org.gcube.informationsystem.model.entity.Entity;
|
||||
import org.gcube.informationsystem.model.entity.Facet;
|
||||
|
@ -257,11 +258,51 @@ public abstract class RelationManagement<R extends Relation> {
|
|||
|
||||
protected Edge reallyCreate(Vertex source, Vertex target)
|
||||
throws ResourceRegistryException {
|
||||
// TODO Check the relation compatibility between source and target
|
||||
logger.trace("Creating {} ({}) beetween {} -> {}",
|
||||
Relation.class.getSimpleName(), relationType,
|
||||
Utility.toJsonString(source, true),
|
||||
Utility.toJsonString(target, true));
|
||||
|
||||
EntityManagement sourceEntityManagement = EntityManagement
|
||||
.getEntityManagement(orientGraph, source);
|
||||
EntityManagement targetEntityManagement = EntityManagement
|
||||
.getEntityManagement(orientGraph, target);
|
||||
if (!(sourceEntityManagement instanceof ResourceManagement)) {
|
||||
String error = String.format(
|
||||
"Any type of %s can have only a %s as %s. "
|
||||
+ "Cannot instatiate %s beetween %s -> %s ",
|
||||
Relation.NAME, Resource.NAME, Relation.SOURCE_PROPERTY,
|
||||
relationType, sourceEntityManagement.serialize(),
|
||||
targetEntityManagement.serialize());
|
||||
throw new ResourceRegistryException(error);
|
||||
}
|
||||
|
||||
if (this instanceof IsRelatedToManagement) {
|
||||
if (!(targetEntityManagement instanceof ResourceManagement)) {
|
||||
String error = String.format("A %s can have only a %s as %s. "
|
||||
+ "Cannot instatiate %s beetween %s -> %s ", baseType,
|
||||
Resource.NAME, Relation.TARGET_PROPERTY, relationType,
|
||||
sourceEntityManagement.serialize(),
|
||||
targetEntityManagement.serialize());
|
||||
throw new ResourceRegistryException(error);
|
||||
}
|
||||
} else if (this instanceof ConsistsOfManagement) {
|
||||
if (!(targetEntityManagement instanceof FacetManagement)) {
|
||||
String error = String.format("A %s can have only a %s as %s. "
|
||||
+ "Cannot instatiate %s beetween %s -> %s ", baseType,
|
||||
Facet.NAME, Relation.TARGET_PROPERTY, relationType,
|
||||
sourceEntityManagement.serialize(),
|
||||
targetEntityManagement.serialize());
|
||||
throw new ResourceRegistryException(error);
|
||||
}
|
||||
} else {
|
||||
String error = String.format("{%s is not a %s nor a %s. "
|
||||
+ "This is really strange and should not occur. "
|
||||
+ "Please Investigate it.", this,
|
||||
IsRelatedToManagement.class.getSimpleName(),
|
||||
ConsistsOfManagement.class.getSimpleName());
|
||||
throw new ResourceRegistryException(error);
|
||||
}
|
||||
|
||||
logger.trace("Creating {} beetween {} -> {}", relationType,
|
||||
sourceEntityManagement.serialize(),
|
||||
targetEntityManagement.serialize());
|
||||
|
||||
edge = orientGraph.addEdge(null, source, target, relationType);
|
||||
|
||||
|
@ -304,12 +345,10 @@ public abstract class RelationManagement<R extends Relation> {
|
|||
|
||||
public Edge reallyUpdate() throws ResourceRegistryException {
|
||||
|
||||
logger.debug("Trying to update {} : {}", relationClass.getSimpleName(),
|
||||
jsonNode);
|
||||
logger.debug("Trying to update {} : {}", relationType, jsonNode);
|
||||
|
||||
Edge edge = getEdge();
|
||||
ERManagement.updateProperties(edge, jsonNode, ignoreKeys,
|
||||
ignoreStartWithKeys);
|
||||
ERManagement.updateProperties(edge, jsonNode, ignoreKeys, ignoreStartWithKeys);
|
||||
|
||||
if (ConsistsOf.class.isAssignableFrom(relationClass)) {
|
||||
JsonNode target = jsonNode.get(Relation.TARGET_PROPERTY);
|
||||
|
@ -328,23 +367,106 @@ public abstract class RelationManagement<R extends Relation> {
|
|||
|
||||
public boolean reallyAddToContext() throws ContextException,
|
||||
ResourceRegistryException {
|
||||
getEdge();
|
||||
|
||||
// TODO check add integrity directive
|
||||
ContextUtility.addToActualContext(orientGraph, getEdge());
|
||||
|
||||
ContextUtility.addToActualContext(orientGraph, edge);
|
||||
AddConstraint addConstraint = AddConstraint.unpropagate;
|
||||
|
||||
Vertex vertex = edge.getVertex(Direction.IN);
|
||||
EntityManagement entityManagement = EntityManagement
|
||||
.getEntityManagement(orientGraph, vertex);
|
||||
entityManagement.reallyAddToContext();
|
||||
try {
|
||||
PropagationConstraint propagationConstraint = Utility.getEmbedded(
|
||||
PropagationConstraint.class, edge,
|
||||
Relation.PROPAGATION_CONSTRAINT);
|
||||
if (propagationConstraint.getAddConstraint() != null) {
|
||||
addConstraint = propagationConstraint.getAddConstraint();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.warn("Error while getting {} from {}. Assuming {}. "
|
||||
+ "This is really strange and should not occur. "
|
||||
+ "Please Investigate it.",
|
||||
Relation.PROPAGATION_CONSTRAINT,
|
||||
Utility.toJsonString(edge, true), addConstraint);
|
||||
}
|
||||
|
||||
Vertex target = edge.getVertex(Direction.IN);
|
||||
|
||||
switch (addConstraint) {
|
||||
case propagate:
|
||||
EntityManagement entityManagement = EntityManagement
|
||||
.getEntityManagement(orientGraph, target);
|
||||
entityManagement.reallyAddToContext();
|
||||
break;
|
||||
|
||||
case unpropagate:
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
protected boolean removeFromContextTargetVertex(Vertex target)
|
||||
throws ResourceRegistryException {
|
||||
EntityManagement entityManagement = EntityManagement
|
||||
.getEntityManagement(orientGraph, target);
|
||||
if (entityManagement != null) {
|
||||
entityManagement.reallyRemoveFromContext();
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean reallyRemoveFromContext() throws ContextException,
|
||||
ResourceRegistryException {
|
||||
throw new UnsupportedOperationException();
|
||||
getEdge();
|
||||
|
||||
RemoveConstraint removeConstraint = RemoveConstraint.keep;
|
||||
|
||||
try {
|
||||
PropagationConstraint propagationConstraint = Utility.getEmbedded(
|
||||
PropagationConstraint.class, edge,
|
||||
Relation.PROPAGATION_CONSTRAINT);
|
||||
if (propagationConstraint.getRemoveConstraint() != null) {
|
||||
removeConstraint = propagationConstraint.getRemoveConstraint();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.warn("Error while getting {} from {}. Assuming {}. "
|
||||
+ "This is really strange and should not occur. "
|
||||
+ "Please Investigate it.",
|
||||
Relation.PROPAGATION_CONSTRAINT,
|
||||
Utility.toJsonString(edge, true), removeConstraint);
|
||||
}
|
||||
|
||||
Vertex target = edge.getVertex(Direction.IN);
|
||||
ContextUtility.removeFromActualContext(orientGraph, edge);
|
||||
|
||||
switch (removeConstraint) {
|
||||
case cascade:
|
||||
removeFromContextTargetVertex(target);
|
||||
break;
|
||||
|
||||
case cascadeWhenOrphan:
|
||||
Iterable<Edge> iterable = target.getEdges(Direction.IN);
|
||||
Iterator<Edge> iterator = iterable.iterator();
|
||||
if (iterator.hasNext()) {
|
||||
logger.trace(
|
||||
"{} point to {} which is not orphan. Giving {} directive, it will be not remove from current context.",
|
||||
edge, target, removeConstraint);
|
||||
} else {
|
||||
removeFromContextTargetVertex(target);
|
||||
}
|
||||
break;
|
||||
|
||||
case keep:
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
protected EntityManagement getEntityManagement()
|
||||
|
@ -404,8 +526,9 @@ public abstract class RelationManagement<R extends Relation> {
|
|||
|
||||
try {
|
||||
PropagationConstraint propagationConstraint = Utility.getEmbedded(
|
||||
PropagationConstraint.class, edge, Relation.PROPAGATION_CONSTRAINT);
|
||||
if(propagationConstraint.getRemoveConstraint()!=null){
|
||||
PropagationConstraint.class, edge,
|
||||
Relation.PROPAGATION_CONSTRAINT);
|
||||
if (propagationConstraint.getRemoveConstraint() != null) {
|
||||
removeConstraint = propagationConstraint.getRemoveConstraint();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
@ -413,8 +536,7 @@ public abstract class RelationManagement<R extends Relation> {
|
|||
+ "This is really strange and should not occur. "
|
||||
+ "Please Investigate it.",
|
||||
Relation.PROPAGATION_CONSTRAINT,
|
||||
Utility.toJsonString(edge, true),
|
||||
RemoveConstraint.keep);
|
||||
Utility.toJsonString(edge, true), removeConstraint);
|
||||
}
|
||||
|
||||
Vertex target = edge.getVertex(Direction.IN);
|
||||
|
|
|
@ -24,7 +24,7 @@ import org.slf4j.LoggerFactory;
|
|||
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
|
||||
import com.orientechnologies.orient.core.metadata.security.OSecurity;
|
||||
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
|
||||
import com.tinkerpop.blueprints.Edge;
|
||||
import com.tinkerpop.blueprints.Element;
|
||||
import com.tinkerpop.blueprints.Vertex;
|
||||
import com.tinkerpop.blueprints.impls.orient.OrientGraph;
|
||||
import com.tinkerpop.blueprints.impls.orient.OrientGraphFactory;
|
||||
|
@ -39,31 +39,31 @@ public class ContextUtility {
|
|||
private static final Logger logger = LoggerFactory
|
||||
.getLogger(ContextUtility.class);
|
||||
|
||||
public static UUID addToActualContext(OrientGraph orientGraph, Vertex vertex)
|
||||
public static UUID addToActualContext(OrientGraph orientGraph, Element element)
|
||||
throws ContextException {
|
||||
UUID contextUUID = ContextUtility.getActualContextUUID();
|
||||
SecurityContext.addToSecurityContext(orientGraph, vertex, contextUUID);
|
||||
SecurityContext.addToSecurityContext(orientGraph, element, contextUUID);
|
||||
return contextUUID;
|
||||
}
|
||||
|
||||
public static UUID addToActualContex(OSecurity oSecurity, Vertex vertex)
|
||||
public static UUID addToActualContex(OSecurity oSecurity, Element element)
|
||||
throws ContextException {
|
||||
UUID contextUUID = ContextUtility.getActualContextUUID();
|
||||
SecurityContext.addToSecurityContext(oSecurity, vertex, contextUUID);
|
||||
SecurityContext.addToSecurityContext(oSecurity, element, contextUUID);
|
||||
return contextUUID;
|
||||
}
|
||||
|
||||
public static UUID addToActualContext(OrientGraph orientGraph, Edge edge)
|
||||
public static UUID removeFromActualContext(OrientGraph orientGraph, Element element)
|
||||
throws ContextException {
|
||||
UUID contextUUID = ContextUtility.getActualContextUUID();
|
||||
SecurityContext.addToSecurityContext(orientGraph, edge, contextUUID);
|
||||
SecurityContext.removeFromSecurityContext(orientGraph, element, contextUUID);
|
||||
return contextUUID;
|
||||
}
|
||||
|
||||
public static UUID addToActualContext(OSecurity oSecurity, Edge edge)
|
||||
public static UUID removeFromActualContext(OSecurity oSecurity, Element element)
|
||||
throws ContextException {
|
||||
UUID contextUUID = ContextUtility.getActualContextUUID();
|
||||
SecurityContext.addToSecurityContext(oSecurity, edge, contextUUID);
|
||||
SecurityContext.removeFromSecurityContext(oSecurity, element, contextUUID);
|
||||
return contextUUID;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue