package er.neo4jadaptor.storage.neo4j; import org.neo4j.graphdb.Direction; import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Relationship; import org.neo4j.graphdb.RelationshipType; import com.webobjects.eoaccess.EOEntity; import er.extensions.foundation.ERXProperties; /** * Makes imaginary division of nodes between temporary and permanent. Temporary nodes can be periodically removed if not used. * Temporary nodes are marked by special relationship to the root node. * * @author Jedrzej Sobanski */ public class NodeSpaceManager { private final GraphDatabaseService db; public NodeSpaceManager(GraphDatabaseService db) { this.db = db; } /** * Marks node as temporary. Node must be neither temporary nor permanent (state not set) * @param node */ public void setIsTemporary(Node node) { Node root = db.getReferenceNode(); root.createRelationshipTo(node, Space.TEMPORARY); } public void setIsPermanent(Node node, EOEntity entity) { Relationship tempRelationship = node.getSingleRelationship(Space.TEMPORARY, Direction.INCOMING); if (tempRelationship != null) { tempRelationship.delete(); } if (shouldLinkToRoot(entity)) { Node root = db.getReferenceNode(); root.createRelationshipTo(node, Space.PERMANENT); } } private boolean shouldLinkToRoot(EOEntity entity) { String property = "n4j.entity." + entity.name() + ".linkPermanentToRoot"; boolean linkToRoot = ERXProperties.booleanForKeyWithDefault(property, false); return linkToRoot; } public boolean isTemporary(Node node) { return node.hasRelationship(Space.TEMPORARY); } public boolean isPermanent(Node node) { return ! isTemporary(node); } public static enum Space implements RelationshipType { /** space for nodes created temporary, that should eventually end up in PERMANENT space. If they won't, then should be removed */ TEMPORARY, PERMANENT ; } }