Author: cziegeler
Date: Tue Mar 15 11:42:21 2005
New Revision: 157579

URL: http://svn.apache.org/viewcvs?view=rev&rev=157579
Log:
Start prototyp of application container support

Added:
    cocoon/trunk/src/java/org/apache/cocoon/sitemap/ComponentLocator.java   
(with props)
    cocoon/trunk/src/java/org/apache/cocoon/sitemap/impl/ComponentManager.java  
 (with props)
Modified:
    cocoon/trunk/src/core/java/org/apache/cocoon/core/Core.java
    
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java
    cocoon/trunk/src/java/org/apache/cocoon/servlet/CocoonServlet.java

Modified: cocoon/trunk/src/core/java/org/apache/cocoon/core/Core.java
URL: 
http://svn.apache.org/viewcvs/cocoon/trunk/src/core/java/org/apache/cocoon/core/Core.java?view=diff&r1=157578&r2=157579
==============================================================================
--- cocoon/trunk/src/core/java/org/apache/cocoon/core/Core.java (original)
+++ cocoon/trunk/src/core/java/org/apache/cocoon/core/Core.java Tue Mar 15 
11:42:21 2005
@@ -16,9 +16,13 @@
  */
 package org.apache.cocoon.core;
 
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Properties;
 
 import org.apache.avalon.framework.CascadingRuntimeException;
 import org.apache.avalon.framework.context.Context;
@@ -118,4 +122,60 @@
         }
     }
 
+    /**
+     * Get the settings for Cocoon
+     * @param env This provides access to various parts of the used 
environment.
+     */
+    public static Settings createSettings(BootstrapEnvironment env) {
+        // create an empty settings objects
+        final Settings s = new Settings();
+
+        String additionalPropertyFile = 
System.getProperty(Settings.PROPERTY_USER_SETTINGS);
+        
+        // read cocoon-settings.properties - if available
+        InputStream propsIS = env.getInputStream("cocoon-settings.properties");
+        if ( propsIS != null ) {
+            env.log("Reading settings from 'cocoon-settings.properties'");
+            final Properties p = new Properties();
+            try {
+                p.load(propsIS);
+                propsIS.close();
+                s.fill(p);
+                additionalPropertyFile = 
p.getProperty(Settings.PROPERTY_USER_SETTINGS, additionalPropertyFile);
+            } catch (IOException ignore) {
+                env.log("Unable to read 'cocoon-settings.properties'.", 
ignore);
+                env.log("Continuing initialization.");
+            }
+        }
+        // fill from the environment configuration, like web.xml etc.
+        env.configure(s);
+        
+        // read additional properties file
+        if ( additionalPropertyFile != null ) {
+            env.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) {
+                env.log("Unable to read '" + additionalPropertyFile + "'.", 
ignore);
+                env.log("Continuing initialization.");
+            }
+        }
+        // now overwrite with system properties
+        s.fill(System.getProperties());
+
+        return s;        
+    }
+
+    public static interface BootstrapEnvironment {
+
+        void log(String message);
+        void log(String message, Throwable error);
+        
+        InputStream getInputStream(String path);
+        
+        void configure(Settings settings);
+    }
 }

Modified: 
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java
URL: 
http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java?view=diff&r1=157578&r2=157579
==============================================================================
--- 
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java
 (original)
+++ 
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java
 Tue Mar 15 11:42:21 2005
@@ -27,6 +27,7 @@
 import org.apache.avalon.framework.configuration.Configuration;
 import org.apache.avalon.framework.configuration.ConfigurationException;
 import org.apache.avalon.framework.configuration.DefaultConfiguration;
+import org.apache.avalon.framework.container.ContainerUtil;
 import org.apache.avalon.framework.context.Context;
 import org.apache.avalon.framework.context.DefaultContext;
 import org.apache.avalon.framework.service.ServiceManager;
@@ -40,7 +41,10 @@
 import org.apache.cocoon.environment.internal.EnvironmentHelper;
 import org.apache.cocoon.generation.Generator;
 import org.apache.cocoon.serialization.Serializer;
+import org.apache.cocoon.sitemap.ComponentLocator;
 import org.apache.cocoon.sitemap.PatternException;
+import org.apache.cocoon.sitemap.impl.ComponentManager;
+import org.apache.cocoon.util.ClassUtils;
 import org.apache.cocoon.util.StringUtils;
 import org.apache.regexp.RE;
 
@@ -93,16 +97,32 @@
         Thread currentThread = Thread.currentThread();
         ClassLoader oldClassLoader = currentThread.getContextClassLoader();
         currentThread.setContextClassLoader(newClassLoader);
