diff --git a/developer_notes.html b/developer_notes.html index 560c9040c..384022437 100644 --- a/developer_notes.html +++ b/developer_notes.html @@ -56,14 +56,11 @@ for (Node actor : actors.traverse(movie))

Transactional: TX needed for write operations

-Transaction tx=graphDatabaseService.beginTx();
-try {
+try (Transaction tx=graphDatabaseService.beginTx()) {
   ... graph operations ...
   tx.success();
 } catch(Exception e) {
   tx.failure();
-} finally {
-  tx.finish();
 }
        
diff --git a/pom.xml b/pom.xml index d7b811bc3..0555de643 100644 --- a/pom.xml +++ b/pom.xml @@ -38,11 +38,11 @@ 1.7 1.7 - 2.0.0-M06 + 2.0.0 - 0.12-neo4j-2.0.0-M06 - 0.7.1-neo4j-2.0.0-M06 - 2.0.0-M06 + 0.12-neo4j-2.0.0 + 0.7.1-neo4j-2.0.0 + 2.0.0 @@ -182,13 +182,13 @@ false - - tinkerpop-repository - http://tinkerpop.com/maven2 - - false - - + + neo4j-contrib-releases + https://raw.github.com/neo4j-contrib/m2/master/releases + + false + + diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Group.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Group.java index f9ad693dc..b9b74d370 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Group.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Group.java @@ -23,7 +23,6 @@ import org.neo4j.graphdb.Relationship; import org.neo4j.graphdb.traversal.Evaluators; import org.neo4j.graphdb.traversal.TraversalDescription; import org.neo4j.kernel.Traversal; -import org.neo4j.kernel.impl.traversal.TraversalDescriptionImpl; import org.springframework.data.neo4j.annotation.*; import org.springframework.data.neo4j.core.FieldTraversalDescriptionBuilder; import org.springframework.data.neo4j.mapping.Neo4jPersistentProperty; @@ -183,7 +182,7 @@ public class Group { private static class PeopleTraversalBuilder implements FieldTraversalDescriptionBuilder { @Override public TraversalDescription build(Object start, Neo4jPersistentProperty property, String...params) { - return new TraversalDescriptionImpl() + return Traversal.description() .relationships(DynamicRelationshipType.withName(params[0])) .evaluator(Evaluators.excludeStartPosition()); diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/EntityTestBase.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/EntityTestBase.java index 3f5bb9b38..1c99cb5b1 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/EntityTestBase.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/EntityTestBase.java @@ -88,13 +88,10 @@ public class EntityTestBase { } protected void manualCleanDb() { - Transaction tx = graphDatabaseService.beginTx(); - try { - cleanDb(); - tx.success(); - } finally { - tx.finish(); - } + try (Transaction tx = graphDatabaseService.beginTx()) { + cleanDb(); + tx.success(); + } } @BeforeTransaction diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/IndexTests.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/IndexTests.java index f1350d92c..052a039b7 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/IndexTests.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/IndexTests.java @@ -93,14 +93,11 @@ public class IndexTests extends EntityTestBase { //@Transactional //@Ignore("remove property from index not workin") public void testRemovePropertyFromIndex() { - Transaction tx = neo4jTemplate.getGraphDatabase().beginTx(); - try { + try (Transaction tx = neo4jTemplate.getGraphDatabase().beginTx()) { Group group = persist(new Group()); group.setName(NAME_VALUE); getGroupIndex().remove(getNodeState(group), NAME); tx.success(); - } finally { - tx.finish(); } final Group found = this.groupRepository.findByPropertyValue(NAME, NAME_VALUE); assertNull("Group.name removed from index", found); @@ -272,7 +269,7 @@ public class IndexTests extends EntityTestBase { group2.setName(NAME_VALUE); final Iterable found = this.groupRepository.findAllByPropertyValue(NAME, NAME_VALUE); final Collection result = IteratorUtil.addToCollection(found.iterator(), new HashSet()); - assertEquals(new HashSet(Arrays.asList(group, group2)), result); + assertEquals(new HashSet<>(Arrays.asList(group, group2)), result); } @Test @@ -298,7 +295,7 @@ public class IndexTests extends EntityTestBase { group.setFullTextName("queryableName"); final Iterable found = groupRepository.findAllByQuery(Group.SEARCH_GROUPS_INDEX, "fullTextName", "queryable*"); final Collection result = IteratorUtil.addToCollection(found.iterator(), new HashSet()); - assertEquals(new HashSet(Arrays.asList(group)), result); + assertEquals(new HashSet<>(Arrays.asList(group)), result); } @Test @@ -371,7 +368,7 @@ public class IndexTests extends EntityTestBase { p = persistedPerson(NAME_VALUE2, 30); tx.success(); } finally { - if (tx != null) tx.finish(); + if (tx != null) tx.close(); } Assert.assertEquals(p, personRepository.findByPropertyValue(NAME_INDEX, "name", NAME_VALUE2)); try { @@ -379,7 +376,7 @@ public class IndexTests extends EntityTestBase { p.setName(NAME_VALUE); tx.success(); } finally { - tx.finish(); + tx.close(); } Assert.assertEquals(p, personRepository.findByPropertyValue(NAME_INDEX, "name", NAME_VALUE)); try { @@ -387,7 +384,7 @@ public class IndexTests extends EntityTestBase { p.setName(NAME_VALUE2); tx.success(); } finally { - tx.finish(); + tx.close(); } Assert.assertEquals(p, personRepository.findByPropertyValue(NAME_INDEX, "name", NAME_VALUE2)); } diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/TraversalTests.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/TraversalTests.java index 7abda52f4..b5630f82f 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/TraversalTests.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/TraversalTests.java @@ -25,7 +25,6 @@ import org.neo4j.graphdb.traversal.Evaluators; import org.neo4j.graphdb.traversal.TraversalDescription; import org.neo4j.helpers.collection.IteratorUtil; import org.neo4j.kernel.Traversal; -import org.neo4j.kernel.impl.traversal.TraversalDescriptionImpl; import org.springframework.data.neo4j.aspects.Group; import org.springframework.data.neo4j.aspects.Person; import org.springframework.data.neo4j.core.EntityPath; @@ -112,7 +111,7 @@ public class TraversalTests extends EntityTestBase { Group group = persist(new Group()); group.setName("dev"); group.addPerson(p); - final TraversalDescription traversalDescription = new TraversalDescriptionImpl().relationships(DynamicRelationshipType.withName("persons")).evaluator(Evaluators.excludeStartPosition()); + final TraversalDescription traversalDescription = Traversal.description().relationships(DynamicRelationshipType.withName("persons")).evaluator(Evaluators.excludeStartPosition()); Iterable people = finder.findAllByTraversal(group, traversalDescription); final HashSet found = new HashSet(); for (Person person : people) { diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/AbstractNodeTypeRepresentationStrategyTestBase.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/AbstractNodeTypeRepresentationStrategyTestBase.java index f25e6227b..a89082149 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/AbstractNodeTypeRepresentationStrategyTestBase.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/AbstractNodeTypeRepresentationStrategyTestBase.java @@ -169,7 +169,7 @@ public abstract class AbstractNodeTypeRepresentationStrategyTestBase extends Ent tx.success(); return thing; } finally { - tx.finish(); + tx.close(); } } diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/IndexBasedRelationshipTypeRepresentationStrategyTests.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/IndexBasedRelationshipTypeRepresentationStrategyTests.java index 3872cdbff..c6e6b19e0 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/IndexBasedRelationshipTypeRepresentationStrategyTests.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/IndexBasedRelationshipTypeRepresentationStrategyTests.java @@ -163,7 +163,7 @@ public class IndexBasedRelationshipTypeRepresentationStrategyTests extends Entit link.setLabel("link"); tx.success(); } finally { - tx.finish(); + tx.close(); } } diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/NoopTypeRepresentationStrategyTests.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/NoopTypeRepresentationStrategyTests.java index de59d871a..1dcaa2045 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/NoopTypeRepresentationStrategyTests.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/NoopTypeRepresentationStrategyTests.java @@ -119,7 +119,7 @@ public class NoopTypeRepresentationStrategyTests extends EntityTestBase { tx.success(); return thing; } finally { - tx.finish(); + tx.close(); } } diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/SubReferenceNodeTypeRepresentationStrategyTests.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/SubReferenceNodeTypeRepresentationStrategyTests.java index a0a3123da..7b48dd9ca 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/SubReferenceNodeTypeRepresentationStrategyTests.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/SubReferenceNodeTypeRepresentationStrategyTests.java @@ -33,6 +33,7 @@ import org.springframework.data.neo4j.aspects.Volvo; import org.springframework.data.neo4j.aspects.support.EntityTestBase; import org.springframework.data.neo4j.core.GraphDatabase; import org.springframework.data.neo4j.repository.GraphRepository; +import org.springframework.data.neo4j.support.ReferenceNodes; import org.springframework.data.neo4j.support.mapping.EntityStateHandler; import org.springframework.data.neo4j.support.typerepresentation.SubReferenceNodeTypeRepresentationStrategy; import org.springframework.data.neo4j.template.GraphCallback; @@ -76,6 +77,7 @@ public class SubReferenceNodeTypeRepresentationStrategyTests extends EntityTestB createThing(); } + @Test @Transactional public void testPostEntityCreation() throws Exception { @@ -87,8 +89,8 @@ public class SubReferenceNodeTypeRepresentationStrategyTests extends EntityTestB @Test(expected = IllegalArgumentException.class) @Transactional public void gettingTypeFromNonTypeNodeShouldThrowAnDescriptiveException() throws Exception { - Node referenceNode = neo4jTemplate.getReferenceNode(); - nodeTypeRepresentationStrategy.readAliasFrom(referenceNode); + Node node = neo4jTemplate.createNode(); + nodeTypeRepresentationStrategy.readAliasFrom(node); } @Test(expected = IllegalArgumentException.class) @@ -110,7 +112,7 @@ public class SubReferenceNodeTypeRepresentationStrategyTests extends EntityTestB subThing.setName("subThing"); tx.success(); } finally { - tx.finish(); + tx.close(); } } diff --git a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/config/CrossStoreNeo4jConfiguration.java b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/config/CrossStoreNeo4jConfiguration.java index 8b4d49056..5ab08faa3 100644 --- a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/config/CrossStoreNeo4jConfiguration.java +++ b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/config/CrossStoreNeo4jConfiguration.java @@ -29,7 +29,7 @@ import org.springframework.data.neo4j.fieldaccess.FieldAccessorFactoryFactory; import org.springframework.data.neo4j.mapping.EntityInstantiator; import org.springframework.data.neo4j.support.node.NodeEntityInstantiator; import org.springframework.data.neo4j.support.node.NodeEntityStateFactory; -import org.springframework.data.neo4j.transaction.ChainedTransactionManager; +import org.springframework.data.transaction.ChainedTransactionManager; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.jta.JtaTransactionManager; diff --git a/spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTests-context.xml b/spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTests-context.xml index aee26efe0..0e05b30ba 100644 --- a/spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTests-context.xml +++ b/spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTests-context.xml @@ -92,7 +92,7 @@ - + diff --git a/spring-data-neo4j-examples/cineasts-aspects/src/main/java/org/neo4j/cineasts/service/Neo4jDatabaseCleaner.java b/spring-data-neo4j-examples/cineasts-aspects/src/main/java/org/neo4j/cineasts/service/Neo4jDatabaseCleaner.java index 15d995459..9f71038f6 100644 --- a/spring-data-neo4j-examples/cineasts-aspects/src/main/java/org/neo4j/cineasts/service/Neo4jDatabaseCleaner.java +++ b/spring-data-neo4j-examples/cineasts-aspects/src/main/java/org/neo4j/cineasts/service/Neo4jDatabaseCleaner.java @@ -30,7 +30,7 @@ public class Neo4jDatabaseCleaner { clearIndex(result); tx.success(); } finally { - tx.finish(); + tx.close(); } return result; } diff --git a/spring-data-neo4j-examples/cineasts-rest/src/main/java/org/neo4j/cineasts/service/Neo4jDatabaseCleaner.java b/spring-data-neo4j-examples/cineasts-rest/src/main/java/org/neo4j/cineasts/service/Neo4jDatabaseCleaner.java index 15d995459..9f71038f6 100644 --- a/spring-data-neo4j-examples/cineasts-rest/src/main/java/org/neo4j/cineasts/service/Neo4jDatabaseCleaner.java +++ b/spring-data-neo4j-examples/cineasts-rest/src/main/java/org/neo4j/cineasts/service/Neo4jDatabaseCleaner.java @@ -30,7 +30,7 @@ public class Neo4jDatabaseCleaner { clearIndex(result); tx.success(); } finally { - tx.finish(); + tx.close(); } return result; } diff --git a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/service/Neo4jDatabaseCleaner.java b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/service/Neo4jDatabaseCleaner.java index f82a7838c..a09bbffe1 100644 --- a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/service/Neo4jDatabaseCleaner.java +++ b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/service/Neo4jDatabaseCleaner.java @@ -28,7 +28,7 @@ public class Neo4jDatabaseCleaner { clearIndex(result); tx.success(); } finally { - tx.finish(); + tx.close(); } return result; } diff --git a/spring-data-neo4j-examples/myrestaurants-social/src/test/java/com/springdeveloper/data/neo/PrintNeo4j.java b/spring-data-neo4j-examples/myrestaurants-social/src/test/java/com/springdeveloper/data/neo/PrintNeo4j.java index e5901bf45..a26836a0e 100644 --- a/spring-data-neo4j-examples/myrestaurants-social/src/test/java/com/springdeveloper/data/neo/PrintNeo4j.java +++ b/spring-data-neo4j-examples/myrestaurants-social/src/test/java/com/springdeveloper/data/neo/PrintNeo4j.java @@ -46,7 +46,7 @@ public class PrintNeo4j { e.printStackTrace(); } finally { - tx.finish(); + tx.close(); } try { Thread.sleep(5000); diff --git a/spring-data-neo4j-rest/pom.xml b/spring-data-neo4j-rest/pom.xml index 8cbee2166..7e450ab73 100644 --- a/spring-data-neo4j-rest/pom.xml +++ b/spring-data-neo4j-rest/pom.xml @@ -19,7 +19,7 @@ 1.0.0.GA 1.9 - 2.0.0-M06 + 2.0.0 diff --git a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestGraphDatabase.java b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestGraphDatabase.java index 8925d129e..dcb4c4d05 100644 --- a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestGraphDatabase.java +++ b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestGraphDatabase.java @@ -38,7 +38,7 @@ import org.springframework.data.neo4j.support.query.QueryEngine; import javax.transaction.TransactionManager; import java.util.Map; -public class SpringRestGraphDatabase extends org.neo4j.rest.graphdb.RestGraphDatabase implements GraphDatabase{ +public class SpringRestGraphDatabase extends org.neo4j.rest.graphdb.RestGraphDatabase implements GraphDatabase { static { System.setProperty(Config.CONFIG_BATCH_TRANSACTION,"false"); } @@ -189,5 +189,4 @@ public class SpringRestGraphDatabase extends org.neo4j.rest.graphdb.RestGraphDat indexManager.forRelationships(indexName).remove(relationship); } } - } diff --git a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/integration/RestUniqueEntityTests.java b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/integration/RestUniqueEntityTests.java index c13d66d17..60efbda5f 100644 --- a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/integration/RestUniqueEntityTests.java +++ b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/integration/RestUniqueEntityTests.java @@ -16,9 +16,7 @@ package org.springframework.data.neo4j.rest.integration; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; +import org.junit.*; import org.junit.runner.RunWith; import org.springframework.data.neo4j.rest.support.RestTestBase; import org.springframework.data.neo4j.unique.UniqueEntityTests; @@ -56,4 +54,34 @@ public class RestUniqueEntityTests extends UniqueEntityTests { } + @Override + @Ignore("Broken in Neo4j 2.0") + @Test + public void updatingToADuplicateValueShouldCauseAnException() { + } + + @Override + @Ignore("Broken in Neo4j 2.0") + public void shouldOnlyCreateSingleInstanceForUniqueNodeEntity() { + } + + @Override + @Ignore("Broken in Neo4j 2.0") + public void deletingUniqueNodeShouldRemoveItFromTheUniqueIndex() { + } + + @Override + @Ignore("Broken in Neo4j 2.0") + public void shouldOnlyCreateSingleInstanceForUniqueNumericNodeEntity() { + } + + @Override + @Ignore("Broken in Neo4j 2.0") + public void updatingToANewValueShouldAlsoUpdateTheIndex() { + } + + @Override + @Ignore("Broken in Neo4j 2.0") + public void updatingToANewValueShouldKeepTheEntityUnique() { + } } diff --git a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/Neo4jDatabaseCleaner.java b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/Neo4jDatabaseCleaner.java index 8c333894b..5f518c3ea 100644 --- a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/Neo4jDatabaseCleaner.java +++ b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/Neo4jDatabaseCleaner.java @@ -45,17 +45,14 @@ public class Neo4jDatabaseCleaner { } private void removeNodes(Map result) { - Node refNode = graph.getReferenceNode(); int nodes = 0, relationships = 0; for (Node node : graph.getAllNodes()) { for (Relationship rel : node.getRelationships(Direction.OUTGOING)) { rel.delete(); relationships++; } - if (!refNode.equals(node)) { - node.delete(); - nodes++; - } + node.delete(); + nodes++; } result.put("nodes", nodes); result.put("relationships", relationships); diff --git a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestEntityTests.java b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestEntityTests.java index c7b07754c..fec7ef9e7 100644 --- a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestEntityTests.java +++ b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestEntityTests.java @@ -32,28 +32,31 @@ public class RestEntityTests extends RestTestBase { @Test public void testSetProperty() { - restGraphDatabase.getReferenceNode().setProperty( "name", "test" ); - Node node = restGraphDatabase.getReferenceNode(); - assertEquals("test", node.getProperty("name")); + Node node = restGraphDatabase.createNode(); + node.setProperty("name", "test"); + Node node2 = restGraphDatabase.getNodeById(node.getId()); + assertEquals("test", node2.getProperty("name")); } @Test public void testSetStringArrayProperty() { - restGraphDatabase.getReferenceNode().setProperty( "name", new String[]{"test"} ); - Node node = restGraphDatabase.getReferenceNode(); - Assert.assertArrayEquals( new String[]{"test"}, (String[])node.getProperty( "name" ) ); + Node node = restGraphDatabase.createNode(); + node.setProperty("name", new String[]{"test"}); + Node node2 = restGraphDatabase.getNodeById(node.getId()); + Assert.assertArrayEquals( new String[]{"test"}, (String[])node2.getProperty( "name" ) ); } @Test public void testSetDoubleArrayProperty() { double[] data = {0, 1, 2}; - restGraphDatabase.getReferenceNode().setProperty( "data", data ); - Node node = restGraphDatabase.getReferenceNode(); - Assert.assertTrue("same double array",Arrays.equals( data, (double[])node.getProperty( "data" ) )); + Node node = restGraphDatabase.createNode(); + node.setProperty("data", data); + Node node2 = restGraphDatabase.getNodeById(node.getId()); + Assert.assertTrue("same double array",Arrays.equals( data, (double[])node2.getProperty( "data" ) )); } @Test public void testRemoveProperty() { - Node node = restGraphDatabase.getReferenceNode(); + Node node = restGraphDatabase.createNode(); node.setProperty( "name", "test" ); assertEquals("test", node.getProperty("name")); node.removeProperty( "name" ); @@ -72,7 +75,7 @@ public class RestEntityTests extends RestTestBase { @Test(expected = NotFoundException.class) public void testRemoveRelationship() { - Node refNode = restGraphDatabase.getReferenceNode(); + Node refNode = restGraphDatabase.createNode(); Node node = restGraphDatabase.createNode(); Relationship rel = restGraphDatabase.createRelationship(refNode, node, Type.TEST, map("name","test")); final long relId = rel.getId(); @@ -84,7 +87,7 @@ public class RestEntityTests extends RestTestBase { @Test public void testSetPropertyOnRelationship() { - Node refNode = restGraphDatabase.getReferenceNode(); + Node refNode = restGraphDatabase.createNode(); Node node = restGraphDatabase.createNode(); Relationship rel = refNode.createRelationshipTo( node, Type.TEST ); rel.setProperty( "name", "test" ); @@ -95,7 +98,7 @@ public class RestEntityTests extends RestTestBase { @Test public void testRemovePropertyOnRelationship() { - Node refNode = restGraphDatabase.getReferenceNode(); + Node refNode = restGraphDatabase.createNode(); Node node = restGraphDatabase.createNode(); Relationship rel = refNode.createRelationshipTo( node, Type.TEST ); rel.setProperty( "name", "test" ); diff --git a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestGraphDbTests.java b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestGraphDbTests.java index 5c33604ac..633c078b0 100644 --- a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestGraphDbTests.java +++ b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestGraphDbTests.java @@ -26,8 +26,8 @@ public class RestGraphDbTests extends RestTestBase { @Test public void testGetRefNode() { - Node refNode = restGraphDatabase.getReferenceNode(); - Node nodeById = restGraphDatabase.getNodeById( 0 ); + Node refNode = restGraphDatabase.createNode(); + Node nodeById = restGraphDatabase.getNodeById( refNode.getId() ); Assert.assertEquals( refNode, nodeById ); } @@ -39,7 +39,7 @@ public class RestGraphDbTests extends RestTestBase { @Test public void testCreateRelationship() { - Node refNode = restGraphDatabase.getReferenceNode(); + Node refNode = restGraphDatabase.createNode(); Node node = restGraphDatabase.createNode(); Relationship rel = refNode.createRelationshipTo( node, Type.TEST ); Relationship foundRelationship = IsRelationshipToNodeMatcher.relationshipFromTo( refNode.getRelationships( Type.TEST, Direction.OUTGOING ), refNode, node ); @@ -53,7 +53,7 @@ public class RestGraphDbTests extends RestTestBase { @Test public void testBasic() { - Node refNode = restGraphDatabase.getReferenceNode(); + Node refNode = restGraphDatabase.createNode(); Node node = restGraphDatabase.createNode(); Relationship rel = refNode.createRelationshipTo( node, DynamicRelationshipType.withName( "TEST" ) ); diff --git a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestTestBase.java b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestTestBase.java index 7a42619f7..20ffe4770 100644 --- a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestTestBase.java +++ b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestTestBase.java @@ -45,6 +45,7 @@ public class RestTestBase { public static final int PORT = 7470; protected static NeoServer neoServer = null; public static final String SERVER_ROOT_URI = "http://" + HOSTNAME + ":" + PORT + "/db/data/"; + private Node refNode; @BeforeClass public static void startDb() throws Exception { @@ -78,6 +79,7 @@ public class RestTestBase { public void setUp() throws Exception { cleanDb(); restGraphDatabase = new SpringRestGraphDatabase(SERVER_ROOT_URI); + refNode = restGraphDatabase.createNode(); } public static void cleanDb() { @@ -102,6 +104,6 @@ public class RestTestBase { } protected Node node() { - return restGraphDatabase.getReferenceNode(); + return refNode; } } diff --git a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestTestHelper.java b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestTestHelper.java index d6326096d..424f83e4c 100644 --- a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestTestHelper.java +++ b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestTestHelper.java @@ -50,7 +50,7 @@ public class RestTestHelper } public void cleanDb() { - db.cleanContent(true); + db.cleanContent(); } public static void shutdownServer() { diff --git a/spring-data-neo4j-tx/src/main/java/org/springframework/data/neo4j/transaction/ChainedTransactionManager.java b/spring-data-neo4j-tx/src/main/java/org/springframework/data/neo4j/transaction/ChainedTransactionManager.java deleted file mode 100644 index 2a2ee48dd..000000000 --- a/spring-data-neo4j-tx/src/main/java/org/springframework/data/neo4j/transaction/ChainedTransactionManager.java +++ /dev/null @@ -1,171 +0,0 @@ -/** - * Copyright 2011-2013 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.transaction; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.transaction.*; - -import java.util.*; - -import static java.util.Arrays.asList; - -/** - * @deprecated use org.springframework.data.transaction.ChainedTransactionManager instead - * @author mh - * @since 14.02.11 - */ -@Deprecated -public class ChainedTransactionManager implements PlatformTransactionManager { - - private final static Logger logger = LoggerFactory.getLogger(ChainedTransactionManager.class); - - private final List transactionManagers; - private final SynchronizationManager synchronizationManager; - - public ChainedTransactionManager(PlatformTransactionManager... transactionManagers) { - this(new DefaultSynchronizationManager(),transactionManagers); - } - - public ChainedTransactionManager(SynchronizationManager synchronizationManager, PlatformTransactionManager... transactionManagers) { - this.synchronizationManager = synchronizationManager; - this.transactionManagers=asList(transactionManagers); - } - - @Override - public MultiTransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException { - - MultiTransactionStatus mts = new MultiTransactionStatus(transactionManagers.get(0)/*First TM is main TM*/); - - if (!synchronizationManager.isSynchronizationActive()) { - synchronizationManager.initSynchronization(); - mts.setNewSynchonization(); - } - - try { - for (PlatformTransactionManager transactionManager : transactionManagers) { - mts.registerTransactionManager(definition, transactionManager); - } - } catch (Exception ex) { - Map transactionStatuses = mts.getTransactionStatuses(); - for (PlatformTransactionManager transactionManager : transactionManagers) { - try { - if (transactionStatuses.get(transactionManager) != null) - transactionManager.rollback(transactionStatuses.get(transactionManager)); - } catch (Exception ex2) { - logger.warn("Rollback exception (" + transactionManager + ") " + ex2.getMessage(), ex2); - } - } - - if (mts.isNewSynchonization()){ - synchronizationManager.clearSynchronization(); - } - - throw new CannotCreateTransactionException(ex.getMessage(), ex); - } - - return mts; - } - - @Override - public void commit(TransactionStatus status) throws TransactionException { - - MultiTransactionStatus multiTransactionStatus = (MultiTransactionStatus) status; - - boolean commit = true; - Exception commitException = null; - PlatformTransactionManager commitExceptionTransactionManager = null; - - for (PlatformTransactionManager transactionManager : reverse(transactionManagers)) { - if (commit) { - try { - multiTransactionStatus.commit(transactionManager); - } catch (Exception ex) { - commit = false; - commitException = ex; - commitExceptionTransactionManager = transactionManager; - } - } else { - //after unsucessfull commit we must try to rollback remaining transaction managers - try { - multiTransactionStatus.rollback(transactionManager); - } catch (Exception ex) { - logger.warn("Rollback exception (after commit) (" + transactionManager + ") " + ex.getMessage(), ex); - } - } - } - - if (multiTransactionStatus.isNewSynchonization()){ - synchronizationManager.clearSynchronization(); - } - - if (commitException != null) { - boolean firstTransactionManagerFailed = commitExceptionTransactionManager == getLastTransactionManager(); - int transactionState = firstTransactionManagerFailed ? HeuristicCompletionException.STATE_ROLLED_BACK : HeuristicCompletionException.STATE_MIXED; - throw new HeuristicCompletionException(transactionState, commitException); - } - - } - - @Override - public void rollback(TransactionStatus status) throws TransactionException { - - Exception rollbackException = null; - PlatformTransactionManager rollbackExceptionTransactionManager = null; - - - MultiTransactionStatus multiTransactionStatus = (MultiTransactionStatus) status; - - for (PlatformTransactionManager transactionManager : reverse(transactionManagers)) { - try { - multiTransactionStatus.rollback(transactionManager); - } catch (Exception ex) { - if (rollbackException == null) { - rollbackException = ex; - rollbackExceptionTransactionManager = transactionManager; - } else { - logger.warn("Rollback exception (" + transactionManager + ") " + ex.getMessage(), ex); - } - } - } - - if (multiTransactionStatus.isNewSynchonization()){ - synchronizationManager.clearSynchronization(); - } - - if (rollbackException != null) { - throw new UnexpectedRollbackException("Rollback exception, originated at ("+rollbackExceptionTransactionManager+") "+ - rollbackException.getMessage(), rollbackException); - } - } - - private Iterable reverse(Collection collection) { - List list = new ArrayList(collection); - Collections.reverse(list); - return list; - } - - - private PlatformTransactionManager getLastTransactionManager() { - return transactionManagers.get(lastTransactionManagerIndex()); - } - - private int lastTransactionManagerIndex() { - return transactionManagers.size() - 1; - } - -} \ No newline at end of file diff --git a/spring-data-neo4j-tx/src/main/java/org/springframework/data/neo4j/transaction/SpringProvider.java b/spring-data-neo4j-tx/src/main/java/org/springframework/data/neo4j/transaction/SpringProvider.java index 4169fd367..6f3462831 100644 --- a/spring-data-neo4j-tx/src/main/java/org/springframework/data/neo4j/transaction/SpringProvider.java +++ b/spring-data-neo4j-tx/src/main/java/org/springframework/data/neo4j/transaction/SpringProvider.java @@ -19,11 +19,7 @@ package org.springframework.data.neo4j.transaction; import org.neo4j.helpers.Service; import org.neo4j.kernel.impl.core.KernelPanicEventGenerator; import org.neo4j.kernel.impl.nioneo.store.FileSystemAbstraction; -import org.neo4j.kernel.impl.transaction.AbstractTransactionManager; -import org.neo4j.kernel.impl.transaction.TransactionManagerProvider; -import org.neo4j.kernel.impl.transaction.TransactionStateFactory; -import org.neo4j.kernel.impl.transaction.TxHook; -import org.neo4j.kernel.impl.transaction.XaDataSourceManager; +import org.neo4j.kernel.impl.transaction.*; import org.neo4j.kernel.impl.util.StringLogger; import org.springframework.beans.factory.annotation.Configurable; @@ -37,7 +33,13 @@ public class SpringProvider extends TransactionManagerProvider } @Override - public AbstractTransactionManager loadTransactionManager(String s, XaDataSourceManager xaDataSourceManager, KernelPanicEventGenerator kernelPanicEventGenerator, TxHook txHook, StringLogger stringLogger, FileSystemAbstraction fileSystemAbstraction, TransactionStateFactory transactionStateFactory) { - return new SpringServiceImpl(transactionStateFactory); + public AbstractTransactionManager loadTransactionManager( String txLogDir, + XaDataSourceManager xaDataSourceManager, + KernelPanicEventGenerator kpe, + RemoteTxHook rollbackHook, + StringLogger msgLog, + FileSystemAbstraction fileSystem, + TransactionStateFactory stateFactory ) { + return new SpringServiceImpl(stateFactory,xaDataSourceManager); } } diff --git a/spring-data-neo4j-tx/src/main/java/org/springframework/data/neo4j/transaction/SpringServiceImpl.java b/spring-data-neo4j-tx/src/main/java/org/springframework/data/neo4j/transaction/SpringServiceImpl.java index 5b3bc7876..3288a39cd 100644 --- a/spring-data-neo4j-tx/src/main/java/org/springframework/data/neo4j/transaction/SpringServiceImpl.java +++ b/spring-data-neo4j-tx/src/main/java/org/springframework/data/neo4j/transaction/SpringServiceImpl.java @@ -21,12 +21,18 @@ import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.impl.core.TransactionState; import org.neo4j.kernel.impl.transaction.AbstractTransactionManager; import org.neo4j.kernel.impl.transaction.TransactionStateFactory; +import org.neo4j.kernel.impl.transaction.XaDataSourceManager; +import org.neo4j.kernel.impl.transaction.xaframework.XaDataSource; +import org.objectweb.jotm.Current; +import org.objectweb.jotm.TransactionResourceManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.jta.JtaTransactionManager; import javax.transaction.*; +import javax.transaction.xa.XAException; +import javax.transaction.xa.XAResource; import java.util.HashMap; import java.util.Map; import java.util.WeakHashMap; @@ -42,13 +48,15 @@ class SpringServiceImpl extends AbstractTransactionManager private TransactionManager delegate; private final Map states = new WeakHashMap(); - private final Map kernelTransactions = new WeakHashMap(); +// private final Map kernelTransactions = new WeakHashMap(); private final TransactionStateFactory stateFactory; + private XaDataSourceManager xaDataSourceManager; private KernelAPI kernelAPI; - SpringServiceImpl(TransactionStateFactory stateFactory) + SpringServiceImpl(TransactionStateFactory stateFactory, XaDataSourceManager xaDataSourceManager) { this.stateFactory = stateFactory; + this.xaDataSourceManager = xaDataSourceManager; } @Override @@ -61,7 +69,29 @@ class SpringServiceImpl extends AbstractTransactionManager } @Override - public void doRecovery() throws Throwable { + public void doRecovery() throws Throwable + { + TransactionResourceManager trm = new TransactionResourceManager() + { + @Override + public void returnXAResource( String rmName, XAResource rmXares ) + { + } + }; + + try + { + for ( XaDataSource xaDs : xaDataSourceManager.getAllRegisteredDataSources() ) + { + Current.getTransactionRecovery().registerResourceManager( xaDs.getName(), + xaDs.getXaConnection().getXaResource(), xaDs.getName(), trm ); + } + Current.getTransactionRecovery().startResourceManagerRecovery(); + } + catch ( XAException e ) + { + throw new Error( "Error registering xa datasource", e ); + } } @Override @@ -97,7 +127,7 @@ class SpringServiceImpl extends AbstractTransactionManager delegate.begin(); Transaction tx = getTransaction(); states.put(tx, stateFactory.create(tx)); - kernelTransactions.put( tx, kernelAPI.newTransaction() ); +// kernelTransactions.put( tx, kernelAPI.newTransaction() ); } public void commit() throws RollbackException, HeuristicMixedException, @@ -163,23 +193,23 @@ class SpringServiceImpl extends AbstractTransactionManager this.transactionManager = transactionManager; } - @Override - public void setKernel(KernelAPI kernelAPI) { - this.kernelAPI = kernelAPI; - } - - @Override - public KernelTransaction getKernelTransaction() - { - Transaction transaction; - try - { - transaction = getTransaction(); - } - catch ( SystemException e ) - { - return null; - } - return kernelTransactions.get( transaction ); - } +// @Override +// public void setKernel(KernelAPI kernelAPI) { +// this.kernelAPI = kernelAPI; +// } +// +// @Override +// public KernelTransaction getKernelTransaction() +// { +// Transaction transaction; +// try +// { +// transaction = getTransaction(); +// } +// catch ( SystemException e ) +// { +// return null; +// } +// return kernelTransactions.get( transaction ); +// } } diff --git a/spring-data-neo4j-tx/src/test/java/org/springframework/data/neo4j/transaction/ChainedTransactionManagerTests.java b/spring-data-neo4j-tx/src/test/java/org/springframework/data/neo4j/transaction/ChainedTransactionManagerTests.java deleted file mode 100644 index ef1b9b0a3..000000000 --- a/spring-data-neo4j-tx/src/test/java/org/springframework/data/neo4j/transaction/ChainedTransactionManagerTests.java +++ /dev/null @@ -1,307 +0,0 @@ -/** - * 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.transaction; - -import org.hamcrest.Description; -import org.hamcrest.Factory; -import org.junit.Test; -import org.junit.internal.matchers.TypeSafeMatcher; -import org.springframework.transaction.*; -import org.springframework.transaction.support.DefaultTransactionDefinition; - -import static junit.framework.Assert.*; -import static org.junit.Assert.assertThat; -import static org.springframework.data.neo4j.transaction.ChainedTransactionManagerTests.TestPlatformTransactionManager.createFailingTransactionManager; -import static org.springframework.data.neo4j.transaction.ChainedTransactionManagerTests.TestPlatformTransactionManager.createNonFailingTransactionManager; -import static org.springframework.data.neo4j.transaction.ChainedTransactionManagerTests.TransactionManagerMatcher.isCommitted; -import static org.springframework.data.neo4j.transaction.ChainedTransactionManagerTests.TransactionManagerMatcher.wasRolledback; -import static org.springframework.transaction.HeuristicCompletionException.getStateString; - -/** - * @author mh - * @since 15.02.11 - */ -public class ChainedTransactionManagerTests { - - private ChainedTransactionManager tm; - - - @Test - public void shouldCompleteSuccessfully() throws Exception { - PlatformTransactionManager transactionManager = createNonFailingTransactionManager("single"); - setupTransactionManagers(transactionManager); - - createAndCommitTransaction(); - - assertThat(transactionManager, isCommitted()); - } - - @Test - public void shouldThrowRolledBackExceptionForSingleTMFailure() throws Exception { - - setupTransactionManagers(createFailingTransactionManager("single")); - try - { - createAndCommitTransaction(); - fail("Didn't throw the expected exception"); - } catch (HeuristicCompletionException e){ - assertEquals(HeuristicCompletionException.STATE_ROLLED_BACK, e.getOutcomeState()); - } - - } - - private void setupTransactionManagers(PlatformTransactionManager... transactionManagers) { - tm = new ChainedTransactionManager(new TestSynchronizationManager(), transactionManagers); - } - - @Test - public void shouldCommitAllRegisteredTM() throws Exception { - PlatformTransactionManager first = createNonFailingTransactionManager("first"); - PlatformTransactionManager second = createNonFailingTransactionManager("second"); - setupTransactionManagers(first, second); - createAndCommitTransaction(); - assertThat(first, isCommitted()); - assertThat(second, isCommitted()); - } - @Test - public void shouldCommitInReverseOrder() throws Exception { - PlatformTransactionManager first = createNonFailingTransactionManager("first"); - PlatformTransactionManager second = createNonFailingTransactionManager("second"); - setupTransactionManagers(first, second); - createAndCommitTransaction(); - assertTrue("second tm commited before first ", commitTime(first) >= commitTime(second)); - - // assertThat(second, committedBefore(first)); - } - - private Long commitTime(PlatformTransactionManager transactionManager) { - return ((TestPlatformTransactionManager)transactionManager).getCommitTime(); - } - - @Test - public void shouldThrowMixedRolledBackExceptionForNonFirstTMFailure() throws Exception { - - setupTransactionManagers( - TestPlatformTransactionManager.createFailingTransactionManager("first"), - createNonFailingTransactionManager("second")); - try - { - createAndCommitTransaction(); - fail("Didn't throw the expected exception"); - } catch (HeuristicCompletionException e){ - assertHeuristicException(HeuristicCompletionException.STATE_MIXED, e.getOutcomeState()); - } - } - - @Test - public void shouldRollbackAllTransactionManagers() throws Exception { - - PlatformTransactionManager first = createNonFailingTransactionManager("first"); - PlatformTransactionManager second = createNonFailingTransactionManager("second"); - setupTransactionManagers(first, second); - createAndRollbackTransaction(); - assertThat(first, wasRolledback()); - assertThat(second, wasRolledback()); - - } - @Test(expected = UnexpectedRollbackException.class ) - public void shouldThrowExceptionOnFailingRollback() throws Exception { - PlatformTransactionManager first = createFailingTransactionManager("first"); - setupTransactionManagers(first); - createAndRollbackTransaction(); - } - - private void createAndRollbackTransaction() { - MultiTransactionStatus transaction = tm.getTransaction(new DefaultTransactionDefinition()); - tm.rollback(transaction); - } - - private void assertHeuristicException(final int expected, final int actual) { - assertEquals(getStateString(expected), getStateString(actual)); - } - - private void createAndCommitTransaction() { - MultiTransactionStatus transaction = tm.getTransaction(new DefaultTransactionDefinition()); - tm.commit(transaction); - } - - private static class TestSynchronizationManager implements SynchronizationManager { - private boolean synchronizationActive; - - @Override - public void initSynchronization() { - synchronizationActive=true; - } - - @Override - public boolean isSynchronizationActive() { - return synchronizationActive; - } - - @Override - public void clearSynchronization() { - synchronizationActive=false; - } - } - - static class TestPlatformTransactionManager implements PlatformTransactionManager { - - private Long commitTime; - private String name; - private Long rollbackTime; - - public TestPlatformTransactionManager(String name) { - this.name = name; - } - - @Factory - static PlatformTransactionManager createFailingTransactionManager(String name) { - return new TestPlatformTransactionManager(name+"-failing") - { - @Override - public void commit(TransactionStatus status) throws TransactionException { - throw new RuntimeException(); - } - - @Override - public void rollback(TransactionStatus status) throws TransactionException { - throw new RuntimeException(); - } - }; - } - - @Factory - static PlatformTransactionManager createNonFailingTransactionManager(String name) { - return new TestPlatformTransactionManager(name+"-non-failing"); - } - - @Override - public String toString() { - return name + (isCommitted() ? " (committed) " : " (not committed)"); - } - - @Override - public TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException { - return new TestTransactionStatus(definition); - } - - @Override - public void commit(TransactionStatus status) throws TransactionException { - commitTime = System.currentTimeMillis(); - } - - @Override - public void rollback(TransactionStatus status) throws TransactionException { - rollbackTime = System.currentTimeMillis(); - } - - public boolean isCommitted() { - return commitTime!=null; - } - public boolean wasRolledBack() { - return rollbackTime!=null; - } - - public Long getCommitTime() { - return commitTime; - } - - private static class TestTransactionStatus implements TransactionStatus { - - public TestTransactionStatus(TransactionDefinition definition) { - } - - @Override - public boolean isNewTransaction() { - return false; - } - - @Override - public boolean hasSavepoint() { - return false; - } - - @Override - public void setRollbackOnly() { - - } - - @Override - public boolean isRollbackOnly() { - return false; - } - - @Override - public void flush() { - - } - - @Override - public boolean isCompleted() { - return false; - } - - @Override - public Object createSavepoint() throws TransactionException { - return null; - } - - @Override - public void rollbackToSavepoint(Object savepoint) throws TransactionException { - - } - - @Override - public void releaseSavepoint(Object savepoint) throws TransactionException { - - } - } - } - - static class TransactionManagerMatcher extends TypeSafeMatcher { - private boolean commitCheck; - - public TransactionManagerMatcher(boolean commitCheck) { - this.commitCheck = commitCheck; - } - - @Override - public boolean matchesSafely(PlatformTransactionManager platformTransactionManager) { - TestPlatformTransactionManager ptm = (TestPlatformTransactionManager) platformTransactionManager; - if (commitCheck) { - return ptm.isCommitted(); - } else { - return ptm.wasRolledBack(); - } - - } - - @Override - public void describeTo(Description description) { - description.appendText("that a "+(commitCheck ? "committed":"rolled-back")+" TransactionManager"); - } - - @Factory - public static TransactionManagerMatcher isCommitted() { - return new TransactionManagerMatcher(true); - } - @Factory - public static TransactionManagerMatcher wasRolledback() { - return new TransactionManagerMatcher(false); - } - } -} diff --git a/spring-data-neo4j-tx/src/test/java/org/springframework/data/neo4j/transaction/JOTMIntegrationTests.java b/spring-data-neo4j-tx/src/test/java/org/springframework/data/neo4j/transaction/JOTMIntegrationTests.java index 46e9a29f5..244f54ff4 100644 --- a/spring-data-neo4j-tx/src/test/java/org/springframework/data/neo4j/transaction/JOTMIntegrationTests.java +++ b/spring-data-neo4j-tx/src/test/java/org/springframework/data/neo4j/transaction/JOTMIntegrationTests.java @@ -25,6 +25,8 @@ import org.neo4j.graphdb.Node; import org.neo4j.graphdb.NotFoundException; import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.kernel.AbstractGraphDatabase; +import org.neo4j.kernel.GraphDatabaseAPI; +import org.neo4j.kernel.KernelData; import org.neo4j.kernel.configuration.Config; import org.objectweb.jotm.Current; import org.springframework.context.support.ClassPathXmlApplicationContext; @@ -118,20 +120,20 @@ public class JOTMIntegrationTests { nodeId = node.getId(); tx.failure(); } finally { - tx.finish(); + tx.close(); } tx = gds.beginTx(); try { gds.getNodeById(nodeId); } finally { tx.success(); - tx.finish(); + tx.close(); } } @Test public void databaseConfiguredWithSpringJtaShouldUseJtaTransactionManager() throws SystemException, NotSupportedException { - final Config config = ((AbstractGraphDatabase) gds).getKernelData().getConfig(); + final Config config = ((GraphDatabaseAPI) gds).getDependencyResolver().resolveDependency(Config.class); Assert.assertEquals("spring-jta", config.getParams().get(GraphDatabaseSettings.tx_manager_impl.name())); JtaTransactionManager tm = ctx.getBean("transactionManager", JtaTransactionManager.class); diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/ConfigurationCheck.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/ConfigurationCheck.java index 9a685ee08..152a71c31 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/ConfigurationCheck.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/ConfigurationCheck.java @@ -17,6 +17,7 @@ package org.springframework.data.neo4j.config; import org.neo4j.graphdb.Transaction; +import org.neo4j.helpers.collection.IteratorUtil; import org.springframework.beans.factory.BeanCreationException; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextStartedEvent; @@ -57,7 +58,7 @@ public class ConfigurationCheck implements ApplicationListener getAllLabelNames(); } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DetachedEntityState.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DetachedEntityState.java index e1d308636..d6dd059c7 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DetachedEntityState.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DetachedEntityState.java @@ -305,7 +305,7 @@ public class DetachedEntityState implements EntityState { if (t instanceof RuntimeException) throw (RuntimeException)t; throw new org.springframework.data.neo4j.core.UncategorizedGraphStoreException("Error persisting entity "+getEntity(),t); } finally { - tx.finish(); + tx.close(); } } } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/RelationshipHelper.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/RelationshipHelper.java index 7aea4c4d6..08ff8a5ae 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/RelationshipHelper.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/RelationshipHelper.java @@ -23,6 +23,7 @@ import org.springframework.data.neo4j.support.typerepresentation.LabelBasedNodeT import org.springframework.util.Assert; import java.util.HashSet; +import java.util.Iterator; import java.util.Set; import static java.lang.String.format; @@ -95,18 +96,10 @@ public class RelationshipHelper { } private Object tryDetermineTypeAssumingLabelBasedStrategy(Relationship relationship,Node node) { - - ResourceIterable