You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by mu...@apache.org on 2009/02/11 16:53:17 UTC

svn commit: r743366 - in /struts/struts2/trunk/plugins/convention/src: main/java/org/apache/struts2/convention/ main/resources/ test/java/org/apache/struts2/convention/

Author: musachy
Date: Wed Feb 11 15:53:17 2009
New Revision: 743366

URL: http://svn.apache.org/viewvc?rev=743366&view=rev
Log:
WW-2994 Add extension points for Convention plugin classes

Added:
    struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionConstants.java
Modified:
    struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ClasspathConfigurationProvider.java
    struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ClasspathPackageProvider.java
    struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java
    struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java
    struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
    struts/struts2/trunk/plugins/convention/src/main/resources/struts-plugin.xml
    struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/DefaultResultMapBuilderTest.java
    struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java

Modified: struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ClasspathConfigurationProvider.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ClasspathConfigurationProvider.java?rev=743366&r1=743365&r2=743366&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ClasspathConfigurationProvider.java (original)
+++ struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ClasspathConfigurationProvider.java Wed Feb 11 15:53:17 2009
@@ -25,6 +25,7 @@
 import com.opensymphony.xwork2.config.ConfigurationProvider;
 import com.opensymphony.xwork2.inject.ContainerBuilder;
 import com.opensymphony.xwork2.inject.Inject;
+import com.opensymphony.xwork2.inject.Container;
 import com.opensymphony.xwork2.util.location.LocatableProperties;
 import org.apache.struts2.dispatcher.DispatcherListener;
 import org.apache.struts2.dispatcher.Dispatcher;
@@ -42,8 +43,8 @@
     private boolean listeningToDispatcher;
 
     @Inject
