From 2b31a6f3f41ef62b626b29eaed3d720740ac85c2 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Fri, 23 Sep 2011 03:09:37 +0200 Subject: [PATCH] added mapping-context state-factories and persistent-entity to entity-states --- .../data/neo4j/config/Neo4jConfiguration.java | 8 ++++++ .../neo4j/fieldaccess/DefaultEntityState.java | 6 ++-- .../neo4j/mapping/Neo4JMappingContext.java | 6 ++-- .../neo4j/support/node/NodeEntityState.java | 5 ++-- .../support/node/NodeEntityStateFactory.java | 28 ++++++++++++++----- .../support/node/PartialNodeEntityState.java | 5 ++-- .../relationship/RelationshipEntityState.java | 8 ++++-- .../RelationshipEntityStateFactory.java | 9 +++++- .../Neo4jGraphRecommendationTest-context.xml | 9 +++--- .../Neo4jGraphPersistenceTest-context.xml | 4 +++ 10 files changed, 64 insertions(+), 24 deletions(-) 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 3b9be7002..909362b48 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 @@ -37,6 +37,7 @@ import org.springframework.data.neo4j.fieldaccess.DelegatingFieldAccessorFactory import org.springframework.data.neo4j.fieldaccess.Neo4jConversionServiceFactoryBean; import org.springframework.data.neo4j.fieldaccess.NodeDelegatingFieldAccessorFactory; import org.springframework.data.neo4j.fieldaccess.RelationshipDelegatingFieldAccessorFactory; +import org.springframework.data.neo4j.mapping.Neo4JMappingContext; import org.springframework.data.neo4j.repository.DirectGraphRepositoryFactory; import org.springframework.data.neo4j.support.GraphDatabaseContext; import org.springframework.data.neo4j.support.node.Neo4jNodeBacking; @@ -149,6 +150,7 @@ public class Neo4jConfiguration { public RelationshipEntityStateFactory relationshipEntityStateFactory() throws Exception { RelationshipEntityStateFactory entityStateFactory = new RelationshipEntityStateFactory(); entityStateFactory.setGraphDatabaseContext(graphDatabaseContext()); + entityStateFactory.setMappingContext(mappingContext()); entityStateFactory.setRelationshipDelegatingFieldAccessorFactory(relationshipDelegatingFieldAccessorFactory()); return entityStateFactory; } @@ -162,12 +164,18 @@ public class Neo4jConfiguration { return aspect; } + @Bean + public Neo4JMappingContext mappingContext() { + return new Neo4JMappingContext(); + } + @Bean public NodeEntityStateFactory nodeEntityStateFactory() throws Exception { NodeEntityStateFactory entityStateFactory = new NodeEntityStateFactory(); entityStateFactory.setGraphDatabaseContext(graphDatabaseContext()); entityStateFactory.setEntityManagerFactory(entityManagerFactory); + entityStateFactory.setMappingContext(mappingContext()); entityStateFactory.setNodeDelegatingFieldAccessorFactory(nodeDelegatingFieldAccessorFactory()); return entityStateFactory; } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DefaultEntityState.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DefaultEntityState.java index 61d844c69..2c9a0da57 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DefaultEntityState.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DefaultEntityState.java @@ -20,6 +20,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.data.neo4j.core.EntityState; import org.springframework.data.neo4j.core.GraphBacked; +import org.springframework.data.neo4j.mapping.Neo4JPersistentEntity; import java.lang.reflect.Field; import java.util.HashMap; @@ -38,12 +39,13 @@ public abstract class DefaultEntityState, STAT private STATE state; protected final static Log log= LogFactory.getLog(DefaultEntityState.class); private final FieldAccessorFactoryProviders fieldAccessorFactoryProviders; + private final Neo4JPersistentEntity persistentEntity; - - public DefaultEntityState(final STATE underlyingState, final ENTITY entity, final Class type, final DelegatingFieldAccessorFactory delegatingFieldAccessorFactory) { + public DefaultEntityState(final STATE underlyingState, final ENTITY entity, final Class type, final DelegatingFieldAccessorFactory delegatingFieldAccessorFactory, Neo4JPersistentEntity persistentEntity) { this.state = underlyingState; this.entity = entity; this.type = type; + this.persistentEntity = persistentEntity; if (delegatingFieldAccessorFactory!=null) { fieldAccessorFactoryProviders = delegatingFieldAccessorFactory.accessorFactoriesFor(type); this.fieldAccessors.putAll(fieldAccessorFactoryProviders.getFieldAccessors()); diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4JMappingContext.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4JMappingContext.java index 974ae767f..2c02c8a73 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4JMappingContext.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4JMappingContext.java @@ -16,14 +16,14 @@ package org.springframework.data.neo4j.mapping; -import java.beans.PropertyDescriptor; -import java.lang.reflect.Field; - import org.springframework.data.mapping.context.AbstractMappingContext; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mapping.model.SimpleTypeHolder; import org.springframework.data.util.TypeInformation; +import java.beans.PropertyDescriptor; +import java.lang.reflect.Field; + /** * Neo4J specific {@link MappingContext} implementation. Simply creates {@link Neo4JPersistentEntityImpl} and * {@link Neo4JPersistentProperty} instances. diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/node/NodeEntityState.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/node/NodeEntityState.java index f6e396dcd..912f52538 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/node/NodeEntityState.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/node/NodeEntityState.java @@ -22,6 +22,7 @@ import org.springframework.dao.InvalidDataAccessResourceUsageException; import org.springframework.data.neo4j.core.NodeBacked; import org.springframework.data.neo4j.fieldaccess.DefaultEntityState; import org.springframework.data.neo4j.fieldaccess.DelegatingFieldAccessorFactory; +import org.springframework.data.neo4j.mapping.Neo4JPersistentEntity; import org.springframework.data.neo4j.support.GraphDatabaseContext; /** @@ -32,8 +33,8 @@ public class NodeEntityState extends DefaultEntitySta private final GraphDatabaseContext graphDatabaseContext; - public NodeEntityState(final Node underlyingState, final ENTITY entity, final Class type, final GraphDatabaseContext graphDatabaseContext, final DelegatingFieldAccessorFactory nodeDelegatingFieldAccessorFactory) { - super(underlyingState, entity, type, nodeDelegatingFieldAccessorFactory); + public NodeEntityState(final Node underlyingState, final ENTITY entity, final Class type, final GraphDatabaseContext graphDatabaseContext, final DelegatingFieldAccessorFactory nodeDelegatingFieldAccessorFactory, Neo4JPersistentEntity persistentEntity) { + super(underlyingState, entity, type, nodeDelegatingFieldAccessorFactory,persistentEntity); this.graphDatabaseContext = graphDatabaseContext; } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/node/NodeEntityStateFactory.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/node/NodeEntityStateFactory.java index 02873f613..96f400ac5 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/node/NodeEntityStateFactory.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/node/NodeEntityStateFactory.java @@ -16,18 +16,20 @@ package org.springframework.data.neo4j.support.node; -import javax.annotation.PostConstruct; -import javax.persistence.EntityManagerFactory; -import javax.persistence.PersistenceUnitUtil; - import org.neo4j.graphdb.Node; import org.springframework.data.neo4j.annotation.NodeEntity; import org.springframework.data.neo4j.core.EntityState; import org.springframework.data.neo4j.core.NodeBacked; import org.springframework.data.neo4j.fieldaccess.DelegatingFieldAccessorFactory; import org.springframework.data.neo4j.fieldaccess.DetachedEntityState; +import org.springframework.data.neo4j.mapping.Neo4JMappingContext; +import org.springframework.data.neo4j.mapping.Neo4JPersistentEntity; import org.springframework.data.neo4j.support.GraphDatabaseContext; +import javax.annotation.PostConstruct; +import javax.persistence.EntityManagerFactory; +import javax.persistence.PersistenceUnitUtil; + public class NodeEntityStateFactory { private GraphDatabaseContext graphDatabaseContext; @@ -38,10 +40,14 @@ public class NodeEntityStateFactory { private PartialNodeEntityState.PartialNodeDelegatingFieldAccessorFactory delegatingFieldAccessorFactory; + private Neo4JMappingContext mappingContext; + public EntityState getEntityState(final NodeBacked entity) { - final NodeEntity graphEntityAnnotation = entity.getClass().getAnnotation(NodeEntity.class); // todo cache ?? + final Class entityType = entity.getClass(); + final NodeEntity graphEntityAnnotation = entityType.getAnnotation(NodeEntity.class); // todo cache ?? + final Neo4JPersistentEntity persistentEntity = mappingContext.getPersistentEntity(entityType); if (graphEntityAnnotation.partial()) { - final PartialNodeEntityState partialNodeEntityState = new PartialNodeEntityState(null, entity, entity.getClass(), graphDatabaseContext, getPersistenceUnitUtils(), delegatingFieldAccessorFactory); + final PartialNodeEntityState partialNodeEntityState = new PartialNodeEntityState(null, entity, entityType, graphDatabaseContext, getPersistenceUnitUtils(), delegatingFieldAccessorFactory, persistentEntity); return new DetachedEntityState(partialNodeEntityState, graphDatabaseContext) { @Override protected boolean isDetached() { @@ -49,7 +55,7 @@ public class NodeEntityStateFactory { } }; } else { - NodeEntityState nodeEntityState = new NodeEntityState(null, entity, entity.getClass(), graphDatabaseContext, nodeDelegatingFieldAccessorFactory); + NodeEntityState nodeEntityState = new NodeEntityState(null, entity, entityType, graphDatabaseContext, nodeDelegatingFieldAccessorFactory, persistentEntity); // alternative was return new NestedTransactionEntityState(nodeEntityState,graphDatabaseContext); return new DetachedEntityState(nodeEntityState, graphDatabaseContext); } @@ -73,6 +79,14 @@ public class NodeEntityStateFactory { this.entityManagerFactory = entityManagerFactory; } + public Neo4JMappingContext getMappingContext() { + return mappingContext; + } + + public void setMappingContext(Neo4JMappingContext mappingContext) { + this.mappingContext = mappingContext; + } + @PostConstruct private void setUp() { this.delegatingFieldAccessorFactory = new PartialNodeEntityState.PartialNodeDelegatingFieldAccessorFactory(graphDatabaseContext); diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/node/PartialNodeEntityState.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/node/PartialNodeEntityState.java index 6e6fb26df..f1cdeb249 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/node/PartialNodeEntityState.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/node/PartialNodeEntityState.java @@ -25,6 +25,7 @@ import org.springframework.data.neo4j.annotation.GraphProperty; import org.springframework.data.neo4j.annotation.RelatedTo; import org.springframework.data.neo4j.core.NodeBacked; import org.springframework.data.neo4j.fieldaccess.*; +import org.springframework.data.neo4j.mapping.Neo4JPersistentEntity; import org.springframework.data.neo4j.support.GraphDatabaseContext; import javax.persistence.PersistenceUnitUtil; @@ -44,8 +45,8 @@ public class PartialNodeEntityState extends DefaultEn private final GraphDatabaseContext graphDatabaseContext; private PersistenceUnitUtil persistenceUnitUtil; - public PartialNodeEntityState(final Node underlyingState, final ENTITY entity, final Class type, final GraphDatabaseContext graphDatabaseContext, PersistenceUnitUtil persistenceUnitUtil, final PartialNodeDelegatingFieldAccessorFactory delegatingFieldAccessorFactory) { - super(underlyingState, entity, type, delegatingFieldAccessorFactory); + public PartialNodeEntityState(final Node underlyingState, final ENTITY entity, final Class type, final GraphDatabaseContext graphDatabaseContext, PersistenceUnitUtil persistenceUnitUtil, final PartialNodeDelegatingFieldAccessorFactory delegatingFieldAccessorFactory, final Neo4JPersistentEntity persistentEntity) { + super(underlyingState, entity, type, delegatingFieldAccessorFactory, persistentEntity); this.graphDatabaseContext = graphDatabaseContext; this.persistenceUnitUtil = persistenceUnitUtil; } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/relationship/RelationshipEntityState.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/relationship/RelationshipEntityState.java index ff578b4bd..acca51930 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/relationship/RelationshipEntityState.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/relationship/RelationshipEntityState.java @@ -20,7 +20,9 @@ import org.neo4j.graphdb.NotInTransactionException; import org.neo4j.graphdb.Relationship; import org.springframework.dao.InvalidDataAccessResourceUsageException; import org.springframework.data.neo4j.core.RelationshipBacked; -import org.springframework.data.neo4j.fieldaccess.*; +import org.springframework.data.neo4j.fieldaccess.DefaultEntityState; +import org.springframework.data.neo4j.fieldaccess.DelegatingFieldAccessorFactory; +import org.springframework.data.neo4j.mapping.Neo4JPersistentEntity; import org.springframework.data.neo4j.support.GraphDatabaseContext; @@ -32,8 +34,8 @@ public class RelationshipEntityState extends private final GraphDatabaseContext graphDatabaseContext; - public RelationshipEntityState(final Relationship underlyingState, final ENTITY entity, final Class type, final GraphDatabaseContext graphDatabaseContext, final DelegatingFieldAccessorFactory delegatingFieldAccessorFactory) { - super(underlyingState, entity, type, delegatingFieldAccessorFactory); + public RelationshipEntityState(final Relationship underlyingState, final ENTITY entity, final Class type, final GraphDatabaseContext graphDatabaseContext, final DelegatingFieldAccessorFactory delegatingFieldAccessorFactory, Neo4JPersistentEntity persistentEntity) { + super(underlyingState, entity, type, delegatingFieldAccessorFactory, persistentEntity); this.graphDatabaseContext = graphDatabaseContext; } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/relationship/RelationshipEntityStateFactory.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/relationship/RelationshipEntityStateFactory.java index 609eaba44..4199f0a93 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/relationship/RelationshipEntityStateFactory.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/relationship/RelationshipEntityStateFactory.java @@ -20,6 +20,7 @@ import org.neo4j.graphdb.Relationship; import org.springframework.data.neo4j.core.EntityState; import org.springframework.data.neo4j.core.RelationshipBacked; import org.springframework.data.neo4j.fieldaccess.DelegatingFieldAccessorFactory; +import org.springframework.data.neo4j.mapping.Neo4JMappingContext; import org.springframework.data.neo4j.support.GraphDatabaseContext; public class RelationshipEntityStateFactory { @@ -27,9 +28,11 @@ public class RelationshipEntityStateFactory { private GraphDatabaseContext graphDatabaseContext; private DelegatingFieldAccessorFactory relationshipDelegatingFieldAccessorFactory; + private Neo4JMappingContext mappingContext; public EntityState getEntityState(final RelationshipBacked entity) { - return new RelationshipEntityState(null,entity,entity.getClass(), graphDatabaseContext, relationshipDelegatingFieldAccessorFactory); + final Class entityType = entity.getClass(); + return new RelationshipEntityState(null,entity, entityType, graphDatabaseContext, relationshipDelegatingFieldAccessorFactory,mappingContext.getPersistentEntity(entityType)); } public void setGraphDatabaseContext(GraphDatabaseContext graphDatabaseContext) { @@ -40,4 +43,8 @@ public class RelationshipEntityStateFactory { DelegatingFieldAccessorFactory delegatingFieldAccessorFactory) { this.relationshipDelegatingFieldAccessorFactory = delegatingFieldAccessorFactory; } + + public void setMappingContext(Neo4JMappingContext mappingContext) { + this.mappingContext = mappingContext; + } } diff --git a/spring-data-neo4j/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTest-context.xml b/spring-data-neo4j/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTest-context.xml index 66d9c453f..35664c0d2 100644 --- a/spring-data-neo4j/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTest-context.xml +++ b/spring-data-neo4j/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTest-context.xml @@ -120,8 +120,12 @@ + + + + @@ -129,6 +133,7 @@ + @@ -136,10 +141,6 @@ - - - - diff --git a/spring-data-neo4j/src/test/resources/org/springframework/data/neo4j/support/Neo4jGraphPersistenceTest-context.xml b/spring-data-neo4j/src/test/resources/org/springframework/data/neo4j/support/Neo4jGraphPersistenceTest-context.xml index 6826c8954..30cb58500 100644 --- a/spring-data-neo4j/src/test/resources/org/springframework/data/neo4j/support/Neo4jGraphPersistenceTest-context.xml +++ b/spring-data-neo4j/src/test/resources/org/springframework/data/neo4j/support/Neo4jGraphPersistenceTest-context.xml @@ -115,8 +115,11 @@ + + + @@ -124,6 +127,7 @@ +