diff --git a/spring-data-graph-parent/pom.xml b/spring-data-graph-parent/pom.xml index 421849b23..dd5232e2f 100644 --- a/spring-data-graph-parent/pom.xml +++ b/spring-data-graph-parent/pom.xml @@ -16,7 +16,7 @@ 1.5.10 3.0.5.RELEASE 1.1.0.RELEASE - 1.4 + 1.4.1 1.6.12.M1 0.8 1.1 diff --git a/spring-data-neo4j-rest/pom.xml b/spring-data-neo4j-rest/pom.xml index 5d815e761..4b9976b52 100644 --- a/spring-data-neo4j-rest/pom.xml +++ b/spring-data-neo4j-rest/pom.xml @@ -74,10 +74,6 @@ ${neo4j.version} test - - com.tinkerpop - gremlin - org.neo4j neo4j diff --git a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestGremlinQueryEngine.java b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestGremlinQueryEngine.java index d86ece867..0b911b0b2 100644 --- a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestGremlinQueryEngine.java +++ b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestGremlinQueryEngine.java @@ -46,7 +46,22 @@ public class RestGremlinQueryEngine implements QueryEngine { public QueryResult query(String statement, Map 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 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 implements QueryResult { diff --git a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestResultException.java b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestResultException.java index 1c4a24cb1..dae39df52 100644 --- a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestResultException.java +++ b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestResultException.java @@ -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"); } } diff --git a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestTraversal.java b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestTraversal.java index 86cb6f7e2..7d91eacae 100644 --- a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestTraversal.java +++ b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestTraversal.java @@ -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 pathPredicate ) + public RestTraversalDescription filter( Predicate 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(); diff --git a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestTraversalDescription.java b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestTraversalDescription.java index 174ae0e79..4895bb843 100644 --- a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestTraversalDescription.java +++ b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestTraversalDescription.java @@ -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 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; diff --git a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/LocalTestServer.java b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/LocalTestServer.java index d34e7c2f0..6e2724b2c 100644 --- a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/LocalTestServer.java +++ b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/LocalTestServer.java @@ -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(); diff --git a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestEntityTest.java b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestEntityTest.java index b28dd023b..36d81d597 100644 --- a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestEntityTest.java +++ b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestEntityTest.java @@ -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" ) ); diff --git a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestGraphDbTest.java b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestGraphDbTest.java index c0847bca8..444442e34 100644 --- a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestGraphDbTest.java +++ b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestGraphDbTest.java @@ -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() ); diff --git a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestIndexTest.java b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestIndexTest.java index 8e6588fcf..4fc537be9 100644 --- a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestIndexTest.java +++ b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestIndexTest.java @@ -101,23 +101,23 @@ public class RestIndexTest extends RestTestBase { } private Index 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)); } } diff --git a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestTestBase.java b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestTestBase.java index ca25757ab..be038b139 100644 --- a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestTestBase.java +++ b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestTestBase.java @@ -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 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(); } }