<?xml version="1.0"?>

<ruleset name="Basic Rules" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="../etc/ruleset_xml_schema.xml">
  <description>
The Basic Ruleset contains a collection of good practices which everyone should follow.
  </description>


    <rule name="EmptyCatchBlock"
          message="Avoid empty catch blocks"
          class="net.sourceforge.pmd.rules.XPathRule"
          externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#EmptyCatchBlock">
      <description>
Empty Catch Block finds instances where an exception is caught,
but nothing is done.  In most circumstances, this swallows an exception
which should either be acted on or reported.
      </description>
      <properties>
          <property name="xpath">
              <value>
    <![CDATA[
//CatchStatement
 [count(Block/BlockStatement) = 0 and ($allowCommentedBlocks != 'true' or Block/@containsComment = 'false')]
 [FormalParameter/Type/ReferenceType
   /ClassOrInterfaceType[@Image != 'InterruptedException' and @Image != 'CloneNotSupportedException']
 ]
 ]]>
             </value>
          </property>
          <property name="allowCommentedBlocks" description="Empty blocks containing comments will be skipped">
              <value>false</value>
          </property>
      </properties>
        <priority>3</priority>
      <example>
  <![CDATA[
public void doSomething() {
  try {
    FileInputStream fis = new FileInputStream("/tmp/bugger");
  } catch (IOException ioe) {
      // not good
  }
}
 ]]>
      </example>
    </rule>

    <rule name="EmptyIfStmt"
          message="Avoid empty 'if' statements"
          class="net.sourceforge.pmd.rules.XPathRule"
          externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#EmptyIfStmt">
      <description>
Empty If Statement finds instances where a condition is checked but nothing is done about it.
    </description>
        <priority>3</priority>
      <properties>
          <property name="xpath">
              <value>
<![CDATA[
//IfStatement/Statement
 [EmptyStatement or Block[count(*) = 0]]
 ]]>
              </value>
          </property>
      </properties>
      <example>
    <![CDATA[
public class Foo {
 void bar(int x) {
  if (x == 0) {
   // empty!
  }
 }
}
 ]]>
       </example>
    </rule>


    <rule name="EmptyWhileStmt"
          message="Avoid empty 'while' statements"
          class="net.sourceforge.pmd.rules.XPathRule"
          externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#EmptyWhileStmt">
       <description>
Empty While Statement finds all instances where a while statement
does nothing.  If it is a timing loop, then you should use Thread.sleep() for it; if
it's a while loop that does a lot in the exit expression, rewrite it to make it clearer.
       </description>
      <properties>
          <property name="xpath">
              <value>
<![CDATA[
//WhileStatement/Statement[./Block[count(*) = 0]  or ./EmptyStatement]
]]>
              </value>
          </property>
      </properties>
        <priority>3</priority>

       <example>
  <![CDATA[
public class Foo {
 void bar(int a, int b) {
  while (a == b) {
   // empty!
  }
 }
}
 ]]>
       </example>
    </rule>


    <rule name="EmptyTryBlock"
          message="Avoid empty try blocks"
          class="net.sourceforge.pmd.rules.XPathRule"
          externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#EmptyTryBlock">
      <description>
Avoid empty try blocks - what's the point?
      </description>
      <properties>
          <property name="xpath">
              <value>
<![CDATA[
//TryStatement/Block[1][count(*) = 0]
]]>
              </value>
          </property>
      </properties>
        <priority>3</priority>

      <example>
  <![CDATA[
public class Foo {
 public void bar() {
  try {
  } catch (Exception e) {
    e.printStackTrace();
  }
 }
}
]]>
      </example>
    </rule>

    <rule name="EmptyFinallyBlock"
          message="Avoid empty finally blocks"
          class="net.sourceforge.pmd.rules.XPathRule"
          externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#EmptyFinallyBlock">
      <description>
Avoid empty finally blocks - these can be deleted.
      </description>
      <properties>
          <property name="xpath">
              <value>
<![CDATA[
//FinallyStatement[count(Block/BlockStatement) = 0]
 ]]>
              </value>
          </property>
      </properties>
        <priority>3</priority>

      <example>
  <![CDATA[
public class Foo {
 public void bar() {
  try {
    int x=2;
   } finally {
    // empty!
   }
 }
}
 ]]>
      </example>
    </rule>


    <rule name="EmptySwitchStatements"
          message="Avoid empty switch statements"
          class="net.sourceforge.pmd.rules.XPathRule"
          externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#EmptySwitchStatements">
      <description>
