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 --> + * + * <-- Basic ussage --> + * lt;interceptor name="scopedModelDriven" class="org.apache.struts2.legacy.ScopedModelDrivenInterceptor" /gt; + * + * <-- Using all available parameters --> + * 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"); } }