From 391b8ce2c307cfd605ec3f40f8e27b4d65b26b2f Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 23 Oct 2013 07:33:44 +0000 Subject: [PATCH] WW-4131 Implements new ActionProxyFactory to cooperate with PrefixBasedActionMapper git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/trunk@1534936 13f79535-47bb-0310-9956-ffa450edef68 --- .../impl/PrefixBasedActionProxyFactory.java | 87 +++++++++++++++++++ .../impl/StrutsActionProxyFactory.java | 2 - core/src/main/resources/struts-default.xml | 1 + .../xwork2/DefaultActionProxyFactory.java | 5 ++ 4 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 core/src/main/java/org/apache/struts2/impl/PrefixBasedActionProxyFactory.java diff --git a/core/src/main/java/org/apache/struts2/impl/PrefixBasedActionProxyFactory.java b/core/src/main/java/org/apache/struts2/impl/PrefixBasedActionProxyFactory.java new file mode 100644 index 000000000..72b5993b2 --- /dev/null +++ b/core/src/main/java/org/apache/struts2/impl/PrefixBasedActionProxyFactory.java @@ -0,0 +1,87 @@ +package org.apache.struts2.impl; + +import com.opensymphony.xwork2.ActionProxy; +import com.opensymphony.xwork2.ActionProxyFactory; +import com.opensymphony.xwork2.DefaultActionProxyFactory; +import com.opensymphony.xwork2.inject.Container; +import com.opensymphony.xwork2.inject.Inject; +import com.opensymphony.xwork2.util.logging.Logger; +import com.opensymphony.xwork2.util.logging.LoggerFactory; +import org.apache.struts2.StrutsConstants; + +import java.util.HashMap; +import java.util.Map; + +/** + * + * Prefix based factory should be used with {@link org.apache.struts2.dispatcher.mapper.PrefixBasedActionMapper} + * to use appropriate {@link com.opensymphony.xwork2.ActionProxyFactory} connected with given + * {@link org.apache.struts2.dispatcher.mapper.ActionMapper} + * + * Add below entry to struts.xml to enable the factory: + * <constant name="struts.actionProxyFactory" value="prefix"/> + * + * The factory will use the same set of patterns as defined with: + * <constant name="struts.mapper.prefixMapping" value="..."/> + * + */ +public class PrefixBasedActionProxyFactory extends DefaultActionProxyFactory { + + private static final Logger LOG = LoggerFactory.getLogger(PrefixBasedActionProxyFactory.class); + + private Map actionProxyFactories = new HashMap(); + private ActionProxyFactory defaultFactory; + + @Inject + public void setContainer(Container container) { + this.container = container; + } + + @Inject(StrutsConstants.STRUTS_ACTIONPROXYFACTORY) + public void setActionProxyFactory(ActionProxyFactory factory) { + this.defaultFactory = factory; + } + + @Inject(StrutsConstants.PREFIX_BASED_MAPPER_CONFIGURATION) + public void setPrefixBasedActionProxyFactories(String list) { + if (list != null) { + String[] factories = list.split(","); + for (String factory : factories) { + String[] thisFactory = factory.split(":"); + if ((thisFactory != null) && (thisFactory.length == 2)) { + String factoryPrefix = thisFactory[0].trim(); + String factoryName = thisFactory[1].trim(); + ActionProxyFactory obj = container.getInstance(ActionProxyFactory.class, factoryName); + if (obj != null) { + actionProxyFactories.put(factoryPrefix, obj); + } else if (LOG.isWarnEnabled()) { + LOG.warn("Invalid PrefixBasedActionProxyFactory config entry: [#0]", factory); + } + } + } + } + } + + public ActionProxy createActionProxy(String namespace, String actionName, String methodName, + Map extraContext, boolean executeResult, boolean cleanupContext) { + + String uri = namespace + (namespace.endsWith("/") ? actionName : "/" + actionName); + for (int lastIndex = uri.lastIndexOf('/'); lastIndex > (-1); lastIndex = uri.lastIndexOf('/', lastIndex - 1)) { + String key = uri.substring(0, lastIndex); + ActionProxyFactory actionProxyFactory = actionProxyFactories.get(key); + if (actionProxyFactory != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("Using ActionProxyFactory [#0] for prefix [#1]", actionProxyFactory, key); + } + return actionProxyFactory.createActionProxy(namespace, actionName, methodName, extraContext, executeResult, cleanupContext); + } else if (LOG.isDebugEnabled()) { + LOG.debug("No ActionProxyFactory defined for [#1]", key); + } + } + if (LOG.isDebugEnabled()){ + LOG.debug("Cannot find any matching ActionProxyFactory, falling back to [#0]", defaultFactory); + } + return defaultFactory.createActionProxy(namespace, actionName, methodName, extraContext, executeResult, cleanupContext); + } + +} diff --git a/core/src/main/java/org/apache/struts2/impl/StrutsActionProxyFactory.java b/core/src/main/java/org/apache/struts2/impl/StrutsActionProxyFactory.java index be7c2edff..7df930d49 100644 --- a/core/src/main/java/org/apache/struts2/impl/StrutsActionProxyFactory.java +++ b/core/src/main/java/org/apache/struts2/impl/StrutsActionProxyFactory.java @@ -23,8 +23,6 @@ package org.apache.struts2.impl; -import java.util.Map; - import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ActionProxy; import com.opensymphony.xwork2.DefaultActionProxyFactory; diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml index d2987d7c3..dc626d504 100644 --- a/core/src/main/resources/struts-default.xml +++ b/core/src/main/resources/struts-default.xml @@ -48,6 +48,7 @@ + diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionProxyFactory.java b/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionProxyFactory.java index ba0e8fa3f..5c7db7a5a 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionProxyFactory.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionProxyFactory.java @@ -71,4 +71,9 @@ public class DefaultActionProxyFactory implements ActionProxyFactory { return proxy; } + @Override + public String toString() { + return getClass().getSimpleName(); + } + }