001: /*
002: * Copyright (c) 2004 JETA Software, Inc. All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without modification,
005: * are permitted provided that the following conditions are met:
006: *
007: * o Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: *
010: * o Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * o Neither the name of JETA Software nor the names of its contributors may
015: * be used to endorse or promote products derived from this software without
016: * specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
021: * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
022: * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
023: * INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
024: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
025: * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
026: * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
027: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
028: */
029:
030: package com.jeta.forms.gui.beans;
031:
032: import java.beans.IntrospectionException;
033: import java.beans.PropertyDescriptor;
034: import java.lang.reflect.Method;
035:
036: import com.jeta.forms.gui.common.FormException;
037: import com.jeta.forms.logger.FormsLogger;
038:
039: /**
040: * A <code>StandardPropertyDescriptor</code> is basically just a proxy for a
041: * standard Java Bean PropertyDescriptor.
042: *
043: * @author Jeff Tassin
044: */
045: public class StandardPropertyDescriptor implements
046: JETAPropertyDescriptor {
047: /**
048: * The underlying PropertyDescriptor for a Java Bean property.
049: */
050: private PropertyDescriptor m_delegate;
051:
052: /**
053: * A simple value array so we don't have to re-instantiate every time we
054: * call setPropertyValue.
055: */
056: private Object[] m_set_value = new Object[1];
057:
058: /**
059: * Creates a <code>StandardPropertyDescriptor</code> instance with the
060: * specified PropertyDescriptor delegate.
061: */
062: public StandardPropertyDescriptor(PropertyDescriptor delegate)
063: throws IntrospectionException, IllegalAccessException {
064: m_delegate = delegate;
065: }
066:
067: /**
068: * Equals implementation. Just forward to the delegate
069: */
070: public boolean equals(Object obj) {
071: return m_delegate.equals(obj);
072: }
073:
074: /**
075: * Return the display name for the property.
076: */
077: public String getDisplayName() {
078: return m_delegate.getDisplayName();
079: }
080:
081: /**
082: * Return the name of the property.
083: */
084: public String getName() {
085: return m_delegate.getName();
086: }
087:
088: /**
089: * Returns the value of the associated property in the given bean.
090: *
091: * @return the value for property
092: */
093: public Object getPropertyValue(JETABean bean) throws FormException {
094: Method getter = m_delegate.getReadMethod();
095: try {
096: Object value = null;
097: if (getter != null) {
098: Class[] paramTypes = getter.getParameterTypes();
099: Object[] args = new Object[paramTypes.length];
100:
101: assert (bean != null);
102: assert (bean.getDelegate() != null);
103: value = getter.invoke(bean.getDelegate(), args);
104: }
105: return value;
106: } catch (Exception e) {
107: System.out
108: .println("StandardPropertyDescriptor.failed for property: "
109: + m_delegate.getName()
110: + " declaringClass: "
111: + getter.getDeclaringClass()
112: + " "
113: + bean.getDelegate());
114: e.printStackTrace();
115: }
116: return null;
117: }
118:
119: /**
120: * Gets a PropertyEditor class that has been registered for the property.
121: * Null is returned if no property editor class has been registered.
122: */
123: public Class getPropertyEditorClass() {
124: return m_delegate.getPropertyEditorClass();
125: }
126:
127: /**
128: * Returns the class object for the property.
129: */
130: public Class getPropertyType() {
131: return m_delegate.getPropertyType();
132: }
133:
134: /**
135: * Gets the short description for the property.
136: */
137: public String getShortDescription() {
138: return m_delegate.getShortDescription();
139: }
140:
141: /**
142: * Returns a method object used to set the property value. Null is returned
143: * if the property is not writable.
144: */
145: public Method getWriteMethod() {
146: return m_delegate.getWriteMethod();
147: }
148:
149: /**
150: * The "hidden" flag is used to identify features that are intended only for
151: * tool use, and which should not be exposed to humans.
152: */
153: public boolean isHidden() {
154: return m_delegate.isHidden();
155: }
156:
157: /**
158: * The "preferred" flag is used to identify features that are particularly
159: * important for presenting to humans
160: */
161: public boolean isPreferred() {
162: return m_delegate.isPreferred();
163: }
164:
165: /**
166: * Returns true if the underlying property should not be stored.
167: */
168: public boolean isTransient() {
169: /** all standard properties are not transient */
170: return false;
171: }
172:
173: /**
174: * Returns true if the property is writable.
175: */
176: public boolean isWritable() {
177: return (m_delegate.getWriteMethod() != null);
178: }
179:
180: /**
181: * Sets this property to preferred.
182: */
183: public void setPreferred(boolean bpref) {
184: m_delegate.setPreferred(bpref);
185: }
186:
187: /**
188: * Sets the value for this property on the given bean.
189: *
190: * @param bean
191: * the JETABean that contains the property to set
192: * @param value
193: * the value of the property
194: */
195: public void setPropertyValue(JETABean bean, Object value)
196: throws FormException {
197: try {
198: Method setter = m_delegate.getWriteMethod();
199: if (setter != null) {
200: m_set_value[0] = value;
201: setter.invoke(bean.getDelegate(), m_set_value);
202: }
203: } catch (Exception e) {
204: FormsLogger.debug("failed to set property: " + getName());
205: FormsLogger.debug(e);
206: }
207: }
208:
209: }
|