donaldp 01/04/11 22:32:54 Modified: src/java/org/apache/phoenix/engine DefaultSarDeployer.java Main.java Added: src/java/org/apache/phoenix/engine Embeddor.java PhoenixEmbeddor.java PhoenixKernel.java Removed: src/java/org/apache/phoenix/engine AbstractServerKernel.java DefaultServerKernel.java ServerKernel.java Log: Sync across some of Leos ideas/implementations. Namely that of embeddor and how it is set up. Also merged ServerKernel + AbstractServerKernel + DefaultServerKernel into PhoenixKernel Revision Changes Path 1.5 +31 -30 jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/DefaultSarDeployer.java Index: DefaultSarDeployer.java =================================================================== RCS file: /home/cvs/jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/DefaultSarDeployer.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- DefaultSarDeployer.java 2001/04/02 09:10:56 1.4 +++ DefaultSarDeployer.java 2001/04/12 05:32:54 1.5 @@ -22,11 +22,9 @@ import org.apache.avalon.ComponentManager; import org.apache.avalon.ComponentManagerException; import org.apache.avalon.Composer; -import org.apache.avalon.configuration.Configuration; -import org.apache.avalon.configuration.ConfigurationException; import org.apache.avalon.DefaultComponentManager; -import org.apache.avalon.configuration.DefaultConfigurationBuilder; import org.apache.avalon.DefaultContext; +import org.apache.avalon.atlantis.Kernel; import org.apache.avalon.camelot.AbstractCamelotDeployer; import org.apache.avalon.camelot.CamelotUtil; import org.apache.avalon.camelot.ContainerException; @@ -37,13 +35,16 @@ import org.apache.avalon.camelot.Locator; import org.apache.avalon.camelot.Registry; import org.apache.avalon.camelot.RegistryException; +import org.apache.avalon.configuration.Configuration; +import org.apache.avalon.configuration.ConfigurationException; +import org.apache.avalon.configuration.DefaultConfigurationBuilder; import org.apache.avalon.util.io.FileUtil; import org.apache.avalon.util.io.IOUtil; import org.apache.phoenix.BlockContext; -import org.apache.phoenix.metainfo.BlockInfo; import org.apache.phoenix.engine.blocks.BlockEntry; -import org.apache.phoenix.engine.blocks.RoleEntry; import org.apache.phoenix.engine.blocks.DefaultBlockDeployer; +import org.apache.phoenix.engine.blocks.RoleEntry; +import org.apache.phoenix.metainfo.BlockInfo; /** * This class deploys a .sar file. @@ -85,7 +86,7 @@ { final ZipFile zipFile = DeployerUtil.getZipFileFor( file ); - if( !needsExpanding( zipFile, directory ) ) + if( !needsExpanding( zipFile, directory ) ) { return; } @@ -151,21 +152,21 @@ } } - protected ServerKernel getKernel() + protected Kernel getKernel() throws DeploymentException { - if( !(m_container instanceof ServerKernel) ) + if( !(m_container instanceof Kernel) ) { throw new DeploymentException( "Can only deploy to a kernel container" ); } else { - return (ServerKernel)m_container; + return (Kernel)m_container; } } - protected void buildEntry( final String name, - final ServerApplicationEntry entry, + protected void buildEntry( final String name, + final ServerApplicationEntry entry, final File archive, final File directory ) throws DeploymentException @@ -193,8 +194,8 @@ entry.setConfiguration( configuration ); } - protected void deployFromDirectory( final File archive, - final String name, + protected void deployFromDirectory( final File archive, + final String name, final File directory ) throws DeploymentException { @@ -205,23 +206,23 @@ buildEntry( name, entry, archive, directory ); addEntry( name, entry ); - final ServerKernel kernel = getKernel(); + final Kernel kernel = getKernel(); ServerApplication serverApplication = null; - try - { - serverApplication = (ServerApplication)kernel.getApplication( name ); + try + { + serverApplication = (ServerApplication)kernel.getApplication( name ); } - catch( final ContainerException ce ) + catch( final ContainerException ce ) { throw new DeploymentException( "Error preparingserver application", ce ); } //rework next bit so it grabs deployments from archive final Deployer deployer = getBlockDeployer( entry ); - final File blocksDirectory = new File( directory, "blocks" ); + final File blocksDirectory = new File( directory, "blocks" ); CamelotUtil.deployFromDirectory( deployer, blocksDirectory, ".bar" ); - final File file = + final File file = new File( directory, "conf" + File.separator + "assembly.xml" ); try @@ -279,7 +280,7 @@ { final ComponentManager componentManager = saEntry.getComponentManager(); - final Registry infoRegistry = + final Registry infoRegistry = (Registry)componentManager.lookup( "org.apache.avalon.camelot.Registry" ); final Registry locatorRegistry = (Registry)componentManager. @@ -294,20 +295,20 @@ BlockInfo info = null; try { info = (BlockInfo)infoRegistry.getInfo( className, BlockInfo.class ); } - catch( final RegistryException re ) + catch( final RegistryException re ) { - throw new DeploymentException( "Failed to aquire BlockInfo for " + className, + throw new DeploymentException( "Failed to aquire BlockInfo for " + className, re ); } Locator locator = null; try { locator = (Locator)locatorRegistry.getInfo( className, Locator.class ); } - catch( final RegistryException re ) + catch( final RegistryException re ) { - throw new DeploymentException( "Failed to aquire Locator for " + className, + throw new DeploymentException( "Failed to aquire Locator for " + className, re ); } - + final Configuration[] provides = block.getChildren( "provide" ); final ArrayList roleList = new ArrayList(); for( int j = 0; j < provides.length; j++ ) @@ -315,9 +316,9 @@ final Configuration provide = provides[ j ]; final String requiredName = provide.getAttribute("name"); final String role = provide.getAttribute("role"); - + roleList.add( new RoleEntry( requiredName, role ) ); - } + } final RoleEntry[] roles = (RoleEntry[]) roleList.toArray( new RoleEntry[ 0 ] ); final BlockEntry entry = new BlockEntry( locator, roles ); @@ -330,8 +331,8 @@ { throw new DeploymentException( "Error adding component to container", ce ); } - + getLogger().debug( "Adding " + m_type + "Entry " + name + " as " + entry ); - } + } } } 1.7 +20 -80 jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/Main.java Index: Main.java =================================================================== RCS file: /home/cvs/jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/Main.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- Main.java 2001/04/02 01:39:51 1.6 +++ Main.java 2001/04/12 05:32:54 1.7 @@ -7,27 +7,17 @@ */ package org.apache.phoenix.engine; -import java.io.File; -import java.net.URL; import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.util.List; -import org.apache.avalon.Composer; -import org.apache.avalon.DefaultComponentManager; -import org.apache.avalon.Loggable; -import org.apache.avalon.camelot.CamelotUtil; -import org.apache.avalon.camelot.Deployer; +import org.apache.avalon.configuration.Parameters; import org.apache.avalon.util.cli.CLArgsParser; import org.apache.avalon.util.cli.CLOption; import org.apache.avalon.util.cli.CLOptionDescriptor; import org.apache.avalon.util.cli.CLUtil; -import org.apache.avalon.util.log.AvalonLogFormatter; import org.apache.log.LogKit; -import org.apache.log.LogTarget; -import org.apache.log.Logger; import org.apache.log.Priority; -import org.apache.log.output.FileOutputLogTarget; /** * The class to load the kernel and start it running. @@ -43,7 +33,7 @@ private static final String DEFAULT_APPS_PATH = PHOENIX_HOME + "/apps"; private static final String DEFAULT_KERNEL_CLASS = - System.getProperty( "phoenix.kernel", "org.apache.phoenix.engine.DefaultServerKernel" ); + System.getProperty( "phoenix.kernel", "org.apache.phoenix.engine.PhoenixKernel" ); private static final int DEBUG_LOG_OPT = 'd'; private static final int HELP_OPT = 'h'; @@ -52,7 +42,6 @@ protected String m_appsPath = DEFAULT_APPS_PATH; protected String m_logFile = DEFAULT_LOG_FILE; - protected Logger m_logger; protected CLOptionDescriptor[] m_options; @@ -68,11 +57,6 @@ try { main.execute( args ); } catch( final Throwable throwable ) { - if( null != main.m_logger ) - { - main.m_logger.fatalError( "Unhandled exception", throwable ); - } - System.out.println( "There was an uncaught exception:" ); System.out.println( "---------------------------------------------------------" ); throwable.printStackTrace( System.out ); @@ -83,6 +67,8 @@ System.out.println( "http://jakarta.apache.org/avalon for more information." ); System.exit( 1 ); } + + System.exit( 0 ); } /** @@ -201,70 +187,24 @@ protected void execute() throws Exception { - //temporary logging hack .... - - // create a log channel for the loader. - final FileOutputLogTarget logTarget = new FileOutputLogTarget( m_logFile ); - final AvalonLogFormatter formatter = new AvalonLogFormatter(); - formatter.setFormat( "%{time} [%7.7{priority}] <<%{category}>> " + - "(%{context}): %{message}\\n%{throwable}" ); - logTarget.setFormatter( formatter ); - - LogKit.addLogTarget( m_logFile, logTarget ); - m_logger = LogKit.createLogger( LogKit.createCategory( "Phoenix", Priority.DEBUG ), - new LogTarget[] { logTarget } ); - m_logger.info( "Loader started" ); - - ServerKernel kernel = null; - try - { - Thread.currentThread().setContextClassLoader( getClass().getClassLoader() ); - kernel = (ServerKernel)Class.forName( DEFAULT_KERNEL_CLASS ).newInstance(); + final Parameters parameters = new Parameters(); + parameters.setParameter( "kernel-class", "org.apache.phoenix.engine.PhoenixKernel" ); + parameters.setParameter( "deployer-class", "org.apache.phoenix.engine.DefaultSarDeployer" ); + parameters.setParameter( "kernel-configuration-source", null ); + parameters.setParameter( "log-destination", m_logFile ); + parameters.setParameter( "applications-directory", m_appsPath ); + + final PhoenixEmbeddor embeddor = new PhoenixEmbeddor(); + embeddor.setParameters( parameters ); + embeddor.init(); + + try + { + embeddor.execute(); } - catch( final Exception e ) - { - m_logger.fatalError( "Failed to create kernel instance", e ); - throw e; - } - - kernel.setLogger( m_logger ); - kernel.init();//ialize(); - - final File directory = new File( m_appsPath ); - final Deployer deployer = new DefaultSarDeployer(); - setupDeployer( kernel, deployer ); - - CamelotUtil.deployFromDirectory( deployer, directory, ".sar" ); - - //run kernel lifecycle - kernel.start(); - kernel.run(); - kernel.stop(); - kernel.dispose(); - - System.exit(0); - } - - /** - * Setup deployer including Logging/componentManager. - * - * @param kernel the kernel deploying to - * @param deployer the deployer - * @exception Exception if an error occurs - */ - protected void setupDeployer( final ServerKernel kernel, final Deployer deployer ) - throws Exception - { - if( deployer instanceof Loggable ) - { - ((Loggable)deployer).setLogger( m_logger ); - } - - if( deployer instanceof Composer ) + finally { - final DefaultComponentManager componentManager = new DefaultComponentManager(); - componentManager.put( "org.apache.avalon.camelot.Container", kernel ); - ((Composer)deployer).compose( componentManager ); + embeddor.dispose(); } } } 1.1 jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/Embeddor.java Index: Embeddor.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE file. */ package org.apache.phoenix.engine; import org.apache.avalon.Disposable; import org.apache.avalon.Initializable; import org.apache.avalon.configuration.ConfigurationException; import org.apache.avalon.configuration.Parameters; /** * This is the object that is interacted with to create, manage and * dispose of the kernel and related resources. * * Note that this will eventually be moved to atlantis package. * * @author <a href="[EMAIL PROTECTED]">Leo Simons</a> * @author <a href="[EMAIL PROTECTED]">Peter Donald</a> */ public interface Embeddor extends Initializable, Disposable { /** * Kset parameters for this component. * This must be called before initialize() * * @param parameters the Parameters for embeddor * @exception ConfigurationException if an error occurs */ void setParameters( Parameters parameters ) throws ConfigurationException; /** * After the Embeddor is initialized, this method is called to actually * do the work. It will return when the embeddor is ready to be disposed. * * @exception Exception if an error occurs */ void execute() throws Exception; } 1.1 jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/PhoenixEmbeddor.java Index: PhoenixEmbeddor.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE file. */ package org.apache.phoenix.engine; import java.io.File; import java.lang.UnsupportedOperationException; import org.apache.avalon.AbstractLoggable; import org.apache.avalon.CascadingException; import org.apache.avalon.Composer; import org.apache.avalon.Contextualizable; import org.apache.avalon.DefaultComponentManager; import org.apache.avalon.Disposable; import org.apache.avalon.Initializable; import org.apache.avalon.atlantis.Kernel; import org.apache.avalon.camelot.CamelotUtil; import org.apache.avalon.camelot.Container; import org.apache.avalon.camelot.Deployer; import org.apache.avalon.configuration.Configurable; import org.apache.avalon.configuration.Configuration; import org.apache.avalon.configuration.ConfigurationException; import org.apache.avalon.configuration.DefaultConfigurationBuilder; import org.apache.avalon.configuration.Parameters; import org.apache.avalon.util.log.AvalonLogFormatter; import org.apache.log.LogKit; import org.apache.log.LogTarget; import org.apache.log.Logger; import org.apache.log.Priority; import org.apache.log.output.FileOutputLogTarget; /** * This is the object that is interacted with to create, manage and * dispose of the kernel and related resources. * * Note that this will eventually be moved to atlantis package. * * @author <a href="[EMAIL PROTECTED]">Leo Simons</a> * @author <a href="[EMAIL PROTECTED]">Peter Donald</a> */ public class PhoenixEmbeddor extends AbstractLoggable implements Embeddor { private Parameters m_parameters; private Kernel m_kernel; private Deployer m_deployer; private boolean m_shutdown; /** * Set parameters for this component. * This must be called after contextualize() and before initialize() * * @param parameters the Parameters for embeddor * @exception ConfigurationException if an error occurs */ /** * Make sure to provide all the neccessary information through * these parameters. All information it needs consists of strings. * Neccessary are: * <ul> * <li><b>kernel-class</b>, the classname of the * org.apache.phoenix.engine.ServerKernel to be used.</li> * <li><b>deployer-class</b>, the classname of the * org.apache.avalon.camelot.Deployer to be used.</li> * <li><b>kernel-configuration-source</b>, the location * of the configuration file to be used for configuring the * kernel. (If kernel is configurable)</li> * <li><b>log-destination</b>, the file to save log * messages in. If omitted, no logs are written.</li> * <li>TODO: <b>facilities-directory</b>, the directory in * which the facilities you wish to load into the kernel * are stored (in .far format).<br /> * When ommited, the default facilities are used.</li> * <li><b>applications-directory</b>, the directory in which * the defaul applications to be loaded by the kernel are stored * (in .sar format).<br /> * When ommited, no applications are loaded.</li> * </ul> */ public void setParameters( final Parameters parameters ) throws ConfigurationException { m_parameters = parameters; } /** * Creates the core handlers - logger, deployer, Manager and * Kernel. Note that these are not set up properly until you have * called the <code>run()</code> method. */ public void init() throws Exception { createComponents(); } /** * This is the main method of the embeddor. It sets up the core * components, and then deploys the <code>Facilities</code>. These * are registered with the Kernel and the Manager. The same * happens for the <code>Applications</code>. * Now, the Kernel is taken through its lifecycle. When it is * finished, as well as all the applications running in it, it * is shut down, after which the PhoenixEmbeddor is as well. */ public void execute() throws Exception { try { // setup core handler components setupComponents(); deployDefaultApplications(); m_kernel.start(); // loop until <code>Shutdown</code> is created. while( !m_shutdown ) { // loop // wait() for shutdown() to take action... try { synchronized( this ) { wait(); } } catch (InterruptedException e) {} } } catch ( Exception e ) { // whoops! getLogger().fatalError( "There was a fatal error while running phoenix.", e ); System.exit( 1 ); } } /** * Release all the resources associated with kernel. */ public void dispose() throws Exception { if( null != m_kernel ) { m_kernel.stop(); m_kernel.dispose(); } m_kernel = null; m_deployer = null; System.gc(); // make sure resources are released } /** * Shut down the Embeddor together with the * Logger, Deployer, Manager and Kernel. */ public void shutdown() { m_shutdown = true; synchronized( this ) { notifyAll(); } } ////////////////////// /// HELPER METHODS /// ////////////////////// /** * Create the logger, deployer and kernel components. * Note that these components are not ready to be used * until setupComponents() is called. */ private void createComponents() throws Exception { final Logger logger = createLogger(); setLogger( logger ); try { m_deployer = createDeployer(); } catch( final Exception e ) { final String message = "Unable to create deployer!"; getLogger().fatalError( message, e ); throw new CascadingException( message, e ); } try { m_kernel = createKernel(); } catch( final Exception e ) { final String message = "Unable to create kernel!"; getLogger().fatalError( message, e ); throw new CascadingException( message, e ); } } /** * Setup the deployer and kernel components. * Note that after this method these components are ready to be used */ private void setupComponents() throws Exception { try { setupDeployer(); } catch( final Exception e ) { getLogger().fatalError( "Unable to setup deployer!", e ); throw e; } try { setupKernel(); } catch( final Exception e ) { getLogger().fatalError( "Unable to setup kernel!", e ); throw e; } } /** * Uses <code>org.apache.log.LogKit</code> to create a new * logger using "Phoenix" as its category, DEBUG as its * priority and the log-destination from Parameters as its * destination. * TODO: allow configurable priorities and multiple * logtargets. */ private Logger createLogger() throws ConfigurationException { try { final String logDestination = m_parameters.getParameter( "log-destination", null ); final FileOutputLogTarget logTarget = new FileOutputLogTarget( logDestination ); final AvalonLogFormatter formatter = new AvalonLogFormatter(); formatter.setFormat( "%{time} [%7.7{priority}] <<%{category}>> " + "(%{context}): %{message}\\n%{throwable}" ); logTarget.setFormatter( formatter ); LogKit.addLogTarget( logDestination, logTarget ); final Logger logger = LogKit.createLogger( LogKit.createCategory( "Phoenix", Priority.DEBUG ), new LogTarget[] { logTarget } ); logger.info( "Logger started" ); return logger; } catch( final Exception e ) { throw new ConfigurationException( "Failed to create Logger", e ); } } /** * Creates a new deployer from the Parameters's deployer-class. * TODO: fill the Parameters for Deployer properly. */ private Deployer createDeployer() throws ConfigurationException { final String className = m_parameters.getParameter( "deployer-class", null ); try { Thread.currentThread().setContextClassLoader( getClass().getClassLoader() ); return (Deployer)Class.forName( className ).newInstance(); } catch( final Exception e ) { throw new ConfigurationException( "Failed to create Deployer of class " + className, e ); } } /** * Sets up the Deployer. If it is Loggable, it gets a reference * to the Embeddor's logger. If it is Contextualizable it is * passed a Context. If it is a Composer it is given a * ComponentManager which references the Kernel, cast to a * Container. * The deployer is now used to load the applications from the * default-facilities-location specified in Context. * TODO: load facilities from .fars as well. */ private void setupDeployer() throws Exception { setupLogger( m_deployer ); if( m_deployer instanceof Composer ) { final DefaultComponentManager componentManager = new DefaultComponentManager(); componentManager.put( "org.apache.avalon.camelot.Container", (Container)m_kernel ); ((Composer)m_deployer).compose( componentManager ); } } /** * The deployer is used to load the applications from the * default-apps-location specified in Parameters. * TODO: load facilities from .fars as well. * * @exception Exception if an error occurs */ private void deployDefaultApplications() throws Exception { final String defaultAppsLocation = m_parameters.getParameter( "applications-directory", null ); if( null != defaultAppsLocation ) { final File directory = new File( defaultAppsLocation ); CamelotUtil.deployFromDirectory( m_deployer, directory, ".sar" ); } // TODO: load facilities from .fars // final File directory2 = new File( (String)this.context.get( "default-facilities-location" ) ); // CamelotUtil.deployFromDirectory( deployer, directory2, ".far" ); } /** * Creates a new deployer from the Parameters's kernel-class. * TODO: fill the Parameters for kernel properly. */ private Kernel createKernel() throws ConfigurationException { final String className = m_parameters.getParameter( "kernel-class", null ); try { Thread.currentThread().setContextClassLoader( getClass().getClassLoader() ); return (Kernel)Class.forName( className ).newInstance(); } catch( final Exception e ) { throw new ConfigurationException( "Failed to create Kernel of class " + className, e ); } } /** * Sets up the Kernel. We determine whether it supports Loggable * and Configurable and supply information based on that. */ private void setupKernel() throws Exception { setupLogger( m_kernel ); if( m_kernel instanceof Configurable ) { final DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder(); final String kernelConfigLocation = m_parameters.getParameter( "kernel-configuration-source", null ); final Configuration configuration = builder.build( kernelConfigLocation ); ((Configurable)m_kernel).configure( configuration ); } try { m_kernel.init(); } catch( final Exception e ) { getLogger().fatalError( "There was a fatal error; phoenix could not be started", e ); throw e; } } } 1.1 jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/PhoenixKernel.java Index: PhoenixKernel.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE file. */ package org.apache.phoenix.engine; import org.apache.avalon.Composer; import org.apache.avalon.atlantis.Kernel; import org.apache.avalon.atlantis.AbstractKernel; import org.apache.avalon.atlantis.Application; import org.apache.avalon.camelot.Entry; import org.apache.log.LogKit; /** * The ServerKernel is the core of the Phoenix system. * The kernel is responsible for orchestrating low level services * such as loading, configuring and destroying blocks. It also * gives access to basic facilities such as scheduling sub-systems, * protected execution contexts, naming and directory services etc. * * Note that no facilities are available until after the Kernel has been * configured and initialized. * * @author <a href="mailto:[EMAIL PROTECTED]">Peter Donald</a> */ public class PhoenixKernel extends AbstractKernel implements Kernel { private final static String BANNER = Constants.SOFTWARE + " " + Constants.VERSION; public PhoenixKernel() { m_entryClass = ServerApplicationEntry.class; m_applicationClass = ServerApplication.class; } public void init() throws Exception { System.out.println(); System.out.println( BANNER ); super.init(); } protected Application newApplication( final String name, final Entry entry ) throws Exception { //It is here where you could return new EASServerApplication() //if you wanted to host multiple different types of apps return new DefaultServerApplication(); } /** * Prepare an application before it is initialized. * Overide to provide functionality. * Usually used to setLogger(), contextualize, compose, configure. * * @param name the name of application * @param entry the application entry * @param application the application instance * @exception Exception if an error occurs */ protected void prepareApplication( final String name, final Entry entry, final Application application ) throws Exception { final ServerApplicationEntry saEntry = (ServerApplicationEntry)entry; final ServerApplication saApplication = (ServerApplication)application; setupLogger( saApplication, LogKit.getLoggerFor( name ) ); saApplication.contextualize( saEntry.getContext() ); if( saApplication instanceof Composer ) { ((Composer)saApplication).compose( saEntry.getComponentManager() ); } saApplication.configure( saEntry.getConfiguration() ); } protected void postAdd( final String name, final Entry entry ) { } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]