avalon-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mcconn...@apache.org
Subject cvs commit: avalon-sandbox/merlin/merlin-core/src/java/org/apache/avalon/merlin/kernel/impl DefaultKernel.java
Date Sun, 15 Jun 2003 18:25:54 GMT
mcconnell    2003/06/15 11:25:54

  Modified:    merlin/merlin-core/src/java/org/apache/avalon/merlin/block/impl
                        StandardBlockLoader.java Target.java Targets.java
                        XMLContainerCreator.java
               merlin/merlin-core/src/java/org/apache/avalon/merlin/kernel/impl
                        DefaultKernel.java
  Log:
  Upgrading of the management of the Target meta-data to provide support for overriding logging
directives.
  
  Revision  Changes    Path
  1.13      +5 -3      avalon-sandbox/merlin/merlin-core/src/java/org/apache/avalon/merlin/block/impl/StandardBlockLoader.java
  
  Index: StandardBlockLoader.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/merlin/merlin-core/src/java/org/apache/avalon/merlin/block/impl/StandardBlockLoader.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- StandardBlockLoader.java	14 Jun 2003 11:13:09 -0000	1.12
  +++ StandardBlockLoader.java	15 Jun 2003 18:25:54 -0000	1.13
  @@ -253,7 +253,9 @@
       //==============================================================
   
      /**
  -    * Load a block declared in the supplied block and configuration URL.
  +    * Load a root block under the name "/" using the supplied block
  +    * configuration and optional configuration target override URL.
  +    *
       * The path URL may refer to a XML file containing a block directive
       * or a jar file containing a block.xml file.
       *
  @@ -262,7 +264,7 @@
       * @return the block
       */
       public Block install( final URL path, final URL overrides )
  -      throws BlockException
  +      throws Exception
       {
           //
           // establish a URL referencing the base directory
  
  
  
  1.3       +49 -7     avalon-sandbox/merlin/merlin-core/src/java/org/apache/avalon/merlin/block/impl/Target.java
  
  Index: Target.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/merlin/merlin-core/src/java/org/apache/avalon/merlin/block/impl/Target.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Target.java	12 Jun 2003 18:56:19 -0000	1.2
  +++ Target.java	15 Jun 2003 18:25:54 -0000	1.3
  @@ -56,6 +56,7 @@
   package org.apache.avalon.merlin.block.impl;
   
   import org.apache.avalon.framework.configuration.Configuration;
  +import org.apache.avalon.meta.model.LoggingDirective;
   
   /**
    * <p>A target is a tagged configuration fragment.  The tag is a path
  @@ -81,11 +82,27 @@
        */
       private final Configuration m_config;
   
  +    /**
  +     * The configuration.
  +     */
  +    private final LoggingDirective m_logging;
  +
       //========================================================================
       // constructors
       //========================================================================
   
       /**
  +     * Create a new null Target instance.
  +     *
  +     * @param path target path
  +     * @param configuration the configuration 
  +     */
  +    public Target( final String path )
  +    {
  +        this( path, null );
  +    }
  +
  +    /**
        * Create a new Target instance.
        *
        * @param path target path
  @@ -93,15 +110,27 @@
        */
       public Target( final String path, final Configuration configuration )
       {
  +        this( path, configuration, null );
  +    }
  +
  +    /**
  +     * Create a new Target instance.
  +     *
  +     * @param path target path
  +     * @param configuration the configuration 
  +     */
  +    public Target( final String path, final Configuration configuration, LoggingDirective
logging )
  +    {
           if( !path.startsWith("/") )
           {
  -            final String error = 
  -              "Supplied target path '" + path 
  -              + "' does not commence with the path delimiter '/'.";
  -            throw new IllegalArgumentException( error );
  +            m_path = "/" + path;
  +        }
  +        else
  +        {
  +            m_path = path;
           }
  -        m_path = path;
           m_config = configuration;
  +        m_logging = logging;
       }
   
       //========================================================================
  @@ -130,12 +159,25 @@
       }
   
       /**
  +     * Return the logging categories directive.
  +     *
  +     * @return the logging categories (possibly null)
  +     */
  +    public LoggingDirective getLoggingDirective()
  +    {
  +        return m_logging;
  +    }
  +
  +    /**
        * Return a string representation of the target.
        * @return a string representing the target instance
        */
       public String toString()
       {
  -        return "[target: " + getPath() + ", " + (getConfiguration() != null ) + " ]";
  +        return "[target: " + getPath() + ", " 
  +          + (getConfiguration() != null ) + ", " 
  +          + (getLoggingDirective() != null ) 
  +          + " ]";
       }
   
   }
  
  
  
  1.3       +12 -15    avalon-sandbox/merlin/merlin-core/src/java/org/apache/avalon/merlin/block/impl/Targets.java
  
  Index: Targets.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/merlin/merlin-core/src/java/org/apache/avalon/merlin/block/impl/Targets.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Targets.java	12 Jun 2003 18:56:19 -0000	1.2
  +++ Targets.java	15 Jun 2003 18:25:54 -0000	1.3
  @@ -128,14 +128,6 @@
       public Target getTarget( String path )
       {
           final String key = getKey( path );
  -        if( m_parent != null )
  -        {
  -            Target t = m_parent.getTarget( key );
  -            if( t.getConfiguration() != null )
  -            {
  -                return t;
  -            }
  -        }
   
           for( int i=0; i<m_targets.length; i++ )
           {
  @@ -146,7 +138,12 @@
               }
           }
   
  -        return new Target( key, null );
  +        if( m_parent != null )
  +        {
  +            return m_parent.getTarget( key );
  +        }
  +
  +        return new Target( key );
       }
   
       /**
  @@ -167,11 +164,11 @@
                   String name = target.getPath().substring( key.length() );
                   if( name.length() > 0 )
                   {
  -                    if( target.getConfiguration() != null )
  -                    {
  -                        Target t = new Target( getKey( name ), target.getConfiguration()
);
  -                        list.add( t );
  -                    }
  +                    list.add( 
  +                       new Target( 
  +                          getKey( name ), 
  +                          target.getConfiguration(),
  +                          target.getLoggingDirective() ) );
                   }
               }
           }
  
  
  
  1.4       +263 -54   avalon-sandbox/merlin/merlin-core/src/java/org/apache/avalon/merlin/block/impl/XMLContainerCreator.java
  
  Index: XMLContainerCreator.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/merlin/merlin-core/src/java/org/apache/avalon/merlin/block/impl/XMLContainerCreator.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XMLContainerCreator.java	14 Jun 2003 11:13:54 -0000	1.3
  +++ XMLContainerCreator.java	15 Jun 2003 18:25:54 -0000	1.4
  @@ -287,64 +287,243 @@
       */
       private ContainmentProfile expandContainmentInclude( 
         URL base, EngineClassLoader parent, Configuration config, Targets targets ) 
  -      throws Exception 
  +      throws ContainerException 
       {
  +        //
  +        // get the source of the block description and convert in into a 
  +        // configuration instance
  +        //
  +
  +        URL source = getIncludeBlockSource( base, config );
  +        Configuration block = null;
           try
           {
  -            URL source = null;
  -            Configuration block = null;
  -            final String blockPath = config.getAttribute( "path", null );
  -            if( blockPath != null )
  -            {
  -                source = new URL( base, base.getPath() + blockPath );
  -                block = getSourceConfiguration( source );
  -            }
  -            else if( config.getAttribute( "id", null ) != null )
  -            {
  -                String id = config.getAttribute( "id" );
  -                String version = config.getAttribute( "version", "1.0" );
  -                source = m_repository.getArtifact( id, version, "jar" );
  -                block = getSourceConfiguration( source );
  -            }
  -            else
  -            {
  -                final String error = 
  -                  "Include directive does not declare a 'path' or 'id' attribute.\n"
  -                  + ConfigurationUtil.list( config );
  -                throw new IllegalArgumentException( error );
  -            }
  +            block = getSourceConfiguration( source );
  +        }
  +        catch( Throwable e )
  +        {
  +            final String error = 
  +              "Unable to read the block directive relative to the source:"
  +                + source;
  +            throw new ContainerException( error, e );
  +        }
   
  +        //
  +        // get the name to assign to the block from the include using 
  +        // the block name as the default value
  +        //
  +
  +        final String name = config.getAttribute( 
  +          "name", block.getChild("info").getChild("name").getValue("block") );
  +
  +        //
  +        // handle the loading of the override targets
  +        //
  +
  +        Targets newTargets = null;
  +        try
  +        {
               //
  -            // get the name to assign to the block from the include using 
  -            // the block name as the default value
  +            // if there is a nested targets element and it refers to 
  +            // an external targets file then pull ito in and 
  +            // expand out set of know target overrides
               //
   
  -            final String name = config.getAttribute( 
  -              "name", block.getChild("info").getChild("name").getValue("block") );
  -
               Targets candidates = targets.getTargets( name );
  -
  -            final String configPath = config.getAttribute( "config", null );
  -            Targets newTargets = null;
  +            final String configPath = getTargetPath( config );
               if( configPath != null )
               {
  -                URL conf = new URL( base, base.getPath() + configPath );
  +                URL url = new URL( base, base.getPath() + configPath );
                   newTargets = createTargets( 
  -                  candidates, createConfiguration( conf.toString() ) );
  +                  candidates, createConfiguration( url.toString() ) );
               }
               else
               {
  -                newTargets = candidates;
  +                //
  +                // check for embedded target declarations, otherwise
  +                // the new target reverts to the current set of 
  +                // targets
  +                //
  +
  +                if( config.getChild( "targets", false ) != null )
  +                {
  +                    newTargets = createTargets( 
  +                      candidates, config.getChild( "targets" )  );
  +                }
  +                else
  +                {
  +                    newTargets = candidates;
  +                }
               }
  +        }
  +        catch( Throwable e )
  +        {
  +            final String error = 
  +              "Unable to resolve configuration targets from include directive:"
  +                + ConfigurationUtil.list( config );
  +            throw new ContainerException( error, e );
  +        }
   
  +        try
  +        {
               return createBlockProfile( name, base, source, parent, block, newTargets );
           }
  -        catch( Throwable ce )
  +        catch( Throwable e )
           {
  -            final String error =
  -              "Could not create block descriptor for include directive.\n"
  -              + ConfigurationUtil.list( config );
  -            throw new ContainerException( error, ce );
  +            final String error = 
  +              "Unable to establish containment profile relative to the include directive:"
  +                + ConfigurationUtil.list( config );
  +            throw new ContainerException( error, e );
  +        }
  +    }
  +
  +   /**
  +    * Get the path attribute value from the supplied include directive.
  +    * @param include the include directive
  +    * @return the path value (possibly null)
  +    */
  +    private String getTargetPath( Configuration include ) throws ConfigurationException
  +    {
  +        if( include.getAttribute( "config", null ) != null )
  +        {
  +            return include.getAttribute( "config" );
  +        }
  +        else if( include.getChild( "targets", false ) != null )
  +        {
  +            if( include.getChild( "targets" ).getAttribute( "path", null ) != null )
  +            {
  +                return include.getChild( "targets" ).getAttribute( "path" );
  +            }
  +            else
  +            {
  +                return null;
  +            }
  +        }
  +        else
  +        {
  +            return null;
  +        }
  +    }
  +
  +   /**
  +    * The the URL of an included block defintion relative to the supplied 
  +    * base url and include directive.
  +    * @param base the base url
  +    * @param config the include directive
  +    * @return the URL of the block source
  +    * @exception ContainerException if the source URL is not resolvable
  +    */
  +    private URL getIncludeBlockSource( URL base, Configuration config ) throws ContainerException
  +    {
  +        String path = getIncludePath( config );
  +        if( path != null )
  +        {
  +            try
  +            {
  +                return new URL( base, base.getPath() + path );
  +            }
  +            catch( Throwable e )
  +            {
  +                final String error = 
  +                  "Unable to resolve block descriptor from path: " + path
  +                  + " relative to the base url: " + base;
  +                throw new ContainerException( error, e );
  +            }
  +        }
  +        else
  +        {
  +            if( config.getAttribute( "id", null ) != null )
  +            {
  +                return getSourceFromResource( config );
  +            }
  +            else if( config.getChild( "resource", false ) != null )
  +            {
  +                return getSourceFromResource( config.getChild( "resource" ) );
  +            }
  +            else
  +            {
  +                final String error = 
  +                  "Supplied include directive does not contain a nested source or resource
element."
  +                  + ConfigurationUtil.list( config );
  +                throw new ContainerException( error );
  +            }
  +        }
  +    }
  +
  +   /**
  +    * The the URL of an included block defintion from the repository.
  +    * @param config the configuration fragment contaiing the artifact identifier
  +    * @return the URL of the block source
  +    * @exception ContainerException if the source URL is not resolvable
  +    */
  +    private URL getSourceFromResource( Configuration config ) 
  +      throws ContainerException
  +    {
  +         String id = getArtifactID( config );
  +         String version = config.getAttribute( "version", "1.0" );
  +         try
  +         {
  +             return m_repository.getArtifact( id, version, "jar" );
  +         }
  +         catch( Throwable e )
  +         {
  +             final String error = 
  +               "Unable to resolve the block directive relative to the supplied repository
id:"
  +                + id + " and version: " + version;
  +             throw new ContainerException( error, e );
  +         }
  +    }
  +
  +   /**
  +    * Return the artifact identitier from a configuration fragment.
  +    * @param config the configuration fragment containing the artifact identifier
  +    * @return the artifact identifier
  +    * @exception ContainerException if the fragment does not contain the id attribute
  +    */
  +    private String getArtifactID( Configuration config ) throws ContainerException
  +    {
  +         try
  +         {
  +             return config.getAttribute( "id" );
  +         }
  +         catch( Throwable e )
  +         {
  +             final String error = 
  +               "Missing artifict identifier (id) in include directive."
  +               + ConfigurationUtil.list( config );
  +             throw new ContainerException( error );
  +         }
  +    }
  +
  +   /**
  +    * Return the path from an include directive.
  +    * @param config the include directive
  +    * @return the include path
  +    * @exception ContainerException if the path is not resolvable
  +    */
  +    private String getIncludePath( Configuration config ) throws ContainerException
  +    {
  +        if( config.getAttribute( "path", null ) != null )
  +        {
  +            return config.getAttribute( "path", null );
  +        }
  +        else if( config.getChild( "source", false ) != null ) 
  +        {
  +            try
  +            {
  +                return config.getChild( "source" ).getAttribute("path");
  +            }
  +            catch( ConfigurationException e )
  +            {
  +                final String error = 
  +                  "Missing path value in source directive."
  +                  + ConfigurationUtil.list( config );
  +                throw new ContainerException( error );
  +            }
  +        }
  +        else
  +        {
  +            return null;
           }
       }
   
  @@ -552,7 +731,8 @@
               String classname = config.getAttribute( "class" );
               Type type = engine.getRepository().getTypeRepository().getType( classname );
               Profile profile = 
  -              BUILDER.createProfile( type, config, target.getConfiguration() );
  +              BUILDER.createProfile( 
  +                type, config, target.getConfiguration(), target.getLoggingDirective() );
               boolean policy = getActivationPolicy( config );
               profile.setActivationPolicy( policy );
               return profile;
  @@ -573,7 +753,7 @@
       *   elements
       * @return the targets instance
       */
  -    public Targets createTargets( Configuration config )
  +    public Targets createTargets( Configuration config ) throws Exception
       {
           return createTargets( null, config.getChildren( "target" ) );
       }
  @@ -585,7 +765,7 @@
       *   elements
       * @return the targets instance
       */
  -    public Targets createTargets( Targets targets, Configuration config )
  +    public Targets createTargets( Targets targets, Configuration config ) throws Exception
       {
           return createTargets( targets, config.getChildren( "target" ) );
       }
  @@ -596,24 +776,53 @@
       * @param targets a configuration array of &lt;target&gt instances;
       * @return the targets instance
       */
  -    public Targets createTargets( Targets targets, Configuration[] conf )
  +    public Targets createTargets( Targets targets, Configuration[] conf ) throws Exception
       {
           ArrayList list = new ArrayList();
           for( int i=0; i<conf.length; i++ )
           {
               Configuration target = conf[i];
  -            String key = target.getAttribute( "path", null );
  -            if( key == null )
  -            {
  -                final String error = 
  -                  "Target must contain a 'path' attribute."
  -                  + ConfigurationUtil.list( target );
  -                throw new ContainerRuntimeException( error );
  -            }
  -            Target t = new Target( key, target.getChild( "configuration" ) );
  -            list.add( t );
  +            list.add( createTarget( target ) );
           }
           return new Targets( targets, (Target[]) list.toArray( new Target[0] ) );
  +    }
  +
  +   /**
  +    * Create a single target.
  +    * @param target the target configuration fragment
  +    * @return the target
  +    */ 
  +    private Target createTarget( Configuration target ) throws Exception
  +    {
  +        //
  +        // get the key
  +        //
  +
  +        String key = target.getAttribute( "path", null );
  +        if( key == null )
  +        {
  +            final String error = 
  +              "Target must contain a 'path' attribute."
  +              + ConfigurationUtil.list( target );
  +            throw new ContainerException( error );
  +        }
  +
  +        //
  +        // get the configuration
  +        //
  +
  +        Configuration configuration = target.getChild( "configuration" );
  +        
  +        //
  +        // get the logging categories
  +        //
  +
  +        LoggingDirective categories = null;
  +        if( target.getChild( "categories", false ) != null )
  +        {
  +            categories = createLoggingDirective( key, target.getChild( "categories" ) );
  +        }
  +        return new Target( key, configuration, categories );
       }
   
      /**
  
  
  
  1.21      +2 -2      avalon-sandbox/merlin/merlin-core/src/java/org/apache/avalon/merlin/kernel/impl/DefaultKernel.java
  
  Index: DefaultKernel.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/merlin/merlin-core/src/java/org/apache/avalon/merlin/kernel/impl/DefaultKernel.java,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- DefaultKernel.java	14 Jun 2003 11:02:24 -0000	1.20
  +++ DefaultKernel.java	15 Jun 2003 18:25:54 -0000	1.21
  @@ -427,7 +427,7 @@
   
                   LoggingDirective categories =
                     CREATOR.createLoggingDirective(
  -                    Container.SEPERATOR, m_debug, categoriesConfig );
  +                    Container.SEPERATOR, m_debug, categoriesConfig, null );
   
                   m_logging.addCategories( Container.SEPERATOR, categories );
               }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: cvs-unsubscribe@avalon.apache.org
For additional commands, e-mail: cvs-help@avalon.apache.org


Mime
View raw message