diff --git a/scm-core-annotation-processor/src/main/java/sonia/scm/annotation/FactoryClassCreator.java b/scm-core-annotation-processor/src/main/java/sonia/scm/annotation/FactoryClassCreator.java index 209632a6a5..2627714d5b 100644 --- a/scm-core-annotation-processor/src/main/java/sonia/scm/annotation/FactoryClassCreator.java +++ b/scm-core-annotation-processor/src/main/java/sonia/scm/annotation/FactoryClassCreator.java @@ -16,6 +16,7 @@ package sonia.scm.annotation; +import com.squareup.javapoet.AnnotationSpec; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.JavaFile; import com.squareup.javapoet.MethodSpec; @@ -26,6 +27,7 @@ import jakarta.inject.Inject; import sonia.scm.ModelObject; import sonia.scm.store.QueryableStoreFactory; +import javax.annotation.processing.Generated; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; import javax.lang.model.element.Modifier; @@ -56,7 +58,9 @@ class FactoryClassCreator { TypeSpec .classBuilder(element.getSimpleName() + "StoreFactory") .addModifiers(Modifier.PUBLIC) - .addJavadoc("Generated queryable store factory for type {@link $T}.\nTo create conditions in queries, use the static fields in the class {@link $TQueryFields}.\n", typeNameOfDataClass, typeNameOfDataClass); + .addAnnotation(AnnotationSpec.builder(Generated.class).addMember("value", "$S", "sonia.scm.annotation.QueryableTypeAnnotationProcessor").build()) + .addJavadoc("Generated queryable store factory for type {@link $T}.\nTo create conditions in queries, use the static fields in the class {@link $TQueryFields}.\n", typeNameOfDataClass, typeNameOfDataClass) + .addOriginatingElement(dataClassTypeElement); createStoreFactoryField(builder); createConstructor(builder); diff --git a/scm-core-annotation-processor/src/main/java/sonia/scm/annotation/QueryFieldClassCreator.java b/scm-core-annotation-processor/src/main/java/sonia/scm/annotation/QueryFieldClassCreator.java index d342edba74..cf71fc4c9c 100644 --- a/scm-core-annotation-processor/src/main/java/sonia/scm/annotation/QueryFieldClassCreator.java +++ b/scm-core-annotation-processor/src/main/java/sonia/scm/annotation/QueryFieldClassCreator.java @@ -18,6 +18,7 @@ package sonia.scm.annotation; import com.google.auto.common.MoreElements; import com.google.auto.common.MoreTypes; +import com.squareup.javapoet.AnnotationSpec; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.FieldSpec; import com.squareup.javapoet.JavaFile; @@ -28,6 +29,7 @@ import com.squareup.javapoet.TypeSpec; import jakarta.xml.bind.annotation.adapters.XmlAdapter; import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import javax.annotation.processing.Generated; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; @@ -70,7 +72,9 @@ class QueryFieldClassCreator { TypeSpec .classBuilder(element.getSimpleName() + "QueryFields") .addModifiers(Modifier.PUBLIC, Modifier.FINAL) - .addJavadoc("Generated query fields for type {@link $T}.\nTo create a queryable store for this, use an injected instance of the {@link $TStoreFactory}.\n", TypeName.get(typeElement.asType()), TypeName.get(typeElement.asType())); + .addAnnotation(AnnotationSpec.builder(Generated.class).addMember("value", "$S", "sonia.scm.annotation.QueryableTypeAnnotationProcessor").build()) + .addJavadoc("Generated query fields for type {@link $T}.\nTo create a queryable store for this, use an injected instance of the {@link $TStoreFactory}.\n", TypeName.get(typeElement.asType()), TypeName.get(typeElement.asType())) + .addOriginatingElement(typeElement); createPrivateConstructor(builder); processParents(typeElement, builder); diff --git a/scm-core-annotation-processor/src/main/java/sonia/scm/annotation/QueryableTypeAnnotationProcessor.java b/scm-core-annotation-processor/src/main/java/sonia/scm/annotation/QueryableTypeAnnotationProcessor.java index 5d4827eb15..062e433ea6 100644 --- a/scm-core-annotation-processor/src/main/java/sonia/scm/annotation/QueryableTypeAnnotationProcessor.java +++ b/scm-core-annotation-processor/src/main/java/sonia/scm/annotation/QueryableTypeAnnotationProcessor.java @@ -18,6 +18,7 @@ package sonia.scm.annotation; import com.google.auto.common.MoreElements; import org.kohsuke.MetaInfServices; +import sonia.scm.store.QueryableType; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.Processor; @@ -29,6 +30,7 @@ import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic; import java.io.IOException; +import java.util.Collections; import java.util.Optional; import java.util.Set; @@ -42,6 +44,15 @@ public class QueryableTypeAnnotationProcessor extends AbstractProcessor { @Override public boolean process(Set annotations, RoundEnvironment roundEnvironment) { + if (roundEnvironment.processingOver()) { + return false; + } + // Only process elements that actually have the annotation + Set elements = roundEnvironment.getElementsAnnotatedWith(QueryableType.class); + if (elements.isEmpty()) { + return false; + } + for (TypeElement annotation : annotations) { log("Found annotation: " + annotation.getQualifiedName()); roundEnvironment.getElementsAnnotatedWith(annotation).forEach(element -> { @@ -53,6 +64,11 @@ public class QueryableTypeAnnotationProcessor extends AbstractProcessor { return true; } + @Override + public Set getSupportedOptions() { + return Collections.emptySet(); + } + @SuppressWarnings("UnstableApiUsage") private void tryToCreateQueryFieldClass(Element element) { TypeElement typeElement = MoreElements.asType(element); diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/AQueryFields.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/AQueryFields.java index a7a6b23446..942a148459 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/AQueryFields.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/AQueryFields.java @@ -16,8 +16,10 @@ package sonia.scm.testing; +import javax.annotation.processing.Generated; import sonia.scm.store.QueryableStore; +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public final class AQueryFields { public static final QueryableStore.IdQueryField INTERNAL_ID = new QueryableStore.IdQueryField<>(); diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/AStoreFactory.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/AStoreFactory.java index dde123472d..72b5813321 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/AStoreFactory.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/AStoreFactory.java @@ -17,10 +17,12 @@ package sonia.scm.testing; import jakarta.inject.Inject; +import javax.annotation.processing.Generated; import sonia.scm.store.QueryableMutableStore; import sonia.scm.store.QueryableStore; import sonia.scm.store.QueryableStoreFactory; +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public class AStoreFactory { private final QueryableStoreFactory storeFactory; diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/BQueryFields.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/BQueryFields.java index 416c4694c3..d9b2fd4bcd 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/BQueryFields.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/BQueryFields.java @@ -16,8 +16,10 @@ package sonia.scm.testing; +import javax.annotation.processing.Generated; import sonia.scm.store.QueryableStore; +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public final class BQueryFields { public static final QueryableStore.IdQueryField INTERNAL_ID = new QueryableStore.IdQueryField<>(); diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/BSubQueryFields.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/BSubQueryFields.java index bded15d0ce..ed70cf0316 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/BSubQueryFields.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/BSubQueryFields.java @@ -16,8 +16,10 @@ package sonia.scm.testing; +import javax.annotation.processing.Generated; import sonia.scm.store.QueryableStore; +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public final class BSubQueryFields { public static final QueryableStore.IdQueryField INTERNAL_ID = new QueryableStore.IdQueryField<>(); diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/CQueryFields.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/CQueryFields.java index 46fb9f587e..b1c725e007 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/CQueryFields.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/CQueryFields.java @@ -16,8 +16,10 @@ package sonia.scm.testing; +import javax.annotation.processing.Generated; import sonia.scm.store.QueryableStore; +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public final class CQueryFields { public static final QueryableStore.IdQueryField INTERNAL_ID = new QueryableStore.IdQueryField<>(); diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/DQueryFields.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/DQueryFields.java index 9e3c282894..0c4a7afd92 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/DQueryFields.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/DQueryFields.java @@ -16,8 +16,10 @@ package sonia.scm.testing; +import javax.annotation.processing.Generated; import sonia.scm.store.QueryableStore; +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public final class DQueryFields { public static final QueryableStore.IdQueryField INTERNAL_ID = new QueryableStore.IdQueryField<>(); diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/EQueryFields.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/EQueryFields.java index 7c47110145..08caec5b12 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/EQueryFields.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/EQueryFields.java @@ -16,9 +16,11 @@ package sonia.scm.testing; +import javax.annotation.processing.Generated; import sonia.scm.Stage; import sonia.scm.store.QueryableStore; +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public final class EQueryFields { public static final QueryableStore.IdQueryField INTERNAL_ID = new QueryableStore.IdQueryField<>(); diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/FQueryFields.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/FQueryFields.java index ebbc1396b7..2d5d9a5a74 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/FQueryFields.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/FQueryFields.java @@ -16,8 +16,10 @@ package sonia.scm.testing; +import javax.annotation.processing.Generated; import sonia.scm.store.QueryableStore; +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public final class FQueryFields { public static final QueryableStore.IdQueryField INTERNAL_ID = new QueryableStore.IdQueryField<>(); diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/GQueryFields.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/GQueryFields.java index 9d777a6164..1dc1ac8abc 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/GQueryFields.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/GQueryFields.java @@ -16,8 +16,10 @@ package sonia.scm.testing; +import javax.annotation.processing.Generated; import sonia.scm.store.QueryableStore; +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public final class GQueryFields { public static final QueryableStore.IdQueryField INTERNAL_ID = new QueryableStore.IdQueryField<>(); diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/HQueryFields.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/HQueryFields.java index 4390231937..134857a3f8 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/HQueryFields.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/HQueryFields.java @@ -16,8 +16,10 @@ package sonia.scm.testing; +import javax.annotation.processing.Generated; import sonia.scm.store.QueryableStore; +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public final class HQueryFields { public static final QueryableStore.IdQueryField INTERNAL_ID = new QueryableStore.IdQueryField<>(); diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/IQueryFields.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/IQueryFields.java index 8a287ccbc5..0ff46a5de3 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/IQueryFields.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/IQueryFields.java @@ -16,8 +16,10 @@ package sonia.scm.testing; +import javax.annotation.processing.Generated; import sonia.scm.store.QueryableStore; +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public final class IQueryFields { public static final QueryableStore.IdQueryField INTERNAL_ID = new QueryableStore.IdQueryField<>(); diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/KQueryFields.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/KQueryFields.java index c0b2675494..b58fde2d6a 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/KQueryFields.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/KQueryFields.java @@ -16,9 +16,11 @@ package sonia.scm.testing; +import javax.annotation.processing.Generated; import sonia.scm.repository.Repository; import sonia.scm.store.QueryableStore; +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public final class KQueryFields { public static final QueryableStore.IdQueryField REPOSITORY_ID = new QueryableStore.IdQueryField<>(Repository.class); diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/LQueryFields.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/LQueryFields.java index 32a5f41e63..b423ce427b 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/LQueryFields.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/LQueryFields.java @@ -16,8 +16,10 @@ package sonia.scm.testing; +import javax.annotation.processing.Generated; import sonia.scm.store.QueryableStore; +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public final class LQueryFields { public static final QueryableStore.IdQueryField INTERNAL_ID = new QueryableStore.IdQueryField<>(); diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/MQueryFields.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/MQueryFields.java index bc02997b56..981a96e073 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/MQueryFields.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/MQueryFields.java @@ -16,8 +16,10 @@ package sonia.scm.testing; +import javax.annotation.processing.Generated; import sonia.scm.store.QueryableStore; +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public final class MQueryFields { public static final QueryableStore.IdQueryField INTERNAL_ID = new QueryableStore.IdQueryField<>(); diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/NQueryFields.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/NQueryFields.java index 7600dcae84..f91642ffe2 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/NQueryFields.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/NQueryFields.java @@ -16,8 +16,10 @@ package sonia.scm.testing; +import javax.annotation.processing.Generated; import sonia.scm.store.QueryableStore; +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public final class NQueryFields { public static final QueryableStore.IdQueryField INTERNAL_ID = new QueryableStore.IdQueryField<>(); diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/OQueryFields.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/OQueryFields.java index 4f575b470b..54474d85e1 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/OQueryFields.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/OQueryFields.java @@ -16,8 +16,10 @@ package sonia.scm.testing; +import javax.annotation.processing.Generated; import sonia.scm.store.QueryableStore; +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public final class OQueryFields { public static final QueryableStore.IdQueryField INTERNAL_ID = new QueryableStore.IdQueryField<>(); diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/OneNonModelObjectParentStoreFactory.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/OneNonModelObjectParentStoreFactory.java index da6b4d7d41..4c728cd86a 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/OneNonModelObjectParentStoreFactory.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/OneNonModelObjectParentStoreFactory.java @@ -18,10 +18,12 @@ package sonia.scm.testing; import jakarta.inject.Inject; import java.lang.String; +import javax.annotation.processing.Generated; import sonia.scm.store.QueryableMutableStore; import sonia.scm.store.QueryableStore; import sonia.scm.store.QueryableStoreFactory; +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public class OneNonModelObjectParentStoreFactory { private final QueryableStoreFactory storeFactory; diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/OneParentStoreFactory.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/OneParentStoreFactory.java index 0fb795e641..dd12178995 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/OneParentStoreFactory.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/OneParentStoreFactory.java @@ -18,11 +18,13 @@ package sonia.scm.testing; import jakarta.inject.Inject; import java.lang.String; +import javax.annotation.processing.Generated; import sonia.scm.repository.Repository; import sonia.scm.store.QueryableMutableStore; import sonia.scm.store.QueryableStore; import sonia.scm.store.QueryableStoreFactory; +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public class OneParentStoreFactory { private final QueryableStoreFactory storeFactory; diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/ThreeParentsStoreFactory.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/ThreeParentsStoreFactory.java index d4a77cd787..74d81e497d 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/ThreeParentsStoreFactory.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/ThreeParentsStoreFactory.java @@ -18,7 +18,7 @@ package sonia.scm.testing; import jakarta.inject.Inject; import java.lang.String; - +import javax.annotation.processing.Generated; import sonia.scm.group.Group; import sonia.scm.repository.Repository; import sonia.scm.store.QueryableMutableStore; @@ -26,6 +26,7 @@ import sonia.scm.store.QueryableStore; import sonia.scm.store.QueryableStoreFactory; import sonia.scm.user.User; +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public class ThreeParentsStoreFactory { private final QueryableStoreFactory storeFactory; diff --git a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/TwoParentsStoreFactory.java b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/TwoParentsStoreFactory.java index 76c74a8c41..3dfd76dd9f 100644 --- a/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/TwoParentsStoreFactory.java +++ b/scm-core-annotation-processor/src/test/resources/sonia/scm/testing/TwoParentsStoreFactory.java @@ -18,12 +18,15 @@ package sonia.scm.testing; import jakarta.inject.Inject; import java.lang.String; +import javax.annotation.processing.Generated; import sonia.scm.repository.Repository; import sonia.scm.store.QueryableMutableStore; import sonia.scm.store.QueryableStore; import sonia.scm.store.QueryableStoreFactory; import sonia.scm.user.User; + +@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor") public class TwoParentsStoreFactory { private final QueryableStoreFactory storeFactory;