-    public ClasspathConfigurationProvider(ActionConfigBuilder actionConfigBuilder) {
-        this.actionConfigBuilder = actionConfigBuilder;
+    public ClasspathConfigurationProvider(Container container) {
+        this.actionConfigBuilder = container.getInstance(ActionConfigBuilder.class, container.getInstance(String.class, ConventionConstants.CONVENTION_ACTION_CONFIG_BUILDER));
     }
 
     @Inject(StrutsConstants.STRUTS_DEVMODE)

Modified: struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ClasspathPackageProvider.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ClasspathPackageProvider.java?rev=743366&r1=743365&r2=743366&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ClasspathPackageProvider.java (original)
+++ struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ClasspathPackageProvider.java Wed Feb 11 15:53:17 2009
@@ -23,6 +23,7 @@
 import com.opensymphony.xwork2.config.Configuration;
 import com.opensymphony.xwork2.config.ConfigurationException;
 import com.opensymphony.xwork2.inject.Inject;
+import com.opensymphony.xwork2.inject.Container;
 
 /**
  * <p>
@@ -37,8 +38,8 @@
      private ActionConfigBuilder actionConfigBuilder;
 
     @Inject
-    public ClasspathPackageProvider(ActionConfigBuilder actionConfigBuilder) {
-        this.actionConfigBuilder = actionConfigBuilder;
+    public ClasspathPackageProvider(Container container) {
+        this.actionConfigBuilder = container.getInstance(ActionConfigBuilder.class, container.getInstance(String.class, ConventionConstants.CONVENTION_ACTION_CONFIG_BUILDER));
     }
 
     public void init(Configuration configuration) throws ConfigurationException {

Added: struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionConstants.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionConstants.java?rev=743366&view=auto
==============================================================================
--- struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionConstants.java (added)
+++ struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionConstants.java Wed Feb 11 15:53:17 2009
@@ -0,0 +1,32 @@
+/*
+ * $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;
+
+/**
+ * Constants used to extend the COnvention plugin
+ */
+public class ConventionConstants {
+    public static final String CONVENTION_ACTION_CONFIG_BUILDER = "struts.convention.actionConfigBuilder";
+    public static final String CONVENTION_ACTION_NAME_BUILDER = "struts.convention.actionNameBuilder";
+    public static final String CONVENTION_RESULT_MAP_BUILDER = "struts.convention.resultMapBuilder";
+    public static final String CONVENTION_INTERCEPTOR_MAP_BUILDER = "struts.convention.interceptorMapBuilder";
+    public static final String CONVENTION_CONVENTIONS_SERVICE = "struts.convention.conventionsService";
+}

Modified: struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java?rev=743366&r1=743365&r2=743366&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java (original)
+++ struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java Wed Feb 11 15:53:17 2009
@@ -43,6 +43,7 @@
 import com.opensymphony.xwork2.config.entities.ResultConfig;
 import com.opensymphony.xwork2.config.entities.ResultTypeConfig;
 import com.opensymphony.xwork2.inject.Inject;
+import com.opensymphony.xwork2.inject.Container;
 import com.opensymphony.xwork2.util.logging.Logger;
 import com.opensymphony.xwork2.util.logging.LoggerFactory;
 
@@ -81,9 +82,7 @@
      * @param   configuration The XWork configuration.
      * @param   objectFactory The XWork object factory used to create result instances.
      * @param   servletContext The servlet context used to help build the action configurations.
-     * @param   resultMapBuilder The result map builder that is used to create results.
-     * @param   conventionsService The conventions service used to get all the conventions and
-     *          configurations.
+     * @param   container The Xwork container
      * @param   defaultParentPackageName The default XWork package that the unknown handler will use as
      *          the parent package for new actions and results.
      * @param   redirectToSlash A boolean parameter that controls whether or not this will handle
@@ -94,16 +93,15 @@
      */
     @Inject
     public ConventionUnknownHandler(Configuration configuration, ObjectFactory objectFactory,
-            ServletContext servletContext, ResultMapBuilder resultMapBuilder,
-            ConventionsService conventionsService,
+            ServletContext servletContext, Container container,
             @Inject("struts.convention.default.parent.package") String defaultParentPackageName,
             @Inject("struts.convention.redirect.to.slash") String redirectToSlash,
             @Inject("struts.convention.action.name.separator") String nameSeparator) {
         this.configuration = configuration;
         this.objectFactory = objectFactory;
         this.servletContext = servletContext;
-        this.resultMapBuilder = resultMapBuilder;
-        this.conventionsService = conventionsService;
+        this.resultMapBuilder = container.getInstance(ResultMapBuilder.class, container.getInstance(String.class, ConventionConstants.CONVENTION_RESULT_MAP_BUILDER));
+        this.conventionsService = container.getInstance(ConventionsService.class, container.getInstance(String.class, ConventionConstants.CONVENTION_CONVENTIONS_SERVICE));
         this.defaultParentPackageName = defaultParentPackageName;
         this.nameSeparator = nameSeparator;
 

Modified: struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java?rev=743366&r1=743365&r2=743366&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java (original)
+++ struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java Wed Feb 11 15:53:17 2009
@@ -39,6 +39,7 @@
 import com.opensymphony.xwork2.config.entities.ResultConfig;
 import com.opensymphony.xwork2.config.entities.ResultTypeConfig;
 import com.opensymphony.xwork2.inject.Inject;
+import com.opensymphony.xwork2.inject.Container;
 import com.opensymphony.xwork2.util.finder.ResourceFinder;
 import com.opensymphony.xwork2.util.finder.Test;
 import com.opensymphony.xwork2.util.logging.Logger;
@@ -122,16 +123,16 @@
      * Constructs the SimpleResultMapBuilder using the given result location.
      *
      * @param   servletContext The ServletContext for finding the resources of the web application.
-     * @param   conventionsService The service used to assist in finding configuration and conventions.
+     * @param   container The Xwork container
      * @param   relativeResultTypes The list of result types that can have locations that are relative
      *          and the result location (which is the resultPath plus the namespace) prepended to them.
      */
     @Inject
-    public DefaultResultMapBuilder(ServletContext servletContext, ConventionsService conventionsService,
+    public DefaultResultMapBuilder(ServletContext servletContext, Container container,
             @Inject("struts.convention.relative.result.types") String relativeResultTypes) {
         this.servletContext = servletContext;
         this.relativeResultTypes = new HashSet<String>(Arrays.asList(relativeResultTypes.split("\\s*[,]\\s*")));
-        this.conventionsService = conventionsService;
+        this.conventionsService = container.getInstance(ConventionsService.class, container.getInstance(String.class, ConventionConstants.CONVENTION_CONVENTIONS_SERVICE));
     }
 
     /**

Modified: struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java?rev=743366&r1=743365&r2=743366&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java (original)
+++ struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java Wed Feb 11 15:53:17 2009
@@ -55,6 +55,7 @@
 import com.opensymphony.xwork2.config.entities.PackageConfig;
 import com.opensymphony.xwork2.config.entities.ResultConfig;
 import com.opensymphony.xwork2.inject.Inject;
+import com.opensymphony.xwork2.inject.Container;
 import com.opensymphony.xwork2.util.finder.ClassFinder;
 import com.opensymphony.xwork2.util.finder.Test;
 import com.opensymphony.xwork2.util.finder.UrlSet;
@@ -97,12 +98,7 @@
      *
      * @param configuration         The XWork configuration that the new package configs and action configs
      *                              are added to.
-     * @param actionNameBuilder     The action name builder used to convert action class names to action
-     *                              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 container             Xwork Container
      * @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
@@ -111,16 +107,15 @@
      * @param defaultParentPackage  The default parent package for all the configuration.
      */
     @Inject
-    public PackageBasedActionConfigBuilder(Configuration configuration, ActionNameBuilder actionNameBuilder,
-                                           ResultMapBuilder resultMapBuilder, InterceptorMapBuilder interceptorMapBuilder, ObjectFactory objectFactory,
+    public PackageBasedActionConfigBuilder(Configuration configuration, Container container, ObjectFactory objectFactory,
                                            @Inject("struts.convention.redirect.to.slash") String redirectToSlash,
                                            @Inject("struts.convention.default.parent.package") String defaultParentPackage) {
 
         // Validate that the parameters are okay
         this.configuration = configuration;
-        this.actionNameBuilder = actionNameBuilder;
-        this.resultMapBuilder = resultMapBuilder;
-        this.interceptorMapBuilder = interceptorMapBuilder;
+        this.actionNameBuilder = container.getInstance(ActionNameBuilder.class, container.getInstance(String.class, ConventionConstants.CONVENTION_ACTION_NAME_BUILDER));
+        this.resultMapBuilder = container.getInstance(ResultMapBuilder.class, container.getInstance(String.class, ConventionConstants.CONVENTION_RESULT_MAP_BUILDER));
+        this.interceptorMapBuilder = container.getInstance(InterceptorMapBuilder.class, container.getInstance(String.class, ConventionConstants.CONVENTION_INTERCEPTOR_MAP_BUILDER));;
         this.objectFactory = objectFactory;
         this.redirectToSlash = Boolean.parseBoolean(redirectToSlash);
 

Modified: struts/struts2/trunk/plugins/convention/src/main/resources/struts-plugin.xml
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/convention/src/main/resources/struts-plugin.xml?rev=743366&r1=743365&r2=743366&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/convention/src/main/resources/struts-plugin.xml (original)
+++ struts/struts2/trunk/plugins/convention/src/main/resources/struts-plugin.xml Wed Feb 11 15:53:17 2009
@@ -29,15 +29,21 @@
 <struts>
   <bean type="com.opensymphony.xwork2.UnknownHandler" name="convention" class="org.apache.struts2.convention.ConventionUnknownHandler"/>
 
-  <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.InterceptorMapBuilder" class="org.apache.struts2.convention.DefaultInterceptorMapBuilder"/>
-  <bean type="org.apache.struts2.convention.ConventionsService" class="org.apache.struts2.convention.ConventionsServiceImpl"/>
+  <bean type="org.apache.struts2.convention.ActionConfigBuilder" name="convention" class="org.apache.struts2.convention.PackageBasedActionConfigBuilder"/>
+  <bean type="org.apache.struts2.convention.ActionNameBuilder" name="convention" class="org.apache.struts2.convention.SEOActionNameBuilder"/>
+  <bean type="org.apache.struts2.convention.ResultMapBuilder" name="convention" class="org.apache.struts2.convention.DefaultResultMapBuilder"/>
+  <bean type="org.apache.struts2.convention.InterceptorMapBuilder" name="convention" class="org.apache.struts2.convention.DefaultInterceptorMapBuilder"/>
+  <bean type="org.apache.struts2.convention.ConventionsService" name="convention" class="org.apache.struts2.convention.ConventionsServiceImpl"/>
 
   <bean type="com.opensymphony.xwork2.config.PackageProvider" name="convention.packageProvider" class="org.apache.struts2.convention.ClasspathPackageProvider"/>
   <bean type="com.opensymphony.xwork2.config.PackageProvider" name="convention.containerProvider" class="org.apache.struts2.convention.ClasspathConfigurationProvider"/>
 
+  <constant name="struts.convention.actionConfigBuilder" value="convention"/>
+  <constant name="struts.convention.actionNameBuilder" value="convention"/>
+  <constant name="struts.convention.resultMapBuilder" value="convention"/>
+  <constant name="struts.convention.interceptorMapBuilder" value="convention"/>
+  <constant name="struts.convention.conventionsService" value="convention"/>
+
   <constant name="struts.convention.result.path" value="/WEB-INF/content/"/>
   <constant name="struts.convention.result.flatLayout" value="true"/>
   <constant name="struts.convention.action.suffix" value="Action"/>

Modified: struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/DefaultResultMapBuilderTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/DefaultResultMapBuilderTest.java?rev=743366&r1=743365&r2=743366&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/DefaultResultMapBuilderTest.java (original)
+++ struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/DefaultResultMapBuilderTest.java Wed Feb 11 15:53:17 2009
@@ -36,10 +36,12 @@
 import org.apache.struts2.convention.actions.resultpath.ClassLevelResultPathAction;
 import org.apache.struts2.convention.annotation.Action;
 import org.easymock.EasyMock;
+import org.easymock.IAnswer;
 
 import com.opensymphony.xwork2.config.entities.PackageConfig;
 import com.opensymphony.xwork2.config.entities.ResultConfig;
 import com.opensymphony.xwork2.config.entities.ResultTypeConfig;
+import com.opensymphony.xwork2.inject.Container;
 
 /**
  * <p>
@@ -47,19 +49,24 @@
  * </p>
  */
 public class DefaultResultMapBuilderTest extends TestCase {
+    private Container container;
+    private ConventionsService conventionsService;
+
     public void testBuild() throws Exception {
         ServletContext context = mockServletContext("/WEB-INF/location");
 
         // Test with a slash
         PackageConfig packageConfig = createPackageConfigBuilder("/namespace");
-        DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, new ConventionsServiceImpl("/WEB-INF/location"), "dispatcher,velocity,freemarker");
+        this.conventionsService = new ConventionsServiceImpl("/WEB-INF/location");
+        DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, container, "dispatcher,velocity,freemarker");
         Map<String, ResultConfig> results = builder.build(NoAnnotationAction.class, null, "action", packageConfig);
         verify(context, "/WEB-INF/location", results, false);
 
         // Test without a slash
         context = mockServletContext("/WEB-INF/location");
         packageConfig = createPackageConfigBuilder("namespace");
-        builder = new DefaultResultMapBuilder(context, new ConventionsServiceImpl("/WEB-INF/location"), "dispatcher,velocity,freemarker");
+        this.conventionsService = new ConventionsServiceImpl("/WEB-INF/location");
+        builder = new DefaultResultMapBuilder(context, container, "dispatcher,velocity,freemarker");
         results = builder.build(NoAnnotationAction.class, null, "action", packageConfig);
         verify(context, "/WEB-INF/location", results, false);
     }
@@ -71,7 +78,8 @@
 
         // Test with a slash
         PackageConfig packageConfig = createPackageConfigBuilder("/namespace");
-        DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, new ConventionsServiceImpl("/WEB-INF/location"), "dispatcher,velocity,freemarker");
+        this.conventionsService = new ConventionsServiceImpl("/WEB-INF/location");
+        DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, container, "dispatcher,velocity,freemarker");
         Map<String, ResultConfig> results = builder.build(NoAnnotationAction.class, null, "action", packageConfig);
         assertEquals(0, results.size());
         EasyMock.verify(context);
@@ -82,7 +90,8 @@
 
         // Test with a result path
         PackageConfig packageConfig = createPackageConfigBuilder("/namespace");
-        DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, new ConventionsServiceImpl("/not-used"), "dispatcher,velocity,freemarker");
+        this.conventionsService = new ConventionsServiceImpl("/not-used");
+        DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, container, "dispatcher,velocity,freemarker");
         Map<String, ResultConfig> results = builder.build(ClassLevelResultPathAction.class, null, "action", packageConfig);
         verify(context, "/class-level", results, false);
     }
