Author: pbenedict Date: Sun Jul 8 17:25:54 2007 New Revision: 554496 URL: http://svn.apache.org/viewvc?view=rev&rev=554496 Log: STR-3067: Add singleton/prototype instantiation policy for actions
Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/commands/servlet/CreateAction.java struts/struts1/trunk/core/src/main/java/org/apache/struts/config/ActionConfig.java struts/struts1/trunk/core/src/main/resources/org/apache/struts/resources/struts-config_1_4.dtd Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/commands/servlet/CreateAction.java URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/commands/servlet/CreateAction.java?view=diff&rev=554496&r1=554495&r2=554496 ============================================================================== --- struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/commands/servlet/CreateAction.java (original) +++ struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/commands/servlet/CreateAction.java Sun Jul 8 17:25:54 2007 @@ -65,29 +65,31 @@ Action action = null; - synchronized (actions) { - action = (Action) actions.get(type); - - if (action == null) { - try { - action = createAction(context, type); - } catch (Exception e) { - log.error(actionServlet.getInternal().getMessage( - "actionCreate", actionConfig.getPath(), - actionConfig.toString()), e); - throw e; + try { + if (actionConfig.isSingleton()) { + synchronized (actions) { + action = (Action) actions.get(type); + if (action == null) { + action = createAction(context, type); + actions.put(type, action); + } } - actions.put(type, action); + } else { + action = createAction(context, type); } + } catch (Exception e) { + log.error(actionServlet.getInternal().getMessage( + "actionCreate", actionConfig.getPath(), + actionConfig.toString()), e); + throw e; } - + if (action.getServlet() == null) { action.setServlet(actionServlet); } return (action); } - /** * <p>Invoked by <code>getAction</code> when the <code>Action</code> Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/config/ActionConfig.java URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/config/ActionConfig.java?view=diff&rev=554496&r1=554495&r2=554496 ============================================================================== --- struts/struts1/trunk/core/src/main/java/org/apache/struts/config/ActionConfig.java (original) +++ struts/struts1/trunk/core/src/main/java/org/apache/struts/config/ActionConfig.java Sun Jul 8 17:25:54 2007 @@ -193,6 +193,12 @@ * form bean is accessed, if any. </p> */ protected String scope = "session"; + + /** + * <p> Should this action be instantiated once per module (singleton) + * or once per request (prototype)? </p> + */ + protected boolean singleton = true; /** * <p>Identifies conditions for automatic form reset.</p> @@ -715,6 +721,30 @@ this.populate= populate; } + + /** + * Determines whether this action is a singleton (one per module) + * or a prototype (one per request). Actions are defaulted to + * singletons unless otherwise specified. + * + * @return <code>true</code> for singleton; otherwise prototype + * @see #setSingleton(boolean) + * @since Struts 1.4 + */ + public boolean isSingleton() { + return this.singleton; + } + + /** + * Stores whether this action is a singleton. + * + * @param singleton <code>true</code> for singleton; otherwise prototype + * @see #isSingleton() + * @since Struts 1.4 + */ + public void setSingleton(boolean singleton) { + this.singleton = singleton; + } /** * <p> Return suffix used to match request parameter names to form bean @@ -1373,6 +1403,9 @@ sb.append(",populate="); sb.append(populate); } + + sb.append(",singleton="); + sb.append(singleton); if (suffix != null) { sb.append(",suffix="); Modified: struts/struts1/trunk/core/src/main/resources/org/apache/struts/resources/struts-config_1_4.dtd URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/resources/org/apache/struts/resources/struts-config_1_4.dtd?view=diff&rev=554496&r1=554495&r2=554496 ============================================================================== --- struts/struts1/trunk/core/src/main/resources/org/apache/struts/resources/struts-config_1_4.dtd (original) +++ struts/struts1/trunk/core/src/main/resources/org/apache/struts/resources/struts-config_1_4.dtd Sun Jul 8 17:25:54 2007 @@ -491,6 +491,7 @@ <!ATTLIST action reset %PopulateStrategy; #IMPLIED> <!ATTLIST action roles CDATA #IMPLIED> <!ATTLIST action scope %RequestScope; #IMPLIED> +<!ATTLIST action singleton %Boolean; #IMPLIED> <!ATTLIST action suffix CDATA #IMPLIED> <!ATTLIST action type %ClassName; #IMPLIED> <!ATTLIST action unknown %Boolean; #IMPLIED>