package org.neo4j.meta.model; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import org.neo4j.graphdb.Direction; import org.neo4j.graphdb.DynamicRelationshipType; import org.neo4j.graphdb.Relationship; import org.neo4j.graphdb.RelationshipType; /** * An implementation of {@link RelationshipRange} for values which are instances * of {@link MetaModelClass}. */ public class ClassRange extends RelationshipRange { private Set<MetaModelClass> rangeClasses; /** * @param rangeClasses the classes the value has to comply to. */ public ClassRange( MetaModelClass... rangeClasses ) { this.rangeClasses = new HashSet<MetaModelClass>( Arrays.asList( rangeClasses ) ); } /** * Internal usage. */ public ClassRange() { } /** * @return the set classes. */ public MetaModelClass[] getRangeClasses() { return this.rangeClasses.toArray( new MetaModelClass[ rangeClasses.size() ] ); } /** * TODO Explain better! * @return the {@link RelationshipType} which should be created between * a meta instance and the other meta instance. */ public RelationshipType getRelationshipTypeToUse() { return DynamicRelationshipType.withName( getOwner().getName() ); } @Override protected void internalStore( MetaModelRestrictable<RelationshipRange> owner ) { for ( MetaModelClass cls : this.rangeClasses ) { owner.node().createRelationshipTo( cls.node(), MetaModelRelTypes.META_RELATIONSHIP_HAS_RANGE ); } } private Iterable<Relationship> getRelationships( MetaModelRestrictable<RelationshipRange> owner ) { return owner.node().getRelationships( MetaModelRelTypes.META_RELATIONSHIP_HAS_RANGE, Direction.OUTGOING ); } @Override protected void internalLoad( MetaModelRestrictable<RelationshipRange> owner ) { this.rangeClasses = new HashSet<MetaModelClass>(); for ( Relationship rel : getRelationships( owner ) ) { this.rangeClasses.add( new MetaModelClass( owner.model(), rel.getEndNode() ) ); } } @Override protected void internalRemove( MetaModelRestrictable<RelationshipRange> owner ) { for ( Relationship rel : getRelationships( owner ) ) { rel.delete(); } } @Override public String toString() { return getClass().getSimpleName() + "[" + StringUtil.join( ", ", rangeClasses.toArray( new MetaModelClass[ rangeClasses.size() ] ) ) + "]"; } }