From 37dc4b62ec6f415483c9dfbe36651ce2e056d501 Mon Sep 17 00:00:00 2001 From: Fabrice Bellingard Date: Fri, 15 Jul 2011 15:48:09 +0200 Subject: [PATCH] SONAR-2591 API : translation mechanism of rule descriptions - Remove rule name & description + rule param description from Squid Java check classes, as they are now in the English Language Pack --- .../org/sonar/java/ast/check/BreakCheck.java | 29 ++++--------------- .../sonar/java/ast/check/ContinueCheck.java | 25 ++++------------ .../java/ast/check/UndocumentedApiCheck.java | 18 +++++++----- .../bytecode/check/ArchitectureCheck.java | 20 +++++-------- .../check/CallToDeprecatedMethodCheck.java | 4 +-- .../check/UnusedPrivateMethodCheck.java | 12 ++------ .../check/UnusedProtectedMethodCheck.java | 12 ++------ .../squid/check/ClassComplexityCheck.java | 12 ++------ .../org/sonar/java/squid/check/DITCheck.java | 10 ++----- .../java/squid/check/EmptyFileCheck.java | 3 +- .../squid/check/MethodComplexityCheck.java | 12 ++------ .../sonar/java/squid/check/NoSonarCheck.java | 5 +--- 12 files changed, 42 insertions(+), 120 deletions(-) diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/BreakCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/BreakCheck.java index 73f853bebe3..474dfe6526b 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/BreakCheck.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/BreakCheck.java @@ -20,36 +20,19 @@ package org.sonar.java.ast.check; -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; +import java.util.Arrays; +import java.util.List; + import org.sonar.check.Priority; import org.sonar.check.Rule; import org.sonar.java.ast.visitor.AstUtils; import org.sonar.squid.api.CheckMessage; import org.sonar.squid.api.SourceFile; -import java.util.Arrays; -import java.util.List; +import com.puppycrawl.tools.checkstyle.api.DetailAST; +import com.puppycrawl.tools.checkstyle.api.TokenTypes; -@Rule( - key = "AvoidBreakOutsideSwitch", - name = "Avoid using 'break' branching statement outside a 'switch' statement", - priority = Priority.MAJOR, - description = "

The use of the 'break' branching statement increases the essential complexity of the source code and " - + "so prevents any refactoring of this source code to replace all well structured control structures with a single statement.

" - + "

For instance, with the following java program fragment, it's not possible to apply " - + "the 'extract method' refactoring pattern :

" - + "
"
-        + "mylabel : for (int i = 0 ; i< 3; i++) {\n"
-        + "  for (int j = 0; j < 4 ; j++) {\n"
-        + "    doSomething();\n"
-        + "    if (checkSomething()) {\n"
-        + "      break mylabel;\n"
-        + "    }\n"
-        + "  }\n"
-        + "}\n"
-        + "
" - + "

The use of the 'break' branching statement is only authorized inside a 'switch' statement.

") +@Rule(key = "AvoidBreakOutsideSwitch", priority = Priority.MAJOR) public class BreakCheck extends JavaAstCheck { @Override diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/ContinueCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/ContinueCheck.java index 773eef025f6..162d208fc27 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/ContinueCheck.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/ContinueCheck.java @@ -20,32 +20,19 @@ package org.sonar.java.ast.check; -import com.puppycrawl.tools.checkstyle.api.DetailAST; -import com.puppycrawl.tools.checkstyle.api.TokenTypes; +import java.util.Arrays; +import java.util.List; + import org.sonar.check.Priority; import org.sonar.check.Rule; import org.sonar.squid.api.CheckMessage; import org.sonar.squid.api.SourceCode; import org.sonar.squid.api.SourceFile; -import java.util.Arrays; -import java.util.List; +import com.puppycrawl.tools.checkstyle.api.DetailAST; +import com.puppycrawl.tools.checkstyle.api.TokenTypes; -@Rule(key = "AvoidContinueStatement", name = "Avoid using 'continue' branching statement", - priority = Priority.MAJOR, description = "

The use of the 'continue' branching statement increase the essential complexity " - + "of the source code and so prevent any refactoring of this source code to replace all well structured control structures " - + "with a single statement.

For instance, in the following java program fragment, it's not possible to apply " - + "the 'extract method' refactoring pattern :

" - + "
"
-        + "mylabel : for(int i = 0 ; i< 3; i++) {\n"
-        + "  for (int j = 0; j < 4 ; j++) {\n"
-        + "    doSomething();\n"
-        + "    if (checkSomething()) {\n"
-        + "      continue mylabel;\n"
-        + "    }\n"
-        + "  }\n"
-        + "}\n"
-        + "
") +@Rule(key = "AvoidContinueStatement", priority = Priority.MAJOR) public class ContinueCheck extends JavaAstCheck { @Override diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/UndocumentedApiCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/UndocumentedApiCheck.java index c87626b8b19..d359d49316a 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/UndocumentedApiCheck.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/UndocumentedApiCheck.java @@ -20,7 +20,8 @@ package org.sonar.java.ast.check; -import com.puppycrawl.tools.checkstyle.api.DetailAST; +import java.util.List; + import org.apache.commons.lang.StringUtils; import org.sonar.api.utils.WildcardPattern; import org.sonar.check.Priority; @@ -28,17 +29,18 @@ import org.sonar.check.Rule; import org.sonar.check.RuleProperty; import org.sonar.java.PatternUtils; import org.sonar.java.ast.visitor.PublicApiVisitor; -import org.sonar.squid.api.*; +import org.sonar.squid.api.CheckMessage; +import org.sonar.squid.api.SourceClass; +import org.sonar.squid.api.SourceCode; +import org.sonar.squid.api.SourceFile; +import org.sonar.squid.api.SourceMethod; -import java.util.List; +import com.puppycrawl.tools.checkstyle.api.DetailAST; -@Rule(key = "UndocumentedApi", name = "Undocumented API", priority = Priority.MAJOR, - description = "

Check that each public class, interface, method and constructor has a Javadoc comment. " - + "The following public methods/constructors are not concerned by this rule :

" + "") +@Rule(key = "UndocumentedApi", priority = Priority.MAJOR) public class UndocumentedApiCheck extends JavaAstCheck { - @RuleProperty(description = "Optional. If this property is not defined, all classes should adhere to this constraint. Ex : **.api.**") + @RuleProperty private String forClasses = ""; private WildcardPattern[] patterns; diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/ArchitectureCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/ArchitectureCheck.java index b272f1ef58b..24d58e6dd9a 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/ArchitectureCheck.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/ArchitectureCheck.java @@ -19,7 +19,8 @@ */ package org.sonar.java.bytecode.check; -import com.google.common.collect.Maps; +import java.util.Map; + import org.apache.commons.lang.StringUtils; import org.sonar.api.utils.WildcardPattern; import org.sonar.check.Cardinality; @@ -34,22 +35,15 @@ import org.sonar.squid.api.CheckMessage; import org.sonar.squid.api.SourceFile; import org.sonar.squid.api.SourceMethod; -import java.util.Map; +import com.google.common.collect.Maps; -@Rule(key = "ArchitecturalConstraint", name = "Architectural constraint", cardinality = Cardinality.MULTIPLE, - priority = Priority.MAJOR, - description = "

A source code comply to an architectural model when it fully adheres to a set of architectural constraints. " + - "A constraint allows to deny references between classes by pattern.

" + - "

You can for instance use this rule to :

" + - "") +@Rule(key = "ArchitecturalConstraint", cardinality = Cardinality.MULTIPLE, priority = Priority.MAJOR) public class ArchitectureCheck extends BytecodeCheck { - @RuleProperty(description = "Optional. If this property is not defined, all classes should adhere to this constraint. Ex : **.web.**") + @RuleProperty private String fromClasses = ""; - @RuleProperty(description = "Mandatory. Ex : java.util.Vector, java.util.Hashtable, java.util.Enumeration") + @RuleProperty private String toClasses = ""; private WildcardPattern[] fromPatterns; @@ -98,7 +92,7 @@ public class ArchitectureCheck extends BytecodeCheck { public void visitEdge(AsmEdge edge) { if (asmClass != null && edge != null) { String internalNameTargetClass = edge.getTargetAsmClass().getInternalName(); - if (!internalNames.containsKey(internalNameTargetClass)) { + if ( !internalNames.containsKey(internalNameTargetClass)) { if (WildcardPattern.match(getToPatterns(), internalNameTargetClass)) { int sourceLineNumber = getSourceLineNumber(edge); logMessage(asmClass.getInternalName(), internalNameTargetClass, sourceLineNumber); diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/CallToDeprecatedMethodCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/CallToDeprecatedMethodCheck.java index 9dc17a1b4f9..4ed21642c5d 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/CallToDeprecatedMethodCheck.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/CallToDeprecatedMethodCheck.java @@ -27,9 +27,7 @@ import org.sonar.java.bytecode.asm.AsmMethod; import org.sonar.squid.api.CheckMessage; import org.sonar.squid.api.SourceFile; -@Rule(key = "CallToDeprecatedMethod", name = "Avoid use of deprecated method", priority = Priority.MINOR, - description = "

Once deprecated, a method should no longer be used as it means that " - + "the method might be removed sooner or later.

") +@Rule(key = "CallToDeprecatedMethod", priority = Priority.MINOR) public class CallToDeprecatedMethodCheck extends BytecodeCheck { private AsmClass asmClass; diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/UnusedPrivateMethodCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/UnusedPrivateMethodCheck.java index 6f4216d8b4d..5b2d9337a26 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/UnusedPrivateMethodCheck.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/UnusedPrivateMethodCheck.java @@ -27,15 +27,7 @@ import org.sonar.squid.api.CheckMessage; import org.sonar.squid.api.SourceFile; import org.sonar.squid.api.SourceMethod; -@Rule(key = "UnusedPrivateMethod", name = "Unused private method", - priority = Priority.MAJOR, description = "

Private methods that are never executed are dead code. " + - "Dead code means unnecessary, inoperative code that should be removed. " + - "This helps in maintenance by decreasing the maintained code size, " + - "making it easier to understand the program and preventing bugs from being introduced.

" + - "

In the following two cases, private methods are not considered as dead code by Sonar :

" + - "") +@Rule(key = "UnusedPrivateMethod", priority = Priority.MAJOR) public class UnusedPrivateMethodCheck extends BytecodeCheck { private AsmClass asmClass; @@ -47,7 +39,7 @@ public class UnusedPrivateMethodCheck extends BytecodeCheck { @Override public void visitMethod(AsmMethod asmMethod) { - if (!asmMethod.isUsed() && asmMethod.isPrivate() && !asmMethod.isDefaultConstructor() && !SerializableContract.methodMatch(asmMethod)) { + if ( !asmMethod.isUsed() && asmMethod.isPrivate() && !asmMethod.isDefaultConstructor() && !SerializableContract.methodMatch(asmMethod)) { CheckMessage message = new CheckMessage(this, "Private method '" + asmMethod.getName() + "(...)' is never used."); SourceMethod sourceMethod = getSourceMethod(asmMethod); if (sourceMethod != null) { diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/UnusedProtectedMethodCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/UnusedProtectedMethodCheck.java index ea933b15184..a167205ae3b 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/UnusedProtectedMethodCheck.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/UnusedProtectedMethodCheck.java @@ -27,15 +27,7 @@ import org.sonar.squid.api.CheckMessage; import org.sonar.squid.api.SourceFile; import org.sonar.squid.api.SourceMethod; -@Rule(key = "UnusedProtectedMethod", name = "Unused protected method", - priority = Priority.MAJOR, description = "

Protected methods that are never used by any classes " + - "in the same project are strongly suspected to be dead code. " - + "Dead code means unnecessary, inoperative code that should be removed. " - + "This helps in maintenance by decreasing the maintained code size, " - + "making it easier to understand the program and preventing bugs from being introduced.

" - + "

In the following case, unused protected methods are not considered as dead code by Sonar :

" - + "" - + "") +@Rule(key = "UnusedProtectedMethod", priority = Priority.MAJOR) public class UnusedProtectedMethodCheck extends BytecodeCheck { private AsmClass asmClass; @@ -47,7 +39,7 @@ public class UnusedProtectedMethodCheck extends BytecodeCheck { @Override public void visitMethod(AsmMethod asmMethod) { - if (!asmMethod.isUsed() && asmMethod.isProtected() && !asmClass.isAbstract() && !SerializableContract.methodMatch(asmMethod) + if ( !asmMethod.isUsed() && asmMethod.isProtected() && !asmClass.isAbstract() && !SerializableContract.methodMatch(asmMethod) && !asmMethod.isInherited()) { CheckMessage message = new CheckMessage(this, "Protected method '" + asmMethod.getName() + "(...)' is never used."); SourceMethod sourceMethod = getSourceMethod(asmMethod); diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/ClassComplexityCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/ClassComplexityCheck.java index 1f360273b95..94d2c6b261c 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/ClassComplexityCheck.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/ClassComplexityCheck.java @@ -28,20 +28,12 @@ import org.sonar.squid.api.SourceClass; import org.sonar.squid.api.SourceFile; import org.sonar.squid.measures.Metric; -@Rule(key = "ClassCyclomaticComplexity", name = "Avoid too complex class", - priority = Priority.MAJOR, description = "

The Cyclomatic Complexity is measured by the number of (&&, ||) operators " - + "and (if, while, do, for, ?:, catch, switch, case, return, throw) statements in the body of a class plus one for " - + "each constructor, method (but not getter/setter), static initializer, or instance initializer in the class. " - + "The last return stament in method, if exists, is not taken into account.

" - + "

Even when the Cyclomatic Complexity of a class is very high, this complexity might be well distributed among all methods. " - + "Nevertheless, most of the time, a very complex class is a class which breaks the " - + "Single Responsibility Principle " - + "and which should be re-factored to be split in several classes.

") +@Rule(key = "ClassCyclomaticComplexity", priority = Priority.MAJOR) public class ClassComplexityCheck extends SquidCheck { public static final int DEFAULT_MAX = 200; - @RuleProperty(description = "Maximum complexity allowed.", defaultValue = "" + DEFAULT_MAX) + @RuleProperty(defaultValue = "" + DEFAULT_MAX) private Integer max = DEFAULT_MAX; @Override diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/DITCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/DITCheck.java index 9599cd0453b..846c4289a01 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/DITCheck.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/DITCheck.java @@ -28,18 +28,12 @@ import org.sonar.squid.api.SourceClass; import org.sonar.squid.api.SourceFile; import org.sonar.squid.measures.Metric; -@Rule(key = "MaximumInheritanceDepth", name = "Avoid too deep inheritance tree", - priority = Priority.MAJOR, description = "

Inheritance is certainly one of the most valuable concept of object-oriented " - + "programming. It's a way to compartmentalize and reuse code by creating collections of attributes and behaviors called " - + "classes which can be based on previously created classes. But abusing of this concept by creating a deep inheritance tree " - + "can lead to very complex and unmaintainable source code.

" - + "

Most of the time a too deep inheritance tree is due to bad object oriented design which has led to systematically use " - + "'inheritance' when 'composition' would suit better.

") +@Rule(key = "MaximumInheritanceDepth", priority = Priority.MAJOR) public class DITCheck extends SquidCheck { public static final int DEFAULT_MAX = 5; - @RuleProperty(description = "Maximum depth of the inheritance tree.", defaultValue = "" + DEFAULT_MAX) + @RuleProperty(defaultValue = "" + DEFAULT_MAX) private Integer max = DEFAULT_MAX; @Override diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/EmptyFileCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/EmptyFileCheck.java index 9377f080c6a..1d46406943c 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/EmptyFileCheck.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/EmptyFileCheck.java @@ -26,8 +26,7 @@ import org.sonar.squid.api.CheckMessage; import org.sonar.squid.api.SourceFile; import org.sonar.squid.measures.Metric; -@Rule(key = "EmptyFile", name = "Empty file", priority = Priority.MAJOR, - description = "Detect empty files, which do not have any lines of code. Example:
\n//package org.foo;\n//\n//public class Bar {}\n
") +@Rule(key = "EmptyFile", priority = Priority.MAJOR) public final class EmptyFileCheck extends SquidCheck { @Override diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/MethodComplexityCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/MethodComplexityCheck.java index 0cbeb094367..69ada4e82ec 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/MethodComplexityCheck.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/MethodComplexityCheck.java @@ -28,20 +28,12 @@ import org.sonar.squid.api.SourceFile; import org.sonar.squid.api.SourceMethod; import org.sonar.squid.measures.Metric; -@Rule(key = "MethodCyclomaticComplexity", name = "Avoid too complex method", - priority = Priority.MAJOR, description = "

The Cyclomatic Complexity is measured by the number of (&&, ||) operators " - + "and (if, while, do, for, ?:, catch, switch, case, return, throw) statements in the body of a constructor, " - + "method, static initializer, or instance initializer. " - + "The minimun Cyclomatic Complexity of a method is 1 and the last return stament, if exists, is not taken into account. " - + "The more complex is a method, the more possible different paths through the source code exist. " - + "Generally 1-4 is considered good, 5-7 ok, 8-10 consider re-factoring, and 11+ re-factor now. " - + "Indeed above 10, it's pretty difficult to be able to think about all possible paths when maintaining the source code, " - + "so the risk of regression increases exponentially.

") +@Rule(key = "MethodCyclomaticComplexity", priority = Priority.MAJOR) public class MethodComplexityCheck extends SquidCheck { public static final int DEFAULT_MAX = 10; - @RuleProperty(description = "Maximum complexity allowed.", defaultValue = "" + DEFAULT_MAX) + @RuleProperty(defaultValue = "" + DEFAULT_MAX) private Integer max = DEFAULT_MAX; @Override diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/NoSonarCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/NoSonarCheck.java index 1b329314b61..a55423352ac 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/NoSonarCheck.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/squid/check/NoSonarCheck.java @@ -25,10 +25,7 @@ import org.sonar.check.Rule; import org.sonar.squid.api.CheckMessage; import org.sonar.squid.api.SourceFile; -@Rule(key = "NoSonar", name = "Avoid use of //NOSONAR marker", priority = Priority.INFO, - description = "

Any violation to quality rule can be deactivated with the //NOSONAR marker. This marker is pretty useful to exclude " - + "false-positive results but sometimes it can abusively be used to hide real quality flaws.

" - + "

This rule allows to track and/or forbid use of this marker

") +@Rule(key = "NoSonar", priority = Priority.INFO) public class NoSonarCheck extends SquidCheck { @Override -- 2.39.5