From be66f16dfdf5610dc3d2a09411522d7200c6062c Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Sun, 2 Oct 2011 23:53:25 +0200 Subject: [PATCH] made all tests of all modules green again fixed cross store tests, mainly configuration, moved missing config files fixed rest tests, update to new index query, update gremlin plugin parameters --- .gitignore | 1 + .../data/neo4j/support/TestTeam.java | 1 + .../neo4j/support/query/QueryEngineTest.java | 4 ++- spring-data-neo4j-cross-store/pom.xml | 33 ++++++++++++++++++ .../config/CrossStoreNeo4jConfiguration.java | 21 ++++++++++-- ... => CrossStoreNodeEntityInstantiator.java} | 11 +++--- ...te.java => CrossStoreNodeEntityState.java} | 34 ++++++++++--------- .../CrossStoreNodeEntityStateFactory.java | 27 +++++++++++---- .../test/resources/META-INF/persistence.xml | 0 .../META-INF/spring/database.properties | 0 ...mespaceHandlerTest-cross-store-context.xml | 2 +- .../Neo4jGraphRecommendationTest-context.xml | 23 +++++++++---- spring-data-neo4j-parent/pom.xml | 4 +-- spring-data-neo4j-rest/pom.xml | 22 +++++++++++- .../neo4j/rest/RestGremlinQueryEngine.java | 4 +-- .../data/neo4j/rest/index/RestIndex.java | 16 +++++++-- .../neo4j/rest/support/ServerPluginTest.java | 1 - .../data/neo4j/core/EntityState.java | 6 ++-- .../neo4j/fieldaccess/DefaultEntityState.java | 6 ++-- .../fieldaccess/DetachedEntityState.java | 7 ++-- .../neo4j/support/GraphDatabaseContext.java | 7 +++- .../support/node/NodeEntityStateFactory.java | 2 +- .../neo4j/support/query/GremlinExecutor.java | 2 +- 23 files changed, 173 insertions(+), 61 deletions(-) rename spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/{PartialNodeEntityInstantiator.java => CrossStoreNodeEntityInstantiator.java} (82%) rename spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/{PartialNodeEntityState.java => CrossStoreNodeEntityState.java} (81%) rename {spring-data-neo4j-aspects => spring-data-neo4j-cross-store}/src/test/resources/META-INF/persistence.xml (100%) rename {spring-data-neo4j-aspects => spring-data-neo4j-cross-store}/src/test/resources/META-INF/spring/database.properties (100%) rename {spring-data-neo4j-aspects => spring-data-neo4j-cross-store}/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTest-context.xml (91%) diff --git a/.gitignore b/.gitignore index 4d766f8cc..b82f0abfb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +ajcore* .idea *.log .DS_Store diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/support/TestTeam.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/support/TestTeam.java index ac8a24dbb..0de50ff45 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/support/TestTeam.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/support/TestTeam.java @@ -49,6 +49,7 @@ public class TestTeam { sdg.addPerson(michael); sdg.addPerson(emil); sdg.addPerson(david); + sdg.persist(); } public Map simpleRowFor(final Person person, String prefix) { diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/support/query/QueryEngineTest.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/support/query/QueryEngineTest.java index 552ff8e60..634e7be39 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/support/query/QueryEngineTest.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/support/query/QueryEngineTest.java @@ -27,6 +27,7 @@ import org.springframework.core.convert.ConversionService; import org.springframework.data.neo4j.Person; import org.springframework.data.neo4j.Personality; import org.springframework.data.neo4j.annotation.QueryType; +import org.springframework.data.neo4j.conversion.QueryResult; import org.springframework.data.neo4j.conversion.ResultConverter; import org.springframework.data.neo4j.core.GraphDatabase; import org.springframework.data.neo4j.core.NodeBacked; @@ -96,7 +97,8 @@ public class QueryEngineTest { @Test public void testQueryListOfTypeNode() throws Exception { final String queryString = "start person=(name_index,name,\"%name\") match (person) <-[:boss]- (boss) return boss"; - final Collection result = IteratorUtil.asCollection(queryEngine.query(queryString, michaelsName()).to(Node.class)); + final QueryResult> queryResult = queryEngine.query(queryString, michaelsName()); + final Collection result = IteratorUtil.asCollection(queryResult.to(Node.class)); assertEquals(asList(nodeFor(testTeam.emil)),result); } diff --git a/spring-data-neo4j-cross-store/pom.xml b/spring-data-neo4j-cross-store/pom.xml index 2c5d2bf72..a706db853 100644 --- a/spring-data-neo4j-cross-store/pom.xml +++ b/spring-data-neo4j-cross-store/pom.xml @@ -86,6 +86,35 @@ true + + org.neo4j + neo4j-cypher + true + + + + org.neo4j + server-api + true + + + + com.tinkerpop.blueprints + blueprints-core + true + + + com.tinkerpop.blueprints + blueprints-neo4j-graph + true + + + + com.tinkerpop + gremlin + true + + org.mockito mockito-all @@ -205,6 +234,10 @@ org.springframework spring-aspects + + org.springframework.data + spring-data-neo4j-aspects + 1.6 1.6 diff --git a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/config/CrossStoreNeo4jConfiguration.java b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/config/CrossStoreNeo4jConfiguration.java index c6d638fef..cead29db3 100644 --- a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/config/CrossStoreNeo4jConfiguration.java +++ b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/config/CrossStoreNeo4jConfiguration.java @@ -1,3 +1,18 @@ +/** + * Copyright 2011 the original author or authors. + * + * Licensed 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.springframework.data.neo4j.config; import org.neo4j.graphdb.Node; @@ -9,7 +24,7 @@ import org.springframework.data.neo4j.support.EntityInstantiator; import org.springframework.data.neo4j.support.node.CrossStoreNodeEntityStateFactory; import org.springframework.data.neo4j.support.node.NodeEntityInstantiator; import org.springframework.data.neo4j.support.node.NodeEntityStateFactory; -import org.springframework.data.neo4j.support.node.PartialNodeEntityInstantiator; +import org.springframework.data.neo4j.support.node.CrossStoreNodeEntityInstantiator; import org.springframework.data.neo4j.transaction.ChainedTransactionManager; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.transaction.PlatformTransactionManager; @@ -43,9 +58,9 @@ public class CrossStoreNeo4jConfiguration extends Neo4jAspectConfiguration { @Bean protected EntityInstantiator graphEntityInstantiator() { if (isUsingCrossStorePersistence()) { - return new PartialNodeEntityInstantiator(new NodeEntityInstantiator(mappingContext), entityManagerFactory); + return new CrossStoreNodeEntityInstantiator(new NodeEntityInstantiator(entityStateHandler()), entityManagerFactory); } else { - return new NodeEntityInstantiator(mappingContext); + return new NodeEntityInstantiator(entityStateHandler()); } } diff --git a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/PartialNodeEntityInstantiator.java b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/CrossStoreNodeEntityInstantiator.java similarity index 82% rename from spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/PartialNodeEntityInstantiator.java rename to spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/CrossStoreNodeEntityInstantiator.java index f74252785..2f6f89a60 100644 --- a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/PartialNodeEntityInstantiator.java +++ b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/CrossStoreNodeEntityInstantiator.java @@ -17,6 +17,7 @@ package org.springframework.data.neo4j.support.node; import org.neo4j.graphdb.Node; +import org.springframework.data.neo4j.core.NodeBacked; import org.springframework.data.neo4j.support.EntityInstantiator; import org.springframework.orm.jpa.EntityManagerFactoryUtils; @@ -29,13 +30,13 @@ import javax.persistence.EntityManagerFactory; * @author Michael Hunger * @since 02.10.2010 */ -public class PartialNodeEntityInstantiator implements EntityInstantiator { +public class CrossStoreNodeEntityInstantiator implements EntityInstantiator { private final NodeEntityInstantiator delegate; private EntityManagerFactory entityManagerFactory; - public PartialNodeEntityInstantiator(NodeEntityInstantiator delegate, EntityManagerFactory entityManagerFactory) { + public CrossStoreNodeEntityInstantiator(NodeEntityInstantiator delegate, EntityManagerFactory entityManagerFactory) { this.delegate = delegate; this.entityManagerFactory = entityManagerFactory; } @@ -50,10 +51,10 @@ public class PartialNodeEntityInstantiator implements EntityInstantiator { * @return */ public T createEntityFromState(Node n, Class entityClass) { - if (n.hasProperty(PartialNodeEntityState.FOREIGN_ID)) { - final Object foreignId = n.getProperty(PartialNodeEntityState.FOREIGN_ID); + if (n.hasProperty(CrossStoreNodeEntityState.FOREIGN_ID)) { + final Object foreignId = n.getProperty(CrossStoreNodeEntityState.FOREIGN_ID); final T result = entityManager().find(entityClass, foreignId); - result.setPersistentState(n); + ((NodeBacked)result).setPersistentState(n); return result; } return delegate.createEntityFromState(n, entityClass); diff --git a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/PartialNodeEntityState.java b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/CrossStoreNodeEntityState.java similarity index 81% rename from spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/PartialNodeEntityState.java rename to spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/CrossStoreNodeEntityState.java index 5090f638b..68ca6bd00 100644 --- a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/PartialNodeEntityState.java +++ b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/CrossStoreNodeEntityState.java @@ -38,7 +38,7 @@ import java.util.Collection; * @author Michael Hunger * @since 21.09.2010 */ -public class PartialNodeEntityState extends DefaultEntityState { +public class CrossStoreNodeEntityState extends DefaultEntityState { public static final String FOREIGN_ID = "foreignId"; public static final String FOREIGN_ID_INDEX = "foreign_id"; @@ -46,7 +46,7 @@ public class PartialNodeEntityState extends DefaultEn private final GraphDatabaseContext graphDatabaseContext; private PersistenceUnitUtil persistenceUnitUtil; - public PartialNodeEntityState(final Node underlyingState, final ENTITY entity, final Class type, final GraphDatabaseContext graphDatabaseContext, PersistenceUnitUtil persistenceUnitUtil, final PartialNodeDelegatingFieldAccessorFactory delegatingFieldAccessorFactory, final Neo4jPersistentEntity persistentEntity) { + public CrossStoreNodeEntityState(final Node underlyingState, final ENTITY entity, final Class type, final GraphDatabaseContext graphDatabaseContext, PersistenceUnitUtil persistenceUnitUtil, final CrossStoreNodeDelegatingFieldAccessorFactory delegatingFieldAccessorFactory, final Neo4jPersistentEntity persistentEntity) { super(underlyingState, entity, type, delegatingFieldAccessorFactory, persistentEntity); this.graphDatabaseContext = graphDatabaseContext; this.persistenceUnitUtil = persistenceUnitUtil; @@ -55,6 +55,7 @@ public class PartialNodeEntityState extends DefaultEn // TODO handle non persisted Entity like running outside of an transaction @Override public void createAndAssignState() { + @SuppressWarnings("unchecked") ENTITY entity = (ENTITY) this.entity; if (entity.getPersistentState() != null) return; try { final Object id = getId(entity); @@ -77,17 +78,18 @@ public class PartialNodeEntityState extends DefaultEn } } + @SuppressWarnings("unchecked") @Override public ENTITY persist() { if (getPersistentState() == null) { createAndAssignState(); } - return entity; + return (ENTITY) entity; } @Override public boolean isWritable(Field field) { - final FieldAccessor accessor = accessorFor(property(field)); + final FieldAccessor accessor = accessorFor(property(field)); if (accessor == null) return false; // difference to default behaviour, we don't care for non-managed fields here return accessor.isWriteable(entity); } @@ -112,15 +114,15 @@ public class PartialNodeEntityState extends DefaultEn return persistenceUnitUtil!=null ? persistenceUnitUtil.getIdentifier(entity) : null; } - public static class PartialNodeDelegatingFieldAccessorFactory extends DelegatingFieldAccessorFactory { + public static class CrossStoreNodeDelegatingFieldAccessorFactory extends DelegatingFieldAccessorFactory { - public PartialNodeDelegatingFieldAccessorFactory(GraphDatabaseContext graphDatabaseContext) { + public CrossStoreNodeDelegatingFieldAccessorFactory(GraphDatabaseContext graphDatabaseContext) { super(graphDatabaseContext); } @Override - protected Collection> createListenerFactories() { - return Arrays.>asList( + protected Collection createListenerFactories() { + return Arrays.asList( new IndexingPropertyFieldAccessorListenerFactory( getGraphDatabaseContext(), newPropertyFieldAccessorFactory(), @@ -134,12 +136,12 @@ public class PartialNodeEntityState extends DefaultEn } @Override - protected Collection> createAccessorFactories() { - return Arrays.>asList( + protected Collection createAccessorFactories() { + return Arrays.asList( //new IdFieldAccessorFactory(), //new TransientFieldAccessorFactory(), - new TraversalFieldAccessorFactory(), - new QueryFieldAccessorFactory(), + new TraversalFieldAccessorFactory(graphDatabaseContext), + new QueryFieldAccessorFactory(graphDatabaseContext), newPropertyFieldAccessorFactory(), newConvertingNodePropertyFieldAccessorFactory(), new SingleRelationshipFieldAccessorFactory(getGraphDatabaseContext()) { @@ -155,7 +157,7 @@ public class PartialNodeEntityState extends DefaultEn } private ConvertingNodePropertyFieldAccessorFactory newConvertingNodePropertyFieldAccessorFactory() { - return new ConvertingNodePropertyFieldAccessorFactory(getGraphDatabaseContext().getConversionService()) { + return new ConvertingNodePropertyFieldAccessorFactory(getGraphDatabaseContext()) { @Override public boolean accept(Neo4jPersistentProperty property) { return property.isAnnotationPresent(GraphProperty.class) && super.accept(property); @@ -164,10 +166,10 @@ public class PartialNodeEntityState extends DefaultEn } private PropertyFieldAccessorFactory newPropertyFieldAccessorFactory() { - return new PropertyFieldAccessorFactory(getGraphDatabaseContext().getConversionService()) { + return new PropertyFieldAccessorFactory(getGraphDatabaseContext()) { @Override - public boolean accept(Neo4jPersistentProperty f) { - return f.isAnnotationPresent(GraphProperty.class) && super.accept(f); + public boolean accept(Neo4jPersistentProperty property) { + return property.isAnnotationPresent(GraphProperty.class) && super.accept(property); } }; } diff --git a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/CrossStoreNodeEntityStateFactory.java b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/CrossStoreNodeEntityStateFactory.java index ec8d5646f..4b0e0e3f4 100644 --- a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/CrossStoreNodeEntityStateFactory.java +++ b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/CrossStoreNodeEntityStateFactory.java @@ -1,3 +1,18 @@ +/** + * Copyright 2011 the original author or authors. + * + * Licensed 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.springframework.data.neo4j.support.node; import org.neo4j.graphdb.Node; @@ -16,15 +31,15 @@ import javax.persistence.PersistenceUnitUtil; * @since 30.09.11 */ public class CrossStoreNodeEntityStateFactory extends NodeEntityStateFactory { - private PartialNodeEntityState.PartialNodeDelegatingFieldAccessorFactory delegatingFieldAccessorFactory; + private CrossStoreNodeEntityState.CrossStoreNodeDelegatingFieldAccessorFactory delegatingFieldAccessorFactory; private EntityManagerFactory entityManagerFactory; - public EntityState getEntityState(final NodeBacked entity) { + public EntityState getEntityState(final Object entity) { final Class entityType = entity.getClass(); final NodeEntity graphEntityAnnotation = entityType.getAnnotation(NodeEntity.class); // todo cache ?? final Neo4jPersistentEntity persistentEntity = mappingContext.getPersistentEntity(entityType); if (graphEntityAnnotation.partial()) { - final PartialNodeEntityState partialNodeEntityState = new PartialNodeEntityState(null, entity, entityType, graphDatabaseContext, getPersistenceUnitUtils(), delegatingFieldAccessorFactory, (Neo4jPersistentEntity) persistentEntity); + final CrossStoreNodeEntityState partialNodeEntityState = new CrossStoreNodeEntityState(null, (NodeBacked)entity, (Class) entityType, graphDatabaseContext, getPersistenceUnitUtils(), delegatingFieldAccessorFactory, persistentEntity); return new DetachedEntityState(partialNodeEntityState, graphDatabaseContext) { @Override protected boolean isDetached() { @@ -32,14 +47,14 @@ public class CrossStoreNodeEntityStateFactory extends NodeEntityStateFactory { } }; } else { - NodeEntityState nodeEntityState = new NodeEntityState(null, entity, entityType, graphDatabaseContext, nodeDelegatingFieldAccessorFactory, (Neo4jPersistentEntity) persistentEntity); + NodeEntityState nodeEntityState = new NodeEntityState(null, entity, entityType, graphDatabaseContext, nodeDelegatingFieldAccessorFactory, (Neo4jPersistentEntity) persistentEntity); // alternative was return new NestedTransactionEntityState(nodeEntityState,graphDatabaseContext); return new DetachedEntityState(nodeEntityState, graphDatabaseContext); } } private PersistenceUnitUtil getPersistenceUnitUtils() { - if (entityManagerFactory == null) return null; + if (entityManagerFactory == null|| !entityManagerFactory.isOpen()) return null; return entityManagerFactory.getPersistenceUnitUtil(); } @@ -49,7 +64,7 @@ public class CrossStoreNodeEntityStateFactory extends NodeEntityStateFactory { @PostConstruct private void setUp() { - this.delegatingFieldAccessorFactory = new PartialNodeEntityState.PartialNodeDelegatingFieldAccessorFactory(graphDatabaseContext); + this.delegatingFieldAccessorFactory = new CrossStoreNodeEntityState.CrossStoreNodeDelegatingFieldAccessorFactory(graphDatabaseContext); } } diff --git a/spring-data-neo4j-aspects/src/test/resources/META-INF/persistence.xml b/spring-data-neo4j-cross-store/src/test/resources/META-INF/persistence.xml similarity index 100% rename from spring-data-neo4j-aspects/src/test/resources/META-INF/persistence.xml rename to spring-data-neo4j-cross-store/src/test/resources/META-INF/persistence.xml diff --git a/spring-data-neo4j-aspects/src/test/resources/META-INF/spring/database.properties b/spring-data-neo4j-cross-store/src/test/resources/META-INF/spring/database.properties similarity index 100% rename from spring-data-neo4j-aspects/src/test/resources/META-INF/spring/database.properties rename to spring-data-neo4j-cross-store/src/test/resources/META-INF/spring/database.properties diff --git a/spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest-cross-store-context.xml b/spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest-cross-store-context.xml index ce7e197a1..aa706a0f5 100644 --- a/spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest-cross-store-context.xml +++ b/spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest-cross-store-context.xml @@ -24,6 +24,6 @@ - + \ No newline at end of file diff --git a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTest-context.xml b/spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTest-context.xml similarity index 91% rename from spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTest-context.xml rename to spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTest-context.xml index 73e48d1f1..d0a089295 100644 --- a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTest-context.xml +++ b/spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTest-context.xml @@ -93,15 +93,24 @@ + + - - - - + + - + + + + + + + + + + + @@ -112,7 +121,7 @@ - + diff --git a/spring-data-neo4j-parent/pom.xml b/spring-data-neo4j-parent/pom.xml index 07b9a0cd6..b387470a7 100644 --- a/spring-data-neo4j-parent/pom.xml +++ b/spring-data-neo4j-parent/pom.xml @@ -127,8 +127,8 @@ 1.2.0.BUILD-SNAPSHOT 1.5-SNAPSHOT 1.6.12.M1 - 0.8 - 1.1 + 1.0 + 1.3 diff --git a/spring-data-neo4j-rest/pom.xml b/spring-data-neo4j-rest/pom.xml index a83a77817..0b7ae6c9b 100644 --- a/spring-data-neo4j-rest/pom.xml +++ b/spring-data-neo4j-rest/pom.xml @@ -9,6 +9,7 @@ spring-data-neo4j-rest jar + 2.0.0.BUILD-SNAPSHOT Spring Data Neo4j REST Wrapper @@ -36,9 +37,10 @@ test test-jar + org.springframework.data - spring-data-neo4j + spring-data-neo4j-aspects ${project.version} @@ -123,6 +125,24 @@ + + + com.tinkerpop.blueprints + blueprints-core + true + + + com.tinkerpop.blueprints + blueprints-neo4j-graph + true + + + + com.tinkerpop + gremlin + true + + commons-configuration commons-configuration 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 2233eb6cf..024827677 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 @@ -44,8 +44,8 @@ public class RestGremlinQueryEngine implements QueryEngine { @Override public QueryResult query(String statement, Map params) { - final String paramsString = JsonHelper.createJsonFrom(params == null ? Collections.emptyMap() : params); - final String data = JsonHelper.createJsonFrom(MapUtil.map("script", statement,"params",paramsString)); + //final String paramsString = JsonHelper.createJsonFrom(params == null ? Collections.emptyMap() : params); + final String data = JsonHelper.createJsonFrom(MapUtil.map("script", statement,"params",params)); final RequestResult requestResult = restRequest.get("ext/GremlinPlugin/graphdb/execute_script", data); final Object result = JsonHelper.readJson(requestResult.getEntity()); if (requestResult.getStatus() == 500) { diff --git a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/index/RestIndex.java b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/index/RestIndex.java index 25c2b8bb7..fae00f946 100644 --- a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/index/RestIndex.java +++ b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/index/RestIndex.java @@ -20,8 +20,9 @@ package org.springframework.data.neo4j.rest.index; import org.neo4j.graphdb.PropertyContainer; import org.neo4j.graphdb.index.Index; import org.neo4j.graphdb.index.IndexHits; +import org.neo4j.helpers.collection.MapUtil; +import org.neo4j.index.lucene.ValueContext; import org.springframework.data.neo4j.rest.*; -import org.springframework.data.neo4j.support.*; import java.util.Collection; import java.util.Collections; @@ -53,7 +54,12 @@ public abstract class RestIndex implements Index public void add( T entity, String key, Object value ) { String uri = ( (RestEntity) entity ).getUri(); - restRequest.post(indexPath(key, value), JsonHelper.createJsonFrom(uri)); + if (value instanceof ValueContext) { + value = ((ValueContext)value).getCorrectValue(); + } + final Map data = MapUtil.map("key", key, "value", value, "uri", uri); + final RequestResult result = restRequest.post(indexPath(), JsonHelper.createJsonFrom(data)); + if (result.getStatus()!=201) throw new RestResultException(restRequest.toMap(result)); } protected String indexPath( ) { @@ -87,6 +93,11 @@ public abstract class RestIndex implements Index restRequest.delete( indexPath( )); } + @Override + public boolean isWriteable() { + return true; + } + public IndexHits get( String key, Object value ) { return query( key, value ); } @@ -156,5 +167,6 @@ public abstract class RestIndex implements Index public void remove() { } + } } diff --git a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/ServerPluginTest.java b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/ServerPluginTest.java index eb9cdcf37..c636daaab 100644 --- a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/ServerPluginTest.java +++ b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/ServerPluginTest.java @@ -24,7 +24,6 @@ import org.codehaus.jackson.map.ObjectMapper; import org.junit.BeforeClass; import org.junit.Test; import org.springframework.data.neo4j.Person; -import org.springframework.data.neo4j.Person; import org.springframework.data.neo4j.rest.RequestResult; import org.springframework.data.neo4j.server.ProvidedClassPathXmlApplicationContext; diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/EntityState.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/EntityState.java index 49baca425..bd5442925 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/EntityState.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/EntityState.java @@ -16,12 +16,12 @@ package org.springframework.data.neo4j.core; -import java.lang.reflect.Field; - import org.springframework.data.neo4j.fieldaccess.FieldAccessor; import org.springframework.data.neo4j.mapping.Neo4jPersistentEntity; import org.springframework.data.neo4j.mapping.Neo4jPersistentProperty; +import java.lang.reflect.Field; + /** * Interface for classes encapsulating and delegating read and write field access of an GraphBacked entity to a number of field accessors. * Wraps the entity, the underlying state and also handles the creation of the state (call back). @@ -72,5 +72,5 @@ public interface EntityState { Object persist(); - Neo4jPersistentEntity getPersistentEntity(); + Neo4jPersistentEntity getPersistentEntity(); } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DefaultEntityState.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DefaultEntityState.java index 345df25e0..d0d4a0f59 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DefaultEntityState.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DefaultEntityState.java @@ -40,9 +40,9 @@ public abstract class DefaultEntityState implements EntityState { private STATE state; protected final static Log log= LogFactory.getLog(DefaultEntityState.class); private final FieldAccessorFactoryProviders fieldAccessorFactoryProviders; - private final Neo4jPersistentEntity persistentEntity; + private final Neo4jPersistentEntity persistentEntity; - public DefaultEntityState(final STATE underlyingState, final Object entity, final Class type, final DelegatingFieldAccessorFactory delegatingFieldAccessorFactory, Neo4jPersistentEntity persistentEntity) { + public DefaultEntityState(final STATE underlyingState, final Object entity, final Class type, final DelegatingFieldAccessorFactory delegatingFieldAccessorFactory, Neo4jPersistentEntity persistentEntity) { this.state = underlyingState; this.entity = entity; this.type = type; @@ -79,7 +79,7 @@ public abstract class DefaultEntityState implements EntityState { return state; } - public Neo4jPersistentEntity getPersistentEntity() { + public Neo4jPersistentEntity getPersistentEntity() { return persistentEntity; } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DetachedEntityState.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DetachedEntityState.java index 86f3dfafc..bf1864bc7 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DetachedEntityState.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DetachedEntityState.java @@ -20,15 +20,12 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.neo4j.graphdb.Transaction; import org.springframework.data.neo4j.core.EntityState; - - import org.springframework.data.neo4j.mapping.Neo4jPersistentEntity; import org.springframework.data.neo4j.mapping.Neo4jPersistentProperty; import org.springframework.data.neo4j.support.GraphDatabaseContext; import org.springframework.util.ObjectUtils; import java.lang.reflect.Field; -import java.util.Collection; import java.util.ConcurrentModificationException; import java.util.HashMap; import java.util.Map; @@ -44,7 +41,7 @@ public class DetachedEntityState implements EntityState { protected final EntityState delegate; private final static Log log = LogFactory.getLog(DetachedEntityState.class); private GraphDatabaseContext graphDatabaseContext; - private Neo4jPersistentEntity persistentEntity; + private Neo4jPersistentEntity persistentEntity; public DetachedEntityState(final EntityState delegate, GraphDatabaseContext graphDatabaseContext) { this.delegate = delegate; @@ -73,7 +70,7 @@ public class DetachedEntityState implements EntityState { } @Override - public Neo4jPersistentEntity getPersistentEntity() { + public Neo4jPersistentEntity getPersistentEntity() { return persistentEntity; } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/GraphDatabaseContext.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/GraphDatabaseContext.java index cc0cf6724..a1024488e 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/GraphDatabaseContext.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/GraphDatabaseContext.java @@ -36,6 +36,7 @@ import org.springframework.data.neo4j.mapping.Neo4jPersistentProperty; import org.springframework.data.neo4j.support.query.CypherQueryExecutor; import org.springframework.data.util.TypeInformation; +import javax.annotation.PostConstruct; import javax.transaction.Status; import javax.transaction.SystemException; import javax.transaction.TransactionManager; @@ -299,9 +300,13 @@ public class GraphDatabaseContext { public void setGraphDatabaseService(GraphDatabaseService graphDatabaseService) { this.graphDatabaseService = graphDatabaseService; - this.cypherQueryExecutor = new CypherQueryExecutor(this); } + @PostConstruct + public void createCypherExecutor() { + this.cypherQueryExecutor = new CypherQueryExecutor(this); + } + public NodeTypeRepresentationStrategy getNodeTypeRepresentationStrategy() { return nodeTypeRepresentationStrategy; } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/node/NodeEntityStateFactory.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/node/NodeEntityStateFactory.java index b966b1d2a..b5d8cfaa4 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/node/NodeEntityStateFactory.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/node/NodeEntityStateFactory.java @@ -30,7 +30,7 @@ public class NodeEntityStateFactory { protected GraphDatabaseContext graphDatabaseContext; - private DelegatingFieldAccessorFactory nodeDelegatingFieldAccessorFactory; + protected DelegatingFieldAccessorFactory nodeDelegatingFieldAccessorFactory; protected Neo4jMappingContext mappingContext; diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/query/GremlinExecutor.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/query/GremlinExecutor.java index 3b526eee0..f8f0461e4 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/query/GremlinExecutor.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/query/GremlinExecutor.java @@ -21,7 +21,7 @@ import com.tinkerpop.blueprints.pgm.Vertex; import com.tinkerpop.blueprints.pgm.impls.neo4j.Neo4jEdge; import com.tinkerpop.blueprints.pgm.impls.neo4j.Neo4jGraph; import com.tinkerpop.blueprints.pgm.impls.neo4j.Neo4jVertex; -import com.tinkerpop.gremlin.pipes.util.Table; +import com.tinkerpop.pipes.util.Table; import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.helpers.collection.IterableWrapper;