package org.neo4j.meta.model; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Direction; import org.neo4j.graphdb.Relationship; /** * An implementation of {@link InstanceRange} for values which are instances * of {@link MetaModelClass}. */ public class InstanceEnumerationRange extends InstanceRange { private Set<Node> rangeNodes; /** * @param rangeNodes the classes the value has to comply to. */ public InstanceEnumerationRange( Node... rangeNodes ) { this.rangeNodes = new HashSet<Node>( Arrays.asList( rangeNodes ) ); } /** * Internal usage. */ public InstanceEnumerationRange() { } /** * @return the set nodes. */ public Node[] getRangeNodes() { return this.rangeNodes.toArray(new Node[ rangeNodes.size() ] ); } @Override protected void internalStore( MetaModelRestrictable<InstanceRange> owner ) { for ( Node instance : this.rangeNodes ) { owner.node().createRelationshipTo( instance, MetaModelRelTypes.META_HAS_INSTANCE ); } } private Iterable<Relationship> getRelationships( MetaModelRestrictable<InstanceRange> owner ) { return owner.node().getRelationships( MetaModelRelTypes.META_HAS_INSTANCE, Direction.OUTGOING ); } @Override protected void internalLoad( MetaModelRestrictable<InstanceRange> owner ) { this.rangeNodes = new HashSet<Node>(); for ( Relationship rel : getRelationships( owner ) ) { this.rangeNodes.add( rel.getEndNode() ) ; } } @Override protected void internalRemove( MetaModelRestrictable<InstanceRange> owner ) { for ( Relationship rel : getRelationships( owner ) ) { rel.delete(); } } @Override public String toString() { return getClass().getSimpleName() + "[" + StringUtil.join( ", ", rangeNodes.toArray( new Node[ rangeNodes.size() ] ) ) + "]"; } }