View Javadoc

    1   /**
    2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
    3    */
    4   package net.sourceforge.pmd.lang.ast.xpath;
    5
    6   import java.lang.reflect.InvocationTargetException;
    7   import java.lang.reflect.Method;
    8
    9   import net.sourceforge.pmd.lang.ast.Node;
    10
    11  /**
    12   * @author daniels
    13   */
    14  public class Attribute {
    15
    16      private static final Object[] EMPTY_OBJ_ARRAY = new Object[0];
    17      private Node parent;
    18      private String name;
    19      private Method method;
    20      private Object value;
    21      private String stringValue;
    22
    23      public Attribute(Node parent, String name, Method m) {
    24  	this.parent = parent;
    25  	this.name = name;
    26  	this.method = m;
    27      }
    28
    29      public Attribute(Node parent, String name, String value) {
    30  	this.parent = parent;
    31  	this.name = name;
    32  	this.value = value;
    33  	this.stringValue = value;
    34      }
    35
    36      public Object getValue() {
    37  	if (value != null) {
    38  	    return value;
    39  	}
    40  	// this lazy loading reduces calls to Method.invoke() by about 90%
    41  	try {
    42  	    return method.invoke(parent, EMPTY_OBJ_ARRAY);
    43  	} catch (IllegalAccessException iae) {
    44  	    iae.printStackTrace();
    45  	} catch (InvocationTargetException ite) {
    46  	    ite.printStackTrace();
    47  	}
    48  	return null;
    49      }
    50
    51      public String getStringValue() {
    52  	if (stringValue != null) {
    53  	    return stringValue;
    54  	}
    55  	Object v = this.value;
    56  	if (this.value == null) {
    57  	    v = getValue();
    58  	}
    59  	if (v == null) {
    60  	    stringValue = "";
    61  	} else {
    62  	    stringValue = String.valueOf(v);
    63  	}
    64  	return stringValue;
    65      }
    66
    67      public String getName() {
    68  	return name;
    69      }
    70
    71      public Node getParent() {
    72  	return parent;
    73      }
    74
    75      public String toString() {
    76  	return name + ":" + getValue() + ":" + parent;
    77      }
    78  }