Return-Path: Delivered-To: apmail-jakarta-avalon-cvs-archive@apache.org Received: (qmail 78179 invoked from network); 27 Dec 2002 16:44:07 -0000 Received: from exchange.sun.com (192.18.33.10) by daedalus.apache.org with SMTP; 27 Dec 2002 16:44:07 -0000 Received: (qmail 4396 invoked by uid 97); 27 Dec 2002 16:45:23 -0000 Delivered-To: qmlist-jakarta-archive-avalon-cvs@jakarta.apache.org Received: (qmail 4380 invoked by uid 97); 27 Dec 2002 16:45:22 -0000 Mailing-List: contact avalon-cvs-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "Avalon CVS List" Reply-To: "Avalon Developers List" Delivered-To: mailing list avalon-cvs@jakarta.apache.org Received: (qmail 4368 invoked by uid 98); 27 Dec 2002 16:45:22 -0000 X-Antivirus: nagoya (v4218 created Aug 14 2002) Date: 27 Dec 2002 16:44:02 -0000 Message-ID: <20021227164402.97125.qmail@icarus.apache.org> From: mcconnell@apache.org To: avalon-sandbox-cvs@apache.org Subject: cvs commit: avalon-sandbox/merlin/src/java/org/apache/avalon/merlin/kernel DefaultKernel.java X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N mcconnell 2002/12/27 08:44:02 Modified: merlin/src/java/org/apache/avalon/merlin/kernel DefaultKernel.java Log: Rewrite of the block loading approach to leverage notion of Block as an extended appliance. Revision Changes Path 1.16 +425 -101 avalon-sandbox/merlin/src/java/org/apache/avalon/merlin/kernel/DefaultKernel.java Index: DefaultKernel.java =================================================================== RCS file: /home/cvs/avalon-sandbox/merlin/src/java/org/apache/avalon/merlin/kernel/DefaultKernel.java,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- DefaultKernel.java 21 Dec 2002 05:18:22 -0000 1.15 +++ DefaultKernel.java 27 Dec 2002 16:44:02 -0000 1.16 @@ -55,6 +55,7 @@ import java.io.FileInputStream; import java.io.InputStream; import java.net.URL; +import java.net.MalformedURLException; import java.util.List; import java.util.Iterator; import java.util.Map; @@ -67,8 +68,20 @@ import java.util.zip.ZipEntry; import java.net.JarURLConnection; +import org.apache.avalon.assembly.logging.LoggingManager; +import org.apache.avalon.assembly.logging.LoggingDescriptor; +import org.apache.avalon.assembly.logging.DefaultLoggingManager; +import org.apache.avalon.assembly.engine.EngineClassLoader; +import org.apache.avalon.assembly.engine.Engine; +import org.apache.avalon.assembly.engine.model.LibraryDescriptor; +import org.apache.avalon.assembly.engine.model.ClasspathDescriptor; +import org.apache.avalon.assembly.util.ExceptionHelper; +import org.apache.avalon.assembly.appliance.Appliance; +import org.apache.avalon.assembly.appliance.ApplianceContext; +import org.apache.avalon.assembly.appliance.DefaultApplianceContext; import org.apache.avalon.framework.CascadingException; import org.apache.avalon.framework.logger.Logger; +import org.apache.avalon.framework.logger.AbstractLogEnabled; import org.apache.avalon.framework.activity.Initializable; import org.apache.avalon.framework.activity.Startable; import org.apache.avalon.framework.activity.Disposable; @@ -82,46 +95,44 @@ import org.apache.avalon.framework.context.Contextualizable; import org.apache.avalon.framework.context.ContextException; import org.apache.avalon.framework.service.DefaultServiceManager; -import org.apache.avalon.meta.model.LoggingDirective; import org.apache.avalon.merlin.block.Block; import org.apache.avalon.merlin.block.DefaultBlock; +import org.apache.avalon.merlin.block.BlockException; import org.apache.avalon.merlin.container.builder.XMLContainerCreator; -import org.apache.avalon.assembly.logging.LoggingManager; -import org.apache.avalon.assembly.logging.LoggingDescriptor; -import org.apache.avalon.assembly.logging.DefaultLoggingManager; -import org.apache.avalon.assembly.engine.EngineClassLoader; -import org.apache.avalon.assembly.engine.Engine; -import org.apache.avalon.assembly.engine.model.LibraryDescriptor; -import org.apache.avalon.assembly.engine.model.ClasspathDescriptor; -import org.apache.avalon.assembly.util.ExceptionHelper; -import org.apache.avalon.assembly.appliance.Appliance; -import org.apache.avalon.merlin.block.Block; -import org.apache.avalon.merlin.block.DefaultBlock; -import org.apache.avalon.merlin.block.BlockLoader; +import org.apache.avalon.merlin.container.ContainerDescriptor; +import org.apache.avalon.merlin.container.ContainerLoader; import org.apache.avalon.merlin.container.Container; +import org.apache.avalon.merlin.container.ContainerException; +import org.apache.avalon.merlin.container.DefaultContainer; import org.apache.avalon.merlin.service.DefaultRegistry; import org.apache.avalon.merlin.service.Registry; +import org.apache.avalon.meta.model.LoggingDirective; +import org.apache.avalon.meta.model.Profile; +import org.apache.avalon.meta.info.Type; /** * Default kernel implementation. The implementation provides support for * the following sequence of activties: * *
    + *
  • loading kernel.xml configuration + *
  • loading blocks.xml configuration + *
  • establishment of the logging system *
  • loading internal jar-file dependencies - *
  • establishment of a logging system - *
  • creation of a root container - *
  • startup of the container - *
  • management of interupt conditions or request for kernel disposal - *
  • error reporting + *
  • establishment of a root component management engine + *
  • block abstraction that encapsulates a heirachical container model + *
  • block configuration repository + *
  • block assembly, deployment and decommissioning + *
  • management of interupt conditions and kernel disposal + *
  • error management *
* - * @see DefaultKernel - * * @author Avalon Development Team * @version $Revision$ $Date$ + * @see DefaultBlock */ -public class DefaultKernel extends BlockLoader implements Kernel, Contextualizable, Configurable, Initializable, Startable, Disposable +public class DefaultKernel extends ContainerLoader implements Kernel, Contextualizable, Initializable, Startable, Disposable { //============================================================== // static @@ -133,16 +144,23 @@ */ private static LoggingManager LOGGING; + protected static final String BLOCK_XML_ENTRY = "BLOCK-INF/block.xml"; + //============================================================== // state //============================================================== /** - * The supplied configuration. + * The kernel configuration. */ private Configuration m_config; /** + * The block configuration. + */ + private Configuration m_configuration; + + /** * The application home directory. */ private File m_home; @@ -184,20 +202,21 @@ //============================================================== /** - *

Application of a runtime context to this appliance. + *

Application of a runtime context to the kernel. * Context entries that may be supplied to an appliance manager are * detailed in the following table.

- * - * - * + *
keytypedescription
+ * + * * * - * + * * * * *
keytypedescription
urn:assembly:homeurn:assembly:home{@link java.io.File}The kernel home directory.
* @param context the runtime context + * @exception ContextException if an error occurs during the contextualization phase */ public void contextualize( Context context ) throws ContextException { @@ -205,30 +224,16 @@ } //============================================================== - // Configurable - //============================================================== - - /** - * Supply of the static configuration for the kernel. - * @param config the static configuration - */ - public void configure( Configuration config ) throws ConfigurationException - { - if( config == null ) - { - throw new NullPointerException( "config" ); - } - m_config = config; - } - - //============================================================== // Initializable //============================================================== /** - * Initialization of the kernel. + * Initialization of the kernel. The implementation hanldes the + * establishment of the logging system, bootstraps the assembly + * engine, loads all blocks declared in the kernel configuration, + * initiates block assembly and list available services. * - * @exception if an initialization error occurs. + * @exception Exception if an initialization error occurs. */ public void initialize() throws Exception { @@ -236,9 +241,39 @@ { throw new IllegalStateException("context"); } - if( m_config == null ) + + // + // load the kernel configuration + // + + File kernelFile = new File( m_home, "kernel.xml" ); + try { - throw new IllegalStateException("configuration"); + m_config = getConfiguration( kernelFile ); + } + catch( Throwable e ) + { + final String error = + "Unable to load kernel configuration from file: " + + kernelFile; + throw new CascadingException( error, e ); + } + + // + // load the blocks configuration + // + + File blocksFile = new File( m_home, "blocks.xml" ); + try + { + m_configuration = getConfiguration( blocksFile ); + } + catch( Throwable e ) + { + final String error = + "Unable to load blocks configuration from file: " + + kernelFile; + throw new CascadingException( error, e ); } // @@ -247,14 +282,13 @@ try { - final String root = "/"; if( LOGGING == null ) { - LOGGING = bootstrapLoggingManager( root ); + LOGGING = bootstrapLoggingManager( Container.PATH_SEPERATOR ); Configuration categoriesConfig = m_config.getChild( "categories" ); LoggingDirective categories = - CREATOR.createLoggingDirective( root, categoriesConfig ); - LOGGING.addCategories( root, categories ); + CREATOR.createLoggingDirective( Container.PATH_SEPERATOR, categoriesConfig ); + LOGGING.addCategories( Container.PATH_SEPERATOR, categories ); } final String sys = "/sys"; m_local = LOGGING.getLoggerForCategory( sys ); @@ -267,7 +301,7 @@ throw new CascadingException( error, e ); } - String domain = m_config.getChild( "system" ).getChild( "host" ).getValue( "localhost" ); + String domain = m_config.getChild( "system" ).getAttribute( "host", "localhost" ); m_registry = new DefaultRegistry( domain ); // @@ -276,7 +310,7 @@ if( getLogger().isInfoEnabled() ) { - getLogger().info( "initialization from: " + m_home ); + getLogger().info( "initialization from: " + m_home + " on " + domain ); } // @@ -314,14 +348,12 @@ Block[] blocks; try { - ClasspathDescriptor path = - CREATOR.createClasspathDescriptor( m_config.getChild( "blocks" ) ); - URL[] urls = ClasspathDescriptor.expand( m_home, path ); Context system = getSystemContext(); - blocks = loadBlocks( m_engine, m_registry, m_home, urls, system ); + blocks = loadPhysicalBlocks( m_configuration, system ); for( int i=0; i For additional commands, e-mail: