diff --git a/qulice-pmd/src/main/resources/com/qulice/pmd/ruleset.xml b/qulice-pmd/src/main/resources/com/qulice/pmd/ruleset.xml index d610e85f1..2cf0d2951 100644 --- a/qulice-pmd/src/main/resources/com/qulice/pmd/ruleset.xml +++ b/qulice-pmd/src/main/resources/com/qulice/pmd/ruleset.xml @@ -145,7 +145,7 @@ OF THE POSSIBILITY OF SUCH DAMAGE. - + Avoid accessing static fields directly. @@ -158,6 +158,25 @@ OF THE POSSIBILITY OF SUCH DAMAGE. + + + Avoid accessing static fields or methods via instance with 'this' keyword. + + 3 + + + + + + Public static methods are prohibited. diff --git a/qulice-pmd/src/test/java/com/qulice/pmd/PmdValidatorTest.java b/qulice-pmd/src/test/java/com/qulice/pmd/PmdValidatorTest.java index 957306342..71ac286af 100644 --- a/qulice-pmd/src/test/java/com/qulice/pmd/PmdValidatorTest.java +++ b/qulice-pmd/src/test/java/com/qulice/pmd/PmdValidatorTest.java @@ -57,6 +57,13 @@ public final class PmdValidatorTest { */ private static final String STATIC_ACCESS = "%s\\[\\d+-\\d+\\]: Static fields should be accessed in a static way \\[CLASS_NAME.FIELD_NAME\\]\\."; + /** + * Error message for forbidding access to static members + * via instance reference using 'this' keyword. + * @checkstyle LineLength (2 lines) + */ + private static final String STATIC_VIA_THIS = "%s\\[\\d+-\\d+\\]: Static members should be accessed in a static way \\[CLASS_NAME.FIELD_NAME\\], not via instance reference."; + /** * Error message for forbidding instructions inside a constructor * other than field initialization or call to other constructors. @@ -392,23 +399,30 @@ public void acceptsCallToStaticFieldsInStaticWay() final String file = "StaticAccessToStaticFields.java"; new PmdAssert( file, Matchers.is(true), - Matchers.not( - RegexMatchers.containsPattern( - String.format(PmdValidatorTest.STATIC_ACCESS, file) + Matchers.allOf( + Matchers.not( + RegexMatchers.containsPattern( + String.format(PmdValidatorTest.STATIC_ACCESS, file) + ) + ), + Matchers.not( + RegexMatchers.containsPattern( + String.format(PmdValidatorTest.STATIC_VIA_THIS, file) + ) ) ) ).validate(); } /** - * PmdValidator forbids calls to static fields + * PmdValidator forbids calls to static fields directly * in a non static way. * @throws Exception If something wrong happens inside. */ @Test - public void forbidsCallToStaticFieldsInNonStaticWay() + public void forbidsCallToStaticFieldsDirectly() throws Exception { - final String file = "NonStaticAccessToStaticFields.java"; + final String file = "DirectAccessToStaticFields.java"; new PmdAssert( file, Matchers.is(false), RegexMatchers.containsPattern( @@ -417,6 +431,40 @@ public void forbidsCallToStaticFieldsInNonStaticWay() ).validate(); } + /** + * PmdValidator forbids calls to static fields + * in a non static way via instance reference. + * @throws Exception If something wrong happens inside. + */ + @Test + public void forbidsCallToStaticFieldsViaThis() + throws Exception { + final String file = "AccessToStaticFieldsViaThis.java"; + new PmdAssert( + file, Matchers.is(false), + RegexMatchers.containsPattern( + String.format(PmdValidatorTest.STATIC_VIA_THIS, file) + ) + ).validate(); + } + + /** + * PmdValidator forbids calls to static methods + * in a non static way via instance reference. + * @throws Exception If something wrong happens inside. + */ + @Test + public void forbidsCallToStaticMethodsViaThis() + throws Exception { + final String file = "AccessToStaticMethodsViaThis.java"; + new PmdAssert( + file, Matchers.is(false), + RegexMatchers.containsPattern( + String.format(PmdValidatorTest.STATIC_VIA_THIS, file) + ) + ).validate(); + } + /** * PmdValidator forbids non public clone methods (PMD rule * rulesets/java/clone.xml/CloneMethodMustBePublic). diff --git a/qulice-pmd/src/test/resources/com/qulice/pmd/AccessToStaticFieldsViaThis.java b/qulice-pmd/src/test/resources/com/qulice/pmd/AccessToStaticFieldsViaThis.java new file mode 100644 index 000000000..d0445f2a1 --- /dev/null +++ b/qulice-pmd/src/test/resources/com/qulice/pmd/AccessToStaticFieldsViaThis.java @@ -0,0 +1,9 @@ +package foo; + +public final class AccessToStaticFieldsViaThis { + private static final int num = 1; + + public int number() { + return this.num; + } +} diff --git a/qulice-pmd/src/test/resources/com/qulice/pmd/AccessToStaticMethodsViaThis.java b/qulice-pmd/src/test/resources/com/qulice/pmd/AccessToStaticMethodsViaThis.java new file mode 100644 index 000000000..e025cb122 --- /dev/null +++ b/qulice-pmd/src/test/resources/com/qulice/pmd/AccessToStaticMethodsViaThis.java @@ -0,0 +1,11 @@ +package foo; + +public final class AccessToStaticMethodsViaThis { + private static int number() { + return 1; + } + + public int another() { + return 1 + this.number(); + } +} diff --git a/qulice-pmd/src/test/resources/com/qulice/pmd/NonStaticAccessToStaticFields.java b/qulice-pmd/src/test/resources/com/qulice/pmd/DirectAccessToStaticFields.java similarity index 75% rename from qulice-pmd/src/test/resources/com/qulice/pmd/NonStaticAccessToStaticFields.java rename to qulice-pmd/src/test/resources/com/qulice/pmd/DirectAccessToStaticFields.java index f3cc200d5..3cb0d77e2 100644 --- a/qulice-pmd/src/test/resources/com/qulice/pmd/NonStaticAccessToStaticFields.java +++ b/qulice-pmd/src/test/resources/com/qulice/pmd/DirectAccessToStaticFields.java @@ -1,6 +1,6 @@ package foo; -public final class NonStaticAccessToStaticFields { +public final class DirectAccessToStaticFields { private static int num = 1; public static int number() {