소스 검색

PMD rule: disable "ShortVar"

Ranides Atterwim 10 년 전
부모
커밋
0c9f4eb79e
1개의 변경된 파일352개의 추가작업 그리고 352개의 파일을 삭제
  1. 352 352
      assira.rules/src/main/resources/rulesets/java/assira.custom.xml

+ 352 - 352
assira.rules/src/main/resources/rulesets/java/assira.custom.xml

@@ -1,353 +1,353 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<ruleset name="net.ranides.assira.custom"
-    xmlns="http://pmd.sf.net/ruleset/1.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
-    xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
-
-    <description>
-    Assira Quality Policy - custom rules
-    </description>
-
-    <rule
-        name="TooManyDifferentMethods"
-        since="4.3"
-        class="net.sourceforge.pmd.lang.rule.XPathRule"
-        message="This class has too many different methods, consider refactoring it."
-        externalInfoUrl="http://pmd.sourceforge.net/rules/codesize.html#TooManyMethods"
-        language="java"
-        >
-        <description><![CDATA[Counts unique methods (all overloaded versions are considered as the same). Ignores UtilityClassess.]]></description>
-        <priority>3</priority>
-        <properties>
-            <property name="maxmethods" type="Integer" description="The method count reporting threshold " min="1" max="1000" value="15"/>
-            <property name="xpath"><value>
-            <![CDATA[
-            //ClassOrInterfaceDeclaration[
-            
-                count(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration[
-                    MethodDeclaration
-                    and not(Annotation/MarkerAnnotation/Name[@Image='Override'])
-                    and not(starts-with(MethodDeclaration/@MethodName,'get'))
-                    and not(starts-with(MethodDeclaration/@MethodName,'set'))
-                    and not(
-                        MethodDeclaration/@MethodName
-                        =
-                        preceding-sibling::ClassOrInterfaceBodyDeclaration/MethodDeclaration/@MethodName
-                        )
-                ]) > $maxmethods
-            
-                and not (
-                    @Final='true'
-                    and
-                    ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration[@Private='true'][@ParameterCount='0']
-                    and
-                    count(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration)=1
-                )
-            ]
-            ]]>
-            </value></property>
-        </properties>
-    </rule>
-    
-    
-    <rule
-        name="TooManyPublicMethods"
-        since="4.3"
-        class="net.sourceforge.pmd.lang.rule.XPathRule"
-        message="This class has too many public methods, consider refactoring it."
-        externalInfoUrl="http://pmd.sourceforge.net/rules/codesize.html#TooManyMethods"
-        language="java"
-        >
-        <description><![CDATA[Counts public methods]]></description>
-        <priority>3</priority>
-        <properties>
-            <property name="maxmethods" type="Integer" description="The method count reporting threshold " min="1" max="1000" value="40"/>
-            <property name="xpath"><value>
-            <![CDATA[
-            //ClassOrInterfaceDeclaration[
-                count(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/MethodDeclaration[
-                    @Public='true'
-                    and not(starts-with(@MethodName,'get'))
-                    and not(starts-with(@MethodName,'set'))
-                    and not(../Annotation/MarkerAnnotation/Name[@Image='Override'])
-                ]) > $maxmethods
-            ]
-            ]]>
-            </value></property>
-        </properties>
-    </rule>
-    
-
-    <rule
-        name="ShortVar" 
-        since="2.0" 
-        class="net.sourceforge.pmd.lang.rule.XPathRule"
-        message="Avoid variables with short names like {0}"
-        externalInfoUrl="http://java.ranides.net/docs/pmd.htm#ShortVariable"
-        language="java"
-        >
-        <description>
-            <![CDATA[Detects when a field, local, or parameter has a very short name.Ignores primitive types, local Iterators and for-variables.]]>
-        </description>
-        <priority>3</priority>
-        <properties><property name="xpath" pluginname="true"><value>
-            <![CDATA[
-            //VariableDeclaratorId [
-               string-length(@Image) < 3
-               and not(@Image='_')
-               and not(@Image='id')
-               and not(ancestor::ForInit)
-               and not(../Type/PrimitiveType)
-               and not(../../Type/PrimitiveType)
-               and not(
-                  (../../Type/ReferenceType/ClassOrInterfaceType[@Image='Iterator'])
-                  or
-                  (../../../FormalParameter)
-               )
-               and not(/TypeDeclaration/ClassOrInterfaceDeclaration[ends-with(@Image,'Test')])
-               and not((ancestor::FormalParameter) and (ancestor::TryStatement))
-               and not((@Image='em') and (../../Type/@TypeImage='EntityManager'))
-               and not((@Image='em') and (../Type/@TypeImage='EntityManager'))
-            ]
-            ]]>
-        </value></property></properties>
-    </rule>
-    
-    <rule
-        name="LongVar"
-      	since="0.3"
-        message="Avoid excessively long variable names like {0}"
-        class="net.sourceforge.pmd.lang.rule.XPathRule"
-        externalInfoUrl="http://pmd.sourceforge.net/rules/naming.html#LongVariable"
-        language="java"
-        >
-        <description>Detects when a field, formal or local variable is declared with a long name.</description>
-        <priority>3</priority>
-        <properties>
-            <property name="minimum" type="Integer" description="The variable length reporting threshold" min="1" max="1000" value="16"/>
-            <property name="xpath" pluginname="true"><value>
-            <![CDATA[
-                //VariableDeclaratorId[
-                    string-length(@Image) > $minimum
-                    and (@Static='false' or @Final='false')
-                ]
-            ]]>
-            </value></property>
-        </properties>
-    </rule>
-
-
-    <rule name="VarNameRules" since="2.0" class="net.sourceforge.pmd.lang.rule.XPathRule"
-        message="Field name doesn't respect required pattern"
-        externalInfoUrl="http://java.ranides.net/docs/pmd.htm#VariableNamingRegexp"
-        language="java"
-    >
-        <description>Checks all field names against regular expression</description>
-        <priority>3</priority>
-        <properties><property name="xpath" pluginname="true"><value>
-            <![CDATA[
-            //FieldDeclaration[
-                not(matches(@VariableName,'^(m_|\$)?([a-z][a-zA-Z0-9]*)$'))
-                and( (@Static='false') or (@Final='false') )
-            ]
-            ]]>
-        </value></property></properties>
-    </rule>
-
-    <rule name="MethodNameRules" since="2.0" class="net.sourceforge.pmd.lang.rule.XPathRule"
-        message="Method name doesn't respect required pattern"
-        externalInfoUrl="http://java.ranides.net/docs/pmd.htm#VariableNamingRegexp"
-        language="java"
-    >
-        <description>Checks all methods names against regular expression</description>
-        <priority>3</priority>
-        <properties><property name="xpath" pluginname="true"><value>
-            <![CDATA[
-            //MethodDeclaration/MethodDeclarator[
-                not(matches(@Image,'^(m_|\$)?([a-z][a-zA-Z0-9]*)$'))
-            ]
-            ]]>
-        </value></property></properties>
-    </rule>
-
-    <rule
-        name="InvalidUtilityClass"
-    	since="3.0"
-        message="Utility class does not provide any static methods, fields or interfaces"
-        class="net.sourceforge.pmd.lang.rule.XPathRule"
-        externalInfoUrl="http://java.ranides.net/docs/pmd.htm#InvalidUtilityClass"
-        language="java"
-        >
-        <description>A class that has private constructors and does not have any static methods, fields or type declarations cannot be used.</description>
-        <priority>3</priority>
-        <properties><property name="xpath"><value>
-            <![CDATA[
-            //ClassOrInterfaceDeclaration[@Nested='false'][
-                (
-                    count(./ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration)>0
-                    and 
-                    count(./ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration) = count(./ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration[@Private='true']) 
-                )
-                and count(.//MethodDeclaration[@Static='true'])=0
-                and count(.//FieldDeclaration[@Private='false'][@Static='true'])=0
-                and count(.//ClassOrInterfaceDeclaration[@Interface='true'])=0
-                and count(.//AnnotationTypeDeclaration)=0
-                and count(.//ClassOrInterfaceDeclaration[@Static='true' and @Private='false'])=0
-            ]
-            ]]>
-        </value></property></properties>
-    </rule>
-    
-    <rule
-        name="TooManyParams"
-    	since="3.0"
-        message="Avoid really long parameter lists."
-        class="net.sourceforge.pmd.lang.rule.XPathRule"
-        externalInfoUrl="http://java.ranides.net/docs/pmd.htm#TooManyParams"
-        language="java"
-        >
-        <description>Long parameter lists can indicate that a new object should be created to wrap the numerous parameters.  Basically, try to group the parameters together.</description>
-        <priority>3</priority>
-        <properties>
-            <property name="maximum" type="Integer" description="The parameter count reporting threshold" min="1" max="1000" value="6"/>
-            <property name="xpath"><value>
-            <![CDATA[
-            //ClassOrInterfaceBodyDeclaration
-                [ MethodDeclaration/MethodDeclarator/FormalParameters[@ParameterCount>$maximum] ]
-                [ not(Annotation/MarkerAnnotation/Name[@Image='Override']) ]
-            ]]>
-            </value></property>
-        </properties>
-    </rule>
-    
-    <rule
-        name="AvoidThreadGroup"
-        since="3.6"
-        message="Avoid using java.lang.ThreadGroup; it is not thread safe"
-        class="net.sourceforge.pmd.lang.rule.XPathRule"
-        externalInfoUrl="http://java.ranides.net/docs/pmd.htm#AvoidThreadGroup"
-        language="java"
-        typeResolution="true"
-        >
-        <description>Avoid using java.lang.ThreadGroup; although it is intended to be used in a threaded environment it contains methods that are not thread safe.</description>
-        <priority>3</priority>
-        <properties>
-            <property name="xpath"><value>
-            <![CDATA[
-            //AllocationExpression/ClassOrInterfaceType
-                [ typeof(@Image, 'java.lang.ThreadGroup') and contains(@Image, 'ThreadGroup') ]
-            |
-            //PrimarySuffix[contains(@Image, 'getThreadGroup')]
-            ]]>
-            </value></property>
-        </properties>
-    </rule>
-    
-    <rule
-        name="UseSingleton"
-    	since="3.0"
-        message="All methods are static.  Consider using Singleton instead.  Alternatively, you could add a private constructor or make the class abstract to silence this warning."
-        class="net.sourceforge.pmd.lang.rule.XPathRule"
-        externalInfoUrl="http://java.ranides.net/docs/pmd.htm#UseSingleton"
-        language="java"
-        >
-        <description><![CDATA[If you have a class that has nothing but static methods, consider making it a Singleton. If you want this class to be a Singleton, remember to add a private constructor to prevent instantiation.]]></description>
-        <priority>3</priority>
-        <properties>
-            <property name="xpath"><value>
-            <![CDATA[
-            //ClassOrInterfaceDeclaration[
-                @Interface='false' and @Abstract='false'
-                and not(ExtendsList)
-                and not(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/MethodDeclaration[
-                    @Private!='true' and @Static='false'
-                ]) 
-                and not(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration[
-                    @Private!='true' and @Static='false'
-                ])
-                and not(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/MethodDeclaration[
-                    @MethodName='main' and
-                    @Static='true' and
-                    @Public='true' and
-                    @Void='true' and
-                    MethodDeclarator/FormalParameters[@ParameterCount=1] and
-                    MethodDeclarator/FormalParameters/FormalParameter/Type[@Array='true' and @TypeImage='String']
-                ])
-                and (
-                    @Final='false' or
-                    count(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration)!=1
-                    or not(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration[
-                        @Private='true'
-                        and FormalParameters[@ParameterCount=0]
-                    ])
-                )
-            ]
-            ]]>
-            </value></property>
-        </properties>
-    </rule>
-    
-    
-    <rule
-        name="TooManyFields"
-        since="4.3"
-        message="Too many fields"
-        class="net.sourceforge.pmd.lang.rule.XPathRule"
-        externalInfoUrl="http://java.ranides.net/docs/pmd.htm#TooManyFields"
-        typeResolution="true"
-        language="java"
-        >
-        <description><![CDATA[Classes that have too many fields could be redesigned to have fewer fields, possibly through some nested object grouping of some of the information.  For example, a class with city/state/zip fields could instead have one Address field.]]></description>
-        <priority>3</priority>
-        <properties>
-            <property name="maxfields" type="Integer" description="The field count reporting threshold " min="1" max="1000" value="15"/>
-            <property name="xpath"><value>
-            <![CDATA[
-            //ClassOrInterfaceDeclaration[
-                count(
-                    ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration
-                    [@Final='false']
-                    [@Static='false']
-                ) > $maxfields
-            ]
-            ]]>
-            </value></property>
-        </properties>
-    </rule>
-    
-    <!--
-    <rule
-        name="LexicableConstructor"
-        since="4.3"
-        message="Lexicable class must be constructable from LexicalContext"
-        class="net.sourceforge.pmd.lang.rule.XPathRule"
-        externalInfoUrl="http://java.ranides.net/docs/pmd.htm#TooManyFields"
-        typeResolution="true"
-        >
-        <description><![CDATA[Classes that implement Lexicable interface must declare apriotiate ocnstructor with signature: Construct(LexicalContext context). It can be public but this is not obligatory.]]></description>
-        <priority>3</priority>
-        <properties>
-            <property name="xpath"><value>
-            <![CDATA[
-            //ClassOrInterfaceDeclaration[
-                ImplementsList/ClassOrInterfaceType[
-                    @Image='Lexicable' or @Image='net.ranides.assira.text.Lexicable'
-                ]
-                and
-                not(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration[
-                    FormalParameters[
-                        @ParameterCount='1' 
-                        and 
-                        FormalParameter/Type[@Array='false'][@TypeImage='LexicalContext' or @TypeImage='net.ranides.assira.text.LexicalContext']
-                    ]
-                ])
-            ]
-            ]]>
-            </value></property>
-        </properties>
-    </rule>
-    -->
-
+<?xml version="1.0" encoding="utf-8"?>
+
+<ruleset name="net.ranides.assira.custom"
+    xmlns="http://pmd.sf.net/ruleset/1.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
+    xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
+
+    <description>
+    Assira Quality Policy - custom rules
+    </description>
+
+    <rule
+        name="TooManyDifferentMethods"
+        since="4.3"
+        class="net.sourceforge.pmd.lang.rule.XPathRule"
+        message="This class has too many different methods, consider refactoring it."
+        externalInfoUrl="http://pmd.sourceforge.net/rules/codesize.html#TooManyMethods"
+        language="java"
+        >
+        <description><![CDATA[Counts unique methods (all overloaded versions are considered as the same). Ignores UtilityClassess.]]></description>
+        <priority>3</priority>
+        <properties>
+            <property name="maxmethods" type="Integer" description="The method count reporting threshold " min="1" max="1000" value="15"/>
+            <property name="xpath"><value>
+            <![CDATA[
+            //ClassOrInterfaceDeclaration[
+            
+                count(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration[
+                    MethodDeclaration
+                    and not(Annotation/MarkerAnnotation/Name[@Image='Override'])
+                    and not(starts-with(MethodDeclaration/@MethodName,'get'))
+                    and not(starts-with(MethodDeclaration/@MethodName,'set'))
+                    and not(
+                        MethodDeclaration/@MethodName
+                        =
+                        preceding-sibling::ClassOrInterfaceBodyDeclaration/MethodDeclaration/@MethodName
+                        )
+                ]) > $maxmethods
+            
+                and not (
+                    @Final='true'
+                    and
+                    ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration[@Private='true'][@ParameterCount='0']
+                    and
+                    count(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration)=1
+                )
+            ]
+            ]]>
+            </value></property>
+        </properties>
+    </rule>
+    
+    
+    <rule
+        name="TooManyPublicMethods"
+        since="4.3"
+        class="net.sourceforge.pmd.lang.rule.XPathRule"
+        message="This class has too many public methods, consider refactoring it."
+        externalInfoUrl="http://pmd.sourceforge.net/rules/codesize.html#TooManyMethods"
+        language="java"
+        >
+        <description><![CDATA[Counts public methods]]></description>
+        <priority>3</priority>
+        <properties>
+            <property name="maxmethods" type="Integer" description="The method count reporting threshold " min="1" max="1000" value="40"/>
+            <property name="xpath"><value>
+            <![CDATA[
+            //ClassOrInterfaceDeclaration[
+                count(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/MethodDeclaration[
+                    @Public='true'
+                    and not(starts-with(@MethodName,'get'))
+                    and not(starts-with(@MethodName,'set'))
+                    and not(../Annotation/MarkerAnnotation/Name[@Image='Override'])
+                ]) > $maxmethods
+            ]
+            ]]>
+            </value></property>
+        </properties>
+    </rule>
+    
+<!--
+    <rule
+        name="ShortVar" 
+        since="2.0" 
+        class="net.sourceforge.pmd.lang.rule.XPathRule"
+        message="Avoid variables with short names like {0}"
+        externalInfoUrl="http://java.ranides.net/docs/pmd.htm#ShortVariable"
+        language="java"
+        >
+        <description>
+            <![CDATA[Detects when a field, local, or parameter has a very short name.Ignores primitive types, local Iterators and for-variables.]]>
+        </description>
+        <priority>3</priority>
+        <properties><property name="xpath" pluginname="true"><value>
+            <![CDATA[
+            //VariableDeclaratorId [
+               string-length(@Image) < 3
+               and not(@Image='_')
+               and not(@Image='id')
+               and not(ancestor::ForInit)
+               and not(../Type/PrimitiveType)
+               and not(../../Type/PrimitiveType)
+               and not(
+                  (../../Type/ReferenceType/ClassOrInterfaceType[@Image='Iterator'])
+                  or
+                  (../../../FormalParameter)
+               )
+               and not(/TypeDeclaration/ClassOrInterfaceDeclaration[ends-with(@Image,'Test')])
+               and not((ancestor::FormalParameter) and (ancestor::TryStatement))
+               and not((@Image='em') and (../../Type/@TypeImage='EntityManager'))
+               and not((@Image='em') and (../Type/@TypeImage='EntityManager'))
+            ]
+            ]]>
+        </value></property></properties>
+    </rule>
+-->    
+    <rule
+        name="LongVar"
+      	since="0.3"
+        message="Avoid excessively long variable names like {0}"
+        class="net.sourceforge.pmd.lang.rule.XPathRule"
+        externalInfoUrl="http://pmd.sourceforge.net/rules/naming.html#LongVariable"
+        language="java"
+        >
+        <description>Detects when a field, formal or local variable is declared with a long name.</description>
+        <priority>3</priority>
+        <properties>
+            <property name="minimum" type="Integer" description="The variable length reporting threshold" min="1" max="1000" value="16"/>
+            <property name="xpath" pluginname="true"><value>
+            <![CDATA[
+                //VariableDeclaratorId[
+                    string-length(@Image) > $minimum
+                    and (@Static='false' or @Final='false')
+                ]
+            ]]>
+            </value></property>
+        </properties>
+    </rule>
+
+
+    <rule name="VarNameRules" since="2.0" class="net.sourceforge.pmd.lang.rule.XPathRule"
+        message="Field name doesn't respect required pattern"
+        externalInfoUrl="http://java.ranides.net/docs/pmd.htm#VariableNamingRegexp"
+        language="java"
+    >
+        <description>Checks all field names against regular expression</description>
+        <priority>3</priority>
+        <properties><property name="xpath" pluginname="true"><value>
+            <![CDATA[
+            //FieldDeclaration[
+                not(matches(@VariableName,'^(m_|\$)?([a-z][a-zA-Z0-9]*)$'))
+                and( (@Static='false') or (@Final='false') )
+            ]
+            ]]>
+        </value></property></properties>
+    </rule>
+
+    <rule name="MethodNameRules" since="2.0" class="net.sourceforge.pmd.lang.rule.XPathRule"
+        message="Method name doesn't respect required pattern"
+        externalInfoUrl="http://java.ranides.net/docs/pmd.htm#VariableNamingRegexp"
+        language="java"
+    >
+        <description>Checks all methods names against regular expression</description>
+        <priority>3</priority>
+        <properties><property name="xpath" pluginname="true"><value>
+            <![CDATA[
+            //MethodDeclaration/MethodDeclarator[
+                not(matches(@Image,'^(m_|\$)?([a-z][a-zA-Z0-9]*)$'))
+            ]
+            ]]>
+        </value></property></properties>
+    </rule>
+
+    <rule
+        name="InvalidUtilityClass"
+    	since="3.0"
+        message="Utility class does not provide any static methods, fields or interfaces"
+        class="net.sourceforge.pmd.lang.rule.XPathRule"
+        externalInfoUrl="http://java.ranides.net/docs/pmd.htm#InvalidUtilityClass"
+        language="java"
+        >
+        <description>A class that has private constructors and does not have any static methods, fields or type declarations cannot be used.</description>
+        <priority>3</priority>
+        <properties><property name="xpath"><value>
+            <![CDATA[
+            //ClassOrInterfaceDeclaration[@Nested='false'][
+                (
+                    count(./ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration)>0
+                    and 
+                    count(./ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration) = count(./ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration[@Private='true']) 
+                )
+                and count(.//MethodDeclaration[@Static='true'])=0
+                and count(.//FieldDeclaration[@Private='false'][@Static='true'])=0
+                and count(.//ClassOrInterfaceDeclaration[@Interface='true'])=0
+                and count(.//AnnotationTypeDeclaration)=0
+                and count(.//ClassOrInterfaceDeclaration[@Static='true' and @Private='false'])=0
+            ]
+            ]]>
+        </value></property></properties>
+    </rule>
+    
+    <rule
+        name="TooManyParams"
+    	since="3.0"
+        message="Avoid really long parameter lists."
+        class="net.sourceforge.pmd.lang.rule.XPathRule"
+        externalInfoUrl="http://java.ranides.net/docs/pmd.htm#TooManyParams"
+        language="java"
+        >
+        <description>Long parameter lists can indicate that a new object should be created to wrap the numerous parameters.  Basically, try to group the parameters together.</description>
+        <priority>3</priority>
+        <properties>
+            <property name="maximum" type="Integer" description="The parameter count reporting threshold" min="1" max="1000" value="6"/>
+            <property name="xpath"><value>
+            <![CDATA[
+            //ClassOrInterfaceBodyDeclaration
+                [ MethodDeclaration/MethodDeclarator/FormalParameters[@ParameterCount>$maximum] ]
+                [ not(Annotation/MarkerAnnotation/Name[@Image='Override']) ]
+            ]]>
+            </value></property>
+        </properties>
+    </rule>
+    
+    <rule
+        name="AvoidThreadGroup"
+        since="3.6"
+        message="Avoid using java.lang.ThreadGroup; it is not thread safe"
+        class="net.sourceforge.pmd.lang.rule.XPathRule"
+        externalInfoUrl="http://java.ranides.net/docs/pmd.htm#AvoidThreadGroup"
+        language="java"
+        typeResolution="true"
+        >
+        <description>Avoid using java.lang.ThreadGroup; although it is intended to be used in a threaded environment it contains methods that are not thread safe.</description>
+        <priority>3</priority>
+        <properties>
+            <property name="xpath"><value>
+            <![CDATA[
+            //AllocationExpression/ClassOrInterfaceType
+                [ typeof(@Image, 'java.lang.ThreadGroup') and contains(@Image, 'ThreadGroup') ]
+            |
+            //PrimarySuffix[contains(@Image, 'getThreadGroup')]
+            ]]>
+            </value></property>
+        </properties>
+    </rule>
+    
+    <rule
+        name="UseSingleton"
+    	since="3.0"
+        message="All methods are static.  Consider using Singleton instead.  Alternatively, you could add a private constructor or make the class abstract to silence this warning."
+        class="net.sourceforge.pmd.lang.rule.XPathRule"
+        externalInfoUrl="http://java.ranides.net/docs/pmd.htm#UseSingleton"
+        language="java"
+        >
+        <description><![CDATA[If you have a class that has nothing but static methods, consider making it a Singleton. If you want this class to be a Singleton, remember to add a private constructor to prevent instantiation.]]></description>
+        <priority>3</priority>
+        <properties>
+            <property name="xpath"><value>
+            <![CDATA[
+            //ClassOrInterfaceDeclaration[
+                @Interface='false' and @Abstract='false'
+                and not(ExtendsList)
+                and not(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/MethodDeclaration[
+                    @Private!='true' and @Static='false'
+                ]) 
+                and not(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration[
+                    @Private!='true' and @Static='false'
+                ])
+                and not(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/MethodDeclaration[
+                    @MethodName='main' and
+                    @Static='true' and
+                    @Public='true' and
+                    @Void='true' and
+                    MethodDeclarator/FormalParameters[@ParameterCount=1] and
+                    MethodDeclarator/FormalParameters/FormalParameter/Type[@Array='true' and @TypeImage='String']
+                ])
+                and (
+                    @Final='false' or
+                    count(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration)!=1
+                    or not(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration[
+                        @Private='true'
+                        and FormalParameters[@ParameterCount=0]
+                    ])
+                )
+            ]
+            ]]>
+            </value></property>
+        </properties>
+    </rule>
+    
+    
+    <rule
+        name="TooManyFields"
+        since="4.3"
+        message="Too many fields"
+        class="net.sourceforge.pmd.lang.rule.XPathRule"
+        externalInfoUrl="http://java.ranides.net/docs/pmd.htm#TooManyFields"
+        typeResolution="true"
+        language="java"
+        >
+        <description><![CDATA[Classes that have too many fields could be redesigned to have fewer fields, possibly through some nested object grouping of some of the information.  For example, a class with city/state/zip fields could instead have one Address field.]]></description>
+        <priority>3</priority>
+        <properties>
+            <property name="maxfields" type="Integer" description="The field count reporting threshold " min="1" max="1000" value="15"/>
+            <property name="xpath"><value>
+            <![CDATA[
+            //ClassOrInterfaceDeclaration[
+                count(
+                    ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration
+                    [@Final='false']
+                    [@Static='false']
+                ) > $maxfields
+            ]
+            ]]>
+            </value></property>
+        </properties>
+    </rule>
+    
+    <!--
+    <rule
+        name="LexicableConstructor"
+        since="4.3"
+        message="Lexicable class must be constructable from LexicalContext"
+        class="net.sourceforge.pmd.lang.rule.XPathRule"
+        externalInfoUrl="http://java.ranides.net/docs/pmd.htm#TooManyFields"
+        typeResolution="true"
+        >
+        <description><![CDATA[Classes that implement Lexicable interface must declare apriotiate ocnstructor with signature: Construct(LexicalContext context). It can be public but this is not obligatory.]]></description>
+        <priority>3</priority>
+        <properties>
+            <property name="xpath"><value>
+            <![CDATA[
+            //ClassOrInterfaceDeclaration[
+                ImplementsList/ClassOrInterfaceType[
+                    @Image='Lexicable' or @Image='net.ranides.assira.text.Lexicable'
+                ]
+                and
+                not(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration[
+                    FormalParameters[
+                        @ParameterCount='1' 
+                        and 
+                        FormalParameter/Type[@Array='false'][@TypeImage='LexicalContext' or @TypeImage='net.ranides.assira.text.LexicalContext']
+                    ]
+                ])
+            ]
+            ]]>
+            </value></property>
+        </properties>
+    </rule>
+    -->
+
 </ruleset>