diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Person.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Person.java index 188fd0bf8..6c47fc65d 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Person.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Person.java @@ -25,9 +25,7 @@ import org.springframework.data.neo4j.support.index.IndexType; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.Size; -import java.util.Date; -import java.util.Map; -import java.util.Set; +import java.util.*; @NodeEntity @@ -93,6 +91,9 @@ public class Person { @Query(value = "start person=node({self}) match (person)<-[:persons]-(team)-[:persons]->(member) return member.name, member.age") private Iterable> otherTeamMemberData; + @Labels + private Collection labels; + public Person(Node n) { setPersistentState(n); } @@ -262,4 +263,18 @@ public class Person { public String getDefaultedName() { return defaultedName; } + + public Collection getLabels() { + return labels; + } + + public void addLabel(String label) { + HashSet newLabels = new HashSet<>(this.labels); + if (newLabels.add(label)) this.labels = newLabels; + } + + public void removeLabel(String label) { + HashSet newLabels = new HashSet<>(this.labels); + if (newLabels.remove(label)) this.labels = newLabels; + } } diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/NodeEntityTests.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/NodeEntityTests.java index b8b4752a8..3b2365277 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/NodeEntityTests.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/NodeEntityTests.java @@ -20,7 +20,9 @@ import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; +import org.neo4j.graphdb.Label; import org.neo4j.graphdb.Transaction; +import org.neo4j.helpers.collection.IteratorUtil; import org.springframework.dao.DataRetrievalFailureException; import org.springframework.data.neo4j.aspects.Attribute; import org.springframework.data.neo4j.aspects.Group; @@ -40,6 +42,8 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicLong; import static java.util.Arrays.asList; +import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.CoreMatchers.hasItems; import static org.junit.Assert.*; import static org.springframework.data.neo4j.aspects.Person.persistedPerson; @@ -99,6 +103,30 @@ public class NodeEntityTests extends EntityTestBase { assertArrayEquals(roleNames, g.getRoleNames()); } + @Test + @Transactional + public void testLabels() { + String[] labelNames = {"Person", "Developer", "Father","_Person"}; + Person p = new Person("Michael",39).persist(); + assertThat(p.getLabels(), hasItems(labelNames[0],labelNames[3])); + p.addLabel(labelNames[1]); + p.addLabel(labelNames[2]); + neo4jTemplate.save(p); + System.out.println("p.getLabels() = " + p.getLabels()); + assertEquals(4, IteratorUtil.count(getNodeState(p).getLabels())); + for (Label l : getNodeState(p).getLabels()) { + assertEquals("Wrong label "+l.name(),true, asList(labelNames).contains(l.name())); + } + assertThat(p.getLabels(), hasItems(labelNames)); + Person loaded = neo4jTemplate.findOne(p.getId(), Person.class); + assertThat(loaded.getLabels(), hasItems(labelNames)); + loaded.removeLabel(labelNames[2]); + assertThat(p.getLabels(), hasItems(labelNames[0], labelNames[1])); + assertThat(loaded.getLabels(), hasItems(labelNames[0], labelNames[1])); + loaded = neo4jTemplate.findOne(p.getId(), Person.class); + assertThat(loaded.getLabels(), hasItems(labelNames[0],labelNames[1])); + } + @Test @Transactional public void testConvertedArrayProperties() { diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/NodeDelegatingFieldAccessorFactory.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/NodeDelegatingFieldAccessorFactory.java index c21f10e21..aeb1fd928 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/NodeDelegatingFieldAccessorFactory.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/NodeDelegatingFieldAccessorFactory.java @@ -48,7 +48,7 @@ public class NodeDelegatingFieldAccessorFactory extends DelegatingFieldAccessorF return Arrays.asList( new IdFieldAccessorFactory(template), new TransientFieldAccessorFactory(), -//TODO Labels new LabelFieldAccessorFactory(template), + new LabelFieldAccessorFactory(template), new TraversalFieldAccessorFactory(template), new QueryFieldAccessorFactory(template), new PropertyFieldAccessorFactory(template),