Avoid empty switch statements.
      </description>
      <properties>
          <property name="xpath">
              <value>
<![CDATA[
//SwitchStatement[count(*) = 1]
 ]]>
              </value>
          </property>
      </properties>
        <priority>3</priority>

      <example>
  <![CDATA[
public class Foo {
 public void bar() {
  int x = 2;
  switch (x) {
   // once there was code here
   // but it's been commented out or something
  }
 }
}]]>
      </example>
      </rule>


    <rule name="JumbledIncrementer"
         message="Avoid modifying an outer loop incrementer in an inner loop for update expression"
         class="net.sourceforge.pmd.rules.XPathRule"
         externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#JumbledIncrementer">
     <description>
Avoid jumbled loop incrementers - it's usually a mistake, and it's confusing even if it's what's intended.
     </description>
     <properties>
         <property name="xpath">
             <value>
 <![CDATA[
 //ForStatement
 [
  ForUpdate/StatementExpressionList/StatementExpression/PostfixExpression/PrimaryExpression/PrimaryPrefix/Name/@Image
  =
  ancestor::ForStatement/ForInit//VariableDeclaratorId/@Image
 ]
 ]]>
             </value>
         </property>
     </properties>
        <priority>3</priority>
     <example>
 <![CDATA[
public class JumbledIncrementerRule1 {
  public void foo() {
   for (int i = 0; i < 10; i++) {
    for (int k = 0; k < 20; i++) {
     System.out.println("Hello");
    }
   }
  }
 }
 ]]>
     </example>
     </rule>

    <rule name="ForLoopShouldBeWhileLoop"
          message="This for loop could be simplified to a while loop"
          class="net.sourceforge.pmd.rules.XPathRule"
          externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#ForLoopShouldBeWhileLoop">
      <description>
Some for loops can be simplified to while loops - this makes them more concise.
      </description>
    <properties>
        <property name="xpath">
            <value>
                <![CDATA[
//ForStatement
 [count(*) > 1]
 [not(ForInit)]
 [not(ForUpdate)]
 [not(Type and Expression and Statement)]
 ]]>
            </value>
        </property>
    </properties>
        <priority>3</priority>
      <example>
  <![CDATA[
public class Foo {
 void bar() {
  for (;true;) true; // No Init or Update part, may as well be: while (true)
 }
}
 ]]>
      </example>
    </rule>


    <rule name="UnnecessaryConversionTemporary"
          message="Avoid unnecessary temporaries when converting primitives to Strings"
          class="net.sourceforge.pmd.rules.UnnecessaryConversionTemporary"
          externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#UnnecessaryConversionTemporary">
      <description>
Avoid unnecessary temporaries when converting primitives to Strings
      </description>
        <priority>3</priority>
      <example>
  <![CDATA[
public String convert(int x) {
  // this wastes an object
  String foo = new Integer(x).toString();
  // this is better
  return Integer.toString(x);
}
 ]]>
      </example>
    </rule>

    <rule name="OverrideBothEqualsAndHashcode"
          message="Ensure you override both equals() and hashCode()"
          class="net.sourceforge.pmd.rules.XPathRule"
          externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#OverrideBothEqualsAndHashcode">
      <description>
Override both public boolean Object.equals(Object other), and public int Object.hashCode(), or override neither.  Even if you are inheriting a hashCode() from a parent class, consider implementing hashCode and explicitly delegating to your superclass.
      </description>
      <properties>
          <property name="xpath">
              <value>
