mcconnell 2002/07/09 03:59:36 Modified: assembly/src/java/org/apache/excalibur/merlin/kernel DefaultContainer.java DefaultKernel.java Main.java Resources.properties Added: assembly/src/java/org/apache/excalibur/merlin/kernel DefaultLoggerManager.java KernelException.java KernelRuntimeException.java Log: enhanced logging support Revision Changes Path 1.10 +6 -3 jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/kernel/DefaultContainer.java Index: DefaultContainer.java =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/kernel/DefaultContainer.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- DefaultContainer.java 8 Jul 2002 09:57:36 -0000 1.9 +++ DefaultContainer.java 9 Jul 2002 10:59:35 -0000 1.10 @@ -208,7 +208,9 @@ // before starting up any of the nested containers // - getLogger().debug("startup"); + if( getLogger().isDebugEnabled() ) + getLogger().debug("startup"); + start(); Iterator iterator = m_containers.iterator(); while( iterator.hasNext() ) @@ -225,7 +227,8 @@ // the components in this container // - getLogger().debug("shutdown"); + if( getLogger().isDebugEnabled() ) + getLogger().debug("shutdown"); Iterator iterator = m_containers.iterator(); while( iterator.hasNext() ) { 1.9 +54 -15 jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/kernel/DefaultKernel.java Index: DefaultKernel.java =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/kernel/DefaultKernel.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- DefaultKernel.java 8 Jul 2002 09:57:36 -0000 1.8 +++ DefaultKernel.java 9 Jul 2002 10:59:35 -0000 1.9 @@ -57,16 +57,13 @@ import org.apache.avalon.excalibur.extension.Extension; import org.apache.avalon.excalibur.extension.OptionalPackage; import org.apache.avalon.excalibur.extension.DefaultPackageRepository; +import org.apache.avalon.excalibur.logger.LoggerManager; import org.apache.excalibur.meta.info.DefaultType; import org.apache.excalibur.meta.info.Type; import org.apache.excalibur.meta.info.ServiceDescriptor; import org.apache.excalibur.meta.info.DependencyDescriptor; import org.apache.excalibur.meta.info.ServiceDesignator; import org.apache.excalibur.meta.data.Profile; -import org.apache.log.Hierarchy; -import org.apache.log.Priority; -import org.apache.log.output.io.StreamTarget; - /** * Default kernel implementation. @@ -88,6 +85,8 @@ private boolean m_verified = false; + private LoggerManager m_manager; + //======================================================================= // Configurable //======================================================================= @@ -99,7 +98,6 @@ public void configure( Configuration config) { m_config = config; - getLogger().debug("kernel configuration"); } //======================================================================= @@ -108,6 +106,10 @@ public void initialize() throws Exception { + m_manager = createLoggingManager(); + Logger logger = m_manager.getLoggerForCategory("kernel") ; + enableLogging( logger ); + final ContainerClassLoader loader = new ContainerClassLoader( new DefaultPackageRepository( Fileset.expandExtensions( @@ -116,16 +118,26 @@ ), Thread.currentThread().getContextClassLoader(), m_config.getChild("container").getChild("classpath"), - getLogger().getChildLogger( m_config.getName()) + getLogger().getChildLogger( "loader" ) ); - DefaultContext context = new DefaultContext(); - context.put( DefaultContainer.CLASSLOADER_KEY, loader ); - m_container.enableLogging( getLogger().getChildLogger("container") ); - m_container.contextualize( context ); - m_container.configure( m_config.getChild("container" ) ); - m_container.initialize( ); - m_container.verify(); + try + { + DefaultContext context = new DefaultContext(); + context.put( DefaultContainer.CLASSLOADER_KEY, loader ); + m_container.enableLogging( getLogger().getChildLogger("container") ); + m_container.contextualize( context ); + m_container.configure( m_config.getChild("container" ) ); + m_container.initialize( ); + m_container.verify(); + } + catch( Throwable e ) + { + final String error = "Kernel initialization failure."; + if( getLogger() != null ) + getLogger().error( error, e ); + throw new KernelException( error, e ); + } } //======================================================================= @@ -135,12 +147,39 @@ public void startup() throws Exception { //listProfiles(); - m_container.startup(); + if( getLogger().isInfoEnabled() ) + getLogger().info("startup"); + + try + { + m_container.startup(); + } + catch( Throwable e ) + { + final String error = "Kernel startup failure."; + getLogger().error( error, e ); + throw new KernelException( error, e ); + } } public void shutdown() { + if( getLogger().isInfoEnabled() ) + getLogger().info("shutdown"); m_container.shutdown(); } + //======================================================================= + // internals + //======================================================================= + + private LoggerManager createLoggingManager() throws Exception + { + final File home = new File( System.getProperty( "user.dir" ) ); + final Configuration config = m_config.getChild( "logging" ); + final DefaultLoggerManager manager = new DefaultLoggerManager( + home, config ); + manager.initialize( ); + return manager; + } } 1.6 +8 -41 jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/kernel/Main.java Index: Main.java =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/kernel/Main.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- Main.java 7 Jul 2002 23:17:07 -0000 1.5 +++ Main.java 9 Jul 2002 10:59:35 -0000 1.6 @@ -77,11 +77,6 @@ // static //======================================================================= - private static final String DEFAULT_FORMAT = - "[%7.7{priority}] (%{category}): %{message}\\n%{throwable}"; - private static final Resources REZ = - ResourceManager.getPackageResources( Main.class ); - /** * Creation of a root type registry. */ @@ -121,60 +116,32 @@ throw new RuntimeException("Missing kernel configuration path argument."); } - // create a bootstrap logger - this needs to be replaced with - // the Avalon Exvalibur Logkit package + // run it up - final Logger logger = getLogger( config ); - DefaultContext context = new DefaultContext(); try { - kernel.enableLogging( logger ); kernel.configure( config ); kernel.initialize( ); } - catch( Throwable e ) + catch( KernelException e ) { - logger.error("Unexpected error while processing kernel lifecycle.", e); System.exit(0); } - - // invoke the registry demo - try - { - kernel.startup(); - } catch( Throwable e ) { - logger.error("Kernel startup failure.", e ); + System.out.println("Unexpected error while initilizing kernel."); + e.printStackTrace(); System.exit(0); } - } - private static Logger getLogger( Configuration config ) - { - // create an internal logger for the registry - final Hierarchy hierarchy = createHierarchy( - Priority.getPriorityForName( - config.getChild("logger").getAttribute("priority","INFO") - ) - ); - return new LogKitLogger( hierarchy.getLoggerFor( "" ) ); - } - - private static Hierarchy createHierarchy( Priority priority ) - { + // invoke the registry demo try { - Hierarchy hierarchy = Hierarchy.getDefaultHierarchy(); - hierarchy.setDefaultLogTarget( - new StreamTarget( System.out, new AvalonFormatter( DEFAULT_FORMAT ) ) ); - hierarchy.setDefaultPriority( priority ); - return hierarchy; + kernel.startup(); } catch( Throwable e ) { - final String error = "Unexpected exception while creating bootstrap logger."; - throw new CascadingRuntimeException( error, e ); + System.exit(0); } } 1.6 +3 -0 jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/kernel/Resources.properties Index: Resources.properties =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/kernel/Resources.properties,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- Resources.properties 8 Jul 2002 09:57:36 -0000 1.5 +++ Resources.properties 9 Jul 2002 10:59:35 -0000 1.6 @@ -27,3 +27,6 @@ resource.missing-parameters.error=Missing Parameters object for component named "{0}". resource.missing-parameters.error=Missing Configuration for component named "{0}". +target.nocreate=Error creating LogTarget named "{0}" for file {0}. (Reason: {2}). +unknown-priority=Unknown priority "{0}" for Logger named "{1}". +category-create=Creating a log category named "{0}" that writes to "{1}" target at priority "{2}". 1.1 jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/kernel/DefaultLoggerManager.java Index: DefaultLoggerManager.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.txt file. */ package org.apache.excalibur.merlin.kernel; import java.io.File; import java.io.IOException; import java.util.HashMap; import org.apache.avalon.excalibur.i18n.ResourceManager; import org.apache.avalon.excalibur.i18n.Resources; import org.apache.avalon.excalibur.logger.LoggerManager; import org.apache.avalon.framework.activity.Initializable; import org.apache.avalon.framework.configuration.Configurable; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.avalon.framework.context.Context; import org.apache.avalon.framework.context.ContextException; import org.apache.avalon.framework.context.Contextualizable; import org.apache.avalon.framework.logger.AbstractLogEnabled; import org.apache.avalon.framework.logger.AvalonFormatter; import org.apache.avalon.framework.logger.LogKitLogger; import org.apache.log.Hierarchy; import org.apache.log.LogTarget; import org.apache.log.Logger; import org.apache.log.Priority; import org.apache.log.output.io.FileTarget; import org.apache.log.output.io.StreamTarget; /** * A <code>LoggerManager</code> that supports a verifiable logging hierarchy creation directive. * * @author <a href="mailto:[EMAIL PROTECTED]">Stephen McConnell</a> * @author <a href="mailto:[EMAIL PROTECTED]">Eung-ju Park</a> * @author <a href="mailto:[EMAIL PROTECTED]">Peter Donald</a> */ class DefaultLoggerManager implements LoggerManager, Initializable { public static final String HOME_KEY = "app.home"; private static final Resources REZ = ResourceManager.getPackageResources( DefaultLoggerManager.class ); private static final String DEFAULT_FORMAT = "[%7.7{priority}] (%{category}): %{message}\\n%{throwable}"; /** * Base directory of file targets. */ private File m_baseDirectory; /** * log hierarchy. */ private Hierarchy m_logHierarchy = new Hierarchy(); /** * default logger */ private org.apache.avalon.framework.logger.Logger m_logger; /** * default logger target */ private StreamTarget m_stream; /** * the default priority if undefined */ private String m_defaultPriority = "INFO"; /** * the supplied configuration */ private Configuration m_config; //=============================================================== // constructor //=============================================================== /** * Creation of a new LoggerManager. * @param base the base directory against which file targets are * logicaly created * @param config the logging configuration */ public DefaultLoggerManager( File base, Configuration config ) { m_baseDirectory = base; m_config = config; } //=============================================================== // Initializable //=============================================================== /** * Initialization of the logging manager. * @exception Exception if an error furing the initialization process occurs */ public void initialize( ) throws Exception { m_defaultPriority = m_config.getAttribute("priority", "INFO" ); Priority priority = Priority.getPriorityForName( m_defaultPriority ); m_stream = new StreamTarget( System.out, new AvalonFormatter( DEFAULT_FORMAT ) ); getHierarchy().setDefaultLogTarget( m_stream ); getHierarchy().setDefaultPriority( priority ); final Configuration[] targets = m_config.getChildren( "target" ); final HashMap targetSet = configureTargets( targets ); final Configuration[] categories = m_config.getChildren( "category" ); configureCategories( categories, targetSet ); } //=============================================================== // LoggerManager //=============================================================== /** * Return the Logger for the specified category. */ public org.apache.avalon.framework.logger.Logger getLoggerForCategory( final String category ) { return new LogKitLogger( getHierarchy().getLoggerFor( category ) ); } /** * Return the default Logger. This is the same * as getting the Logger for the "" category. */ public org.apache.avalon.framework.logger.Logger getDefaultLogger( ) { if( m_logger == null ) m_logger = getLoggerForCategory(""); return m_logger; } //=============================================================== // internals //=============================================================== private Hierarchy getHierarchy() { return m_logHierarchy; } /** * Configure a set of logtargets based on config data. * * @param targets the target configuration data * @return a Map of target-name to target * @throws ConfigurationException if an error occurs */ private HashMap configureTargets( final Configuration[] targets ) throws ConfigurationException { final HashMap targetSet = new HashMap(); // // Create the default target. // targetSet.put( "default", m_stream ); for( int i = 0; i < targets.length; i++ ) { final Configuration target = targets[ i ]; final String name = target.getAttribute( "name" ); final Configuration fileDef = target.getChild( "file", false ); if( fileDef != null ) { String location = fileDef.getAttribute( "location" ).trim(); final String format = fileDef.getAttribute( "format", DEFAULT_FORMAT ); if( '/' == location.charAt( 0 ) ) location = location.substring( 1 ); final AvalonFormatter formatter = new AvalonFormatter( format ); //Specify output location for logging final File file = new File( m_baseDirectory, location ); //Setup logtarget FileTarget logTarget = null; try { logTarget = new FileTarget( file.getAbsoluteFile(), false, formatter ); } catch( final IOException ioe ) { final String message = REZ.getString( "target.nocreate", name, file, ioe.getMessage() ); throw new ConfigurationException( message, ioe ); } targetSet.put( name, logTarget ); } else { final String error = "Unrecognized elements declaration in the logging target named: " + name; throw new IllegalArgumentException( error ); } } return targetSet; } /** * Configure Logging categories. * * @param categories configuration data for categories * @param targets a hashmap containing the already existing taregt * @throws ConfigurationException if an error occurs */ private void configureCategories( final Configuration[] categories, final HashMap targets ) throws ConfigurationException { for( int i = 0; i < categories.length; i++ ) { final Configuration category = categories[ i ]; final String name = category.getAttribute( "name", "" ); final String target = category.getAttribute( "target" , "default" ); final String priorityName = category.getAttribute( "priority", m_defaultPriority ); final Logger logger = getHierarchy().getLoggerFor( name ); final LogTarget logTarget = (LogTarget)targets.get( target ); final Priority priority = Priority.getPriorityForName( priorityName ); if( !priority.getName().equals( priorityName ) ) { final String message = REZ.getString( "unknown-priority", priorityName, name ); throw new ConfigurationException( message ); } logger.setPriority( priority ); if( logTarget != null ) logger.setLogTargets( new LogTarget[]{logTarget} ); if( getDefaultLogger().isDebugEnabled() ) { final String message = REZ.getString( "category-create", name, target, priorityName ); getDefaultLogger().debug( message ); } } } } 1.1 jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/kernel/KernelException.java Index: KernelException.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.txt file. */ package org.apache.excalibur.merlin.kernel; import org.apache.avalon.framework.CascadingException; /** * Exception to indicate that there was a kernel related error. * * @author <a href="mailto:[EMAIL PROTECTED]">Stephen McConnell</a> * @version $Revision: 1.1 $ $Date: 2002/07/09 10:59:35 $ */ public final class KernelException extends CascadingException { /** * Construct a new <code>KernelException</code> instance. * * @param message The detail message for this exception. */ public KernelException( final String message ) { this( message, null ); } /** * Construct a new <code>KernelException</code> instance. * * @param message The detail message for this exception. * @param throwable the root cause of the exception */ public KernelException( final String message, final Throwable throwable ) { super( message, throwable ); } } 1.1 jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/kernel/KernelRuntimeException.java Index: KernelRuntimeException.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.txt file. */ package org.apache.excalibur.merlin.kernel; import org.apache.avalon.framework.CascadingRuntimeException; /** * Exception to indicate that there was a kernel related runtime error. * * @author <a href="mailto:[EMAIL PROTECTED]">Stephen McConnell</a> * @version $Revision: 1.1 $ $Date: 2002/07/09 10:59:35 $ */ public final class KernelRuntimeException extends CascadingRuntimeException { /** * Construct a new <code>KernelRuntimeException</code> instance. * * @param message The detail message for this exception. */ public KernelRuntimeException( final String message ) { this( message, null ); } /** * Construct a new <code>KernelRuntimeException</code> instance. * * @param message The detail message for this exception. * @param throwable the root cause of the exception */ public KernelRuntimeException( final String message, final Throwable throwable ) { super( message, throwable ); } }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>