Author: germuska Date: Wed Dec 15 06:25:41 2004 New Revision: 111970 URL: http://svn.apache.org/viewcvs?view=rev&rev=111970 Log: add support for a map of arbitrary properties to ActionConfig, and adjust ConfigRuleSet to understand the new config. Modified: struts/core/trunk/src/share/org/apache/struts/config/ActionConfig.java struts/core/trunk/src/share/org/apache/struts/config/ConfigRuleSet.java
Modified: struts/core/trunk/src/share/org/apache/struts/config/ActionConfig.java Url: http://svn.apache.org/viewcvs/struts/core/trunk/src/share/org/apache/struts/config/ActionConfig.java?view=diff&rev=111970&p1=struts/core/trunk/src/share/org/apache/struts/config/ActionConfig.java&r1=111969&p2=struts/core/trunk/src/share/org/apache/struts/config/ActionConfig.java&r2=111970 ============================================================================== --- struts/core/trunk/src/share/org/apache/struts/config/ActionConfig.java (original) +++ struts/core/trunk/src/share/org/apache/struts/config/ActionConfig.java Wed Dec 15 06:25:41 2004 @@ -21,6 +21,7 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; +import java.util.Properties; /** @@ -56,6 +57,12 @@ */ protected HashMap forwards = new HashMap(); + /** + * A map of arbitrary properties configured for this action mapping. + * @since Struts 1.3 + */ + protected Properties properties = new Properties(); + // ------------------------------------------------------------- Properties @@ -567,6 +574,56 @@ } + /** + * <p>Set an arbitary key/value pair which can be retrieved by the action + * executed for this mapping. This facility should eliminate many use cases + * for subclassing <code>ActionConfig</code> or <code>ActionMapping</code> by + * providing more than just the single <code>parameter</code> property for passing + * arbitrary configuration information into an action.</p> + * + * <p>This method must not be called after configuration is complete, or an + * <code>IllegalStateException</code> will be thrown. Rather than calling it in Java code, + * it is used by editing the <code>struts-config</code> file. Specifically, these values can + * be set by using a <code><set-property></code> element nested within the <code><action></code> + * element. The element should use the <code>key</code> attribute, not the <code>name</code> + * attribute: the <code>name</code> attribute is for setting bean properties on a custom subclass + * of <code>ActionConfig</code>. + * </p> + * + * <p><b>Example</b> + * <code><pre> + * <action path="/example" type="com.example.MyAction"> + * <set-property key="foo" property="bar" /> + * </action> + * </pre></code> + * </p> + * + * @param key the key by which this value will be retrieved + * @param value the value which should be returned when <code>getProperty(key)</code> is + * called with the corresponding <code>key</code>. + * @since Struts 1.3 + * @exception IllegalStateException if this module configuration + * has been frozen + */ + public void setProperty(String key, String value) { + + if (configured) { + throw new IllegalStateException("Configuration is frozen"); + } + properties.setProperty(key,value); + + } + + /** + * Return the property-value for the specified key, if any; + * otherwise return <code>null</code>. + * + * @param key a key specified in the <code>struts-config</code> file. + * @since Struts 1.3 + */ + public String getProperty(String key) { + return properties.getProperty(key); + } /** * Return the exception configuration for the specified type, if any; Modified: struts/core/trunk/src/share/org/apache/struts/config/ConfigRuleSet.java Url: http://svn.apache.org/viewcvs/struts/core/trunk/src/share/org/apache/struts/config/ConfigRuleSet.java?view=diff&rev=111970&p1=struts/core/trunk/src/share/org/apache/struts/config/ConfigRuleSet.java&r1=111969&p2=struts/core/trunk/src/share/org/apache/struts/config/ConfigRuleSet.java&r2=111970 ============================================================================== --- struts/core/trunk/src/share/org/apache/struts/config/ConfigRuleSet.java (original) +++ struts/core/trunk/src/share/org/apache/struts/config/ConfigRuleSet.java Wed Dec 15 06:25:41 2004 @@ -26,6 +26,7 @@ import org.apache.commons.digester.RuleSetBase; import org.apache.struts.util.RequestUtils; import org.xml.sax.Attributes; +import org.apache.commons.digester.SetPropertyRule; /** @@ -84,9 +85,9 @@ "addActionConfig", "org.apache.struts.config.ActionConfig"); - digester.addSetProperty + digester.addRule ("struts-config/action-mappings/action/set-property", - "property", "value"); + new ActionConfigSetPropertyRule()); digester.addObjectCreate ("struts-config/action-mappings/action/exception", @@ -294,6 +295,43 @@ } +/** + * A variant of the standard Digester <code>SetPropertyRule</code> which + * accepts one of two "naming" attributes. If the element being processed + * has an attribute whose name matches <code>nameAttrName</code>, then the + * standard <code>SetPropertyRule</code> behavior is invoked, and the value will + * be used to set a bean property on the object on top of the Digester stack. + * However, if there is an attribute whose name matches <code>keyAttrName</code>, + * then the value will be used to call <code>setProperty(key,value)</code> on the object + * on top of the stack, which will be assumed to be of type <code>ActionConfig</code>. + */ +final class ActionConfigSetPropertyRule extends SetPropertyRule { + + public ActionConfigSetPropertyRule() { + super("name", "value"); + } + + public void begin(Attributes attributes) throws Exception { + + if (attributes.getIndex("key") == -1) { + super.begin(attributes); + return; + } + + if (attributes.getIndex("name") != -1) { + throw new IllegalArgumentException("<set-property> inside <action> accepts only one of 'key' or 'name' attributes."); + } + + ActionConfig actionConfig = (ActionConfig) digester.peek(); + actionConfig.setProperty(attributes.getValue("key"), + attributes.getValue("value")); + + + } + + +} + /** * An object creation factory which creates action form bean instances, taking @@ -473,3 +511,4 @@ } } + --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]