diff --git a/README.md b/README.md index 526f216..99c98c4 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ relations are only working with classed which are **annotated with @Entity**! ```java -@Relation(sourceClass = Person.class) +@Relation @Entity @Getter @Setter @@ -108,7 +108,7 @@ This is useful for: ```java @IgnoreRelation -@Relation(sourceClass = DisabledRelationEntity.class) +@Relation @Entity public class DisabledRelationEntity { @@ -124,7 +124,7 @@ Implement the relationIdentity, each dynamic relation need a Long id and a Strin ```java -@Relation(sourceClass = Person.class) +@Relation @Entity @Getter @Setter @@ -142,14 +142,15 @@ public class Person implements RelationIdentity { ``` -## Import Config Module for Component Scan +## Import Configuration Module for Component Scanning and Relation Support -Import the DrmConfig in your Spring Boot Application, so that you can use the RelationService +Enable the `DrmConfig` configuration in your Spring Boot application by using the custom `@EnableDynamicRelation` annotation. +This activates component scanning for the `at.drm.*` packages and makes the `RelationService` and related beans available for use. ```java +@EnableDynamicRelation @SpringBootApplication -@Import(DrmConfig.class) public class App { public static void main(String[] args) { diff --git a/dynamic-relations/src/main/java/at/drm/DrmConfig.java b/dynamic-relations/src/main/java/at/drm/DrmConfig.java index 8ac8cfe..8797f49 100644 --- a/dynamic-relations/src/main/java/at/drm/DrmConfig.java +++ b/dynamic-relations/src/main/java/at/drm/DrmConfig.java @@ -5,5 +5,5 @@ @Configuration @ComponentScan(basePackageClasses = DrmConfig.class) -public class DrmConfig { +class DrmConfig { } diff --git a/dynamic-relations/src/main/java/at/drm/EnableDynamicRelation.java b/dynamic-relations/src/main/java/at/drm/EnableDynamicRelation.java new file mode 100644 index 0000000..caffb07 --- /dev/null +++ b/dynamic-relations/src/main/java/at/drm/EnableDynamicRelation.java @@ -0,0 +1,14 @@ +package at.drm; + +import org.springframework.context.annotation.Import; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Import(DrmConfig.class) +public @interface EnableDynamicRelation { +} diff --git a/dynamic-relations/src/main/java/at/drm/annotation/Relation.java b/dynamic-relations/src/main/java/at/drm/annotation/Relation.java index d9047ff..0de3f67 100644 --- a/dynamic-relations/src/main/java/at/drm/annotation/Relation.java +++ b/dynamic-relations/src/main/java/at/drm/annotation/Relation.java @@ -8,5 +8,4 @@ @Target(ElementType.TYPE) @Retention(RetentionPolicy.CLASS) public @interface Relation { - Class sourceClass(); } diff --git a/dynamic-relations/src/main/java/at/drm/processor/RelationProcessor.java b/dynamic-relations/src/main/java/at/drm/processor/RelationProcessor.java index 8f21003..6dd39f3 100644 --- a/dynamic-relations/src/main/java/at/drm/processor/RelationProcessor.java +++ b/dynamic-relations/src/main/java/at/drm/processor/RelationProcessor.java @@ -97,7 +97,7 @@ private RelationMetaData createEntityMetaData(Element relationElement) { Relation relationAnnotation = relationElement.getAnnotation(Relation.class); String elementPackage = processingEnv.getElementUtils() .getPackageOf(relationElement).getQualifiedName().toString(); - TypeName sourceObjectName = getSourceObjectTypeName(relationAnnotation); + TypeName sourceObjectName = ClassName.get(relationElement.asType()); String sourceObjectWithoutPackages = sourceObjectName.toString().replace(elementPackage + ".", ""); String generatedEntityName = sourceObjectWithoutPackages + "Relation"; return new RelationMetaData(sourceObjectName, elementPackage, generatedEntityName, relationAnnotation); @@ -203,12 +203,6 @@ private static FieldSpec createTargetIdField() { .build(); } - private TypeName getSourceObjectTypeName(Relation annotation) { - TypeMirror typeMirror = getSourceClass(annotation); - assert typeMirror != null; - return ClassName.get(typeMirror); - } - private FieldSpec createSourceObjectField(TypeName typeName) { return FieldSpec.builder(typeName, "sourceObject", Modifier.PRIVATE) .addAnnotation(ManyToOne.class) @@ -255,16 +249,4 @@ private void createJavaClass(JavaFile javaFile) { e.getMessage()); } } - - - //TODO refactor with the more right way see: - // https://stackoverflow.com/questions/7687829/java-6-annotation-processing-getting-a-class-from-an-annotation - private TypeMirror getSourceClass(Relation annotation) { - try { - annotation.sourceClass(); // this should throw - } catch (MirroredTypeException mte) { - return mte.getTypeMirror(); - } - return null; // can this ever happen ?? - } } diff --git a/dynamic-relations/src/test/resources/TestFile.java b/dynamic-relations/src/test/resources/TestFile.java index 4080718..a17f459 100644 --- a/dynamic-relations/src/test/resources/TestFile.java +++ b/dynamic-relations/src/test/resources/TestFile.java @@ -6,7 +6,7 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -@Relation(sourceClass = TestFile.class) +@Relation @Entity public class TestFile { @Id diff --git a/dynamic-relations/src/test/resources/TestFileWithIgnoreRelation.java b/dynamic-relations/src/test/resources/TestFileWithIgnoreRelation.java index c7fd76f..539e5be 100644 --- a/dynamic-relations/src/test/resources/TestFileWithIgnoreRelation.java +++ b/dynamic-relations/src/test/resources/TestFileWithIgnoreRelation.java @@ -8,7 +8,7 @@ import jakarta.persistence.Id; @IgnoreRelation -@Relation(sourceClass = TestFileWithIgnoreRelation.class) +@Relation @Entity public class TestFileWithIgnoreRelation { @Id diff --git a/testing/src/main/java/at/test/drm/AnnotationTest.java b/testing/src/main/java/at/test/drm/AnnotationTest.java index cb8d1b4..664c129 100644 --- a/testing/src/main/java/at/test/drm/AnnotationTest.java +++ b/testing/src/main/java/at/test/drm/AnnotationTest.java @@ -9,7 +9,7 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -@Relation(sourceClass = AnnotationTest.class) +@Relation @Entity @Data public class AnnotationTest implements RelationIdentity { diff --git a/testing/src/main/java/at/test/drm/AnnotationTest2.java b/testing/src/main/java/at/test/drm/AnnotationTest2.java index 3dc8fcd..ef83800 100644 --- a/testing/src/main/java/at/test/drm/AnnotationTest2.java +++ b/testing/src/main/java/at/test/drm/AnnotationTest2.java @@ -9,7 +9,7 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -@Relation(sourceClass = AnnotationTest2.class) +@Relation @Entity @Data public class AnnotationTest2 implements RelationIdentity { diff --git a/testing/src/main/java/at/test/drm/AnnotationTest3.java b/testing/src/main/java/at/test/drm/AnnotationTest3.java index 9699104..2dcdee4 100644 --- a/testing/src/main/java/at/test/drm/AnnotationTest3.java +++ b/testing/src/main/java/at/test/drm/AnnotationTest3.java @@ -9,7 +9,7 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -@Relation(sourceClass = AnnotationTest3.class) +@Relation @Entity @Data public class AnnotationTest3 implements RelationIdentity { diff --git a/testing/src/test/java/at/test/drm/ApplicationIntegrationTest.java b/testing/src/test/java/at/test/drm/ApplicationIntegrationTest.java index 1596d68..932e25d 100644 --- a/testing/src/test/java/at/test/drm/ApplicationIntegrationTest.java +++ b/testing/src/test/java/at/test/drm/ApplicationIntegrationTest.java @@ -1,6 +1,6 @@ package at.test.drm; -import at.drm.DrmConfig; +import at.drm.EnableDynamicRelation; import at.drm.model.RelationLink; import at.drm.service.RelationService; import io.zonky.test.db.AutoConfigureEmbeddedDatabase; @@ -9,7 +9,6 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; import org.springframework.test.context.ActiveProfiles; import java.util.List; @@ -17,7 +16,7 @@ @SpringBootTest @ActiveProfiles("integration") -@Import(DrmConfig.class) +@EnableDynamicRelation @AutoConfigureEmbeddedDatabase(provider = DatabaseProvider.ZONKY) class ApplicationIntegrationTest {