There's been a lot of interest, both here (COMMONS-DEV), on the Struts mailing lists, and elsewhere in the idea of a JavaBean-like thing where the set of properties can be dynamically defined. If support for this was integrated into the BeanUtils package in Commons, we could also make the methods in BeanUtils and PropertyUtils treat the properties of these beans like they do for regular JavaBeans, and thus be able to leverage them in environments based on BeanUtils (such as Struts).
The purpose of this email is to summarize a set of design requirements for discussion purposes, so we can coalesce on a design and then get it implemented. For extra fun, I've thrown in a very-raw idea of what the APIs might look like -- but I'd like to have the group's agreement before turning that into code. Before embarking on the actual development of dynamic beans support, we should also do a release of BeanUtils with the current enhancements, to provide a stable starting point. Please let me know what you think! BACKGROUND: The purpose of the DynaBean design (I'm not firmly attached to the name, but kinda like it :-) is to support application programming designs based on JavaBeans design patterns, but where the static nature of JavaBeans themselves (i.e. the fact that the set of properties is fixed at compile time) is too restrictive. Some typical use cases for such a capability: * A bean object that represents a Row from a JDBC ResultSet (the names and types of the column properties cannot be known in advance because they are based on the SELECT statement). * A way to construct and use "value objects" that extract the properties of an EJB into a structure that can be utilized by a presentation tier technology such as JSP pages, without having to hand code the value object. * A way to capture *all* of the request parameters from a servlet request as a single object. * A way to dynamically represnt XML input data as a tree of Java objects. DESIGN REQUIREMENTS: * Support a completely arbitrary set of properties and corresponding values, with the ability to add and remove properties dynamically. * Support the ability to dynamically register the set of property names that are allowed, and then enforce storing only those property names. * Support the ability to register data types (Java classes) for each property, along with the names, with automatic type checking. * Support for properties with scalar types, array types, and "mapped" types (as currently supported in Beanutils). * Support "simple" and "indexed" property getters and setters in a style similar to standard JavaBeans. * Support registration of property change listeners and broadcast of property change events * Provide the basic DynaBean API as a Java interface, as well as a convenience base class, so that applications can adopt it however they wish. * Base implementation class should implement Serializable so that DynaBeans can be serialized and deserialized (assuming that the actual property values can be). * Transparently support DynaBean objects in the existing BeanUtils and PropertyUtils classes of the Bean Utilities package. * To the maximum extent feasible, provide JavaBeans-like introspection capabilities of the available properties. May require an IntrospectionUtils addition to the Beanutils package. CONCEPTUAL API: public interface DynaBean { // ---------------------------------------------------------------- // Dynamic property configuration // ---------------------------------------------------------------- void addDynamic(String name); // Unrestricted type void addDynamic(String name, Class type); // Restricted type void removeDyanamic(String name); // Remove property & value void restrictDynamic(boolean restrict); // Are property names // restricted to registered // ones? (default=false) // (can be changed) // ---------------------------------------------------------------- // Property getters and setters. Behavior on previously // unknown property names depends on the restrict setting // ---------------------------------------------------------------- // Does this bean have a property of the specified name? boolean contains(String name); // Getters return null on unknown property names Object get(String name); // Simple Object get(String name, int index); // Indexed Object get(String name, String key); // Mapped // Setters are allowed to set null unless property is native. // Optionally throw IllegalArgumentException if type is restricted // and the value argument is not assignment-compatible void set(String name, Object value); // Simple void set(String name, int index, // Indexed Object value); void set(String name, String key, // Mapped } Craig McClanahan -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>