/*
* Licensed to "Neo Technology," Network Engine for Objects in Lund AB
* (http://neotechnology.com) under one or more contributor license agreements.
* See the NOTICE file distributed with this work for additional information
* regarding copyright ownership. Neo Technology licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of the License
* at (http://www.apache.org/licenses/LICENSE-2.0). Unless required by
* applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
* OF ANY KIND, either express or implied. See the License for the specific
* language governing permissions and limitations under the License.
*/
package org.neo4j.neoclipse.view;
import java.util.Collection;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.zest.core.viewers.IGraphEntityRelationshipContentProvider;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.RelationshipType;
import org.neo4j.neoclipse.Activator;
import org.neo4j.neoclipse.graphdb.DefaultTraverser;
import org.neo4j.neoclipse.graphdb.GraphCallable;
import org.neo4j.neoclipse.graphdb.GraphDbServiceManager;
import org.neo4j.neoclipse.graphdb.TraversalStrategy;
import org.neo4j.neoclipse.preference.Preferences;
import org.neo4j.neoclipse.reltype.DirectedRelationship;
import org.neo4j.neoclipse.reltype.RelationshipTypeHashSet;
import org.neo4j.neoclipse.reltype.RelationshipTypesProvider;
import org.neo4j.neoclipse.reltype.RelationshipTypesProviderWrapper;
/**
* Provides the elements that must be displayed in the graph.
*
* @author Peter Hänsgen
*/
public class NeoGraphContentProvider implements
IGraphEntityRelationshipContentProvider
{
/**
* Limit the number of nodes returned.
*/
private final RelationshipTypesProvider relTypesProvider = RelationshipTypesProviderWrapper.getInstance();
/**
* The view.
*/
protected NeoGraphViewPart view;
private final TraversalStrategy traverser = new DefaultTraverser();
// private final TraversalStrategy traverser = new DefaultTraverser();
private final Set<RelationshipType> relTypes = new RelationshipTypeHashSet();
private final IPreferenceStore preferenceStore;
/**
* The constructor.
*/
public NeoGraphContentProvider( final NeoGraphViewPart view )
{
this.view = view;
preferenceStore = Activator.getDefault().getPreferenceStore();
}
/**
* Returns the relationships between the given nodes.
*/
public Object[] getRelationships( final Object source, final Object dest )
{
if ( source == null || dest == null )
{
return new Object[] {};
}
final Node start = (Node) source;
final Node end = (Node) dest;
try
{
return Activator.getDefault().getGraphDbServiceManager().submitTask(
new Callable<Object[]>()
{
public Object[] call() throws Exception
{
return traverser.getRelationships( start, end ).toArray();
}
}, "find rels" ).get();
}
catch ( InterruptedException e )
{
e.printStackTrace();
}
catch ( ExecutionException e )
{
e.printStackTrace();
}
return new Object[] {};
}
/**
* Returns all nodes the given node is connected with.
*/
public Object[] getElements( final Object inputElement )
{
if ( inputElement == null )
{
return new Node[] {};
}
final Node node = (Node) inputElement;
GraphDbServiceManager gsm = Activator.getDefault().getGraphDbServiceManager();
if ( gsm == null || !gsm.isRunning() )
{
return new Node[] { node };
}
try
{
return gsm.submitTask( new GraphCallable<Object[]>()
{
public Object[] call( final GraphDatabaseService graphDb )
{
return getTheElements( node, graphDb );
}
}, "get elements" ).get();
}
catch ( InterruptedException e )
{
e.printStackTrace();
}
catch ( ExecutionException e )
{
e.printStackTrace();
}
return new Node[] { node };
}
private Object[] getTheElements( final Node node,
final GraphDatabaseService graphDb )
{
GraphDbServiceManager nsm = Activator.getDefault().getGraphDbServiceManager();
if ( nsm == null || !nsm.isRunning() )
{
return new Node[] { node };
}
Collection<? extends DirectedRelationship> relDirList;
relDirList = relTypesProvider.getFilteredDirectedRelationships();
if ( relDirList.isEmpty() )
{
// if there are no relationship types,
// there can't be any relationships ...
return new Node[] { node };
}
Object[] relDirListArray = relDirList.toArray();
relTypes.clear();
for ( Object o : relDirListArray )
{
if ( o instanceof RelationshipType )
{
relTypes.add( (RelationshipType) o );
}
}
final int depth = view.getTraversalDepth();
int max = preferenceStore.getInt( Preferences.MAX_NODES );
return traverser.getNodes( node, relDirList, depth, max ).toArray();
}
public void dispose()
{
}
public void inputChanged( final Viewer viewer, final Object oldInput,
final Object newInput )
{
}
}