package org.neo4j.neoclipse.graphdb;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import org.neo4j.graphdb.Direction;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.NotFoundException;
import org.neo4j.graphdb.Relationship;
import org.neo4j.graphdb.RelationshipType;
import org.neo4j.graphdb.ReturnableEvaluator;
import org.neo4j.graphdb.StopEvaluator;
import org.neo4j.graphdb.TraversalPosition;
import org.neo4j.graphdb.Traverser;
import org.neo4j.graphdb.Traverser.Order;
import org.neo4j.neoclipse.reltype.DirectedRelationship;
import org.neo4j.neoclipse.reltype.RelationshipTypeHashSet;
public class DefaultTraverser implements TraversalStrategy
{
private final Set<RelationshipType> relTypes = new RelationshipTypeHashSet();
public Collection<Node> getNodes( final Node node, final int depth,
final int nodeLimit )
{
// TODO Auto-generated method stub
return null;
}
public Collection<Node> getNodes( final Node node,
final Collection<? extends DirectedRelationship> directedRels,
final int depth, final int nodeLimit )
{
List<Node> nodes = new ArrayList<Node>();
relTypes.clear();
List<Object> traverseTypes = new ArrayList<Object>();
for ( DirectedRelationship directedRel : directedRels )
{
if ( !directedRel.hasDirection() )
{
continue;
}
relTypes.add( directedRel.getRelType() );
traverseTypes.add( directedRel.getRelType() );
traverseTypes.add( directedRel.getDirection() );
}
if ( traverseTypes.isEmpty() )
{
nodes.add( node );
return nodes;
}
Object[] relDirListArray = traverseTypes.toArray();
try
{
Traverser trav = node.traverse( Order.BREADTH_FIRST,
new StopEvaluator()
{
public boolean isStopNode(
final TraversalPosition currentPos )
{
return currentPos.depth() >= depth;
}
}, ReturnableEvaluator.ALL, relDirListArray );
for ( Node currentNode : trav )
{
if ( nodes.size() >= nodeLimit )
{
break;
}
nodes.add( currentNode );
}
}
catch ( NotFoundException nfe )
{
// this happens when the start node has been removed
// somehow (could be a rollback operation)
// just return an empty array then
}
return nodes;
}
public Collection<Relationship> getRelationships( final Node start,
final Node end )
{
List<Relationship> rels = new ArrayList<Relationship>();
if ( relTypes.isEmpty() )
{
for ( Relationship r : start.getRelationships( Direction.OUTGOING ) )
{
if ( r.getEndNode().equals( end ) )
{
rels.add( r );
}
}
}
for ( RelationshipType relType : relTypes )
{
for ( Relationship r : start.getRelationships( relType,
Direction.OUTGOING ) )
{
if ( r.getEndNode().equals( end ) )
{
rels.add( r );
}
}
}
return rels;
}
}