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;
}
}