@@ -100,7 +109,8 @@
 
         PackageConfig packageConfig = createPackageConfigBuilder("/namespace");
 
-        DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, new ConventionsServiceImpl("/WEB-INF/location"), "dispatcher,velocity,freemarker");
+        this.conventionsService =  new ConventionsServiceImpl("/WEB-INF/location");
+        DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, container, "dispatcher,velocity,freemarker");
         Map<String, ResultConfig> results = builder.build(NoAnnotationAction.class, null, "no-annotation", packageConfig);
         assertEquals(4, results.size());
         assertEquals("success", results.get("success").getName());
@@ -130,7 +140,8 @@
 
         PackageConfig packageConfig = createPackageConfigBuilder("/namespace");
 
-        DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, new ConventionsServiceImpl("/WEB-INF/location"), "dispatcher,velocity,freemarker");
+        this.conventionsService = new ConventionsServiceImpl("/WEB-INF/location");
+        DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, container, "dispatcher,velocity,freemarker");
         Map<String, ResultConfig> results = builder.build(ClassLevelResultAction.class, null, "class-level-result", packageConfig);
         assertEquals(1, results.size());
         assertEquals("error", results.get("error").getName());
@@ -152,7 +163,8 @@
 
         PackageConfig packageConfig = createPackageConfigBuilder("/namespace");
 
