Author: pier Date: Tue Nov 2 12:01:02 2004 New Revision: 56410 Added: cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/ExtendingDescriptor.java cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Extension.java cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/plugins/ cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/plugins/Plugin.java cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/KernelLoader.java cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/StartupKernel.java Modified: cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Dependencies.java cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/DependencyException.java cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Deployer.java cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/DeployerException.java cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Factory.java cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Instance.java cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Wiring.java cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Block.java cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Descriptor.java cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Identifier.java cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Interface.java cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Library.java cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Module.java cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/Main.java cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/ServletLoader.java Log: Major works... Split loading and execution, and added the ida of "Extensions" to the kernel embracing the idea of plug-ins
Modified: cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Dependencies.java ============================================================================== --- cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Dependencies.java (original) +++ cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Dependencies.java Tue Nov 2 12:01:02 2004 @@ -10,7 +10,7 @@ * 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.kernel.runtime; +package org.apache.cocoon.kernel.deployment; import java.util.ArrayList; import java.util.List; Modified: cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/DependencyException.java ============================================================================== --- cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/DependencyException.java (original) +++ cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/DependencyException.java Tue Nov 2 12:01:02 2004 @@ -10,7 +10,7 @@ * 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.kernel.runtime; +package org.apache.cocoon.kernel.deployment; import org.apache.cocoon.kernel.description.Identifier; Modified: cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Deployer.java ============================================================================== --- cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Deployer.java (original) +++ cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Deployer.java Tue Nov 2 12:01:02 2004 @@ -10,7 +10,7 @@ * 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.kernel.runtime; +package org.apache.cocoon.kernel.deployment; import java.lang.reflect.Method; import java.lang.reflect.Proxy; @@ -20,10 +20,13 @@ import java.util.Map; import java.util.Set; -import org.apache.cocoon.kernel.Kernel; import org.apache.cocoon.kernel.KernelException; import org.apache.cocoon.kernel.configuration.Configuration; +import org.apache.cocoon.kernel.description.Block; +import org.apache.cocoon.kernel.description.Descriptor; import org.apache.cocoon.kernel.description.Library; +import org.apache.cocoon.kernel.startup.KernelLoader; +import org.apache.cocoon.kernel.startup.StartupKernel; /** * <p>The [EMAIL PROTECTED] Deployer} class is the main access point of the framework, providing @@ -33,36 +36,43 @@ * @author Copyright © 2000-2004 <a href="http://www.apache.org/">The Apache * Software Foundation</a>. All rights reserved. */ -public class Deployer implements Kernel { +public class Deployer implements StartupKernel { /** <p>An empty array of [EMAIL PROTECTED] Object}s to be using in reflection.</p> */ private static final Object NULL[] = new Object[0]; + /** <p>The [EMAIL PROTECTED] KernelLoader} loading our instance.</p> */ + private KernelLoader loader = null; /** <p>The [EMAIL PROTECTED] Library} of all [EMAIL PROTECTED] Block}s and [EMAIL PROTECTED] Interface}s.</p> */ private Library library = null; /** <p>The [EMAIL PROTECTED] Runtime} of all available [EMAIL PROTECTED] Instance}s.</p> */ - private Runtime runtime = null; + //private Runtime runtime = null; /** <p>A [EMAIL PROTECTED] Map} of all initialized singleton components.</p> */ private Map singletons = new HashMap(); /** <p>A [EMAIL PROTECTED] Set} containing all components being initialized.</p> */ private Set initializing = new HashSet(); + /** <p>A simple [EMAIL PROTECTED] Map} holding all instances and configurations.</p> */ + private Map wrappers = new HashMap(); /** * <p>Create a new [EMAIL PROTECTED] Deployer} instance.</p> */ - public Deployer() { + public Deployer(KernelLoader loader) { + this.loader = loader; this.library = new Library(); - this.runtime = new Runtime(this.getClass().getClassLoader(), this.library); } + /* =========================================================================== */ + /* PUBLIC METHODS */ + /* =========================================================================== */ + /** * <p>Initialize this deployer using the specified [EMAIL PROTECTED] Configuration}.</p> * * @param configuration A [EMAIL PROTECTED] Configuration} containing descriptors locations * and block instances. */ - public void initialize(Configuration configuration) - throws DeployerException { + public void initialize(Configuration configuration) { this.initialize(configuration, configuration); } @@ -72,17 +82,39 @@ * @param descriptors A [EMAIL PROTECTED] Configuration} containing descriptors locations. * @param instances A [EMAIL PROTECTED] Configuration} containing block instances. */ - public void initialize(Configuration descriptors, Configuration instances) - throws DeployerException { - Factory.configure(this.library, descriptors); - Factory.configure(this.runtime, instances); + public void initialize(Configuration descriptors, Configuration instances) { + try { + /* Retrieve all descriptors and put them in the library */ + Factory.configure(this.library, descriptors); - /* Initialize all singletons */ - Iterator iterator = this.runtime.iterator(); - while (iterator.hasNext()) { - /* Retrieve the instance and configuration */ - String name = (String) iterator.next(); - this.singletons.put(name, this.instantiate(name)); + /* Make sure that our loader adds _all_ the libraries we need */ + Iterator extensions = library.iterator(Descriptor.EXTENSION); + while (extensions.hasNext()) { + Descriptor descriptor = ((Descriptor) extensions.next()); + this.loader.addURL(this, descriptor.getLibraries()); + } + + Iterator interfaces = library.iterator(Descriptor.INTERFACE); + while (interfaces.hasNext()) { + Descriptor descriptor = ((Descriptor) interfaces.next()); + this.loader.addURL(this, descriptor.getLibraries()); + } + + /* Configure all instances and be done with it */ + Factory.configure(this, instances); + + /* Initialize all singletons */ + Iterator iterator = this.iterator(); + System.err.println("INSTANCES:"); + while (iterator.hasNext()) { + /* Retrieve the instance and configuration */ + String name = (String) iterator.next(); + System.err.println(" " + name); + this.singletons.put(name, this.instantiate(name)); + } + + } catch (DeployerException exception) { + throw new KernelException("Unable to initialize kernel", exception); } } @@ -94,7 +126,7 @@ while (iterator.hasNext()) { String current = (String) iterator.next(); Object component = this.singletons.get(current); - Instance instance = this.runtime.getInstance(current); + Instance instance = this.getInstance(current); Method destructor = instance.getComponentDestroyerMethod(); try { if (destructor != null) destructor.invoke(component, NULL); @@ -113,7 +145,7 @@ throws KernelException { /* Retrieve and check the instance */ - Instance instance = this.runtime.getInstance(name); + Instance instance = this.getInstance(name); if (instance == null) { throw new KernelException("Block instance \"" + name + "\" unknown"); } @@ -121,7 +153,7 @@ /* Prepare wiring and component */ Object component = this.singletons.get(instance); if (component == null) try { - component = this.instantiate(name, instance); + component = this.instantiate(name); } catch (Throwable t) { throw new KernelException("Unable to create non-singleton component " + " instance for block \"" + instance.getBlock().toString() @@ -132,7 +164,7 @@ /* Create and return the proxy instance */ Class interfaces[] = instance.getImplementedInterfaces(); try { - return Proxy.newProxyInstance(this.runtime, interfaces, wiring); + return Proxy.newProxyInstance(this.loader, interfaces, wiring); } catch (Throwable t) { throw new KernelException("Unable to create component proxy instance " + " for block \"" + instance.getBlock().toString() @@ -140,26 +172,75 @@ } } + /* =========================================================================== */ + /* PROTECTED METHODS */ + /* =========================================================================== */ + + /** + * <p>Push a new [EMAIL PROTECTED] Block} [EMAIL PROTECTED] Instance} into this [EMAIL PROTECTED] Runtime}.</p> + */ + protected void add(String name, Instance instance, Configuration configuration) { + if (name == null) throw new NullPointerException("Null name"); + if (instance == null) throw new NullPointerException("Null instance"); + if (configuration == null) throw new NullPointerException("Null config"); + this.wrappers.put(name, new Wrapper(instance, configuration)); + } + /** - * <p>Return the [EMAIL PROTECTED] Runtime} instance associated with this.</p> + * <p>Return an [EMAIL PROTECTED] Iterator} over all [EMAIL PROTECTED] Instance} names configured.</p> */ - protected Runtime getRuntime() { - return this.runtime; + protected Iterator iterator() { + return(this.wrappers.keySet().iterator()); } /** - * <p>Instantiate a new component given its block instance name.</p> + * <p>Return the [EMAIL PROTECTED] Block} associated with the given name.</p> */ - private Object instantiate(String name) - throws DeployerException { - return this.instantiate(name, this.runtime.getInstance(name)); + protected Block getBlock(String name) { + Wrapper wrapper = (Wrapper) this.wrappers.get(name); + return (wrapper == null? null : wrapper.instance.getBlock()); + } + + /** + * <p>Return the [EMAIL PROTECTED] Instance} associated with the given name.</p> + */ + protected Instance getInstance(String name) { + Wrapper wrapper = (Wrapper) this.wrappers.get(name); + return (wrapper == null? null : wrapper.instance); + } + + /** + * <p>Return the [EMAIL PROTECTED] Configuration} associated with the given name.</p> + */ + protected Configuration getConfiguration(String name) { + Wrapper wrapper = (Wrapper) this.wrappers.get(name); + return (wrapper == null? null : wrapper.configuration); + } + + /** + * <p>Return the [EMAIL PROTECTED] Library} associated with this [EMAIL PROTECTED] Runtime}.</p> + */ + protected Library getLibrary() { + return(this.library); + } + + /** + * <p>Return the [EMAIL PROTECTED] Runtime} instance associated with this.</p> + */ + protected KernelLoader getLoader() { + return(this.loader); } + /* =========================================================================== */ + /* PRIVATE METHODS */ + /* =========================================================================== */ + /** * <p>Instantiate a new component given its block instance and name.</p> */ - private Object instantiate(String name, Instance instance) + private Object instantiate(String name) throws DeployerException { + Instance instance = this.getInstance(name); if (instance == null) { throw new DeployerException("Invalid instance \"" + name + "\""); } @@ -174,7 +255,7 @@ } /* Configure this component instance */ - Configuration configuration = this.runtime.getConfiguration(name); + Configuration configuration = this.getConfiguration(name); if (this.initializing.contains(name)) { throw new DeployerException("Circular dependancy found initializing " + "instance \"" + name + "\""); @@ -195,5 +276,20 @@ /* Return the initialized component */ return (component); + } + + /** + * <p>A simple class wrapping aroung a [EMAIL PROTECTED] Block} [EMAIL PROTECTED] Instance} and its + * [EMAIL PROTECTED] Configuration}s.</p> + */ + private static final class Wrapper { + protected Instance instance = null; + protected Configuration configuration = null; + private Wrapper(Instance instance, Configuration config) { + if (instance == null) throw new NullPointerException("Null instance"); + if (config == null) throw new NullPointerException("Null configuration"); + this.instance = instance; + this.configuration = config; + } } } Modified: cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/DeployerException.java ============================================================================== --- cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/DeployerException.java (original) +++ cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/DeployerException.java Tue Nov 2 12:01:02 2004 @@ -10,7 +10,7 @@ * 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.kernel.runtime; +package org.apache.cocoon.kernel.deployment; /** * <p>A [EMAIL PROTECTED] DeployerException} is thrown whenever an error occurred in the Modified: cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Factory.java ============================================================================== --- cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Factory.java (original) +++ cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Factory.java Tue Nov 2 12:01:02 2004 @@ -10,7 +10,7 @@ * 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.kernel.runtime; +package org.apache.cocoon.kernel.deployment; import java.beans.PropertyDescriptor; import java.lang.reflect.Array; @@ -24,6 +24,7 @@ import org.apache.cocoon.kernel.Kernel; import org.apache.cocoon.kernel.configuration.Configuration; import org.apache.cocoon.kernel.configuration.ConfigurationBuilder; +import org.apache.cocoon.kernel.description.Extension; import org.apache.cocoon.kernel.description.Module; import org.apache.cocoon.kernel.description.Block; import org.apache.cocoon.kernel.description.Descriptor; @@ -68,6 +69,8 @@ library.add(new Block(descriptor)); } else if (Descriptor.NAMES[Descriptor.INTERFACE].equals(name)) { library.add(new Interface(descriptor)); + } else if (Descriptor.NAMES[Descriptor.EXTENSION].equals(name)) { + library.add(new Extension(descriptor)); } else { throw new DeployerException("Invalid descriptor root element \"" + descriptor.name() + "\" found in descriptor at " @@ -84,7 +87,7 @@ /** * <p>Configure the specified [EMAIL PROTECTED] Runtime} from a [EMAIL PROTECTED] Configuration}.</p> */ - public static void configure(Runtime runtime, Configuration config) + public static void configure(Deployer runtime, Configuration config) throws DeployerException { if (runtime == null) throw new NullPointerException("Null runtime"); if (config == null) throw new NullPointerException("Null configuration"); @@ -194,7 +197,7 @@ if (curr.getBooleanAttribute("kernel", false)) try { Wiring w = new Wiring(depl); Class i[] = new Class[] { Kernel.class }; - Object value = Proxy.newProxyInstance(depl.getRuntime(), i, w); + Object value = Proxy.newProxyInstance(depl.getLoader(), i, w); descr.getWriteMethod().invoke(obj, new Object[] { value }); continue; } catch (Throwable t) { Modified: cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Instance.java ============================================================================== --- cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Instance.java (original) +++ cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Instance.java Tue Nov 2 12:01:02 2004 @@ -10,7 +10,7 @@ * 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.kernel.runtime; +package org.apache.cocoon.kernel.deployment; import java.lang.reflect.Method; import java.net.URL; @@ -20,6 +20,7 @@ import org.apache.cocoon.kernel.description.Block; import org.apache.cocoon.kernel.description.Descriptor; +import org.apache.cocoon.kernel.description.ExtendingDescriptor; import org.apache.cocoon.kernel.description.Identifier; import org.apache.cocoon.kernel.description.Interface; import org.apache.cocoon.kernel.description.Library; @@ -43,13 +44,17 @@ private Method destroyer = null; /** <p>The [EMAIL PROTECTED] Block} instance associated with this [EMAIL PROTECTED] Instance}.</p> */ private Block block = null; + /** <p>A set of all known [EMAIL PROTECTED] URL}s to avoid duplications.</p> */ + private Set urls = new HashSet(); /** * <p>Create a new [EMAIL PROTECTED] Instance} instance.</p> */ - public Instance(Runtime runtime, Block block) + public Instance(Deployer deployer, Block block) throws DeployerException { - super(block.getLibraries(), runtime); + super(block.getLibraries(), deployer.getLoader()); + URL libraries[] = block.getLibraries(); + for (int k = 0; k < libraries.length; k ++) urls.add(libraries[k]); this.block = block; /* Process all interfaces, all extended blocks and all modules */ @@ -57,11 +62,11 @@ dependencies.push(block); Set interfaces = new HashSet(); - this.process(runtime.getLibrary(), block.getImplementedInterfaces(), + this.process(deployer.getLibrary(), block.getImplementedInterfaces(), dependencies, interfaces, Descriptor.INTERFACE); - this.process(runtime.getLibrary(), block.getExtendedBlocks(), + this.process(deployer.getLibrary(), block.getExtendedDescriptors(), dependencies, interfaces, Descriptor.BLOCK); - this.process(runtime.getLibrary(), block.getRequiredModules(), + this.process(deployer.getLibrary(), block.getRequiredModules(), dependencies, interfaces, Descriptor.MODULE); this.interfaces = new Class[interfaces.size()]; @@ -187,11 +192,14 @@ /* Add the libraries if this is a block or a module */ if ((type == Descriptor.BLOCK) || (type == Descriptor.MODULE)) { URL libs[] = desc.getLibraries(); - for (int x = 0; x < libs.length; x ++) super.addURL(libs[x]); + for (int x = 0; x < libs.length; x ++) { + if (this.urls.contains(libs[x])) continue; + super.addURL(libs[x]); + } } /* Process extensions declared by the descriptor */ - Identifier identifiers[] = desc.getExtendedBlocks(); + Identifier identifiers[] = ((ExtendingDescriptor) desc).getExtendedDescriptors(); this.process(library, identifiers, dependencies, interfaces, type); /* Process interfaces and modules of a block */ Modified: cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Wiring.java ============================================================================== --- cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Wiring.java (original) +++ cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/deployment/Wiring.java Tue Nov 2 12:01:02 2004 @@ -10,7 +10,7 @@ * 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.kernel.runtime; +package org.apache.cocoon.kernel.deployment; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; Modified: cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Block.java ============================================================================== --- cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Block.java (original) +++ cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Block.java Tue Nov 2 12:01:02 2004 @@ -13,19 +13,19 @@ package org.apache.cocoon.kernel.description; import org.apache.cocoon.kernel.configuration.Configuration; -import org.apache.cocoon.kernel.runtime.DeployerException; +import org.apache.cocoon.kernel.deployment.DeployerException; /** - * <p>A [EMAIL PROTECTED] Module} is a specialized implementation of a [EMAIL PROTECTED] Descriptor} - * encloses an kernel interface descriptor in a bean-like object.</p> + * <p>A [EMAIL PROTECTED] Block} is a specialized implementation of a [EMAIL PROTECTED] Descriptor} + * encloseing a kernel block descriptor in a bean-like object.</p> * * @author <a href="mailto:[EMAIL PROTECTED]">Pier Fumagalli</a> * @author Copyright © 2000-2004 <a href="http://www.apache.org/">The Apache * Software Foundation</a>. All rights reserved. */ -public class Block extends Descriptor { +public class Block extends ExtendingDescriptor { - /** <p>The name of the exposed Java interface.</p> */ + /** <p>The name of the provided Java component.</p> */ private String clazz = null; /** <p>The name (if any) of the initializer method.</p> */ private String initializer = null; Modified: cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Descriptor.java ============================================================================== --- cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Descriptor.java (original) +++ cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Descriptor.java Tue Nov 2 12:01:02 2004 @@ -20,7 +20,7 @@ import org.apache.cocoon.kernel.configuration.Configuration; import org.apache.cocoon.kernel.configuration.ConfigurationException; -import org.apache.cocoon.kernel.runtime.DeployerException; +import org.apache.cocoon.kernel.deployment.DeployerException; /** * <p>A [EMAIL PROTECTED] Descriptor} encloses an XML descriptor in a bean-like object.</p> @@ -39,14 +39,16 @@ public static final int BLOCK = 1; /** <p>The type identifying an interface descriptor.</p> */ public static final int INTERFACE = 2; + /** <p>The type identifying an plugin descriptor.</p> */ + public static final int EXTENSION = 3; /** <p>The names associated with each descriptor type.</p> */ - public static final String NAMES[] = new String [] {"module", "block", "interface"}; + public static final String NAMES[] = new String [] { + "module", "block", "interface", "extension", + }; /** <p>The array of libraries associated with this descriptor.</p> */ private URL[] libraries = null; - /** <p>The array of identifiers of all extended blocks.</p> */ - private Identifier[] extensions = null; /** * <p>Create a new [EMAIL PROTECTED] Descriptor} instance.</p> @@ -96,10 +98,6 @@ } this.libraries = (URL[]) collector.toArray(new URL[collector.size()]); - - /* Extensions */ - this.extensions = this.collectIdentifiers(configuration, "extensions", - "extends", configuration.name()); } /** @@ -110,13 +108,6 @@ return(this.libraries); } - /** - * <p>Return an array of all extended block identifers.</p> - */ - public Identifier[] getExtendedBlocks() { - return(this.extensions); - } - /* =========================================================================== */ /* ABSTRACT METHODS */ /* =========================================================================== */ @@ -126,43 +117,4 @@ */ public abstract int getType(); - /* =========================================================================== */ - /* PROTECTED METHODS */ - /* =========================================================================== */ - - /** - * <p>Iterate through a given configuration trying to find the identifiers - * located in all element with a given name and in a specified attribute.</p> - * - * @throws ConfigurationException if an element did not contain the attribute. - */ - protected Identifier[] collectIdentifiers(Configuration configuration, - String parent, String element, String attribute) - throws DeployerException { - - /* Check if we were given a parent element name */ - if (parent != null) configuration = configuration.child(NAMESPACE, parent); - - /* Prepare the iterator of all named children of the configuration */ - Iterator iterator = configuration.children(NAMESPACE, element); - Set collector = new HashSet(); - - while (iterator.hasNext()) try { - configuration = (Configuration) iterator.next(); - String identifier = configuration.getStringAttribute(attribute); - collector.add(new Identifier(identifier)); - - } catch (MalformedURLException exception) { - throw new DeployerException("Invalid identifier specified in descriptor " - + configuration.location(), exception); - - } catch (ConfigurationException exception) { - throw new DeployerException("Element <" + element + "/> does not " - + "contain the required " + attribute + " attribute at " - + configuration.location(), exception); - } - - /* Return whatever we have collected */ - return (Identifier[]) collector.toArray(new Identifier[collector.size()]); - } } Added: cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/ExtendingDescriptor.java ============================================================================== --- (empty file) +++ cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/ExtendingDescriptor.java Tue Nov 2 12:01:02 2004 @@ -0,0 +1,97 @@ +/* =============================================================================== * + * Copyright (C) 1999-2004, The Apache Software Foundation. All rights reserved. * + * * + * 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.kernel.description; + +import java.net.MalformedURLException; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +import org.apache.cocoon.kernel.configuration.Configuration; +import org.apache.cocoon.kernel.configuration.ConfigurationException; +import org.apache.cocoon.kernel.deployment.DeployerException; + +/** + * <p>A [EMAIL PROTECTED] ExtendingDescriptor} defines a descriptor extending others.</p> + * + * @author <a href="mailto:[EMAIL PROTECTED]">Pier Fumagalli</a> + * @author Copyright © 2000-2004 <a href="http://www.apache.org/">The Apache + * Software Foundation</a>. All rights reserved. + */ +public abstract class ExtendingDescriptor extends Descriptor { + + /** <p>The array of identifiers of all extended blocks.</p> */ + private Identifier[] extensions = null; + + /** + * <p>Create a new [EMAIL PROTECTED] ExtendingDescriptor} instance.</p> + * + * @param configuration A [EMAIL PROTECTED] Configuration} object enclosing the XML data. + * @throws DeployerException If an error occurred processing the XML data. + */ + protected ExtendingDescriptor(Configuration configuration) + throws DeployerException { + super(configuration); + + /* Extensions */ + this.extensions = this.collectIdentifiers(configuration, "extensions", + "extends", configuration.name()); + } + + /** + * <p>Return an array of identifiers of all the extended descriptors.</p> + */ + public Identifier[] getExtendedDescriptors() { + return(this.extensions); + } + + /* =========================================================================== */ + /* PROTECTED METHODS */ + /* =========================================================================== */ + + /** + * <p>Iterate through a given configuration trying to find the identifiers + * located in all element with a given name and in a specified attribute.</p> + * + * @throws ConfigurationException if an element did not contain the attribute. + */ + protected Identifier[] collectIdentifiers(Configuration configuration, + String parent, String element, String attribute) + throws DeployerException { + + /* Check if we were given a parent element name */ + if (parent != null) configuration = configuration.child(NAMESPACE, parent); + + /* Prepare the iterator of all named children of the configuration */ + Iterator iterator = configuration.children(NAMESPACE, element); + Set collector = new HashSet(); + + while (iterator.hasNext()) try { + configuration = (Configuration) iterator.next(); + String identifier = configuration.getStringAttribute(attribute); + collector.add(new Identifier(identifier)); + + } catch (MalformedURLException exception) { + throw new DeployerException("Invalid identifier specified in descriptor " + + configuration.location(), exception); + + } catch (ConfigurationException exception) { + throw new DeployerException("Element <" + element + "/> does not " + + "contain the required " + attribute + " attribute at " + + configuration.location(), exception); + } + + /* Return whatever we have collected */ + return (Identifier[]) collector.toArray(new Identifier[collector.size()]); + } +} Added: cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Extension.java ============================================================================== --- (empty file) +++ cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Extension.java Tue Nov 2 12:01:02 2004 @@ -0,0 +1,90 @@ +/* =============================================================================== * + * Copyright (C) 1999-2004, The Apache Software Foundation. All rights reserved. * + * * + * 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.kernel.description; + +import org.apache.cocoon.kernel.configuration.Configuration; +import org.apache.cocoon.kernel.deployment.DeployerException; + +/** + * <p>A [EMAIL PROTECTED] Extension} is a specialized implementation of a [EMAIL PROTECTED] Descriptor} + * enclosing kernel extension XML descriptor in a bean-like object.</p> + * + * @author <a href="mailto:[EMAIL PROTECTED]">Pier Fumagalli</a> + * @author Copyright © 2000-2004 <a href="http://www.apache.org/">The Apache + * Software Foundation</a>. All rights reserved. + */ +public class Extension extends Descriptor { + + /** <p>The name of the provided Java plugin.</p> */ + private String clazz = null; + /** <p>The name (if any) of the initializer method.</p> */ + private String initializer = null; + /** <p>The name (if any) of the destroyer method.</p> */ + private String destroyer = null; + + /** + * <p>Create a new [EMAIL PROTECTED] Extension} instance.</p> + */ + public Extension(Configuration configuration) + throws DeployerException { + super(configuration); + + /* Specific block stuff */ + if (! NAMES[EXTENSION].equals(configuration.name())) { + throw new DeployerException("Invalid root element name for plugin " + + " descriptor at " + configuration.location()); + } + + /* Plugin provision */ + Configuration plugin = configuration.child(NAMESPACE, "plugin"); + this.clazz = plugin.getStringAttribute("class", null); + + /* No class? Abstract block, only libraries */ + if (this.clazz == null) { + throw new DeployerException("Extension descriptor does not specify " + + " plugin class name at " + plugin.location()); + } + + /* Process initializer, destroyer, and singleton */ + this.initializer = plugin.getStringAttribute("initialize", null); + this.destroyer = plugin.getStringAttribute("destroy", null); + } + + /** + * <p>Return the class name of the provided Java™ class.</p> + */ + public String getPlugin() { + return(this.clazz); + } + + /** + * <p>Return the name of the metod to call at initialization.</p> + */ + public String getPluginInitializer() { + return(this.initializer); + } + + /** + * <p>Return the name of the metod to call at destruction.</p> + */ + public String getPluginDestroyer() { + return(this.initializer); + } + + /** + * <p>Return the type of this descriptor.</p> + */ + public int getType() { + return Descriptor.BLOCK; + } +} Modified: cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Identifier.java ============================================================================== --- cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Identifier.java (original) +++ cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Identifier.java Tue Nov 2 12:01:02 2004 @@ -17,7 +17,7 @@ import java.util.StringTokenizer; /** - * <p>The [EMAIL PROTECTED] Identifier} class encloses a kernel descriptor identifier.</p> + * <p>The [EMAIL PROTECTED] Identifier} class encloses a kernel identifier.</p> * * @author <a href="mailto:[EMAIL PROTECTED]">Pier Fumagalli</a> * @author Copyright © 2000-2004 <a href="http://www.apache.org/">The Apache Modified: cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Interface.java ============================================================================== --- cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Interface.java (original) +++ cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Interface.java Tue Nov 2 12:01:02 2004 @@ -13,17 +13,17 @@ package org.apache.cocoon.kernel.description; import org.apache.cocoon.kernel.configuration.Configuration; -import org.apache.cocoon.kernel.runtime.DeployerException; +import org.apache.cocoon.kernel.deployment.DeployerException; /** * <p>An [EMAIL PROTECTED] Interface} is a specialized implementation of a [EMAIL PROTECTED] Descriptor} - * encloses an kernel interface descriptor in a bean-like object.</p> + * enclosing an kernel interface descriptor in a bean-like object.</p> * * @author <a href="mailto:[EMAIL PROTECTED]">Pier Fumagalli</a> * @author Copyright © 2000-2004 <a href="http://www.apache.org/">The Apache * Software Foundation</a>. All rights reserved. */ -public class Interface extends Descriptor { +public class Interface extends ExtendingDescriptor { /** <p>The name of the exposed Java interface.</p> */ private String clazz = null; Modified: cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Library.java ============================================================================== --- cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Library.java (original) +++ cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Library.java Tue Nov 2 12:01:02 2004 @@ -123,9 +123,9 @@ private int type = 0; private LibraryIterator(int type, Iterator iterator) { - if ((type == Descriptor.BLOCK) || (type == Descriptor.INTERFACE)) { - this.type = type; - } else { + try { + String name = Descriptor.NAMES[type]; + } catch (Throwable throwable) { throw new IllegalArgumentException("Invalid type " + type); } this.iterator = iterator; Modified: cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Module.java ============================================================================== --- cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Module.java (original) +++ cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/description/Module.java Tue Nov 2 12:01:02 2004 @@ -13,17 +13,17 @@ package org.apache.cocoon.kernel.description; import org.apache.cocoon.kernel.configuration.Configuration; -import org.apache.cocoon.kernel.runtime.DeployerException; +import org.apache.cocoon.kernel.deployment.DeployerException; /** * <p>A [EMAIL PROTECTED] Module} is a specialized implementation of a [EMAIL PROTECTED] Descriptor} - * encloses an kernel interface descriptor in a bean-like object.</p> + * encloses an kernel module descriptor in a bean-like object.</p> * * @author <a href="mailto:[EMAIL PROTECTED]">Pier Fumagalli</a> * @author Copyright © 2000-2004 <a href="http://www.apache.org/">The Apache * Software Foundation</a>. All rights reserved. */ -public class Module extends Descriptor { +public class Module extends ExtendingDescriptor { /** * <p>Create a new [EMAIL PROTECTED] Module} instance.</p> Added: cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/plugins/Plugin.java ============================================================================== --- (empty file) +++ cocoon/whiteboard/kernel/sources/runtime/org/apache/cocoon/kernel/plugins/Plugin.java Tue Nov 2 12:01:02 2004 @@ -0,0 +1,24 @@ +/* =============================================================================== * + * Copyright (C) 1999-2004, The Apache Software Foundation. All rights reserved. * + * * + * 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.kernel.plugins; + +/** + * <p>The [EMAIL PROTECTED] Plugin} interface identifies a.</p> + * + * @author <a href="mailto:[EMAIL PROTECTED]">Pier Fumagalli</a> + * @author Copyright © 2000-2004 <a href="http://www.apache.org/">The Apache + * Software Foundation</a>. All rights reserved. + */ +public interface Plugin { + +} Added: cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/KernelLoader.java ============================================================================== --- (empty file) +++ cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/KernelLoader.java Tue Nov 2 12:01:02 2004 @@ -0,0 +1,108 @@ +/* =============================================================================== * + * Copyright (C) 1999-2004, The Apache Software Foundation. All rights reserved. * + * * + * 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.kernel.startup; + +import java.lang.reflect.Constructor; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.HashSet; +import java.util.Set; + +/** + * <p>TODO.</p> + * + * @author <a href="mailto:[EMAIL PROTECTED]">Pier Fumagalli</a> + * @author Copyright © 2000-2004 <a href="http://www.apache.org/">The Apache + * Software Foundation</a>. All rights reserved. + */ +public class KernelLoader extends URLClassLoader { + + /** <p>The deployer class name.</p> */ + private static final String CLASS = "org.apache.cocoon.kernel.deployment.Deployer"; + /** <p>The instance of the [EMAIL PROTECTED] Kernel} able to add URLs to this.</p> */ + private StartupKernel kernel = null; + /** <p>A set of all known [EMAIL PROTECTED] URL}s to avoid duplications.</p> */ + private Set urls = new HashSet(); + + /** <p>Deny public construction.</p> */ + private KernelLoader(ClassLoader loader, URL libraries[]) { + super(libraries, loader); + if (libraries == null) return; + for (int k = 0; k < libraries.length; k ++) urls.add(libraries[k]); + } + + /** + * <p>Load a new [EMAIL PROTECTED] StartupKernel} instance. + */ + protected static final StartupKernel load(URL library) + throws Throwable { + return KernelLoader.load(null, library); + } + + /** + * <p>Load a new [EMAIL PROTECTED] StartupKernel} instance. + */ + protected static final StartupKernel load(URL libraries[]) + throws Throwable { + return KernelLoader.load(null, libraries); + } + + /** + * <p>Load a new [EMAIL PROTECTED] StartupKernel} instance. + */ + protected static final StartupKernel load(ClassLoader loader, URL library) + throws Throwable { + if (library == null) return KernelLoader.load(loader, new URL[0]); + return KernelLoader.load(loader, new URL [] { library }); + } + + /** + * <p>Load a new [EMAIL PROTECTED] StartupKernel} instance. + */ + protected static final StartupKernel load(ClassLoader loader, URL libraries[]) + throws Throwable { + if (loader == null) loader = Thread.currentThread().getContextClassLoader(); + if (libraries == null) libraries = new URL[0]; + KernelLoader kernel_loader = new KernelLoader(loader, libraries); + + Class clazz = kernel_loader.loadClass(KernelLoader.CLASS); + Class signature[] = new Class [] { KernelLoader.class }; + Constructor constructor = clazz.getConstructor(signature); + Object parameters[] = new Object [] { kernel_loader }; + + StartupKernel kernel = (StartupKernel) constructor.newInstance(parameters); + kernel_loader.kernel = kernel; + + return(kernel); + } + + /** + * <p>Add a [EMAIL PROTECTED] URL} to the class path handled by this [EMAIL PROTECTED] KernelLoader} + * instance.</p> + */ + public void addURL(StartupKernel kernel, URL url) { + if (this.kernel != kernel) throw new SecurityException("Invalid instance"); + if ((url == null) || (this.urls.contains(url))) return; + super.addURL(url); + } + + /** + * <p>Add an array of [EMAIL PROTECTED] URL}s to the class path handled by this.</p> + * [EMAIL PROTECTED] KernelLoader} instance.</p> + */ + public void addURL(StartupKernel kernel, URL urls[]) { + if (this.kernel != kernel) throw new SecurityException("Invalid instance"); + if (urls == null) return; + for (int x = 0; x < urls.length; x ++) super.addURL(urls[x]); + } +} Modified: cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/Main.java ============================================================================== --- cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/Main.java (original) +++ cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/Main.java Tue Nov 2 12:01:02 2004 @@ -12,10 +12,15 @@ * =============================================================================== */ package org.apache.cocoon.kernel.startup; +import java.io.File; +import java.net.URL; + +import javax.sql.DataSource; + import org.apache.cocoon.kernel.Kernel; import org.apache.cocoon.kernel.configuration.Configuration; import org.apache.cocoon.kernel.configuration.ConfigurationBuilder; -import org.apache.cocoon.kernel.runtime.Deployer; +import org.apache.cocoon.kernel.deployment.Deployer; /** * <p>A simple class initializing a [EMAIL PROTECTED] Kernel} from a the command line.</p> @@ -38,14 +43,17 @@ public class Main implements Runnable { /** <p>The current [EMAIL PROTECTED] Deployer} instance.</p> */ - private Deployer deployer = null; + private StartupKernel kernel = null; /** * <p>Create a new [EMAIL PROTECTED] Main} instance.</p> */ - private Main(Deployer deployer) { - if (deployer == null) throw new NullPointerException("Null deployer"); - this.deployer = deployer; + private Main(StartupKernel kernel) throws Throwable { + if (kernel == null) throw new NullPointerException("Null deployer"); + this.kernel = kernel; + + DataSource ds = (DataSource)this.kernel.lookup("test"); + ds.getConnection(); } /** @@ -53,7 +61,7 @@ * configured [EMAIL PROTECTED] Deployer} instance before the JVM is terminated.</p> */ public void run() { - this.deployer.destroy(); + this.kernel.destroy(); } /** @@ -61,13 +69,14 @@ */ public static void main(String args[]) throws Throwable { - if ((args.length < 1) || (args.length > 2)) { + if ((args.length < 2) || (args.length > 3)) { String name = Main.class.getName(); System.err.println("Usage:"); - System.err.println(" " + name + " <conf-file>"); - System.err.println(" or"); - System.err.println(" " + name + " <desc-file> <inst-file>"); + System.err.println(" " + name + " <jar-file> <conf-file>"); + System.err.println("or"); + System.err.println(" " + name + " <jar-file> <desc-file> <inst-file>"); System.err.println(); + System.err.println(" <conf-file> The JAR of the kernel"); System.err.println(" <conf-file> Combined descriptor/instances XML"); System.err.println(" <desc-file> Descriptors locator XML"); System.err.println(" <inst-file> Instances deployment XML"); @@ -77,17 +86,17 @@ } /* Parse the (possibly two) configurations */ - Configuration descriptors = ConfigurationBuilder.parse(args[0]); - Configuration instances = (args.length == 1 ? descriptors : - ConfigurationBuilder.parse(args[0])); + Configuration descriptors = ConfigurationBuilder.parse(args[1]); + Configuration instances = (args.length == 2 ? descriptors : + ConfigurationBuilder.parse(args[2])); /* Create and initialize a new deployer */ - Thread.currentThread().setContextClassLoader(Main.class.getClassLoader()); - Deployer deployer = new Deployer(); - deployer.initialize(descriptors, instances); + URL library = new File(args[0]).toURL(); + StartupKernel kernel = KernelLoader.load(library); + kernel.initialize(descriptors, instances); /* Add the shutdown hook */ - Runtime.getRuntime().addShutdownHook(new Thread(new Main(deployer))); + Runtime.getRuntime().addShutdownHook(new Thread(new Main(kernel))); /* * If non-daemon threads are still running, this thread will siply exit but Modified: cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/ServletLoader.java ============================================================================== --- cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/ServletLoader.java (original) +++ cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/ServletLoader.java Tue Nov 2 12:01:02 2004 @@ -23,8 +23,8 @@ import org.apache.cocoon.kernel.Kernel; import org.apache.cocoon.kernel.configuration.Configuration; import org.apache.cocoon.kernel.configuration.ConfigurationBuilder; -import org.apache.cocoon.kernel.runtime.Deployer; -import org.apache.cocoon.kernel.runtime.Wiring; +import org.apache.cocoon.kernel.deployment.Deployer; +import org.apache.cocoon.kernel.deployment.Wiring; /** * <p>The [EMAIL PROTECTED] ServletLoader} is a [EMAIL PROTECTED] ServletContextListener} managing the @@ -34,7 +34,7 @@ * looking for the <code>"org.apache.cocoon.kernel.Kernel"</code> * [EMAIL PROTECTED] #ATTRIBUTE attribute} in their [EMAIL PROTECTED] ServletContext}.</p> * - * <p>The initialization of the kernel is dependant on three context initialization + * <p>The initialization of the kernel is dependant on four context initialization * parameters:</p> * * <ul> @@ -51,6 +51,12 @@ * <li><code>kernel-instances</code>: an instances deployer document.</li> * </ul> * + * <p>and:</p> + * + * <ul> + * <li><code>kernel-library</code>: the library containing the kernel code.</li> + * </ul> + * * @author <a href="mailto:[EMAIL PROTECTED]">Pier Fumagalli</a> * @author Copyright © 2000-2004 <a href="http://www.apache.org/">The Apache * Software Foundation</a>. All rights reserved. @@ -64,13 +70,13 @@ public static final String ATTRIBUTE = "org.apache.cocoon.kernel.Kernel"; /** <p>The current [EMAIL PROTECTED] Deployer} instance.</p> */ - Deployer deployer = null; + StartupKernel kernel = null; /** * <p>Create a new [EMAIL PROTECTED] ServletLoader} instance.</p> */ public ServletLoader() { - this.deployer = new Deployer(); + super(); } /** @@ -79,33 +85,49 @@ public void contextInitialized(ServletContextEvent event) { ServletContext context = event.getServletContext(); + String library = context.getInitParameter("kernel-library"); + if (library == null) { + String message = "Context parameter \"kernel-library\" not specified"; + context.log(message); + throw new RuntimeException(message); + } + /* Retrieve the "descriptors" configuration */ String configuration = context.getInitParameter("kernel-configuration"); String descriptors = context.getInitParameter("kernel-descriptors"); String instances = context.getInitParameter("kernel-instances"); - /* Parse the (possibly two) configurations and initialize the deployer */ + /* Load and initialize the kernel */ try { + URL library_url = context.getResource(library); + if (library_url == null) { + String message = "Unable to resolve library \"" + library + "\""; + context.log(message); + throw new RuntimeException(message); + } + this.kernel = KernelLoader.load(library_url); + + /* Parse the (possibly two) configurations and initialize the deployer */ if (configuration != null) { URL configuration_url = context.getResource(configuration); Configuration conf = ConfigurationBuilder.parse(configuration_url); - this.deployer.initialize(conf); + this.kernel.initialize(conf); } else { URL descriptors_url = context.getResource(descriptors); URL instances_url = context.getResource(instances); Configuration desc = ConfigurationBuilder.parse(descriptors_url); Configuration inst = ConfigurationBuilder.parse(instances_url); - this.deployer.initialize(desc, inst); + this.kernel.initialize(desc, inst); } } catch (Throwable t) { context.log("Unable to intialize kernel", t); throw new RuntimeException("Unable to initialize kernel", t); } - /* Make the kernel available to the servlet loader */ + /* Make the kernel available through the servlet context */ ClassLoader loader = this.getClass().getClassLoader(); Class interfaces[] = new Class[] { Kernel.class }; - Wiring wiring = new Wiring(this.deployer); + Wiring wiring = new Wiring(this.kernel); Kernel kernel = (Kernel) Proxy.newProxyInstance(loader, interfaces, wiring); context.setAttribute(ServletLoader.ATTRIBUTE, kernel); } @@ -115,14 +137,14 @@ */ public void contextDestroyed(ServletContextEvent event) { ServletContext context = event.getServletContext(); - context.removeAttribute("KERNEL"); + context.removeAttribute(ServletLoader.ATTRIBUTE); try { - this.deployer.destroy(); + this.kernel.destroy(); } catch (Throwable t) { context.log("Unable to intialize destroy", t); throw new RuntimeException("Unable to destroy kernel", t); } finally { - this.deployer = null; + this.kernel = null; } } } Added: cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/StartupKernel.java ============================================================================== --- (empty file) +++ cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/StartupKernel.java Tue Nov 2 12:01:02 2004 @@ -0,0 +1,48 @@ +/* =============================================================================== * + * Copyright (C) 1999-2004, The Apache Software Foundation. All rights reserved. * + * * + * 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.kernel.startup; + +import org.apache.cocoon.kernel.Kernel; +import org.apache.cocoon.kernel.configuration.Configuration; + +/** + * <p>TODO.</p> + * + * @author <a href="mailto:[EMAIL PROTECTED]">Pier Fumagalli</a> + * @author Copyright © 2000-2004 <a href="http://www.apache.org/">The Apache + * Software Foundation</a>. All rights reserved. + */ +public interface StartupKernel extends Kernel { + + /** + * <p>Initialize this deployer using the specified [EMAIL PROTECTED] Configuration}.</p> + * + * @param configuration A [EMAIL PROTECTED] Configuration} containing descriptors locations + * and block instances. + */ + public void initialize(Configuration configuration); + + /** + * <p>Initialize this deployer using the specified [EMAIL PROTECTED] Configuration}s.</p> + * + * @param descriptors A [EMAIL PROTECTED] Configuration} containing descriptors locations. + * @param instances A [EMAIL PROTECTED] Configuration} containing block instances. + */ + public void initialize(Configuration descriptors, Configuration instances); + + /** + * <p>Destroy this deployer and all block instances.</p> + */ + public void destroy(); + +}