You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2014/07/20 10:43:41 UTC
git commit: WW-4160 Adds UnknownHandlerFactory to allow override This
can be used to implement different factories with different backing DI
container ie. Spring
Repository: struts
Updated Branches:
refs/heads/develop 351263a67 -> de5edd875
WW-4160 Adds UnknownHandlerFactory to allow override
This can be used to implement different factories with different
backing DI container ie. Spring
Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/de5edd87
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/de5edd87
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/de5edd87
Branch: refs/heads/develop
Commit: de5edd875fa766ad6214b7b4aef8daf369d360ea
Parents: 351263a
Author: Lukasz Lenart <lu...@apache.org>
Authored: Sun Jul 20 10:43:30 2014 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Sun Jul 20 10:43:30 2014 +0200
----------------------------------------------------------------------
.../org/apache/struts2/StrutsConstants.java | 6 +---
.../config/DefaultBeanSelectionProvider.java | 2 ++
core/src/main/resources/struts-default.xml | 1 +
.../xwork2/DefaultUnknownHandlerManager.java | 30 +++++++++++---------
.../com/opensymphony/xwork2/ObjectFactory.java | 19 +++++++++++++
.../config/impl/DefaultConfiguration.java | 4 ++-
.../providers/XWorkConfigurationProvider.java | 3 ++
.../factory/DefaultUnknownHandlerFactory.java | 25 ++++++++++++++++
.../xwork2/factory/UnknownHandlerFactory.java | 21 ++++++++++++++
9 files changed, 91 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/struts/blob/de5edd87/core/src/main/java/org/apache/struts2/StrutsConstants.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/StrutsConstants.java b/core/src/main/java/org/apache/struts2/StrutsConstants.java
index 918f91b..10deced 100644
--- a/core/src/main/java/org/apache/struts2/StrutsConstants.java
+++ b/core/src/main/java/org/apache/struts2/StrutsConstants.java
@@ -63,16 +63,12 @@ public final class StrutsConstants {
/** The com.opensymphony.xwork2.ObjectFactory implementation class */
public static final String STRUTS_OBJECTFACTORY = "struts.objectFactory";
-
public static final String STRUTS_OBJECTFACTORY_ACTIONFACTORY = "struts.objectFactory.actionFactory";
-
public static final String STRUTS_OBJECTFACTORY_RESULTFACTORY = "struts.objectFactory.resultFactory";
-
public static final String STRUTS_OBJECTFACTORY_CONVERTERFACTORY = "struts.objectFactory.converterFactory";
-
public static final String STRUTS_OBJECTFACTORY_INTERCEPTORFACTORY = "struts.objectFactory.interceptorFactory";
-
public static final String STRUTS_OBJECTFACTORY_VALIDATORFACTORY = "struts.objectFactory.validatorFactory";
+ public static final String STRUTS_OBJECTFACTORY_UNKNOWNHANDLERFACTORY = "struts.objectFactory.unknownHandlerFactory";
/** The com.opensymphony.xwork2.util.FileManager implementation class */
public static final String STRUTS_FILE_MANAGER_FACTORY = "struts.fileManagerFactory";
http://git-wip-us.apache.org/repos/asf/struts/blob/de5edd87/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java b/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java
index 06b7302..8999a31 100644
--- a/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java
+++ b/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java
@@ -22,6 +22,7 @@
package org.apache.struts2.config;
import com.opensymphony.xwork2.ActionProxyFactory;
+import com.opensymphony.xwork2.factory.UnknownHandlerFactory;
import com.opensymphony.xwork2.security.AcceptedPatternsChecker;
import com.opensymphony.xwork2.security.ExcludedPatternsChecker;
import com.opensymphony.xwork2.FileManager;
@@ -352,6 +353,7 @@ public class DefaultBeanSelectionProvider extends AbstractBeanSelectionProvider
alias(ConverterFactory.class, StrutsConstants.STRUTS_OBJECTFACTORY_CONVERTERFACTORY, builder, props);
alias(InterceptorFactory.class, StrutsConstants.STRUTS_OBJECTFACTORY_INTERCEPTORFACTORY, builder, props);
alias(ValidatorFactory.class, StrutsConstants.STRUTS_OBJECTFACTORY_VALIDATORFACTORY, builder, props);
+ alias(UnknownHandlerFactory.class, StrutsConstants.STRUTS_OBJECTFACTORY_UNKNOWNHANDLERFACTORY, builder, props);
alias(FileManagerFactory.class, StrutsConstants.STRUTS_FILE_MANAGER_FACTORY, builder, props, Scope.SINGLETON);
http://git-wip-us.apache.org/repos/asf/struts/blob/de5edd87/core/src/main/resources/struts-default.xml
----------------------------------------------------------------------
diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml
index ea2a631..6628c53 100644
--- a/core/src/main/resources/struts-default.xml
+++ b/core/src/main/resources/struts-default.xml
@@ -60,6 +60,7 @@
<bean type="com.opensymphony.xwork2.factory.ConverterFactory" name="struts" class="com.opensymphony.xwork2.factory.DefaultConverterFactory" />
<bean type="com.opensymphony.xwork2.factory.InterceptorFactory" name="struts" class="com.opensymphony.xwork2.factory.DefaultInterceptorFactory" />
<bean type="com.opensymphony.xwork2.factory.ValidatorFactory" name="struts" class="com.opensymphony.xwork2.factory.DefaultValidatorFactory" />
+ <bean type="com.opensymphony.xwork2.factory.UnknownHandlerFactory" name="struts" class="com.opensymphony.xwork2.factory.DefaultUnknownHandlerFactory" />
<bean type="com.opensymphony.xwork2.FileManager" class="com.opensymphony.xwork2.util.fs.DefaultFileManager" name="system" scope="singleton"/>
<bean type="com.opensymphony.xwork2.FileManagerFactory" class="com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory" name="struts" scope="singleton"/>
http://git-wip-us.apache.org/repos/asf/struts/blob/de5edd87/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultUnknownHandlerManager.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultUnknownHandlerManager.java b/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultUnknownHandlerManager.java
index b1e36d5..b0fffd5 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultUnknownHandlerManager.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultUnknownHandlerManager.java
@@ -16,12 +16,14 @@
package com.opensymphony.xwork2;
import com.opensymphony.xwork2.config.Configuration;
+import com.opensymphony.xwork2.config.ConfigurationException;
import com.opensymphony.xwork2.config.entities.ActionConfig;
import com.opensymphony.xwork2.config.entities.UnknownHandlerConfig;
import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.inject.Inject;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.Set;
@@ -31,27 +33,29 @@ import java.util.Set;
* @see com.opensymphony.xwork2.UnknownHandlerManager
*/
public class DefaultUnknownHandlerManager implements UnknownHandlerManager {
- protected ArrayList<UnknownHandler> unknownHandlers;
- private Configuration configuration;
+
private Container container;
- @Inject
- public void setConfiguration(Configuration configuration) {
- this.configuration = configuration;
- build();
- }
+ protected ArrayList<UnknownHandler> unknownHandlers;
@Inject
public void setContainer(Container container) {
this.container = container;
- build();
+ try {
+ build();
+ } catch (Exception e) {
+ throw new ConfigurationException(e);
+ }
}
/**
- * Builds a list of UnknowHandlers in the order specified by the configured "unknown-handler-stack".
- * If "unknown-handler-stack" was not configured, all UnknowHandlers will be returned, in no specific order
+ * Builds a list of UnknownHandlers in the order specified by the configured "unknown-handler-stack".
+ * If "unknown-handler-stack" was not configured, all UnknownHandlers will be returned, in no specific order
*/
- protected void build() {
+ protected void build() throws Exception {
+ Configuration configuration = container.getInstance(Configuration.class);
+ ObjectFactory factory = container.getInstance(ObjectFactory.class);
+
if (configuration != null && container != null) {
List<UnknownHandlerConfig> unkownHandlerStack = configuration.getUnknownHandlerStack();
unknownHandlers = new ArrayList<UnknownHandler>();
@@ -59,7 +63,7 @@ public class DefaultUnknownHandlerManager implements UnknownHandlerManager {
if (unkownHandlerStack != null && !unkownHandlerStack.isEmpty()) {
//get UnknownHandlers in the specified order
for (UnknownHandlerConfig unknownHandlerConfig : unkownHandlerStack) {
- UnknownHandler uh = container.getInstance(UnknownHandler.class, unknownHandlerConfig.getName());
+ UnknownHandler uh = factory.buildUnknownHandler(unknownHandlerConfig.getName(), new HashMap<String, Object>());
unknownHandlers.add(uh);
}
} else {
@@ -103,8 +107,6 @@ public class DefaultUnknownHandlerManager implements UnknownHandlerManager {
/**
* Iterate over UnknownHandlers and return the result of the first one that can handle it
- *
- * @throws NoSuchMethodException
*/
public ActionConfig handleUnknownAction(String namespace, String actionName) {
for (UnknownHandler unknownHandler : unknownHandlers) {
http://git-wip-us.apache.org/repos/asf/struts/blob/de5edd87/xwork-core/src/main/java/com/opensymphony/xwork2/ObjectFactory.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/ObjectFactory.java b/xwork-core/src/main/java/com/opensymphony/xwork2/ObjectFactory.java
index dd51adf..bdee961 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/ObjectFactory.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/ObjectFactory.java
@@ -24,6 +24,7 @@ import com.opensymphony.xwork2.factory.ActionFactory;
import com.opensymphony.xwork2.factory.ConverterFactory;
import com.opensymphony.xwork2.factory.InterceptorFactory;
import com.opensymphony.xwork2.factory.ResultFactory;
+import com.opensymphony.xwork2.factory.UnknownHandlerFactory;
import com.opensymphony.xwork2.factory.ValidatorFactory;
import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.inject.Inject;
@@ -59,6 +60,7 @@ public class ObjectFactory implements Serializable {
private InterceptorFactory interceptorFactory;
private ValidatorFactory validatorFactory;
private ConverterFactory converterFactory;
+ private UnknownHandlerFactory unknownHandlerFactory;
@Inject(value="objectFactory.classloader", required=false)
public void setClassLoader(ClassLoader cl) {
@@ -95,6 +97,11 @@ public class ObjectFactory implements Serializable {
this.converterFactory = converterFactory;
}
+ @Inject
+ public void setUnknownHandlerFactory(UnknownHandlerFactory unknownHandlerFactory) {
+ this.unknownHandlerFactory = unknownHandlerFactory;
+ }
+
/**
* @deprecated Since 2.1
*/
@@ -234,4 +241,16 @@ public class ObjectFactory implements Serializable {
return converterFactory.buildConverter(converterClass, extraContext);
}
+ /**
+ * Builds unknown handler
+ *
+ * @param unknownHandlerName
+ * @param extraContext
+ * @return
+ * @throws Exception
+ */
+ public UnknownHandler buildUnknownHandler(String unknownHandlerName, Map<String, Object> extraContext) throws Exception {
+ return unknownHandlerFactory.buildUnknownHandler(unknownHandlerName, extraContext);
+ }
+
}
http://git-wip-us.apache.org/repos/asf/struts/blob/de5edd87/xwork-core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java b/xwork-core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java
index 8fea5d2..0192729 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java
@@ -63,8 +63,10 @@ import com.opensymphony.xwork2.factory.DefaultActionFactory;
import com.opensymphony.xwork2.factory.DefaultConverterFactory;
import com.opensymphony.xwork2.factory.DefaultInterceptorFactory;
import com.opensymphony.xwork2.factory.DefaultResultFactory;
+import com.opensymphony.xwork2.factory.DefaultUnknownHandlerFactory;
import com.opensymphony.xwork2.factory.InterceptorFactory;
import com.opensymphony.xwork2.factory.ResultFactory;
+import com.opensymphony.xwork2.factory.UnknownHandlerFactory;
import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.inject.ContainerBuilder;
import com.opensymphony.xwork2.inject.Context;
@@ -308,7 +310,7 @@ public class DefaultConfiguration implements Configuration {
builder.factory(InterceptorFactory.class, DefaultInterceptorFactory.class, Scope.SINGLETON);
builder.factory(com.opensymphony.xwork2.factory.ValidatorFactory.class, com.opensymphony.xwork2.factory.DefaultValidatorFactory.class, Scope.SINGLETON);
builder.factory(ConverterFactory.class, DefaultConverterFactory.class, Scope.SINGLETON);
-
+ builder.factory(UnknownHandlerFactory.class, DefaultUnknownHandlerFactory.class, Scope.SINGLETON);
builder.factory(FileManager.class, "system", DefaultFileManager.class, Scope.SINGLETON);
if (!fmFactoryRegistered) {
http://git-wip-us.apache.org/repos/asf/struts/blob/de5edd87/xwork-core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java b/xwork-core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java
index 19e8e76..4ade520 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java
@@ -2,6 +2,8 @@ package com.opensymphony.xwork2.config.providers;
import com.opensymphony.xwork2.ActionProxyFactory;
import com.opensymphony.xwork2.DefaultActionProxyFactory;
+import com.opensymphony.xwork2.factory.DefaultUnknownHandlerFactory;
+import com.opensymphony.xwork2.factory.UnknownHandlerFactory;
import com.opensymphony.xwork2.security.AcceptedPatternsChecker;
import com.opensymphony.xwork2.security.DefaultAcceptedPatternsChecker;
import com.opensymphony.xwork2.security.DefaultExcludedPatternsChecker;
@@ -121,6 +123,7 @@ public class XWorkConfigurationProvider implements ConfigurationProvider {
.factory(InterceptorFactory.class, DefaultInterceptorFactory.class)
.factory(com.opensymphony.xwork2.factory.ValidatorFactory.class, com.opensymphony.xwork2.factory.DefaultValidatorFactory.class)
.factory(ConverterFactory.class, DefaultConverterFactory.class)
+ .factory(UnknownHandlerFactory.class, DefaultUnknownHandlerFactory.class)
.factory(ActionProxyFactory.class, DefaultActionProxyFactory.class, Scope.SINGLETON)
.factory(ObjectTypeDeterminer.class, DefaultObjectTypeDeterminer.class, Scope.SINGLETON)
http://git-wip-us.apache.org/repos/asf/struts/blob/de5edd87/xwork-core/src/main/java/com/opensymphony/xwork2/factory/DefaultUnknownHandlerFactory.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/factory/DefaultUnknownHandlerFactory.java b/xwork-core/src/main/java/com/opensymphony/xwork2/factory/DefaultUnknownHandlerFactory.java
new file mode 100644
index 0000000..58fb339
--- /dev/null
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/factory/DefaultUnknownHandlerFactory.java
@@ -0,0 +1,25 @@
+package com.opensymphony.xwork2.factory;
+
+import com.opensymphony.xwork2.UnknownHandler;
+import com.opensymphony.xwork2.inject.Container;
+import com.opensymphony.xwork2.inject.Inject;
+
+import java.util.Map;
+
+/**
+ * Default implementation
+ */
+public class DefaultUnknownHandlerFactory implements UnknownHandlerFactory {
+
+ private Container container;
+
+ @Inject
+ public void setContainer(Container container) {
+ this.container = container;
+ }
+
+ public UnknownHandler buildUnknownHandler(String unknownHandlerName, Map<String, Object> extraContext) throws Exception {
+ return container.getInstance(UnknownHandler.class, unknownHandlerName);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/struts/blob/de5edd87/xwork-core/src/main/java/com/opensymphony/xwork2/factory/UnknownHandlerFactory.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/factory/UnknownHandlerFactory.java b/xwork-core/src/main/java/com/opensymphony/xwork2/factory/UnknownHandlerFactory.java
new file mode 100644
index 0000000..244f3ab
--- /dev/null
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/factory/UnknownHandlerFactory.java
@@ -0,0 +1,21 @@
+package com.opensymphony.xwork2.factory;
+
+import com.opensymphony.xwork2.UnknownHandler;
+
+import java.util.Map;
+
+/**
+ * Dedicated interface used by {@link com.opensymphony.xwork2.ObjectFactory} to build {@link com.opensymphony.xwork2.UnknownHandler}
+ */
+public interface UnknownHandlerFactory {
+
+ /**
+ * Builds unknown handler of given name
+ *
+ * @param unknownHandlerName name of unknown handler defined in struts.xml
+ * @param extraContext extra params
+ * @return instance of {@link com.opensymphony.xwork2.UnknownHandler} with injected dependencies
+ */
+ UnknownHandler buildUnknownHandler(String unknownHandlerName, Map<String, Object> extraContext) throws Exception;
+
+}