-        DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, new ConventionsServiceImpl("/WEB-INF/location"), "dispatcher,velocity,freemarker");
+        this.conventionsService = new ConventionsServiceImpl("/WEB-INF/location");
+        DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, container, "dispatcher,velocity,freemarker");
         Map<String, ResultConfig> results = builder.build(ClassLevelResultsAction.class, null, "class-level-results", packageConfig);
         assertEquals(4, results.size());
         assertEquals("error", results.get("error").getName());
@@ -190,7 +202,8 @@
 
         PackageConfig packageConfig = createPackageConfigBuilder("/namespace");
 
-        DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, new ConventionsServiceImpl("/WEB-INF/location"), "dispatcher,velocity,freemarker");
+        this.conventionsService = new ConventionsServiceImpl("/WEB-INF/location");
+        DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, container, "dispatcher,velocity,freemarker");
         Map<String, ResultConfig> results = builder.build(ActionLevelResultAction.class, getAnnotation(ActionLevelResultAction.class, "execute", Action.class), "action-level-result", packageConfig);
         assertEquals(1, results.size());
         assertEquals("success", results.get("success").getName());
@@ -212,7 +225,8 @@
 
         PackageConfig packageConfig = createPackageConfigBuilder("/namespace");
 
-        DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, new ConventionsServiceImpl("/WEB-INF/location"), "dispatcher,velocity,freemarker");
+        this.conventionsService = new ConventionsServiceImpl("/WEB-INF/location");
+        DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, container, "dispatcher,velocity,freemarker");
         Map<String, ResultConfig> results = builder.build(ActionLevelResultsAction.class, getAnnotation(ActionLevelResultsAction.class, "execute", Action.class), "action-level-results", packageConfig);
         assertEquals(4, results.size());
         assertEquals("error", results.get("error").getName());
