You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2010/01/06 21:17:33 UTC

svn commit: r896651 - /tapestry/tapestry5/trunk/tapestry-spring/src/main/java/org/apache/tapestry5/internal/spring/SpringModuleDef.java

Author: hlship
Date: Wed Jan  6 20:17:23 2010
New Revision: 896651

URL: http://svn.apache.org/viewvc?rev=896651&view=rev
Log:
TAP5-830: SpringModuleDef unnecessarily hard-codes that the type of object stored in the context as a ConfigurableWebApplicationContext when any object implementing ApplicationContext is sufficient

Modified:
    tapestry/tapestry5/trunk/tapestry-spring/src/main/java/org/apache/tapestry5/internal/spring/SpringModuleDef.java

Modified: tapestry/tapestry5/trunk/tapestry-spring/src/main/java/org/apache/tapestry5/internal/spring/SpringModuleDef.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-spring/src/main/java/org/apache/tapestry5/internal/spring/SpringModuleDef.java?rev=896651&r1=896650&r2=896651&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-spring/src/main/java/org/apache/tapestry5/internal/spring/SpringModuleDef.java (original)
+++ tapestry/tapestry5/trunk/tapestry-spring/src/main/java/org/apache/tapestry5/internal/spring/SpringModuleDef.java Wed Jan  6 20:17:23 2010
@@ -1,10 +1,10 @@
-// Copyright 2007, 2008, 2009 The Apache Software Foundation
+// Copyright 2007, 2008, 2009, 2010 The Apache Software Foundation
 //
 // Licensed 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
+// 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,
@@ -41,7 +41,8 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
- * A wrapper that converts a Spring {@link ApplicationContext} into a set of service definitions, compatible with
+ * A wrapper that converts a Spring {@link ApplicationContext} into a set of service definitions,
+ * compatible with
  * Tapestry 5 IoC, for the beans defined in the context, as well as the context itself.
  */
 public class SpringModuleDef implements ModuleDef
@@ -56,32 +57,52 @@
 
     private final ServletContext servletContext;
 
