Author: cziegeler
Date: Fri Mar 18 11:06:45 2005
New Revision: 158127

URL: http://svn.apache.org/viewcvs?view=rev&rev=158127
Log:
Start moving code common to all environments to Core

Modified:
    cocoon/trunk/src/core/java/org/apache/cocoon/core/Core.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=158126&r2=158127
==============================================================================
--- cocoon/trunk/src/core/java/org/apache/cocoon/core/Core.java (original)
+++ cocoon/trunk/src/core/java/org/apache/cocoon/core/Core.java Fri Mar 18 
11:06:45 2005
@@ -20,17 +20,22 @@
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.reflect.Constructor;
 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.container.ContainerUtil;
 import org.apache.avalon.framework.context.Context;
 import org.apache.avalon.framework.context.ContextException;
 import org.apache.avalon.framework.context.Contextualizable;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.cocoon.Constants;
 import org.apache.cocoon.configuration.Settings;
+import org.apache.cocoon.util.ClassUtils;
 
 /**
  * This is the core Cocoon component.
@@ -59,6 +64,16 @@
     /** The component context. */
     private Context context;
 
+    private final Settings settings;
+    
+    public Core() {
+        this.settings = null;
+    }
+
+    public Core(Settings s) {
+        this.settings = s;
+    }
+
     /* (non-Javadoc)
      * @see 
org.apache.avalon.framework.context.Contextualizable#contextualize(org.apache.avalon.framework.context.Context)
      */
@@ -97,6 +112,7 @@
      */
     public Settings getSettings() {
         return getSettings(this.context);
+        // return this.settings;
     }
 
     /**
@@ -217,5 +233,119 @@
         InputStream getInputStream(String path);
         
         void configure(Settings settings);
+        
+        ClassLoader getInitClassLoader();
+    }
+    
+    /**
+     * Bootstrap Cocoon Service Manager
+     */
+    public static ServiceManager createRootServiceManager(BootstrapEnvironment 
env) {        
+        // create settings
+        final Settings s = createSettings(env);
+        
+        if (s.isInitClassloader()) {
+            // Force context classloader so that JAXP can work correctly
+            // (see javax.xml.parsers.FactoryFinder.findClassLoader())
+            try {
+                
Thread.currentThread().setContextClassLoader(env.getInitClassLoader());
+            } catch (Exception e) {
+                // ignore this
+            }
+        }
+
+        // create new Core
+        final Core cocoon = new Core(s);
+        
+        // create parent service manager
+        final ServiceManager parent = getParentServiceManager(s);
+
+        return new RootServiceManager(parent, cocoon);
+    }
+    
+    /**
+     * Instatiates the parent service manager, as specified in the
+     * parent-service-manager init parameter.
+     *
+     * If none is specified, the method returns <code>null</code>.
+     *
+     * @return the parent service manager, or <code>null</code>.
+     */
+    protected static ServiceManager getParentServiceManager(Settings s) {
+        String parentServiceManagerClass = 
s.getParentServiceManagerClassName();
+        String parentServiceManagerInitParam = null;
+        if (parentServiceManagerClass != null) {
+            int dividerPos = parentServiceManagerClass.indexOf('/');
+            if (dividerPos != -1) {
+                parentServiceManagerInitParam = 
parentServiceManagerInitParam.substring(dividerPos + 1);
+                parentServiceManagerClass = 
parentServiceManagerClass.substring(0, dividerPos);
+            }
+        }
+
+        ServiceManager parentServiceManager = null;
+        if (parentServiceManagerClass != null) {
+            try {
+                Class pcm = ClassUtils.loadClass(parentServiceManagerClass);
+                Constructor pcmc = pcm.getConstructor(new 
Class[]{String.class});
+                parentServiceManager = (ServiceManager) pcmc.newInstance(new 
Object[]{parentServiceManagerInitParam});
+
+                //ContainerUtil.enableLogging(parentServiceManager, 
getLogger());
+                //ContainerUtil.contextualize(parentServiceManager, 
this.appContext);
+                ContainerUtil.initialize(parentServiceManager);
+            } catch (Exception e) {
+                /*if (getLogger().isErrorEnabled()) {
+                    getLogger().error("Could not initialize parent component 
manager.", e);
+                }*/
+            }
+        }
+        return parentServiceManager;
+    }
+
+    public static final class RootServiceManager implements ServiceManager {
+        
+        protected final static String CORE_KEY = Core.class.getName();
+
+        protected final ServiceManager parent;
+        protected final Core cocoon;
+
+        public RootServiceManager(ServiceManager p, Core c) {
+            this.parent = p;
+            this.cocoon = c;
+        }
+
+        /* (non-Javadoc)
+         * @see 
org.apache.avalon.framework.service.ServiceManager#hasService(java.lang.String)
+         */
+        public boolean hasService(String key) {
+            if ( CORE_KEY.equals(key) ) {
+                return true;
+            }
+            if ( this.parent != null ) {
+                return this.parent.hasService(key);
+            }
+            return false;
+        }
+
+        /* (non-Javadoc)
+         * @see 
org.apache.avalon.framework.service.ServiceManager#lookup(java.lang.String)
+         */
+        public Object lookup(String key) throws ServiceException {
+            if ( CORE_KEY.equals(key) ) {
+                return this.cocoon;
+            }
+            if ( this.parent != null ) {
+                return this.parent.lookup(key);
+            }
+            throw new ServiceException("Cocoon", "Component for key '" + key + 
"' not found.");
+        }
+
+        /* (non-Javadoc)
+         * @see 
org.apache.avalon.framework.service.ServiceManager#release(java.lang.Object)
+         */
+        public void release(Object component) {
+            if ( component != this.cocoon && parent != null ) {
+                this.parent.release(component);
+            }
+        }
     }
 }

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=158126&r2=158127
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/servlet/CocoonServlet.java 
(original)
+++ cocoon/trunk/src/java/org/apache/cocoon/servlet/CocoonServlet.java Fri Mar 
18 11:06:45 2005
@@ -129,7 +129,7 @@
     protected ServletContext servletContext;
 
     /** The classloader that will be set as the context classloader if 
init-classloader is true */
-    protected ClassLoader classLoader = this.getClass().getClassLoader();
+    protected final ClassLoader classLoader = this.getClass().getClassLoader();
 
     private String parentServiceManagerClass;
     private String parentServiceManagerInitParam;
@@ -178,7 +178,7 @@
         super.init(conf);
 
         // initialize settings
-        Core.BootstrapEnvironment env = new ServletBootstrapEnvironment(conf);
+        Core.BootstrapEnvironment env = new ServletBootstrapEnvironment(conf, 
this.classLoader);
 
         this.settings = Core.createSettings(env);
 
@@ -1300,9 +1300,11 @@
     implements Core.BootstrapEnvironment {
 
         private final ServletConfig config;
-
-        public ServletBootstrapEnvironment(ServletConfig config) {
+        private final ClassLoader   classLoader;
+        
+        public ServletBootstrapEnvironment(ServletConfig config, ClassLoader 
cl) {
             this.config = config;
+            this.classLoader = cl;
         }
 
         public void log(String message) {
@@ -1320,6 +1322,13 @@
         public void configure(Settings settings) {
             // fill from the servlet parameters
             SettingsHelper.fill(settings, this.config);                
+        }
+
+        /* (non-Javadoc)
+         * @see 
org.apache.cocoon.core.Core.BootstrapEnvironment#getInitClassLoader()
+         */
+        public ClassLoader getInitClassLoader() {
+            return this.classLoader;
         }
     }
 


Reply via email to