package org.neo4j.kernel.impl.event; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.PropertyContainer; import org.neo4j.graphdb.Relationship; import org.neo4j.graphdb.event.PropertyEntry; import org.neo4j.graphdb.event.TransactionData; class ExpectedTransactionData { final Set<Node> expectedCreatedNodes = new HashSet<Node>(); final Set<Relationship> expectedCreatedRelationships = new HashSet<Relationship>(); final Set<Node> expectedDeletedNodes = new HashSet<Node>(); final Set<Relationship> expectedDeletedRelationships = new HashSet<Relationship>(); final Map<Node, Map<String, PropertyEntryImpl<Node>>> expectedAssignedNodeProperties = new HashMap<Node, Map<String, PropertyEntryImpl<Node>>>(); final Map<Relationship, Map<String, PropertyEntryImpl<Relationship>>> expectedAssignedRelationshipProperties = new HashMap<Relationship, Map<String, PropertyEntryImpl<Relationship>>>(); final Map<Node, Map<String, PropertyEntryImpl<Node>>> expectedRemovedNodeProperties = new HashMap<Node, Map<String, PropertyEntryImpl<Node>>>(); final Map<Relationship, Map<String, PropertyEntryImpl<Relationship>>> expectedRemovedRelationshipProperties = new HashMap<Relationship, Map<String, PropertyEntryImpl<Relationship>>>(); void assignedProperty( Node node, String key, Object value, Object valueBeforeTx ) { putInMap( this.expectedAssignedNodeProperties, node, key, value, valueBeforeTx ); } void assignedProperty( Relationship rel, String key, Object value, Object valueBeforeTx ) { putInMap( this.expectedAssignedRelationshipProperties, rel, key, value, valueBeforeTx ); } void removedProperty( Node node, String key, Object value, Object valueBeforeTx ) { putInMap( this.expectedRemovedNodeProperties, node, key, value, valueBeforeTx ); } void removedProperty( Relationship rel, String key, Object value, Object valueBeforeTx ) { putInMap( this.expectedRemovedRelationshipProperties, rel, key, value, valueBeforeTx ); } <T extends PropertyContainer> void putInMap( Map<T, Map<String, PropertyEntryImpl<T>>> map, T entity, String key, Object value, Object valueBeforeTx ) { Map<String, PropertyEntryImpl<T>> innerMap = map.get( entity ); if ( innerMap == null ) { innerMap = new HashMap<String, PropertyEntryImpl<T>>(); map.put( entity, innerMap ); } innerMap.put( key, new PropertyEntryImpl<T>( entity, key, value, valueBeforeTx ) ); } void compareTo( TransactionData data ) { for ( Node node : data.createdNodes() ) { // System.out.println( "Created node:" + node ); assertTrue( expectedCreatedNodes.remove( node ) ); } assertTrue( expectedCreatedNodes.isEmpty() ); for ( Relationship rel : data.createdRelationships() ) { // System.out.println( "Created rel:" + rel ); assertTrue( expectedCreatedRelationships.remove( rel ) ); } assertTrue( expectedCreatedRelationships.isEmpty() ); for ( Node node : data.deletedNodes() ) { // System.out.println( "Deleted node:" + node ); assertTrue( expectedDeletedNodes.remove( node ) ); } assertTrue( expectedDeletedNodes.isEmpty() ); for ( Relationship rel : data.deletedRelationships() ) { // System.out.println( "Deleted rel:" + rel ); assertTrue( expectedDeletedRelationships.remove( rel ) ); } assertTrue( expectedDeletedRelationships.isEmpty() ); for ( PropertyEntry<Node> entry : data.assignedNodeProperties() ) { // System.out.println( "Assigned property:" + entry ); checkAssigned( expectedAssignedNodeProperties, entry ); } assertTrue( expectedAssignedNodeProperties.isEmpty() ); for ( PropertyEntry<Relationship> entry : data.assignedRelationshipProperties() ) { // System.out.println( "Assigned property:" + entry ); checkAssigned( expectedAssignedRelationshipProperties, entry ); } assertTrue( expectedAssignedRelationshipProperties.isEmpty() ); for ( PropertyEntry<Node> entry : data.removedNodeProperties() ) { // System.out.println( "Removed property:" + entry ); checkRemoved( expectedRemovedNodeProperties, entry ); } assertTrue( expectedRemovedNodeProperties.isEmpty() ); for ( PropertyEntry<Relationship> entry : data.removedRelationshipProperties() ) { // System.out.println( "Removed property:" + entry ); checkRemoved( expectedRemovedRelationshipProperties, entry ); } assertTrue( expectedRemovedRelationshipProperties.isEmpty() ); } <T extends PropertyContainer> void checkAssigned( Map<T, Map<String, PropertyEntryImpl<T>>> map, PropertyEntry<T> entry ) { fetchExpectedPropertyEntry( map, entry ).compareToAssigned( entry ); } <T extends PropertyContainer> void checkRemoved( Map<T, Map<String, PropertyEntryImpl<T>>> map, PropertyEntry<T> entry ) { fetchExpectedPropertyEntry( map, entry ).compareToRemoved( entry ); } <T extends PropertyContainer> PropertyEntryImpl<T> fetchExpectedPropertyEntry( Map<T, Map<String, PropertyEntryImpl<T>>> map, PropertyEntry<T> entry ) { Map<String, PropertyEntryImpl<T>> innerMap = map.get( entry.entity() ); assertNotNull( innerMap ); PropertyEntryImpl<T> expectedEntry = innerMap.remove( entry.key() ); assertNotNull( expectedEntry ); if ( innerMap.isEmpty() ) { map.remove( entry.entity() ); } return expectedEntry; } }