On Tue, 2004-07-20 at 20:43, petra staub wrote: > How can I implement a dynamic property setter? > > I have for instance a bean 'address' with different properties and > getter/setters...something like: > > public class Address { > private String firstname; > private String lastname; > ... > ... > > public void setFirstname(String str) { > firstname = str; > } > public String getFirstname() { > return firstname; > } > ... > ... > } > > I want now to parse a XML file where the bean properties are > specified by a 'property tag': > > <address> > <property id="firstname">petra</property> > <property id="lastname">staub</property> > </address> > Hi Petra,
If you can write your xml as: <address> <property id="firstname" value="petra"/> <property id="lastname" value="staub"/> </address> then you can use the SetPropertyRule. If you can write your xml as: <address> <firstname>petra</firstname> <lastname>staub</lastname> </address> then you can either use BeanPropertySetterRule + the ExtendedBaseRules matcher, or can use the new SetNestedPropertiesRule from the CVS version of Digester. But unfortunately I don't know of a way of parsing the xml you indicate using the standard rules. You could of course write a custom Rule to do this (or modify the existing SetPropertyRule to add this feature). If you do so, please consider submitting it for inclusion in the Digester core. I'm not currently sure what the best way of doing this is, because it requires info from both the begin() method (attribute) and body() method (content), and rules should never store "state" on themselves. Perhaps an argument could be made that this is ok for this rule, because it always deals with "leaf" xml elements. Or, as you say, you could add a setProperty(name, value) method to your bean that either has a hard-wired if/then structure to call the correct setter method, or uses reflection upon itself to invoke the appropriate method, or make the class a DynaBean. Regards, Simon --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]