-        CocoonServiceManager newManager;
+        ServiceManager newManager;
         
         try {
             newManager = new CocoonServiceManager(this.parentProcessorManager, 
newClassLoader);
     
             // Go through the component lifecycle
-            newManager.enableLogging(getLogger());
-            newManager.contextualize(context);
-            newManager.configure(config);
-            newManager.initialize();
+            ContainerUtil.enableLogging(newManager, this.getLogger());
+            ContainerUtil.contextualize(newManager, context);
+            ContainerUtil.configure(newManager, config);
+            ContainerUtil.initialize(newManager);
+
+            // check for an application specific container
+            Configuration appContainer = 
config.getChild("application-container", false);
+            if ( appContainer != null ) {
+                final String clazzName = appContainer.getAttribute("class");
+
+                ComponentLocator cl = 
(ComponentLocator)ClassUtils.newInstance(clazzName); 
+                // Go through the component lifecycle
+                ContainerUtil.enableLogging(cl, this.getLogger());
+                ContainerUtil.contextualize(cl, context);
+                ContainerUtil.service(cl, newManager);
+                ContainerUtil.configure(cl, appContainer);
+                ContainerUtil.initialize(cl);
+                
+                newManager = new ComponentManager(newManager, cl);
+            }
         } finally {
             currentThread.setContextClassLoader(oldClassLoader);
         }

Modified: cocoon/trunk/src/java/org/apache/cocoon/servlet/CocoonServlet.java
URL: 
http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/servlet/CocoonServlet.java?view=diff&r1=157578&r2=157579
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/servlet/CocoonServlet.java 
(original)
+++ cocoon/trunk/src/java/org/apache/cocoon/servlet/CocoonServlet.java Tue Mar 
15 11:42:21 2005
@@ -16,7 +16,6 @@
 package org.apache.cocoon.servlet;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -158,55 +157,7 @@
 
     /** Settings */
     protected Settings settings;
