From 8ad030175334488992feaa671552f079a7c042a8 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Mon, 31 Aug 2020 15:05:47 +0200 Subject: [PATCH] DATAGRAPH-1030 - Avoid unconditional registration of entities in Neo4jMappingContext from all scanned classes. This adds an additional filter that checks the content of Neo4j-OGMs metadata whether a class info is annotated with `NodeEntity` or `RelationshipEntity` before materializing it as en entity in the mapping context, too. --- .../neo4j/mapping/Neo4jMappingContext.java | 14 +++++++- .../mapping/Neo4jMappingContextTests.java | 35 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 spring-data-neo4j/src/test/java/org/springframework/data/neo4j/mapping/Neo4jMappingContextTests.java 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 4d8b84652..b70f2af99 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 @@ -21,9 +21,13 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Optional; +import java.util.function.Predicate; import java.util.stream.Stream; +import org.neo4j.ogm.annotation.NodeEntity; +import org.neo4j.ogm.annotation.RelationshipEntity; import org.neo4j.ogm.annotation.typeconversion.Convert; +import org.neo4j.ogm.metadata.AnnotationsInfo; import org.neo4j.ogm.metadata.ClassInfo; import org.neo4j.ogm.metadata.FieldInfo; import org.neo4j.ogm.metadata.MetaData; @@ -72,7 +76,15 @@ public class Neo4jMappingContext extends AbstractMappingContext k.getUnderlyingClass() != null) + + Predicate underlyingClassIsPresent = classInfo -> classInfo.getUnderlyingClass() != null; + Predicate isAnnotatedEntity = classInfo -> { + final AnnotationsInfo annotationsInfo = classInfo.annotationsInfo(); + return annotationsInfo.get(NodeEntity.class) != null || annotationsInfo.get(RelationshipEntity.class) != null; + }; + + metaData.persistentEntities().stream() + .filter(underlyingClassIsPresent.and(isAnnotatedEntity)) .forEach(k -> addPersistentEntity(k.getUnderlyingClass())); installDefaultConverter(); diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/mapping/Neo4jMappingContextTests.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/mapping/Neo4jMappingContextTests.java new file mode 100644 index 000000000..ead442c80 --- /dev/null +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/mapping/Neo4jMappingContextTests.java @@ -0,0 +1,35 @@ +/* + * Copyright 2011-2020 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 + * + * https://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.mapping; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; +import org.neo4j.ogm.metadata.MetaData; + +/** + * @author Michael J. Simons + */ +public class Neo4jMappingContextTests { + + @Test + public void shouldOnlyAddAnnotatedEntities() { + + MetaData metaData = new MetaData(this.getClass().getPackage().getName()); + Neo4jMappingContext neo4jMappingContext = new Neo4jMappingContext(metaData); + assertThat(neo4jMappingContext.hasPersistentEntityFor(this.getClass())).isFalse(); + } +}