You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by cz...@apache.org on 2006/07/03 21:02:51 UTC

svn commit: r418827 - in /cocoon/trunk/core/cocoon-core/src: main/java/org/apache/cocoon/core/ main/java/org/apache/cocoon/servlet/ test/java/org/apache/cocoon/ test/java/org/apache/cocoon/core/

Author: cziegeler
Date: Mon Jul  3 12:02:50 2006
New Revision: 418827

URL: http://svn.apache.org/viewvc?rev=418827&view=rev
Log:
Remove reloading of core container completly
Refactore CoreUtil to just have static methods (needs more refactorting)

Removed:
    cocoon/trunk/core/cocoon-core/src/test/java/org/apache/cocoon/core/TestCoreUtil.java
Modified:
    cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/CoreUtil.java
    cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/servlet/CocoonServletListener.java
    cocoon/trunk/core/cocoon-core/src/test/java/org/apache/cocoon/SitemapTestCase.java

Modified: cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/CoreUtil.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/CoreUtil.java?rev=418827&r1=418826&r2=418827&view=diff
==============================================================================
--- cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/CoreUtil.java (original)
+++ cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/CoreUtil.java Mon Jul  3 12:02:50 2006
@@ -74,27 +74,6 @@
     /** Parameter map for the context protocol */
     protected static final Map CONTEXT_PARAMETERS = Collections.singletonMap("force-traversable", Boolean.TRUE);
 
-    /** The callback to the real environment. */
-    protected final BootstrapEnvironment env;
-
-    /** "legacy" support: create an avalon context. */
-    protected final DefaultContext appContext = new ComponentContext();
-
-    /** The settings. */
-    protected MutableSettings settings;
-
-    /** The root logger. */
-    protected Logger log;
-
-    /** The environment context. */
-    protected final Context environmentContext;
-
-    /** The container. */
-    protected ConfigurableBeanFactory container;
-
-    /** The configuration file */
-    protected Source configurationFile;
-
     // Register the location finder for Avalon configuration objects and exceptions
     // and keep a strong reference to it.
     private static final LocationUtils.LocationFinder confLocFinder = new LocationUtils.LocationFinder() {
@@ -144,74 +123,58 @@
         LocationUtils.addFinder(confLocFinder);
     }
     
-    /**
-     * Setup a new instance.
-     * @param context     The environment context.
-     * @throws Exception
-     */
-    public CoreUtil(Context context)
-    throws Exception {
-        this(context, null);
-    }
-
-    /**
-     * Setup a new instance.
-     * @param context     The environment context.
-     * @param environment The optional hook back to the environment.
-     * @throws Exception
-     */
-    public CoreUtil(Context              context,
-                    BootstrapEnvironment environment)
+    public static ConfigurableBeanFactory createRootContainer(Context context)
     throws Exception {
-        this.environmentContext = context;
-        this.env = environment;
-        this.init();
-        // force load classes
-        // as we are using the same classloader for reloading
-        // we have to do this only once
-        this.forceLoad();
+        return createRootContainer(context, null);
     }
 
