001: /*
002: * <copyright>
003: *
004: * Copyright 1997-2004 BBNT Solutions, LLC
005: * under sponsorship of the Defense Advanced Research Projects
006: * Agency (DARPA).
007: *
008: * You can redistribute this software and/or modify it under the
009: * terms of the Cougaar Open Source License as published on the
010: * Cougaar Open Source Website (www.cougaar.org).
011: *
012: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
013: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
014: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
015: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
016: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
017: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
018: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
019: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
020: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
021: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
022: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
023: *
024: * </copyright>
025: */
026:
027: package org.cougaar.mlm.debug.ui;
028:
029: import java.beans.BeanInfo;
030: import java.beans.IntrospectionException;
031: import java.beans.Introspector;
032: import java.beans.PropertyDescriptor;
033: import java.lang.reflect.InvocationTargetException;
034: import java.lang.reflect.Method;
035: import java.util.Enumeration;
036:
037: /** A tree node for a Object.
038: Overrides the UITreeNode loadChildren, toString and isLeaf.
039: */
040:
041: public class UIObjectNode extends UITreeNode {
042: Object obj;
043: String prefix;
044:
045: /** Create a tree node for the Object.
046: @param obj for which to create tree node
047: */
048: public UIObjectNode(Object obj, String prefix) {
049: super (obj);
050: this .obj = obj;
051: this .prefix = prefix;
052: }
053:
054: /** The Object is not a leaf.
055: @return false
056: */
057: public boolean isLeaf() {
058: return false;
059: }
060:
061: public void loadChildren() {
062: BeanInfo info = null;
063: Object value = null;
064:
065: try {
066: info = Introspector.getBeanInfo(obj.getClass());
067: } catch (IntrospectionException e) {
068: System.out.println("Introspection Exception");
069: }
070:
071: PropertyDescriptor[] properties = info.getPropertyDescriptors();
072: int index = 0; // child position
073: for (int i = 0; i < properties.length; i++) {
074: PropertyDescriptor pd = properties[i];
075: Method rm = pd.getReadMethod();
076: // here is where we need to determine if the attribute
077: // is really a string or if we need to delve further
078: if (rm != null) {
079: String methodName = rm.getName();
080: if (methodName.equals("getProxy"))
081: continue; // ignore this
082: // if (methodName.equals("isValid"))
083: // continue; //ignore this
084: // if (methodName.equals("isDeepValid"))
085: // continue; // ignore this too
086: try {
087: value = rm.invoke(obj, null);
088: } catch (InvocationTargetException ite) {
089: System.out.println("Invocation target exception: "
090: + ite.getTargetException());
091: } catch (Exception e) {
092: System.out
093: .println("Exception when invoking read method: "
094: + e);
095: }
096: if (value != null) {
097: String s = methodName;
098: if (s.startsWith("get"))
099: s = s.substring(3);
100: else if (s.startsWith("is"))
101: s = s.substring(2);
102: s = s + ": ";
103: if (value instanceof java.lang.Boolean
104: || value instanceof java.lang.String
105: || value instanceof java.lang.Long
106: || value instanceof java.lang.Integer
107: || value instanceof java.lang.Class) {
108: s = s + value.toString();
109: insert(new UIStringNode(s), index++);
110: } else if (value instanceof java.util.Enumeration) {
111: Enumeration e = (Enumeration) value;
112: while (e.hasMoreElements()) {
113: Object enumValue = e.nextElement();
114: if (enumValue != null)
115: insert(new UIObjectNode(enumValue, s),
116: index++);
117: }
118: } else {
119: insert(new UIObjectNode(value, s), index++);
120: }
121: }
122: }
123: }
124: }
125:
126: /** Return representation of a Object in a tree.
127: @return Object toString
128: */
129:
130: public String toString() {
131: return prefix + obj.toString();
132: }
133: }
|