Author: musachy
Date: Tue May 13 18:21:16 2008
New Revision: 656074

URL: http://svn.apache.org/viewvc?rev=656074&view=rev
Log:
Add params to Interceptors in @Action

Added:
    
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/DefaultInterceptorMapBuilder.java
    
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/InterceptorMapBuilder.java
    
struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/TestInterceptor.java
Modified:
    
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
    
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/annotation/InterceptorRef.java
    
struts/sandbox/trunk/struts2-convention-plugin/src/main/resources/struts-plugin.xml
    
struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
    
struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/actions/interceptor/InterceptorsAction.java

Added: 
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/DefaultInterceptorMapBuilder.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/DefaultInterceptorMapBuilder.java?rev=656074&view=auto
==============================================================================
--- 
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/DefaultInterceptorMapBuilder.java
 (added)
+++ 
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/DefaultInterceptorMapBuilder.java
 Tue May 13 18:21:16 2008
@@ -0,0 +1,110 @@
+/*
+ * $ID$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.struts2.convention;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.struts2.convention.annotation.Action;
+import org.apache.struts2.convention.annotation.InterceptorRef;
+
+import com.opensymphony.xwork2.ObjectFactory;
+import com.opensymphony.xwork2.config.Configuration;
+import com.opensymphony.xwork2.config.ConfigurationException;
+import com.opensymphony.xwork2.config.entities.InterceptorMapping;
+import com.opensymphony.xwork2.config.entities.PackageConfig;
+import com.opensymphony.xwork2.config.providers.InterceptorBuilder;
+import com.opensymphony.xwork2.inject.Inject;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
+
+/**
+ * <p>
+ * Builds interceptor mappings from annotations.
+ * </p>
+ */
+public class DefaultInterceptorMapBuilder implements InterceptorMapBuilder {
+       private static final Logger LOG = LoggerFactory
+                       .getLogger(DefaultInterceptorMapBuilder.class);
+
+       private Configuration configuration;
+
+       public List<InterceptorMapping> build(PackageConfig.Builder builder,
+                       String actionName, Action annotation) {
+               List<InterceptorMapping> interceptorList = new 
ArrayList<InterceptorMapping>(
+                               10);
+
+               if (annotation != null) {
+                       InterceptorRef[] interceptors = 
annotation.interceptorRefs();
+                       if (interceptors != null) {
+                               for (InterceptorRef interceptor : interceptors) 
{
+                                       if (LOG.isTraceEnabled())
+                                               LOG.trace("Adding interceptor 
[#0] to [#1]",
+                                                               
interceptor.value(), actionName);
+                                       Map<String, String> params = 
createParameterMap(interceptor
+                                                       .params());
+                                       
interceptorList.addAll(buildInterceptorList(builder,
+                                                       interceptor, params));
+                               }
+                       }
+               }
+
+               return interceptorList;
+       }
+
+       protected Map<String, String> createParameterMap(String[] parms) {
+               Map<String, String> map = new HashMap<String, String>();
+               int subtract = parms.length % 2;
+               if (subtract != 0) {
+                       throw new ConfigurationException(
+                                       "The InterceptorRef annotation uses an 
array of strings for"
+                                                       + " parameters and they 
must be in a key value pair configuration. It looks like you"
+                                                       + " have specified an 
odd number of parameters and there should only be an even number."
+                                                       + " (e.g. params = 
{\"key\", \"value\"})");
+               }
+
+               for (int i = 0; i < parms.length; i = i + 2) {
+                       String key = parms[i];
+                       String value = parms[i + 1];
+                       map.put(key, value);
+                       if (LOG.isTraceEnabled()) {
+                               LOG.trace("Adding parmeter [#0:#1] to 
interceptor", key, value);
+                       }
+               }
+
+               return map;
+       }
+
+       protected List<InterceptorMapping> buildInterceptorList(
+                       PackageConfig.Builder builder, InterceptorRef ref, Map 
params) {
+               return 
InterceptorBuilder.constructInterceptorReference(builder, ref
+                               .value(), params, builder.build().getLocation(),
+                               (ObjectFactory) 
configuration.getContainer().getInstance(
+                                               ObjectFactory.class));
+       }
+
+       @Inject
+       public void setConfiguration(Configuration configuration) {
+               this.configuration = configuration;
+       }
+}

Added: 
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/InterceptorMapBuilder.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/InterceptorMapBuilder.java?rev=656074&view=auto
==============================================================================
--- 
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/InterceptorMapBuilder.java
 (added)
+++ 
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/InterceptorMapBuilder.java
 Tue May 13 18:21:16 2008
@@ -0,0 +1,48 @@
+/*
+ * $ID$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.struts2.convention;
+
+import java.util.List;
+
+import org.apache.struts2.convention.annotation.Action;
+
+import com.opensymphony.xwork2.config.entities.InterceptorMapping;
+import com.opensymphony.xwork2.config.entities.PackageConfig;
+
+/**
+ * <p>
+ * This interface defines how interceptors are built from
+ * annotations.
+ * </p>
+ */
+public interface InterceptorMapBuilder {
+       /**
+     * Builds the interceptor configurations given the action information.
+     *
+     * @param   actionClass The class of the action.
+     * @param   annotation The action annotation.
+     * @param   actionName The action name.
+     * @param   packageConfig The package configuration that the action will 
be added to.
+     * @return  The mapping of the interceptors. If there were none found
+     *          than this should return an empty Map.
+     */
+       List<InterceptorMapping> build(PackageConfig.Builder builder, String 
actionName, Action annotation);
+}

Modified: 
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java?rev=656074&r1=656073&r2=656074&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
 (original)
+++ 
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
 Tue May 13 18:21:16 2008
@@ -61,6 +61,7 @@
     private final Configuration configuration;
     private final ActionNameBuilder actionNameBuilder;
     private final ResultMapBuilder resultMapBuilder;
+    private final InterceptorMapBuilder interceptorMapBuilder;
     private final ObjectFactory objectFactory;
     private final String defaultParentPackage;
     private final boolean redirectToSlash;
@@ -77,6 +78,8 @@
      *          names.
      * @param   resultMapBuilder The result map builder used to create 
ResultConfig mappings for each
      *          action.
+     * @param   interceptorMapBuilder The interceptor map builder used to 
create InterceptorConfig mappings for each
+     *          action.
      * @param   objectFactory The ObjectFactory used to create the actions and 
such.
      * @param   redirectToSlash A boolean parameter that controls whether or 
not this will create an
      *          action for indexes. If this is set to true, index actions are 
not created because
@@ -86,7 +89,7 @@
      */
     @Inject
     public PackageBasedActionConfigBuilder(Configuration configuration, 
ActionNameBuilder actionNameBuilder,
-            ResultMapBuilder resultMapBuilder, ObjectFactory objectFactory,
+            ResultMapBuilder resultMapBuilder, InterceptorMapBuilder 
interceptorMapBuilder, ObjectFactory objectFactory,
             @Inject("struts.convention.redirect.to.slash") String 
redirectToSlash,
             @Inject("struts.convention.default.parent.package") String 
defaultParentPackage) {
 
@@ -94,6 +97,7 @@
         this.configuration = configuration;
         this.actionNameBuilder = actionNameBuilder;
         this.resultMapBuilder = resultMapBuilder;
+        this.interceptorMapBuilder = interceptorMapBuilder;
         this.objectFactory = objectFactory;
         this.redirectToSlash = Boolean.parseBoolean(redirectToSlash);
 
@@ -426,7 +430,7 @@
         }
 
         //build interceptors
-        List<InterceptorMapping> interceptors = buildInterceptors(pkgCfg, 
actionName, annotation);
+        List<InterceptorMapping> interceptors = 
interceptorMapBuilder.build(pkgCfg, actionName, annotation);
         actionConfig.addInterceptors(interceptors);
 
         //build results
@@ -436,29 +440,6 @@
         pkgCfg.addActionConfig(actionName, actionConfig.build());
     }
 
-    private List<InterceptorMapping> buildInterceptors(PackageConfig.Builder 
builder, String actionName, Action annotation) {
-        List<InterceptorMapping> interceptorList = new 
ArrayList<InterceptorMapping>(10);
-
-        if (annotation != null) {
-            InterceptorRef[] interceptors = annotation.interceptorRefs();
-            if (interceptors != null) {
-                for (InterceptorRef interceptor : interceptors) {
-                    if (LOG.isTraceEnabled())
-                        LOG.trace("Adding interceptor [#0] to [#1]", 
interceptor.value(), actionName);
-                    interceptorList.addAll(buildInterceptorList(builder, 
interceptor));
-                }
-            }
-        }
-
-        return interceptorList;
-    }
-
-    private List<InterceptorMapping> 
buildInterceptorList(PackageConfig.Builder builder, InterceptorRef ref) {
-        return InterceptorBuilder.constructInterceptorReference(builder, 
ref.value(), new LinkedHashMap(),
-                builder.build().getLocation(), (ObjectFactory) 
configuration.getContainer().getInstance(
-                        ObjectFactory.class));
-    }
-
     private PackageConfig.Builder getPackageConfig(final Map<String, 
PackageConfig.Builder> packageConfigs,
             String actionNamespace, final String actionPackage, final Class<?> 
actionClass,
             Action action) {

Modified: 
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/annotation/InterceptorRef.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/annotation/InterceptorRef.java?rev=656074&r1=656073&r2=656074&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/annotation/InterceptorRef.java
 (original)
+++ 
struts/sandbox/trunk/struts2-convention-plugin/src/main/java/org/apache/struts2/convention/annotation/InterceptorRef.java
 Tue May 13 18:21:16 2008
@@ -35,5 +35,15 @@
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.TYPE)
 public @interface InterceptorRef {
+    /**
+     * @return name of the interceptor or interceptor stack
+     */
     String value();
+    
+    /**
+     * @return  The parameters passed to the interceptor. This is a list of 
strings that form a name/value
+     *          pair chain, since creating a Map for annotations is not 
possible. An example would be:
+     *          <code>{"key", "value", "key2", "value2"}</code>.
+     */
+    String[] params() default {};
 }

Modified: 
struts/sandbox/trunk/struts2-convention-plugin/src/main/resources/struts-plugin.xml
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/main/resources/struts-plugin.xml?rev=656074&r1=656073&r2=656074&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-convention-plugin/src/main/resources/struts-plugin.xml
 (original)
+++ 
struts/sandbox/trunk/struts2-convention-plugin/src/main/resources/struts-plugin.xml
 Tue May 13 18:21:16 2008
@@ -31,7 +31,8 @@
 
   <bean type="org.apache.struts2.convention.ActionConfigBuilder" 
class="org.apache.struts2.convention.PackageBasedActionConfigBuilder"/>
   <bean type="org.apache.struts2.convention.ActionNameBuilder" 
class="org.apache.struts2.convention.SEOActionNameBuilder"/>
-  <bean type="org.apache.struts2.convention.ResultMapBuilder" 
class="org.apache.struts2.convention.DefaultResultMapBuilder"/>
+  <bean type="org.apache.struts2.convention.ResultMapBuilder" 
class="org.apache.struts2.convention.DefaultResultMapBuilder"/>
+  <bean type="org.apache.struts2.convention.InterceptorMapBuilder" 
class="org.apache.struts2.convention.DefaultInterceptorMapBuilder"/>
   <bean type="org.apache.struts2.convention.ConventionsService" 
class="org.apache.struts2.convention.ConventionsServiceImpl"/>
 
   <bean type="com.opensymphony.xwork2.config.PackageProvider" 
class="org.apache.struts2.convention.ClasspathConfigurationProvider"/>

Modified: 
struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java?rev=656074&r1=656073&r2=656074&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
 (original)
+++ 
struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
 Tue May 13 18:21:16 2008
@@ -98,8 +98,9 @@
 
         //setup interceptor stacks
         List<InterceptorStackConfig> defaultInterceptorStacks = new 
ArrayList<InterceptorStackConfig>();
-        defaultInterceptorStacks.add(makeInterceptorStackConfig("stack-1", 
"interceptor-1", "interceptor-2"));
-        defaultInterceptorStacks.add(makeInterceptorStackConfig("stack-2", 
"interceptor-3", "stack-1"));
+        InterceptorMapping interceptor1 = new 
InterceptorMapping("interceptor-1", new TestInterceptor());
+        InterceptorMapping interceptor2 = new 
InterceptorMapping("interceptor-2", new TestInterceptor());
+        defaultInterceptorStacks.add(makeInterceptorStackConfig("stack-1", 
interceptor1, interceptor2));
 
         //setup results
         ResultTypeConfig[] defaultResults = new ResultTypeConfig[] { new 
ResultTypeConfig.Builder("dispatcher",
@@ -161,6 +162,7 @@
         expect(resultMapBuilder.build(InterceptorsAction.class, 
getAnnotation(InterceptorsAction.class, "run1", Action.class), "action100", 
interceptorRefsPkg)).andReturn(results);
         expect(resultMapBuilder.build(InterceptorsAction.class, 
getAnnotation(InterceptorsAction.class, "run2", Action.class), "action200", 
interceptorRefsPkg)).andReturn(results);
         expect(resultMapBuilder.build(InterceptorsAction.class, 
getAnnotation(InterceptorsAction.class, "run3", Action.class), "action300", 
interceptorRefsPkg)).andReturn(results);
+        expect(resultMapBuilder.build(InterceptorsAction.class, 
getAnnotation(InterceptorsAction.class, "run4", Action.class), "action400", 
interceptorRefsPkg)).andReturn(results);
 
         /* org.apache.struts2.convention.actions.namespace */
         expect(resultMapBuilder.build(ActionLevelNamespaceAction.class, 
getAnnotation(ActionLevelNamespaceAction.class, "execute", Action.class), 
"action", actionLevelNamespacePkg)).andReturn(results);
@@ -209,8 +211,10 @@
 
         ActionNameBuilder actionNameBuilder = new SEOActionNameBuilder("true", 
"-");
         ObjectFactory of = new ObjectFactory();
+        DefaultInterceptorMapBuilder interceptorBuilder = new 
DefaultInterceptorMapBuilder();
+        interceptorBuilder.setConfiguration(configuration);
         PackageBasedActionConfigBuilder builder = new 
PackageBasedActionConfigBuilder(configuration,
-            actionNameBuilder, resultMapBuilder, of, "false", 
"struts-default");
+            actionNameBuilder, resultMapBuilder, interceptorBuilder ,of, 
"false", "struts-default");
         if (actionPackages != null) {
             builder.setActionPackages(actionPackages);
         }
@@ -305,12 +309,12 @@
         /* org.apache.struts2.convention.actions.interceptorRefs */
         pkgConfig = 
configuration.getPackageConfig("org.apache.struts2.convention.actions.interceptor#struts-default#/interceptor");
         assertNotNull(pkgConfig);
-        assertEquals(3, pkgConfig.getActionConfigs().size());
+        assertEquals(4, pkgConfig.getActionConfigs().size());
         verifyActionConfigInterceptors(pkgConfig, "action100", 
"interceptor-1");
         verifyActionConfigInterceptors(pkgConfig, "action200", 
"interceptor-1", "interceptor-2");
-        verifyActionConfigInterceptors(pkgConfig, "action300", 
"interceptor-3", "stack-1");
-
-
+        verifyActionConfigInterceptors(pkgConfig, "action300", 
"interceptor-1", "interceptor-2");
+        verifyActionConfigInterceptors(pkgConfig, "action400", 
"interceptor-1", "interceptor-1", "interceptor-2");
+        
         /* org.apache.struts2.convention.actions */
         pkgConfig = 
configuration.getPackageConfig("org.apache.struts2.convention.actions#struts-default#");
         assertNotNull(pkgConfig);
@@ -381,14 +385,14 @@
     }
 
     private InterceptorConfig makeInterceptorConfig(String name) {
-        InterceptorConfig.Builder builder = new 
InterceptorConfig.Builder(name, 
"com.opensymphony.xwork2.validator.ValidationInterceptor");
+        InterceptorConfig.Builder builder = new 
InterceptorConfig.Builder(name, 
"org.apache.struts2.convention.TestInterceptor");
         return builder.build();
     }
 
-    private InterceptorStackConfig makeInterceptorStackConfig(String name, 
String... interceptors) {
+    private InterceptorStackConfig makeInterceptorStackConfig(String name, 
InterceptorMapping... interceptors) {
         InterceptorStackConfig.Builder builder = new 
InterceptorStackConfig.Builder(name);
-        for (String interceptor : interceptors)
-            builder.addInterceptor(new InterceptorMapping(interceptor, new 
ValidationInterceptor()));
+        for (InterceptorMapping interceptor : interceptors)
+            builder.addInterceptor(interceptor);
         return builder.build();
     }
 

Added: 
struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/TestInterceptor.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/TestInterceptor.java?rev=656074&view=auto
==============================================================================
--- 
struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/TestInterceptor.java
 (added)
+++ 
struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/TestInterceptor.java
 Tue May 13 18:21:16 2008
@@ -0,0 +1,21 @@
+package org.apache.struts2.convention;
+
+import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
+
+public class TestInterceptor extends AbstractInterceptor {
+       private String string1;
+       
+       @Override
+       public String intercept(ActionInvocation invocation) throws Exception {
+               return null;
+       }
+
+       public String getString1() {
+               return string1;
+       }
+
+       public void setString1(String string1) {
+               this.string1 = string1;
+       }
+}

Modified: 
struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/actions/interceptor/InterceptorsAction.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/actions/interceptor/InterceptorsAction.java?rev=656074&r1=656073&r2=656074&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/actions/interceptor/InterceptorsAction.java
 (original)
+++ 
struts/sandbox/trunk/struts2-convention-plugin/src/test/java/org/apache/struts2/convention/actions/interceptor/InterceptorsAction.java
 Tue May 13 18:21:16 2008
@@ -39,8 +39,13 @@
         return null;
     }
 
-    @Action(value = "action300", interceptorRefs = @InterceptorRef("stack-2"))
+    @Action(value = "action300", interceptorRefs = [EMAIL 
PROTECTED]("interceptor-1"), @InterceptorRef("interceptor-2")})
     public String run3() {
         return null;
     }
+    
+    @Action(value = "action400", interceptorRefs = [EMAIL 
PROTECTED]("interceptor-1"), @InterceptorRef("stack-1")})
+    public String run4() {
+        return null;
+    }
 }
\ No newline at end of file


Reply via email to