Author: mrdon
Date: Sat Sep 23 21:09:38 2006
New Revision: 449350

URL: http://svn.apache.org/viewvc?view=rev&rev=449350
Log:
Adding the legacy module classes (silly local svn problem), minor improvements 
to support 
intelligent defaults, added documentation

Added:
    struts/struts2/trunk/legacy/src/main/java/org/apache/
    struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/
    struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/
    
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ActionFormResetInterceptor.java
      - copied, changed from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/ActionFormResetInterceptor.java
    
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ActionFormValidationInterceptor.java
      - copied, changed from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/ActionFormValidationInterceptor.java
    
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/DynaBeanPropertyAccessor.java
      - copied, changed from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/DynaBeanPropertyAccessor.java
    
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/LegacyAction.java
    
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ScopedModelDriven.java
      - copied, changed from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/ScopedModelDriven.java
    
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ScopedModelDrivenInterceptor.java
      - copied, changed from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/ScopedModelDrivenInterceptor.java
    
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/StrutsFactory.java
      - copied, changed from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/StrutsFactory.java
    
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperActionForward.java
      - copied, changed from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/WrapperActionForward.java
    
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperActionMapping.java
      - copied, changed from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/WrapperActionMapping.java
    
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperExceptionConfig.java
      - copied, changed from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/WrapperExceptionConfig.java
    
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperModuleConfig.java
      - copied, changed from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/WrapperModuleConfig.java
Modified:
    
struts/struts2/trunk/apps/showcase/src/main/java/org/apache/struts2/showcase/legacy/EditGangsterAction.java
    struts/struts2/trunk/apps/showcase/src/main/resources/struts-legacy.xml

Modified: 
struts/struts2/trunk/apps/showcase/src/main/java/org/apache/struts2/showcase/legacy/EditGangsterAction.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/apps/showcase/src/main/java/org/apache/struts2/showcase/legacy/EditGangsterAction.java?view=diff&rev=449350&r1=449349&r2=449350
==============================================================================
--- 
struts/struts2/trunk/apps/showcase/src/main/java/org/apache/struts2/showcase/legacy/EditGangsterAction.java
 (original)
+++ 
struts/struts2/trunk/apps/showcase/src/main/java/org/apache/struts2/showcase/legacy/EditGangsterAction.java
 Sat Sep 23 21:09:38 2006
@@ -33,6 +33,7 @@
     @Override
     public ActionForward execute(ActionMapping mapping, ActionForm form, 
HttpServletRequest request, HttpServletResponse response) throws Exception {
         // Some code to load the gangster from the db as necessary
+        
         return mapping.findForward("success");
     }
 

Modified: 
struts/struts2/trunk/apps/showcase/src/main/resources/struts-legacy.xml
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/apps/showcase/src/main/resources/struts-legacy.xml?view=diff&rev=449350&r1=449349&r2=449350
==============================================================================
--- struts/struts2/trunk/apps/showcase/src/main/resources/struts-legacy.xml 
(original)
+++ struts/struts2/trunk/apps/showcase/src/main/resources/struts-legacy.xml Sat 
Sep 23 21:09:38 2006
@@ -9,8 +9,6 @@
            
            <interceptors>
                <interceptor name="gangsterForm" 
class="org.apache.struts2.legacy.ScopedModelDrivenInterceptor">
-                       <param name="scope">request</param>
-                       <param name="name">gangsterForm</param>
                        <param 
name="className">org.apache.struts2.showcase.legacy.GangsterForm</param>
                </interceptor>
            

Copied: 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ActionFormResetInterceptor.java
 (from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/ActionFormResetInterceptor.java)
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ActionFormResetInterceptor.java?view=diff&rev=449350&p1=struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/ActionFormResetInterceptor.java&r1=449318&p2=struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ActionFormResetInterceptor.java&r2=449350
==============================================================================
--- 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/ActionFormResetInterceptor.java
 (original)
+++ 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ActionFormResetInterceptor.java
 Sat Sep 23 21:09:38 2006
@@ -16,36 +16,37 @@
  * limitations under the License.
  */
 
-package org.apache.ti.legacy;
+package org.apache.struts2.legacy;
 
-import com.opensymphony.xwork.interceptor.ModelDrivenInterceptor;
-import com.opensymphony.xwork.ActionInvocation;
-import com.opensymphony.xwork.interceptor.AroundInterceptor;
-import com.opensymphony.xwork.ObjectFactory;
-import com.opensymphony.webwork.ServletActionContext;
 import javax.servlet.http.HttpServletRequest;
