mcconnell    2002/07/23 08:10:40

  Modified:    assembly/src/java/org/apache/excalibur/merlin/container
                        LifecycleHelper.java ResourceProvider.java
               assembly/src/java/org/apache/excalibur/merlin/kernel
                        DefaultKernel.java
               assembly/src/java/org/apache/excalibur/merlin/model
                        ContextDirective.java Import.java Parameter.java
               assembly/src/java/org/apache/excalibur/merlin/model/builder
                        XMLProfileCreator.java
  Log:
  addition of support for configuration by reference and context refernces in 
parameters
  
  Revision  Changes    Path
  1.5       +1 -1      
jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/container/LifecycleHelper.java
  
  Index: LifecycleHelper.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/container/LifecycleHelper.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- LifecycleHelper.java      20 Jul 2002 00:54:07 -0000      1.4
  +++ LifecycleHelper.java      23 Jul 2002 15:10:40 -0000      1.5
  @@ -106,7 +106,7 @@
               {
                   notice( name, stage );
                   final ServiceManager manager =
  -                    provider.createServiceManager( profile);
  +                    provider.createServiceManager( profile );
                   ContainerUtil.service( object, manager );
               }
               else if( object instanceof Composable )
  
  
  
  1.8       +12 -37    
jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/container/ResourceProvider.java
  
  Index: ResourceProvider.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/container/ResourceProvider.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- ResourceProvider.java     20 Jul 2002 00:54:07 -0000      1.7
  +++ ResourceProvider.java     23 Jul 2002 15:10:40 -0000      1.8
  @@ -113,7 +113,7 @@
   
       private DefaultContainer m_locator;
   
  -    private Context m_dictionary;
  +    private DefaultContext m_dictionary;
   
       //=======================================================================
       // constructor
  @@ -125,7 +125,9 @@
           m_classloader = loader;
           m_logging = manager;
           m_locator = locator;
  -        m_dictionary = dictionary;
  +        m_dictionary = new DefaultContext( dictionary );
  +        m_dictionary.put( "classloader", loader );
  +        m_dictionary.makeReadOnly();
       }
   
       //=======================================================================
  @@ -217,17 +219,17 @@
                   parent.put( key, object );
                   getLogger().debug( 
                     "adding context entry: " + key 
  -                  + ", with name: " + name 
  +                  + ", from: " + name 
                     + ", and object: " + object );
               }
               catch( Throwable e )
               {
                   final String error = 
  -                  "Could not resolve a value for the import directive in profile '" 
  -                      + profile.getName() 
  -                      + "' with the name '" + name
  -                      + "' for the key '" + key 
  -                      + "'.";
  +                      "Could not resolve a value for the import directive in 
profile '" 
  +                        + profile.getName() 
  +                        + "' with the name '" + name
  +                        + "' for the key '" + key 
  +                        + "'.";
                   throw new ContainerException( error );
               }
           }
  @@ -247,24 +249,6 @@
       {
           final Map services = getServices( profile );
           final DefaultComponentManager componentManager = new 
DefaultComponentManager( services );
  -/*
  -        final Iterator keys = services.keySet().iterator();
  -        while( keys.hasNext() )
  -        {
  -            final String key = (String)keys.next();
  -            final Object service = services.get( key );
  -            if( !Component.class.isInstance( service ) )
  -            {
  -                final String message =
  -                    REZ.getString( "resource.service-not-a-component.error",
  -                                   key,
  -                                   service.getClass().getName() );
  -                throw new Exception( message );
  -            }
  -            componentManager.put( key, (Component)service );
  -        }
  -        componentManager.makeReadOnly();
  -*/
           return componentManager;
       }
   
  @@ -280,16 +264,6 @@
       {
           final Map services = getServices( profile );
           final DefaultServiceManager serviceManager = new DefaultServiceManager( 
services );
  -/*
  -        final Iterator keys = services.keySet().iterator();
  -        while( keys.hasNext() )
  -        {
  -            final String key = (String)keys.next();
  -            final Object service = services.get( key );
  -            serviceManager.put( key, service );
  -        }
  -        serviceManager.makeReadOnly();
  -*/
           return serviceManager;
       }
   
  @@ -348,6 +322,7 @@
       */
       private Map getServices( Profile profile ) throws Exception
       {
  +        getLogger().debug("preparing services for profile: " + profile );
           final Type type = profile.getType();
           final DependencyDescriptor[] dependencies = type.getDependencies();
           final HashMap services = new HashMap();
  
  
  
  1.20      +3 -2      
jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/kernel/DefaultKernel.java
  
  Index: DefaultKernel.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/kernel/DefaultKernel.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- DefaultKernel.java        20 Jul 2002 05:03:01 -0000      1.19
  +++ DefaultKernel.java        23 Jul 2002 15:10:40 -0000      1.20
  @@ -125,7 +125,8 @@
      /**
       * Invoked by the bootstrap process to supply to kernel defintion.
       * @param context the context object containing the inital parameters
  -    * @exception ContextException if the supplied does not contain a DESCRIPTOR_KEY 
value 
  +    * @exception ContextException if the supplied does not contain a 
CLASSLOADER_KEY,
  +    * LOG_MANAGER_KEY, or ROOT_CONTAINER_DESCRIPTOR_KEY value.
       */
       public void contextualize( Context context ) throws ContextException
       {
  
  
  
  1.3       +3 -3      
jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/ContextDirective.java
  
  Index: ContextDirective.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/ContextDirective.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ContextDirective.java     19 Jul 2002 14:08:07 -0000      1.2
  +++ ContextDirective.java     23 Jul 2002 15:10:40 -0000      1.3
  @@ -25,7 +25,7 @@
    * statement corresponds to a request for a context value from the container.</p>
    * <pre>
    *    &lt;context class="<font color="darkred">MyContextCLass</font>"&gt;
  - *       &lt;import key="<font color="darkred">avalon.work</font>" as="<font 
color="darkred">base</font>"/&gt;
  + *       &lt;import name="<font color="darkred">avalon.work</font>" key="<font 
color="darkred">base</font>"/&gt;
    *       &lt;entry key="<font color="darkred">location</font>" value="<font 
color="darkred">Paris</font>"/&gt;
    *    &lt;/context&gt;
    * </pre>
  @@ -151,7 +151,7 @@
               final String key = entry.getKey();
               try
               {
  -                final Object value = entry.getValue( loader );
  +                final Object value = entry.getValue( loader, parent );
                   map.put( key, value );
               }
               catch( Throwable e )
  
  
  
  1.2       +2 -2      
jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/Import.java
  
  Index: Import.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/Import.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Import.java       19 Jul 2002 14:08:07 -0000      1.1
  +++ Import.java       23 Jul 2002 15:10:40 -0000      1.2
  @@ -24,7 +24,7 @@
    *    --&gt;</font>
    *
    *  <font color="gray">&lt;context&gt;</font>
  - *    &lt;import key="<font color="darkred">home</font>" resource="<font 
color="darkred">avalon.home</font>"&gt;;
  + *    &lt;import key="<font color="darkred">home</font>" name="<font 
color="darkred">avalon.home</font>"&gt;;
    *  <font color="gray">&lt;/context&gt;</font>
    * </pre>
    *
  
  
  
  1.4       +148 -14   
jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/Parameter.java
  
  Index: Parameter.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/Parameter.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Parameter.java    19 Jul 2002 14:08:07 -0000      1.3
  +++ Parameter.java    23 Jul 2002 15:10:40 -0000      1.4
  @@ -8,7 +8,7 @@
   package org.apache.excalibur.merlin.model;
   
   import java.lang.reflect.Constructor;
  -
  +import org.apache.avalon.framework.context.Context;
   
   /**
    * A <code>Parameter</code> represents a single constructor typed argument value.  
A parameter
  @@ -47,9 +47,9 @@
       private final String m_classname;
   
      /**
  -    * The derived value.
  +    * The supplied argument.
       */
  -    private Object m_value;
  +    private String m_argument;
   
      /**
       * The sub-parameters from which the value for this parameter may be derived.
  @@ -57,6 +57,11 @@
       private final Parameter[] m_parameters;
   
      /**
  +    * The derived value.
  +    */
  +    private Object m_value;
  +
  +   /**
       * Creation of a new parameter using the default <code>java.lang.String</code> 
       * type and a supplied value.
       *
  @@ -66,7 +71,7 @@
       {
           m_parameters = new Parameter[0];
           m_classname = "java.lang.String";
  -        m_value = value;
  +        m_argument = value;
       }
   
      /**
  @@ -81,8 +86,9 @@
           if( null == value )
             throw new NullPointerException("value");
   
  -        m_parameters = new Parameter[]{ new Parameter( value ) };
  +        m_parameters = new Parameter[0];
           m_classname = classname;
  +        m_argument = value;
       }
   
      /**
  @@ -175,10 +181,89 @@
       * Return the derived parameter value.
       * @return the value
       */
  -    public Object getValue( ClassLoader loader ) throws ModelException
  +    public Object getValue( ClassLoader loader, Context context ) throws 
ModelException
       {
  +        //
  +        // if the parameter value has already been established - return it now
  +        //
  +
           if( m_value != null )
  -          return m_value;
  +        {
  +            return m_value;
  +        }
  +
  +        //
  +        // if the parameter contains a text argument then check if its a reference
  +        // to a context entry (in the form"${<key>}" ), otherwise its a simple 
constructor
  +        // case with a single string paremeter
  +        //
  +
  +        if( m_argument != null )
  +        {
  +            if( m_argument.startsWith("${") )
  +            {
  +                if( m_argument.endsWith("}") )
  +                {
  +                    final String key = m_argument.substring( 2, m_argument.length() 
-1 );
  +                    try
  +                    {
  +                        m_value = context.get( key );
  +                        return m_value;
  +                    }
  +                    catch( Throwable e )
  +                    {
  +                        final String error = "Missing context value: '" + key + 
"'.";
  +                        throw new IllegalArgumentException( error );
  +                    }
  +                }
  +                else
  +                {
  +                    final String error = "Illegal formal for context refernence: '" 
+ m_argument + "'.";
  +                    throw new IllegalArgumentException( error );
  +                }
  +            }
  +            else
  +            {
  +                //
  +                // the argument is a single string parameter
  +                //
  +
  +                try
  +                {
  +                    final Class[] params = new Class[]{ String.class };
  +                    Constructor constructor = getParameterClass( loader 
).getConstructor( params );
  +                    final Object[] values = new Object[]{ m_argument };
  +                    m_value = constructor.newInstance( values );
  +                    return m_value;
  +                }
  +                catch( InstantiationException e )
  +                {
  +                    final String error = "Unable to instantiate instance of class: 
" + m_classname 
  +                      + " with the single argument: '" + m_argument + "'";
  +                    throw new ModelException( error, e );
  +                }
  +                catch( IllegalAccessException e )
  +                {
  +                    final String error = 
  +                      "Cannot access single string parameter constructor for the 
class: '" 
  +                      + m_classname + "'.";
  +                    throw new ModelException( error, e );
  +                }
  +                catch( Throwable e )
  +                {
  +                    final String error = 
  +                      "Unexpected exception while creating a single string 
parameter value for the class: '" 
  +                      + m_classname + "'.";
  +                    throw new ModelException( error, e );
  +                }
  +
  +            }
  +        }
  +
  +        //
  +        // getting here means we are dealing with 0..n types parameter constructor 
where the
  +        // parameters are defined by the nested parameter definitions
  +        //
   
           if( m_parameters.length == 0 )
           {
  @@ -224,7 +309,7 @@
                    
                    try
                    {
  -                     values[i] = m_parameters[i].getValue( loader );
  +                     values[i] = m_parameters[i].getValue( loader, context );
                    }
                    catch( Throwable e )
                    {
  @@ -235,19 +320,22 @@
                    }
                }
   
  -             Constructor constructor;
  +             Constructor constructor = null;
                try
                {
                    constructor = getParameterClass( loader ).getConstructor( params );
                }
                catch( NoSuchMethodException e )
                {
  +                 final String stack = new String( this.toString() );
  +                 System.out.println( stack );
  +                 System.out.println( getClassesAsString( params ) );
                    final String error = 
  -                   "Supplied parameters in " + m_classname 
  -                   + " do not match an available constructor.";
  -                 throw new ModelException( error, e );
  +                   "Supplied parameters for " + m_classname 
  +                   + " does not match an available constructor. Cause: " + 
e.toString() 
  +                   +  "\n" + stack;
  +                 throw new ModelException( error );
                }
  -
                
                try
                {
  @@ -275,6 +363,52 @@
                      + "for the class: '" + m_classname + "'.";
                    throw new ModelException( error, e );
                }
  +         }
  +    }
  +
  +    private String getClassesAsString( Class[] classes )
  +    {
  +        StringBuffer buffer = new StringBuffer();
  +        for( int i=0; i<classes.length; i++ )
  +        {
  +            buffer.append( classes[i].getName() );
  +            if( (i+1)<classes.length ) 
  +              buffer.append(",");
  +        }
  +        return buffer.toString();
  +    }
  +
  +    public String toString()
  +    {
  +        StringBuffer buffer = new StringBuffer();
  +        asString( buffer, "  " );
  +        return buffer.toString();
  +    }
  +
  +    protected void asString( StringBuffer buffer, String lead )
  +    {
  +        buffer.append( 
  +            lead + "[\n"
  +          + lead + "   type: " + this.getClass().getName() + "\n"
  +          + lead + "  class: " + m_classname + "\n"
  +          + lead + "    arg: " + m_argument + "\n"
  +          + lead + "  value: " + m_value + "\n"
  +          + lead + " params: " + m_parameters.length );
  +
  +        if( m_parameters.length > 0 )
  +        {
  +            buffer.append("\n");
  +            String str = lead + "  ";
  +            getParamsAsString( buffer, str );
  +        }
  +        buffer.append("\n" + lead + "]\n");
  +    }
  +
  +    private void getParamsAsString( StringBuffer buffer, String lead )
  +    {
  +        for( int i=0; i<m_parameters.length; i++ )
  +        {
  +            m_parameters[i].asString( buffer, lead + "  " );
           }
       }
   }
  
  
  
  1.9       +49 -7     
jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/builder/XMLProfileCreator.java
  
  Index: XMLProfileCreator.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/builder/XMLProfileCreator.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- XMLProfileCreator.java    20 Jul 2002 00:54:07 -0000      1.8
  +++ XMLProfileCreator.java    23 Jul 2002 15:10:40 -0000      1.9
  @@ -121,19 +121,61 @@
           final Configuration loggersConfig = profile.getChild("loggers");
           final CategoryDescriptor loggers = createCategoryDescriptor( loggersConfig, 
name );
           final ContextDirective context = createContextDirective( 
profile.getChild("context") );
  +        final Configuration config = createConfiguration( loader, type, 
profile.getChild("configuration") ); 
  +        return new Profile( name, params, config, context, loggers, type, enabled, 
activation, mode  );
  +    }
  +
  +    public Configuration createConfiguration( ClassLoader loader, Type type, 
Configuration config ) 
  +      throws Exception
  +    {
           final Configuration defaults = type.getDefaultConfiguration( loader );
  -        final Configuration base = profile.getChild("configuration");
  -        Configuration config;
  +        Configuration base = null;
  +        if( config.getAttribute("src", null ) != null )
  +        {
  +            String src = config.getAttribute("src" );
  +            if( src.startsWith("resource://") )
  +            {
  +                final String url = src.substring( 11 );
  +                final InputStream stream =
  +                 loader.getResourceAsStream( url );
  +                if( null == stream )
  +                {
  +                    final String error =
  +                     "Requested configuration source does not exist: " + src;
  +                    throw new ConfigurationException( error );
  +                }
  +                final InputSource source = new InputSource( stream );
  +                base = ConfigurationBuilder.build( source );
  +            }
  +            else
  +            {
  +                try
  +                {
  +                    base = ConfigurationBuilder.build( src );
  +                }
  +                catch( Throwable e )
  +                {
  +                    final String error =
  +                     "Unexpected exception while attempting to resolve 
configuration fro src : " + src;
  +                    throw new ConfigurationException( error );
  +                }
  +            }
  +        }
  +        else
  +        {
  +            base = config;
  +        }
  +
           if( null == defaults )
           {
  -            config = base;
  +            return base;
           }
           else
           {
  -            config = new CascadingConfiguration( base, defaults );
  +            return new CascadingConfiguration( base, defaults );
           }
  -        return new Profile( name, params, config, context, loggers, type, enabled, 
activation, mode  );
       }
  +    
   
       public ContextDirective createContextDirective( Configuration config ) throws 
ConfigurationException
       {
  @@ -201,7 +243,7 @@
   
       public Parameter createParameter( Configuration config ) throws 
ConfigurationException
       {
  -        String classname = config.getAttribute( "classname", "java.lang.String" );
  +        String classname = config.getAttribute( "class", "java.lang.String" );
           String value = config.getValue( null );
           if( value != null )
           {
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to