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 2004/02/07 20:31:08 UTC

cvs commit: avalon/merlin/composition/impl/src/java/org/apache/avalon/composition/model/impl DefaultContainmentModelAssemblyHelper.java DefaultContainmentModelComponentHelper.java DefaultContainmentModelNavigationHelper.java DefaultContainmentModel.java Resources.properties ComponentModelContextHelper.java

mcconnell    2004/02/07 11:31:08

  Modified:    merlin/composition/impl/src/java/org/apache/avalon/composition/model/impl
                        DefaultContainmentModel.java Resources.properties
  Added:       merlin/composition/impl/src/java/org/apache/avalon/composition/model/impl
                        DefaultContainmentModelAssemblyHelper.java
                        DefaultContainmentModelComponentHelper.java
                        DefaultContainmentModelNavigationHelper.java
  Removed:     merlin/composition/impl/src/java/org/apache/avalon/composition/model/impl
                        ComponentModelContextHelper.java
  Log:
  Seperation of the navigation and assembly functions into helper classes.
  
  Revision  Changes    Path
  1.28      +61 -573   avalon/merlin/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultContainmentModel.java
  
  Index: DefaultContainmentModel.java
  ===================================================================
  RCS file: /home/cvs/avalon/merlin/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultContainmentModel.java,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- DefaultContainmentModel.java	7 Feb 2004 17:46:24 -0000	1.27
  +++ DefaultContainmentModel.java	7 Feb 2004 19:31:08 -0000	1.28
  @@ -29,9 +29,10 @@
   import java.util.ArrayList;
   import java.util.Map;
   
  +import org.apache.avalon.logging.data.CategoriesDirective;
  +
   import org.apache.avalon.composition.data.BlockCompositionDirective;
   import org.apache.avalon.composition.data.BlockIncludeDirective;
  -import org.apache.avalon.logging.data.CategoriesDirective;
   import org.apache.avalon.composition.data.ContainmentProfile;
   import org.apache.avalon.composition.data.ComponentProfile;
   import org.apache.avalon.composition.data.NamedComponentProfile;
  @@ -314,344 +315,21 @@
               }
   
               getLogger().debug( "assembly phase" );
  +            DefaultContainmentModelAssemblyHelper helper = 
  +              new DefaultContainmentModelAssemblyHelper( m_context, this );
  +
               DeploymentModel[] models = 
                 m_context.getModelRepository().getModels();
               for( int i=0; i<models.length; i++ )
               {
                   DeploymentModel model = models[i];
  -                assembleModel( model );
  +                helper.assembleModel( model );
               }
   
               m_assembly.setEnabled( true );
           }
       }
   
  -    private void assembleModel( DeploymentModel model ) throws AssemblyException
  -    {
  -         if( null == model )
  -         {
  -             throw new NullPointerException( "model" );
  -         }
  -
  -         if( model.isAssembled() ) 
  -         {
  -             return;
  -         }
  -         else
  -         {
  -             if( model instanceof ComponentModel )
  -             {
  -                 assembleComponent( (ComponentModel) model );
  -             }
  -             else
  -             {
  -                 model.assemble();
  -             }
  -        }
  -    }
  -
  -    private void assembleComponent( ComponentModel model ) throws AssemblyException
  -    {
  -        ModelRepository repository = m_context.getModelRepository();
  -
  -        //
  -        // locate and assemble the component context handler
  -        //
  -
  -        if( model.getContextModel() != null )
  -        {
  -            ContextModel context = model.getContextModel();
  -            Class clazz = context.getStrategyClass();
  -            if( !clazz.getName().equals( 
  -              ContextModel.DEFAULT_STRATEGY_CLASSNAME ) )
  -            {
  -                if( null == context.getProvider() )
  -                {
  -                    try
  -                    {
  -                        StageDescriptor stage = 
  -                          new StageDescriptor( clazz.getName() );
  -                        DeploymentModel provider = 
  -                          findExtensionProvider( repository, stage );
  -                        context.setProvider( provider );
  -                    }
  -                    catch( Throwable e )
  -                    {
  -                        final String error = 
  -                          "Unable to assemble component: " 
  -                          + model 
  -                         + " due to a component context phase handler establishment failure.";
  -                        throw new AssemblyException( error, e );
  -                    }
  -                }
  -            }
  -        }
  -
  -        //
  -        // locate and resolve the stage providers
  -        //
  -
  -        StageModel[] stages = model.getStageModels();
  -        for( int i=0; i<stages.length; i++ )
  -        {
  -            StageModel stage = stages[i];
  -            if( null == stage.getProvider() )
  -            {
  -                try
  -                {
  -                    DeploymentModel provider =
  -                      findExtensionProvider( repository, stage );
  -                    stage.setProvider( provider );
  -                }
  -                catch( Throwable e )
  -                {
  -                    final String error = 
  -                      "Unable to assemble component: " 
  -                      + model 
  -                      + " due to a component extension handler establishment failure.";
  -                    throw new AssemblyException( error, e );
  -                }
  -            }
  -        }
  -
  -        //
  -        // locate and resolve the service providers
  -        //
  -
  -        DependencyModel[] dependencies = model.getDependencyModels();
  -        for( int i=0; i<dependencies.length; i++ )
  -        {
  -            DependencyModel dependency = dependencies[i];
  -            if( null == dependency.getProvider() )
  -            {
  -                try
  -                {
  -                    DeploymentModel provider =
  -                      findDependencyProvider( repository, dependency );
  -                    dependency.setProvider( provider );
  -                }
  -                catch( Throwable e )
  -                {
  -                    final String error = 
  -                      "Unable to assemble component: " + model 
  -                      + " due to a service provider establishment failure.";
  -                    throw new AssemblyException( error, e );
  -                }
  -            }
  -        }
  -    }
  -
  -    private DeploymentModel findDependencyProvider( 
  -      ModelRepository repository, DependencyModel dependency )
  -      throws AssemblyException
  -    {
  -        String path = dependency.getPath();
  -        if( null != path )
  -        {
  -            DeploymentModel model = getModel( path );
  -            if( null == model )
  -            {
  -                final String error = 
  -                  "Could not locate a model at the address: [" 
  -                  + path + "] in " + this + ".";
  -                throw new AssemblyException( error );
  -            }
  -            assembleModel( model );
  -            return model;
  -        }
  -        else
  -        {
  -            return findDependencyProvider( 
  -              repository, dependency.getDependency() );
  -        }
  -    }
  -
  -    private DeploymentModel findDependencyProvider( 
  -      ModelRepository repository, DependencyDescriptor dependency )
  -      throws AssemblyException
  -    {
  -        DeploymentModel[] candidates = 
  -          repository.getCandidateProviders( dependency );
  -        ModelSelector selector = new DefaultModelSelector();
  -        DeploymentModel model = selector.select( candidates, dependency );
  -        if( model != null )
  -        {
  -            assembleModel( model );
  -            return model;
  -        }
  -
  -        //
  -        // otherwise, check for any packaged profiles that 
  -        // we could use to construct the model
  -        //
  -
  -        DeploymentProfile[] profiles = findDependencyProfiles( dependency );
  -        ProfileSelector profileSelector = new DefaultProfileSelector();
  -        DeploymentProfile profile = profileSelector.select( profiles, dependency );
  -        if( profile != null ) 
  -        {
  -            try
  -            {
  -                DeploymentModel solution = addModel( profile );
  -                assembleModel( solution );
  -                return solution;
  -            }
  -            catch( AssemblyException ae )
  -            {
  -                final String error = 
  -                  "Nested assembly failure while attempting to construct model"
  -                  + " for the profile: [" + profile + "] for the dependency: ["
  -                  + dependency + "].";
  -                throw new AssemblyException( error, ae );
  -            }
  -            catch( ModelException me )
  -            {
  -                final String error = 
  -                  "Nested model failure while attempting to add model"
  -                  + " for the profile: [" + profile + "] for the dependency: ["
  -                  + dependency + "].";
  -                throw new AssemblyException( error, me );
  -            }
  -        }
  -        else
  -        {
  -            final String error = 
  -              "Unable to locate a service provider for the dependency: [ "
  -              + dependency + "].";
  -            throw new AssemblyException( error );
  -        }
  -    }
  -
  -    private DeploymentModel findExtensionProvider( 
  -      ModelRepository repository, StageModel stage )
  -      throws AssemblyException
  -    {
  -        String path = stage.getPath();
  -        if( null != path )
  -        {
  -            DeploymentModel model = getModel( path );
  -            if( null == model )
  -            {
  -                final String error = 
  -                  "Could not locate a model at the address: [" 
  -                  + path + "] in " + this + ".";
  -                throw new AssemblyException( error );
  -            }
  -            assembleModel( model );
  -            return model;
  -        }
  -        else
  -        {
  -            return findExtensionProvider( repository, stage.getStage() );
  -        }
  -    }
  -
  -    private DeploymentModel findExtensionProvider( 
  -      ModelRepository repository, StageDescriptor stage )
  -      throws AssemblyException
  -    {
  -        DeploymentModel[] candidates = 
  -          repository.getCandidateProviders( stage );
  -        ModelSelector selector = new DefaultModelSelector();
  -        DeploymentModel model = selector.select( candidates, stage );
  -        if( model != null )
  -        {
  -            assembleModel( model );
  -            return model;
  -        }
  -
  -        //
  -        // otherwise, check for any packaged profiles that 
  -        // we could use to construct the model
  -        //
  -
  -        DeploymentProfile[] profiles = findExtensionProfiles( stage );
  -        ProfileSelector profileSelector = new DefaultProfileSelector();
  -        DeploymentProfile profile = profileSelector.select( profiles, stage );
  -        if( profile != null ) 
  -        {
  -            try
  -            {
  -                DeploymentModel solution = addModel( profile );
  -                assembleModel( solution );
  -                return solution;
  -            }
  -            catch( AssemblyException ae )
  -            {
  -                final String error = 
  -                  "Nested assembly failure while attempting to construct model"
  -                  + " for the extension profile: [" + profile 
  -                  + "] for the stage dependency: ["
  -                  + stage + "].";
  -                throw new AssemblyException( error, ae );
  -            }
  -            catch( ModelException me )
  -            {
  -                final String error = 
  -                  "Nested model failure while attempting to add model"
  -                  + " for the extension profile: [" + profile 
  -                  + "] for the stage dependency: ["
  -                  + stage + "].";
  -                throw new AssemblyException( error, me );
  -            }
  -        }
  -        else
  -        {
  -            final String error = 
  -              "Unable to locate a extension provider for the stage: [ "
  -              + stage + "].";
  -            throw new AssemblyException( error );
  -        }
  -    }
  -
  -    private DeploymentProfile[] findExtensionProfiles( StageDescriptor stage )
  -    {
  -        TypeRepository repository = getClassLoaderModel().getTypeRepository();
  -        Type[] types = repository.getTypes( stage );
  -        try
  -        {
  -            return getProfiles( repository, types );
  -        }
  -        catch( TypeUnknownException tue )
  -        {
  -            // will not happen
  -            final String error = "An irrational condition has occured.";
  -            throw new ModelRuntimeException( error, tue );
  -        }
  -    }
  -
  -    private DeploymentProfile[] findDependencyProfiles( DependencyDescriptor dependency )
  -    {
  -        TypeRepository repository = getClassLoaderModel().getTypeRepository();
  -        Type[] types = repository.getTypes( dependency );
  -        try
  -        {
  -            return getProfiles( repository, types );
  -        }
  -        catch( TypeUnknownException tue )
  -        {
  -            // will not happen
  -            final String error = "An irrational condition has occured.";
  -            throw new ModelRuntimeException( error, tue );
  -        }
  -    }
  -
  -    private DeploymentProfile[] getProfiles( TypeRepository repository, Type[] types )
  -      throws TypeUnknownException
  -    {
  -        ArrayList list = new ArrayList();
  -        for( int i=0; i<types.length; i++ )
  -        {
  -            DeploymentProfile[] profiles = 
  -            repository.getProfiles( types[i] );
  -            for( int j=0; j<profiles.length; j++ )
  -            {
  -                list.add( profiles[j] );
  -            }
  -        }
  -        return (DeploymentProfile[]) list.toArray( new DeploymentProfile[0] );
  -    }
  -
       /**
        * Disassemble the model.
        */
  @@ -970,8 +648,8 @@
       private ComponentModel createComponentModel( final ComponentProfile profile ) 
         throws ModelException
       {
  -        ComponentModelContextHelper helper = 
  -          new ComponentModelContextHelper( m_context, this );
  +        DefaultContainmentModelComponentHelper helper = 
  +          new DefaultContainmentModelComponentHelper( m_context, this );
           ComponentContext context = 
             helper.createComponentContext( profile );
           ModelFactory factory = 
  @@ -1059,13 +737,9 @@
                   classLoaderModel, modelRepository, graph, 
                   home, temp, this, profile, partition, name );
   
  -            //
  -            // TODO: lookup the profile for a factory declaration, then 
  -            // use the factory to create the model using the context as 
  -            // the argument.
  -            //
  -
  -            return new DefaultContainmentModel( context );
  +            ModelFactory factory = 
  +              m_context.getSystemContext().getModelFactory();
  +            return factory.createContainmentModel( context );
           }
           catch( ModelException e )
           {
  @@ -1118,48 +792,7 @@
           }
   
           TargetDirective[] targets = directive.getTargetDirectives();
  -        for( int i=0; i<targets.length; i++ )
  -        {
  -            TargetDirective target = targets[i];
  -            DeploymentModel child = model.getModel( target.getPath() );
  -            if( child != null )
  -            {
  -                if( target.getConfiguration() != null )
  -                {
  -                    if( child instanceof ComponentModel )
  -                    {
  -                        ((ComponentModel)child).setConfiguration( 
  -                          target.getConfiguration() );
  -                    }
  -                    else if( child instanceof ContainmentModel )
  -                    {
  -                        final String warn = 
  -                          "Ignoring target configuration as the path [" 
  -                          + target.getPath() 
  -                          + "] does not refer to a deployment model";
  -                    }
  -                }
  -                if( target.getCategoriesDirective() != null )
  -                {
  -                    if( child instanceof ComponentModel )
  -                    {
  -                        ((ComponentModel)child).setCategories( 
  -                           target.getCategoriesDirective() );
  -                    }
  -                    else if( child instanceof ContainmentModel )
  -                    {
  -                        ((ContainmentModel)child).setCategories( 
  -                          target.getCategoriesDirective() );
  -                    }
  -                }
  -            }
  -            else
  -            {
  -                final String warning = 
  -                  "Unrecognized target path: " + target.getPath();
  -                getLogger().warn( warning );
  -            }
  -        }
  +        model.applyTargets( targets );
           return model;
       }
   
  @@ -1413,156 +1046,72 @@
       */
       public DeploymentModel getModel( String path )
       {
  -        ContainmentModel parent = 
  -          m_context.getParentContainmentModel();
  +        DefaultContainmentModelNavigationHelper helper = 
  +          new DefaultContainmentModelNavigationHelper( m_context, this );
  +        return helper.getModel( path );
  +    }
   
  -        if( path.equals( "" ) )
  +   /**
  +    * Apply a set of override targets resolvable from a supplied url.
  +    * @param config a url resolvable to a TargetDirective[]
  +    * @exception ModelException if an error occurs
  +    */
  +    public void applyTargets( URL config )
  +      throws ModelException
  +    {
  +        if( config != null )
           {
  -            return this;
  +            TargetDirective[] targets = getTargets( config );
  +            applyTargets( targets );
           }
  -        else if( path.startsWith( "/" ) )
  -        {
  -            //
  -            // its a absolute reference that need to be handled by the 
  -            // root container
  -            //
  -
  -            if( null != parent )
  -            {
  -                return parent.getModel( path );
  -            }
  -            else
  -            {
  -                //
  -                // this is the root container thereforw the 
  -                // path can be transfored to a relative reference
  -                //
  +    }
   
  -                return getModel( path.substring( 1 ) );
  -            }
  -        }
  -        else
  +   /**
  +    * Apply a set of override targets.
  +    * @param targets a set of target directives
  +    */
  +    public void applyTargets( TargetDirective[]targets )
  +    {
  +        for( int i=0; i<targets.length; i++ )
           {
  -            //
  -            // its a relative reference in the form xxx/yyy/zzz
  -            // so if the path contains "/", then locate the token 
  -            // proceeding the "/" (i.e. xxx) and apply the remainder 
  -            // (i.e. yyy/zzz) as the path argument , otherwise, its 
  -            // a local reference that we can pull from the model 
  -            // repository
  -            //
  -
  -            final String root = getRootName( path );
  -
  -            if( root.equals( ".." ) )
  -            {
  -                //
  -                // its a relative reference in the form "../xxx/yyy" 
  -                // in which case we simply redirect "xxx/yyy" to the 
  -                // parent container
  -                //
  - 
  -                if( null != parent )
  -                {
  -                    final String remainder = getRemainder( root, path );
  -                    return parent.getModel( remainder );
  -                }
  -                else
  -                {
  -                    final String error = 
  -                      "Supplied path ["
  -                      + path 
  -                      + "] references a container above the root container.";
  -                    throw new IllegalArgumentException( error );
  -                }
  -            }
  -            else if( root.equals( "." ) )
  -            {
  -                //
  -                // its a path with a redundant "./xxx/yyy" which is 
  -                // equivalent to "xxx/yyy"
  -                //
  - 
  -                final String remainder = getRemainder( root, path );
  -                return getModel( remainder );
  -            }
  -            else if( path.indexOf( "/" ) < 0 )
  -            {
  -                // 
  -                // its a path in the form "xxx" so we can use this
  -                // to lookup and return a local child
  -                //
  -
  -                return m_context.getModelRepository().getModel( path );
  -            }
  -            else
  +            TargetDirective target = targets[i];
  +            final String path = target.getPath();
  +            Object model = getModel( path );
  +            if( model != null )
               {
  -                //
  -                // locate the relative root container, and apply 
  -                // getModel to the container
  -                //
  -
  -                DeploymentModel model = 
  -                  m_context.getModelRepository().getModel( root );
  -                if( model != null )
  +                if( model instanceof ComponentModel )
                   {
  -                    //
  -                    // we have the sub-container so we can apply 
  -                    // the relative path after subtracting the name of 
  -                    // this container and the path seperator character
  -                    //
  -
  -                    if( model instanceof ContainmentModel )
  +                    ComponentModel deployment = (ComponentModel) model;
  +                    if( target.getConfiguration() != null )
                       {
  -                        ContainmentModel container = 
  -                          (ContainmentModel) model;
  -                        final String remainder = getRemainder( root, path );
  -                        return container.getModel( remainder );
  +                        deployment.setConfiguration( 
  +                          target.getConfiguration() );
                       }
  -                    else
  +                    if( target.getCategoriesDirective() != null )
                       {
  -                        final String error = 
  -                          "The path element [" + root 
  -                          + "] does not reference a containment model within ["
  -                          + this + "].";
  -                        throw new IllegalArgumentException( error );
  +                        deployment.setCategories( 
  +                          target.getCategoriesDirective() );
                       }
                   }
  -                else
  +                else if( model instanceof ContainmentModel )
                   {
  -                    //
  -                    // path contains a token that does not map to 
  -                    // known container
  -                    //
  -                    
  -                    final String error = 
  -                      "Unable to locate a container with name [" 
  -                      + root + "] within the container [" 
  -                      + this + "].";
  -                    throw new IllegalArgumentException( error );
  +                    ContainmentModel containment = (ContainmentModel) model;
  +                    if( target.getCategoriesDirective() != null )
  +                    {
  +                        containment.setCategories( 
  +                          target.getCategoriesDirective() );
  +                    }
                   }
               }
  +            else
  +            {
  +                final String warning = 
  +                  REZ.getString( "target.ignore", path, toString() );
  +                getLogger().warn( warning );
  +            }
           }
       }
   
  -    private String getRootName( String path )
  -    {
  -        int n = path.indexOf( "/" );
  -        if( n < 0 ) 
  -        {
  -            return path;
  -        }
  -        else
  -        {
  -            return path.substring( 0, n ); 
  -        }
  -    }
  -
  -    private String getRemainder( String name, String path )
  -    {
  -        return path.substring( name.length() + 1 );
  -    }
  -
       //==============================================================
       // implementation
       //==============================================================
  @@ -1620,67 +1169,6 @@
           }
       }
   
  -   /**
  -    * Apply a set of override targets resolvable from a supplied url.
  -    * @param config a url resolvable to a TargetDirective[]
  -    * @exception ModelException if an error occurs
  -    */
  -    public void applyTargets( URL config )
  -      throws ModelException
  -    {
  -        if( config != null )
  -        {
  -            TargetDirective[] targets = getTargets( config );
  -            applyTargets( targets );
  -        }
  -    }
  -
  -   /**
  -    * Apply a set of override targets.
  -    * @param targets a set of target directives
  -    */
  -    public void applyTargets( TargetDirective[]targets )
  -    {
  -        for( int i=0; i<targets.length; i++ )
  -        {
  -            TargetDirective target = targets[i];
  -            final String path = target.getPath();
  -            Object model = getModel( path );
  -            if( model != null )
  -            {
  -                if( model instanceof ComponentModel )
  -                {
  -                    ComponentModel deployment = (ComponentModel) model;
  -                    if( target.getConfiguration() != null )
  -                    {
  -                        deployment.setConfiguration( 
  -                          target.getConfiguration() );
  -                    }
  -                    if( target.getCategoriesDirective() != null )
  -                    {
  -                        deployment.setCategories( 
  -                          target.getCategoriesDirective() );
  -                    }
  -                }
  -                else if( model instanceof ContainmentModel )
  -                {
  -                    ContainmentModel containment = (ContainmentModel) model;
  -                    if( target.getCategoriesDirective() != null )
  -                    {
  -                        containment.setCategories( 
  -                          target.getCategoriesDirective() );
  -                    }
  -                }
  -            }
  -            else
  -            {
  -                final String warning = 
  -                  "Ignoring target directive as the path does not refer to a known component: " 
  -                  + path;
  -                getLogger().warn( warning );
  -            }
  -        }
  -    }
   
       private TargetDirective[] getTargets( final URL url )
         throws ModelException
  
  
  
  1.5       +1 -0      avalon/merlin/composition/impl/src/java/org/apache/avalon/composition/model/impl/Resources.properties
  
  Index: Resources.properties
  ===================================================================
  RCS file: /home/cvs/avalon/merlin/composition/impl/src/java/org/apache/avalon/composition/model/impl/Resources.properties,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Resources.properties	13 Jan 2004 11:41:26 -0000	1.4
  +++ Resources.properties	7 Feb 2004 19:31:08 -0000	1.5
  @@ -25,6 +25,7 @@
   containment.add=installing: {0}
   containment.model.create.error=Unexpected error while attempting to build a model within the containment context [{0}] for a dependency [{1}].
   containment.model.create.deployment.error=Unexpected error while attempting to build a deployment profile from the template [{0}] within the containment context [{1}] for a component type [{2}].
  +target.ignore=Ignoring target directive as the path [{0}] does not refer to a known component within the containment model {1}.
   
   
   # DefaultDeploymentModel
  
  
  
  1.1                  avalon/merlin/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultContainmentModelAssemblyHelper.java
  
  Index: DefaultContainmentModelAssemblyHelper.java
  ===================================================================
  /* 
   * Copyright 2004 Apache Software Foundation
   * Licensed  under the  Apache License,  Version 2.0  (the "License");
   * you may not use  this file  except in  compliance with the License.
   * You may obtain a copy of the License at 
   * 
   *   http://www.apache.org/licenses/LICENSE-2.0
   * 
   * Unless required by applicable law or agreed to in writing, software
   * distributed  under the  License is distributed on an "AS IS" BASIS,
   * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or
   * implied.
   * 
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package org.apache.avalon.composition.model.impl;
  
  import java.util.ArrayList;
  
  import org.apache.avalon.composition.data.DeploymentProfile;
  import org.apache.avalon.composition.model.ContainmentModel;
  import org.apache.avalon.composition.model.ContainmentContext;
  import org.apache.avalon.composition.model.ComponentModel;
  import org.apache.avalon.composition.model.DeploymentModel;
  import org.apache.avalon.composition.model.AssemblyException;
  import org.apache.avalon.composition.model.ModelRepository;
  import org.apache.avalon.composition.model.ContextModel;
  import org.apache.avalon.composition.model.DependencyModel;
  import org.apache.avalon.composition.model.StageModel;
  import org.apache.avalon.composition.model.TypeUnknownException;
  import org.apache.avalon.composition.model.ModelRuntimeException;
  import org.apache.avalon.composition.model.ModelException;
  import org.apache.avalon.composition.model.TypeRepository;
  import org.apache.avalon.composition.model.ModelSelector;
  import org.apache.avalon.composition.model.ProfileSelector;
  
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  
  import org.apache.avalon.meta.info.Type;
  import org.apache.avalon.meta.info.DependencyDescriptor;
  import org.apache.avalon.meta.info.ServiceDescriptor;
  import org.apache.avalon.meta.info.StageDescriptor;
  
  /**
   * A utility class that assists in the location of a model relative
   * a supplied path.
   *
   * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
   * @version $Revision: 1.1 $ $Date: 2004/02/07 19:31:08 $
   */
  class DefaultContainmentModelAssemblyHelper
  {
      //-------------------------------------------------------------------
      // static
      //-------------------------------------------------------------------
  
      private static final Resources REZ =
        ResourceManager.getPackageResources( 
          DefaultContainmentModelAssemblyHelper.class );
  
      //-------------------------------------------------------------------
      // immutable state
      //-------------------------------------------------------------------
  
      private final ContainmentContext m_context;
      private final ContainmentModel m_model;
  
      //-------------------------------------------------------------------
      // constructor
      //-------------------------------------------------------------------
  
      public DefaultContainmentModelAssemblyHelper( 
        ContainmentContext context, ContainmentModel model )
      {
          m_context = context;
          m_model = model;
      }
  
      //-------------------------------------------------------------------
      // implementation
      //-------------------------------------------------------------------
  
      public void assembleModel( DeploymentModel model ) 
        throws AssemblyException
      {
           if( null == model )
           {
               throw new NullPointerException( "model" );
           }
  
           if( model.isAssembled() ) 
           {
               return;
           }
           else
           {
               if( model instanceof ComponentModel )
               {
                   assembleComponent( (ComponentModel) model );
               }
               else
               {
                   model.assemble();
               }
          }
      }
  
      private void assembleComponent( ComponentModel model ) throws AssemblyException
      {
          ModelRepository repository = m_context.getModelRepository();
  
          //
          // locate and assemble the component context handler
          //
  
          if( model.getContextModel() != null )
          {
              ContextModel context = model.getContextModel();
              Class clazz = context.getStrategyClass();
              if( !clazz.getName().equals( 
                ContextModel.DEFAULT_STRATEGY_CLASSNAME ) )
              {
                  if( null == context.getProvider() )
                  {
                      try
                      {
                          StageDescriptor stage = 
                            new StageDescriptor( clazz.getName() );
                          DeploymentModel provider = 
                            findExtensionProvider( repository, stage );
                          context.setProvider( provider );
                      }
                      catch( Throwable e )
                      {
                          final String error = 
                            "Unable to assemble component: " 
                            + model 
                           + " due to a component context phase handler establishment failure.";
                          throw new AssemblyException( error, e );
                      }
                  }
              }
          }
  
          //
          // locate and resolve the stage providers
          //
  
          StageModel[] stages = model.getStageModels();
          for( int i=0; i<stages.length; i++ )
          {
              StageModel stage = stages[i];
              if( null == stage.getProvider() )
              {
                  try
                  {
                      DeploymentModel provider =
                        findExtensionProvider( repository, stage );
                      stage.setProvider( provider );
                  }
                  catch( Throwable e )
                  {
                      final String error = 
                        "Unable to assemble component: " 
                        + model 
                        + " due to a component extension handler establishment failure.";
                      throw new AssemblyException( error, e );
                  }
              }
          }
  
          //
          // locate and resolve the service providers
          //
  
          DependencyModel[] dependencies = model.getDependencyModels();
          for( int i=0; i<dependencies.length; i++ )
          {
              DependencyModel dependency = dependencies[i];
              if( null == dependency.getProvider() )
              {
                  try
                  {
                      DeploymentModel provider =
                        findDependencyProvider( repository, dependency );
                      dependency.setProvider( provider );
                  }
                  catch( Throwable e )
                  {
                      final String error = 
                        "Unable to assemble component: " + model 
                        + " due to a service provider establishment failure.";
                      throw new AssemblyException( error, e );
                  }
              }
          }
      }
  
      private DeploymentModel findDependencyProvider( 
        ModelRepository repository, DependencyModel dependency )
        throws AssemblyException
      {
          String path = dependency.getPath();
          if( null != path )
          {
              DeploymentModel model = m_model.getModel( path );
              if( null == model )
              {
                  final String error = 
                    "Could not locate a model at the address: [" 
                    + path + "] in " + this + ".";
                  throw new AssemblyException( error );
              }
              assembleModel( model );
              return model;
          }
          else
          {
              return findDependencyProvider( 
                repository, dependency.getDependency() );
          }
      }
  
      private DeploymentModel findDependencyProvider( 
        ModelRepository repository, DependencyDescriptor dependency )
        throws AssemblyException
      {
          DeploymentModel[] candidates = 
            repository.getCandidateProviders( dependency );
          ModelSelector selector = new DefaultModelSelector();
          DeploymentModel model = selector.select( candidates, dependency );
          if( model != null )
          {
              assembleModel( model );
              return model;
          }
  
          //
          // otherwise, check for any packaged profiles that 
          // we could use to construct the model
          //
  
          DeploymentProfile[] profiles = findDependencyProfiles( dependency );
          ProfileSelector profileSelector = new DefaultProfileSelector();
          DeploymentProfile profile = profileSelector.select( profiles, dependency );
          if( profile != null ) 
          {
              try
              {
                  DeploymentModel solution = m_model.addModel( profile );
                  assembleModel( solution );
                  return solution;
              }
              catch( AssemblyException ae )
              {
                  final String error = 
                    "Nested assembly failure while attempting to construct model"
                    + " for the profile: [" + profile + "] for the dependency: ["
                    + dependency + "].";
                  throw new AssemblyException( error, ae );
              }
              catch( ModelException me )
              {
                  final String error = 
                    "Nested model failure while attempting to add model"
                    + " for the profile: [" + profile + "] for the dependency: ["
                    + dependency + "].";
                  throw new AssemblyException( error, me );
              }
          }
          else
          {
              final String error = 
                "Unable to locate a service provider for the dependency: [ "
                + dependency + "].";
              throw new AssemblyException( error );
          }
      }
  
      private DeploymentModel findExtensionProvider( 
        ModelRepository repository, StageModel stage )
        throws AssemblyException
      {
          String path = stage.getPath();
          if( null != path )
          {
              DeploymentModel model = m_model.getModel( path );
              if( null == model )
              {
                  final String error = 
                    "Could not locate a model at the address: [" 
                    + path + "] in " + this + ".";
                  throw new AssemblyException( error );
              }
              assembleModel( model );
              return model;
          }
          else
          {
              return findExtensionProvider( repository, stage.getStage() );
          }
      }
  
      private DeploymentModel findExtensionProvider( 
        ModelRepository repository, StageDescriptor stage )
        throws AssemblyException
      {
          DeploymentModel[] candidates = 
            repository.getCandidateProviders( stage );
          ModelSelector selector = new DefaultModelSelector();
          DeploymentModel model = selector.select( candidates, stage );
          if( model != null )
          {
              assembleModel( model );
              return model;
          }
  
          //
          // otherwise, check for any packaged profiles that 
          // we could use to construct the model
          //
  
          DeploymentProfile[] profiles = findExtensionProfiles( stage );
          ProfileSelector profileSelector = new DefaultProfileSelector();
          DeploymentProfile profile = profileSelector.select( profiles, stage );
          if( profile != null ) 
          {
              try
              {
                  DeploymentModel solution = m_model.addModel( profile );
                  assembleModel( solution );
                  return solution;
              }
              catch( AssemblyException ae )
              {
                  final String error = 
                    "Nested assembly failure while attempting to construct model"
                    + " for the extension profile: [" + profile 
                    + "] for the stage dependency: ["
                    + stage + "].";
                  throw new AssemblyException( error, ae );
              }
              catch( ModelException me )
              {
                  final String error = 
                    "Nested model failure while attempting to add model"
                    + " for the extension profile: [" + profile 
                    + "] for the stage dependency: ["
                    + stage + "].";
                  throw new AssemblyException( error, me );
              }
          }
          else
          {
              final String error = 
                "Unable to locate a extension provider for the stage: [ "
                + stage + "].";
              throw new AssemblyException( error );
          }
      }
  
      private DeploymentProfile[] findExtensionProfiles( StageDescriptor stage )
      {
          TypeRepository repository = m_context.getClassLoaderModel().getTypeRepository();
          Type[] types = repository.getTypes( stage );
          try
          {
              return getProfiles( repository, types );
          }
          catch( TypeUnknownException tue )
          {
              // will not happen
              final String error = "An irrational condition has occured.";
              throw new ModelRuntimeException( error, tue );
          }
      }
  
      private DeploymentProfile[] findDependencyProfiles( DependencyDescriptor dependency )
      {
          TypeRepository repository = m_context.getClassLoaderModel().getTypeRepository();
          Type[] types = repository.getTypes( dependency );
          try
          {
              return getProfiles( repository, types );
          }
          catch( TypeUnknownException tue )
          {
              // will not happen
              final String error = "An irrational condition has occured.";
              throw new ModelRuntimeException( error, tue );
          }
      }
  
      private DeploymentProfile[] getProfiles( TypeRepository repository, Type[] types )
        throws TypeUnknownException
      {
          ArrayList list = new ArrayList();
          for( int i=0; i<types.length; i++ )
          {
              DeploymentProfile[] profiles = 
              repository.getProfiles( types[i] );
              for( int j=0; j<profiles.length; j++ )
              {
                  list.add( profiles[j] );
              }
          }
          return (DeploymentProfile[]) list.toArray( new DeploymentProfile[0] );
      }
  
  }
  
  
  
  1.1                  avalon/merlin/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultContainmentModelComponentHelper.java
  
  Index: DefaultContainmentModelComponentHelper.java
  ===================================================================
  /* 
   * Copyright 2004 Apache Software Foundation
   * Licensed  under the  Apache License,  Version 2.0  (the "License");
   * you may not use  this file  except in  compliance with the License.
   * You may obtain a copy of the License at 
   * 
   *   http://www.apache.org/licenses/LICENSE-2.0
   * 
   * Unless required by applicable law or agreed to in writing, software
   * distributed  under the  License is distributed on an "AS IS" BASIS,
   * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or
   * implied.
   * 
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package org.apache.avalon.composition.model.impl;
  
  import java.io.File;
  import java.io.InputStream;
  import java.net.URL;
  import java.net.URLConnection;
  
  import org.apache.avalon.composition.data.ComponentProfile;
  import org.apache.avalon.composition.data.ContainmentProfile;
  import org.apache.avalon.composition.data.ClassLoaderDirective;
  import org.apache.avalon.composition.data.builder.ContainmentProfileBuilder;
  import org.apache.avalon.composition.data.builder.XMLContainmentProfileCreator;
  import org.apache.avalon.composition.model.ClassLoaderModel;
  import org.apache.avalon.composition.model.ClassLoaderContext;
  import org.apache.avalon.composition.model.ContainmentModel;
  import org.apache.avalon.composition.model.ContainmentContext;
  import org.apache.avalon.composition.model.ComponentContext;
  import org.apache.avalon.composition.model.ComponentModel;
  import org.apache.avalon.composition.model.ModelFactory;
  import org.apache.avalon.composition.model.ModelException;
  import org.apache.avalon.composition.model.SystemContext;
  import org.apache.avalon.composition.model.DependencyGraph;
  
  import org.apache.avalon.logging.provider.LoggingManager;
  import org.apache.avalon.logging.data.CategoriesDirective;
  
  import org.apache.avalon.repository.Repository;
  
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
  import org.apache.avalon.framework.logger.AbstractLogEnabled;
  import org.apache.avalon.framework.logger.Logger;
  
  import org.apache.avalon.meta.info.Type;
  
  /**
   * A utility class that handles creation of a component model context.
   *
   * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
   * @version $Revision: 1.1 $ $Date: 2004/02/07 19:31:08 $
   */
  class DefaultContainmentModelComponentHelper
  {
      //-------------------------------------------------------------------
      // static
      //-------------------------------------------------------------------
  
      private static final Resources REZ =
        ResourceManager.getPackageResources( 
          DefaultContainmentModelComponentHelper.class );
  
      //-------------------------------------------------------------------
      // immutable state
      //-------------------------------------------------------------------
  
      private final ContainmentContext m_context;
      private final ContainmentModel m_model;
  
      //-------------------------------------------------------------------
      // constructor
      //-------------------------------------------------------------------
  
     /**
      * Creation of a component context creation helper.
      * @param context the containment model context
      * @param model the containment model
      */
      public DefaultContainmentModelComponentHelper( 
         ContainmentContext context, ContainmentModel model )
      {
          if( context == null )
          {
              throw new NullPointerException( "context" );
          }
          if( model == null )
          {
              throw new NullPointerException( "model" );
          }
          m_context = context;
          m_model = model;
      }
  
      //-------------------------------------------------------------------
      // implementation
      //-------------------------------------------------------------------
  
     /**
      * Creation of a new component model relative to a supplied profile.
      *
      * @param profile the component profile
      * @return the component model context
      */
      public ComponentContext createComponentContext( final ComponentProfile profile )
        throws ModelException
      {
          if( null == profile )
          {
              throw new NullPointerException( "profile" );
          }
  
          SystemContext system = m_context.getSystemContext();
          final String name = profile.getName();
          final String partition = m_model.getPartition();
          LoggingManager logging = system.getLoggingManager();
          CategoriesDirective categories = profile.getCategories();
          if( null != categories )
          {
              logging.addCategories( partition, categories );
          }
  
          Logger logger = 
            logging.getLoggerForCategory( partition + name );
          DependencyGraph graph = m_context.getDependencyGraph();
          ClassLoader classloader = m_context.getClassLoader();
          final File home = new File( m_context.getHomeDirectory(), name );
          final File temp = new File( m_context.getTempDirectory(), name );
  
          try
          {
              Class base = classloader.loadClass( profile.getClassname() );
              Type type = 
                m_model.getClassLoaderModel().getTypeRepository().getType( base );
  
              return new DefaultComponentContext( 
                  logger, 
                  name, 
                  system, 
                  classloader, 
                  graph, 
                  m_model, 
                  profile, 
                  type, 
                  base, 
                  home, 
                  temp, 
                  partition );
  
          }
          catch( Throwable e )
          {
              final String error = 
                REZ.getString( 
                  "containment.deployment.create.error", 
                  m_model.getPath(), 
                  name );
              throw new ModelException( error, e );
          }
      }
  }
  
  
  
  1.1                  avalon/merlin/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultContainmentModelNavigationHelper.java
  
  Index: DefaultContainmentModelNavigationHelper.java
  ===================================================================
  /* 
   * Copyright 2004 Apache Software Foundation
   * Licensed  under the  Apache License,  Version 2.0  (the "License");
   * you may not use  this file  except in  compliance with the License.
   * You may obtain a copy of the License at 
   * 
   *   http://www.apache.org/licenses/LICENSE-2.0
   * 
   * Unless required by applicable law or agreed to in writing, software
   * distributed  under the  License is distributed on an "AS IS" BASIS,
   * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or
   * implied.
   * 
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package org.apache.avalon.composition.model.impl;
  
  import org.apache.avalon.composition.model.ContainmentModel;
  import org.apache.avalon.composition.model.ContainmentContext;
  import org.apache.avalon.composition.model.DeploymentModel;
  
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  
  /**
   * A utility class that assists in the location of a model relative
   * a supplied path.
   *
   * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
   * @version $Revision: 1.1 $ $Date: 2004/02/07 19:31:08 $
   */
  class DefaultContainmentModelNavigationHelper
  {
      //-------------------------------------------------------------------
      // static
      //-------------------------------------------------------------------
  
      private static final Resources REZ =
        ResourceManager.getPackageResources( 
          DefaultContainmentModelNavigationHelper.class );
  
      //-------------------------------------------------------------------
      // immutable state
      //-------------------------------------------------------------------
  
      private final ContainmentContext m_context;
      private final ContainmentModel m_model;
  
      //-------------------------------------------------------------------
      // constructor
      //-------------------------------------------------------------------
  
      public DefaultContainmentModelNavigationHelper( 
        ContainmentContext context, ContainmentModel model )
      {
          m_context = context;
          m_model = model;
      }
  
      //-------------------------------------------------------------------
      // implementation
      //-------------------------------------------------------------------
  
      public DeploymentModel getModel( String path )
      {
          ContainmentModel parent = 
            m_context.getParentContainmentModel();
  
          if( path.equals( "" ) )
          {
              return m_model;
          }
          else if( path.startsWith( "/" ) )
          {
              //
              // its a absolute reference that need to be handled by the 
              // root container
              //
  
              if( null != parent )
              {
                  return parent.getModel( path );
              }
              else
              {
                  //
                  // this is the root container thereforw the 
                  // path can be transfored to a relative reference
                  //
  
                  return m_model.getModel( path.substring( 1 ) );
              }
          }
          else
          {
              //
              // its a relative reference in the form xxx/yyy/zzz
              // so if the path contains "/", then locate the token 
              // proceeding the "/" (i.e. xxx) and apply the remainder 
              // (i.e. yyy/zzz) as the path argument , otherwise, its 
              // a local reference that we can pull from the model 
              // repository
              //
  
              final String root = getRootName( path );
  
              if( root.equals( ".." ) )
              {
                  //
                  // its a relative reference in the form "../xxx/yyy" 
                  // in which case we simply redirect "xxx/yyy" to the 
                  // parent container
                  //
   
                  if( null != parent )
                  {
                      final String remainder = getRemainder( root, path );
                      return parent.getModel( remainder );
                  }
                  else
                  {
                      final String error = 
                        "Supplied path ["
                        + path 
                        + "] references a container above the root container.";
                      throw new IllegalArgumentException( error );
                  }
              }
              else if( root.equals( "." ) )
              {
                  //
                  // its a path with a redundant "./xxx/yyy" which is 
                  // equivalent to "xxx/yyy"
                  //
   
                  final String remainder = getRemainder( root, path );
                  return m_model.getModel( remainder );
              }
              else if( path.indexOf( "/" ) < 0 )
              {
                  // 
                  // its a path in the form "xxx" so we can use this
                  // to lookup and return a local child
                  //
  
                  return m_context.getModelRepository().getModel( path );
              }
              else
              {
                  //
                  // locate the relative root container, and apply 
                  // getModel to the container
                  //
  
                  DeploymentModel model = 
                    m_context.getModelRepository().getModel( root );
                  if( model != null )
                  {
                      //
                      // we have the sub-container so we can apply 
                      // the relative path after subtracting the name of 
                      // this container and the path seperator character
                      //
  
                      if( model instanceof ContainmentModel )
                      {
                          ContainmentModel container = 
                            (ContainmentModel) model;
                          final String remainder = getRemainder( root, path );
                          return container.getModel( remainder );
                      }
                      else
                      {
                          final String error = 
                            "The path element [" + root 
                            + "] does not reference a containment model within ["
                            + m_model + "].";
                          throw new IllegalArgumentException( error );
                      }
                  }
                  else
                  {
                      //
                      // path contains a token that does not map to 
                      // known container
                      //
                      
                      final String error = 
                        "Unable to locate a container with name [" 
                        + root + "] within the container [" 
                        + m_model + "].";
                      throw new IllegalArgumentException( error );
                  }
              }
          }
      }
  
      private String getRootName( String path )
      {
          int n = path.indexOf( "/" );
          if( n < 0 ) 
          {
              return path;
          }
          else
          {
              return path.substring( 0, n ); 
          }
      }
  
      private String getRemainder( String name, String path )
      {
          return path.substring( name.length() + 1 );
      }
  
  }
  
  
  

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