+
 import org.apache.struts.action.ActionForm;
 import org.apache.struts.action.ActionMapping;
+import org.apache.struts2.ServletActionContext;
+import org.apache.struts2.dispatcher.Dispatcher;
+
+import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
 
 /**
  *  Calls the reset() method on the ActionForm, if it exists.
  */
-public class ActionFormResetInterceptor extends AroundInterceptor {
-
-    protected void after(ActionInvocation dispatcher, String result) throws 
Exception {
-    }
+public class ActionFormResetInterceptor extends AbstractInterceptor {
 
-    protected void before(ActionInvocation invocation) throws Exception {
+    @Override
+    public String intercept(ActionInvocation invocation) throws Exception {
         Object action = invocation.getAction();
 
         if (action instanceof ScopedModelDriven) {
             ScopedModelDriven modelDriven = (ScopedModelDriven) action;
             Object model = modelDriven.getModel();
-            if (model != null) {
-                ActionMapping mapping = 
StrutsFactory.getStrutsFactory().createActionMapping(invocation.getProxy().getConfig());
+            if (model != null && model instanceof ActionForm) {
+                StrutsFactory factory = new 
StrutsFactory(Dispatcher.getInstance().getConfigurationManager().getConfiguration());
+                ActionMapping mapping = 
factory.createActionMapping(invocation.getProxy().getConfig());
                 HttpServletRequest req = ServletActionContext.getRequest();
                 ((ActionForm)model).reset(mapping, req);
             }
         }
+        return invocation.invoke();
     }
 }

Copied: 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ActionFormValidationInterceptor.java
 (from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/ActionFormValidationInterceptor.java)
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ActionFormValidationInterceptor.java?view=diff&rev=449350&p1=struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/ActionFormValidationInterceptor.java&r1=449318&p2=struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ActionFormValidationInterceptor.java&r2=449350
==============================================================================
--- 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/ActionFormValidationInterceptor.java
 (original)
+++ 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ActionFormValidationInterceptor.java
 Sat Sep 23 21:09:38 2006
@@ -16,40 +16,43 @@
  * limitations under the License.
  */
 
-package org.apache.ti.legacy;
+package org.apache.struts2.legacy;
 
-import com.opensymphony.xwork.interceptor.ModelDrivenInterceptor;
-import com.opensymphony.xwork.ActionInvocation;
-import com.opensymphony.xwork.interceptor.AroundInterceptor;
-import com.opensymphony.xwork.ObjectFactory;
-import com.opensymphony.webwork.ServletActionContext;
 import javax.servlet.http.HttpServletRequest;
+
+import org.apache.struts.action.ActionErrors;
 import org.apache.struts.action.ActionForm;
 import org.apache.struts.action.ActionMapping;
-import org.apache.struts.action.ActionErrors;
-import org.apache.struts.action.ActionError;
+import org.apache.struts2.ServletActionContext;
+import org.apache.struts2.dispatcher.Dispatcher;
+
+import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
 
 /**
  *  Calls the validate() method on the ActionForm, if it exists.  The errors 
are handled
- *  like regular XWork validation errors.
+ *  like regular XWork validation errors.  Action-level validation flag 
supported if the
+ *  action is a subclass of LegacyAction.
  */
-public class ActionFormValidationInterceptor extends AroundInterceptor {
-
-    protected void after(ActionInvocation dispatcher, String result) throws 
Exception {
-    }
+public class ActionFormValidationInterceptor extends AbstractInterceptor {
 
-    protected void before(ActionInvocation invocation) throws Exception {
+    @Override
+    public String intercept(ActionInvocation invocation) throws Exception {
         Object action = invocation.getAction();
 
-        if (action instanceof ScopedModelDriven) {
+        
+        if ((action instanceof ScopedModelDriven) &&
+            (!(action instanceof LegacyAction) || 
((LegacyAction)action).isValidate())) {
             ScopedModelDriven modelDriven = (ScopedModelDriven) action;
             Object model = modelDriven.getModel();
             if (model != null) {
-                ActionMapping mapping = 
StrutsFactory.getStrutsFactory().createActionMapping(invocation.getProxy().getConfig());
+                StrutsFactory strutsFactory = new 
StrutsFactory(Dispatcher.getInstance().getConfigurationManager().getConfiguration());
+                ActionMapping mapping = 
strutsFactory.createActionMapping(invocation.getProxy().getConfig());
                 HttpServletRequest req = ServletActionContext.getRequest();
                 ActionErrors errors = ((ActionForm)model).validate(mapping, 
req);
-                StrutsFactory.getStrutsFactory().convertErrors(errors, 
action);                
+                strutsFactory.convertErrors(errors, action);                
             }
         }
+        return invocation.invoke();
     }
 }

Copied: 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/DynaBeanPropertyAccessor.java
 (from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/DynaBeanPropertyAccessor.java)
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/DynaBeanPropertyAccessor.java?view=diff&rev=449350&p1=struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/DynaBeanPropertyAccessor.java&r1=449318&p2=struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/DynaBeanPropertyAccessor.java&r2=449350
==============================================================================
--- 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/DynaBeanPropertyAccessor.java
 (original)
+++ 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/DynaBeanPropertyAccessor.java
 Sat Sep 23 21:09:38 2006
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.ti.legacy;
+package org.apache.struts2.legacy;
 
 import java.io.Serializable;
 import org.apache.commons.beanutils.DynaBean;

Added: 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/LegacyAction.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/LegacyAction.java?view=auto&rev=449350
==============================================================================
--- 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/LegacyAction.java
 (added)
+++ 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/LegacyAction.java
 Sat Sep 23 21:09:38 2006
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.struts2.legacy;
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.Globals;
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.ActionMessage;
+import org.apache.struts.action.ActionMessages;
+import org.apache.struts2.ServletActionContext;
+import org.apache.struts2.StrutsException;
+import org.apache.struts2.dispatcher.DefaultActionSupport;
+import org.apache.struts2.dispatcher.Dispatcher;
+
+import com.opensymphony.xwork2.ActionContext;
+import com.opensymphony.xwork2.ObjectFactory;
+import com.opensymphony.xwork2.config.entities.ActionConfig;
+
+/**
+ * Wraps legacy Struts 1.3 Actions.  Supports the following features:
+ * <ul>
+ *  <li>ActionForms</li>
+ *  <li>ActionForwards that have the same name as a result</li>
+ *  <li>ActionMessages stored in the request, converted to Struts 2 
messages</li>
+ *  <li>Action-level validation flag</li>
+ * </ul>
+ * Still to do:
+ * <ul>
+ *  <li>Custom ActionForward instances that don't have an associated result 
config</li>
+ *  <li>setServlet() calls for the Action</li>
+ *  <li>Most everything else...</li>
+ * </ul>
+ */
+public class LegacyAction extends DefaultActionSupport implements 
ScopedModelDriven<ActionForm> {
+
+    private ActionForm actionForm;
+    private String className;
+    private boolean validate;
+    
+    public String execute() throws Exception {
+        ActionContext ctx = ActionContext.getContext();
+        ActionConfig actionConfig = 
ctx.getActionInvocation().getProxy().getConfig();
+        Action action = null;
+        try {
+            action = (Action) 
ObjectFactory.getObjectFactory().buildBean(className, null);
+        } catch (Exception e) {
+            throw new StrutsException("Unable to create the legacy Struts 
Action", e, actionConfig);
+        }
+        
+        // We should call setServlet() here, but let's stub that out later
+        
+        StrutsFactory strutsFactory = new 
StrutsFactory(Dispatcher.getInstance().getConfigurationManager().getConfiguration());
+        ActionMapping mapping = 
strutsFactory.createActionMapping(actionConfig);
+        HttpServletRequest request = ServletActionContext.getRequest();
+        HttpServletResponse response = ServletActionContext.getResponse();
+        ActionForward forward = action.execute(mapping, actionForm, request, 
response);
+        
+        ActionMessages messages = (ActionMessages) 
request.getAttribute(Globals.MESSAGE_KEY);
+        if (messages != null) {
+            for (Iterator i = messages.get(); i.hasNext(); ) {
+                ActionMessage msg = (ActionMessage) i.next();
+                if (msg.getValues() != null && msg.getValues().length > 0) {
+                    addActionMessage(getText(msg.getKey(), 
Arrays.asList(msg.getValues())));
+                } else {
+                    addActionMessage(getText(msg.getKey()));
+                }
+            }
+        }
+        
+        if (forward instanceof WrapperActionForward || 
actionConfig.getResults().containsKey(forward.getName())) {
+            return forward.getName();
+        } else {
+            throw new StrutsException("Unable to handle action forwards that 
don't have an associated result", actionConfig);
+        }
+    }
+    
+    public void setModel(ActionForm model) {
+        actionForm = model;
+    }
+
+    public ActionForm getModel() {
+        return actionForm;
+    }
+    
+    /**
+     * @return the validate
+     */
+    public boolean isValidate() {
+        return validate;
+    }
+
+    /**
+     * @param validate the validate to set
+     */
+    public void setValidate(boolean validate) {
+        this.validate = validate;
+    }
+
+    /**
+     * @param className the className to set
+     */
+    public void setClassName(String className) {
+        this.className = className;
+    }
+}

Copied: 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ScopedModelDriven.java
 (from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/ScopedModelDriven.java)
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ScopedModelDriven.java?view=diff&rev=449350&p1=struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/ScopedModelDriven.java&r1=449318&p2=struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ScopedModelDriven.java&r2=449350
==============================================================================
--- 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/ScopedModelDriven.java
 (original)
+++ 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ScopedModelDriven.java
 Sat Sep 23 21:09:38 2006
@@ -16,17 +16,17 @@
  *
  */
 
-package org.apache.ti.legacy;
+package org.apache.struts2.legacy;
 
-import com.opensymphony.xwork.ModelDriven;
+import com.opensymphony.xwork2.ModelDriven;
 
 /**
  * Adds the ability to set a model, probably retrieved from a given state.
  */
-public interface ScopedModelDriven extends ModelDriven {
+public interface ScopedModelDriven<T> extends ModelDriven {
 
     /**
      * Sets the model
      */
-    void setModel(Object model);
+    void setModel(T model);
 }

Copied: 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ScopedModelDrivenInterceptor.java
 (from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/ScopedModelDrivenInterceptor.java)
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ScopedModelDrivenInterceptor.java?view=diff&rev=449350&p1=struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/ScopedModelDrivenInterceptor.java&r1=449318&p2=struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ScopedModelDrivenInterceptor.java&r2=449350
==============================================================================
--- 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/ScopedModelDrivenInterceptor.java
 (original)
+++ 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/ScopedModelDrivenInterceptor.java
 Sat Sep 23 21:09:38 2006
@@ -16,55 +16,144 @@
  *
  */
 
-package org.apache.ti.legacy;
-
-import com.opensymphony.xwork.interceptor.ModelDrivenInterceptor;
-import com.opensymphony.xwork.ActionInvocation;
-import com.opensymphony.xwork.ActionContext;
-import com.opensymphony.xwork.ActionProxy;
-import com.opensymphony.xwork.config.entities.ActionConfig;
-import com.opensymphony.xwork.ObjectFactory;
+package org.apache.struts2.legacy;
 
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
 import java.util.Map;
 
+import com.opensymphony.xwork2.Action;
+import com.opensymphony.xwork2.ActionContext;
+import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.ObjectFactory;
+import com.opensymphony.xwork2.Validateable;
+import com.opensymphony.xwork2.ValidationAware;
+import com.opensymphony.xwork2.config.entities.ActionConfig;
+import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
+
 /**
- *  Retrieves the model class from the configured scope, then provides it 
- *  to the Action.
+ * <!-- START SNIPPET: description -->
+ *
+ * An interceptor that enables scoped model-driven actions.
+ *
+ * <p/>This interceptor only activates on actions that implement the [EMAIL 
PROTECTED] ScopedModelDriven} interface.  If
+ * detected, it will retrieve the model class from the configured scope, then 
provide it to the Action.
+ *  
+ * <!-- END SNIPPET: description -->
+ *
+ * <p/> <u>Interceptor parameters:</u>
+ *
+ * <!-- START SNIPPET: parameters -->
+ *
+ * <ul>
+ *
+ * <li>className - The model class name.  Defaults to the class name of the 
object returned by the getModel() method.</li>
+ *            
+ * <li>name - The key to use when storing or retrieving the instance in a 
scope.  Defaults to the model
+ *            class name.</li>
+ *
+ * <li>scope - The scope to store and retrieve the model.  Defaults to 
'request' but can also be 'session'.</li>
+ * </ul>
+ *
+ * <!-- END SNIPPET: parameters -->
+ *
+ * <p/> <u>Extending the interceptor:</u>
+ *
+ * <p/>
+ *
+ * <!-- START SNIPPET: extending -->
+ *
+ * There are no known extension points for this interceptor.
+ *
+ * <!-- END SNIPPET: extending -->
+ *
+ * <p/> <u>Example code:</u>
+ *
+ * <pre>
+ * <!-- START SNIPPET: example -->
+ * 
+ * &lt;-- Basic ussage --&gt;
+ * lt;interceptor name="scopedModelDriven" 
class="org.apache.struts2.legacy.ScopedModelDrivenInterceptor" /gt;
+ * 
+ * &lt;-- Using all available parameters --&gt;
+ * lt;interceptor name="gangsterForm" 
class="org.apache.struts2.legacy.ScopedModelDrivenInterceptor"gt;
+ *      lt;param name="scope"gt;sessionlt;/paramgt;
+ *      lt;param name="name"gt;gangsterFormlt;/paramgt;
+ *      lt;param 
name="className"gt;org.apache.struts2.showcase.legacy.GangsterFormlt;/paramgt;
+ *  lt;/interceptorgt;
+ * 
+ * <!-- END SNIPPET: example -->
+ * </pre>
  */
-public class ScopedModelDrivenInterceptor extends ModelDrivenInterceptor {
+public class ScopedModelDrivenInterceptor extends AbstractInterceptor {
 
-    protected void after(ActionInvocation dispatcher, String result) throws 
Exception {
+    private static final String GET_MODEL = "getModel";
+    private String scope;
+    private String name;
+    private String className;
+    
+    protected Object resolveModel(ObjectFactory factory, Map session, String 
modelClassName, String modelScope, String modelName) throws Exception {
+        Object model = null;
+        if (modelName == null) {
+            modelName = modelClassName;
+        }
+        if ("session".equals(modelScope)) {
+            model = session.get(modelName);
+            if (model == null) {
+                model = factory.buildBean(modelClassName, null);
+                session.put(modelName, model);
+            }
+        } else {
+            model = factory.buildBean(modelClassName, null);
+        }
+        return model;
     }
 
-    protected void before(ActionInvocation invocation) throws Exception {
+    public String intercept(ActionInvocation invocation) throws Exception {
         Object action = invocation.getAction();
 
         if (action instanceof ScopedModelDriven) {
             ScopedModelDriven modelDriven = (ScopedModelDriven) action;
-            ActionContext ctx = ActionContext.getContext();
-            ActionConfig config = invocation.getProxy().getConfig();
-            String scope = (String)config.getParams().get("modelScope");
-            String attr = (String)config.getParams().get("modelName");
-            String clsName = (String)config.getParams().get("modelClass");
-           
-            Object model = resolveModel(ObjectFactory.getObjectFactory(), 
ctx.getSession(), clsName, scope, attr);
-            modelDriven.setModel(model);
+            if (modelDriven.getModel() == null) {
+                ActionContext ctx = ActionContext.getContext();
+                ActionConfig config = invocation.getProxy().getConfig();
+                
+                String cName = className;
+                if (cName == null) {
+                    try {
+                        Method method = action.getClass().getMethod(GET_MODEL, 
new Class[0]);
+                        Class cls = method.getReturnType();
+                        cName = cls.getName();
+                    } catch (NoSuchMethodException e) {
+                        throw new IllegalArgumentException("The " + GET_MODEL 
+ "() is not defined in action " + action.getClass() + "");
+                    }
+                }
+                Object model = resolveModel(ObjectFactory.getObjectFactory(), 
ctx.getSession(), cName, scope, name);
+                modelDriven.setModel(model);
+            }
         }
-        super.before(invocation);
+        return invocation.invoke();
     }
 
-    protected Object resolveModel(ObjectFactory factory, Map session, String 
className, String scope, String name) throws Exception {
-        Object model = null;
-        if ("session".equals(scope)) {
-            model = session.get(name);
-            if (model == null) {
-                model = factory.buildBean(className, null);
-                session.put(name, model);
-            }
-        } else {
-            model = factory.buildBean(className, null);
-        }
-        return model;
+    /**
+     * @param className the className to set
+     */
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    /**
+     * @param name the name to set
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * @param scope the scope to set
+     */
+    public void setScope(String scope) {
+        this.scope = scope;
     }    
-                    
 }

Copied: 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/StrutsFactory.java
 (from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/StrutsFactory.java)
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/StrutsFactory.java?view=diff&rev=449350&p1=struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/StrutsFactory.java&r1=449318&p2=struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/StrutsFactory.java&r2=449350
==============================================================================
--- 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/StrutsFactory.java
 (original)
+++ 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/StrutsFactory.java
 Sat Sep 23 21:09:38 2006
@@ -16,12 +16,13 @@
  *
  */
 
-package org.apache.ti.legacy;
+package org.apache.struts2.legacy;
 
-import com.opensymphony.xwork.*;
-import com.opensymphony.xwork.config.entities.ActionConfig;
-import com.opensymphony.xwork.config.entities.ResultConfig;
-import com.opensymphony.xwork.config.entities.ExceptionMappingConfig;
+import com.opensymphony.xwork2.*;
+import com.opensymphony.xwork2.config.Configuration;
+import com.opensymphony.xwork2.config.entities.ActionConfig;
+import com.opensymphony.xwork2.config.entities.ResultConfig;
+import com.opensymphony.xwork2.config.entities.ExceptionMappingConfig;
 import org.apache.struts.action.*;
 import org.apache.struts.config.*;
 
@@ -34,19 +35,13 @@
  *  classes.
  */
 public class StrutsFactory {
-    private static StrutsFactory FACTORY = new StrutsFactory();
+    
+    private Configuration configuration;
 
-    protected StrutsFactory() {
+    public StrutsFactory(Configuration config) {
+        this.configuration = config;
     }
-
-    public static void setStrutsFactory(StrutsFactory factory) {
-        FACTORY = factory;
-    }
-
-    public static StrutsFactory getStrutsFactory() {
-        return FACTORY;
-    }
-
+    
     /**
      * Create a Struts 1.x ModuleConfig based on an XWork package 
configuration.
      * 
@@ -56,7 +51,7 @@
      */
     public ModuleConfig createModuleConfig(String packageName) {
         assert packageName != null;
-        return new WrapperModuleConfig(packageName);
+        return new WrapperModuleConfig(this, 
configuration.getPackageConfig(packageName));
     }
 
     /**
@@ -67,7 +62,7 @@
      */
     public ActionMapping createActionMapping(ActionConfig cfg) {
         assert cfg != null;
-        return new WrapperActionMapping(cfg);
+        return new WrapperActionMapping(this, cfg);
     }
 
     /**
@@ -82,7 +77,7 @@
     ActionMapping createActionMapping(ActionConfig cfg, String actionPath, 
ModuleConfig moduleConfig) {
         assert cfg != null;
         assert moduleConfig != null;
-        return new WrapperActionMapping(cfg, actionPath, moduleConfig);
+        return new WrapperActionMapping(this, cfg, actionPath, moduleConfig);
     }
 
     /**

Copied: 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperActionForward.java
 (from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/WrapperActionForward.java)
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperActionForward.java?view=diff&rev=449350&p1=struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/WrapperActionForward.java&r1=449318&p2=struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperActionForward.java&r2=449350
==============================================================================
--- 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/WrapperActionForward.java
 (original)
+++ 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperActionForward.java
 Sat Sep 23 21:09:38 2006
@@ -15,10 +15,10 @@
  *
  * $Header:$
  */
-package org.apache.ti.legacy;
+package org.apache.struts2.legacy;
 
 import org.apache.struts.action.ActionForward;
-import com.opensymphony.xwork.config.entities.ResultConfig;
+import com.opensymphony.xwork2.config.entities.ResultConfig;
 
 /**
  * Wrapper for a Struts 1.x ActionForward based on an XWork ResultConfig.  
Using a wrapper object

Copied: 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperActionMapping.java
 (from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/WrapperActionMapping.java)
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperActionMapping.java?view=diff&rev=449350&p1=struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/WrapperActionMapping.java&r1=449318&p2=struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperActionMapping.java&r2=449350
==============================================================================
--- 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/WrapperActionMapping.java
 (original)
+++ 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperActionMapping.java
 Sat Sep 23 21:09:38 2006
@@ -15,16 +15,16 @@
  *
  * $Header:$
  */
-package org.apache.ti.legacy;
+package org.apache.struts2.legacy;
 
 import org.apache.struts.action.ActionMapping;
 import org.apache.struts.action.ActionForward;
 import org.apache.struts.config.ModuleConfig;
 import org.apache.struts.config.ExceptionConfig;
 import org.apache.struts.config.ForwardConfig;
-import com.opensymphony.xwork.config.entities.ActionConfig;
-import com.opensymphony.xwork.config.entities.ResultConfig;
-import com.opensymphony.xwork.config.entities.ExceptionMappingConfig;
+import com.opensymphony.xwork2.config.entities.ActionConfig;
+import com.opensymphony.xwork2.config.entities.ResultConfig;
+import com.opensymphony.xwork2.config.entities.ExceptionMappingConfig;
 
 import java.util.Iterator;
 import java.util.Map;
@@ -39,15 +39,17 @@
 
     private ActionConfig delegate;
     private String actionPath;
+    private StrutsFactory strutsFactory;
 
-    public WrapperActionMapping(ActionConfig delegate) {
+    public WrapperActionMapping(StrutsFactory factory, ActionConfig delegate) {
         this.delegate = delegate;
+        this.strutsFactory = factory;
         forwards = null;
         exceptions = null;
     }
 
-    public WrapperActionMapping(ActionConfig delegate, String actionPath, 
ModuleConfig moduleConfig) {
-        this(delegate);
+    public WrapperActionMapping(StrutsFactory factory, ActionConfig delegate, 
String actionPath, ModuleConfig moduleConfig) {
+        this(factory, delegate);
         this.moduleConfig = moduleConfig;
         this.actionPath = actionPath;
     }
@@ -58,7 +60,6 @@
     private void initActionForwards() {
         if (forwards == null) {
             forwards = new HashMap();
-            StrutsFactory strutsFactory = StrutsFactory.getStrutsFactory();
             Map results = delegate.getResults();
             for (Iterator i = results.entrySet().iterator(); i.hasNext();) {
                 Map.Entry entry = (Map.Entry) i.next();
@@ -74,7 +75,6 @@
     private void initExceptionConfigs() {
         if (exceptions == null) {
             exceptions = new HashMap();
-            StrutsFactory strutsFactory = StrutsFactory.getStrutsFactory();
             List exceptionMappings = delegate.getExceptionMappings();
             for (Iterator i = exceptionMappings.iterator(); i.hasNext();) {
                 ExceptionConfig wrapper = 
strutsFactory.createExceptionConfig((ExceptionMappingConfig) i.next());
@@ -124,7 +124,6 @@
 
     public ModuleConfig getModuleConfig() {
         if (moduleConfig == null) {
-            StrutsFactory strutsFactory = StrutsFactory.getStrutsFactory();
             moduleConfig = 
strutsFactory.createModuleConfig(delegate.getPackageName());
         }
 

Copied: 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperExceptionConfig.java
 (from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/WrapperExceptionConfig.java)
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperExceptionConfig.java?view=diff&rev=449350&p1=struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/WrapperExceptionConfig.java&r1=449318&p2=struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperExceptionConfig.java&r2=449350
==============================================================================
--- 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/WrapperExceptionConfig.java
 (original)
+++ 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperExceptionConfig.java
 Sat Sep 23 21:09:38 2006
@@ -15,9 +15,9 @@
  *
  * $Header:$
  */
-package org.apache.ti.legacy;
+package org.apache.struts2.legacy;
 
-import com.opensymphony.xwork.config.entities.ExceptionMappingConfig;
+import com.opensymphony.xwork2.config.entities.ExceptionMappingConfig;
 import org.apache.struts.config.ExceptionConfig;
 
 /**

Copied: 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperModuleConfig.java
 (from r449318, 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/WrapperModuleConfig.java)
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperModuleConfig.java?view=diff&rev=449350&p1=struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/WrapperModuleConfig.java&r1=449318&p2=struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperModuleConfig.java&r2=449350
==============================================================================
--- 
struts/sandbox/trunk/ti/phase1/jars/legacy/src/java/org/apache/ti/legacy/WrapperModuleConfig.java
 (original)
+++ 
struts/struts2/trunk/legacy/src/main/java/org/apache/struts2/legacy/WrapperModuleConfig.java
 Sat Sep 23 21:09:38 2006
@@ -15,25 +15,24 @@
  *
  * $Header:$
  */
-package org.apache.ti.legacy;
+package org.apache.struts2.legacy;
 
-import org.apache.struts.config.ModuleConfig;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.struts.config.ActionConfig;
 import org.apache.struts.config.ControllerConfig;
-import org.apache.struts.config.DataSourceConfig;
 import org.apache.struts.config.ExceptionConfig;
 import org.apache.struts.config.FormBeanConfig;
 import org.apache.struts.config.ForwardConfig;
 import org.apache.struts.config.MessageResourcesConfig;
+import org.apache.struts.config.ModuleConfig;
 import org.apache.struts.config.PlugInConfig;
-import org.apache.struts.config.ActionConfig;
-import com.opensymphony.xwork.config.ConfigurationManager;
-import com.opensymphony.xwork.config.entities.PackageConfig;
-import com.opensymphony.xwork.config.entities.ExceptionMappingConfig;
-import com.opensymphony.xwork.config.entities.ResultConfig;
 
-import java.util.Map;
-import java.util.Iterator;
-import java.util.HashMap;
+import com.opensymphony.xwork2.config.entities.ExceptionMappingConfig;
+import com.opensymphony.xwork2.config.entities.PackageConfig;
+import com.opensymphony.xwork2.config.entities.ResultConfig;
 
 /**
  * Wrapper for a Struts 1.x ModuleConfig based on an XWork PackageConfig.  
Using a wrapper object
@@ -41,13 +40,15 @@
  */
 class WrapperModuleConfig implements ModuleConfig {
 
+    private StrutsFactory strutsFactory;
     private PackageConfig delegate;
     private Map _actionMappings;
     private Map _exceptionConfigs;
     private Map _actionForwards;
 
-    public WrapperModuleConfig(String packageName) {
-        delegate = 
ConfigurationManager.getConfiguration().getPackageConfig(packageName);
+    public WrapperModuleConfig(StrutsFactory factory, PackageConfig config) {
+        delegate = config;
+        this.strutsFactory = factory;
     }
 
     /**
@@ -57,12 +58,11 @@
 
         if (_actionMappings == null) {
             _actionMappings = new HashMap();
-            StrutsFactory strutsFactory = StrutsFactory.getStrutsFactory();
             for (Iterator i = 
delegate.getActionConfigs().entrySet().iterator(); i.hasNext();) {
                 Map.Entry entry = (Map.Entry) i.next();
                 String actionPath = '/' + (String) entry.getKey();
-                com.opensymphony.xwork.config.entities.ActionConfig 
actionConfig =
-                        (com.opensymphony.xwork.config.entities.ActionConfig) 
entry.getValue();
+                com.opensymphony.xwork2.config.entities.ActionConfig 
actionConfig =
+                        (com.opensymphony.xwork2.config.entities.ActionConfig) 
entry.getValue();
                 _actionMappings.put(actionPath, 
strutsFactory.createActionMapping(actionConfig, actionPath, this));
             }
         }
@@ -74,7 +74,6 @@
     private void initExceptionConfigs() {
         if (_exceptionConfigs == null) {
             _exceptionConfigs = new HashMap();
-            StrutsFactory strutsFactory = StrutsFactory.getStrutsFactory();
             for (Iterator i = 
delegate.getGlobalExceptionMappingConfigs().iterator(); i.hasNext();) {
                 ExceptionMappingConfig config = (ExceptionMappingConfig) 
i.next();
                 _exceptionConfigs.put(config.getExceptionClassName(), 
strutsFactory.createExceptionConfig(config));
@@ -88,7 +87,6 @@
     private void initActionForwards() {
         if (_actionForwards == null) {
             _actionForwards = new HashMap();
-            StrutsFactory strutsFactory = StrutsFactory.getStrutsFactory();
             for (Iterator i = 
delegate.getGlobalResultConfigs().entrySet().iterator(); i.hasNext();) {
                 Map.Entry entry = (Map.Entry) i.next();
                 String name = (String) entry.getKey();
@@ -138,10 +136,6 @@
         throw new UnsupportedOperationException("Not implemented - immutable");
     }
 
-    public void addDataSourceConfig(DataSourceConfig config) {
-        throw new UnsupportedOperationException("Not implemented - immutable");
-    }
-
     public void addExceptionConfig(ExceptionConfig config) {
         throw new UnsupportedOperationException("Not implemented - immutable");
     }
@@ -180,14 +174,6 @@
         return (ActionConfig[]) _actionMappings.values().toArray(new 
ActionConfig[_actionMappings.size()]);
     }
 
-    public DataSourceConfig findDataSourceConfig(String key) {
-        throw new UnsupportedOperationException("NYI");
-    }
-
-    public DataSourceConfig[] findDataSourceConfigs() {
-        throw new UnsupportedOperationException("NYI");
-    }
-
     public ExceptionConfig findExceptionConfig(String type) {
         initExceptionConfigs();
         return (ExceptionConfig) _exceptionConfigs.get(type);
@@ -240,10 +226,6 @@
         throw new UnsupportedOperationException("Not implemented - immutable");
     }
 
-    public void removeDataSourceConfig(DataSourceConfig config) {
-        throw new UnsupportedOperationException("Not implemented - immutable");
-    }
-
     public void removeFormBeanConfig(FormBeanConfig config) {
         throw new UnsupportedOperationException("Not implemented - immutable");
     }
@@ -254,5 +236,9 @@
 
     public void removeMessageResourcesConfig(MessageResourcesConfig config) {
         throw new UnsupportedOperationException("Not implemented - immutable");
+    }
+
+    public ExceptionConfig findException(Class arg0) {
+        throw new UnsupportedOperationException("NYI");
     }
 }


Reply via email to