From 9fedb69d42e3edd070daef58e37cbab0312aa6da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Sun, 26 Mar 2017 23:51:39 +0200 Subject: [PATCH] Simple Key enum selection --- .../pmd/lang/java/metrics/AtfdMetric.java | 27 +++++++ .../pmd/lang/java/metrics/ClassMetric.java | 14 ++++ .../pmd/lang/java/metrics/DataHolder.java | 12 +++ .../pmd/lang/java/metrics/MethodMetric.java | 14 ++++ .../pmd/lang/java/metrics/Metric.java | 12 +++ .../pmd/lang/java/metrics/Metrics.java | 78 +++++++++++++++++++ .../pmd/lang/java/metrics/WmcMetric.java | 20 +++++ .../pmd/lang/java/rule/metrics/AtfdRule.java | 25 ++++++ 8 files changed, 202 insertions(+) create mode 100644 pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/AtfdMetric.java create mode 100644 pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/ClassMetric.java create mode 100644 pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/DataHolder.java create mode 100644 pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/MethodMetric.java create mode 100644 pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/Metric.java create mode 100644 pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/Metrics.java create mode 100644 pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/WmcMetric.java create mode 100644 pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/metrics/AtfdRule.java diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/AtfdMetric.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/AtfdMetric.java new file mode 100644 index 0000000000..969e9b6f91 --- /dev/null +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/AtfdMetric.java @@ -0,0 +1,27 @@ +/** + * + */ +package net.sourceforge.pmd.lang.java.metrics; + +import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration; + +/** + * @author Clément Fournier (clement.fournier@insa-rennes.fr) + * + */ +public class AtfdMetric implements ClassMetric, MethodMetric { + + @Override + public double computeFor(ASTMethodDeclaration node, DataHolder holder) { + // TODO Auto-generated method stub + return 0; + } + + @Override + public double computeFor(ASTClassOrInterfaceDeclaration node, DataHolder holder) { + // TODO Auto-generated method stub + return 0; + } + +} diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/ClassMetric.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/ClassMetric.java new file mode 100644 index 0000000000..4eed5d949c --- /dev/null +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/ClassMetric.java @@ -0,0 +1,14 @@ +/** + * + */ +package net.sourceforge.pmd.lang.java.metrics; + +import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration; + +/** + * @author Clément Fournier (clement.fournier@insa-rennes.fr) + * + */ +public interface ClassMetric extends Metric { + public double computeFor(ASTClassOrInterfaceDeclaration node, DataHolder holder); +} diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/DataHolder.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/DataHolder.java new file mode 100644 index 0000000000..63d136ed4c --- /dev/null +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/DataHolder.java @@ -0,0 +1,12 @@ +/** + * + */ +package net.sourceforge.pmd.lang.java.metrics; + +/** + * @author Clément Fournier (clement.fournier@insa-rennes.fr) + * + */ +public class DataHolder { + +} diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/MethodMetric.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/MethodMetric.java new file mode 100644 index 0000000000..f4b65961ab --- /dev/null +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/MethodMetric.java @@ -0,0 +1,14 @@ +/** + * + */ +package net.sourceforge.pmd.lang.java.metrics; + +import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration; + +/** + * @author Clément Fournier (clement.fournier@insa-rennes.fr) + * + */ +public interface MethodMetric extends Metric { + public double computeFor(ASTMethodDeclaration node, DataHolder holder); +} diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/Metric.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/Metric.java new file mode 100644 index 0000000000..500d5e5fe5 --- /dev/null +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/Metric.java @@ -0,0 +1,12 @@ +/** + * + */ +package net.sourceforge.pmd.lang.java.metrics; + +/** + * @author Clément Fournier (clement.fournier@insa-rennes.fr) + * + */ +public interface Metric { + +} diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/Metrics.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/Metrics.java new file mode 100644 index 0000000000..d445afe9e0 --- /dev/null +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/Metrics.java @@ -0,0 +1,78 @@ +/** + * + */ +package net.sourceforge.pmd.lang.java.metrics; + +import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration; + +/** + * @author Clément Fournier (clement.fournier@insa-rennes.fr) + * + */ +public class Metrics { + + /* Holds sufficient statistics gathered by the visitor */ + private static DataHolder m_holder; + + /* References all available metrics */ + public static enum Key { + ATFD(new AtfdMetric()), + // ... + WMC(new WmcMetric()); + + /* The object used to calculate the metric */ + private final Metric calculator; + /* Semiprime number, its factors are the flags */ + private int flags = 1; + + Key(Metric m) { + calculator = m; + + if (m instanceof ClassMetric) { + flags *= 2; + } + if (m instanceof MethodMetric) { + flags *= 3; + } + } + + boolean isClassMetric() { + return flags % 2 == 0; + } + + boolean isMethodMetric() { + return flags % 3 == 0; + } + + Metric getCalculator() { + return calculator; + } + + } + + /** + * Computes a metric identified by its code on the class AST node being + * passed. + */ + public static double get(Key key, ASTClassOrInterfaceDeclaration node) { + if (!key.isClassMetric()) { + throw new UnsupportedOperationException("That metric cannot be computed on a class"); + } + + return ((ClassMetric) key.getCalculator()).computeFor(node, m_holder); + } + + /** + * Computes a metric identified by its code on the method AST node being + * passed. + */ + public static double get(Key key, ASTMethodDeclaration node) { + if (!key.isMethodMetric()) { + throw new UnsupportedOperationException("That metric cannot be computed on a method"); + } + + return ((MethodMetric) key.getCalculator()).computeFor(node, m_holder); + } + +} diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/WmcMetric.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/WmcMetric.java new file mode 100644 index 0000000000..4b31481fa4 --- /dev/null +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/WmcMetric.java @@ -0,0 +1,20 @@ +/** + * + */ +package net.sourceforge.pmd.lang.java.metrics; + +import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration; + +/** + * @author Clément Fournier (clement.fournier@insa-rennes.fr) + * + */ +public class WmcMetric implements ClassMetric { + + @Override + public double computeFor(ASTClassOrInterfaceDeclaration node, DataHolder holder) { + // TODO Auto-generated method stub + return 0; + } + +} diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/metrics/AtfdRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/metrics/AtfdRule.java new file mode 100644 index 0000000000..0a98397ccc --- /dev/null +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/metrics/AtfdRule.java @@ -0,0 +1,25 @@ +/** + * + */ +package net.sourceforge.pmd.lang.java.rule.metrics; + +import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration; +import net.sourceforge.pmd.lang.java.metrics.Metrics; +import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule; + +/** + * @author Clément Fournier (clement.fournier@insa-rennes.fr) + * + */ +public class AtfdRule extends AbstractJavaRule { + + @Override + public Object visit(ASTClassOrInterfaceDeclaration node, Object data) { + double atfd = Metrics.get(Metrics.Key.ATFD, node); + if (atfd > .3) { + addViolation(data, node); + } + return data; + } + +}