View Javadoc

    1   /*
    2    * Created on Jan 17, 2005
    3    *
    4    * $Id: AbstractSunSecureRule.java,v 1.10 2006/10/17 01:07:18 hooperbloob Exp $
    5    */
    6   package net.sourceforge.pmd.rules.sunsecure;
    7
    8   import net.sourceforge.pmd.AbstractRule;
    9   import net.sourceforge.pmd.ast.ASTFieldDeclaration;
    10  import net.sourceforge.pmd.ast.ASTLocalVariableDeclaration;
    11  import net.sourceforge.pmd.ast.ASTName;
    12  import net.sourceforge.pmd.ast.ASTPrimarySuffix;
    13  import net.sourceforge.pmd.ast.ASTReturnStatement;
    14  import net.sourceforge.pmd.ast.ASTTypeDeclaration;
    15  import net.sourceforge.pmd.ast.ASTVariableDeclaratorId;
    16  import net.sourceforge.pmd.ast.SimpleNode;
    17
    18  import java.util.Iterator;
    19  import java.util.List;
    20
    21  /***
    22   * Utility methods for the package
    23   *
    24   * @author mgriffa
    25   */
    26  public abstract class AbstractSunSecureRule extends AbstractRule {
    27
    28      /***
    29       * Tells if the type declaration has a field with varName.
    30       *
    31       * @param varName         the name of the field to search
    32       * @param typeDeclaration the type declaration
    33       * @return <code>true</code> if there is a field in the type declaration named varName, <code>false</code> in other case
    34       */
    35      protected final boolean isField(String varName, ASTTypeDeclaration typeDeclaration) {
    36          final List fds = typeDeclaration.findChildrenOfType(ASTFieldDeclaration.class);
    37          if (fds != null) {
    38              for (Iterator it = fds.iterator(); it.hasNext();) {
    39                  final ASTFieldDeclaration fd = (ASTFieldDeclaration) it.next();
    40                  final ASTVariableDeclaratorId vid = (ASTVariableDeclaratorId) fd.getFirstChildOfType(ASTVariableDeclaratorId.class);
    41                  if (vid != null && vid.hasImageEqualTo(varName)) {
    42                      return true;
    43                  }
    44              }
    45          }
    46          return false;
    47      }
    48
    49
    50      /***
    51       * Gets the name of the variable returned.
    52       * Some examples: <br>
    53       * for this.foo returns foo <br>
    54       * for foo returns foo <br>
    55       * for foo.bar returns foo.bar
    56       *
    57       * @param ret a return statement to evaluate
    58       * @return the name of the variable associated or <code>null</code> if it cannot be detected
    59       */
    60      protected final String getReturnedVariableName(ASTReturnStatement ret) {
    61          final ASTName n = (ASTName) ret.getFirstChildOfType(ASTName.class);
    62          if (n != null)
    63              return n.getImage();
    64          final ASTPrimarySuffix ps = (ASTPrimarySuffix) ret.getFirstChildOfType(ASTPrimarySuffix.class);
    65          if (ps != null)
    66              return ps.getImage();
    67          return null;
    68      }
    69
    70      /***
    71       * TODO modify usages to use symbol table
    72       * Tells if the variable name is a local variable declared in the method.
    73       *
    74       * @param vn   the variable name
    75       * @param node the ASTMethodDeclaration where the local variable name will be searched
    76       * @return <code>true</code> if the method declaration contains any local variable named vn and <code>false</code> in other case
    77       */
    78      protected boolean isLocalVariable(String vn, SimpleNode node) {
    79          final List lvars = node.findChildrenOfType(ASTLocalVariableDeclaration.class);
    80          if (lvars != null) {
    81              for (Iterator it = lvars.iterator(); it.hasNext();) {
    82                  final ASTLocalVariableDeclaration lvd = (ASTLocalVariableDeclaration) it.next();
    83                  final ASTVariableDeclaratorId vid = (ASTVariableDeclaratorId) lvd.getFirstChildOfType(ASTVariableDeclaratorId.class);
    84                  if (vid != null && vid.hasImageEqualTo(vn)) {
    85                      return true;
    86                  }
    87              }
    88          }
    89          return false;
    90      }
    91
    92      /***
    93       * Gets the image of the first ASTName node found by {@link SimpleNode#getFirstChildOfType(Class)}
    94       *
    95       * @param n the node to search
    96       * @return the image of the first ASTName or <code>null</code>
    97       */
    98      protected String getFirstNameImage(SimpleNode n) {
    99          ASTName name = (ASTName) n.getFirstChildOfType(ASTName.class);
    100         if (name != null)
    101             return name.getImage();
    102         return null;
    103     }
    104
    105 }