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