@@ -244,7 +258,8 @@
         PackageConfig packageConfig = new PackageConfig.Builder("package").
             defaultResultType("dispatcher").addResultTypeConfig(resultType).build();
 
-        DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, new ConventionsServiceImpl("/WEB-INF/component"), "dispatcher,velocity,freemarker");
+        this.conventionsService = new ConventionsServiceImpl("/WEB-INF/component");
+        DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, container, "dispatcher,velocity,freemarker");
         Map<String, ResultConfig> results = builder.build(NoAnnotationAction.class, null, "no-annotation", packageConfig);
         assertEquals(4, results.size());
         assertEquals("input", results.get("input").getName());
@@ -324,4 +339,17 @@
         assertEquals("value1", results.get("error").getParams().get("key1"));
         EasyMock.verify(context);
     }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        this.container = EasyMock.createNiceMock(Container.class);
+        EasyMock.expect(container.getInstance(String.class, ConventionConstants.CONVENTION_CONVENTIONS_SERVICE)).andReturn("convention").anyTimes();
+        EasyMock.expect(container.getInstance(ConventionsService.class, "convention")).andAnswer(new IAnswer<ConventionsService>() {
+            public ConventionsService answer() throws Throwable {
+                return DefaultResultMapBuilderTest.this.conventionsService;
+            }
+        }).anyTimes();
+        EasyMock.replay(this.container);
+    }
 }
