From 8f86832322c86674d1395f555bc6895cd58ae795 Mon Sep 17 00:00:00 2001 From: dykov Date: Wed, 21 Aug 2024 15:38:25 +0300 Subject: [PATCH] Fix UseConstantAsMetricName rule - from XPath to Java --- .../arch4u/pmd/UseConstantAsMetricName.java | 42 +++++++++++++++++++ .../dgroup/arch4u/pmd/arch4u-ruleset.xml | 27 ++++-------- .../pmd/UseConstantAsMetricNameTest.java | 6 +-- .../pmd/xml/UseConstantAsMetricName.xml | 34 +++++++++++++++ 4 files changed, 86 insertions(+), 23 deletions(-) create mode 100644 src/main/java/io/github/dgroup/arch4u/pmd/UseConstantAsMetricName.java diff --git a/src/main/java/io/github/dgroup/arch4u/pmd/UseConstantAsMetricName.java b/src/main/java/io/github/dgroup/arch4u/pmd/UseConstantAsMetricName.java new file mode 100644 index 0000000..77256a4 --- /dev/null +++ b/src/main/java/io/github/dgroup/arch4u/pmd/UseConstantAsMetricName.java @@ -0,0 +1,42 @@ +package io.github.dgroup.arch4u.pmd; + +import net.sourceforge.pmd.lang.java.ast.ASTAnnotation; +import net.sourceforge.pmd.lang.java.ast.ASTMemberValuePair; +import net.sourceforge.pmd.lang.java.ast.ASTStringLiteral; +import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule; +import net.sourceforge.pmd.lang.java.types.TypeTestUtil; +import net.sourceforge.pmd.properties.PropertyDescriptor; +import net.sourceforge.pmd.properties.PropertyFactory; + +import java.util.List; + +public class UseConstantAsMetricName extends AbstractJavaRule { + + private static final PropertyDescriptor> METRIC_ANNOTATIONS_DESCRIPTOR = + PropertyFactory.stringListProperty("metricAnnotations") + .desc("List of the metric annotations.") + .defaultValues("io.micrometer.core.annotation.Timed") + .build(); + + private final List metricAnnotations; + + public UseConstantAsMetricName() { + definePropertyDescriptor(METRIC_ANNOTATIONS_DESCRIPTOR); + metricAnnotations = getProperty(METRIC_ANNOTATIONS_DESCRIPTOR); + } + + @Override + public Object visit(ASTAnnotation annotation, Object data) { + if (isMetricAnnotation(annotation)) { + annotation.getMembers() + .map(ASTMemberValuePair::getValue) + .filter(val -> val instanceof ASTStringLiteral) + .forEach(val -> asCtx(data).addViolation(val)); + } + return super.visit(annotation, data); + } + + private boolean isMetricAnnotation(ASTAnnotation node) { + return metricAnnotations.stream().anyMatch(annot -> TypeTestUtil.isExactlyA(annot, node)); + } +} diff --git a/src/main/resources/io/github/dgroup/arch4u/pmd/arch4u-ruleset.xml b/src/main/resources/io/github/dgroup/arch4u/pmd/arch4u-ruleset.xml index d609f66..40e08a1 100644 --- a/src/main/resources/io/github/dgroup/arch4u/pmd/arch4u-ruleset.xml +++ b/src/main/resources/io/github/dgroup/arch4u/pmd/arch4u-ruleset.xml @@ -158,7 +158,7 @@ 3 @@ -191,35 +191,22 @@ } ]]> - +