From b9c0f5fa8c8973ce0509aca195c1d974e1636abb Mon Sep 17 00:00:00 2001 From: Jean-Pierre Bergamin Date: Fri, 30 Nov 2012 17:35:55 +0100 Subject: [PATCH] Contributions from @ractive build-helper-maven-plugin added so that the generated sources are used as source folder in eclipse Making the import or com.mysema.query optional Clear the dynamic properties map in calls to setPropertiesFrom to make sure that non existent properties get deleted --- build/ivy/settings/ivy.xml | 2 +- .../aspects/support/node/Neo4jNodeBacking.aj | 4 +-- .../relationship/Neo4jRelationshipBacking.aj | 4 +-- .../data/neo4j/aspects/Person.java | 4 +++ .../support/DynamicPropertiesTests.java | 26 +++++++++++++++++ spring-data-neo4j-aspects/template.mf | 3 +- ...aGraphNamespaceHandlerCrossStoreTests.java | 5 ++-- spring-data-neo4j-cross-store/template.mf | 3 +- .../hello-worlds/settings/ivy.xml | 2 +- spring-data-neo4j/pom.xml | 29 +++++++++++++++---- .../neo4j/fieldaccess/DynamicProperties.java | 6 ++-- .../DynamicPropertiesContainer.java | 1 + .../PrefixedDynamicProperties.java | 7 +++-- .../neo4j/support/index/IndexProvider.java | 3 +- .../support/index/NullReadableIndex.java | 8 ++--- ...actIndexingTypeRepresentationStrategy.java | 27 +++++++---------- .../DataGraphNamespaceHandlerTests.java | 5 ++-- spring-data-neo4j/template.mf | 9 +++--- 18 files changed, 94 insertions(+), 54 deletions(-) diff --git a/build/ivy/settings/ivy.xml b/build/ivy/settings/ivy.xml index 0c1703276..e3d97b641 100644 --- a/build/ivy/settings/ivy.xml +++ b/build/ivy/settings/ivy.xml @@ -1,7 +1,7 @@ - + diff --git a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/aspects/support/node/Neo4jNodeBacking.aj b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/aspects/support/node/Neo4jNodeBacking.aj index 5412e9213..0632d99fe 100644 --- a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/aspects/support/node/Neo4jNodeBacking.aj +++ b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/aspects/support/node/Neo4jNodeBacking.aj @@ -87,13 +87,13 @@ public privileged aspect Neo4jNodeBacking { // extends AbstractTypeAnnotatingMix protected pointcut entityFieldGet(NodeBacked entity) : - get(* NodeBacked+.*) && + get(!transient * NodeBacked+.*) && this(entity) && !get(* NodeBacked.*); protected pointcut entityFieldSet(NodeBacked entity, Object newVal) : - set(* NodeBacked+.*) && + set(!transient * NodeBacked+.*) && this(entity) && args(newVal) && !set(* NodeBacked.*); diff --git a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/aspects/support/relationship/Neo4jRelationshipBacking.aj b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/aspects/support/relationship/Neo4jRelationshipBacking.aj index c68a44793..6b7e05559 100644 --- a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/aspects/support/relationship/Neo4jRelationshipBacking.aj +++ b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/aspects/support/relationship/Neo4jRelationshipBacking.aj @@ -72,13 +72,13 @@ public aspect Neo4jRelationshipBacking { protected pointcut entityFieldGet(RelationshipBacked entity) : - get(* RelationshipBacked+.*) && + get(!transient * RelationshipBacked+.*) && this(entity) && !get(* RelationshipBacked.*); protected pointcut entityFieldSet(RelationshipBacked entity, Object newVal) : - set(* RelationshipBacked+.*) && + set(!transient * RelationshipBacked+.*) && this(entity) && args(newVal) && !set(* RelationshipBacked.*); diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Person.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Person.java index 2dd884350..3efb37d09 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Person.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Person.java @@ -238,6 +238,10 @@ public class Person { this.personalProperties = personalProperties; } + public void personalPropertiesFromMap(Map props) { + this.personalProperties.setPropertiesFrom(props); + } + public void setNickname(String nickname) { this.nickname = nickname; } diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/DynamicPropertiesTests.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/DynamicPropertiesTests.java index 1cb6dd199..b1d904c53 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/DynamicPropertiesTests.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/DynamicPropertiesTests.java @@ -135,6 +135,32 @@ public class DynamicPropertiesTests extends EntityTestBase { assertProperties(nodeFor(p)); } + @Test + @Transactional + public void testRemovePropertyFromMap() { + Person p = persistedPerson("James", 36); + + Map propertyMap = new HashMap(); + propertyMap.put("s", "String"); + propertyMap.put("x", 100); + propertyMap.put("pi", 3.1415); + + p.personalPropertiesFromMap(propertyMap); + persist(p); + assertEquals(3, IteratorUtil.count(p.getPersonalProperties().getPropertyKeys())); + assertProperties(nodeFor(p)); + + propertyMap.remove("s"); + + p.personalPropertiesFromMap(propertyMap); + persist(p); + Node node = nodeFor(p); + assertEquals(2, IteratorUtil.count(p.getPersonalProperties().getPropertyKeys())); + assertFalse(node.hasProperty("personalProperties-s")); + assertEquals(100, node.getProperty("personalProperties-x")); + assertEquals(3.1415, ((Double) node.getProperty("personalProperties-pi")).doubleValue(), 0.000000001); + } + @Test @Transactional public void testAsMap() { diff --git a/spring-data-neo4j-aspects/template.mf b/spring-data-neo4j-aspects/template.mf index 1deea7bd2..5fc487d06 100644 --- a/spring-data-neo4j-aspects/template.mf +++ b/spring-data-neo4j-aspects/template.mf @@ -19,8 +19,7 @@ Import-Template: org.neo4j.cypher.*;version="0";resolution:=optional, org.w3c.dom.*;version="0", org.aspectj.*;version="[1.6.5, 2.0.0)", - org.apache.commons.configuration.*;version="0", - org.objectweb.jotm.*;version="0", + org.objectweb.jotm.*;version="0";resolution:=optional, org.apache.lucene.*;version="0", org.slf4j.*;version="0", javax.validation.*;version="0";resolution:=optional, diff --git a/spring-data-neo4j-cross-store/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerCrossStoreTests.java b/spring-data-neo4j-cross-store/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerCrossStoreTests.java index d347645a0..3fe25b1d3 100644 --- a/spring-data-neo4j-cross-store/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerCrossStoreTests.java +++ b/spring-data-neo4j-cross-store/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerCrossStoreTests.java @@ -33,7 +33,6 @@ import java.io.File; * @author mh * @since 31.01.11 */ - @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest-cross-store-context.xml") public class DataGraphNamespaceHandlerCrossStoreTests { @@ -45,8 +44,8 @@ public class DataGraphNamespaceHandlerCrossStoreTests { @Test public void injectionForCrossStore() { Assert.assertNotNull("template", template); EmbeddedGraphDatabase graphDatabaseService = (EmbeddedGraphDatabase) template.getGraphDatabaseService(); - File directory = new File("target", "config-test"); - Assert.assertTrue("store-dir", graphDatabaseService.getStoreDir().equals(directory.getPath())); + String fileSeparator = "target" + System.getProperty("file.separator") + "config-test"; + Assert.assertTrue("store-dir", graphDatabaseService.getStoreDir().endsWith(fileSeparator)); Assert.assertNotNull("graphDatabaseService", graphDatabaseService); Assert.assertNotNull("transactionManager", transactionManager); } diff --git a/spring-data-neo4j-cross-store/template.mf b/spring-data-neo4j-cross-store/template.mf index 25aa5fa61..f897a9b1c 100644 --- a/spring-data-neo4j-cross-store/template.mf +++ b/spring-data-neo4j-cross-store/template.mf @@ -19,8 +19,7 @@ Import-Template: org.neo4j.cypher.*;version="0";resolution:=optional, org.w3c.dom.*;version="0", org.aspectj.*;version="[1.6.5, 2.0.0)", - org.apache.commons.configuration.*;version="0", - org.objectweb.jotm.*;version="0", + org.objectweb.jotm.*;version="0";resolution:=optional, org.apache.lucene.*;version="0", org.slf4j.*;version="0", javax.validation.*;version="0";resolution:=optional, diff --git a/spring-data-neo4j-examples/hello-worlds/settings/ivy.xml b/spring-data-neo4j-examples/hello-worlds/settings/ivy.xml index eebaf840e..49894f178 100644 --- a/spring-data-neo4j-examples/hello-worlds/settings/ivy.xml +++ b/spring-data-neo4j-examples/hello-worlds/settings/ivy.xml @@ -1,7 +1,7 @@ - + diff --git a/spring-data-neo4j/pom.xml b/spring-data-neo4j/pom.xml index 53e2a80a0..695707660 100644 --- a/spring-data-neo4j/pom.xml +++ b/spring-data-neo4j/pom.xml @@ -195,10 +195,10 @@ blueprints-neo4j-graph ${blueprints.version} - - org.neo4j - neo4j-management - + + org.neo4j + neo4j-management + org.neo4j neo4j @@ -254,7 +254,26 @@ - + + org.codehaus.mojo + build-helper-maven-plugin + 1.7 + + + add-test-source + + generate-sources + + add-source + + + + ${project.build.directory}/generated-test-sources/querydsl + + + + + diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DynamicProperties.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DynamicProperties.java index de15a59f2..7034e9ec2 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DynamicProperties.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DynamicProperties.java @@ -24,10 +24,8 @@ import org.springframework.data.neo4j.fieldaccess.DynamicPropertiesFieldAccessor * A {@link DynamicProperties} property on a @NodeEntity stores all its properties dynamically * on the underlying node itself. *

- * This dynamic property only is available inside a transaction, i.e. when the entity has been saved. - *

- * The key/value pairs of the {@link DynamicProperties} property are stored on the node with the keys - * prefixed with the property name that is returned by {@link org.springframework.data.neo4j.mapping.Neo4jPersistentProperty#getNeo4jPropertyName()}. + * The key/value pairs of the {@link DynamicProperties} member are stored on the node with the keys + * prefixed with the property name that is returned by {@link DelegatingFieldAccessorFactory#getNeo4jPropertyName(Field)}. *

  * @NodeEntity
  * class Person {
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DynamicPropertiesContainer.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DynamicPropertiesContainer.java
index 4ad9fdcd8..ee940fcbb 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DynamicPropertiesContainer.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DynamicPropertiesContainer.java
@@ -70,6 +70,7 @@ public class DynamicPropertiesContainer implements DynamicProperties {
 
 	@Override
 	public void setPropertiesFrom(Map m) {
+		map.clear();
 		map.putAll(m);
 	}
 
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/PrefixedDynamicProperties.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/PrefixedDynamicProperties.java
index 8d565a1ec..19d9638a0 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/PrefixedDynamicProperties.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/PrefixedDynamicProperties.java
@@ -189,9 +189,10 @@ public class PrefixedDynamicProperties implements DynamicProperties {
     }
 
     @Override
-    public void setPropertiesFrom(final Map map) {
-        for (String key : map.keySet()) {
-        	baseSetProperty(key, map.get(key));
+    public void setPropertiesFrom(final Map propertiesMap) {
+        this.map.clear();
+        for (String key : propertiesMap.keySet()) {
+            baseSetProperty(key, propertiesMap.get(key));
         }
     }
 
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/index/IndexProvider.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/index/IndexProvider.java
index 1cfa20b8e..08267d94a 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/index/IndexProvider.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/index/IndexProvider.java
@@ -29,7 +29,6 @@ public interface IndexProvider {
     @SuppressWarnings("unchecked")
      Index getIndex(Neo4jPersistentEntity persistentEntity, String indexName, IndexType indexType);
 
-    @SuppressWarnings("unchecked")
      Index getIndex(String indexName);
 
     boolean isNode(Class type);
@@ -52,4 +51,4 @@ public interface IndexProvider {
      */
     String customizeIndexName(String indexName, Class type);
 
-}
\ No newline at end of file
+}
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/index/NullReadableIndex.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/index/NullReadableIndex.java
index 517389ff9..3681e6e70 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/index/NullReadableIndex.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/index/NullReadableIndex.java
@@ -39,13 +39,13 @@ public class NullReadableIndex implements ReadableI
     }
 
     @Override
-    public GraphDatabaseService getGraphDatabase() {
-        return graphDatabaseService;
+    public Class getEntityType() {
+        return null;
     }
 
     @Override
-    public Class getEntityType() {
-        return null;
+    public GraphDatabaseService getGraphDatabase() {
+        return graphDatabaseService;
     }
 
     @Override
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/AbstractIndexingTypeRepresentationStrategy.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/AbstractIndexingTypeRepresentationStrategy.java
index 5791c1020..76e651219 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/AbstractIndexingTypeRepresentationStrategy.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/AbstractIndexingTypeRepresentationStrategy.java
@@ -48,6 +48,10 @@ public abstract class AbstractIndexingTypeRepresentationStrategy createTypesIndex() {
         return (Index) graphDb.createIndex(clazz, INDEX_NAME, IndexType.SIMPLE);
@@ -63,8 +67,7 @@ public abstract class AbstractIndexingTypeRepresentationStrategy hits = get(value);
+        final IndexHits hits = get(type.getAlias());
         while (hits.hasNext()) {
             hits.next();
             count++;
@@ -74,10 +77,10 @@ public abstract class AbstractIndexingTypeRepresentationStrategy get(Object value) {
         try {
-            return typesIndex.get(INDEX_KEY, value);
+            return typesIndex.get(INDEX_KEY, indexValueForType(value));
         } catch(IllegalStateException ise) {
             typesIndex=createTypesIndex();
-            return typesIndex.get(INDEX_KEY, value);
+            return typesIndex.get(INDEX_KEY, indexValueForType(value));
         }
     }
 
@@ -109,11 +112,7 @@ public abstract class AbstractIndexingTypeRepresentationStrategy findAllRelBacked(StoredEntityType type) {
-        Object value = type.getAlias();
-        if (indexProvider != null)
-            value = indexProvider.createIndexValueForType(type.getAlias());
-
-        final IndexHits allEntitiesOfType = get(value);
+        final IndexHits allEntitiesOfType = get(type.getAlias());
         return new ClosableIndexHits(allEntitiesOfType);
     }
 
diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTests.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTests.java
index ae367fd80..62b9cf1e1 100644
--- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTests.java
+++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTests.java
@@ -46,7 +46,6 @@ import static org.junit.Assert.assertTrue;
  * @author mh
  * @since 31.01.11
  */
-
 public class DataGraphNamespaceHandlerTests {
 
     static class Config {
@@ -122,8 +121,8 @@ public class DataGraphNamespaceHandlerTests {
         Neo4jTemplate template = config.neo4jTemplate;
         Assert.assertNotNull("template", template);
         AbstractGraphDatabase graphDatabaseService = (AbstractGraphDatabase) template.getGraphDatabaseService();
-        File directory = new File("target", "config-test");
-        Assert.assertEquals("store-dir", directory.getPath(),graphDatabaseService.getStoreDir());
+        String fileSeparator = "target" + System.getProperty("file.separator") + "config-test";
+        Assert.assertTrue("store-dir", graphDatabaseService.getStoreDir().endsWith(fileSeparator));
         Assert.assertNotNull("graphDatabaseService",config.graphDatabaseService);
         Assert.assertNotNull("transactionManager",config.transactionManager);
         config.graphDatabaseService.shutdown();
diff --git a/spring-data-neo4j/template.mf b/spring-data-neo4j/template.mf
index 57d4a219b..119c92dfe 100644
--- a/spring-data-neo4j/template.mf
+++ b/spring-data-neo4j/template.mf
@@ -20,8 +20,8 @@ Import-Template:
  org.neo4j.cypher.*;version="0";resolution:=optional,
  org.w3c.dom.*;version="0",
  org.aspectj.*;version="[1.6.5, 2.0.0)",
- org.apache.commons.configuration.*;version="0",
- org.objectweb.jotm.*;version="0",
+ org.apache.commons.configuration.*;version="0";resolution:=optional,
+ org.objectweb.jotm.*;version="0";resolution:=optional,
  org.apache.lucene.*;version="0",
  org.slf4j.*;version="0",
  javax.lang.model.*;version="0";resolution:=optional,
@@ -33,8 +33,9 @@ Import-Template:
  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,
- com.mysema.query.annotations.*;version="0",
- com.mysema.query.apt.*;version="0",
+ com.mysema.query.annotations.*;version="0";resolution:=optional,
+ com.mysema.query.apt.*;version="0";resolution:=optional,
+ com.mysema.query.types.*;version="0";resolution:=optional,
  com.tinkerpop.blueprints.*;version="[0.8,1.0)";resolution:=optional,
  com.tinkerpop.gremlin.*;version="[1.1,2.0)";resolution:=optional,
  com.tinkerpop.pipes.util.*;version="[0.8,1.0)";resolution:=optional