\ No newline at end of file

Modified: struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java?rev=743366&r1=743365&r2=743366&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java (original)
+++ struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java Wed Feb 11 15:53:17 2009
@@ -260,11 +260,13 @@
 
         EasyMock.replay(resultMapBuilder);
 
+        final DummyContainer mockContainer = new DummyContainer();
+
         Configuration configuration = new DefaultConfiguration() {
 
             @Override
             public Container getContainer() {
-                return new DummyContainer();
+                return mockContainer;
             }
 
         };
@@ -277,8 +279,14 @@
         ObjectFactory of = new ObjectFactory();
         DefaultInterceptorMapBuilder interceptorBuilder = new DefaultInterceptorMapBuilder();
         interceptorBuilder.setConfiguration(configuration);
-        PackageBasedActionConfigBuilder builder = new PackageBasedActionConfigBuilder(configuration,
-            actionNameBuilder, resultMapBuilder, interceptorBuilder ,of, "false", "struts-default");
+
+        //set beans on mock container
+        mockContainer.setActionNameBuilder(actionNameBuilder);
+        mockContainer.setInterceptorMapBuilder(interceptorBuilder);
+        mockContainer.setResultMapBuilder(resultMapBuilder);
+        mockContainer.setConventionsService(new ConventionsServiceImpl(""));
+
+        PackageBasedActionConfigBuilder builder = new PackageBasedActionConfigBuilder(configuration, mockContainer ,of, "false", "struts-default");
         if (actionPackages != null) {
             builder.setActionPackages(actionPackages);
         }
@@ -489,7 +497,7 @@
         EasyMock.replay(context);
 
         ObjectFactory workingFactory = configuration.getContainer().getInstance(ObjectFactory.class);
-        ConventionUnknownHandler uh = new ConventionUnknownHandler(configuration, workingFactory, context, resultMapBuilder, new ConventionsServiceImpl(""), "struts-default", null, "-");
+        ConventionUnknownHandler uh = new ConventionUnknownHandler(configuration, workingFactory, context, mockContainer, "struts-default", null, "-");
         ActionContext actionContext = new ActionContext(Collections.EMPTY_MAP);
 
         Result result = uh.handleUnknownResult(actionContext, "foo", pkgConfig.getActionConfigs().get("foo"), "bar");
@@ -580,6 +588,26 @@
     }
 
     public class DummyContainer implements Container {
+        private ActionNameBuilder actionNameBuilder;
+        private ResultMapBuilder resultMapBuilder;
+        private InterceptorMapBuilder interceptorMapBuilder;
+        private ConventionsService conventionsService;
+
+        public void setActionNameBuilder(ActionNameBuilder actionNameBuilder) {
+            this.actionNameBuilder = actionNameBuilder;
+        }
+
+        public void setInterceptorMapBuilder(InterceptorMapBuilder interceptorMapBuilder) {
+            this.interceptorMapBuilder = interceptorMapBuilder;
+        }
+
+        public void setResultMapBuilder(ResultMapBuilder resultMapBuilder) {
+            this.resultMapBuilder = resultMapBuilder;
+        }
+
+        public void setConventionsService(ConventionsService conventionsService) {
+            this.conventionsService = conventionsService;
+        }
 
         public <T> T getInstance(Class<T> type) {
             try {
@@ -612,6 +640,14 @@
         }
 
         public <T> T getInstance(Class<T> type, String name) {
+            if (type == ResultMapBuilder.class)
+                return (T) resultMapBuilder;
+            else if (type == InterceptorMapBuilder.class)
+                return (T) interceptorMapBuilder;
+            else if (type == ActionNameBuilder.class)
+                return (T) actionNameBuilder;
+            else if (type == ConventionsService.class)
+                return (T) conventionsService;
             return null;
         }