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/12/31 12:08:16 UTC

svn commit: r491401 - /cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/

Author: cziegeler
Date: Sun Dec 31 03:08:14 2006
New Revision: 491401

URL: http://svn.apache.org/viewvc?view=rev&rev=491401
Log:
Unify global and child settings handling

Modified:
    cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/AbstractSettingsBeanFactoryPostProcessor.java
    cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/ChildSettingsBeanFactoryPostProcessor.java
    cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/RunningModeHelper.java
    cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/SettingsBeanFactoryPostProcessor.java

Modified: cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/AbstractSettingsBeanFactoryPostProcessor.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/AbstractSettingsBeanFactoryPostProcessor.java?view=diff&rev=491401&r1=491400&r2=491401
==============================================================================
--- cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/AbstractSettingsBeanFactoryPostProcessor.java (original)
+++ cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/AbstractSettingsBeanFactoryPostProcessor.java Sun Dec 31 03:08:14 2006
@@ -27,13 +27,17 @@
 import javax.servlet.ServletContext;
 
 import org.apache.cocoon.configuration.MutableSettings;
+import org.apache.cocoon.configuration.PropertyHelper;
+import org.apache.cocoon.configuration.PropertyProvider;
 import org.apache.cocoon.configuration.Settings;
+import org.apache.cocoon.spring.configurator.ResourceUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.BeanDefinitionStoreException;
 import org.springframework.beans.factory.BeanFactory;
 import org.springframework.beans.factory.FactoryBean;
+import org.springframework.beans.factory.HierarchicalBeanFactory;
 import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.beans.factory.config.BeanDefinitionVisitor;
 import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
@@ -70,9 +74,17 @@
 
     protected ResourceLoader resourceLoader;
 
+    /**
+     * Additional properties.
+     */
     protected Properties additionalProperties;
 
     /**
+     * List of additional property directories.
+     */
+    protected List directories;
+
+    /**
      * @see org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#setBeanFactory(org.springframework.beans.factory.BeanFactory)
      */
     public void setBeanFactory(BeanFactory factory) {
@@ -94,11 +106,148 @@
         this.resourceLoader = loader;
     }
 
+    public void setDirectories(List directories) {
+        this.directories = directories;
+    }
+
+    public void setAdditionalProperties(Properties props) {
+        this.additionalProperties = props;
+    }
+
+    /**
+     * Initialize this processor.
+     * Setup the settings object.
+     * @throws Exception
+     */
+    public void init()
+    throws Exception {
+        this.settings = this.createSettings();
+
+        this.dumpSettings();
+    }
+
+    /**
+     * Get the running mode.
+     * This method should be implemented by subclasses.
+     */
+    protected abstract String getRunningMode();
+
+    /**
+     * Return a parent settings object if available.
+     */
+    protected Settings getParentSettings() {
+        final BeanFactory parentBeanFactory = ((HierarchicalBeanFactory)this.beanFactory).getParentBeanFactory();
+        if ( parentBeanFactory != null ) {
+            return (Settings)parentBeanFactory.getBean(Settings.ROLE);
+        }
+        return null;
+    }
+
+    /**
+     * Create a new settings object.
+     * If a parent settings object is available a new child settings object is created.
+     * Otherwise a new root settings object with the running mode is instantiated.
+     */
+    protected MutableSettings createMutableSettingsInstance() {
+        final Settings parentSettings = this.getParentSettings();
+        if ( parentSettings == null ) {
+            return new MutableSettings(this.getRunningMode());              
+        }
+        return new MutableSettings(parentSettings);
+    }
+
+    /**
+     * This method can be used by subclasses to initialize the settings and/or
+     * the properties before {@link #createSettings()} does it's work.
+     */
+    protected void preInit(final MutableSettings s, final Properties properties) {
+        // default implementation does nothing
+    }
+
     /**
-     * This method can be overwritten by subclasses to further initialize the settings
+     * This method can be used by subclasses to initialize the settings and/or
+     * the properties after {@link #createSettings()} did it's work.
      */
