diff --git a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/LabelBasedIndexedPropertyEntityTests-context-basic.xml b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/LabelBasedIndexedPropertyEntityTests-context-basic.xml
index dc99caff7..ec18b764d 100644
--- a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/LabelBasedIndexedPropertyEntityTests-context-basic.xml
+++ b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/LabelBasedIndexedPropertyEntityTests-context-basic.xml
@@ -9,6 +9,7 @@
http://www.springframework.org/schema/data/neo4j http://www.springframework.org/schema/data/neo4j/spring-neo4j.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
+
diff --git a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/LabelBasedIndexedPropertyEntityTests-context-with-initialset.xml b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/LabelBasedIndexedPropertyEntityTests-context-with-initialset.xml
index 899007d29..389c8543a 100644
--- a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/LabelBasedIndexedPropertyEntityTests-context-with-initialset.xml
+++ b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/LabelBasedIndexedPropertyEntityTests-context-with-initialset.xml
@@ -27,7 +27,7 @@
-
+
diff --git a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/LabelBasedIndexedPropertyEntityTests-context.xml b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/LabelBasedIndexedPropertyEntityTests-context.xml
index e904cd016..c3077ed50 100644
--- a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/LabelBasedIndexedPropertyEntityTests-context.xml
+++ b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/LabelBasedIndexedPropertyEntityTests-context.xml
@@ -30,7 +30,7 @@
-
+
diff --git a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/Neo4jGraphPersistenceTests-context.xml b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/Neo4jGraphPersistenceTests-context.xml
index b1f306b11..cf8e3b783 100644
--- a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/Neo4jGraphPersistenceTests-context.xml
+++ b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/Neo4jGraphPersistenceTests-context.xml
@@ -30,7 +30,7 @@
-
+
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/BasePackageScanner.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/BasePackageScanner.java
new file mode 100644
index 000000000..c9c562d08
--- /dev/null
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/BasePackageScanner.java
@@ -0,0 +1,43 @@
+package org.springframework.data.neo4j.config;
+
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.support.ManagedSet;
+import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
+import org.springframework.core.type.filter.AnnotationTypeFilter;
+import org.springframework.data.annotation.Persistent;
+import org.springframework.data.neo4j.annotation.NodeEntity;
+import org.springframework.data.neo4j.annotation.RelationshipEntity;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author mh
+ * @since 23.02.14
+ */
+public class BasePackageScanner {
+
+ public static Set scanBasePackage(String basePackage) {
+ ClassPathScanningCandidateComponentProvider componentProvider = new ClassPathScanningCandidateComponentProvider(false);
+ componentProvider.addIncludeFilter(new AnnotationTypeFilter(Persistent.class));
+
+ Set classes = new ManagedSet();
+ for (BeanDefinition candidate : componentProvider.findCandidateComponents(basePackage)) {
+ classes.add(candidate.getBeanClassName());
+ }
+
+ return classes;
+ }
+
+ static Set extends Class>> scanBasePackageForClasses(String basePackage) throws ClassNotFoundException {
+ Set> classes = new HashSet<>();
+ for (String className : scanBasePackage(basePackage)){
+ classes.add(loadClass(className));
+ }
+ return classes;
+ }
+
+ private static Class loadClass(String className) throws ClassNotFoundException {
+ return Thread.currentThread().getContextClassLoader().loadClass(className);
+ }
+}
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/DataGraphBeanDefinitionParser.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/DataGraphBeanDefinitionParser.java
index 05756e5a5..9103cd94f 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/DataGraphBeanDefinitionParser.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/DataGraphBeanDefinitionParser.java
@@ -16,18 +16,11 @@
package org.springframework.data.neo4j.config;
-import org.neo4j.kernel.EmbeddedGraphDatabase;
import org.springframework.beans.factory.annotation.Autowire;
-import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.*;
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
-import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.context.annotation.ConfigurationClassPostProcessor;
-import org.springframework.core.type.filter.AnnotationTypeFilter;
-import org.springframework.data.annotation.Persistent;
-import org.springframework.data.neo4j.annotation.NodeEntity;
-import org.springframework.data.neo4j.annotation.RelationshipEntity;
import org.springframework.data.neo4j.support.GraphDatabaseServiceFactoryBean;
import org.springframework.util.ClassUtils;
import org.w3c.dom.Element;
@@ -70,17 +63,7 @@ public class DataGraphBeanDefinitionParser extends AbstractBeanDefinitionParser
return null;
}
- ClassPathScanningCandidateComponentProvider componentProvider = new ClassPathScanningCandidateComponentProvider(false);
- componentProvider.addIncludeFilter(new AnnotationTypeFilter(NodeEntity.class));
- componentProvider.addIncludeFilter(new AnnotationTypeFilter(RelationshipEntity.class));
- componentProvider.addIncludeFilter(new AnnotationTypeFilter(Persistent.class));
-
- Set classes = new ManagedSet();
- for (BeanDefinition candidate : componentProvider.findCandidateComponents(basePackage)) {
- classes.add(candidate.getBeanClassName());
- }
-
- return classes;
+ return BasePackageScanner.scanBasePackage(basePackage);
}
@@ -162,4 +145,4 @@ public class DataGraphBeanDefinitionParser extends AbstractBeanDefinitionParser
-}
\ No newline at end of file
+}
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/Neo4jConfiguration.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/Neo4jConfiguration.java
index 9fbdf3264..d0f899aae 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/Neo4jConfiguration.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/Neo4jConfiguration.java
@@ -203,6 +203,7 @@ public abstract class Neo4jConfiguration {
mappingContext.setInitialEntitySet(initialEntitySet);
}
mappingContext.setEntityAlias(entityAlias());
+ mappingContext.setEntityIndexCreator(entityIndexCreator());
return mappingContext;
}
@@ -238,11 +239,11 @@ public abstract class Neo4jConfiguration {
}
@Bean
- public IndexCreationMappingEventListener indexCreationMappingEventListener() throws Exception {
- return new IndexCreationMappingEventListener(
+ public EntityIndexCreator entityIndexCreator() throws Exception {
+ return new EntityIndexCreator(
indexProvider(),
- schemaIndexProvider(),
- nodeTypeRepresentationStrategy());
+ schemaIndexProvider()
+ );
}
@Bean
@@ -285,4 +286,16 @@ public abstract class Neo4jConfiguration {
public void setInitialEntitySet(Set extends Class>> initialEntitySet) {
this.initialEntitySet = initialEntitySet;
}
+
+ private String basePackage;
+
+
+ public String getBasePackage() {
+ return basePackage;
+ }
+
+ public void setBasePackage(String basePackage) throws ClassNotFoundException {
+ this.basePackage = basePackage;
+ setInitialEntitySet(BasePackageScanner.scanBasePackageForClasses(basePackage));
+ }
}
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/GraphRepositoryFactoryBean.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/GraphRepositoryFactoryBean.java
index 7686feec0..d303824cf 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/GraphRepositoryFactoryBean.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/GraphRepositoryFactoryBean.java
@@ -68,4 +68,4 @@ TransactionalRepositoryFactoryBeanSupport {
super.afterPropertiesSet();
}
-}
\ No newline at end of file
+}
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/cdi/Neo4jCdiRepositoryBean.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/cdi/Neo4jCdiRepositoryBean.java
index d12ec1918..b94bde52a 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/cdi/Neo4jCdiRepositoryBean.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/cdi/Neo4jCdiRepositoryBean.java
@@ -61,7 +61,7 @@ public class Neo4jCdiRepositoryBean extends CdiRepositoryBean {
protected T create(CreationalContext creationalContext, Class repositoryType) {
Neo4jMappingContext neo4jMapCtx = new Neo4jMappingContext();
- Neo4jTemplate neo4jTemplate = new Neo4jTemplate(getDependencyInstance(graphDatabase, GraphDatabase.class));
+ Neo4jTemplate neo4jTemplate = new Neo4jTemplate(getDependencyInstance(graphDatabase, GraphDatabase.class));
GraphRepositoryFactory factory = new GraphRepositoryFactory(neo4jTemplate, neo4jMapCtx);
return factory.getRepository(repositoryType);
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/mapping/IndexCreationMappingEventListener.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/mapping/EntityIndexCreator.java
similarity index 68%
rename from spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/mapping/IndexCreationMappingEventListener.java
rename to spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/mapping/EntityIndexCreator.java
index 8ed8106aa..fdb64468c 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/mapping/IndexCreationMappingEventListener.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/mapping/EntityIndexCreator.java
@@ -30,31 +30,18 @@ import org.springframework.data.neo4j.support.schema.SchemaIndexProvider;
* @author mh
* @since 12.04.12
*/
-public class IndexCreationMappingEventListener implements ApplicationListener, Neo4jPersistentProperty>> {
+public class EntityIndexCreator {
private IndexProvider indexProvider;
private SchemaIndexProvider schemaIndexProvider;
- private TypeRepresentationStrategy nodeTypeRepresentationStrategy;
- public IndexCreationMappingEventListener(IndexProvider indexProvider, SchemaIndexProvider schemaIndexProvider, TypeRepresentationStrategy nodeTypeRepresentationStrategy) {
+ public EntityIndexCreator(IndexProvider indexProvider, SchemaIndexProvider schemaIndexProvider) {
this.indexProvider = indexProvider;
this.schemaIndexProvider = schemaIndexProvider;
- this.nodeTypeRepresentationStrategy = nodeTypeRepresentationStrategy;
}
- @Override
- public void onApplicationEvent(MappingContextEvent, Neo4jPersistentProperty> event) {
- if (!(event.getSource() instanceof Neo4jMappingContext)) return;
- final Neo4jPersistentEntity entity = event.getPersistentEntity();
- ensureEntityIndexes(entity);
- }
-
- private void ensureEntityIndexes(Neo4jPersistentEntity> entity) {
+ public void ensureEntityIndexes(Neo4jPersistentEntity> entity) {
final Class entityType = entity.getType();
- // TODO only when TRS is non-label? I think we prob need to do it
- // anyway as you can still mix legacy indexes with label based
- // ones???
- // Pass 1 - do schema based updates first to prevent locking
entity.doWithProperties(new PropertyHandler() {
@Override
public void doWithPersistentProperty(Neo4jPersistentProperty property) {
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/mapping/Neo4jMappingContext.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/mapping/Neo4jMappingContext.java
index 5f93381d7..115a00175 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/mapping/Neo4jMappingContext.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/mapping/Neo4jMappingContext.java
@@ -20,7 +20,6 @@ import org.neo4j.graphdb.PropertyContainer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.annotation.Reference;
-import org.springframework.data.mapping.PropertyHandler;
import org.springframework.data.mapping.context.AbstractMappingContext;
import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.mapping.model.MappingException;
@@ -37,8 +36,6 @@ import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.*;
-import static java.lang.String.format;
-
/**
* Neo4J specific {@link MappingContext} implementation. Simply creates {@link Neo4jPersistentEntityImpl} and
* {@link org.springframework.data.neo4j.mapping.Neo4jPersistentProperty} instances.
@@ -49,8 +46,9 @@ public class Neo4jMappingContext extends AbstractMappingContext referenceAnnotations = new IdentityHashMap();
-
+ private final Map referenceAnnotations = new IdentityHashMap<>();
+ private EntityIndexCreator entityIndexCreator;
+
protected Neo4jPersistentEntityImpl> createPersistentEntity(TypeInformation typeInformation) {
final Class type = typeInformation.getType();
if (type.isAnnotationPresent(NodeEntity.class)) {
@@ -66,10 +64,15 @@ public class Neo4jMappingContext extends AbstractMappingContext addPersistentEntity(TypeInformation> typeInformation) {
final Neo4jPersistentEntityImpl> entity = super.addPersistentEntity(typeInformation);
Collection> superTypeEntities = addSuperTypes(entity);
- entity.updateStoredType(new StoredEntityType(entity,superTypeEntities,entityAlias));
+ updateStoredEntityType(entity, superTypeEntities);
return entity;
}
+ private void updateStoredEntityType(Neo4jPersistentEntityImpl> entity, Collection> superTypeEntities) {
+ entity.updateStoredType(new StoredEntityType(entity, superTypeEntities, entityAlias));
+ entityIndexCreator.ensureEntityIndexes(entity);
+ }
+
private List> addSuperTypes(Neo4jPersistentEntity> entity) {
List> entities=new ArrayList>();
final Class> type = entity.getType();
@@ -87,6 +90,12 @@ public class Neo4jMappingContext extends AbstractMappingContext type) {
return type.isAnnotationPresent(RelationshipEntity.class);
}
@@ -189,4 +198,8 @@ public class Neo4jMappingContext extends AbstractMappingContext
+
+
+
+
+
+
+
+
+
+
+
+
+
+ default store-directory of the Neo4j database
+
+
+
+
+
+
+
+
+ base package for persistent entities.
+
+
+
+
+
+
+ entity manager factory bean reference for cross-store configuration
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/BiDirectionalMappingTests.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/bidirectional/BiDirectionalMappingTests.java
similarity index 96%
rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/BiDirectionalMappingTests.java
rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/bidirectional/BiDirectionalMappingTests.java
index 4d20ed780..c54fbad7d 100644
--- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/BiDirectionalMappingTests.java
+++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/bidirectional/BiDirectionalMappingTests.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.springframework.data.neo4j.annotation.relatedto;
+package org.springframework.data.neo4j.annotation.relatedto.bidirectional;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/BiDirectionalRelatedToViaMappingTests.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/bidirectional/BiDirectionalRelatedToViaMappingTests.java
similarity index 97%
rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/BiDirectionalRelatedToViaMappingTests.java
rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/bidirectional/BiDirectionalRelatedToViaMappingTests.java
index a19a91dbc..cc1956d09 100644
--- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/BiDirectionalRelatedToViaMappingTests.java
+++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/bidirectional/BiDirectionalRelatedToViaMappingTests.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.springframework.data.neo4j.annotation.relatedto;
+package org.springframework.data.neo4j.annotation.relatedto.bidirectional;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/BiDirectionalRelatedToViaWithCollectionFetchMappingTests.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/bidirectional/BiDirectionalRelatedToViaWithCollectionFetchMappingTests.java
similarity index 97%
rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/BiDirectionalRelatedToViaWithCollectionFetchMappingTests.java
rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/bidirectional/BiDirectionalRelatedToViaWithCollectionFetchMappingTests.java
index 16e00290c..f22958d4a 100644
--- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/BiDirectionalRelatedToViaWithCollectionFetchMappingTests.java
+++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/bidirectional/BiDirectionalRelatedToViaWithCollectionFetchMappingTests.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.springframework.data.neo4j.annotation.relatedto;
+package org.springframework.data.neo4j.annotation.relatedto.bidirectional;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/BiDirectionalRelatedToViaWithSingleFetchMappingTests.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/bidirectional/BiDirectionalRelatedToViaWithSingleFetchMappingTests.java
similarity index 97%
rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/BiDirectionalRelatedToViaWithSingleFetchMappingTests.java
rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/bidirectional/BiDirectionalRelatedToViaWithSingleFetchMappingTests.java
index 9406623a7..24ddb1e32 100644
--- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/BiDirectionalRelatedToViaWithSingleFetchMappingTests.java
+++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/annotation/relatedto/bidirectional/BiDirectionalRelatedToViaWithSingleFetchMappingTests.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.springframework.data.neo4j.annotation.relatedto;
+package org.springframework.data.neo4j.annotation.relatedto.bidirectional;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-data-neo4j/src/test/resources/related-to-test-context.xml b/spring-data-neo4j/src/test/resources/related-to-test-context.xml
index f54bef3e8..16989c300 100644
--- a/spring-data-neo4j/src/test/resources/related-to-test-context.xml
+++ b/spring-data-neo4j/src/test/resources/related-to-test-context.xml
@@ -11,7 +11,9 @@
-
+
+
+