-    protected void init()
+    public static ConfigurableBeanFactory createRootContainer(Context              environmentContext,
+                                                              BootstrapEnvironment bootstrapEnvironment)
     throws Exception {
         // first let's set up the appContext with some values to make
         // the simple source resolver work
+        // "legacy" support: create an avalon context.
+        final DefaultContext appContext = new ComponentContext();
+
 
         // add root url
-        String contextUrl = this.getContextUrl();
-        CoreUtil.addSourceResolverContext(this.appContext, this.environmentContext, this.env, contextUrl);
+        String contextUrl = CoreUtil.getContextUrl(environmentContext, "/WEB-INF/web.xml");
+        CoreUtil.addSourceResolverContext(appContext, environmentContext, bootstrapEnvironment, contextUrl);
 
         // create settings
-        this.settings = this.createSettings();
+        final MutableSettings settings = CoreUtil.createSettings(environmentContext, appContext, bootstrapEnvironment);
 
         // Create bootstrap logger
-        this.log = BeanFactoryUtil.createBootstrapLogger(this.environmentContext, settings.getBootstrapLogLevel());
+        Logger log = BeanFactoryUtil.createBootstrapLogger(environmentContext, settings.getBootstrapLogLevel());
 
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("Context URL: " + contextUrl);
+        if (log.isDebugEnabled()) {
+            log.debug("Context URL: " + contextUrl);
         }
         // initialize some directories
-        CoreUtil.initSettingsFiles(this.settings, this.log);
+        CoreUtil.initSettingsFiles(settings, log);
 
         // update configuration
-        final URL u = this.getConfigFile(this.settings.getConfiguration());
-        this.settings.setConfiguration(u.toExternalForm());
+        final URL u = CoreUtil.getConfigFile(settings.getConfiguration(), environmentContext, log);
+        settings.setConfiguration(u.toExternalForm());
 
         // dump system properties
-        this.dumpSystemProperties();
+        CoreUtil.dumpSystemProperties(log);
 
         // settings can't be changed anymore
-        this.settings.makeReadOnly();
+        settings.makeReadOnly();
 
         // Init logger
-        this.log = BeanFactoryUtil.createRootLogger(this.environmentContext,
-                                                    this.settings);
+        log = BeanFactoryUtil.createRootLogger(environmentContext,
+                                               settings);
 
         // add the Avalon context attributes that are contained in the settings
-        CoreUtil.addSettingsContext(this.appContext, this.settings);
+        CoreUtil.addSettingsContext(appContext, settings);
 
-        // test the setup of the spring based container
-        this.container = this.setupSpringContainer();
+        // force load classes
+        CoreUtil.forceLoad(settings, log);
+
+        // setup of the spring based container
+        return CoreUtil.setupSpringContainer(settings, environmentContext, appContext, log);
     }
 
     /**
@@ -352,21 +315,23 @@
      *
      * @return A new Settings object
      */
-    protected MutableSettings createSettings() {
+    protected static MutableSettings createSettings(Context              environmentContext,
+                                                    org.apache.avalon.framework.context.Context appContext,
+                                                    BootstrapEnvironment bootstrapEnvironment) {
         // get the running mode
         final String mode = System.getProperty(Settings.PROPERTY_RUNNING_MODE, Settings.DEFAULT_RUNNING_MODE);
-        this.environmentContext.log("Running in mode: " + mode);
+        environmentContext.log("Running in mode: " + mode);
 
         // create an empty settings objects
         final MutableSettings s = new MutableSettings();
 
         // we need our own resolver
-        final SourceResolver resolver = this.createSourceResolver(new LoggerWrapper(this.environmentContext));
+        final SourceResolver resolver = CoreUtil.createSourceResolver(appContext, new LoggerWrapper(environmentContext));
 
         // now read all properties from the properties directory
-        this.readProperties("context://WEB-INF/properties", s, resolver);
+        CoreUtil.readProperties("context://WEB-INF/properties", s, resolver, environmentContext);
         // read all properties from the mode dependent directory
-        this.readProperties("context://WEB-INF/properties/" + mode, s, resolver);
+        CoreUtil.readProperties("context://WEB-INF/properties/" + mode, s, resolver, environmentContext);
 
         // Next look for a custom property provider in the spring root context
         BeanFactory rootContext = BeanFactoryUtil.getWebApplicationContext(environmentContext);
@@ -375,13 +340,13 @@
                 PropertyProvider provider = (PropertyProvider)rootContext.getBean(PropertyProvider.ROLE);
                 s.fill(provider.getProperties(mode, null));
             } catch (Exception ignore) {
-                this.environmentContext.log("Unable to get properties from provider.", ignore);
-                this.environmentContext.log("Continuing initialization.");            
+                environmentContext.log("Unable to get properties from provider.", ignore);
+                environmentContext.log("Continuing initialization.");            
             }
         }
         // fill from the environment configuration, like web.xml etc.