-    protected void doInit() {
-        // nothing to do here
+    protected void postInit(final MutableSettings s, final Properties properties) {
+        // default implementation does nothing
+    }
+
+    protected String getNameForPropertyProvider() {
+        return null;
+    }
+
+    /**
+     * Create a settings object.
+     * This method creates the settings by executing the following task:
+     * 1) Create a new mutable settings object invoking {@link #createMutableSettingsInstance()}.
+     * 2) Configure the properties and settings object by calling {@link #preInit(MutableSettings, Properties)}.
+     * 3) Invoke a {@link PropertyProvider} if configured in the same application context (or its parent)
+     * 4) Add properties from configured directories {@link #directories}.
+     * 5) Add additional properties configured at {@link #additionalProperties}
+     * 6) Apply system properties
+     * 7) Configure the properties and settings object by calling {@link #postInit(MutableSettings, Properties)}.
+     * 8) Replace references in properties
+     * 9) Configure the settings object with the properties
+     * 10) Make the settings object read-only.
+     *
+     * @return A new Settings object
+     */
+    protected MutableSettings createSettings() {
+        final String mode = this.getRunningMode();
+        // create an empty settings objects
+        final MutableSettings s = this.createMutableSettingsInstance();
+        // create the initial properties
+        final Properties properties = new Properties();
+        // invoke pre initialization hook
+        this.preInit(s, properties);
+
+        // check for property providers
+        if (this.beanFactory != null && this.beanFactory.containsBean(PropertyProvider.ROLE) ) {
+            try {
+                final PropertyProvider provider = (PropertyProvider)this.beanFactory.getBean(PropertyProvider.ROLE);
+                final Properties providedProperties = provider.getProperties(s, mode, this.getNameForPropertyProvider());
+                if ( providedProperties != null ) {
+                    properties.putAll(providedProperties);
+                }
+            } catch (Exception ignore) {
+                this.logger.warn("Unable to get properties from provider.", ignore);
+                this.logger.warn("Continuing initialization.");            
+            }
+        }
+
+        // add aditional directories
+        if ( this.directories != null ) {
+            final Iterator i = directories.iterator();
+            while ( i.hasNext() ) {
+                final String directory = (String)i.next();
+                // now read all properties from the properties directory
+                ResourceUtils.readProperties(directory, properties, this.getResourceLoader(), this.logger);
+                // read all properties from the mode dependent directory
+                ResourceUtils.readProperties(directory + '/' + mode, properties, this.getResourceLoader(), this.logger);
+            }
+        }
+
+        // add additional properties
+        if ( this.additionalProperties != null ) {
+            PropertyHelper.replaceAll(this.additionalProperties, s);
+            properties.putAll(this.additionalProperties);
+        }
+
+        // now overwrite with system properties
+        try {
+            properties.putAll(System.getProperties());
+        } catch (SecurityException se) {
+            // we ignore this
+        }
+        // invoke pre initialization hook
+        this.postInit(s, properties);
+
+        PropertyHelper.replaceAll(properties, this.getParentSettings());
+        // configure settings
+        s.configure(properties);
+        s.makeReadOnly();
+
+        return s;
     }
 
     protected ResourceLoader getResourceLoader() {

Modified: cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/ChildSettingsBeanFactoryPostProcessor.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/ChildSettingsBeanFactoryPostProcessor.java?view=diff&rev=491401&r1=491400&r2=491401
==============================================================================
--- cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/ChildSettingsBeanFactoryPostProcessor.java (original)
+++ cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/ChildSettingsBeanFactoryPostProcessor.java Sun Dec 31 03:08:14 2006
@@ -18,21 +18,18 @@
  */
 package org.apache.cocoon.spring.configurator.impl;
 
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-
-import org.apache.cocoon.configuration.MutableSettings;
-import org.apache.cocoon.configuration.PropertyHelper;
-import org.apache.cocoon.configuration.PropertyProvider;
-import org.apache.cocoon.configuration.Settings;
-import org.apache.cocoon.spring.configurator.ResourceUtils;
-import org.springframework.beans.factory.BeanFactory;
-import org.springframework.beans.factory.HierarchicalBeanFactory;
 
 /**
  * This is a bean factory post processor which sets up a child settings object.
  *
+ * The settings object is created by reading several property files and merging of
+ * the values. If there is more than one definition for a property, the last one wins.
+ * The property files are read in the following order:
+ * 1) Property provider (if configured in the bean factory)
+ * 2) Add properties from configured directories {@link #directories}.
+ * 3) Add additional properties configured at {@link #additionalProperties}
+ * 4) System properties
+ *
  * @since 1.0
  * @version $Id$
  */
@@ -42,92 +39,24 @@
     /** Unique name for this child settings context. */
     protected String name;
 
-    /** List of property directories. */
-    protected List directories;
-
     /**
-     * Initialize this settings.
-     * Setup the settings object.
-     * @throws Exception
+     * Set the unique name for this settings context.
      */
-    public void init()
-    throws Exception {
-        this.settings = this.createSettings();
-
-        this.doInit();
-
-        // settings can't be changed anymore
-        this.settings.makeReadOnly();
-    }
-
     public void setName(String newName) {
         this.name = newName;
     }
 
-    public void setDirectories(List directories) {
-        this.directories = directories;
-    }
-
-    public void setAdditionalProperties(Properties props) {
-        this.additionalProperties = props;
+    /**
+     * @see org.apache.cocoon.spring.configurator.impl.AbstractSettingsBeanFactoryPostProcessor#getRunningMode()
+     */
+    protected String getRunningMode() {
+        return this.getParentSettings().getRunningMode();
     }
 
     /**
-     * Get the settings for Cocoon.
-     * This method reads several property files and merges the result. If there
-     * is more than one definition for a property, the last one wins.
-     * The property files are read in the following order:
-     * 1) PROPERTYDIR/*.properties
-     *    Default values for the core and each block - the order in which the files are read is not guaranteed.
-     * 2) PROPERTYDIR/[RUNNING_MODE]/*.properties
-     *    Default values for the running mode - the order in which the files are read is not guaranteed.
-     * 3) Property providers (ToBeDocumented)
-     *
-     * @return A new Settings object
+     * @see org.apache.cocoon.spring.configurator.impl.AbstractSettingsBeanFactoryPostProcessor#getNameForPropertyProvider()
      */
-    protected MutableSettings createSettings() {
-        final BeanFactory parentBeanFactory = ((HierarchicalBeanFactory)this.beanFactory).getParentBeanFactory();
-        final Settings parent = (Settings)parentBeanFactory.getBean(Settings.ROLE);
-        // get the running mode
-        final String mode = parent.getRunningMode();
-        // get properties
-        final Properties properties = new Properties();
-
-        // create an empty settings objects
-        final MutableSettings s = new MutableSettings(parent);
-
-        if ( this.directories != null ) {
-            final Iterator i = directories.iterator();
-            while ( i.hasNext() ) {
-                final String directory = (String)i.next();
-                // now read all properties from the properties directory
-                ResourceUtils.readProperties(directory, properties, this.getResourceLoader(), this.logger);
-                // read all properties from the mode dependent directory
-                ResourceUtils.readProperties(directory + '/' + mode, properties, this.getResourceLoader(), this.logger);
-            }
-        }
-
-        // Next look for a custom property provider in the parent bean factory
-        if (parentBeanFactory.containsBean(PropertyProvider.ROLE) ) {
-            try {
-                final PropertyProvider provider = (PropertyProvider)parentBeanFactory.getBean(PropertyProvider.ROLE);
-                final Properties providedProperties = provider.getProperties(s, mode, this.name);
-                if ( providedProperties != null ) {
-                    properties.putAll(providedProperties);
-                }
-            } catch (Exception ignore) {
-                this.logger.warn("Unable to get properties from provider.", ignore);
-                this.logger.warn("Continuing initialization.");            
-            }
-        }
-
-        if ( this.additionalProperties != null ) {
-            PropertyHelper.replaceAll(this.additionalProperties, s);
-            properties.putAll(this.additionalProperties);
-        }
-        PropertyHelper.replaceAll(properties, parent);
-        s.configure(properties);
-
-        return s;
+    protected String getNameForPropertyProvider() {
+        return this.name;
     }
 }

Modified: cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/RunningModeHelper.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/RunningModeHelper.java?view=diff&rev=491401&r1=491400&r2=491401
==============================================================================
--- cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/RunningModeHelper.java (original)
+++ cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/RunningModeHelper.java Sun Dec 31 03:08:14 2006
@@ -26,8 +26,11 @@
  * @since 1.0
  * @version $Id$
  */
-public class RunningModeHelper {
+public abstract class RunningModeHelper {
 
+    /**
+     * Name of the system property specifying the running mode.
+     */
     public final static String PROPERTY_RUNNING_MODE = "org.apache.cocoon.mode";
     
     // determine an ev. set running mode from the system properties
@@ -42,15 +45,12 @@
         SYSTEM_RUNNING_MODE = mode;
     }
 
-    /** Name of the property specifying the running mode. */
-    private RunningModeHelper() {
-        // never initiate
-    }
-
     /** 
-     * Determine the runningmode. 
+     * Determine the running mode. 
      * A non-null system property will have precedence over everything else.
      * The system default running mode will be used if the passed parameter mode is null.
+     * @see #PROPERTY_RUNNING_MODE
+     * @see SettingsDefaults#DEFAULT_RUNNING_MODE
      */
     public static String determineRunningMode(String mode) {
         if (SYSTEM_RUNNING_MODE != null) {
@@ -60,5 +60,20 @@
             return SettingsDefaults.DEFAULT_RUNNING_MODE;
         }
         return mode;
+    }
+
+    /**
+     * Check if the value for the running mode is valid.
+     * @throws IllegalArgumentException if the mode is invalid
+     */
+    public static void checkRunningMode(String mode)
+    throws IllegalArgumentException {
+        /*
+        if ( !Arrays.asList(SettingsDefaults.RUNNING_MODES).contains(mode) ) {
+            final String msg =
+                "Invalid running mode: " + mode + " - Use one of: " + Arrays.asList(SettingsDefaults.RUNNING_MODES);
+            throw new IllegalArgumentException(msg);
+        }
+        */        
     }
 }

Modified: cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/SettingsBeanFactoryPostProcessor.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/SettingsBeanFactoryPostProcessor.java?view=diff&rev=491401&r1=491400&r2=491401
==============================================================================
--- cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/SettingsBeanFactoryPostProcessor.java (original)
+++ cocoon/trunk/core/cocoon-configuration/cocoon-spring-configurator/src/main/java/org/apache/cocoon/spring/configurator/impl/SettingsBeanFactoryPostProcessor.java Sun Dec 31 03:08:14 2006
@@ -26,8 +26,6 @@
 import java.util.Properties;
 
 import org.apache.cocoon.configuration.MutableSettings;
-import org.apache.cocoon.configuration.PropertyHelper;
-import org.apache.cocoon.configuration.PropertyProvider;
 import org.apache.cocoon.configuration.Settings;
 import org.apache.cocoon.configuration.SettingsDefaults;
 import org.apache.cocoon.spring.configurator.ResourceUtils;
@@ -38,125 +36,99 @@
  * them in the spring configuration files.
  * In addition this bean acts as a factory bean providing the settings object.
  *
+ * The settings object is created by reading several property files and merging of
+ * the values. If there is more than one definition for a property, the last one wins.
+ * The property files are read in the following order:
+ * 1) If {@link #readFromClasspath} is true: classpath*:/META-INF/cocoon/properties/*.properties
+ *    Default values for the core and each block - the files are read in alphabetical order.
+ *    Actually the files are read in two chunks, the first one containing all property files
+ *    from jar files, and the second one containing all property files from WEB-INF/classes.
+ * 2) If {@link #readFromClasspath} is true: classpath*:/META-INF/cocoon/properties/[RUNNING_MODE]/*.properties
+ *    Default values for the core and each block for a specific running mode - the files are
+ *    read in alphabetical order.
+ *    Actually the files are read in two chunks, the first one containing all property files
+ *    from jar files, and the second one containing all property files from WEB-INF/classes.
+ * 3) If {@link #readFromGlobalLocation} is true: /WEB-INF/cocoon/properties/*.properties
+ *    Default values for the core and each block - the files are read in alphabetical order.
+ *    Actually the files are read in two chunks, the first one containing all property files
+ *    from jar files, and the second one containing all property files from WEB-INF/classes.
+ * 4) If {@link #readFromGlobalLocation} is true: /WEB-INF/cocoon/properties/[RUNNING_MODE]/*.properties
+ *    Default values for the core and each block for a specific running mode - the files are
+ *    read in alphabetical order.
+ *    Actually the files are read in two chunks, the first one containing all property files
+ *    from jar files, and the second one containing all property files from WEB-INF/classes.
+ * 5) Working directory from servlet context (if not already set)
+ * 6) Optional property file which is stored under ".cocoon/settings.properties" in the user
+ *    directory.
+ * 7) Additional property file specified by the "org.apache.cocoon.settings" property. If the
+ *    property defines a directory, all property files from this directory are read in alphabetical
+ *    order and all files from a sub directory with the name of the current running mode
+ *    are read in alphabetical order as well.
+ * 8) Property provider (if configured in the bean factory)
+ * 9) Add properties from configured directories {@link #directories}.
+ * 10) Add additional properties configured at {@link #additionalProperties}
+ * 11) System properties
+ *
+ * This means that system properties (provided on startup of the web application) override all
+ * others etc.
+ *
  * @since 1.0
  * @version $Id$
  */
 public class SettingsBeanFactoryPostProcessor
     extends AbstractSettingsBeanFactoryPostProcessor {
 
+    /**
+     * The running mode for the web application.
+     */
     protected String runningMode = SettingsDefaults.DEFAULT_RUNNING_MODE;
 
+    /**
+     * Should we read the properties from the classpath?
+     * @see Constants#CLASSPATH_PROPERTIES_LOCATION
+     */
+    protected boolean readFromClasspath = true;
+
+    /**
+     * Should we read the properties from the global location?
+     * @see Constants#GLOBAL_PROPERTIES_LOCATION
+     */
+    protected boolean readFromGlobalLocation = true;
+
+    /**
+     * Set the running mode.
+     */
     public void setRunningMode(String runningMode) {
         this.runningMode = runningMode;
     }
 
     /**
-     * Initialize this processor.
-     * Setup the settings object.
-     * @throws Exception
+     * Set if we read property configurations from the classpath.
+     * @param readFromClasspath
      */
-    public void init()
-    throws Exception {
-        this.settings = this.createSettings();
-
-        this.doInit();
-
-        this.initSettingsFiles();
-        // settings can't be changed anymore
-        this.settings.makeReadOnly();
-
-        this.dumpSystemProperties();
-        this.dumpSettings();
-        this.forceLoad();
+    public void setReadFromClasspath(boolean readFromClasspath) {
+        this.readFromClasspath = readFromClasspath;
     }
 
     /**
-     * Init work, upload and cache directory
+     * Set if we read property configurations from the global location.
      */
-    protected void initSettingsFiles() {
-        // first init the work-directory for the logger.
-        // this is required if we are running inside a war file!
-        final String workDirParam = settings.getWorkDirectory();
-        File workDir;
-        if (workDirParam != null) {
-            // No context path : consider work-directory as absolute
-            workDir = new File(workDirParam);
-        } else {
-            workDir = new File("cocoon-files");
-        }
-        workDir.mkdirs();
-        settings.setWorkDirectory(workDir.getAbsolutePath());
-
-        // Output some debug info
-        if (this.logger.isDebugEnabled()) {
-            if (workDirParam != null) {
-                this.logger.debug("Using work-directory " + workDir);
-            } else {
-                this.logger.debug("Using default work-directory " + workDir);
-            }
-        }
-
-        String cacheDirParam = settings.getCacheDirectory();
-        File cacheDir;
-        if (cacheDirParam != null) {
-            cacheDir = new File(cacheDirParam);
-            if (this.logger.isDebugEnabled()) {
-                this.logger.debug("Using cache-directory " + cacheDir);
-            }
-        } else {
-            cacheDir = new File(workDir, "cache-dir" + File.separator);
-            File parent = cacheDir.getParentFile();
-            if (parent != null) {
-                parent.mkdirs();
-            }
-            if (this.logger.isDebugEnabled()) {
-                this.logger.debug("cache-directory was not set - defaulting to " + cacheDir);
-            }
-        }
-        cacheDir.mkdirs();
-        settings.setCacheDirectory(cacheDir.getAbsolutePath());
+    public void setReadFromGlobalLocation(boolean readFromGlobalLocation) {
+        this.readFromGlobalLocation = readFromGlobalLocation;
     }
 
     /**
-     * Get the settings for Cocoon.
-     * This method reads several property files and merges the result. If there
-     * is more than one definition for a property, the last one wins.
-     * The property files are read in the following order:
-     * 1) classpath*:/META-INF/cocoon/properties/*.properties
-     *    Default values for the core and each block - the files are read in alphabetical order.
-     *    Actually the files are read in two chunks, the first one containing all property files
-     *    from jar files, and the second one containing all property files from WEB-INF/classes.
-     * 2) classpath*:/META-INF/cocoon/properties/[RUNNING_MODE]/*.properties
-     *    Default values for the core and each block for a specific running mode - the files are
-     *    read in alphabetical order.
-     *    Actually the files are read in two chunks, the first one containing all property files
-     *    from jar files, and the second one containing all property files from WEB-INF/classes.
-     * 3) Working directory from servlet context (if not already set)
-     * 4) Optional property file which is stored under ".cocoon/settings.properties" in the user
-     *    directory.
-     * 5) Additional property file specified by the "org.apache.cocoon.settings" property. If the
-     *    property defines a directory, all property files from this directory are read in alphabetical
-     *    order and all files from a sub directory with the name of the current running mode
-     *    are read in alphabetical order as well.
-     * 6) Property provider (if configured in the bean factory)
-     * 7) System properties
-     *
-     * This means that system properties (provided on startup of the web application) override all
-     * others etc.
-     *
-     * @return A new Settings object
+     * Initialize this processor.
+     * Setup the settings object.
+     * @throws Exception
      */
-    protected MutableSettings createSettings() {
+    public void init()
+    throws Exception {
         // get the running mode
-        final String mode = RunningModeHelper.determineRunningMode( this.runningMode );
+        final String mode = this.getRunningMode();
+        RunningModeHelper.checkRunningMode(mode);
 
-        /*
-        if ( !Arrays.asList(SettingsDefaults.RUNNING_MODES).contains(mode) ) {
-            final String msg =
-                "Invalid running mode: " + mode + " - Use one of: " + Arrays.asList(SettingsDefaults.RUNNING_MODES);
-            throw new IllegalArgumentException(msg);
-        }
-        */
+        // print out version information
         final Properties pomProps = ResourceUtils.getPOMProperties("org.apache.cocoon", "cocoon-spring-configurator");
         final String version;
         if ( pomProps != null ) {
@@ -164,29 +136,45 @@
         } else {
             version = null;
         }
-
         this.servletContext.log("Apache Cocoon Spring Configurator " +
                                 (version != null ? "v" + version + " " : "") +
                                 "is running in mode '" + mode + "'.");
 
-        // create an empty settings objects
-        final MutableSettings s = new MutableSettings(mode);
-        // create an empty properties object
-        final Properties properties = new Properties();
-
-        // now read all properties from classpath directory
-        ResourceUtils.readProperties(org.apache.cocoon.spring.configurator.impl.Constants.CLASSPATH_PROPERTIES_LOCATION,
-                properties, this.getResourceLoader(), this.logger);
-        // read all properties from the mode dependent directory
-        ResourceUtils.readProperties(org.apache.cocoon.spring.configurator.impl.Constants.CLASSPATH_PROPERTIES_LOCATION
-                + "/" + mode, properties, this.getResourceLoader(), this.logger);
-
-        // now read all properties from the properties directory
-        ResourceUtils.readProperties(org.apache.cocoon.spring.configurator.impl.Constants.GLOBAL_PROPERTIES_LOCATION,
-                properties, this.getResourceLoader(), this.logger);
-        // read all properties from the mode dependent directory
-        ResourceUtils.readProperties(org.apache.cocoon.spring.configurator.impl.Constants.GLOBAL_PROPERTIES_LOCATION
-                + "/" + mode, properties, this.getResourceLoader(), this.logger);
+        // first we dump the system properties
+        this.dumpSystemProperties();
+        // now create the settings object
+        super.init();
+
+        // finally pre load classes
+        this.forceLoad();
+    }
+
+    /**
+     * @see org.apache.cocoon.spring.configurator.impl.AbstractSettingsBeanFactoryPostProcessor#getRunningMode()
+     */
+    protected String getRunningMode() {
+        return RunningModeHelper.determineRunningMode( this.runningMode );
+    }
+
+    protected void preInit(final MutableSettings s, final Properties properties) {
+        final String mode = this.getRunningMode();
+        if ( this.readFromClasspath ) {
+            // now read all properties from classpath directory
+            ResourceUtils.readProperties(Constants.CLASSPATH_PROPERTIES_LOCATION,
+                    properties, this.getResourceLoader(), this.logger);
+            // read all properties from the mode dependent directory
+            ResourceUtils.readProperties(Constants.CLASSPATH_PROPERTIES_LOCATION
+                    + "/" + mode, properties, this.getResourceLoader(), this.logger);
+        }
+
+        if ( this.readFromGlobalLocation ) {
+            // now read all properties from the properties directory
+            ResourceUtils.readProperties(Constants.GLOBAL_PROPERTIES_LOCATION,
+                    properties, this.getResourceLoader(), this.logger);
+            // read all properties from the mode dependent directory
+            ResourceUtils.readProperties(Constants.GLOBAL_PROPERTIES_LOCATION
+                    + "/" + mode, properties, this.getResourceLoader(), this.logger);
+        }
 
         // fill from the servlet context
         if ( s.getWorkDirectory() == null ) {
@@ -242,35 +230,53 @@
                 this.logger.info("Additional settings file '" + additionalPropertyFile + "' does not exist - continuing with initialization.");
             }
         }
-        // check for property providers
-        if (this.beanFactory != null && this.beanFactory.containsBean(PropertyProvider.ROLE) ) {
-            try {
-                final PropertyProvider provider = (PropertyProvider)this.beanFactory.getBean(PropertyProvider.ROLE);
-                final Properties providedProperties = provider.getProperties(s, mode, null);
-                if ( providedProperties != null ) {
-                    properties.putAll(providedProperties);
-                }
-            } catch (Exception ignore) {
-                this.logger.warn("Unable to get properties from provider.", ignore);
-                this.logger.warn("Continuing initialization.");            
-            }
-        }
-        
-        if ( this.additionalProperties != null ) {
-            PropertyHelper.replaceAll(this.additionalProperties, s);
-            properties.putAll(this.additionalProperties);
+    }
+
+    /**
+     * Init work, upload and cache directory
+     */
+    protected void postInit(final MutableSettings s, final Properties properties) {
+        // first init the work-directory for the logger.
+        // this is required if we are running inside a war file!
+        final String workDirParam = s.getWorkDirectory();
+        File workDir;
+        if (workDirParam != null) {
+            // No context path : consider work-directory as absolute
+            workDir = new File(workDirParam);
+        } else {
+            workDir = new File("cocoon-files");
         }
+        workDir.mkdirs();
+        s.setWorkDirectory(workDir.getAbsolutePath());
 
-        // now overwrite with system properties
-        try {
-            properties.putAll(System.getProperties());
-        } catch (SecurityException se) {
-            // we ignore this
+        // Output some debug info
+        if (this.logger.isDebugEnabled()) {
+            if (workDirParam != null) {
+                this.logger.debug("Using work-directory " + workDir);
+            } else {
+                this.logger.debug("Using default work-directory " + workDir);
+            }
         }
-        PropertyHelper.replaceAll(properties, null);
-        s.configure(properties);
 
-        return s;
+        String cacheDirParam = s.getCacheDirectory();
+        File cacheDir;
+        if (cacheDirParam != null) {
+            cacheDir = new File(cacheDirParam);
+            if (this.logger.isDebugEnabled()) {
+                this.logger.debug("Using cache-directory " + cacheDir);
+            }
+        } else {
+            cacheDir = new File(workDir, "cache-dir" + File.separator);
+            File parent = cacheDir.getParentFile();
+            if (parent != null) {
+                parent.mkdirs();
+            }
+            if (this.logger.isDebugEnabled()) {
+                this.logger.debug("cache-directory was not set - defaulting to " + cacheDir);
+            }
+        }
+        cacheDir.mkdirs();
+        s.setCacheDirectory(cacheDir.getAbsolutePath());
     }
 
     /**