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> 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> 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 @@ - + + +