-        if ( this.env != null ) {
-            env.configure(s);
+        if ( bootstrapEnvironment != null ) {
+            bootstrapEnvironment.configure(s);
         }
 
         // read additional properties file
@@ -396,15 +361,15 @@
             }
         }
         if ( additionalPropertyFile != null ) {
-            this.environmentContext.log("Reading user settings from '" + additionalPropertyFile + "'");
+            environmentContext.log("Reading user settings from '" + additionalPropertyFile + "'");
             final Properties p = new Properties();
             try {
                 FileInputStream fis = new FileInputStream(additionalPropertyFile);
                 p.load(fis);
                 fis.close();
             } catch (IOException ignore) {
-                this.environmentContext.log("Unable to read '" + additionalPropertyFile + "'.", ignore);
-                this.environmentContext.log("Continuing initialization.");
+                environmentContext.log("Unable to read '" + additionalPropertyFile + "'.", ignore);
+                environmentContext.log("Continuing initialization.");
             }
         }
         // now overwrite with system properties
@@ -416,16 +381,16 @@
     /**
      * Dump System Properties.
      */
-    protected void dumpSystemProperties() {
-        if (this.log.isDebugEnabled()) {
+    protected static void dumpSystemProperties(Logger log) {
+        if (log.isDebugEnabled()) {
             try {
                 Enumeration e = System.getProperties().propertyNames();
-                this.log.debug("===== System Properties Start =====");
+                log.debug("===== System Properties Start =====");
                 for (; e.hasMoreElements();) {
                     String key = (String) e.nextElement();
-                    this.log.debug(key + "=" + System.getProperty(key));
+                    log.debug(key + "=" + System.getProperty(key));
                 }
-                this.log.debug("===== System Properties End =====");
+                log.debug("===== System Properties End =====");
             } catch (SecurityException se) {
                 // Ignore Exceptions.
             }
@@ -435,9 +400,10 @@
     /**
      * Read all property files from the given directory and apply them to the settings.
      */
-    protected void readProperties(String          directoryName,
-                                  MutableSettings s,
-                                  SourceResolver  resolver) {
+    protected static void readProperties(String          directoryName,
+                                         MutableSettings s,
+                                         SourceResolver  resolver,
+                                         ServletContext  environmentContext) {
         Source directory = null;
         try {
             directory = resolver.resolveURI(directoryName, null, CONTEXT_PARAMETERS);
@@ -457,7 +423,7 @@
                 while ( i.hasNext() ) {
                     final Source src = (Source)i.next();
                     final InputStream propsIS = src.getInputStream();
-                    this.environmentContext.log("Reading settings from '" + src.getURI() + "'.");
+                    environmentContext.log("Reading settings from '" + src.getURI() + "'.");
                     final Properties p = new Properties();
                     p.load(propsIS);
                     propsIS.close();
@@ -465,8 +431,8 @@
                 }
             }
         } catch (IOException ignore) {
-            this.environmentContext.log("Unable to read from directory " + directoryName, ignore);
-            this.environmentContext.log("Continuing initialization.");            
+            environmentContext.log("Unable to read from directory " + directoryName, ignore);
+            environmentContext.log("Continuing initialization.");            
         } finally {
             resolver.release(directory);
         }
@@ -495,12 +461,13 @@
     /**
      * Create a simple source resolver.
      */
-    protected SourceResolver createSourceResolver(Logger logger) {
+    protected static SourceResolver createSourceResolver(org.apache.avalon.framework.context.Context appContext,
+                                                         Logger logger) {
         // Create our own resolver
         final SimpleSourceResolver resolver = new SimpleSourceResolver();
         resolver.enableLogging(logger);
         try {
-            resolver.contextualize(this.appContext);
+            resolver.contextualize(appContext);
         } catch (ContextException ce) {
             throw new CoreInitializationException(
                     "Cannot setup source resolver.", ce);
@@ -508,50 +475,20 @@
         return resolver;        
     }
 
-    /**
-     * Reload the the container.
-     */
-    public synchronized void reloadCore()
+    protected static ConfigurableBeanFactory setupSpringContainer(MutableSettings settings,
+                                                                  ServletContext environmentContext,
+                                                                  org.apache.avalon.framework.context.Context appContext,
+                                                                  Logger   log)
     throws Exception {
-        if (this.settings.isReloadingEnabled("config")) {
-            boolean reload = false;
-
-            if (this.container != null) {
-                if (this.settings.getCreationTime() < this.configurationFile.getLastModified()) {
-                    if (this.log.isInfoEnabled()) {
-                        this.log.info("Configuration changed reload attempt");
-                    }
-                    reload = true;
-                } else {
-                    if (this.log.isInfoEnabled()) {
-                        this.log.info("Forced reload attempt");
-                    }
-                    reload = true;
-                }
-            } else {
-                if (this.log.isInfoEnabled()) {
-                    this.log.info("Invalid configurations reload - container has not been initialized yet.");
-                }
-                reload = true;
-            }
-
-            if (reload) {
-                this.destroy();
-                this.init();
-            }
-        }
-    }
-
-    protected ConfigurableBeanFactory setupSpringContainer() throws Exception {
-        if (this.log.isInfoEnabled()) {
-            this.log.info("Reading root configuration: " + this.settings.getConfiguration());
+        if (log.isInfoEnabled()) {
+            log.info("Reading root configuration: " + settings.getConfiguration());
         }
 
         URLSource urlSource = new URLSource();
-        urlSource.init(new URL(this.settings.getConfiguration()), null);
-        this.configurationFile = new DelayedRefreshSourceWrapper(urlSource,
-                this.settings.getReloadDelay("config"));
-        final InputSource is = SourceUtil.getInputSource(this.configurationFile);
+        urlSource.init(new URL(settings.getConfiguration()), null);
+        final Source configurationFile = new DelayedRefreshSourceWrapper(urlSource,
+                settings.getReloadDelay("config"));
+        final InputSource is = SourceUtil.getInputSource(configurationFile);
 
         final ConfigurationBuilder builder = new ConfigurationBuilder(settings);
         final Configuration rootConfig = builder.build(is);
@@ -559,59 +496,59 @@
         if (!"cocoon".equals(rootConfig.getName())) {
             throw new ConfigurationException("Invalid configuration file\n" + rootConfig.toString());
         }
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("Configuration version: " + rootConfig.getAttribute("version"));
+        if (log.isDebugEnabled()) {
+            log.debug("Configuration version: " + rootConfig.getAttribute("version"));
         }
         if (!Constants.CONF_VERSION.equals(rootConfig.getAttribute("version"))) {
             throw new ConfigurationException("Invalid configuration schema version. Must be '" + Constants.CONF_VERSION + "'.");
         }
 
-        if (this.log.isInfoEnabled()) {
-            this.log.info("Setting up root Spring container.");
+        if (log.isInfoEnabled()) {
+            log.info("Setting up root Spring container.");
         }
-        AvalonEnvironment env = new AvalonEnvironment();
-        env.context = this.appContext;
-        env.logger = this.log;
-        env.settings = this.settings;
-        ConfigurableBeanFactory rootContext = BeanFactoryUtil.createRootBeanFactory(env, this.environmentContext);
-        ConfigurationInfo result = ConfigReader.readConfiguration(settings.getConfiguration(), env);
-        ConfigurableBeanFactory mainContext = BeanFactoryUtil.createBeanFactory(env, result, null, rootContext);
+        final AvalonEnvironment avalonEnv = new AvalonEnvironment();
+        avalonEnv.context = appContext;
+        avalonEnv.logger = log;
+        avalonEnv.settings = settings;
+        ConfigurableBeanFactory rootContext = BeanFactoryUtil.createRootBeanFactory(avalonEnv, environmentContext);
+        ConfigurationInfo result = ConfigReader.readConfiguration(settings.getConfiguration(), avalonEnv);
+        ConfigurableBeanFactory mainContext = BeanFactoryUtil.createBeanFactory(avalonEnv, result, null, rootContext);
 
-        this.settings.setCreationTime(System.currentTimeMillis());
+        settings.setCreationTime(System.currentTimeMillis());
         return mainContext;
     }
 
     /**
      * Get the URL of the main Cocoon configuration file.
      */
-    protected URL getConfigFile(final String configFileName)
+    protected static URL getConfigFile(final String configFileName, Context environmentContext, Logger log)
     throws Exception {
         final String usedFileName;
 
         if (configFileName == null) {
-            if (this.log.isWarnEnabled()) {
-                this.log.warn("No configuration for Cocoon configuration file specified, attempting to use '/WEB-INF/cocoon.xconf'");
+            if (log.isWarnEnabled()) {
+                log.warn("No configuration for Cocoon configuration file specified, attempting to use '/WEB-INF/cocoon.xconf'");
             }
             usedFileName = "/WEB-INF/cocoon.xconf";
         } else {
             usedFileName = configFileName;
         }
 
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("Using configuration file: " + usedFileName);
+        if (log.isDebugEnabled()) {
+            log.debug("Using configuration file: " + usedFileName);
         }
 
         URL result;
         try {
             // test if this is a qualified url
             if (usedFileName.indexOf(':') == -1) {
-                result = this.environmentContext.getResource(usedFileName);
+                result = environmentContext.getResource(usedFileName);
             } else {
                 result = new URL(usedFileName);
             }
         } catch (Exception mue) {
             String msg = "Setting for 'configuration' is invalid : " + usedFileName;
-            this.log.error(msg, mue);
+            log.error(msg, mue);
             throw new CoreInitializationException(msg, mue);
         }
 
@@ -622,7 +559,7 @@
                     result = resultFile.getCanonicalFile().toURL();
                 } catch (Exception e) {
                     String msg = "Setting for 'configuration' is invalid : " + usedFileName;
-                    this.log.error(msg, e);
+                    log.error(msg, e);
                     throw new CoreInitializationException(msg, e);
                 }
             }
@@ -630,16 +567,12 @@
 
         if (result == null) {
             String msg = "Setting for 'configuration' doesn't name an existing resource : " + usedFileName;
-            this.log.error(msg);
+            log.error(msg);
             throw new CoreInitializationException(msg);
         }
         return result;
     }
 
-    protected String getContextUrl() {
-        return CoreUtil.getContextUrl(this.environmentContext, "/WEB-INF/web.xml");
-    }
-
     /**
      * @param environmentContext
      */
@@ -696,36 +629,22 @@
      * entry with whitespace, a comma, or a semi-colon. Cocoon will
      * strip any whitespace from the entry.</p>
      */
-    protected void forceLoad() {
-        final Iterator i = this.settings.getLoadClasses().iterator();
+    protected static void forceLoad(final Settings settings, final Logger log) {
+        final Iterator i = settings.getLoadClasses().iterator();
         while (i.hasNext()) {
             final String fqcn = (String)i.next();
             try {
-                if (this.log.isDebugEnabled()) {
-                    this.log.debug("Loading: " + fqcn);
+                if (log.isDebugEnabled()) {
+                    log.debug("Loading: " + fqcn);
                 }
                 ClassUtils.loadClass(fqcn).newInstance();
             } catch (Exception e) {
-                if (this.log.isWarnEnabled()) {
-                    this.log.warn("Could not load class: " + fqcn, e);
+                if (log.isWarnEnabled()) {
+                    log.warn("Could not load class: " + fqcn, e);
                 }
                 // Do not throw an exception, because it is not a fatal error.
             }
         }
-    }
-
-    /**
-     * Dispose the root processor when environment is destroyed
-     */
-    public void destroy() {
-        if ( this.container != null ) {
-            this.container.destroySingletons();
-            this.container = null;
-        }
-    }
-
-    public ConfigurableBeanFactory getContainer() {
-        return this.container;
     }
 
     protected static final class LoggerWrapper implements Logger {

Modified: cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/servlet/CocoonServletListener.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/servlet/CocoonServletListener.java?rev=418827&r1=418826&r2=418827&view=diff
==============================================================================
--- cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/servlet/CocoonServletListener.java (original)
+++ cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/servlet/CocoonServletListener.java Mon Jul  3 12:02:50 2006
@@ -29,6 +29,7 @@
 import org.apache.cocoon.core.MutableSettings;
 import org.apache.cocoon.environment.http.HttpContext;
 import org.apache.commons.lang.exception.ExceptionUtils;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
 
 /**
  * The Cocoon Servlet listener starts and stops Cocoon and makes
@@ -38,8 +39,8 @@
  */
 public class CocoonServletListener implements ServletContextListener {
 
-    /** CoreUtil */
-    protected CoreUtil coreUtil;
+    /** The core container. */
+    protected ConfigurableBeanFactory cocoonBeanFactory;
 
     /**
      * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
@@ -47,9 +48,9 @@
     public void contextDestroyed(ServletContextEvent event) {
         final ServletContext servletContext = event.getServletContext();
         servletContext.log("Destroying Apache Cocoon Core Container.");
-        if (this.coreUtil != null) {
-            this.coreUtil.destroy();
-            this.coreUtil = null;
+        if (this.cocoonBeanFactory != null) {
+            this.cocoonBeanFactory.destroySingletons();
+            this.cocoonBeanFactory = null;
         }
     }
 
@@ -64,7 +65,7 @@
         ServletBootstrapEnvironment env = new ServletBootstrapEnvironment(servletContext);
 
         try {
-            this.coreUtil = new CoreUtil(new HttpContext(servletContext), env);
+            this.cocoonBeanFactory = CoreUtil.createRootContainer(new HttpContext(servletContext), env);
         } catch (Exception e) {
             servletContext.log("Error during initializing Apache Cocoon " + Constants.VERSION + " - aborting.");
             servletContext.log(e.getMessage());
@@ -72,10 +73,7 @@
             throw new RuntimeException(e);
         }
 
-        servletContext.setAttribute(ProcessingUtil.CONTAINER_CONTEXT_ATTR_NAME, this.coreUtil.getContainer());
-        // for now we store the core util into the servlet context as well to
-        // allow for reloading
-        servletContext.setAttribute(CoreUtil.class.getName(), this.coreUtil);
+        servletContext.setAttribute(ProcessingUtil.CONTAINER_CONTEXT_ATTR_NAME, this.cocoonBeanFactory);
         servletContext.log("Apache Cocoon " + Constants.VERSION + " is up and ready.");
     }
 

Modified: cocoon/trunk/core/cocoon-core/src/test/java/org/apache/cocoon/SitemapTestCase.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-core/src/test/java/org/apache/cocoon/SitemapTestCase.java?rev=418827&r1=418826&r2=418827&view=diff
==============================================================================
--- cocoon/trunk/core/cocoon-core/src/test/java/org/apache/cocoon/SitemapTestCase.java (original)
+++ cocoon/trunk/core/cocoon-core/src/test/java/org/apache/cocoon/SitemapTestCase.java Mon Jul  3 12:02:50 2006
@@ -31,7 +31,6 @@
 import org.apache.cocoon.core.BootstrapEnvironment;
 import org.apache.cocoon.core.CoreUtil;
 import org.apache.cocoon.core.TestBootstrapEnvironment;
-import org.apache.cocoon.core.TestCoreUtil;
 import org.apache.cocoon.environment.Environment;
 import org.apache.cocoon.environment.ObjectModelHelper;
 import org.apache.cocoon.environment.internal.EnvironmentHelper;
@@ -49,7 +48,6 @@
     private Map objectmodel = new HashMap();
 
     private Logger logger;
-    private CoreUtil coreUtil;
     private String classDir;
     private ConfigurableBeanFactory container;
     private ServiceManager serviceManager;
@@ -76,14 +74,18 @@
         BootstrapEnvironment env = 
             new TestBootstrapEnvironment(this.getConfiguration());
 
-        this.coreUtil = new TestCoreUtil(env);
-        this.container = this.coreUtil.getContainer();
+        this.container = CoreUtil.createRootContainer(new MockContext(), env);
         this.serviceManager = (ServiceManager)this.container.getBean(ServiceManager.class.getName());
         this.rootProcessor = (Processor)this.container.getBean(Processor.ROLE);
     }
 
+    /**
+     * @see junit.framework.TestCase#tearDown()
+     */
     protected void tearDown() throws Exception {
-        this.coreUtil.destroy();
+        if ( this.container != null ) {
+            this.container.destroySingletons();
+        }
         super.tearDown();
     }