/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.ast.xpath;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import net.sourceforge.pmd.lang.ast.Node;
/**
* @author daniels
*/
public class Attribute {
private static final Object[] EMPTY_OBJ_ARRAY = new Object[0];
private Node parent;
private String name;
private Method method;
private Object value;
private String stringValue;
public Attribute(Node parent, String name, Method m) {
this.parent = parent;
this.name = name;
this.method = m;
}
public Attribute(Node parent, String name, String value) {
this.parent = parent;
this.name = name;
this.value = value;
this.stringValue = value;
}
public Object getValue() {
if (value != null) {
return value;
}
// this lazy loading reduces calls to Method.invoke() by about 90%
try {
return method.invoke(parent, EMPTY_OBJ_ARRAY);
} catch (IllegalAccessException iae) {
iae.printStackTrace();
} catch (InvocationTargetException ite) {
ite.printStackTrace();
}
return null;
}
public String getStringValue() {
if (stringValue != null) {
return stringValue;
}
Object v = this.value;
if (this.value == null) {
v = getValue();
}
if (v == null) {
stringValue = "";
} else {
stringValue = String.valueOf(v);
}
return stringValue;
}
public String getName() {
return name;
}
public Node getParent() {
return parent;
}
@Override
public String toString() {
return name + ":" + getValue() + ":" + parent;
}
}