This is an automated email from the ASF dual-hosted git repository. vy pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/logging-log4j-tools.git
commit 5fafddf785abeebb2f10f5d5597f7500d3eef50b Author: Volkan Yazıcı <[email protected]> AuthorDate: Wed Mar 13 11:33:54 2024 +0100 Ignore deprecated factory methods in `log4j-docgen` --- .../logging/log4j/docgen/processor/Annotations.java | 12 ++++++++++++ .../log4j/docgen/processor/DescriptorGenerator.java | 4 +++- .../java-of-log4j2/MyAppender.java | 18 ++++++++++++++++++ .../java-of-log4j3/MyAppender.java | 19 +++++++++++++++++++ 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/processor/Annotations.java b/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/processor/Annotations.java index 13efceb..cae6559 100644 --- a/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/processor/Annotations.java +++ b/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/processor/Annotations.java @@ -69,6 +69,8 @@ final class Annotations { private final Name name; private final Name value; + private final DeclaredType deprecatedAnnotation; + private final TypeElement[] pluginAnnotationElements; // Contain the namespace of the plugin private final DeclaredType namespaceAnnotation; @@ -89,6 +91,9 @@ final class Annotations { this.name = elements.getName("name"); this.value = elements.getName("value"); + this.deprecatedAnnotation = + (DeclaredType) elements.getTypeElement("java.lang.Deprecated").asType(); + final Collection<TypeElement> pluginAnnotations = new ArrayList<>(); final TypeElement pluginV2Annotation = elements.getTypeElement(PLUGIN_V2_ANNOTATION_NAME); this.pluginV2Annotation = pluginV2Annotation != null ? (DeclaredType) pluginV2Annotation.asType() : null; @@ -130,6 +135,13 @@ final class Annotations { return getAnnotationValue(element, pluginV2Annotation, category, namespaceAnnotation, value); } + public boolean hasDeprecatedAnnotation(final Element element) { + return elements.getAllAnnotationMirrors(element).stream().anyMatch(annotationMirror -> { + final DeclaredType annotationType = annotationMirror.getAnnotationType(); + return types.isSameType(annotationType, deprecatedAnnotation); + }); + } + public boolean hasFactoryAnnotation(final Element element) { return hasAnyDirectAnnotation(element, factoryAnnotations); } diff --git a/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/processor/DescriptorGenerator.java b/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/processor/DescriptorGenerator.java index 49e6014..12ad734 100644 --- a/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/processor/DescriptorGenerator.java +++ b/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/processor/DescriptorGenerator.java @@ -355,7 +355,9 @@ public class DescriptorGenerator extends AbstractProcessor { registerSupertypes(element).forEach(pluginType::addSupertype); // Plugin factory for (final Element member : element.getEnclosedElements()) { - if (annotations.hasFactoryAnnotation(member) && member instanceof ExecutableElement) { + if (member instanceof ExecutableElement + && !annotations.hasDeprecatedAnnotation(member) + && annotations.hasFactoryAnnotation(member)) { final ExecutableElement executable = (ExecutableElement) member; final Map<String, String> descriptions = getParameterDescriptions(executable, imports, qualifiedClassName); diff --git a/log4j-docgen/src/test/resources/DescriptorGeneratorTest/java-of-log4j2/MyAppender.java b/log4j-docgen/src/test/resources/DescriptorGeneratorTest/java-of-log4j2/MyAppender.java index acc4ccc..493ff00 100644 --- a/log4j-docgen/src/test/resources/DescriptorGeneratorTest/java-of-log4j2/MyAppender.java +++ b/log4j-docgen/src/test/resources/DescriptorGeneratorTest/java-of-log4j2/MyAppender.java @@ -20,9 +20,11 @@ import java.util.List; import java.util.Set; import javax.lang.model.element.TypeElement; import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.config.plugins.PluginAttribute; import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute; import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory; import org.apache.logging.log4j.core.config.plugins.PluginElement; +import org.apache.logging.log4j.core.config.plugins.PluginFactory; import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required; /** @@ -180,6 +182,22 @@ public final class MyAppender extends AbstractAppender implements Appender { return new Builder(); } + /** + * This method is only here to test that this <em>deprecated</em> factory will be ignored. + * + * @param boolAttr A {@code boolean} attribute. + * @param byteAttr A {@code byte} attribute. + * @param charAttr A {@code char} attribute. + */ + @Deprecated + @PluginFactory + public static MyOldLayout newLayout( + final @PluginAttribute(value = "boolAttr", defaultBoolean = false) boolean boolAttr, + final @PluginAttribute(value = "byteAttr", defaultByte = 'L') byte byteAttr, + final @PluginAttribute(value = "charAttr", defaultChar = 'L') char charAttr) { + return null; + } + public static interface Appender2 {} public static interface Layout2 {} diff --git a/log4j-docgen/src/test/resources/DescriptorGeneratorTest/java-of-log4j3/MyAppender.java b/log4j-docgen/src/test/resources/DescriptorGeneratorTest/java-of-log4j3/MyAppender.java index 70c45d1..1318ed2 100644 --- a/log4j-docgen/src/test/resources/DescriptorGeneratorTest/java-of-log4j3/MyAppender.java +++ b/log4j-docgen/src/test/resources/DescriptorGeneratorTest/java-of-log4j3/MyAppender.java @@ -19,8 +19,11 @@ package example; import java.util.List; import java.util.Set; import javax.lang.model.element.TypeElement; + +import org.apache.logging.log4j.plugins.Factory; import org.apache.logging.log4j.plugins.Namespace; import org.apache.logging.log4j.plugins.Plugin; +import org.apache.logging.log4j.plugins.PluginAttribute; import org.apache.logging.log4j.plugins.PluginBuilderAttribute; import org.apache.logging.log4j.plugins.PluginElement; import org.apache.logging.log4j.plugins.PluginFactory; @@ -183,6 +186,22 @@ public final class MyAppender extends AbstractAppender implements Appender { return new Builder(); } + /** + * This method is only here to test that this <em>deprecated</em> factory will be ignored. + * + * @param boolAttr A {@code boolean} attribute. + * @param byteAttr A {@code byte} attribute. + * @param charAttr A {@code char} attribute. + */ + @Factory + @Deprecated + public static MyOldLayout newAppender( + final @PluginAttribute(defaultBoolean = false) boolean boolAttr, + final @PluginAttribute(defaultByte = 'L') byte byteAttr, + final @PluginAttribute(defaultChar = 'L') char charAttr) { + return null; + } + public static interface Appender2 {} public static interface Layout2 {}