<![CDATA[
//ClassOrInterfaceDeclaration
 [@Interface='false']
 [not (ImplementsList/ClassOrInterfaceType[@Image='Comparable'])]
//MethodDeclarator
[(@Image = 'equals' and count(FormalParameters/*) = 1
and not(//MethodDeclarator[count(FormalParameters/*) = 0][@Image = 'hashCode']))
or
(@Image='hashCode' and count(FormalParameters/*) = 0
and
not
(//MethodDeclarator
 [count(
   FormalParameters//Type/ReferenceType/ClassOrInterfaceType
    [@Image = 'Object' or @Image = 'java.lang.Object']) = 1]
    [@Image = 'equals']))]
 ]]>
              </value>
          </property>
      </properties>
        <priority>3</priority>

      <example>
  <![CDATA[
// this is bad
public class Bar {
  public boolean equals(Object o) {
      // do some comparison
  }
}

// and so is this
public class Baz {
  public int hashCode() {
      // return some hash value
  }
}

// this is OK
public class Foo {
  public boolean equals(Object other) {
      // do some comparison
  }
  public int hashCode() {
      // return some hash value
  }
}
 ]]>
      </example>
    </rule>

    <rule name="DoubleCheckedLocking"
          message="Double checked locking is not thread safe in Java."
          class="net.sourceforge.pmd.rules.DoubleCheckedLocking"
          externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#DoubleCheckedLocking">
      <description>
Partially created objects can be returned by the Double Checked Locking pattern when used in Java.
An optimizing JRE may assign a reference to the baz variable before it creates the object the
  reference is intended to point to.  For more details see http://www.javaworld.com/javaworld/jw-02-2001/jw-0209-double.html.
      </description>
        <priority>1</priority>
      <example>
  <![CDATA[
public class Foo {
  Object baz;
  Object bar() {
    if(baz == null) { //baz may be non-null yet not fully created
      synchronized(this){
        if(baz == null){
          baz = new Object();
        }
      }
    }
    return baz;
  }
}
 ]]>
      </example>
    </rule>

    <rule name="ReturnFromFinallyBlock"
          message="Avoid returning from a finally block"
          class="net.sourceforge.pmd.rules.XPathRule"
          externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#ReturnFromFinallyBlock">
      <description>
Avoid returning from a finally block - this can discard exceptions.
      </description>
      <properties>
          <property name="xpath">
              <value>
<![CDATA[
//FinallyStatement//ReturnStatement
]]>
              </value>
          </property>
      </properties>
        <priority>3</priority>

      <example>
  <![CDATA[
public class Bar {
 public String foo() {
  try {
   throw new Exception( "My Exception" );
  } catch (Exception e) {
   throw e;
  } finally {
   return "A. O. K."; // Very bad.
  }
 }
}
]]>
      </example>
    </rule>

    <rule name="EmptySynchronizedBlock"
          message="Avoid empty synchronized blocks"
          class="net.sourceforge.pmd.rules.XPathRule"
          externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#EmptySynchronizedBlock">
      <description>
  Avoid empty synchronized blocks - they're useless.
      </description>
      <properties>
          <property name="xpath">
              <value>
<![CDATA[
//SynchronizedStatement/Block[1][count(*) = 0]
]]>
              </value>
          </property>
      </properties>
        <priority>3</priority>

      <example>
<![CDATA[
public class Foo {
 public void bar() {
  synchronized (this) {
   // empty!
  }
 }
}
]]>
      </example>
    </rule>

    <rule name="UnnecessaryReturn"
          message="Avoid unnecessary return statements"
          class="net.sourceforge.pmd.rules.XPathRule"
          externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#UnnecessaryReturn">
      <description>
Avoid unnecessary return statements
      </description>
      <properties>
          <property name="xpath">
              <value>
 <![CDATA[
//ReturnStatement
 [parent::Statement
  [parent::BlockStatement
   [parent::Block
    [parent::MethodDeclaration/ResultType[@Void='true']
    ]
   ]
  ]
 ]
]]>
              </value>
          </property>
      </properties>
        <priority>3</priority>
      <example>
  <![CDATA[
public class Foo {
 public void bar() {
  int x = 42;
  return;
 }
}
 ]]>
      </example>
    </rule>


    <rule name="EmptyStaticInitializer"
           message="Empty static initializer was found"
           class="net.sourceforge.pmd.rules.XPathRule"
           externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#EmptyStaticInitializer">
       <description>
An empty static initializer was found.
       </description>
         <properties>
             <property name="xpath">
                 <value>
<![CDATA[
//ClassOrInterfaceBodyDeclaration/Initializer[@Static='true']/Block[count(*)=0]
]]>
                 </value>
             </property>
         </properties>
         <priority>3</priority>
       <example>
   <![CDATA[
public class Foo {
 static {
  // empty
 }
 }
]]>
       </example>
     </rule>

    <rule name="UnconditionalIfStatement"
       message="Do not use 'if' statements that are always true or always false"
          class="net.sourceforge.pmd.rules.XPathRule"
          externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#UnconditionalIfStatement">
      <description>
Do not use "if" statements that are always true or always false.
      </description>
        <properties>
            <property name="xpath">
                <value>
 <![CDATA[
//IfStatement/Expression
 [count(PrimaryExpression)=1]
 /PrimaryExpression/PrimaryPrefix/Literal/BooleanLiteral
]]>
                </value>
            </property>
        </properties>
        <priority>3</priority>
      <example>
  <![CDATA[
public class Foo {
 public void close() {
  if (true) {
       // ...
   }
 }
}
]]>
      </example>
    </rule>

    <rule name="EmptyStatementNotInLoop"
          message="An empty statement (semicolon) not part of a loop"
          class="net.sourceforge.pmd.rules.XPathRule"
          externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#EmptyStatementNotInLoop">
       <description>
An empty statement (aka a semicolon by itself) that is not used
as the sole body of a for loop or while loop is probably a bug.  It
could also be a double semicolon, which is useless and should be
removed.
       </description>
        <properties>
            <property name="xpath">
                <value>
<![CDATA[
//Statement/EmptyStatement
 [not(
       ../../../ForStatement
       or ../../../WhileStatement
       or ../../../BlockStatement/ClassOrInterfaceDeclaration
       or ../../../../../../ForStatement/Statement[1]
        /Block[1]/BlockStatement[1]/Statement/EmptyStatement
       or ../../../../../../WhileStatement/Statement[1]
        /Block[1]/BlockStatement[1]/Statement/EmptyStatement)
 ]
]]>
                </value>
            </property>
        </properties>
        <priority>3</priority>
       <example>
<![CDATA[
public class MyClass {
   public void doit() {
      // this is probably not what you meant to do
      ;
      // the extra semicolon here this is not necessary
      System.out.println("look at the extra semicolon");;
   }
}
]]>
       </example>
     </rule>

    <rule name="BooleanInstantiation"
       message="Avoid instantiating Boolean objects; you can usually invoke Boolean.TRUE instead."
       class="net.sourceforge.pmd.rules.XPathRule"
       externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#BooleanInstantiation">
   <description>
Avoid instantiating Boolean objects, instead use the constants Boolean.TRUE or Boolean.FALSE.
   </description>
      <properties>
          <property name="xpath">
              <value>
<![CDATA[
//PrimaryExpression[
PrimaryPrefix/AllocationExpression[not (ArrayDimsAndInits) and (ClassOrInterfaceType/@Image='Boolean' or ClassOrInterfaceType/@Image='java.lang.Boolean')]
or
(
PrimaryPrefix/Name[@Image='Boolean.valueOf']
and
PrimarySuffix/Arguments//BooleanLiteral
)
]
]]>
              </value>
          </property>
      </properties>
      <priority>2</priority>
   <example>
   <![CDATA[
public class Foo {
 Boolean bar = new Boolean("true"); // just do a Boolean bar = Boolean.TRUE;
 Boolean buz = Boolean.valueOf(false); // just do a Boolean buz = Boolean.FALSE;
}
   ]]>
   </example>
   </rule>

    <rule name="UnnecessaryFinalModifier"
          message="Unnecessary final modifier in final class"
          class="net.sourceforge.pmd.rules.XPathRule"
          externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#UnnecessaryFinalModifier">
      <description>
When a class has the final modifier, all the methods are automatically final.
      </description>
      <properties>
          <property name="xpath">
              <value>
    <![CDATA[
//ClassOrInterfaceDeclaration[@Final='true' and @Interface='false']
/ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/MethodDeclaration[@Final='true']
    ]]>
              </value>
          </property>
      </properties>
        <priority>3</priority>

      <example>
<![CDATA[
public final class Foo {
    // This final modifier is not necessary, since the class is final
    // and thus, all methods are final
    private final void foo() {
    }
}

]]>
      </example>
    </rule>

    <rule name="CollapsibleIfStatements"
          message="These nested if statements could be combined"
          class="net.sourceforge.pmd.rules.XPathRule"
          externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#CollapsibleIfStatements">
      <description>
Sometimes two 'if' statements can be consolidated by separating their conditions with a boolean short-circuit operator.
      </description>
    <properties>
        <property name="xpath">
            <value>
                <![CDATA[
//IfStatement[@Else='false']/Statement
 /IfStatement[@Else='false']
 |
//IfStatement[@Else='false']/Statement
 /Block[count(BlockStatement)=1]/BlockStatement
  /Statement/IfStatement[@Else='false']]]>
            </value>
        </property>
    </properties>
        <priority>3</priority>
      <example>
  <![CDATA[
public class Foo {
 void bar() {
  if (x) {
   if (y) {
    // do stuff
   }
  }
 }
}
 ]]>
      </example>
    </rule>

	<rule name="UselessOverridingMethod"
    message="Overriding method merely calls super"
    class="net.sourceforge.pmd.rules.UselessOverridingMethod"
          externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#UselessOverridingMethod">
        <description>
The overriding method merely calls the same method defined in a superclass
        </description>
        <priority>3</priority>
        <example><![CDATA[
public void foo(String bar) {
    super.foo(bar);		 //Why bother overriding?
}
        ]]></example>
        <example><![CDATA[
public String foo() {
    return super.foo();  //Why bother overriding?
}
        ]]></example>
    </rule>

 <rule name="ClassCastExceptionWithToArray"
       message="This usage of the Collection.toArray() method will throw a ClassCastException."
       class="net.sourceforge.pmd.rules.XPathRule"
       externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#ClassCastExceptionWithToArray">
  <description>
if you need to get an array of a class from your Collection,
you should pass an array of the desidered class
as the parameter of the toArray method. Otherwise you will get a
ClassCastException.
  </description>
  <properties>
    <property name="xpath">
    <value>
<![CDATA[
//CastExpression[Type/ReferenceType/ClassOrInterfaceType[@Image !=
"Object"]]//PrimaryExpression
[
 PrimaryPrefix/Name[ends-with(@Image, '.toArray')]
 and
 PrimarySuffix/Arguments[count(*) = 0]
]
]]>
    </value>
    </property>
  </properties>
  <priority>3</priority>
  <example>
<![CDATA[
import java.util.ArrayList;
import java.util.Collection;

public class Test {

    public static void main(String[] args) {
        Collection c=new ArrayList();
        Integer obj=new Integer(1);
        c.add(obj);

        // this would trigger the rule (and throw a ClassCastException
if executed)
        Integer[] a=(Integer [])c.toArray();

        // this wouldn't trigger the rule
        Integer[] b=(Integer [])c.toArray(new Integer[c.size()]);
    }
}
]]>
  </example>
</rule>


<rule  name="AvoidDecimalLiteralsInBigDecimalConstructor"
       message="Avoid creating BigDecimal with a decimal (float/double) literal. Use a String literal"
       class="net.sourceforge.pmd.rules.XPathRule"
       externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#AvoidDecimalLiteralsInBigDecimalConstructor">
  <description>
     One might assume that "new BigDecimal(.1)" is exactly equal
     to .1, but it is actually equal
     to .1000000000000000055511151231257827021181583404541015625.
     This is so because .1 cannot be represented exactly as a double
     (or, for that matter, as a binary fraction of any finite length).
     Thus, the long value that is being passed in to the constructor
     is not exactly equal to .1, appearances notwithstanding.

     The (String) constructor, on the other hand, is perfectly predictable:
     'new BigDecimal(".1")' is exactly equal to .1, as one
     would expect.  Therefore, it is generally recommended that the (String)
     constructor be used in preference to this one.
  </description>
  <properties>
    <property name="xpath">
    <value>
<![CDATA[
//VariableInitializer/Expression
/PrimaryExpression/PrimaryPrefix
/AllocationExpression[ClassOrInterfaceType[@Image="BigDecimal"]
and
./Arguments/ArgumentList
/Expression/PrimaryExpression/PrimaryPrefix/Literal[(not (ends-with
(@Image,'"'))) and contains(@Image,".")]]
]]>
    </value>
    </property>
  </properties>
  <priority>3</priority>
  <example>
<![CDATA[
import java.math.BigDecimal;
public class Test {

    public static void main(String[] args) {
      // this would trigger the rule
     BigDecimal bd=new BigDecimal(1.123);
      // this wouldn't trigger the rule
     BigDecimal bd=new BigDecimal("1.123");
      // this wouldn't trigger the rule
     BigDecimal bd=new BigDecimal(12);
    }
}
]]>
  </example>
</rule>


    <rule  name="UselessOperationOnImmutable"
           message="An operation on an Immutable object (BigDecimal or BigInteger) won''t change the object itself"
           class="net.sourceforge.pmd.rules.XPathRule"
           externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#UselessOperationOnImmutable">
      <description>
    An operation on an Immutable object (BigDecimal or BigInteger) won't change the object itself. The
    result of the operation is a new object. Therefore, ignoring the operation result is an error.
      </description>
      <properties>
        <property name="xpath">
        <value>
    <![CDATA[
    //Statement//StatementExpression
    [PrimaryExpression/PrimaryPrefix/Name
    [
    starts-with(@Image,concat(ancestor::MethodDeclaration//LocalVariableDeclaration
    [./Type//ClassOrInterfaceType[@Image = 'BigInteger' or
    @Image = 'BigDecimal']]/VariableDeclarator/VariableDeclaratorId/@Image,"."))
    and
    (
    ends-with(@Image,".add")
    or
    ends-with(@Image,".multiply")
    or
    ends-with(@Image,".divide")
    or
    ends-with(@Image,".subtract")
    or
    ends-with(@Image,".setScale")
    or
    ends-with(@Image,".negate")
    or
    ends-with(@Image,".movePointLeft")
    or
    ends-with(@Image,".movePointRight")
    or
    ends-with(@Image,".pow")
    or
    ends-with(@Image,".shiftLeft")
    or
    ends-with(@Image,".shiftRight")
    )
    ]
    ]
    ]]>
        </value>
        </property>
      </properties>
      <priority>3</priority>
      <example>
    <![CDATA[
import java.math.*;
class Test {
 void method1() {
  BigDecimal bd=new BigDecimal(10);
  bd.add(new BigDecimal(5)); // this will trigger the rule
 }
 void method2() {
  BigDecimal bd=new BigDecimal(10);
  bd = bd.add(new BigDecimal(5)); // this won't trigger the rule
 }
}
    ]]>
      </example>
    </rule>

    <rule  name="MisplacedNullCheck"
           message="The null check here is misplaced; if the variable is null there'll be a NullPointerException"
           class="net.sourceforge.pmd.rules.XPathRule"
           externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#MisplacedNullCheck">
      <description>
    The null check here is misplaced. if the variable is null you'll get a NullPointerException.
    Either the check is useless (the variable will never  be "null") or it's incorrect.
      </description>
      <properties>
        <property name="xpath">
        <value>
    <![CDATA[
    //Expression/ConditionalAndExpression
     /descendant::PrimaryExpression/PrimaryPrefix
      /Name[starts-with(@Image,
      concat(ancestor::PrimaryExpression/following-sibling::EqualityExpression
       [@Image="!=" and ./PrimaryExpression/PrimaryPrefix/Literal/NullLiteral]
     /PrimaryExpression/PrimaryPrefix
      /Name[count(../../PrimarySuffix)=0]/@Image,"."))
    ]
    ]]>
        </value>
        </property>
      </properties>
      <priority>3</priority>
      <example>
    <![CDATA[
public class Foo {
 public void bar() {
  if (a.equals("hi") && a != null) {
   // do something
  }
 }
}
    ]]>
      </example>
    </rule>

    <rule name="UnusedNullCheckInEquals"
        message="Invoke equals() on the object you''ve already ensured is not null"
        class="net.sourceforge.pmd.rules.XPathRule"
        externalInfoUrl="http://pmd.sourceforge.net/rules/basic.html#UnusedNullCheckInEquals">
    <description>
    After checking an object reference for null, you should invoke equals() on that object rather than passing it to another object's equals() method.
    </description>
    <properties>
        <property name="xpath">
        <value>
        <![CDATA[
//PrimarySuffix[@Image='equals' and not(../PrimaryPrefix/Literal)]
 /../PrimarySuffix/Arguments/ArgumentList/Expression
 /PrimaryExpression/PrimaryPrefix
 /Name[@Image = ./../../../../../../../../../../Expression/ConditionalAndExpression
 /EqualityExpression[@Image="!=" and count(./preceding-sibling::*)=0 and
 ./PrimaryExpression/PrimaryPrefix/Literal/NullLiteral]
  /PrimaryExpression/PrimaryPrefix/Name/@Image]
        ]]>
        </value>
        </property>
    </properties>
<priority>3</priority>
<example>
<![CDATA[
public class Test {

public String method1() { return "ok";}
public String method2() { return null;}

public void method(String a) {
String b;
/*
I don't know it method1() can be "null"
but I know "a" is not null..
I'd better write a.equals(method1())
*/
if (a!=null && method1().equals(a)) { // will
trigger the rule
//whatever
}

if (method1().equals(a) && a != null) { //
won't trigger the rule
//whatever
}

if (a!=null && method1().equals(b)) { // won't
trigger the rule
//whatever
}

if (a!=null && "LITERAL".equals(a)) { // won't
trigger the rule
//whatever
}

if (a!=null && !a.equals("go")) { // won't
trigger the rule
a=method2();
if (method1().equals(a)) {
//whatever
}
}
}
}
]]>
</example>
</rule>

</ruleset>