-    
-    /**
-     * Get the settings for Cocoon
-     * If a subclass uses different default values for settings, this method
-     * can be overwritten
-     */
-    protected Settings getSettings() {
-        // create an empty settings objects
-        final Settings s = new Settings();
 
-        String additionalPropertyFile = 
System.getProperty(Settings.PROPERTY_USER_SETTINGS);
-        
-        // read cocoon-settings.properties - if available
-        InputStream propsIS = 
this.getServletContext().getResourceAsStream("cocoon-settings.properties");
-        if ( propsIS != null ) {
-            this.servletContext.log("Reading settings from 
'cocoon-settings.properties'");
-            final Properties p = new Properties();
-            try {
-                p.load(propsIS);
-                propsIS.close();
-                s.fill(p);
-                additionalPropertyFile = 
p.getProperty(Settings.PROPERTY_USER_SETTINGS, additionalPropertyFile);
-            } catch (IOException ignore) {
-                this.servletContext.log("Unable to read 
'cocoon-settings.properties'.", ignore);
-                this.servletContext.log("Continuing initialization.");
-            }
-        }
-        // fill from the servlet parameters
-        SettingsHelper.fill(s, this.getServletConfig());
-        
-        // read additional properties file
-        if ( additionalPropertyFile != null ) {
-            this.servletContext.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.servletContext.log("Unable to read '" + 
additionalPropertyFile + "'.", ignore);
-                this.servletContext.log("Continuing initialization.");
-            }
-        }
-        // now overwrite with system properties
-        s.fill(System.getProperties());
-
-        return s;        
-    }
-    
     /**
      * Initialize this <code>CocoonServlet</code> instance.  You will
      * notice that I have broken the init into sub methods to make it
@@ -227,7 +178,10 @@
         super.init(conf);
 
         // initialize settings
-        this.settings = this.getSettings();
+        Core.BootstrapEnvironment env = new ServletBootstrapEnvironment(conf);
+
+        this.settings = Core.createSettings(env);
+
         this.appContext.put(Core.CONTEXT_SETTINGS, this.settings);
         
         if (this.settings.isInitClassloader()) {
@@ -1340,4 +1294,32 @@
     protected LoggerManager getLoggerManager() {
         return this.loggerManager;
     }
+
+    protected static final class ServletBootstrapEnvironment
+    implements Core.BootstrapEnvironment {
+
+        private final ServletConfig config;
+
+        public ServletBootstrapEnvironment(ServletConfig config) {
+            this.config = config;
+        }
+
+        public void log(String message) {
+            this.config.getServletContext().log(message);
+        }
+        
+        public void log(String message, Throwable error) {
+            this.config.getServletContext().log(message, error);            
+        }
+        
+        public InputStream getInputStream(String path) {
+            return this.config.getServletContext().getResourceAsStream(path);
+        }
+        
+        public void configure(Settings settings) {
+            // fill from the servlet parameters
+            SettingsHelper.fill(settings, this.config);                
+        }
+    }
+
 }

Added: cocoon/trunk/src/java/org/apache/cocoon/sitemap/ComponentLocator.java
URL: 
http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/sitemap/ComponentLocator.java?view=auto&rev=157579
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/sitemap/ComponentLocator.java 
(added)
+++ cocoon/trunk/src/java/org/apache/cocoon/sitemap/ComponentLocator.java Tue 
Mar 15 11:42:21 2005
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2005 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
+ * 
+ * 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.cocoon.sitemap;
+
+
+/**
+ * TODO WORK IN PROGRESS!!
+ *
+ * This interface is the connection between the Cocoon core components
+ * and an optional application/sitemap container.
+ *
+ * @since 2.2
+ * @version $Id:$
+ */
+public interface ComponentLocator {
+
+    Object lookup(String key);
+
+    void release(Object component);
+
+    boolean hasComponent(String key);
+}

Propchange: 
cocoon/trunk/src/java/org/apache/cocoon/sitemap/ComponentLocator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
cocoon/trunk/src/java/org/apache/cocoon/sitemap/ComponentLocator.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: 
cocoon/trunk/src/java/org/apache/cocoon/sitemap/impl/ComponentManager.java
URL: 
http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/sitemap/impl/ComponentManager.java?view=auto&rev=157579
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/sitemap/impl/ComponentManager.java 
(added)
+++ cocoon/trunk/src/java/org/apache/cocoon/sitemap/impl/ComponentManager.java 
Tue Mar 15 11:42:21 2005
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2005 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
+ * 
+ * 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.cocoon.sitemap.impl;
+
+import org.apache.avalon.framework.CascadingRuntimeException;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.cocoon.sitemap.ComponentLocator;
+
+
+/**
+ * This is the connection between the Cocoon core components
+ * and an optional application/sitemap container.
+ *
+ * It acts as a service manager and as a component locator at the same time.
+ * A component manager is initialized with both, a service manager for a 
sitemap
+ * and an optional component locator for the sitemap. Each operation (lookup 
etc.)
+ * is first performed on the component locator. If the locator does not have
+ * the component in question, the service manager is asked.
+ *
+ * @since 2.2
+ * @version $Id:$
+ */
+public class ComponentManager implements ServiceManager, ComponentLocator {
+
+    final protected ServiceManager serviceManager;
+    final protected ComponentLocator componentLocator;
+
+    public ComponentManager(final ServiceManager sm, final ComponentLocator 
cl) {
+        this.serviceManager = sm;
+        this.componentLocator = cl;
+    }
+
+    /**
+     * @see 
org.apache.avalon.framework.service.ServiceManager#hasService(java.lang.String)
+     */
+    public boolean hasService(String key) {
+        boolean result = false;
+        if ( this.componentLocator != null ) {
+            result = this.componentLocator.hasComponent(key);
+        }
+        if ( !result ) {
+            result = this.serviceManager.hasService(key);
+        }
+        return result;
+    }
+
+    /**
+     * @see 
org.apache.cocoon.sitemap.ComponentLocator#release(java.lang.Object)
+     * @see 
org.apache.avalon.framework.service.ServiceManager#release(java.lang.Object)
+     */
+    public void release(Object component) {
+        // FIXME - we should optimize this
+        if ( this.componentLocator != null ) {
+            this.componentLocator.release(component);
+        }
+        this.serviceManager.release(component);
+    }
+
+    /**
+     * @see 
org.apache.cocoon.sitemap.ComponentLocator#hasComponent(java.lang.String)
+     */
+    public boolean hasComponent(String key) {
+        return this.hasService(key);
+    }
+    /**
+     * @see org.apache.cocoon.sitemap.ComponentLocator#lookup(java.lang.String)
+     * @see 
org.apache.avalon.framework.service.ServiceManager#lookup(java.lang.String)
+     */
+    public Object lookup(String key) {
+        Object component = null;
+        if ( this.componentLocator != null ) {
+            if ( this.componentLocator.hasComponent(key) ) {
+                component = this.componentLocator.lookup(key);
+            }
+        }
+        if ( component == null && this.serviceManager.hasService(key) ) {
+            try {
+                component = this.serviceManager.lookup(key);
+            } catch (ServiceException se) {
+                throw new CascadingRuntimeException("Unable to lookup 
component: " + key, se);
+            }
+        }
+        return component;
+    }
+}

Propchange: 
cocoon/trunk/src/java/org/apache/cocoon/sitemap/impl/ComponentManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
cocoon/trunk/src/java/org/apache/cocoon/sitemap/impl/ComponentManager.java
------------------------------------------------------------------------------
    svn:keywords = Id


Reply via email to