From 479e72c8f79e567c5bd2f0ff0974c2b82b31a4d3 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Sun, 2 Oct 2011 19:23:30 +0200 Subject: [PATCH] added configuration for cross-store submodule, fixed aspect related changed --- spring-data-neo4j-aspects/pom.xml | 39 ++++++++++- .../config/Neo4jAspectConfiguration.java | 15 +++++ .../data/neo4j/core/GraphBacked.java | 2 +- .../data/neo4j/core/NodeBacked.java | 4 +- .../data/neo4j/core/RelationshipBacked.java | 2 +- .../neo4j/support/node/Neo4jNodeBacking.aj | 16 +---- .../relationship/Neo4jRelationshipBacking.aj | 5 ++ .../ModificationOutsideOfTransactionTest.java | 27 +++++--- .../Neo4jGraphPersistenceTest-context.xml | 21 ++++-- ...RepresentationStrategyOverride-context.xml | 8 ++- .../support/PersonDirectCreator-context.xml | 1 + spring-data-neo4j-aspects/template.mf | 39 +++++++++++ ...taGraphNamespaceHandlerCrossStoreTest.java | 66 +++++++++++++++++++ ...mespaceHandlerTest-cross-store-context.xml | 29 ++++++++ spring-data-neo4j-parent/pom.xml | 32 ++++----- 15 files changed, 254 insertions(+), 52 deletions(-) create mode 100644 spring-data-neo4j-aspects/template.mf create mode 100644 spring-data-neo4j-cross-store/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerCrossStoreTest.java create mode 100644 spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest-cross-store-context.xml diff --git a/spring-data-neo4j-aspects/pom.xml b/spring-data-neo4j-aspects/pom.xml index 9cb651304..d5a6acfa5 100644 --- a/spring-data-neo4j-aspects/pom.xml +++ b/spring-data-neo4j-aspects/pom.xml @@ -41,6 +41,12 @@ org.springframework.data spring-data-neo4j + + org.springframework.data + spring-data-neo4j + ${project.version} + test-jar + @@ -87,6 +93,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 @@ -206,10 +241,10 @@ org.springframework spring-aspects - + 1.6 1.6 diff --git a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/config/Neo4jAspectConfiguration.java b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/config/Neo4jAspectConfiguration.java index 776773abe..8f494bbd3 100644 --- a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/config/Neo4jAspectConfiguration.java +++ b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/config/Neo4jAspectConfiguration.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.springframework.context.annotation.Bean; diff --git a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/core/GraphBacked.java b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/core/GraphBacked.java index 1ff76f623..ac2e42519 100644 --- a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/core/GraphBacked.java +++ b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/core/GraphBacked.java @@ -26,7 +26,7 @@ import org.springframework.data.neo4j.support.ManagedEntity; * @author Michael Hunger * @since 21.09.2010 */ -public interface GraphBacked extends ManagedEntity { +public interface GraphBacked> extends ManagedEntity { /** * internal setter used for initializing the graph-db state on existing or newly created entities * diff --git a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/core/NodeBacked.java b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/core/NodeBacked.java index bfbc40926..a7b091056 100644 --- a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/core/NodeBacked.java +++ b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/core/NodeBacked.java @@ -19,8 +19,6 @@ package org.springframework.data.neo4j.core; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Relationship; import org.neo4j.graphdb.traversal.TraversalDescription; -import org.springframework.data.neo4j.support.node.Neo4jNodeBacking; -import org.springframework.data.neo4j.support.query.CypherQueryExecutor; import java.util.Map; @@ -30,7 +28,7 @@ import java.util.Map; * * @author Rod Johnson */ -public interface NodeBacked extends GraphBacked { +public interface NodeBacked extends GraphBacked { /** * Attach the entity inside a running transaction. Creating or changing an entity outside of a transaction diff --git a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/core/RelationshipBacked.java b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/core/RelationshipBacked.java index baaccd1d5..c040ff7a7 100644 --- a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/core/RelationshipBacked.java +++ b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/core/RelationshipBacked.java @@ -22,7 +22,7 @@ import org.neo4j.graphdb.Relationship; * concrete interface introduced onto Relationship entities by the {@link org.springframework.data.neo4j.support.relationship.Neo4jRelationshipBacking} * aspect, encapsulates a neo4j relationship as backing state */ -public interface RelationshipBacked extends GraphBacked{ +public interface RelationshipBacked extends GraphBacked{ /** * @return the id of the underlying relationship or null if there is none diff --git a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/support/node/Neo4jNodeBacking.aj b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/support/node/Neo4jNodeBacking.aj index 98df47166..35aedffc6 100644 --- a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/support/node/Neo4jNodeBacking.aj +++ b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/support/node/Neo4jNodeBacking.aj @@ -22,7 +22,6 @@ import org.aspectj.lang.JoinPoint; import org.aspectj.lang.reflect.FieldSignature; import org.neo4j.graphdb.DynamicRelationshipType; import org.neo4j.graphdb.Path; -import org.neo4j.helpers.collection.IterableWrapper; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Relationship; import org.neo4j.graphdb.traversal.TraversalDescription; @@ -39,6 +38,7 @@ import org.springframework.data.neo4j.annotation.GraphTraversal; import org.springframework.data.neo4j.core.NodeBacked; import org.springframework.data.neo4j.core.RelationshipBacked; +import org.springframework.data.neo4j.fieldaccess.GraphBackedEntityIterableWrapper; import org.springframework.data.neo4j.support.DoReturn; import org.springframework.data.neo4j.core.EntityPath; import org.springframework.data.neo4j.core.EntityState; @@ -196,20 +196,10 @@ public privileged aspect Neo4jNodeBacking { // extends AbstractTypeAnnotatingMix private Iterable convertToGraphEntity(Traverser traverser, final Class targetType) { final GraphDatabaseContext ctx = Neo4jNodeBacking.aspectOf().graphDatabaseContext; if (NodeBacked.class.isAssignableFrom(targetType)) { - return new IterableWrapper(traverser.nodes()) { - @Override - protected Object underlyingObjectToObject(Node node) { - return ctx.createEntityFromState(node,(Class)targetType); - } - }; + return GraphBackedEntityIterableWrapper.create(traverser.nodes(), (Class) targetType, ctx); } if (RelationshipBacked.class.isAssignableFrom(targetType)) { - return new IterableWrapper(traverser.relationships()) { - @Override - protected Object underlyingObjectToObject(Relationship relationship) { - return ctx.createEntityFromState(relationship,(Class)targetType); - } - }; + return GraphBackedEntityIterableWrapper.create(traverser.relationships(), (Class) targetType, ctx); } throw new IllegalStateException("Can't determine valid type for traversal target "+targetType); diff --git a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/support/relationship/Neo4jRelationshipBacking.aj b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/support/relationship/Neo4jRelationshipBacking.aj index b93e3ee45..08db3ee1f 100644 --- a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/support/relationship/Neo4jRelationshipBacking.aj +++ b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/support/relationship/Neo4jRelationshipBacking.aj @@ -22,6 +22,7 @@ import org.aspectj.lang.JoinPoint; import org.aspectj.lang.reflect.FieldSignature; import org.neo4j.graphdb.Relationship; import org.springframework.data.neo4j.annotation.RelationshipEntity; +import org.springframework.data.neo4j.core.NodeBacked; import org.springframework.data.neo4j.core.RelationshipBacked; import org.springframework.data.neo4j.support.DoReturn; import org.springframework.data.neo4j.core.EntityState; @@ -118,6 +119,10 @@ public aspect Neo4jRelationshipBacking { return getPersistentState().hashCode(); } + public T RelationshipBacked.persist() { + return (T)this.entityState.persist(); + } + public void RelationshipBacked.remove() { Neo4jRelationshipBacking.aspectOf().graphDatabaseContext.removeRelationshipEntity(this); } diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/support/ModificationOutsideOfTransactionTest.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/support/ModificationOutsideOfTransactionTest.java index 87a2e481c..9190b2b7c 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/support/ModificationOutsideOfTransactionTest.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/support/ModificationOutsideOfTransactionTest.java @@ -164,21 +164,23 @@ public class ModificationOutsideOfTransactionTest assertEquals( 35, nodeFor( p ).getProperty("age") ); } - @Ignore - @Test - public void shouldWorkWithUninitializedCollectionFieldWithoutUnderlyingState() - { + @Test + public void shouldWorkWithUninitializedCollectionFieldWithoutUnderlyingState() { Group group = new Group(); - Collection people = group.getPersons(); - assertNotNull(people); + Collection people = group.getPersons(); + assertNotNull(people); - Person p = new Person( "David", 27 ); - people.add(p); + Person p = new Person("David", 27); + people.add(p); - assertEquals( Collections.singleton(p), group.getPersons() ); + assertEquals(Collections.singleton(p), group.getPersons()); + + group.persist(); + assertThat(group.getPersistentState(), hasRelationship("persons", p.getPersistentState())); + assertThat(p.getPersistentState(), hasRelationship("persons", group.getPersistentState())); } - @Test + @Test public void shouldWorkWithInitializedCollectionFieldWithoutUnderlyingState() { Group group = new Group(); @@ -190,6 +192,11 @@ public class ModificationOutsideOfTransactionTest people.add(p); assertEquals( Collections.singleton(p), group.getPersons() ); + + + group.persist(); + assertThat(group.getPersistentState(), hasRelationship("persons", p.getPersistentState())); + assertThat(p.getPersistentState(), hasRelationship("persons", group.getPersistentState())); } @Test diff --git a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/support/Neo4jGraphPersistenceTest-context.xml b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/support/Neo4jGraphPersistenceTest-context.xml index 12b25682c..f01f44fb0 100644 --- a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/support/Neo4jGraphPersistenceTest-context.xml +++ b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/support/Neo4jGraphPersistenceTest-context.xml @@ -86,18 +86,27 @@ + + - - + + + + + + + + + + + @@ -118,6 +127,10 @@ + + diff --git a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/support/NoopTypeRepresentationStrategyOverride-context.xml b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/support/NoopTypeRepresentationStrategyOverride-context.xml index 18e29e509..56dcb67ae 100644 --- a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/support/NoopTypeRepresentationStrategyOverride-context.xml +++ b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/support/NoopTypeRepresentationStrategyOverride-context.xml @@ -14,6 +14,10 @@ http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> - - + + + + + + \ No newline at end of file diff --git a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/support/PersonDirectCreator-context.xml b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/support/PersonDirectCreator-context.xml index e39c231e5..84bbc9392 100644 --- a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/support/PersonDirectCreator-context.xml +++ b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/support/PersonDirectCreator-context.xml @@ -16,6 +16,7 @@ + diff --git a/spring-data-neo4j-aspects/template.mf b/spring-data-neo4j-aspects/template.mf new file mode 100644 index 000000000..f712f19cf --- /dev/null +++ b/spring-data-neo4j-aspects/template.mf @@ -0,0 +1,39 @@ +Bundle-SymbolicName: org.springframework.data.neo4j.aspects +Bundle-Name: Spring Data Neo4j Aspects +Bundle-Vendor: SpringSource +Bundle-ManifestVersion: 2 +Import-Package: + sun.reflect;version="0";resolution:=optional +Import-Template: + org.springframework.beans.*;version="[3.0.0, 4.0.0)", + org.springframework.context.*;version="[3.0.0, 4.0.0)", + org.springframework.core.*;version="[3.0.0, 4.0.0)", + org.springframework.dao.*;version="[3.0.0, 4.0.0)", + org.springframework.jdbc.*;version="[3.0.0, 4.0.0)", + org.springframework.stereotype.*;version="[3.0.0, 4.0.0)", + org.springframework.orm.*;version="[3.0.0, 4.0.0)", + org.springframework.transaction.*;version="[3.0.0, 4.0.0)", + org.springframework.util.*;version="[3.0.0, 4.0.0)", + org.springframework.data.*;version="[1.0.0, 2.0.0)", + org.springframework.persistence.*;version="[1.0.0, 3.0.0)", + org.springframework.data.neo4j.*;version="[1.0.0, 3.0.0)", + org.neo4j.*;version="0", + org.neo4j.cypher.*;version="0";resolution:=optional, + org.w3c.dom.*;version="0", + org.aspectj.*;version="[1.6.5, 2.0.0)", + org.apache.commons.logging.*;version="[1.1.1, 2.0.0)", + org.apache.commons.configuration.*;version="0", + org.objectweb.jotm.*;version="0", + org.apache.lucene.*;version="0", + javax.validation.*;version="0";resolution:=optional, + javax.annotation.*;version="0";resolution:=optional, + javax.naming.*;version="0";resolution:=optional, + javax.script.*;version="0";resolution:=optional, + javax.persistence.*;version="[1.0.0, 3.0.0)";resolution:=optional, + javax.persistence.spi.*;version="[1.0.0, 3.0.0)";resolution:=optional, + javax.transaction.*;version="[1.0.1, 2.0.0)";resolution:=optional +Import-Package: + net.sf.cglib.proxy;version="[2.2.0,3.0.0)", + net.sf.cglib.core;version="[2.2.0,3.0.0)", + net.sf.cglib.reflect;version="[2.2.0,3.0.0)" +DynamicImport-Package: * \ No newline at end of file diff --git a/spring-data-neo4j-cross-store/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerCrossStoreTest.java b/spring-data-neo4j-cross-store/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerCrossStoreTest.java new file mode 100644 index 000000000..87f2c8ee2 --- /dev/null +++ b/spring-data-neo4j-cross-store/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerCrossStoreTest.java @@ -0,0 +1,66 @@ +/** + * 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.junit.Assert; +import org.junit.Test; +import org.neo4j.graphdb.GraphDatabaseService; +import org.neo4j.kernel.EmbeddedGraphDatabase; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.data.neo4j.repository.DirectGraphRepositoryFactory; +import org.springframework.data.neo4j.support.GraphDatabaseContext; +import org.springframework.transaction.PlatformTransactionManager; + +/** + * @author mh + * @since 31.01.11 + */ + +public class DataGraphNamespaceHandlerCrossStoreTest { + + static class Config { + @Autowired + GraphDatabaseService graphDatabaseService; + @Autowired + DirectGraphRepositoryFactory graphRepositoryFactory; + @Autowired + GraphDatabaseContext graphDatabaseContext; + @Autowired + PlatformTransactionManager transactionManager; + } + + @Test + public void injectionForCrossStore() { + assertInjected("-cross-store"); + } + + private Config assertInjected(String testCase) { + ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest" + testCase + "-context.xml"); + Config config = ctx.getBean("config", Config.class); + GraphDatabaseContext graphDatabaseContext = config.graphDatabaseContext; + Assert.assertNotNull("graphDatabaseContext", graphDatabaseContext); + EmbeddedGraphDatabase graphDatabaseService = (EmbeddedGraphDatabase) graphDatabaseContext.getGraphDatabaseService(); + Assert.assertEquals("store-dir", "target/config-test", graphDatabaseService.getStoreDir()); + Assert.assertNotNull("graphRepositoryFactory", config.graphRepositoryFactory); + Assert.assertNotNull("graphDatabaseService", config.graphDatabaseService); + Assert.assertNotNull("transactionManager", config.transactionManager); + config.graphDatabaseService.shutdown(); + return config; + } + +} 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 new file mode 100644 index 000000000..ce7e197a1 --- /dev/null +++ b/spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest-cross-store-context.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-data-neo4j-parent/pom.xml b/spring-data-neo4j-parent/pom.xml index d8ed36bb9..07b9a0cd6 100644 --- a/spring-data-neo4j-parent/pom.xml +++ b/spring-data-neo4j-parent/pom.xml @@ -125,7 +125,7 @@ 1.6.1 3.0.6.RELEASE 1.2.0.BUILD-SNAPSHOT - 1.4.1 + 1.5-SNAPSHOT 1.6.12.M1 0.8 1.1 @@ -593,20 +593,20 @@ - - + +