From cbd00de1d2f665642d3f06335931e85c9dc1f154 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Mon, 4 Jun 2012 10:04:13 +0200 Subject: [PATCH 1/2] DATAGRAPH-241 - base-package for entities, fix for alias lookup of loaded but not registered entities --- .../spring/applicationContext-graph.xml | 2 +- .../config/DataGraphBeanDefinitionParser.java | 45 ++++++++++-- .../data/neo4j/config/Neo4jConfiguration.java | 15 ++++ .../IndexCreationMappingEventListener.java | 28 +++++++- .../support/mapping/Neo4jMappingContext.java | 31 ++++++++ .../data/neo4j/config/spring-neo4j-2.0.xsd | 24 ++++++- .../config/DataGraphNamespaceHandlerTest.java | 13 ++++ .../data/neo4j/model/Attribute.java | 3 + .../springframework/data/neo4j/model/Car.java | 3 +- .../data/neo4j/repository/ReadWriteTest.java | 70 +++++++++++++++++++ .../test/resources/ReadWriteTest-context.xml | 12 ++++ ...hNamespaceHandlerTest-entities-context.xml | 15 ++++ 12 files changed, 250 insertions(+), 11 deletions(-) create mode 100644 spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/ReadWriteTest.java create mode 100644 spring-data-neo4j/src/test/resources/ReadWriteTest-context.xml create mode 100644 spring-data-neo4j/src/test/resources/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest-entities-context.xml diff --git a/spring-data-neo4j-examples/todos/src/main/resources/META-INF/spring/applicationContext-graph.xml b/spring-data-neo4j-examples/todos/src/main/resources/META-INF/spring/applicationContext-graph.xml index c6c1e230f..1c0f286b9 100644 --- a/spring-data-neo4j-examples/todos/src/main/resources/META-INF/spring/applicationContext-graph.xml +++ b/spring-data-neo4j-examples/todos/src/main/resources/META-INF/spring/applicationContext-graph.xml @@ -6,7 +6,7 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/data/neo4j - http://www.springframework.org/schema/data/neo4j/spring-neo4j-2.0.xsd + http://www.springframework.org/schema/data/neo4j/spring-neo4j-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 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 9b858351d..cf9e45b12 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,23 +16,30 @@ package org.springframework.data.neo4j.config; +import antlr.StringUtils; import org.neo4j.kernel.EmbeddedGraphDatabase; import org.springframework.beans.factory.annotation.Autowire; -import org.springframework.beans.factory.support.AbstractBeanDefinition; -import org.springframework.beans.factory.support.BeanDefinitionBuilder; -import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.beans.factory.support.BeanNameGenerator; +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.util.ClassUtils; import org.w3c.dom.Element; +import java.util.Set; + import static org.springframework.util.StringUtils.hasText; public class DataGraphBeanDefinitionParser extends AbstractBeanDefinitionParser { private static final String GRAPH_DATABASE_SERVICE = "graphDatabaseService"; + private static final String BASE_PACKAGE = "base-package"; public static final String ASPECTJ_CONFIG = "org.springframework.data.neo4j.aspects.config.Neo4jAspectConfiguration"; public static final String CROSS_STORE_CONFIG = "org.springframework.data.neo4j.cross_store.config.CrossStoreNeo4jConfiguration"; @@ -41,10 +48,40 @@ public class DataGraphBeanDefinitionParser extends AbstractBeanDefinitionParser BeanDefinitionBuilder configBuilder = createConfigurationBeanDefinition(element); setupGraphDatabase(element, context, configBuilder); setupEntityManagerFactory(element, configBuilder); + setupBaseEntities(element, configBuilder); setupConfigurationClassPostProcessor(context); return getSourcedBeanDefinition(configBuilder, element, context); } + private void setupBaseEntities(Element element, BeanDefinitionBuilder configBuilder) { + Set initialEntityClasses = getInitialEntityClasses(element); + if (initialEntityClasses!=null) { + configBuilder.addPropertyValue("initialEntitySet", initialEntityClasses); + } + } + + + public Set getInitialEntityClasses(Element element) { + + String basePackage = element.getAttribute(BASE_PACKAGE); + + if (!hasText(basePackage)) { + 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; + } + private BeanDefinitionBuilder createConfigurationBeanDefinition(Element element) { BeanDefinitionBuilder configBuilder = createConfigBuilderByMode(element); 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 93114d2c8..3d901815a 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 @@ -65,6 +65,9 @@ import org.springframework.transaction.jta.UserTransactionAdapter; import javax.transaction.TransactionManager; import javax.validation.Validator; +import java.util.Collection; +import java.util.Set; + import static java.util.Arrays.asList; /** @@ -79,6 +82,8 @@ public abstract class Neo4jConfiguration { private ConversionService conversionService; + private Set> initialEntitySet; + @Autowired(required = false) private Validator validator; @@ -197,6 +202,9 @@ public abstract class Neo4jConfiguration { @Bean public Neo4jMappingContext neo4jMappingContext() throws Exception { final Neo4jMappingContext mappingContext = new Neo4jMappingContext(); + if (initialEntitySet!=null) { + mappingContext.setInitialEntitySet(initialEntitySet); + } mappingContext.setEntityAlias(entityAlias()); return mappingContext; } @@ -275,4 +283,11 @@ public abstract class Neo4jConfiguration { return new IndexProviderImpl(neo4jMappingContext(), graphDatabase()); } + public Set> getInitialEntitySet() { + return initialEntitySet; + } + + public void setInitialEntitySet(Set> initialEntitySet) { + this.initialEntitySet = initialEntitySet; + } } 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/IndexCreationMappingEventListener.java index 87789fcaa..428fb1c70 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/IndexCreationMappingEventListener.java @@ -15,6 +15,7 @@ */ package org.springframework.data.neo4j.support.mapping; +import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationListener; import org.springframework.data.mapping.PropertyHandler; import org.springframework.data.mapping.event.MappingContextEvent; @@ -23,13 +24,17 @@ import org.springframework.data.neo4j.mapping.Neo4jPersistentProperty; import org.springframework.data.neo4j.support.Neo4jTemplate; import org.springframework.data.neo4j.support.index.IndexType; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; + /** * @author mh * @since 12.04.12 */ -public class IndexCreationMappingEventListener implements ApplicationListener, Neo4jPersistentProperty>> { +public class IndexCreationMappingEventListener implements ApplicationListener, Neo4jPersistentProperty>>, InitializingBean { private Neo4jTemplate template; - + private Queue initialEntities=new ConcurrentLinkedQueue(); + private boolean isInitialized=false; public IndexCreationMappingEventListener(Neo4jTemplate template) { this.template = template; } @@ -37,8 +42,16 @@ public class IndexCreationMappingEventListener implements ApplicationListener, Neo4jPersistentProperty> event) { if (!(event.getSource() instanceof Neo4jPersistentEntity)) return; - final Neo4jPersistentEntity entity = event.getPersistentEntity(); + if (!isInitialized) { + initialEntities.add(entity); + } + else { + ensureEntityIndexes(entity); + } + } + + private void ensureEntityIndexes(Neo4jPersistentEntity entity) { final Class entityType = entity.getType(); template.getIndex(entityType, null, IndexType.SIMPLE); entity.doWithProperties(new PropertyHandler() { @@ -50,4 +63,13 @@ public class IndexCreationMappingEventListener implements ApplicationListener entity : getPersistentEntities()) { if (entity.matchesAlias(alias)) return entity; } + return tryToResolveAliasAsEntityClassName(alias); + } + + @Override + public void afterPropertiesSet() { + try { + super.afterPropertiesSet(); + } catch(Exception e) { + e.printStackTrace(); + } + } + + private Neo4jPersistentEntity tryToResolveAliasAsEntityClassName(Object alias) { + if (alias instanceof Class) { + try { + return getPersistentEntity((Class)alias); + } catch(MappingException me) { + // ignores + } + } + if (alias instanceof String && alias.toString().contains(".")) { + try { + return tryToResolveAliasAsEntityClassName(Class.forName(alias.toString())); + } catch (ClassNotFoundException cnfe) { + // ignore + } + } + if (alias instanceof StoredEntityType) { + return ((StoredEntityType)alias).getEntity(); + } return null; } diff --git a/spring-data-neo4j/src/main/resources/org/springframework/data/neo4j/config/spring-neo4j-2.0.xsd b/spring-data-neo4j/src/main/resources/org/springframework/data/neo4j/config/spring-neo4j-2.0.xsd index 60c917a67..b1fa810bd 100644 --- a/spring-data-neo4j/src/main/resources/org/springframework/data/neo4j/config/spring-neo4j-2.0.xsd +++ b/spring-data-neo4j/src/main/resources/org/springframework/data/neo4j/config/spring-neo4j-2.0.xsd @@ -18,9 +18,29 @@ - + + + + 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/config/DataGraphNamespaceHandlerTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest.java index 4d258e5fb..fa45ca2cd 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest.java @@ -31,13 +31,17 @@ import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.converter.GenericConverter; import org.springframework.data.neo4j.model.PersonRepository; import org.springframework.data.neo4j.support.Neo4jTemplate; +import org.springframework.data.neo4j.support.mapping.Neo4jMappingContext; +import org.springframework.data.neo4j.support.mapping.Neo4jPersistentEntityImpl; import org.springframework.transaction.PlatformTransactionManager; import java.io.File; +import java.util.Collection; import java.util.Collections; import java.util.Set; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; /** * @author mh @@ -53,6 +57,8 @@ public class DataGraphNamespaceHandlerTest { Neo4jTemplate neo4jTemplate; @Autowired PlatformTransactionManager transactionManager; + @Autowired + Neo4jMappingContext mappingContext; @Autowired(required = false) PersonRepository personRepository; } @@ -96,6 +102,13 @@ public class DataGraphNamespaceHandlerTest { assertInjected("-code"); } @Test + public void injectionForBasePackageOfEntities() { + Config config = assertInjected("-entities"); + Collection> entities = config.mappingContext.getPersistentEntities(); + System.out.println(entities); + assertTrue(entities.size() > 0); + } + @Test public void injectionForConversionService() { final Config config = assertInjected("-conversion"); final ConversionService conversionService = config.neo4jTemplate.getConversionService(); diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Attribute.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Attribute.java index c4d8787f1..07fbf3fba 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Attribute.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Attribute.java @@ -16,6 +16,7 @@ package org.springframework.data.neo4j.model; +import org.springframework.data.neo4j.annotation.GraphId; import org.springframework.data.neo4j.annotation.Indexed; import org.springframework.data.neo4j.annotation.NodeEntity; @@ -25,6 +26,8 @@ import org.springframework.data.neo4j.annotation.NodeEntity; */ @NodeEntity public class Attribute { + private @GraphId Long id; + @Indexed T value; diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Car.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Car.java index ec6fd9ca8..17a236578 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Car.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Car.java @@ -21,8 +21,9 @@ import org.springframework.data.neo4j.annotation.GraphId; import org.springframework.data.neo4j.annotation.NodeEntity; @NodeEntity -public abstract class Car { +public class Car { @GraphId + public Long id; public Car() { } diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/ReadWriteTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/ReadWriteTest.java new file mode 100644 index 000000000..4f90f0e8a --- /dev/null +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/ReadWriteTest.java @@ -0,0 +1,70 @@ +/** + * 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.repository; + +import org.junit.Ignore; +import org.neo4j.graphdb.NotFoundException; +import org.neo4j.graphdb.Transaction; +import org.neo4j.kernel.impl.util.FileUtils; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.dao.DataRetrievalFailureException; +import org.springframework.data.neo4j.model.Car; +import org.springframework.data.neo4j.model.Volvo; +import org.springframework.data.neo4j.support.Neo4jTemplate; + +import java.io.File; +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +@Ignore +public class ReadWriteTest { + public static void main(String[] args) throws IOException { + ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:ReadWriteTest-context.xml"); + boolean delete = false; + try { + Neo4jTemplate template = ctx.getBean(Neo4jTemplate.class); + Car car = findOne(template); + if (car != null) { + delete = true; + assertEquals(Volvo.class, car.getClass()); + } else { + Transaction tx = template.beginTx(); + Volvo volvo = template.save(new Volvo()); + assertEquals(1, volvo.id.intValue()); + tx.success(); + tx.finish(); + } + } catch (Exception e) { + e.printStackTrace(); + delete = true; + throw new RuntimeException(e); + } finally { + ctx.close(); + if (delete) { + FileUtils.deleteRecursively(new File("target/read-write.db")); + } + } + } + + private static Car findOne(Neo4jTemplate template) { + try { + return template.findOne(1, Car.class); + } catch (DataRetrievalFailureException nfe) { + return null; + } + } +} diff --git a/spring-data-neo4j/src/test/resources/ReadWriteTest-context.xml b/spring-data-neo4j/src/test/resources/ReadWriteTest-context.xml new file mode 100644 index 000000000..963975ad7 --- /dev/null +++ b/spring-data-neo4j/src/test/resources/ReadWriteTest-context.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/spring-data-neo4j/src/test/resources/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest-entities-context.xml b/spring-data-neo4j/src/test/resources/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest-entities-context.xml new file mode 100644 index 000000000..67ca57c3b --- /dev/null +++ b/spring-data-neo4j/src/test/resources/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest-entities-context.xml @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file From c85b71fa024318a89fe46e0455ffa2a0e083bc25 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Wed, 6 Jun 2012 10:07:04 +0200 Subject: [PATCH 2/2] DATAGRAPH-241 - base-package for entities, fix for alias lookup of loaded but not registered entities requires an update of spring-data-commons to handle the initialization of the MappingContext in a later stage --- spring-data-neo4j-parent/pom.xml | 7 +++-- .../IndexCreationMappingEventListener.java | 24 ++------------- .../config/DataGraphNamespaceHandlerTest.java | 1 + .../Developer.java => config/TestEntity.java} | 29 +++---------------- ...hNamespaceHandlerTest-entities-context.xml | 4 +-- 5 files changed, 14 insertions(+), 51 deletions(-) rename spring-data-neo4j/src/test/java/org/springframework/data/neo4j/{model/Developer.java => config/TestEntity.java} (62%) diff --git a/spring-data-neo4j-parent/pom.xml b/spring-data-neo4j-parent/pom.xml index df949f687..e038cbb70 100644 --- a/spring-data-neo4j-parent/pom.xml +++ b/spring-data-neo4j-parent/pom.xml @@ -126,7 +126,7 @@ 3.0.7.RELEASE 4.0.0.RELEASE [${org.springframework.version.30}, ${org.springframework.version.40}) - 1.3.0.RC2 + 1.3.1.BUILD-SNAPSHOT 1.7 0.8 1.6.12 @@ -754,7 +754,10 @@ spring-milestones - http://repo.springsource.org/libs-milestone + http://repo.springsource.org/libs-snapshot + + true + tinkerpop-repository 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/IndexCreationMappingEventListener.java index 428fb1c70..e21e5f5c4 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/IndexCreationMappingEventListener.java @@ -15,7 +15,6 @@ */ package org.springframework.data.neo4j.support.mapping; -import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationListener; import org.springframework.data.mapping.PropertyHandler; import org.springframework.data.mapping.event.MappingContextEvent; @@ -24,17 +23,12 @@ import org.springframework.data.neo4j.mapping.Neo4jPersistentProperty; import org.springframework.data.neo4j.support.Neo4jTemplate; import org.springframework.data.neo4j.support.index.IndexType; -import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; - /** * @author mh * @since 12.04.12 */ -public class IndexCreationMappingEventListener implements ApplicationListener, Neo4jPersistentProperty>>, InitializingBean { +public class IndexCreationMappingEventListener implements ApplicationListener, Neo4jPersistentProperty>> { private Neo4jTemplate template; - private Queue initialEntities=new ConcurrentLinkedQueue(); - private boolean isInitialized=false; public IndexCreationMappingEventListener(Neo4jTemplate template) { this.template = template; } @@ -43,12 +37,7 @@ public class IndexCreationMappingEventListener implements ApplicationListener, Neo4jPersistentProperty> event) { if (!(event.getSource() instanceof Neo4jPersistentEntity)) return; final Neo4jPersistentEntity entity = event.getPersistentEntity(); - if (!isInitialized) { - initialEntities.add(entity); - } - else { - ensureEntityIndexes(entity); - } + ensureEntityIndexes(entity); } private void ensureEntityIndexes(Neo4jPersistentEntity entity) { @@ -63,13 +52,4 @@ public class IndexCreationMappingEventListener implements ApplicationListener> entities = config.mappingContext.getPersistentEntities(); System.out.println(entities); assertTrue(entities.size() > 0); + assertEquals(TestEntity.class, entities.iterator().next().getType()); } @Test public void injectionForConversionService() { diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Developer.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/config/TestEntity.java similarity index 62% rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Developer.java rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/config/TestEntity.java index 43d5e8569..e388531e3 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Developer.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/config/TestEntity.java @@ -14,33 +14,12 @@ * limitations under the License. */ -package org.springframework.data.neo4j.model; +package org.springframework.data.neo4j.config; +import org.springframework.data.neo4j.annotation.GraphId; import org.springframework.data.neo4j.annotation.NodeEntity; -/** - * @author mh - * @since 18.02.11 - */ @NodeEntity -public class Developer { - String name; - - Person spouse; - - public Developer(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public Person getSpouse() { - return spouse; - } - - public void setSpouse(Person spouse) { - this.spouse = spouse; - } +public class TestEntity { + @GraphId public Long id; } diff --git a/spring-data-neo4j/src/test/resources/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest-entities-context.xml b/spring-data-neo4j/src/test/resources/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest-entities-context.xml index 67ca57c3b..1ba457601 100644 --- a/spring-data-neo4j/src/test/resources/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest-entities-context.xml +++ b/spring-data-neo4j/src/test/resources/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest-entities-context.xml @@ -8,8 +8,8 @@ http://www.springframework.org/schema/data/neo4j http://www.springframework.org/schema/data/neo4j/spring-neo4j-2.0.xsd"> - + - + \ No newline at end of file