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;
+
+}