Author: dvaleri
Date: Mon Mar 26 16:17:22 2012
New Revision: 1305425

URL: http://svn.apache.org/viewvc?rev=1305425&view=rev
Log:
[CAMEL-4987] Implemented new methods for Spring 3.1.

Modified:
    
camel/trunk/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/CamelSpringTestContextLoader.java

Modified: 
camel/trunk/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/CamelSpringTestContextLoader.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/CamelSpringTestContextLoader.java?rev=1305425&r1=1305424&r2=1305425&view=diff
==============================================================================
--- 
camel/trunk/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/CamelSpringTestContextLoader.java
 (original)
+++ 
camel/trunk/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/CamelSpringTestContextLoader.java
 Mon Mar 26 16:17:22 2012
@@ -57,9 +57,37 @@ public class CamelSpringTestContextLoade
     
     private static final Logger LOG = 
LoggerFactory.getLogger(CamelSpringTestContextLoader.class);
     
+    /**
+     *  Modeled after the Spring implementation in {@link 
AbstractGenericContextLoader},
+     *  this method creates and refreshes the application context while 
providing for
+     *  processing of additional Camel specific post-refresh actions.  We do 
not provide the
+     *  pre-post hooks for customization seen in {@link 
AbstractGenericContextLoader} because
+     *  they probably are unnecessary for 90+% of users.
+     *  <p/>
+     *  For some functionality, we cannot use {@link TestExecutionListener} 
because we need
+     *  to both produce the desired outcome during application context 
loading, and also cleanup
+     *  after ourselves even if the test class never executes.  Thus the 
listeners, which
+     *  only run if the application context is successfully initialized are 
insufficient to
+     *  provide the behavior described above.
+     */
     @Override
-    public ApplicationContext loadContext(MergedContextConfiguration 
configuration) throws Exception {
-        return loadContext(configuration.getLocations());
+    public ApplicationContext loadContext(MergedContextConfiguration 
mergedConfig) throws Exception {
+        
+        Class<?> testClass = getTestClass();
+        
+        if (LOG.isDebugEnabled()) {
+            LOG.debug(String.format("Loading ApplicationContext for merged 
context configuration [%s].",
+                mergedConfig));
+        }
+        
+        try {            
+            GenericApplicationContext context = createContext(testClass);
+            
context.getEnvironment().setActiveProfiles(mergedConfig.getActiveProfiles());
+            loadBeanDefinitions(context, mergedConfig);
+            return loadContext(context, testClass);
+        } finally {
+            cleanup(testClass);
+        }
     }
     
     /**
@@ -80,47 +108,17 @@ public class CamelSpringTestContextLoade
         
         Class<?> testClass = getTestClass();
         
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Loading ApplicationContext for locations ["
+                    + StringUtils.arrayToCommaDelimitedString(locations) + 
"].");
+        }
+        
         try {
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("Loading ApplicationContext for locations ["
-                        + StringUtils.arrayToCommaDelimitedString(locations) + 
"].");
-            }
-            
             GenericApplicationContext context = createContext(testClass);
-            (new 
XmlBeanDefinitionReader(context)).loadBeanDefinitions(locations);
-            AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
-            
-            // Pre CamelContext(s) instantiation setup
-            handleDisableJmx(context, testClass);
-
-            // Temporarily disable CamelContext start while the contexts are 
instantiated.
-            SpringCamelContext.setNoStart(true);
-            context.refresh();
-            context.registerShutdownHook();
-            // Turn CamelContext startup back on since the context's have now 
been instantiated.
-            SpringCamelContext.setNoStart(false);
-            
-            // Post CamelContext(s) instantiation but pre CamelContext(s) 
start setup
-            handleProvidesBreakpoint(context, testClass);
-            handleShutdownTimeout(context, testClass);
-            handleMockEndpoints(context, testClass);
-            handleLazyLoadTypeConverters(context, testClass);
-            
-            // CamelContext(s) startup
-            handleCamelContextStartup(context, testClass);
-            
-            return context;
+            loadBeanDefinitions(context, locations);
+            return loadContext(context, testClass);
         } finally {
-            SpringCamelContext.setNoStart(false);
-            
-            if (testClass.isAnnotationPresent(DisableJmx.class)) {
-                if (CamelSpringTestHelper.getOriginalJmxDisabled() == null) {
-                    System.clearProperty(JmxSystemPropertyKeys.DISABLED);
-                } else {
-                    System.setProperty(JmxSystemPropertyKeys.DISABLED,
-                        CamelSpringTestHelper.getOriginalJmxDisabled());
-                }
-            }
+            cleanup(testClass);
         }
     }
 
@@ -133,6 +131,70 @@ public class CamelSpringTestContextLoade
     }
     
     /**
+     * Performs the bulk of the Spring application context 
loading/customization.
+     *
+     * @param context the partially configured context.  The context should 
have the bean definitions loaded, but nothing else.
+     * @param testClass the test class being executed
+     *
+     * @return the initialized (refreshed) Spring application context
+     *
+     * @throws Exception if there is an error during 
initialization/customization
+     */
+    protected ApplicationContext loadContext(GenericApplicationContext 
context, Class<?> testClass)
+        throws Exception {
+            
+        AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
+        
+        // Pre CamelContext(s) instantiation setup
+        handleDisableJmx(context, testClass);
+
+        // Temporarily disable CamelContext start while the contexts are 
instantiated.
+        SpringCamelContext.setNoStart(true);
+        context.refresh();
+        context.registerShutdownHook();
+        // Turn CamelContext startup back on since the context's have now been 
instantiated.
+        SpringCamelContext.setNoStart(false);
+        
+        // Post CamelContext(s) instantiation but pre CamelContext(s) start 
setup
+        handleProvidesBreakpoint(context, testClass);
+        handleShutdownTimeout(context, testClass);
+        handleMockEndpoints(context, testClass);
+        handleLazyLoadTypeConverters(context, testClass);
+        
+        // CamelContext(s) startup
+        handleCamelContextStartup(context, testClass);
+        
+        return context;
+    }
+    
+    /**
+     * Cleanup/restore global state to defaults / pre-test values after the 
test setup
+     * is complete. 
+     * 
+     * @param testClass the test class being executed
+     */
+    protected void cleanup(Class<?> testClass) {
+        SpringCamelContext.setNoStart(false);
+        
+        if (testClass.isAnnotationPresent(DisableJmx.class)) {
+            if (CamelSpringTestHelper.getOriginalJmxDisabled() == null) {
+                System.clearProperty(JmxSystemPropertyKeys.DISABLED);
+            } else {
+                System.setProperty(JmxSystemPropertyKeys.DISABLED,
+                    CamelSpringTestHelper.getOriginalJmxDisabled());
+            }
+        }
+    }
+    
+    protected void loadBeanDefinitions(GenericApplicationContext context, 
MergedContextConfiguration mergedConfig) {
+        (new 
XmlBeanDefinitionReader(context)).loadBeanDefinitions(mergedConfig.getLocations());
+    }
+    
+    protected void loadBeanDefinitions(GenericApplicationContext context, 
String... locations) {
+        (new XmlBeanDefinitionReader(context)).loadBeanDefinitions(locations);
+    }
+    
+    /**
      * Returns all methods defined in {@code clazz} and its 
superclasses/interfaces.
      */
     protected Collection<Method> getAllMethods(Class<?> clazz)  {


Reply via email to