You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by mc...@apache.org on 2002/08/15 06:14:50 UTC

cvs commit: jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/info/builder BlockBuilder.java XMLBlockCreator.java Resources.properties XMLTypeCreator.java

mcconnell    2002/08/14 21:14:50

  Modified:    assembly build.xml
               assembly/demo/src/java/org/apache/excalibur/playground
                        ComplexComponent.java DemoManager.java
                        DemoManager.xinfo
               assembly/src/etc kernel.xml
               assembly/src/java/org/apache/excalibur/merlin/assembly
                        ContainerManager.java TypeManager.java
                        TypeRegistry.java
               assembly/src/java/org/apache/excalibur/merlin/resource
                        DefaultLifestyleManager.java
               assembly/src/java/org/apache/excalibur/meta
                        ConfigurationBuilder.java
               assembly/src/java/org/apache/excalibur/meta/info/builder
                        Resources.properties XMLTypeCreator.java
  Added:       assembly/src/java/org/apache/excalibur/container/lifecycle
                        package.html
               assembly/src/java/org/apache/excalibur/merlin/toolkit
                        GenericBlockContext.java
               assembly/src/java/org/apache/excalibur/meta blockinfo.dtd
               assembly/src/java/org/apache/excalibur/meta/info/builder
                        BlockBuilder.java XMLBlockCreator.java
  Log:
  Addition of support for Phoenix block assembly and Phoenix to Merlin
  migration tools.
  
  Revision  Changes    Path
  1.42      +12 -1     jakarta-avalon-excalibur/assembly/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/build.xml,v
  retrieving revision 1.41
  retrieving revision 1.42
  diff -u -r1.41 -r1.42
  --- build.xml	14 Aug 2002 10:46:29 -0000	1.41
  +++ build.xml	15 Aug 2002 04:14:49 -0000	1.42
  @@ -105,6 +105,7 @@
         <srcfiles dir="${src.dir}/java">
            <include name="**/merlin/**/*.*"/>
            <include name="**/excalibur/container/**/*.*"/>
  +         <include name="**/avalon/phoenix/**/*.*"/>
         </srcfiles>
         <srcfiles dir="${etc}">
            <include name="${project.manifest}"/>
  @@ -125,6 +126,7 @@
         </javac>
         <copy todir="${build}/main">
           <fileset dir="${src.dir}/java">
  +          <exclude name="org/apache/excalibur/meta/**/*"/>
             <include name="**/merlin/**/*.xml"/>
             <include name="**/merlin/**/*.properties"/>
             <include name="**/merlin/**/*.xinfo"/>
  @@ -133,8 +135,17 @@
           </fileset>
         </copy>
         <jar jarfile="${dist.dir}/${merlin.jar}" 
  -         basedir="${build}/main" manifest="${etc}/${project.manifest}"/>
  +         basedir="${build}/main" manifest="${etc}/${project.manifest}" 
  +         excludes="org/apache/excalibur/merlin/toolkit/**"/>
  +
  +      <!-- need to seperate next action out into a different build environment -->
  +
  +      <jar jarfile="${dist.dir}/tools.jar" 
  +         basedir="${build}/main" 
  +         includes="org/apache/excalibur/merlin/toolkit/**/*"/>
  +
     </target>
  +
   
     <target name="meta.context" depends="prepare">
       <mkdir dir="dist"/>
  
  
  
  1.9       +3 -1      jakarta-avalon-excalibur/assembly/demo/src/java/org/apache/excalibur/playground/ComplexComponent.java
  
  Index: ComplexComponent.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/demo/src/java/org/apache/excalibur/playground/ComplexComponent.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- ComplexComponent.java	12 Aug 2002 17:38:20 -0000	1.8
  +++ ComplexComponent.java	15 Aug 2002 04:14:49 -0000	1.9
  @@ -141,7 +141,9 @@
           if( getLogger().isDebugEnabled() )
             getLogger().debug("dispose");
   
  -        m_simple = null;
  +        
  +        m_manager.release( m_simple );
  +        m_manager.release( m_basic );
           m_manager = null;
       }
   
  
  
  
  1.7       +12 -4     jakarta-avalon-excalibur/assembly/demo/src/java/org/apache/excalibur/playground/DemoManager.java
  
  Index: DemoManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/demo/src/java/org/apache/excalibur/playground/DemoManager.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- DemoManager.java	14 Aug 2002 10:46:29 -0000	1.6
  +++ DemoManager.java	15 Aug 2002 04:14:49 -0000	1.7
  @@ -33,25 +33,33 @@
       public void create( Object target, Context context ) throws Exception
       {
           if( target instanceof Demonstratable )
  -          ((Demonstratable)target).demo( "create id: " + System.identityHashCode( this ) );
  +          ((Demonstratable)target).demo( "create id: " 
  +             + System.identityHashCode( this ) 
  +             + ", " + Thread.currentThread() );
       }
   
       public void destroy( Object target, Context context )
       {
           if( target instanceof Demonstratable )
  -          ((Demonstratable)target).demo( "destroy id: " + System.identityHashCode( this ) );
  +          ((Demonstratable)target).demo( "destroy id: " 
  +             + System.identityHashCode( this ) 
  +             + ", " + Thread.currentThread() );
       }
   
       public void access( Object target, Context context ) throws Exception
       {
           if( target instanceof Demonstratable )
  -          ((Demonstratable)target).demo( "access id: " + System.identityHashCode( this ) );
  +          ((Demonstratable)target).demo( "access id: " 
  +             + System.identityHashCode( this ) 
  +             + ", " + Thread.currentThread() );
       }
   
       public void release( Object target, Context context )
       {
           if( target instanceof Demonstratable )
  -          ((Demonstratable)target).demo( "release id: " + System.identityHashCode( this ) );
  +          ((Demonstratable)target).demo( "release id: " 
  +             + System.identityHashCode( this ) 
  +             + ", " + Thread.currentThread() );
       }
   
       //=======================================================================
  
  
  
  1.7       +1 -1      jakarta-avalon-excalibur/assembly/demo/src/java/org/apache/excalibur/playground/DemoManager.xinfo
  
  Index: DemoManager.xinfo
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/demo/src/java/org/apache/excalibur/playground/DemoManager.xinfo,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- DemoManager.xinfo	14 Aug 2002 03:03:34 -0000	1.6
  +++ DemoManager.xinfo	15 Aug 2002 04:14:49 -0000	1.7
  @@ -14,7 +14,7 @@
     <component>
       <name>demonstratable</name>
       <attributes>
  -      <attribute key="avalon:lifestyle" value="transient"/>
  +      <attribute key="avalon:lifestyle" value="thread"/>
       </attributes>
     </component>
   
  
  
  
  1.34      +1 -0      jakarta-avalon-excalibur/assembly/src/etc/kernel.xml
  
  Index: kernel.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/etc/kernel.xml,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- kernel.xml	13 Aug 2002 03:57:56 -0000	1.33
  +++ kernel.xml	15 Aug 2002 04:14:49 -0000	1.34
  @@ -165,6 +165,7 @@
   
            </component>
   
  +
            <!--
            Demonstration of a component that contains an embedded kernel that programatically
            adds a container or two, and a new component type.  To enable this demo - change the 
  
  
  
  1.1                  jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/container/lifecycle/package.html
  
  Index: package.html
  ===================================================================
  <body>
  Container independent interfaces and classes supporting component lifecycle extension.
  </body>
  
  
  
  1.20      +19 -2     jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/assembly/ContainerManager.java
  
  Index: ContainerManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/assembly/ContainerManager.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- ContainerManager.java	14 Aug 2002 10:46:29 -0000	1.19
  +++ ContainerManager.java	15 Aug 2002 04:14:49 -0000	1.20
  @@ -210,6 +210,8 @@
       */
       private DeploymentHelper m_deployment;
   
  +    private File m_home;
  +
       //===================================================================
       // constructor
       //===================================================================
  @@ -263,6 +265,7 @@
       public void contextualize( Context context ) throws ContextException
       {
           m_context = context;
  +        m_home = (File) context.get("avalon:home");
           super.contextualize( context );
           try
           {
  @@ -808,11 +811,25 @@
           if( resource != null )
             return resource;
   
  +        //
  +        // add some Phoenix specific stuff so we can work around context expected
  +        // on a BlockContext without having to modify the xinfo file
  +        //
  +
  +        DefaultContext c = new DefaultContext( context );
  +        c.put("name", profile.getName() );
  +        c.put("block.name", getPath().replace('/','.').substring(1) + "." + profile.getName() );
  +        c.put("app.home", m_home );
  +
  +        //
  +        // continue on with resource creation
  +        //
  +
           try
           {
               LifestyleManager lifestyles = getLifestyleManager();
               LifestyleHandler handler =
  -              lifestyles.getHandler( this, m_deployment, m_helper, profile, context );
  +              lifestyles.getHandler( this, m_deployment, m_helper, profile, c );
               DefaultResource res = 
                 new DefaultResource( getPath(), profile, context, handler );
               res.enableLogging( getLocalLogger().getChildLogger( "resource" ) );
  
  
  
  1.10      +2 -2      jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/assembly/TypeManager.java
  
  Index: TypeManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/assembly/TypeManager.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- TypeManager.java	14 Aug 2002 03:03:35 -0000	1.9
  +++ TypeManager.java	15 Aug 2002 04:14:49 -0000	1.10
  @@ -294,7 +294,7 @@
                               final String path = name.substring( 0, name.indexOf( ".class" ) );
                               try
                               {
  -                                m_types.addType( path );
  +                                m_types.addBlock( path );
                               }
                               catch( Throwable e )
                               {
  
  
  
  1.7       +29 -1     jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/assembly/TypeRegistry.java
  
  Index: TypeRegistry.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/assembly/TypeRegistry.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- TypeRegistry.java	14 Aug 2002 03:03:35 -0000	1.6
  +++ TypeRegistry.java	15 Aug 2002 04:14:49 -0000	1.7
  @@ -25,6 +25,7 @@
   import org.apache.excalibur.meta.info.PhaseDescriptor;
   import org.apache.excalibur.meta.info.ExtensionDescriptor;
   import org.apache.excalibur.meta.info.builder.TypeBuilder;
  +import org.apache.excalibur.meta.info.builder.BlockBuilder;
   import org.apache.excalibur.merlin.model.Profile;
   import org.apache.excalibur.meta.verifier.ComponentVerifier;
   import org.apache.excalibur.configuration.ConfigurationUtil;
  @@ -45,6 +46,8 @@
   
       private TypeBuilder m_typeBuilder = new TypeBuilder();
   
  +    private BlockBuilder m_blockBuilder = new BlockBuilder();
  +
       private ClassLoader m_classloader;
   
      /**
  @@ -77,6 +80,7 @@
           m_classloader = loader;
           super.enableLogging( logger );
           m_typeBuilder.enableLogging( logger.getChildLogger("component") );
  +        m_blockBuilder.enableLogging( logger.getChildLogger("block") );
           getLogger().debug("type registry established");
       }
   
  @@ -117,6 +121,30 @@
           }
           return type;
       }
  +
  +   /**
  +    * Register a potential supplier component block.  The implementation will
  +    * create a component type instance for the entry if not already known and 
  +    * return the existing or new instance to the invoking client.
  +    *
  +    * @param classname the component class name
  +    * @return the component type
  +    */
  +    public Type addBlock( String path ) throws Exception
  +    {
  +        final String classname = path.replace('/','.');
  +
  +        getLogger().info("block: " + classname );
  +        Type type = getType( classname );
  +        if( type == null )
  +        {
  +            type = m_blockBuilder.build( classname, m_classloader );
  +            verify( type );
  +            register( type );
  +        }
  +        return type;
  +    }
  +
   
       private void verify( Type type ) throws Exception
       {
  
  
  
  1.4       +5 -6      jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/resource/DefaultLifestyleManager.java
  
  Index: DefaultLifestyleManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/resource/DefaultLifestyleManager.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DefaultLifestyleManager.java	14 Aug 2002 10:46:29 -0000	1.3
  +++ DefaultLifestyleManager.java	15 Aug 2002 04:14:49 -0000	1.4
  @@ -115,11 +115,10 @@
               // per-thread lifestyle handler not implemented
               //
   
  -            final String error = 
  -              "PerThread lifestyle policy in profile: '" 
  -              + manager.getPath() + "/" + profile.getName()
  -              + "' unavailable.";
  -            throw new IllegalArgumentException( error );
  +            ThreadLocalLifestyleHandler handler = 
  +              new ThreadLocalLifestyleHandler( manager, deployment, helper, profile, context );
  +            handler.enableLogging( getLogger() );
  +            return handler;
           }
           else if( policy.equalsIgnoreCase( "pooled" ) ) 
           {
  @@ -131,7 +130,7 @@
                 "Pooled lifestyle policy in profile: '" 
                 + manager.getPath() + "/" + profile.getName()
                 + "' unavailable.";
  -            throw new IllegalArgumentException( error );
  +            throw new UnsupportedOperationException( error );
           }
           else
           {
  
  
  
  1.1                  jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/toolkit/GenericBlockContext.java
  
  Index: GenericBlockContext.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.toolkit;
  
  import java.io.File;
  import java.util.Map;
  import org.apache.avalon.framework.context.Context;
  import org.apache.avalon.framework.context.DefaultContext;
  import org.apache.avalon.framework.logger.Logger;
  import org.apache.avalon.phoenix.BlockContext;
  
  /**
   * Block context that can be used by external containers the need to deal 
   * with existing Phoenix block implementations that include direct references to 
   * the BlockContext interface.  External containers can use this class as an 
   * alternative implementation that is independent of the Phoenix framework.
   *
   * @author <a href="mailto:mcconnell@apache.org">Stephen McConnell</a>
   */
  public class GenericBlockContext extends DefaultContext
      implements BlockContext
  {
  
      public GenericBlockContext( Map map, Context context )
      {
          super( map, context );    
      }
  
      /**
       * Base directory.
       *
       * @return the base directory
       */
      public File getBaseDirectory()
      {
          try
          {
              return (File) super.get( APP_HOME_DIR );
          }
          catch( Throwable e )
          {
              throw new RuntimeException( e.toString() );
          }
      }
  
      /**
       * Retrieve name of block.
       *
       * @return the name of block
       */
      public String getName()
      {
          try
          {
              return (String) super.get( NAME );
          }
          catch( Throwable e )
          {
              throw new RuntimeException( e.toString() );
          }
      }
  
      /**
       * Retrieve logger coresponding to named category.
       *
       * @return the logger
       * @deprecated This allows block writers to "break-out" of their logging
       *             hierarchy which is considered bad form. Replace by
       *             Logger.getChildLogger(String) where original logger is aquired
       *             via AbstractLogEnabled.
       * @exception UnsupportedOperationException is always thrown
       */
      public Logger getLogger( String name )
      {
          throw new UnsupportedOperationException("getLogger");
      }
  }
  
  
  
  1.4       +4 -1      jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/ConfigurationBuilder.java
  
  Index: ConfigurationBuilder.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/ConfigurationBuilder.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ConfigurationBuilder.java	5 Aug 2002 12:39:38 -0000	1.3
  +++ ConfigurationBuilder.java	15 Aug 2002 04:14:49 -0000	1.4
  @@ -34,6 +34,9 @@
           new DTDInfo( "-//AVALON/Component Type DTD Version 1.0//EN",
                        "http://jakarta.apache.org/avalon/type_1_0.dtd",
                        "org/apache/excalibur/meta/type.dtd" ),
  +        new DTDInfo( "-//PHOENIX/Block Info DTD Version 1.0//EN",
  +                     "http://jakarta.apache.org/avalon/type_1_0.dtd",
  +                     "org/apache/excalibur/meta/blockinfo.dtd" ),
       };
   
       private static final DTDResolver c_resolver =
  
  
  
  1.1                  jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/blockinfo.dtd
  
  Index: blockinfo.dtd
  ===================================================================
  <!--
  
     This is the DTD defining the Phoenix BlockInfo 1.0
     descriptor (XML) file format/syntax.
  
     Author: Peter Donald <pe...@apache.org>
  
     A BlockInfo is an XML file used to describe Blocks and located side-by-side with
     the Block .class file. It describes the services the Block requires to operate,
     the services the Block is capable of offerring other Blocks and other support
     meta data.
  
     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.
  
    -->
  
  <!--
  The blockinfo is the document root, it defines:
  
  block	     the specifc details about this block
  services     the services offered by this block
  dependencies the services that this block require to operate
  -->
  <!ELEMENT blockinfo (block, services?, management-access-points?, dependencies?)>
  <!ATTLIST blockinfo id ID #IMPLIED
            xmlns CDATA #FIXED "http://jakarta.apache.org/phoenix/blockinfo_1_0.dtd" >
  
  <!--
  The block element describes the block, it defines:
  
  name	        the human readable name of block type. Must be a string
               containing alphanumeric characters, '.', '_' and starting
               with a letter.
  version	     the version of the block in (in the format #.#.#, #.# or # where
               # is a integer
  schema-type  string representing the type of schema information available
               to validate block configuration
  -->
  <!ELEMENT block          (name?,version)>
    <!ELEMENT name         (#PCDATA) >
    <!ELEMENT version      (#PCDATA) >
    <!ELEMENT schema-type  (#PCDATA) >
  
  <!--
  The service element describes a service that the block
  can provide to other blocks, or this block depends upon.
  It defines:
  
  name         the name of the service. This must be equal to the class name of the
               interface that defines the service.
  version	     the version of the block in (in the format #.#.#, #.# or # where
               # is a integer
  -->
  <!ELEMENT service   EMPTY >
    <!ATTLIST service
         name CDATA #REQUIRED
         version CDATA #IMPLIED
    >
  
  <!--
  The service dependency describes a service that the block
  requires. It defines:
  
  role         the role of the service. This is the value that is used to lookup the
               service in the ComponentManager. If not provided it defaults to the
               value specified in the name attribute of service element
  service	     the service that is required
  -->
  <!ELEMENT dependency  (role?,service) >
    <!ELEMENT role        (#PCDATA) >
  
  <!--
  The services element contains a list of services that this Block supports.
  It contains service elements.
  -->
  <!ELEMENT services    (service*)>
  
  <!--
  The services element contains a list of services that this
  Block exports to the Management system. It contains service
  elements.
  -->
  <!ELEMENT management-access-points    (service*)>
  
  <!--
  The dependencies element contains a list of services that this Block requires.
  It contains dependency elements.
  -->
  <!ELEMENT dependencies    (dependency*)>
  
  
  
  1.5       +1 -0      jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/info/builder/Resources.properties
  
  Index: Resources.properties
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/info/builder/Resources.properties,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Resources.properties	14 Aug 2002 02:59:02 -0000	1.4
  +++ Resources.properties	15 Aug 2002 04:14:49 -0000	1.5
  @@ -2,6 +2,7 @@
   builder.creating-info.notice=Creating a Type from class "{0}".
   builder.created-info.notice=Constructed Type from class {0} with {1} services, {2} dependencies, {3} context entries, {4} loggers, and {5} extended phases depedencies.
   builder.bad-toplevel-element.error=Error the component implemented by "{0}" has an invalid element at top level of component info descriptor. Expected: "type". Actual: "{1}"
  +builder.bad-toplevel-block-element.error=Error the component implemented by "{0}" has an invalid element at top level of component info descriptor. Expected: "blockinfo". Actual: "{1}"
   builder.missing-info.error=Unable to locate resource from which to load info for component implemented by class "{0}".
   builder.missing-xml-creator.error=Unable to create XMLTypeCreator, usually due to not having XML classes on Classpath. Thus unable to lookup XML descriptor for component type "{0}".
   
  
  
  
  1.10      +3 -3      jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/info/builder/XMLTypeCreator.java
  
  Index: XMLTypeCreator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/info/builder/XMLTypeCreator.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- XMLTypeCreator.java	14 Aug 2002 02:59:02 -0000	1.9
  +++ XMLTypeCreator.java	15 Aug 2002 04:14:50 -0000	1.10
  @@ -391,7 +391,7 @@
        * @return the created ServiceDescriptor
        * @throws ConfigurationException if an error occurs
        */
  -    private ServiceDescriptor buildService( final Configuration service )
  +    protected ServiceDescriptor buildService( final Configuration service )
           throws ConfigurationException
       {
           Configuration serviceRef = service.getChild( "service-ref", false );
  @@ -450,7 +450,7 @@
        * @param version the version string
        * @return the created Version object
        */
  -    private Version buildVersion( final String version )
  +    protected Version buildVersion( final String version )
       {
           return Version.getVersion( version );
       }
  
  
  
  1.1                  jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/info/builder/BlockBuilder.java
  
  Index: BlockBuilder.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.meta.info.builder;
  
  import java.io.InputStream;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.avalon.framework.logger.AbstractLogEnabled;
  import org.apache.avalon.framework.logger.Logger;
  import org.apache.excalibur.meta.info.Type;
  
  /**
   * A BlockBuilder provides backwards compatibility with Phoenix blocks.
   * @author <a href="mailto:mcconnell@apache.org">Stephen McConnell</a>
   * @version $Revision: 1.1 $ $Date: 2002/08/15 04:14:49 $
   */
  public final class BlockBuilder
      extends AbstractLogEnabled
  {
      private static final Resources REZ =
          ResourceManager.getPackageResources( BlockBuilder.class );
  
      private final TypeCreator m_xmlBlockCreator = new XMLBlockCreator();
      private final TypeCreator m_xmlTypeCreator = new XMLTypeCreator();
  
      /**
       * Setup logging for all subcomponents
       */
      public void enableLogging( final Logger logger )
      {
          super.enableLogging( logger );
          if( null != m_xmlBlockCreator )
          {
              setupLogger( m_xmlBlockCreator );
              setupLogger( m_xmlTypeCreator );
          }
      }
  
      /**
       * Create a {@link Type} object for specified Class.
       *
       * @param clazz The class of Component
       * @return the created Type
       * @throws ConfigurationException if an error occurs
       */
      public Type build( final Class clazz )
          throws Exception
      {
          return build( clazz.getName(), clazz.getClassLoader() );
      }
  
      /**
       * Create a {@link Type} object for specified
       * classname, in specified ClassLoader.
       *
       * @param classname The classname of block
       * @param classLoader the ClassLoader to load info from
       * @return the created Type
       * @throws ConfigurationException if an error occurs
       */
      public Type build( final String classname,
                                  final ClassLoader classLoader )
          throws Exception
      {
          //
          // get the input stream for the .xinfo resource
          //
  
          final String xtype =
              classname.replace( '.', '/' ) + ".xtype";
          InputStream input =
              classLoader.getResourceAsStream( xtype );
          if( null == input )
          {
              final String xinfo =
                 classname.replace( '.', '/' ) + ".xinfo";
              input =
                 classLoader.getResourceAsStream( xinfo );
              if( null == input )
              {
                  final String message =
                    REZ.getString( "builder.missing-info.error",
                                 classname );
                  throw new Exception( message );
              }
              else
              {
                  //
                  // build the type
                  //
  
                  return m_xmlBlockCreator.createType( classname, input );
  
              }
          }
          else
          {
              return m_xmlTypeCreator.createType( classname, input );
          }
      }
  }
  
  
  
  1.1                  jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/info/builder/XMLBlockCreator.java
  
  Index: XMLBlockCreator.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.meta.info.builder;
  
  import java.io.InputStream;
  import java.util.ArrayList;
  import java.util.Properties;
  import org.apache.excalibur.configuration.ConfigurationUtil;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.avalon.framework.Version;
  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.logger.AbstractLogEnabled;
  import org.apache.excalibur.meta.info.ComponentDescriptor;
  import org.apache.excalibur.meta.info.Type;
  import org.apache.excalibur.meta.info.ContextDescriptor;
  import org.apache.excalibur.meta.info.DependencyDescriptor;
  import org.apache.excalibur.meta.info.EntryDescriptor;
  import org.apache.excalibur.meta.info.LoggerDescriptor;
  import org.apache.excalibur.meta.info.ServiceDescriptor;
  import org.apache.excalibur.meta.info.ReferenceDescriptor;
  import org.apache.excalibur.meta.info.PhaseDescriptor;
  import org.apache.excalibur.meta.info.ExtensionDescriptor;
  import org.apache.excalibur.meta.ConfigurationBuilder;
  import org.xml.sax.InputSource;
  
  /**
   * Handles internalization of an XML based description of a {@link Type}
   * from a Configuration object. The format for Configuration object
   * is specified in the <a href="package-summary.html#external">package summary</a>.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @author <a href="mailto:mcconnell@apache.org">Stephen McConnell</a>
   * @version $Revision: 1.1 $ $Date: 2002/08/15 04:14:49 $
   */
  public class XMLBlockCreator
      extends XMLTypeCreator
      implements TypeCreator
  {
      private static final Resources REZ =
          ResourceManager.getPackageResources( XMLBlockCreator.class );
  
      /**
       * Create a {@link Type} object for specified
       * classname, loaded from specified {@link InputStream}.
       *
       * @param implementationKey The classname of Component
       * @param inputStream the InputStream to load Type from
       * @return the created Type
       * @throws Exception if an error occurs
       */
      public Type createType( String implementationKey,
                                                InputStream inputStream  )
          throws Exception
      {
          if( inputStream == null ) 
            throw new NullPointerException("input");
  
          final InputSource input = new InputSource( inputStream );
          final String classname = implementationKey;
          final Configuration xinfo = ConfigurationBuilder.build( input );
          return build( classname, xinfo );
      }
  
      /**
       * Create a {@link Type} object for specified classname from
       * specified configuration data.
       *
       * @param classname The classname of Component
       * @param info the Type configuration
       * @return the created Type
       * @throws ConfigurationException if an error occurs
       */
      private Type build( final String classname, final Configuration info )
          throws Exception
      {
          if( getLogger().isDebugEnabled() )
          {
              final String message =
                  REZ.getString( "builder.creating-info.notice",
                                 classname );
              getLogger().debug( message );
          }
  
          final String topLevelName = info.getName();
          if( !topLevelName.equals( "type" ) )
          {
              if( !topLevelName.equals( "blockinfo" ) )
              {
                  final String message =
                      REZ.getString( "builder.bad-toplevel-block-element.error",
                                 classname,
                                 topLevelName );
                  throw new ConfigurationException( message );
              }
          }
  
          Configuration configuration = null;
  
          configuration = info.getChild( "block" );
          final ComponentDescriptor descriptor =
              buildComponentDescriptor( classname, configuration );
  
          configuration = info.getChild( "loggers" );
          final LoggerDescriptor[] loggers = buildLoggers( configuration );
  
          configuration = info.getChild( "context" );
          final ContextDescriptor context = buildContext( configuration );
  
          configuration = info.getChild( "services" );
          final ServiceDescriptor[] services = buildBlockServices( configuration );
  
          configuration = info.getChild( "dependencies" );
          final DependencyDescriptor[] dependencies = buildDependencies( classname, configuration );
  
          configuration = info.getChild( "stages" );
          final PhaseDescriptor[] phases = buildPhases( configuration );
  
          configuration = info.getChild( "extensions" );
          final ExtensionDescriptor[] extensions = buildExtensions( configuration );
  
          if( getLogger().isInfoEnabled() )
          {
              final String message =
                  REZ.getString( "builder.created-facility.notice",
                                 classname,
                                 new Integer( services.length ),
                                 new Integer( dependencies.length ),
                                 new Integer( context.getEntrys().length ),
                                 new Integer( loggers.length ),
                                 new Integer( phases.length ),
                                 new Integer( extensions.length ) );
              getLogger().info( message );
          }
  
          return new Type( 
            descriptor, loggers, context, services, dependencies, phases, extensions );
      }
  
      /**
       * A utility method to build an array of {@link ServiceDescriptor}
       * objects from specified configuraiton.
       *
       * @param servicesSet the services configuration
       * @return the created ServiceDescriptor
       * @throws ConfigurationException if an error occurs
       */
      protected ServiceDescriptor[] buildBlockServices( final Configuration servicesSet )
          throws ConfigurationException
      {
          final Configuration[] elements = servicesSet.getChildren( "service" );
          final ArrayList services = new ArrayList();
  
          for( int i = 0; i < elements.length; i++ )
          {
              final ServiceDescriptor service = buildBlockService( elements[ i ] );
              services.add( service );
          }
  
          return (ServiceDescriptor[])services.toArray( new ServiceDescriptor[ 0 ] );
      }
  
  
      /**
       * A utility method to build a <code>ServiceDescriptor</code>
       * object from specified configuraiton data.
       *
       * @param service the service Configuration
       * @return the created ServiceDescriptor
       * @throws ConfigurationException if an error occurs
       */
      protected ServiceDescriptor buildBlockService( final Configuration service )
          throws ConfigurationException
      {
          final ReferenceDescriptor designator = buildReferenceDescriptor( service );
          final Properties attributes =
              buildAttributes( service.getChild( "attributes" ) );
          return new ServiceDescriptor( designator, attributes );
      }
  
      /**
       * A utility method to build a {@link ReferenceDescriptor}
       * object from specified configuraiton data.
       *
       * @param service the service Configuration
       * @return the created ReferenceDescriptor
       * @throws ConfigurationException if an error occurs
       */
      protected ReferenceDescriptor buildReferenceDescriptor( final Configuration service )
          throws ConfigurationException
      {
          final String type = service.getAttribute( "name" );
          final String versionString = service.getAttribute( "version", "1.0" );
          final Version version = buildVersion( versionString );
          return new ReferenceDescriptor( type, version );
      }
  
      /**
       * A utility method to build a {@link DependencyDescriptor}
       * object from specified configuraiton.
       *
       * @param classname The classname of Component (used for logging purposes)
       * @param dependency the dependency configuration
       * @return the created DependencyDescriptor
       * @throws ConfigurationException if an error occurs
       */
      protected DependencyDescriptor buildDependency( final String classname,
                                                    final Configuration dependency )
          throws ConfigurationException
      {
  
          Configuration serviceRef = dependency.getChild( "service" );
          final ReferenceDescriptor service =
              buildReferenceDescriptor( serviceRef );
          final boolean optional =
              dependency.getAttributeAsBoolean( "optional", false );
          final Properties attributes =
              buildAttributes( dependency.getChild( "attributes" ) );
          String role = dependency.getChild( "role" ).getValue( null );
  
          //default to name of service if role unspecified
          if( null == role )
          {
              role = service.getClassname();
          }
          else
          {
              //If role is specified and it is the same as
              //service name then warn that it is redundent.
              if( role.equals( service.getClassname() ) )
              {
                  final String message =
                      REZ.getString( "builder.redundent-role.notice",
                                     classname,
                                     role );
                  getLogger().warn( message );
              }
          }
  
          return new DependencyDescriptor( role, service, optional, attributes );
      }
  
  }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>