| <!-- | |
| Licensed to the Apache Software Foundation (ASF) under one or more | |
| contributor license agreements. See the NOTICE file distributed with | |
| this work for additional information regarding copyright ownership. | |
| The ASF licenses this file to You under the Apache License, Version 2.0 | |
| (the "License"); you may not use this file except in compliance with | |
| the License. You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| See the License for the specific language governing permissions and | |
| limitations under the License. | |
| --> | |
| <html> | |
| <head> | |
| <title>Proposal for BeanUtils Package</title> | |
| </head> | |
| <body bgcolor="white"> | |
| <div align="center"> | |
| <h1>Proposal for <em>BeanUtils</em> Package</h1> | |
| </div> | |
| <h3>(0) Rationale</h3> | |
| <p>Most Java developers are used to creating Java classes that conform to the | |
| JavaBeans naming patterns for property getters and setters. It is natural to | |
| then access these methods directly, using calls to the corresponding | |
| <code>getXxx</code> and <code>setXxx</code> methods. However, there are some | |
| occasions where dynamic access to Java object properties (without compiled-in | |
| knowledge of the property getter and setter methods to be called) is needed. | |
| Example use cases include:</p> | |
| <ul> | |
| <li>Building scripting languages that interact with the Java object model | |
| (such as the Bean Scripting Framework).</li> | |
| <li>Building template language processors for web presentation and similar | |
| uses (such as JSP or Velocity).</li> | |
| <li>Building custom tag libraries for JSP and XSP environments (such as Jakarta | |
| Taglibs, Struts, Cocoon).</li> | |
| <li>Consuming XML-based configuration resources (such as Ant build scripts, web | |
| application deployment descriptors, Tomcat's <code>server.xml</code> | |
| file).</li> | |
| </ul> | |
| <p>The Java language provides <em>Reflection</em> and <em>Introspection</em> | |
| APIs (see the <code>java.lang.reflect</code> and <code>java.beans</code> | |
| packages in the JDK Javadocs). However, these APIs can be quite complex to | |
| understand and utilize. The proposed <em>BeanUtils</em> component provides | |
| easy-to-use wrappers around these capabilities.</p> | |
| <h3>(1) Scope of the Package</h3> | |
| <p>This proposal is to create a package of Java utility methods for accessing | |
| and modifying the properties of arbitrary JavaBeans. No dependencies outside | |
| of the JDK are required, so the use of this package is very lightweight.</p> | |
| <p>In addition to wrapping the reflection and introspection APIs of the | |
| standard JDK, <em>BeanUtils</em> components shall support a syntax for directly | |
| accessing <strong>nested</strong> and <strong>indexed</strong> properties, in a | |
| manner that will be familar to users of scripting languages like JavaScript. | |
| For example, the following property accessor expressions are supported:</p> | |
| <ul> | |
| <li><strong>customer</strong> - Equivalent to <code>getCustomer()</code>.</li> | |
| <li><strong>customer.address</strong> - Equivalent to | |
| <code>getCustomer().getAddress()</code>.</li> | |
| <li><strong>customer.address[2].street</strong> - Equivalent to | |
| <code>getCustomer().getAddress(2).getStreet()</code> (access to indexed | |
| properties also works if the underlying property is an array rather than | |
| providing indexed getter and setter methods).</li> | |
| </ul> | |
| <h3>(1.5) Interaction With Other Packages</h3> | |
| <p><em>BeanUtils</em> relies only on standard JDK 1.2 (or later) APIs for | |
| production deployment. It utilizes the JUnit unit testing framework for | |
| developing and executing unit tests, but this is of interest only to | |
| developers of the component. BeanUtils will also be a dependency for | |
| several future proposed components for the Jakarta Commons subproject.</p> | |
| <p>No external configuration files are utilized.</p> | |
| <h3>(2) Initial Source of the Package</h3> | |
| <p>The three original Java classes (<code>BeanUtils</code>, | |
| <code>ConvertUtils</code>, and <code>PropertyUtils</code>) are an integral | |
| part of the <a href="http://jakarta.apache.org/struts">Struts Framework</a>. | |
| However, they have very few dependencies on other aspects of Struts, and | |
| those dependencies have been removed in the proposed code base. | |
| Once accepted and released as a Jakarta Commons component, Struts will | |
| be modified to use the Commons version of these classes, and its internal | |
| versions will be deprecated.</p> | |
| <p>The proposed package name for the new component is | |
| <code>org.apache.commons.beanutils</code>.</p> | |
| <h3>(3) Required Jakarta-Commons Resources</h3> | |
| <ul> | |
| <li>CVS Repository - New directory <code>beanutils</code> in the | |
| <code>jakarta-commons</code> CVS repository. All initial committers | |
| are already committers on <code>jakarta-commons</code>, so no | |
| additional user setups are required.</li> | |
| <li>Mailing List - Discussions will take place on the general | |
| <em>jakarta-commons@jakarta.apache.org</em> mailing list. To help | |
| list subscribers identify messages of interest, it is suggested that | |
| the message subject of messages about this component be prefixed with | |
| [BeanUtils].</li> | |
| <li>Bugzilla - New component "BeanUtils" under the "Commons" product | |
| category, with appropriate version identifiers as needed.</li> | |
| <li>Jyve FAQ - New category "commons-beanutils" (when available). </li> | |
| </ul> | |
| <h3>(4) Initial Committers</h3> | |
| <p>The initial committers on the BeanUtils component shall be Craig | |
| McClanahan and Geir Magnusson Jr.</p> | |
| </body> | |
| </html> |