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 2003/07/14 06:46:24 UTC

cvs commit: avalon-sandbox/merlin/composition/src/java/org/apache/avalon/composition/model/impl DefaultConstructorModel.java DefaultContainmentModel.java DefaultContextModel.java DefaultDeploymentContext.java DefaultDeploymentModel.java DefaultImportModel.java DefaultModelFactory.java DefaultSystemContext.java Resources.properties

mcconnell    2003/07/13 21:46:24

  Modified:    merlin/composition/src/java/org/apache/avalon/composition/model/impl
                        DefaultConstructorModel.java
                        DefaultContainmentModel.java
                        DefaultContextModel.java
                        DefaultDeploymentContext.java
                        DefaultDeploymentModel.java DefaultImportModel.java
                        DefaultModelFactory.java DefaultSystemContext.java
                        Resources.properties
  Log:
  Context management enhancements including support for alias management, and context building using constructed, included and standard context entries.
  
  Revision  Changes    Path
  1.2       +7 -8      avalon-sandbox/merlin/composition/src/java/org/apache/avalon/composition/model/impl/DefaultConstructorModel.java
  
  Index: DefaultConstructorModel.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/merlin/composition/src/java/org/apache/avalon/composition/model/impl/DefaultConstructorModel.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DefaultConstructorModel.java	11 Jul 2003 11:06:30 -0000	1.1
  +++ DefaultConstructorModel.java	14 Jul 2003 04:46:24 -0000	1.2
  @@ -71,7 +71,7 @@
    * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
    * @version $Revision$ $Date$
    */
  -public class DefaultConstructorModel extends DefaultContextEntryModel
  +public class DefaultConstructorModel extends DefaultEntryModel
   {
       //==============================================================
       // static
  @@ -110,12 +110,11 @@
       * @param context the containment context
       */
       public DefaultConstructorModel( 
  -      EntryDescriptor descriptor, ConstructorDirective directive, DeploymentContext context, Map map )
  +      EntryDescriptor descriptor, ConstructorDirective directive, 
  +      DeploymentContext context, Map map )
       {
  -        if( descriptor == null )
  -        {
  -            throw new NullPointerException( "descriptor" );
  -        }
  +        super( descriptor );
  +
           if( directive == null )
           {
               throw new NullPointerException( "directive" );
  @@ -131,7 +130,7 @@
       }
   
       //==============================================================
  -    // ContextEntryModel
  +    // EntryModel
       //==============================================================
   
      /**
  
  
  
  1.12      +22 -5     avalon-sandbox/merlin/composition/src/java/org/apache/avalon/composition/model/impl/DefaultContainmentModel.java
  
  Index: DefaultContainmentModel.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/merlin/composition/src/java/org/apache/avalon/composition/model/impl/DefaultContainmentModel.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- DefaultContainmentModel.java	11 Jul 2003 11:06:30 -0000	1.11
  +++ DefaultContainmentModel.java	14 Jul 2003 04:46:24 -0000	1.12
  @@ -56,6 +56,7 @@
   import java.util.Hashtable;
   import java.util.List;
   import java.util.ArrayList;
  +import java.util.Map;
   
   import org.apache.avalon.composition.model.ClassLoaderContext;
   import org.apache.avalon.composition.model.ClassLoaderModel;
  @@ -128,7 +129,7 @@
   
       private String m_partition;
   
  -    private final List m_models = new ArrayList();
  +    private final Map m_models = new Hashtable();
   
       //==============================================================
       // constructor
  @@ -287,7 +288,13 @@
               //
   
               final DeploymentModel model = new DefaultDeploymentModel( context );
  -            m_models.add( model );
  +            m_models.put( name, model );
  +
  +            if( getLogger().isDebugEnabled() )
  +            {
  +                final String message = REZ.getString( "containment.add", name );
  +                getLogger().debug( message );
  +            }
   
               return model;
           }
  @@ -338,7 +345,7 @@
   
               final ContainmentModel model = 
                 new DefaultContainmentModel( context );
  -            m_models.add( model );
  +            m_models.put( name, model );
   
               return model;
           }
  @@ -368,8 +375,18 @@
       */
       public Model[] getModels()
       {
  -        return (Model[]) m_models.toArray( new Model[0] );
  +        return (Model[]) m_models.values().toArray( new Model[0] );
       }
  +
  +   /**
  +    * Return a model relative to a supplied name.
  +    * @return the named model or null if the name is unknown
  +    */
  +    public Model getModel( String name )
  +    {
  +        return (Model) m_models.get( name );
  +    }
  +
   
       //==============================================================
       // implementation
  
  
  
  1.3       +126 -45   avalon-sandbox/merlin/composition/src/java/org/apache/avalon/composition/model/impl/DefaultContextModel.java
  
  Index: DefaultContextModel.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/merlin/composition/src/java/org/apache/avalon/composition/model/impl/DefaultContextModel.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- DefaultContextModel.java	11 Jul 2003 11:06:30 -0000	1.2
  +++ DefaultContextModel.java	14 Jul 2003 04:46:24 -0000	1.3
  @@ -52,6 +52,7 @@
   
   import java.util.Map;
   import java.util.Hashtable;
  +import java.lang.reflect.Constructor;
   
   import org.apache.avalon.composition.model.ContextModel;
   import org.apache.avalon.composition.model.ModelException;
  @@ -62,7 +63,6 @@
   import org.apache.avalon.framework.context.Context;
   import org.apache.avalon.framework.context.Contextualizable;
   import org.apache.avalon.framework.context.ContextException;
  -import org.apache.avalon.framework.context.DefaultContext;
   import org.apache.avalon.framework.logger.AbstractLogEnabled;
   import org.apache.avalon.framework.logger.Logger;
   import org.apache.avalon.meta.info.ContextDescriptor;
  @@ -97,7 +97,8 @@
       /**
        * The default context strategy interface class.
        */
  -    public static final Class DEFAULT_STRATEGY_CLASS = Contextualizable.class;
  +    public static final String DEFAULT_STRATEGY_CLASSNAME = 
  +      "org.apache.avalon.framework.context.Contextualizable";
   
       //==============================================================
       // immutable state
  @@ -109,16 +110,14 @@
   
       private final DeploymentContext m_context;
   
  -    // --
  -
       private final Class m_strategy;
   
  -    private final Class m_contextClass;
  -
       private final Map m_models = new Hashtable();
   
       private final Map m_map = new Hashtable();
   
  +    private final Context m_componentContext;
  +
       //==============================================================
       // constructor
       //==============================================================
  @@ -144,12 +143,7 @@
           m_context = context;
   
           ClassLoader classLoader = context.getClassLoader();
  -        m_strategy = 
  -          loadStrategyClass( descriptor, classLoader );
  -        m_contextClass = 
  -          loadContextClass( directive, classLoader );
  -        validateCastingConstraint( 
  -         descriptor, classLoader, m_contextClass );
  +        m_strategy = loadStrategyClass( descriptor, classLoader );
   
           //
           // get the set of context entries declared by the component type
  @@ -167,6 +161,7 @@
                   try
                   {
                       Object value = m_context.resolve( key );
  +                    m_map.put( key, value );
                   }
                   catch( ContextException e )
                   {
  @@ -206,7 +201,7 @@
                         (ImportDirective) entryDirective;
                       DefaultImportModel model = 
                         new DefaultImportModel( entry, importDirective, context, m_map );
  -                    m_context.register( key, model );
  +                    m_context.register( model );
                       m_map.put( key, model.getValue() );
                   }
                   else if( entryDirective instanceof ConstructorDirective )
  @@ -215,7 +210,7 @@
                         (ConstructorDirective) entryDirective;
                       DefaultConstructorModel model = 
                         new DefaultConstructorModel( entry, constructor, context, m_map );
  -                    m_context.register( key, model );
  +                    m_context.register( model );
                       m_map.put( key, model.getValue() );
                   }
                   else
  @@ -229,6 +224,8 @@
               }
           }
   
  +        m_componentContext = createComponentContext( m_context, descriptor, directive );
  +
           if( getLogger().isDebugEnabled() )
           {
               getLogger().debug( "context: " + m_map );
  @@ -250,28 +247,13 @@
       }
   
      /**
  -    * Return the context implementation class.
  -    * 
  -    * @return the class representing the context implementation.
  -    */
  -    public Class getContextClass()
  -    {
  -        return m_contextClass;
  -    }
  -
  -   /**
  -    * Return the context map established for the component. The
  -    * map contains a set of keys corresponding to the context 
  -    * entries declared by the component type.  Each key maps to 
  -    * either the directly resolved stardard context key, or, 
  -    * an instance of ContextEntryModel from which a contest entry
  -    * value may be resolved at runtime.
  +    * Return the context objct established for the component.
       * 
  -    * @return the context map
  +    * @return the context object
       */
  -    public Map getContextMap()
  +    public Context getContext()
       {
  -        return m_map;
  +        return m_componentContext;
       }
   
       //==============================================================
  @@ -298,33 +280,107 @@
                   if( getLogger().isDebugEnabled() )
                   {
                       final String message = 
  -                      "Custom strategy: " + clazz.getName();
  +                      REZ.getString( "context.strategy.custom", strategy );
                       getLogger().debug( message );
                   }
                   return clazz;
               }
  +            catch( ClassNotFoundException e )
  +            {
  +                final String error = 
  +                  REZ.getString( "context.strategy.custom.missing.error", strategy );
  +                throw new ModelException( error );
  +            }
               catch( Throwable e )
               {
                   final String error = 
  -                  "Cannot load custom contextualization strategy class: "
  -                  + strategy;
  +                  REZ.getString( "context.strategy.custom.unexpected.error", strategy );
                   throw new ModelException( error, e );
               }
           }
           else
           {
  -            if( getLogger().isDebugEnabled() )
  +            try
  +            {
  +                Class clazz = classLoader.loadClass( DEFAULT_STRATEGY_CLASSNAME );
  +                if( getLogger().isDebugEnabled() )
  +                {
  +                    final String message = 
  +                      REZ.getString( "context.strategy.avalon" );
  +                    getLogger().debug( message );
  +                }
  +                return clazz;
  +            }
  +            catch( ClassNotFoundException e )
  +            {
  +                final String error = 
  +                  REZ.getString( 
  +                    "context.strategy.avalon.missing.error", 
  +                    DEFAULT_STRATEGY_CLASSNAME );
  +                throw new ModelException( error );
  +            }
  +            catch( Throwable e )
               {
  -                final String message = "classic strategy";
  -                getLogger().debug( message );
  +                final String error = 
  +                  REZ.getString( 
  +                    "context.strategy.avalon.unexpected.error",
  +                    DEFAULT_STRATEGY_CLASSNAME );
  +                throw new ModelException( error, e );
               }
  -            return DEFAULT_STRATEGY_CLASS;
  +        }
  +    }
  +
  +   /**
  +    * Creates a compoent context using a deployment context that 
  +    * has been pre-populated with constom context entry models.
  +    * 
  +    * @param context the deployment context
  +    * @param clazz the context implmentation class
  +    * @return the context object compliant with the context casting
  +    *   constraints declared by the component type
  +    * @exception ModelException if an error occurs while attempting to 
  +    *   construct the context instance
  +    */
  +    private Context createComponentContext( 
  +      DeploymentContext context, ContextDescriptor descriptor, ContextDirective directive )
  +      throws ModelException
  +    {
  +        ClassLoader classLoader = context.getClassLoader();
  +        Class clazz = loadContextClass( directive, classLoader );
  +        validateCastingConstraint( descriptor, classLoader, clazz );
  +        Context base = new DefaultContext( context );
  +
  +        if( clazz.equals( DefaultContext.class ) ) return base; 
  +
  +        //
  +        // its a custom context object so we need to create it 
  +        // using the classic context object as the constructor 
  +        // argument
  +        //
  +
  +        try
  +        {
  +            Constructor constructor = clazz.getConstructor(
  +                new Class[]{ Context.class } );
  +            return (Context) constructor.newInstance( new Object[]{ base } );
  +        }
  +        catch( NoSuchMethodException e )
  +        {
  +            final String error =
  +              REZ.getString( "context.non-compliance-constructor.error", clazz.getName() );
  +            throw new ModelException( error, e );
  +        }
  +        catch( Throwable e )
  +        {
  +            final String error =
  +              REZ.getString( "context.custom-unexpected.error", clazz.getName() );
  +            throw new ModelException( error, e );
           }
       }
   
      /**
       * Load the context implementation class.
  -    * @param directive the context directive
  +    * @param directive the context directive (possibly null)
       * @param classLoader the classloader 
       * @return the strategy class
       */
  @@ -332,10 +388,15 @@
          ContextDirective directive, ClassLoader classLoader )
         throws ModelException
       {
  +        if( directive == null )
  +        {
  +            return DEFAULT_CONTEXT_CLASS;
  +        }
  +
           final String classname = m_directive.getClassname();
           if( classname == null )
           {
  -            return DefaultContext.class;
  +            return DEFAULT_CONTEXT_CLASS;
           }
           else
           {
  @@ -368,7 +429,7 @@
         throws ModelException
       {
   
  -        Class castingClass = Context.class;
  +        Class castingClass = null;
   
           final String castingClassName = 
             descriptor.getReference().getClassname();
  @@ -388,11 +449,31 @@
                   throw new ModelException( error, e );
               }
           }
  +        else
  +        {
  +            try
  +            {
  +                castingClass =
  +                  classLoader.loadClass( Context.class.getName() );
  +            }
  +            catch( Throwable e )
  +            {
  +                final String error = 
  +                  "Cannot load standard Avalon context interface class: "
  +                  + Context.class.getName();
  +                throw new ModelException( error, e );
  +            }
  +        }
   
           if( !castingClass.isAssignableFrom( clazz ) )
           {
  +System.out.println( "CONTEXT CLASSLOADER: " + castingClass.getClassLoader() );
  +for( int i=0; i<clazz.getInterfaces().length; i++ )
  +{
  +System.out.println( "SYS CLASSLOADER: " + clazz.getInterfaces()[i].getClassLoader() );
  +}
               final String error = 
  -              "Supplied context implementation class: " 
  +              "### Supplied context implementation class: " 
                 + clazz.getName() 
                 + " does not implement the interface: " 
                 + castingClass.getName()
  
  
  
  1.4       +46 -32    avalon-sandbox/merlin/composition/src/java/org/apache/avalon/composition/model/impl/DefaultDeploymentContext.java
  
  Index: DefaultDeploymentContext.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/merlin/composition/src/java/org/apache/avalon/composition/model/impl/DefaultDeploymentContext.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DefaultDeploymentContext.java	11 Jul 2003 11:06:30 -0000	1.3
  +++ DefaultDeploymentContext.java	14 Jul 2003 04:46:24 -0000	1.4
  @@ -55,7 +55,7 @@
   import java.util.Hashtable;
   
   import org.apache.avalon.composition.model.SystemContext;
  -import org.apache.avalon.composition.model.ContextEntryModel;
  +import org.apache.avalon.composition.model.EntryModel;
   import org.apache.avalon.composition.model.ContainmentContext;
   import org.apache.avalon.composition.model.DeploymentContext;
   import org.apache.avalon.composition.model.ModelException;
  @@ -65,8 +65,9 @@
   import org.apache.avalon.framework.logger.Logger;
   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.data.DeploymentProfile;
  +import org.apache.avalon.meta.info.Type;
  +import org.apache.avalon.meta.info.EntryDescriptor;
   
   
   /**
  @@ -108,8 +109,8 @@
       private final String m_partition;
   
      /**
  -    * Map containing the supplimentary context entries 
  -    * key by context enty key.
  +    * Map containing context entry models 
  +    * keyed by entry key.
       */
       private final Map m_map = new Hashtable();
   
  @@ -298,8 +299,9 @@
       * @param key
       * @param value
       */
  -    public void register( String key, ContextEntryModel model )
  +    public void register( EntryModel model )
       {
  +        final String key = model.getKey();
           if( m_map.get( key ) == null )
           {
               m_map.put( key, model );
  @@ -307,22 +309,28 @@
           else
           {
               final String error = 
  -              "Illegal attempt to override an existing model entry: " + key;
  +              REZ.getString( "deployment.registration.override.error", key );
               throw new IllegalArgumentException( error );
           }
       }
   
      /**
       * Get a context entry from the deployment context.
  -    * @param key the entry lookup key
  +    * @param alias the entry lookup key
       * @return value the corresponding value
       * @exception ContextException if the key is unknown
  +    * @exception ModelRuntimeException if the key is unknown
       */
  -    public Object resolve( String key ) throws ContextException
  +    public Object resolve( final String alias ) throws ContextException
       {
  -        Object object = m_map.get( key );
  -        if( object == null )
  +        if( alias == null ) throw new NullPointerException( "alias" );
  +
  +        EntryDescriptor entry = 
  +          getType().getContext().getEntry( alias );
  +
  +        if( entry != null )
           {
  +            final String key = entry.getKey();
               if( key.equals( NAME_KEY ) )
               {
                   return getName();
  @@ -345,31 +353,37 @@
               }
               else
               {
  -                throw new ContextException( key );
  -            }
  -        }
  -
  -        if( object instanceof ContextEntryModel )
  -        {
  -            final String classname = object.getClass().getName();
  -            try
  -            {
  -                return ((ContextEntryModel)object).getValue();
  -            }
  -            catch( Throwable e )
  -            {
  -                final String error = 
  -                  REZ.getString( 
  -                    "deployment.context.runtime-get", 
  -                    key, classname );
  -                throw new ModelRuntimeException( error, e );
  +                Object object = m_map.get( key );
  +                if( null != object )
  +                {
  +                    final String classname = object.getClass().getName();
  +                    try
  +                    {
  +                        return ((EntryModel)object).getValue();
  +                    }
  +                    catch( Throwable e )
  +                    {
  +                        final String error = 
  +                          REZ.getString( 
  +                            "deployment.context.runtime-get", 
  +                            key, classname );
  +                        throw new ModelRuntimeException( error, e );
  +                    }
  +                }
  +                else
  +                {
  +                    final String error = 
  +                      REZ.getString( 
  +                        "deployment.context.runtime-get", key );
  +                    throw new ModelRuntimeException( error );
  +                }
               }
           }
           else
           {
  -            return object;
  +            final String error = 
  +              REZ.getString( "deployment.context.invalid-key-request", alias );
  +            throw new ContextException( error );
           }
       }
  -
  -
   }
  
  
  
  1.12      +85 -9     avalon-sandbox/merlin/composition/src/java/org/apache/avalon/composition/model/impl/DefaultDeploymentModel.java
  
  Index: DefaultDeploymentModel.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/merlin/composition/src/java/org/apache/avalon/composition/model/impl/DefaultDeploymentModel.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- DefaultDeploymentModel.java	11 Jul 2003 11:06:30 -0000	1.11
  +++ DefaultDeploymentModel.java	14 Jul 2003 04:46:24 -0000	1.12
  @@ -99,6 +99,9 @@
       private static final Resources REZ =
               ResourceManager.getPackageResources( DefaultDeploymentModel.class );
   
  +   private static final String CONTEXTUALIZABLE = 
  +     "org.apache.avalon.framework.context.Contextualizable";
  +
       private static final Configuration EMPTY_CONFIGURATION =
         new DefaultConfiguration( 
           "configuration", DeploymentModel.class.getName() );
  @@ -111,6 +114,7 @@
   
       private final ContextModel m_contextModel;
   
  +    private final boolean m_contextDependent;
   
       //==============================================================
       // mutable state
  @@ -147,7 +151,6 @@
   
           m_context = context;
   
  -        
   
           ClassLoader classLoader = m_context.getClassLoader();
   
  @@ -181,7 +184,9 @@
               }
           }
   
  -        if( isContextDependent() )
  +        m_contextDependent = getContextDependentState();
  +
  +        if( m_contextDependent )
           {
               final ContextDescriptor contextDescriptor = 
                 m_context.getType().getContext();
  @@ -480,20 +485,91 @@
       */
       public boolean isContextDependent()
       {
  +        return m_contextDependent;
  +    }
  +
  +   /**
  +    * Test if the component type backing the model requires the 
  +    * establishment of a runtime context.
  +    *
  +    * @param return TRUE if the component type requires a runtime
  +    *   context otherwise FALSE
  +    */
  +    public boolean getContextDependentState()
  +    {
           if( m_context.getType().getStages().length > 0 )
           {
               return true;
           }
  -        else if( 
  -          Contextualizable.class.isAssignableFrom( 
  -            m_context.getDeploymentClass() ) )
  +
  +        Class base = m_context.getDeploymentClass();
  +        String strategy = 
  +          m_context.getType().getContext().getAttribute( 
  +              ContextDescriptor.STRATEGY_KEY, null );
  +        ClassLoader classLoader = m_context.getClassLoader();
  +
  +        if( strategy != null )
           {
  -            return true;
  +            Class contextualizable = 
  +              getComponentClass( classLoader, strategy );
  +
  +            if( contextualizable == null )
  +            {
  +                final String error = 
  +                  REZ.getString( 
  +                    "deployment.missing-strategy.error", 
  +                    strategy, base.getName() );
  +                throw new IllegalStateException( error );
  +            }
  +            else
  +            {
  +                if( contextualizable.isAssignableFrom( base ) )
  +                {
  +                    return true;
  +                }
  +                else
  +                {
  +                    final String error = 
  +                      REZ.getString( 
  +                        "deployment.inconsitent-strategy.error",
  +                        contextualizable, base );
  +                    throw new IllegalStateException( error );
  +                }
  +            }
           }
           else
           {
  -            return m_context.getType().getContext().getAttribute( 
  -              ContextDescriptor.STRATEGY_KEY, null ) != null;
  +            Class contextualizable = 
  +              getComponentClass( classLoader, CONTEXTUALIZABLE );
  +            if( contextualizable != null )
  +            {
  +                if( contextualizable.isAssignableFrom( base ) )
  +                {
  +                    return true;
  +                }
  +            }
  +        }
  +        return false;
  +    }
  +
  +    private Class getComponentClass( ClassLoader classLoader, String classname )
  +    {
  +        if( classLoader == null )
  +        {
  +            throw new NullPointerException( "classLoader" );
  +        }
  +        if( classname == null )
  +        {
  +            throw new NullPointerException( "classname" );
  +        }
  +
  +        try
  +        {
  +            return classLoader.loadClass( classname );
  +        }
  +        catch( ClassNotFoundException e )
  +        {
  +            return null;
           }
       }
   
  
  
  
  1.2       +3 -6      avalon-sandbox/merlin/composition/src/java/org/apache/avalon/composition/model/impl/DefaultImportModel.java
  
  Index: DefaultImportModel.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/merlin/composition/src/java/org/apache/avalon/composition/model/impl/DefaultImportModel.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DefaultImportModel.java	11 Jul 2003 11:06:30 -0000	1.1
  +++ DefaultImportModel.java	14 Jul 2003 04:46:24 -0000	1.2
  @@ -71,7 +71,7 @@
    * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
    * @version $Revision$ $Date$
    */
  -public class DefaultImportModel extends DefaultContextEntryModel
  +public class DefaultImportModel extends DefaultEntryModel
   {
       //==============================================================
       // static
  @@ -113,10 +113,7 @@
         EntryDescriptor descriptor, ImportDirective directive, 
         DeploymentContext context, Map map )
       {
  -        if( descriptor == null )
  -        {
  -            throw new NullPointerException( "descriptor" );
  -        }
  +        super( descriptor );
           if( directive == null )
           {
               throw new NullPointerException( "directive" );
  
  
  
  1.3       +37 -14    avalon-sandbox/merlin/composition/src/java/org/apache/avalon/composition/model/impl/DefaultModelFactory.java
  
  Index: DefaultModelFactory.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/merlin/composition/src/java/org/apache/avalon/composition/model/impl/DefaultModelFactory.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- DefaultModelFactory.java	9 Jul 2003 05:02:05 -0000	1.2
  +++ DefaultModelFactory.java	14 Jul 2003 04:46:24 -0000	1.3
  @@ -51,6 +51,7 @@
   package org.apache.avalon.composition.model.impl;
   
   import java.io.File;
  +import java.net.URL;
   
   import org.apache.avalon.composition.model.ClassLoaderModel;
   import org.apache.avalon.composition.model.ClassLoaderContext;
  @@ -65,10 +66,13 @@
   import org.apache.avalon.excalibur.i18n.ResourceManager;
   import org.apache.avalon.excalibur.i18n.Resources;
   import org.apache.avalon.extension.manager.OptionalPackage;
  +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.data.ContainmentProfile;
   import org.apache.avalon.meta.data.ClassLoaderDirective;
  +import org.apache.avalon.meta.data.builder.XMLContainmentProfileCreator;
   
   /**
    * A factory enabling the establishment of new composition model instances.
  @@ -83,21 +87,12 @@
       // static
       //==============================================================
   
  +    private static final XMLContainmentProfileCreator CREATOR = 
  +      new XMLContainmentProfileCreator();
  +
       private static final Resources REZ =
         ResourceManager.getPackageResources( DefaultModelFactory.class );
   
  -    private static ClassLoader getClassLoader( final ClassLoader classloader )
  -    {
  -        if( classloader == null )
  -        {
  -            return Thread.currentThread().getContextClassLoader();
  -        }
  -        else
  -        {
  -            return classloader;
  -        }
  -    }
  -
       //==============================================================
       // immutable state
       //==============================================================
  @@ -124,6 +119,31 @@
   
      /**
       * Creation of a new root containment model using 
  +    * a URL referring to a containment profile.
  +    *
  +    * @param url a composition profile source
  +    * @return the containment model
  +    */
  +    public ContainmentModel createContainmentModel( URL url ) 
  +      throws ModelException
  +    {
  +        try
  +        {
  +            DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
  +            Configuration config = builder.build( url.toString() );
  +            ContainmentProfile profile = CREATOR.createContainmentProfile( config );
  +            return createContainmentModel( profile );
  +        }
  +        catch( Throwable e )
  +        {
  +            final String error = 
  +              "Unable to create a containment model from the url: " + url;
  +            throw new ModelException( error, e );
  +        }
  +    }
  +
  +   /**
  +    * Creation of a new root containment model using 
       * a supplied system context and containment profile
       * using the context classloader.
       *
  @@ -145,7 +165,10 @@
           {
               Repository repository = m_system.getRepository();
               File base = m_system.getBaseDirectory();
  -            ClassLoader root = ClassLoader.getSystemClassLoader();
  +
  +            //ClassLoader root = ClassLoader.getSystemClassLoader();
  +            ClassLoader root = m_system.getCommonClassLoader();
  +
               ClassLoaderDirective classLoaderDirective = 
                 profile.getClassLoaderDirective();
   
  
  
  
  1.6       +108 -23   avalon-sandbox/merlin/composition/src/java/org/apache/avalon/composition/model/impl/DefaultSystemContext.java
  
  Index: DefaultSystemContext.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/merlin/composition/src/java/org/apache/avalon/composition/model/impl/DefaultSystemContext.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- DefaultSystemContext.java	8 Jul 2003 13:47:06 -0000	1.5
  +++ DefaultSystemContext.java	14 Jul 2003 04:46:24 -0000	1.6
  @@ -52,13 +52,23 @@
   
   import java.io.File;
   import java.util.Map;
  +import java.net.URL;
  +import java.net.URLClassLoader;
   
  +import org.apache.avalon.composition.logging.LoggingManager;
  +import org.apache.avalon.composition.logging.LoggingDescriptor;
  +import org.apache.avalon.composition.logging.TargetDescriptor;
  +import org.apache.avalon.composition.logging.impl.DefaultLoggingManager;
  +import org.apache.avalon.composition.model.ModelFactory;
   import org.apache.avalon.composition.model.SystemContext;
   import org.apache.avalon.composition.repository.Repository;
  +import org.apache.avalon.composition.repository.impl.FileRepository;
   import org.apache.avalon.framework.logger.Logger;
   import org.apache.avalon.framework.context.DefaultContext;
   import org.apache.avalon.excalibur.i18n.ResourceManager;
   import org.apache.avalon.excalibur.i18n.Resources;
  +import org.apache.avalon.framework.context.DefaultContext;
  +import org.apache.avalon.meta.data.CategoryDirective;
   
   
   /**
  @@ -77,6 +87,49 @@
       private static final Resources REZ =
               ResourceManager.getPackageResources( DefaultSystemContext.class );
   
  +   /**
  +    * Creation of a new system context.
  +    *
  +    * @param base the base directory from which relative references 
  +    *   within a classpath or library directive shall be resolved
  +    * @param root a repository root directory
  +    * @return a system context
  +    */
  +    public static SystemContext createSystemContext( 
  +      File base, File root ) throws Exception
  +    {
  +        LoggingManager logging = createLoggingManager( base );
  +        Logger logger = logging.getSystemLoggerForCategory( "" );
  +        Repository repository = createRepository( root, logger );
  +        return new DefaultSystemContext( logging, base, repository );
  +    }
  +
  +    private static FileRepository createRepository( File root, Logger logger ) throws Exception
  +    {
  +        URL ibiblio = new URL( "http://www.ibiblio.org/maven" );
  +        FileRepository repository = new FileRepository();
  +        repository.enableLogging( logger );
  +        DefaultContext context = new DefaultContext();
  +        context.put( FileRepository.BASE_KEY, root );
  +        context.put( FileRepository.HOSTS_KEY, new URL[]{ ibiblio } );
  +        context.makeReadOnly();
  +        repository.contextualize( context );
  +        return repository;
  +    }
  +
  +    private static LoggingManager createLoggingManager( File base ) throws Exception
  +    {
  +        LoggingDescriptor logging =
  +                new LoggingDescriptor(
  +                        "", "DEBUG", null,
  +                        new TargetDescriptor[0],
  +                        new CategoryDirective( "logging", "WARN" ) );
  +
  +        DefaultLoggingManager manager = 
  +          new DefaultLoggingManager( base, "sys", logging );
  +        return manager;
  +    }
  +
       //==============================================================
       // immutable state
       //==============================================================
  @@ -89,10 +142,16 @@
   
       private final Repository m_repository;
   
  -    private final ClassLoader m_classLoader;
  +    private final ClassLoader m_system;
  +
  +    private final ClassLoader m_common;
  +
  +    private final LoggingManager m_logging;
   
       private final Logger m_logger;
   
  +    private ModelFactory m_factory;
  +
       //==============================================================
       // mutable state
       //==============================================================
  @@ -106,17 +165,18 @@
      /**
       * Creation of a new system context.
       *
  -    * @param system the system classloader
  +    * @param logger the logging channel
  +    * @param common the common classloader
       * @param base the base directory from which relative references 
       *   within a classpath or library directive shall be resolved
       * @param repository a resource repository to be used when resolving 
       *   resource directives
       */
       public DefaultSystemContext( 
  -      Logger logger, ClassLoader system, File base, Repository repository )
  +      LoggingManager logging, File base, Repository repository )
       {
           this( 
  -          logger, system, base, 
  +          logging, base, 
             new File( System.getProperty( "user.dir" ), "working" ), 
             repository );
       }
  @@ -124,45 +184,45 @@
      /**
       * Creation of a new system context.
       *
  -    * @param system the system classloader
  +    * @param logger the logging channel
  +    * @param common the common classloader
       * @param base the base directory from which relative references 
       *   within a classpath or library directive shall be resolved
       * @param repository a resource repository to be used when resolving 
       *   resource directives
       */
       public DefaultSystemContext( 
  -      Logger logger, ClassLoader system, File base, File work, Repository repository )
  +      LoggingManager logging, File base, File working, Repository repository )
       {
           this( 
  -          logger, system, base, 
  -          new File( work, "home" ), 
  -          new File( work, "temp" ), 
  +          logging, base, 
  +          new File( working, "home" ), 
  +          new File( working, "temp" ), 
             repository );
       }
   
      /**
       * Creation of a new system context.
       *
  -    * @param system the system classloader
  +    * @param logger the logging channel
  +    * @param common the common classloader
       * @param base the base directory from which relative references 
       *   within a classpath or library directive shall be resolved
  -    * @param home the directory from which persistent content may be created
  -    * @param temp a temporary directory that will be destroyed on completion 
  -    *   of the session
       * @param repository a resource repository to be used when resolving 
       *   resource directives
       */
       public DefaultSystemContext( 
  -      Logger logger, ClassLoader system, File base, File home, File temp, 
  -      Repository repository )
  +      LoggingManager logging, File base, File home, 
  +      File temp, Repository repository )
       {
  -        this( logger, system, base, home, temp, repository, false );
  +        this( logging, base, home, temp, repository, false );
       }
   
  +
      /**
       * Creation of a new system context.
       *
  -    * @param system the system classloader
  +    * @param logger the logging channel
       * @param base the base directory from which relative references 
       *   within a classpath or library directive shall be resolved
       * @param home the directory from which persistent content may be created
  @@ -173,7 +233,7 @@
       * @param trace flag indicating if internal logging is enabled
       */
       public DefaultSystemContext( 
  -      Logger logger, ClassLoader system, File base, File home, File temp, 
  +      LoggingManager logging, File base, File home, File temp, 
         Repository repository, boolean trace )
       {
           if( base == null )
  @@ -184,7 +244,7 @@
           {
               throw new NullPointerException( "repository" );
           }
  -        if( logger == null )
  +        if( logging == null )
           {
               throw new NullPointerException( "logger" );
           }
  @@ -200,8 +260,13 @@
           m_temp = temp;
           m_trace = trace;
           m_repository = repository;
  -        m_classLoader = system;
  -        m_logger = logger;
  +        m_logging = logging;
  +        m_logger = m_logging.getSystemLoggerForCategory( "" );
  +
  +        m_system = DefaultSystemContext.class.getClassLoader();
  +        m_common = Logger.class.getClassLoader();
  +
  +        m_factory = new DefaultModelFactory( this );
       }
   
       //==============================================================
  @@ -209,6 +274,16 @@
       //==============================================================
   
      /**
  +    * Return the model factory.
  +    *
  +    * @return the factory
  +    */
  +    public ModelFactory getFactory()
  +    {
  +        return m_factory;
  +    }
  +
  +   /**
       * Return the base directory from which relative classloader 
       * references may be resolved.
       *
  @@ -257,9 +332,19 @@
       *
       * @return the system classloader
       */
  +    public ClassLoader getCommonClassLoader()
  +    {
  +        return m_common;
  +    }
  +
  +   /**
  +    * Return the system classloader.
  +    *
  +    * @return the system classloader
  +    */
       public ClassLoader getSystemClassLoader()
       {
  -        return m_classLoader;
  +        return m_system;
       }
   
      /**
  
  
  
  1.9       +19 -0     avalon-sandbox/merlin/composition/src/java/org/apache/avalon/composition/model/impl/Resources.properties
  
  Index: Resources.properties
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/merlin/composition/src/java/org/apache/avalon/composition/model/impl/Resources.properties,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- Resources.properties	11 Jul 2003 11:06:30 -0000	1.8
  +++ Resources.properties	14 Jul 2003 04:46:24 -0000	1.9
  @@ -17,6 +17,7 @@
   containment.unknown-profile-class.error=Unknown profile class: {1} in {0}.
   containment.context.home.not-a-directory.error=Supplied home dir is not a directory: {0}
   containment.context.temp.not-a-directory.error=Supplied temp dir is not a directory: {0}
  +containment.add=added: {0}
   
   # DefaultDeploymentModel
   deployment.parameters.irrational=Illegal attempt to set a parameter value for a component type '{0}' that is not parameterizable in the model: {1}.
  @@ -24,6 +25,11 @@
   deployment.context.home.not-a-directory.error=Supplied home dir is not a directory: {0}
   deployment.context.temp.not-a-directory.error=Supplied temp dir is not a directory: {0}
   deployment.context.runtime-get="Unable to resolve context value for key {0} due to an unexpected runtime error in: " {1}
  +deployment.inconsitent-strategy.error=The custom contextualization strategy interface class [{0}] is not implemented by the component class [{1}].
  +deployment.missing-strategy.error=The custom contextualization strategy interface class [{0}] declared by the class [{1}] is not present in the containment context classloader.
  +deployment.context.invalid-key-request=The requested context resolution for the key [{0}] cannot be performed because the component type does declare entry declaration as a key or alias.
  +deployment.context.internal.error=The context key [{0}] was recognized but could not be fulfilled as no context entry model has be assigned to handle the request.
  +deployment.registration.override.error=Illegal attempt to override an existing model entry [{0}].
   
   # DefaultModel
   created=created: {0}
  @@ -63,10 +69,23 @@
   import.null-object.error=Resolution of the include directive for the containment key {0} undeer the component context entry {1) return a null object reference. 
   
   #DefaultContextModel
  +context.strategy.custom=custom strategy: {0}
  +context.strategy.avalon=avalon strategy
   context.non-standard-avalon-key.error=The component has requested a Avalon context entry that is not know within the family of standard Avalon context keys.  The offending key is: {0}.
   
   context.missing-directive.error=The component has requested a non-avalon context entry. The container cannot resolve this request because no entry directive can be found the matches the key: {0}.
   
   context.unsupported-directive.error=The component has requested a context entry under the key [{0}]. The container cannot resolve this request because the entry directive type [{1}] is not supported at this time.
   
  +context.non-compliance-constructor.error="Custom context class [{0}] does not implement a constructor pattern <init>( org.apache.avalon.framework.Context ).
  +
  +context.custom-unexpected.error=Unexpected error occured while attempting to construct a custom context using the class [{0}].
  +
  +context.strategy.custom.missing.error=Custom stategy class [{0}] is not present in the classpath. 
  +context.strategy.custom.unexpected.error=Unable to load the custom stategy class [{0}] due to an unexpected error. 
  +context.strategy.avalon.missing.error=Classic Avalon context stategy class [{0}] is not present in the classpath. 
  +context.strategy.avalon.unexpected.error=Unable to load the classic Avalon stategy class [{0}] due to an unexpected error. 
  +
  +# DefaultContext
  +context.entry.model.error=Cannot fulfill request due to an model-related error while attempting to resolve a context entry for the key: {0}.
   
  
  
  

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