Merge branch 'master' of github.com:SpringSource/spring-data-graph
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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> {
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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" ) );
|
||||
|
||||
@@ -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() );
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user