From 1114a25d29effd485d1bdbecaf998d9841b2a897 Mon Sep 17 00:00:00 2001 From: David Montag Date: Sat, 18 Sep 2010 09:31:08 -0700 Subject: [PATCH] Pieces of code on the way to a better state. --- .../fieldaccess/DefaultEntityStateAccessors.java | 1 - .../DetachableEntityStateAccessorsFactory.java | 16 ++++++++++++++++ .../neo4j/fieldaccess/FieldAccessorFactory.java | 2 +- .../graph/neo4j/spi/node/Neo4jNodeBacking.aj | 13 +++++++------ .../neo4j/support/GraphDatabaseContext.java | 2 -- .../spi/Neo4jGraphPersistenceTest-context.xml | 1 + 6 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 src/main/java/org/springframework/datastore/graph/neo4j/fieldaccess/DetachableEntityStateAccessorsFactory.java diff --git a/src/main/java/org/springframework/datastore/graph/neo4j/fieldaccess/DefaultEntityStateAccessors.java b/src/main/java/org/springframework/datastore/graph/neo4j/fieldaccess/DefaultEntityStateAccessors.java index 41567ef7c..73a503c10 100644 --- a/src/main/java/org/springframework/datastore/graph/neo4j/fieldaccess/DefaultEntityStateAccessors.java +++ b/src/main/java/org/springframework/datastore/graph/neo4j/fieldaccess/DefaultEntityStateAccessors.java @@ -37,7 +37,6 @@ public class DefaultEntityStateAccessors imple createAccessorsAndListeners(type, graphDatabaseContext); } - @Override public void createAndAssignNode() { try { diff --git a/src/main/java/org/springframework/datastore/graph/neo4j/fieldaccess/DetachableEntityStateAccessorsFactory.java b/src/main/java/org/springframework/datastore/graph/neo4j/fieldaccess/DetachableEntityStateAccessorsFactory.java new file mode 100644 index 000000000..f35a42544 --- /dev/null +++ b/src/main/java/org/springframework/datastore/graph/neo4j/fieldaccess/DetachableEntityStateAccessorsFactory.java @@ -0,0 +1,16 @@ +package org.springframework.datastore.graph.neo4j.fieldaccess; + +import org.neo4j.graphdb.Node; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.datastore.graph.api.NodeBacked; +import org.springframework.datastore.graph.neo4j.support.GraphDatabaseContext; + +public class DetachableEntityStateAccessorsFactory { + @Autowired + private GraphDatabaseContext graphDatabaseContext; + + public EntityStateAccessors getEntityStateAccessors(NodeBacked entity) { + return new DetachableEntityStateAccessors( + new DefaultEntityStateAccessors(null,entity,entity.getClass(), graphDatabaseContext)); + } +} diff --git a/src/main/java/org/springframework/datastore/graph/neo4j/fieldaccess/FieldAccessorFactory.java b/src/main/java/org/springframework/datastore/graph/neo4j/fieldaccess/FieldAccessorFactory.java index 6603fc36c..e9e742510 100644 --- a/src/main/java/org/springframework/datastore/graph/neo4j/fieldaccess/FieldAccessorFactory.java +++ b/src/main/java/org/springframework/datastore/graph/neo4j/fieldaccess/FieldAccessorFactory.java @@ -6,7 +6,7 @@ import java.lang.reflect.Field; * @author Michael Hunger * @since 12.09.2010 */ -interface FieldAccessorFactory { +public interface FieldAccessorFactory { boolean accept(Field f); FieldAccessor forField(Field f); } diff --git a/src/main/java/org/springframework/datastore/graph/neo4j/spi/node/Neo4jNodeBacking.aj b/src/main/java/org/springframework/datastore/graph/neo4j/spi/node/Neo4jNodeBacking.aj index 29e9188c8..e26b340b2 100644 --- a/src/main/java/org/springframework/datastore/graph/neo4j/spi/node/Neo4jNodeBacking.aj +++ b/src/main/java/org/springframework/datastore/graph/neo4j/spi/node/Neo4jNodeBacking.aj @@ -19,6 +19,7 @@ import org.springframework.persistence.support.AbstractTypeAnnotatingMixinFields import java.lang.reflect.Field; import static org.springframework.datastore.graph.neo4j.fieldaccess.DoReturn.unwrap; +import org.springframework.datastore.graph.neo4j.fieldaccess.DetachableEntityStateAccessorsFactory; /** * Aspect to turn an object annotated with GraphEntity into a graph entity using Neo4J. @@ -29,12 +30,12 @@ import static org.springframework.datastore.graph.neo4j.fieldaccess.DoReturn.unw */ public aspect Neo4jNodeBacking extends AbstractTypeAnnotatingMixinFields { private GraphDatabaseContext graphDatabaseContext; - private DelegatingFieldAccessorFactory fieldAccessorFactory; + private DetachableEntityStateAccessorsFactory entityStateAccessorsFactory; @Autowired - public void init(GraphDatabaseContext ctx) { + public void init(GraphDatabaseContext ctx, DetachableEntityStateAccessorsFactory entityStateAccessorsFactory) { this.graphDatabaseContext = ctx; - this.fieldAccessorFactory = new DelegatingFieldAccessorFactory(ctx); + this.entityStateAccessorsFactory = entityStateAccessorsFactory; } //------------------------------------------------------------------------- @@ -48,7 +49,7 @@ public aspect Neo4jNodeBacking extends AbstractTypeAnnotatingMixinFields(null,entity,entity.getClass(),graphDatabaseContext)); + entity.underlyingState = entityStateAccessorsFactory.getEntityStateAccessors(entity); if (graphDatabaseContext.transactionIsRunning()) { entity.underlyingState.createAndAssignNode(); } else { @@ -62,8 +63,8 @@ public aspect Neo4jNodeBacking extends AbstractTypeAnnotatingMixinFields(n,this,this.getClass(),Neo4jNodeBacking.aspectOf().graphDatabaseContext)); + if (this.underlyingState == null) { + this.underlyingState = entityStateAccessorsFactory.getEntityStateAccessors(this); } else { this.underlyingState.setNode(n); } diff --git a/src/main/java/org/springframework/datastore/graph/neo4j/support/GraphDatabaseContext.java b/src/main/java/org/springframework/datastore/graph/neo4j/support/GraphDatabaseContext.java index 0b75879ef..9c4eeddb7 100644 --- a/src/main/java/org/springframework/datastore/graph/neo4j/support/GraphDatabaseContext.java +++ b/src/main/java/org/springframework/datastore/graph/neo4j/support/GraphDatabaseContext.java @@ -13,8 +13,6 @@ import org.springframework.core.convert.ConversionService; import org.springframework.datastore.graph.api.NodeBacked; import org.springframework.datastore.graph.api.NodeTypeStrategy; import org.springframework.datastore.graph.api.RelationshipBacked; -import org.springframework.datastore.graph.neo4j.fieldaccess.DelegatingFieldAccessorFactory; -import org.springframework.persistence.support.AbstractMixinFields; import org.springframework.persistence.support.EntityInstantiator; import javax.transaction.Status; diff --git a/src/test/resources/org/springframework/datastore/graph/neo4j/spi/Neo4jGraphPersistenceTest-context.xml b/src/test/resources/org/springframework/datastore/graph/neo4j/spi/Neo4jGraphPersistenceTest-context.xml index c663917ee..26bfe4df8 100644 --- a/src/test/resources/org/springframework/datastore/graph/neo4j/spi/Neo4jGraphPersistenceTest-context.xml +++ b/src/test/resources/org/springframework/datastore/graph/neo4j/spi/Neo4jGraphPersistenceTest-context.xml @@ -91,6 +91,7 @@ +