You got my Vote (see my other mail)
Johan Compagner
> I think this *may* solve the problem at the wrong level of
> abstraction. The
> concept of Dynamic Properties, while useful in dealing with forms, has
> nothing to do with forms and ActionForms intrinsicly. Dynamic
> Properties should be available as a tool for any Java programming
> task. I can think of many uses that do not even involve web
> applications. To couple the idea of Dynamic properties to web forms
> would be a mistake.
>
> That said, your solution below does not, per say, couple Dynamic
> properties to ActionForms. It seems that you just want to use Dynamic
> properties with ActionForms, which seems fine to me. Otherwise, you
> suggestion is very similar to the implementation approach I outlined
> below.
>
> Without question, however, Dynamic Properties should be part of the
> struts beans package. Of course I am biased ;), but I think the
> implementation I outlined in my last email on the topic (below) is the
> right way to do this (similar to Niall's approach). There are
> differences, however, with Niall's. For one, getValue and setValue
> should deal with Objects and not Strings. My solution also contains
> the concept of a registry for registering dynamic PropertyMappers
> and how it should be integrated with the PropertyUtils class.
>
> -will
>
> Niall Pemberton writes:
> > I would prefer to see dynamic properties for ActionForms implemented in
> > Struts - which is on the 1.1 ToDo list.
> >
> > We have customized Struts to do dynamic properties along the following
> > lines:
> >
> > 1) Created a "DynamicProperties" interface which has the
> following methods:
> >
> > public String getValue(String property);
> > public String getValue(int index, String property);
> > public void setValue(String property, String value);
> > public void setValue(int index, String property, String value);
> >
> > 2) Sub-classed "ActionServlet" and changed the
> "processPopulate" method to
> > populate the ActionForm using the above setters if its an instance of
> > "DynamicProperties" or using its normal reflection if not.
> >
> > 3) Modified Struts tags to retrieve bean values using the
> above getters if
> > its an instance of "DynamicProperties" or using its normal
> reflection if
> > not.
> >
> > 4) Created a sub-class of ActionForm (DynamicActionForm) which
> implements
> > our "DynamicProperties" interface.
> >
> > Now we only have one DynamicActionForm and don't have to go
> round setting up
> > loads of different "ActionForm" classes. The DynamicActionForm is a bit
> > simplistic and wouldn't suit everyones needs, but the
> advantage of this is
> > people could create their own concrete implementations.
> >
> > It would be interesting to hear others opinions on how dynamic
> properties
> > should be implemented.
> >
> > Niall
> >
> >
> > > -----Original Message-----
> > > From: David Winterfeldt [mailto:[EMAIL PROTECTED]]
> > > Sent: 28 May 2001 16:59
> > > To: [EMAIL PROTECTED]
> > > Subject: Re: PropertyUtils Enhancement Source Code
> > >
> > >
> > > I always like doing things more generic, but in this
> > > particular case I like being able to tell that a value
> > > in a long nested property was a key for a
> > > java.util.Map.
> > >
> > > "foo.someMap.firstPerson.address.zip"
> > > vs.
> > > "foo.someMap{firstPerson}.address.zip"
> > >
> > > It seems like the most common/standard things you
> > > would store something in are arrays, Collection/List,
> > > and a Map. I'm not sure if the indexed property can
> > > handle a Collection or a Collection/List, but it could
> > > easily be modified if it doesn't. The only other
> > > thing left is a Map. So I don't think it is that bad
> > > to have special syntax. There is improved readability
> > > and it would cover the final major interface not cover
> > > by nested properties from the Collections API.
> > >
> > > It would still be nice to have a generic way to plug
> > > in something for other classes though. We'll see what
> > > other people think.
> > >
> > > David
> > >
> > > --- William Shulman <[EMAIL PROTECTED]> wrote:
> > > >
> > > > David-
> > > >
> > > > I think your idea is a great one. Ideally, you would
> > > > configure the
> > > > BeanInfo for Map like classes with a readMethod that
> > > > treats the names
> > > > of Map properties as keys. That way the evalulation
> > > > expression
> > > > "foo.someMap.firstName" would result in 'firstName'
> > > > being treated as a key
> > > > to be looked up in the Map and returned. This is the
> > > > way the java
> > > > beans specification exposes hooks to "override" when
> > > > the '.' operator
> > > > does.
> > > >
> > > > Unfortunately, doing this in practice is quite
> > > > difficult. Without going into
> > > > the details, if you investigate this method in the
> > > > java beans API's you will
> > > > find it quite inflexible. However, the idea is
> > > > right. We should be able to
> > > > explicitly define how properties of a given type are
> > > > accessed and mutated.
> > > >
> > > > I think the right way to implement this is to create
> > > > an interface called
> > > > PropertyMapper and support a mechanism for linking
> > > > property mappers
> > > > with java Classes via a PropertyMapperRegistry.
> > > >
> > > > public interface PropertyMapper {
> > > > public Object getProperty(Object bean, String
> > > > propName);
> > > > public Object setProperty(Object bean, String
> > > > propName, Object propValue);
> > > > }
> > > >
> > > > public class PropertyMapperRegistry {
> > > > public PropertyMapper getPropertyMapper(Class
> > > > type);
> > > > public void registerPropertyMapper(Class type,
> > > > PropertyMapper pm);
> > > > }
> > > >
> > > > Then, the struts PropertyUtils.getPropertyValue and
> > > > setPropertyValue methods
> > > > (I might have the names slightly wrong) would first
> > > > look to see if a
> > > > PropertyMapper is registered for a given type, and
> > > > use that PropertyMapper if
> > > > possible. If a PropertyMapper is not registered for
> > > > a given type, then the
> > > > PropertyUtils falls back to the standard readMethod
> > > > and writeMethod supplied
> > > > by the property's PropertyDescriptor.
> > > >
> > > > Here is how you would implement a PropertyMapper for
> > > > HashMaps
> > > >
> > > > public class HashMapPropertyMapper implements
> > > > PropertyMapper {
> > > > public Object getProperty(Object bean, String
> > > > propName) {
> > > > return( ((HashMap)bean).get(propName) );
> > > > }
> > > >
> > > > public Object setProperty(Object bean, String
> > > > propName, Object propValue) {
> > > > return( ((HashMap)bean).put(propName, propValue)
> > > > );
> > > > }
> > > > }
> > > >
> > > > The reason I favor this approach is:
> > > > (1) This method is very close the initial spirit of
> > > > the Java Beans spec
> > > > (2) No new syntax is introduced. We do not need { }
> > > > and can utilize the
> > > > existing '.' (dot) operator.
> > > > (3) This solution is more general than a solution
> > > > just for HashMaps.
> > > > Although this is applied really well to HashMaps,
> > > > With this method,
> > > > we can implement PropertyMappers for any class. One
> > > > example that comes to
> > > > mind is this (although slightly academic):
> > > >
> > > > Imagine we have a FileManager class that we use to
> > > > create java.io.File
> > > > objects (kind of a File Factory). We might want to
> > > > abstractly define that
> > > > a properties of FileManagers are File objects
> > > > obtained through the
> > > > FileManager, such that we can write expressions like
> > > > this:
> > > >
> > > "someObject.myFileManager./usr/local/apache/logs/error"
> > > >
> > > > To put it simply, we can make the '.' operator mean
> > > > anything we want it to mean
> > > > for a given target class. Kind of cool. This kind of
> > > > thing can also be seen
> > > > in the Python programming language where the
> > > > developer can override the
> > > > imlementation of '.' and is also similar to 'tie' in
> > > > Perl .
> > > >
> > > > -will
> > > >
> > > >
> > > >
> > > >
> > > > David Winterfeldt writes:
> > > > > Here is the source. I've done some basic tests
> > > > and I
> > > > > think everything is working.
> > > > >
> > > > > David
> > > > >
> > > > > --- David Winterfeldt <[EMAIL PROTECTED]>
> > > > wrote:
> > > > > > For an array you can do this for a property
> > > > > > "type[index]". I don't know if this has been
> > > > > > suggested before, but what if you could also do
> > > > this
> > > > > > for a Hashmap. I was thinking something like
> > > > > > form{name}. I'm sure there are lots of other
> > > > uses,
> > > > > > but it could let you make a bean/form class
> > > > that
> > > > > > just
> > > > > > used a Hashmap for rapid prototyping. This
> > > > also
> > > > > > might
> > > > > > be a simple/temporary solution for the beans
> > > > that
> > > > > > don't need setters and getters.
> > > > > >
> > > > > > public Hashmap getForm();
> > > > > >
> > > > > > <html:text property="form{firstName}" size="30"
> > > > > > maxlength="30"/>
> > > > > > <html:text property="form{lastName}" size="30"
> > > > > > maxlength="30"/>
> > > > > > <html:text property="form{address}" size="30"
> > > > > > maxlength="30"/>
> > > > > >
> > > > > >
> > > > > > David
> > > > > >
> > > > > >
> > > > __________________________________________________
> > > > > > Do You Yahoo!?
> > > > > > Yahoo! Auctions - buy the things you want at
> > > > great
> > > > > > prices
> > > > > > http://auctions.yahoo.com/
> > > > >
> > > > >
> > > > >
> > > > __________________________________________________
> > > > > Do You Yahoo!?
> > > > > Yahoo! Auctions - buy the things you want at
> > > > great prices
> > > > > http://auctions.yahoo.com/
> > >
> > >
> > > __________________________________________________
> > > Do You Yahoo!?
> > > Yahoo! Auctions - buy the things you want at great prices
> > > http://auctions.yahoo.com/
> > >
> >