diff --git a/pom.xml b/pom.xml index aab1a6b7a..048786b70 100644 --- a/pom.xml +++ b/pom.xml @@ -42,6 +42,7 @@ 0.13-neo4j-2.1.4 2.0.1 + false @@ -55,7 +56,7 @@ neo22 - 2.2.0-RC01 + 2.2.3 @@ -68,7 +69,7 @@ org.neo4j neo4j-spatial - 0.14-neo4j-2.2.0-M02 + 0.14-neo4j-2.2.3 diff --git a/spring-data-neo4j-cross-store/pom.xml b/spring-data-neo4j-cross-store/pom.xml index 5f70b3899..9bf8d632a 100644 --- a/spring-data-neo4j-cross-store/pom.xml +++ b/spring-data-neo4j-cross-store/pom.xml @@ -51,11 +51,11 @@ 3.3.2.BUILD-SNAPSHOT - + org.springframework.data spring-data-neo4j diff --git a/spring-data-neo4j-examples/cineasts/pom.xml b/spring-data-neo4j-examples/cineasts/pom.xml index e6c06e245..b113f04b2 100644 --- a/spring-data-neo4j-examples/cineasts/pom.xml +++ b/spring-data-neo4j-examples/cineasts/pom.xml @@ -4,17 +4,17 @@ org.neo4j.examples cineasts - 3.2.1.RELEASE + 3.3.2.BUILD-SNAPSHOT war Cineasts.net UTF-8 - 4.0.7.RELEASE + 4.0.9.RELEASE 1.7.10 ${project.version} - 2.1.5 + 2.1.7 @@ -32,6 +32,21 @@ + + neo22 + + 2.2.3 + + + + org.neo4j + neo4j-io + ${neo4j.version} + test-jar + test + + + rest @@ -224,6 +239,12 @@ test + + org.neo4j + neo4j + ${neo4j.version} + + junit junit diff --git a/spring-data-neo4j-rest/src/main/java/org/neo4j/graphdb/Result.java b/spring-data-neo4j-rest/src/main/java/org/neo4j/graphdb/Result.java new file mode 100644 index 000000000..fdaf65992 --- /dev/null +++ b/spring-data-neo4j-rest/src/main/java/org/neo4j/graphdb/Result.java @@ -0,0 +1,79 @@ +package org.neo4j.graphdb; + +import java.io.PrintWriter; +import java.util.List; +import java.util.Map; + +public interface Result extends ResourceIterator> +{ + /** + * The exact names used to represent each column in the result set. + * + * @return List of the column names. + */ + List columns(); + + /** + * Returns an iterator with the result objects from a single column of the result set. This method is best used for + * single column results. + * + *

To ensure that any resources, including transactions bound to it, are properly closed, the iterator must + * either be fully exhausted, or the {@link ResourceIterator#close() close()} method must be + * called.

+ * + * @param name exact name of the column, as it appeared in the original query + * @param desired type cast for the result objects + * @return an iterator of the result objects, possibly empty + * @throws ClassCastException when the result object can not be cast to the requested type + * @throws NotFoundException when the column name does not appear in the original query + */ + ResourceIterator columnAs(String name); + + /** + * Denotes there being more rows available in this result. These rows must either be consumed, by invoking + * {@link #next()}, or the result has to be {@link #close() closed}. + * + * @return {@code true} if there is more rows available in this result, {@code false} otherwise. + */ + boolean hasNext(); + + /** + * Returns the next row in this result. + * + * @return the next row in this result. + */ + Map next(); + + /** + * Closes the result, freeing up any resources held by the result. + * + * This is an idempotent operation, invoking it multiple times has the same effect as invoking it exactly once. + * It is thus safe (and even encouraged, for style and simplicity) to invoke this method even after consuming all + * rows in the result through the {@link #next() next-method}. + */ + void close(); + + /** + * Provides a textual representation of the query result. + *

+ * The execution result represented by this object will be consumed in its entirety after this method is called. + * Calling any of the other iterating methods on it should not be expected to return any results. + *

+ * + * @return the execution result formatted as a string + */ + String resultAsString(); + + /** + * Provides a textual representation of the query result to the provided {@link PrintWriter}. + *

+ * The execution result represented by this object will be consumed in its entirety after this method is called. + * Calling any of the other iterating methods on it should not be expected to return any results. + *

+ * @param writer the {@link PrintWriter} to receive the textual representation of the query result. + */ + void writeAsStringTo(PrintWriter writer); + + /** Removing rows from the result is not supported. */ + void remove(); +} diff --git a/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/AbstractRemoteDatabase.java b/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/AbstractRemoteDatabase.java index 9db4c9bc8..e6c8c0bd4 100644 --- a/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/AbstractRemoteDatabase.java +++ b/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/AbstractRemoteDatabase.java @@ -22,26 +22,12 @@ package org.neo4j.rest.graphdb; import org.neo4j.graphdb.*; import org.neo4j.graphdb.event.KernelEventHandler; import org.neo4j.graphdb.event.TransactionEventHandler; -import org.neo4j.kernel.GraphDatabaseAPI; -import org.neo4j.kernel.IdGeneratorFactory; -import org.neo4j.kernel.KernelData; -import org.neo4j.kernel.TransactionBuilder; -import org.neo4j.kernel.guard.Guard; -import org.neo4j.kernel.impl.core.KernelPanicEventGenerator; -import org.neo4j.kernel.impl.core.NodeManager; -import org.neo4j.kernel.impl.nioneo.store.StoreId; -import org.neo4j.kernel.impl.persistence.PersistenceSource; -import org.neo4j.kernel.impl.transaction.LockManager; -import org.neo4j.kernel.impl.transaction.XaDataSourceManager; -import org.neo4j.kernel.impl.transaction.xaframework.TxIdGenerator; -import org.neo4j.kernel.impl.util.StringLogger; -import org.neo4j.kernel.info.DiagnosticsManager; import org.neo4j.rest.graphdb.transaction.NullTransaction; -import javax.transaction.TransactionManager; -import java.util.Collection; +import java.util.Map; -abstract class AbstractRemoteDatabase implements GraphDatabaseAPI { + +abstract class AbstractRemoteDatabase implements GraphDatabaseService { public Transaction beginTx() { return new NullTransaction(); } @@ -62,11 +48,8 @@ abstract class AbstractRemoteDatabase implements GraphDatabaseAPI { throw new UnsupportedOperationException(); } - @Override - public TransactionBuilder tx() { - throw new UnsupportedOperationException(); - } - + public abstract Result execute(String s, Map map); + public abstract Result execute(String s); @Override public void shutdown() { } diff --git a/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/CypherRestGraphDatabase.java b/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/CypherRestGraphDatabase.java index fa03d38c4..2a7fee148 100644 --- a/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/CypherRestGraphDatabase.java +++ b/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/CypherRestGraphDatabase.java @@ -23,7 +23,7 @@ package org.neo4j.rest.graphdb; import org.neo4j.graphdb.*; import org.neo4j.graphdb.schema.Schema; import org.neo4j.graphdb.traversal.BidirectionalTraversalDescription; -import org.neo4j.kernel.impl.nioneo.store.StoreId; +import org.neo4j.helpers.collection.IteratorUtil; import org.neo4j.rest.graphdb.entity.RestNode; import org.neo4j.rest.graphdb.index.RestIndexManager; import org.neo4j.rest.graphdb.query.RestCypherTransactionManager; @@ -82,16 +82,11 @@ public class CypherRestGraphDatabase extends AbstractRemoteDatabase implements R public Relationship getRelationshipById( long id ) { return this.restAPI.getRelationshipById(id); } - @Override + public String getStoreDir() { return restAPI.getBaseUri(); } - @Override - public StoreId storeId() { - return null; - } - @Override public boolean isAvailable(long timeout) { return restAPI!=null; @@ -101,7 +96,6 @@ public class CypherRestGraphDatabase extends AbstractRemoteDatabase implements R return restAPI.getTxManager(); } - @Override public DependencyResolver getDependencyResolver() { return new DependencyResolver.Adapter() { @Override @@ -148,6 +142,31 @@ public class CypherRestGraphDatabase extends AbstractRemoteDatabase implements R }; } + public ResourceIterator findNodes(Label label, String property, Object value) { + return findNodesByLabelAndProperty(label, property,value).iterator(); + } + + public Node findNode(Label label, String property, Object value) { + return IteratorUtil.single(findNodes(label,property,value)); + } + + public ResourceIterator findNodes(Label label) { + Iterable nodes = restAPI.getNodesByLabel(label.name()); + return new ResourceIterableWrapper(nodes) { + protected Node underlyingObjectToObject(RestNode node) { + return node; + } + }.iterator(); + } + + public Result execute(String s) { + throw new UnsupportedOperationException(); + } + + public Result execute(String s, Map map) { + throw new UnsupportedOperationException(); + } + @Override public Schema schema() { throw new UnsupportedOperationException(); diff --git a/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/RestGraphDatabase.java b/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/RestGraphDatabase.java index 018e66848..bb442cf28 100644 --- a/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/RestGraphDatabase.java +++ b/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/RestGraphDatabase.java @@ -23,7 +23,7 @@ package org.neo4j.rest.graphdb; import org.neo4j.graphdb.*; import org.neo4j.graphdb.schema.Schema; import org.neo4j.graphdb.traversal.BidirectionalTraversalDescription; -import org.neo4j.kernel.impl.nioneo.store.StoreId; +import org.neo4j.helpers.collection.IteratorUtil; import org.neo4j.rest.graphdb.entity.RestNode; import org.neo4j.rest.graphdb.index.RestIndexManager; import org.neo4j.rest.graphdb.query.RestCypherQueryEngine; @@ -35,6 +35,7 @@ import org.neo4j.rest.graphdb.util.ResourceIterableWrapper; import javax.transaction.TransactionManager; import java.util.Collection; import java.util.LinkedHashSet; +import java.util.Map; /** * @deprecated use CypherRestGraphDatabase instead @@ -87,16 +88,11 @@ public class RestGraphDatabase extends AbstractRemoteDatabase implements RestAPI public Relationship getRelationshipById( long id ) { return this.restAPI.getRelationshipById(id); } - @Override + public String getStoreDir() { return restAPI.getBaseUri(); } - @Override - public StoreId storeId() { - return null; - } - @Override public boolean isAvailable(long timeout) { return restAPI!=null; @@ -106,7 +102,6 @@ public class RestGraphDatabase extends AbstractRemoteDatabase implements RestAPI return new NullTransactionManager(); } - @Override public DependencyResolver getDependencyResolver() { return new DependencyResolver.Adapter() { @Override @@ -144,6 +139,31 @@ public class RestGraphDatabase extends AbstractRemoteDatabase implements RestAPI }; } + public ResourceIterator findNodes(Label label, String property, Object value) { + return findNodesByLabelAndProperty(label, property,value).iterator(); + } + + public Node findNode(Label label, String property, Object value) { + return IteratorUtil.single(findNodes(label,property,value)); + } + + public ResourceIterator findNodes(Label label) { + Iterable nodes = restAPI.getNodesByLabel(label.name()); + return new ResourceIterableWrapper(nodes) { + protected Node underlyingObjectToObject(RestNode node) { + return node; + } + }.iterator(); + } + + public Result execute(String s) { + throw new UnsupportedOperationException(); + } + + public Result execute(String s, Map map) { + throw new UnsupportedOperationException(); + } + @Override public Schema schema() { throw new UnsupportedOperationException(); diff --git a/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/transaction/NullTransaction.java b/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/transaction/NullTransaction.java index 6cd51b5c9..c6c0dfba6 100644 --- a/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/transaction/NullTransaction.java +++ b/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/transaction/NullTransaction.java @@ -39,6 +39,9 @@ public class NullTransaction implements Transaction { public void failure() { } + public void terminate() { + } + @Override public Lock acquireWriteLock(PropertyContainer propertyContainer) { return null; diff --git a/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/transaction/RemoteCypherTransaction.java b/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/transaction/RemoteCypherTransaction.java index e6327c07f..28aaf39b1 100644 --- a/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/transaction/RemoteCypherTransaction.java +++ b/spring-data-neo4j-rest/src/main/java/org/neo4j/rest/graphdb/transaction/RemoteCypherTransaction.java @@ -68,6 +68,10 @@ public class RemoteCypherTransaction implements Transaction { close(); } + public void terminate() { + throw new UnsupportedOperationException(); + } + @Override public void close() { if (tx() != null && innerCounter.decrementAndGet() > 0) { diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/JtaTransactionManagerFactoryBean.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/JtaTransactionManagerFactoryBean.java index b00faa108..559c5907c 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/JtaTransactionManagerFactoryBean.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/JtaTransactionManagerFactoryBean.java @@ -22,6 +22,7 @@ import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.kernel.GraphDatabaseAPI; import org.springframework.beans.factory.FactoryBean; import org.springframework.data.neo4j.core.GraphDatabase; +import org.springframework.data.neo4j.support.Neo4jEmbeddedTransactionManager; import org.springframework.transaction.jta.JtaTransactionManager; import org.springframework.transaction.jta.UserTransactionAdapter; @@ -70,7 +71,7 @@ public class JtaTransactionManagerFactoryBean implements FactoryBean