Merge branch 'master' of github.com:SpringSource/spring-data-graph

This commit is contained in:
Michael Hunger
2011-08-08 17:20:08 +02:00
11 changed files with 128 additions and 60 deletions

View File

@@ -16,7 +16,7 @@
<org.slf4j.version>1.5.10</org.slf4j.version>
<org.springframework.version>3.0.5.RELEASE</org.springframework.version>
<data.commons.version>1.1.0.RELEASE</data.commons.version>
<neo4j.version>1.4</neo4j.version>
<neo4j.version>1.4.1</neo4j.version>
<aspectj.version>1.6.12.M1</aspectj.version>
<blueprints.version>0.8</blueprints.version>
<gremlin.version>1.1</gremlin.version>

View File

@@ -74,10 +74,6 @@
<version>${neo4j.version}</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>com.tinkerpop</groupId>
<artifactId>gremlin</artifactId>
</exclusion>
<exclusion>
<groupId>org.neo4j</groupId>
<artifactId>neo4j</artifactId>

View File

@@ -46,7 +46,22 @@ public class RestGremlinQueryEngine implements QueryEngine<Object> {
public QueryResult<Object> query(String statement, Map<String, Object> params) {
final String data = JsonHelper.createJsonFrom(MapUtil.map("script", statement,"params",params));
final RequestResult requestResult = restRequest.get("ext/GremlinPlugin/graphdb/execute_script", data);
return new RestQueryResult(JsonHelper.readJson(requestResult.getEntity()),restGraphDatabase,resultConverter);
final Object result = JsonHelper.readJson(requestResult.getEntity());
if (requestResult.getStatus() == 500) {
return handleError(result);
} else {
return new RestQueryResult(result,restGraphDatabase,resultConverter);
}
}
private QueryResult<Object> handleError(Object result) {
if (result instanceof Map) {
Map<?, ?> mapResult = (Map<?, ?>) result;
if (RestResultException.isExceptionResult(mapResult)) {
throw new RestResultException(mapResult);
}
}
throw new RestResultException(Collections.singletonMap("exception", result.toString()));
}
static class RestQueryResult<T> implements QueryResult<T> {

View File

@@ -42,6 +42,6 @@ public class RestResultException extends RuntimeException {
}
public static boolean isExceptionResult(Map<?, ?> result) {
return result.containsKey("exception") && result.containsKey("message");
return result.containsKey("exception");
}
}

View File

@@ -56,12 +56,12 @@ public class RestTraversal implements RestTraversalDescription
return description.toString();
}
public TraversalDescription uniqueness( UniquenessFactory uniquenessFactory )
public RestTraversalDescription uniqueness( UniquenessFactory uniquenessFactory )
{
return uniqueness( uniquenessFactory, null );
}
public TraversalDescription uniqueness( UniquenessFactory uniquenessFactory, Object value )
public RestTraversalDescription uniqueness( UniquenessFactory uniquenessFactory, Object value )
{
String uniqueness = restify( uniquenessFactory );
add( "uniqueness", value == null ? uniqueness : toMap( "name", uniqueness, "value", value ) );
@@ -77,8 +77,12 @@ public class RestTraversal implements RestTraversalDescription
throw new UnsupportedOperationException( "Only values of " + Uniqueness.class + " are supported" );
}
public TraversalDescription prune( PruneEvaluator pruneEvaluator )
public RestTraversalDescription prune( PruneEvaluator pruneEvaluator )
{
if (pruneEvaluator == PruneEvaluator.NONE) {
return add( "prune_evaluator", toMap( "language", "builtin", "name", "none" ) );
}
Integer maxDepth = getMaxDepthValueOrNull( pruneEvaluator );
if ( maxDepth != null )
{
@@ -100,7 +104,7 @@ public class RestTraversal implements RestTraversalDescription
}
}
public TraversalDescription filter( Predicate<Path> pathPredicate )
public RestTraversalDescription filter( Predicate<Path> pathPredicate )
{
if ( pathPredicate == Traversal.returnAll() )
{
@@ -113,37 +117,37 @@ public class RestTraversal implements RestTraversalDescription
throw new UnsupportedOperationException( "Only builtin paths supported" );
}
public TraversalDescription evaluator( Evaluator evaluator )
public RestTraversalDescription evaluator( Evaluator evaluator )
{
return null;
throw new UnsupportedOperationException("Evaluators not yet supported");
}
public TraversalDescription prune( ScriptLanguage language, String code )
public RestTraversalDescription prune( ScriptLanguage language, String code )
{
return add( "prune_evaluator", toMap( "language", language.name().toLowerCase(), "body", code ) );
}
public TraversalDescription filter( ScriptLanguage language, String code )
public RestTraversalDescription filter( ScriptLanguage language, String code )
{
return add( "return_filter", toMap( "language", language.name().toLowerCase(), "body", code ) );
}
public TraversalDescription maxDepth( int depth )
public RestTraversalDescription maxDepth( int depth )
{
return add( "max_depth", depth );
}
public TraversalDescription order( BranchOrderingPolicy branchOrderingPolicy )
public RestTraversalDescription order( BranchOrderingPolicy branchOrderingPolicy )
{
throw new UnsupportedOperationException();
}
public TraversalDescription depthFirst()
public RestTraversalDescription depthFirst()
{
return add( "order", "depth_first" );
}
public TraversalDescription breadthFirst()
public RestTraversalDescription breadthFirst()
{
return add( "order", "breadth_first" );
}
@@ -154,12 +158,12 @@ public class RestTraversal implements RestTraversalDescription
return this;
}
public TraversalDescription relationships( RelationshipType relationshipType )
public RestTraversalDescription relationships( RelationshipType relationshipType )
{
return relationships( relationshipType, null );
}
public TraversalDescription relationships( RelationshipType relationshipType, Direction direction )
public RestTraversalDescription relationships( RelationshipType relationshipType, Direction direction )
{
if ( !description.containsKey( "relationships" ) )
{
@@ -202,12 +206,12 @@ public class RestTraversal implements RestTraversalDescription
}
}
public TraversalDescription expand( RelationshipExpander relationshipExpander )
public RestTraversalDescription expand( RelationshipExpander relationshipExpander )
{
return null;
}
public Traverser traverse( Node node )
public RestTraverser traverse( Node node )
{
final RestNode restNode = (RestNode)node;
final RestRequest request = restNode.getRestRequest();

View File

@@ -16,18 +16,57 @@
package org.springframework.data.neo4j.rest;
import org.neo4j.graphdb.traversal.TraversalDescription;
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.traversal.*;
import org.neo4j.graphdb.traversal.Traverser;
import org.neo4j.helpers.Predicate;
/**
* @author Michael Hunger
* @since 03.02.11
*/
public interface RestTraversalDescription extends TraversalDescription {
TraversalDescription prune(ScriptLanguage language, String code);
RestTraversalDescription prune(ScriptLanguage language, String code);
TraversalDescription filter(ScriptLanguage language, String code);
RestTraversalDescription filter(ScriptLanguage language, String code);
TraversalDescription maxDepth(int depth);
RestTraversalDescription maxDepth(int depth);
@Override
RestTraversalDescription uniqueness(UniquenessFactory uniquenessFactory);
@Override
RestTraversalDescription uniqueness(UniquenessFactory uniquenessFactory, Object o);
@Override
RestTraversalDescription prune(PruneEvaluator pruneEvaluator);
@Override
RestTraversalDescription filter(Predicate<Path> pathPredicate);
@Override
RestTraversalDescription evaluator(Evaluator evaluator);
@Override
RestTraversalDescription order(BranchOrderingPolicy branchOrderingPolicy);
@Override
RestTraversalDescription depthFirst();
@Override
RestTraversalDescription breadthFirst();
@Override
RestTraversalDescription relationships(RelationshipType relationshipType);
@Override
RestTraversalDescription relationships(RelationshipType relationshipType, Direction direction);
@Override
RestTraversalDescription expand(RelationshipExpander relationshipExpander);
@Override
Traverser traverse(Node node);
public enum ScriptLanguage {
JAVASCRIPT;

View File

@@ -18,7 +18,9 @@ package org.springframework.data.neo4j.rest.support;
import org.apache.commons.configuration.Configuration;
import org.mortbay.component.LifeCycle;
import org.mortbay.jetty.NCSARequestLog;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.handler.RequestLogHandler;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.kernel.AbstractGraphDatabase;
import org.neo4j.server.AddressResolver;
@@ -101,19 +103,18 @@ public class LocalTestServer {
return hostname;
}
};
final JettyStartupListener startupListener = new JettyStartupListener();
final Jetty6WebServer jettyWebServer = new Jetty6WebServer() {
@Override
protected void startJetty() {
final Server jettyServer = getJetty();
jettyServer.setStopAtShutdown(true);
final JettyStartupListener startupListener = new JettyStartupListener();
jettyServer.getServer().addLifeCycleListener(startupListener);
// System.err.println("jetty is started before notification " + jettyServer.isStarted());
final Server server = jettyServer.getServer();
server.addLifeCycleListener(startupListener);
// addAccessLogHandler(server);
super.startJetty();
startupListener.await();
// System.err.println("jetty is started after notification " + jettyServer.isStarted());
}
};
neoServer = new NeoServerWithEmbeddedWebServer(bootstrapper
@@ -123,9 +124,17 @@ public class LocalTestServer {
return port;
}
};
System.err.println(neoServer.getConfiguration());
neoServer.start();
}
private void addAccessLogHandler(Server server) {
final RequestLogHandler logHandler = new RequestLogHandler();
final NCSARequestLog requestLog = new NCSARequestLog("/tmp/NCSARequestLog.log");
logHandler.setRequestLog(requestLog);
server.addHandler(logHandler);
}
public void stop() {
try {
neoServer.stop();

View File

@@ -28,28 +28,28 @@ public class RestEntityTest extends RestTestBase {
@Test
public void testSetProperty() {
graphDb.getReferenceNode().setProperty( "name", "test" );
Node node = graphDb.getReferenceNode();
restGraphDatabase.getReferenceNode().setProperty( "name", "test" );
Node node = restGraphDatabase.getReferenceNode();
Assert.assertEquals( "test", node.getProperty( "name" ) );
}
@Test
public void testSetStringArrayProperty() {
graphDb.getReferenceNode().setProperty( "name", new String[]{"test"} );
Node node = graphDb.getReferenceNode();
restGraphDatabase.getReferenceNode().setProperty( "name", new String[]{"test"} );
Node node = restGraphDatabase.getReferenceNode();
Assert.assertArrayEquals( new String[]{"test"}, (String[])node.getProperty( "name" ) );
}
@Test
public void testSetDoubleArrayProperty() {
double[] data = {0, 1, 2};
graphDb.getReferenceNode().setProperty( "data", data );
Node node = graphDb.getReferenceNode();
restGraphDatabase.getReferenceNode().setProperty( "data", data );
Node node = restGraphDatabase.getReferenceNode();
Assert.assertTrue("same double array",Arrays.equals( data, (double[])node.getProperty( "data" ) ));
}
@Test
public void testRemoveProperty() {
Node node = graphDb.getReferenceNode();
Node node = restGraphDatabase.getReferenceNode();
node.setProperty( "name", "test" );
Assert.assertEquals( "test", node.getProperty( "name" ) );
node.removeProperty( "name" );
@@ -59,8 +59,8 @@ public class RestEntityTest extends RestTestBase {
@Test
public void testSetPropertyOnRelationship() {
Node refNode = graphDb.getReferenceNode();
Node node = graphDb.createNode();
Node refNode = restGraphDatabase.getReferenceNode();
Node node = restGraphDatabase.createNode();
Relationship rel = refNode.createRelationshipTo( node, Type.TEST );
rel.setProperty( "name", "test" );
Assert.assertEquals( "test", rel.getProperty( "name" ) );
@@ -70,8 +70,8 @@ public class RestEntityTest extends RestTestBase {
@Test
public void testRemovePropertyOnRelationship() {
Node refNode = graphDb.getReferenceNode();
Node node = graphDb.createNode();
Node refNode = restGraphDatabase.getReferenceNode();
Node node = restGraphDatabase.createNode();
Relationship rel = refNode.createRelationshipTo( node, Type.TEST );
rel.setProperty( "name", "test" );
Assert.assertEquals( "test", rel.getProperty( "name" ) );

View File

@@ -26,21 +26,21 @@ public class RestGraphDbTest extends RestTestBase {
@Test
public void testGetRefNode() {
Node refNode = graphDb.getReferenceNode();
Node nodeById = graphDb.getNodeById( 0 );
Node refNode = restGraphDatabase.getReferenceNode();
Node nodeById = restGraphDatabase.getNodeById( 0 );
Assert.assertEquals( refNode, nodeById );
}
@Test
public void testCreateNode() {
Node node = graphDb.createNode();
Assert.assertEquals( node, graphDb.getNodeById( node.getId() ) );
Node node = restGraphDatabase.createNode();
Assert.assertEquals( node, restGraphDatabase.getNodeById( node.getId() ) );
}
@Test
public void testCreateRelationship() {
Node refNode = graphDb.getReferenceNode();
Node node = graphDb.createNode();
Node refNode = restGraphDatabase.getReferenceNode();
Node node = restGraphDatabase.createNode();
Relationship rel = refNode.createRelationshipTo( node, Type.TEST );
Relationship foundRelationship = IsRelationshipToNodeMatcher.relationshipFromTo( refNode.getRelationships( Type.TEST, Direction.OUTGOING ), refNode, node );
Assert.assertNotNull( "found relationship", foundRelationship );
@@ -53,8 +53,8 @@ public class RestGraphDbTest extends RestTestBase {
@Test
public void testBasic() {
Node refNode = graphDb.getReferenceNode();
Node node = graphDb.createNode();
Node refNode = restGraphDatabase.getReferenceNode();
Node node = restGraphDatabase.createNode();
Relationship rel = refNode.createRelationshipTo( node,
DynamicRelationshipType.withName( "TEST" ) );
rel.setProperty( "date", new Date().getTime() );

View File

@@ -101,23 +101,23 @@ public class RestIndexTest extends RestTestBase {
}
private Index<Node> nodeIndex() {
return graphDb.index().forNodes(NODE_INDEX_NAME);
return restGraphDatabase.index().forNodes(NODE_INDEX_NAME);
}
private RelationshipIndex relationshipIndex() {
return graphDb.index().forRelationships(REL_INDEX_NAME);
return restGraphDatabase.index().forRelationships(REL_INDEX_NAME);
}
@Test
public void testNodeIndexIsListed() {
nodeIndex().add(node(), "name", "test");
Assert.assertTrue("node index name listed", Arrays.asList(graphDb.index().nodeIndexNames()).contains(NODE_INDEX_NAME));
Assert.assertTrue("node index name listed", Arrays.asList(restGraphDatabase.index().nodeIndexNames()).contains(NODE_INDEX_NAME));
}
@Test
public void testRelationshipIndexIsListed() {
relationshipIndex().add(relationship(), "name", "test");
Assert.assertTrue("relationship index name listed", Arrays.asList(graphDb.index().relationshipIndexNames()).contains(REL_INDEX_NAME));
Assert.assertTrue("relationship index name listed", Arrays.asList(restGraphDatabase.index().relationshipIndexNames()).contains(REL_INDEX_NAME));
}
}

View File

@@ -22,6 +22,7 @@ import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.neo4j.graphdb.Direction;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;
import org.springframework.data.neo4j.rest.RestGraphDatabase;
@@ -31,7 +32,7 @@ import java.util.Iterator;
public class RestTestBase {
protected RestGraphDatabase graphDb;
protected RestGraphDatabase restGraphDatabase;
private static final String HOSTNAME = "127.0.0.1";
public static final int PORT = 7473;
protected static LocalTestServer neoServer = new LocalTestServer(HOSTNAME,PORT).withPropertiesFile("test-db.properties");
@@ -46,7 +47,7 @@ public class RestTestBase {
@Before
public void setUp() throws Exception {
cleanDb();
graphDb = new RestGraphDatabase(new URI(SERVER_ROOT_URI));
restGraphDatabase = new RestGraphDatabase(new URI(SERVER_ROOT_URI));
}
public static void cleanDb() {
@@ -56,16 +57,20 @@ public class RestTestBase {
@AfterClass
public static void shutdownDb() {
neoServer.stop();
}
public GraphDatabaseService getGraphDatabase() {
return neoServer.getGraphDatabase();
}
protected Relationship relationship() {
Iterator<Relationship> it = node().getRelationships(Direction.OUTGOING).iterator();
if (it.hasNext()) return it.next();
return node().createRelationshipTo(graphDb.createNode(null), Type.TEST);
return node().createRelationshipTo(restGraphDatabase.createNode(null), Type.TEST);
}
protected Node node() {
return graphDb.getReferenceNode();
return restGraphDatabase.getReferenceNode();
}
}