-    private ConfigurableWebApplicationContext locateExternalContext()
+    private ApplicationContext locateExternalContext()
     {
-        ConfigurableWebApplicationContext context = (ConfigurableWebApplicationContext) servletContext.getAttribute(
-                WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
-
-        if (context == null)
-            throw new NullPointerException(String.format(
-                    "No Spring ApplicationContext stored in the ServletContext as attribute '%s'. " +
-                            "You should either re-enable Tapestry as the creator of the ApplicationContext, or " +
-                            "add a Spring ContextLoaderListener to web.xml.",
-                    WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE));
+        ApplicationContext context = locateApplicationContext(servletContext);
 
         applicationContextCreated.set(true);
 
         return context;
     }
 
+    /**
+     * Invoked to obtain the Spring ApplicationContext, presumably stored in the ServletContext.
+     * This method is only used in Tapestry 5.0 compatibility mode (in Tapestry 5.1 and above,
+     * the default is for Tapestry to <em>create</em> the ApplicationContext).
+     * 
+     * @param servletContext
+     *            used to locate the ApplicationContext
+     * @return the ApplicationContext itself
+     * @throws RuntimeException
+     *             if the ApplicationContext could not be located or is otherwise invalid
+     * @since 5.2.0
+     */
+    protected ApplicationContext locateApplicationContext(ServletContext servletContext)
+    {
+        ApplicationContext context = (ApplicationContext) servletContext
+                .getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
+
+        if (context == null)
+            throw new NullPointerException(
+                    String
+                            .format(
+                                    "No Spring ApplicationContext stored in the ServletContext as attribute '%s'. "
+                                            + "You should either re-enable Tapestry as the creator of the ApplicationContext, or "
+                                            + "add a Spring ContextLoaderListener to web.xml.",
+                                    WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE));
+        return context;
+    }
+
     public SpringModuleDef(ServletContext servletContext)
     {
         this.servletContext = servletContext;
 
-        compatibilityMode = Boolean.parseBoolean(
-                servletContext.getInitParameter(SpringConstants.USE_EXTERNAL_SPRING_CONTEXT));
+        compatibilityMode = Boolean.parseBoolean(servletContext
+                .getInitParameter(SpringConstants.USE_EXTERNAL_SPRING_CONTEXT));
 
-        final ApplicationContext externalContext =
-                compatibilityMode ? locateExternalContext() : null;
+        final ApplicationContext externalContext = compatibilityMode ? locateExternalContext()
+                : null;
 
         if (compatibilityMode)
             addServiceDefsForSpringBeans(externalContext);
@@ -91,11 +112,11 @@
             public ObjectCreator createServiceCreator(final ServiceBuilderResources resources)
             {
                 if (compatibilityMode)
-                    return new StaticObjectCreator(externalContext, "externally configured Spring ApplicationContext");
+                    return new StaticObjectCreator(externalContext,
+                            "externally configured Spring ApplicationContext");
 
-
-                ApplicationContextCustomizer customizer = resources.getService("ApplicationContextCustomizer",
-                                                                               ApplicationContextCustomizer.class);
+                ApplicationContextCustomizer customizer = resources.getService(
+                        "ApplicationContextCustomizer", ApplicationContextCustomizer.class);
 
                 return constructObjectCreatorForApplicationContext(resources, customizer);
             }
@@ -112,9 +133,8 @@
 
             public Class getServiceInterface()
             {
-                return compatibilityMode
-                       ? externalContext.getClass()
-                       : ConfigurableWebApplicationContext.class;
+                return compatibilityMode ? externalContext.getClass()
+                        : ConfigurableWebApplicationContext.class;
             }
 
             public String getServiceScope()
@@ -135,17 +155,15 @@
     {
         for (final String beanName : BeanFactoryUtils.beanNamesIncludingAncestors(context))
         {
-            String trueName = beanName.startsWith("&")
-                              ? beanName.substring(1)
-                              : beanName;
+            String trueName = beanName.startsWith("&") ? beanName.substring(1) : beanName;
 
             services.put(trueName, new SpringBeanServiceDef(trueName, context));
         }
     }
 
-    private ObjectCreator constructObjectCreatorForApplicationContext(final ServiceBuilderResources resources,
-                                                                      @Primary
-                                                                      ApplicationContextCustomizer customizer)
+    private ObjectCreator constructObjectCreatorForApplicationContext(
+            final ServiceBuilderResources resources, @Primary
+            ApplicationContextCustomizer customizer)
     {
         final CustomizingContextLoader loader = new CustomizingContextLoader(customizer);
 
@@ -169,12 +187,12 @@
                         {
                             public Object invoke()
                             {
-                                resources.getLogger().info(String.format(
-                                        "Starting Spring (version %s)",
-                                        SpringVersion.getVersion()));
+                                resources.getLogger().info(
+                                        String.format("Starting Spring (version %s)", SpringVersion
+                                                .getVersion()));
 
-                                WebApplicationContext context = loader.initWebApplicationContext(
-                                        servletContext);
+                                WebApplicationContext context = loader
+                                        .initWebApplicationContext(servletContext);
 
                                 shutdownHub.addRegistryShutdownListener(shutdownListener);
 
@@ -199,7 +217,8 @@
     }
 
     /**
-     * Returns a contribution, "SpringBean", to the MasterObjectProvider service.  It is ordered after the built-in
+     * Returns a contribution, "SpringBean", to the MasterObjectProvider service. It is ordered
+     * after the built-in
      * contributions.
      */
     public Set<ContributionDef> getContributionDefs()
@@ -212,7 +231,6 @@
     private ContributionDef createContributionToMasterObjectProvider()
     {
 
-
         ContributionDef def = new AbstractContributionDef()
         {
             public String getServiceId()
@@ -222,16 +240,17 @@
 
             @Override
             public void contribute(ModuleBuilderSource moduleSource, ServiceResources resources,
-                                   OrderedConfiguration configuration)
+                    OrderedConfiguration configuration)
             {
                 final OperationTracker tracker = resources.getTracker();
 
-                final ApplicationContext context = resources.getService(SERVICE_ID, ApplicationContext.class);
+                final ApplicationContext context = resources.getService(SERVICE_ID,
+                        ApplicationContext.class);
 
                 final ObjectProvider springBeanProvider = new ObjectProvider()
                 {
-                    public <T> T provide(Class<T> objectType, AnnotationProvider annotationProvider,
-                                         ObjectLocator locator)
+                    public <T> T provide(Class<T> objectType,
+                            AnnotationProvider annotationProvider, ObjectLocator locator)
                     {
 
                         Map beanMap = context.getBeansOfType(objectType);
@@ -249,11 +268,12 @@
 
                             default:
 
-                                String message = String.format(
-                                        "Spring context contains %d beans assignable to type %s: %s.",
-                                        beanMap.size(),
-                                        ClassFabUtils.toJavaClassName(objectType),
-                                        InternalUtils.joinSorted(beanMap.keySet()));
+                                String message = String
+                                        .format(
+                                                "Spring context contains %d beans assignable to type %s: %s.",
+                                                beanMap.size(), ClassFabUtils
+                                                        .toJavaClassName(objectType), InternalUtils
+                                                        .joinSorted(beanMap.keySet()));
 
                                 throw new IllegalArgumentException(message);
                         }
@@ -262,8 +282,8 @@
 
                 final ObjectProvider springBeanProviderInvoker = new ObjectProvider()
                 {
-                    public <T> T provide(final Class<T> objectType, final AnnotationProvider annotationProvider,
-                                         final ObjectLocator locator)
+                    public <T> T provide(final Class<T> objectType,
+                            final AnnotationProvider annotationProvider, final ObjectLocator locator)
                     {
                         return tracker.invoke(
                                 "Resolving dependency by searching Spring ApplicationContext",
@@ -271,7 +291,8 @@
                                 {
                                     public T invoke()
                                     {
-                                        return springBeanProvider.provide(objectType, annotationProvider, locator);
+                                        return springBeanProvider.provide(objectType,
+                                                annotationProvider, locator);
                                     }
                                 });
                     }
@@ -279,19 +300,21 @@
 
                 ObjectProvider outerCheck = new ObjectProvider()
                 {
-                    public <T> T provide(Class<T> objectType, AnnotationProvider annotationProvider,
-                                         ObjectLocator locator)
+                    public <T> T provide(Class<T> objectType,
+                            AnnotationProvider annotationProvider, ObjectLocator locator)
                     {
-                        // I think the following line is the only reason we put the SpringBeanProvider here,
+                        // I think the following line is the only reason we put the
+                        // SpringBeanProvider here,
                         // rather than in SpringModule.
 
-                        if (!applicationContextCreated.get()) return null;
+                        if (!applicationContextCreated.get())
+                            return null;
 
-                        return springBeanProviderInvoker.provide(objectType, annotationProvider, locator);
+                        return springBeanProviderInvoker.provide(objectType, annotationProvider,
+                                locator);
                     }
                 };
 
-
                 configuration.add("SpringBean", outerCheck, "after:Service,Alias,Autobuild");
             }
         };