avalon-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mcconn...@apache.org
Subject cvs commit: jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/info/builder XMLTypeCreator.java
Date Thu, 18 Jul 2002 16:57:00 GMT
mcconnell    2002/07/18 09:57:00

  Modified:    assembly build.xml
               assembly/demo/src/java/org/apache/excalibur/playground
                        BasicComponent.java BasicComponent.xinfo
                        BasicComponent.xprofile
               assembly/src/etc kernel.xml
               assembly/src/java/org/apache/excalibur/merlin/container
                        ResourceProvider.java
               assembly/src/java/org/apache/excalibur/merlin/model
                        Profile.java
               assembly/src/java/org/apache/excalibur/merlin/model/builder
                        XMLProfileCreator.java
               assembly/src/java/org/apache/excalibur/meta/info/builder
                        XMLTypeCreator.java
  Added:       assembly/src/java/org/apache/excalibur/merlin/model
                        ContextDirective.java Entry.java
                        ModelException.java ModelRuntimeException.java
                        Parameter.java
  Log:
  addition of context management framework
  
  Revision  Changes    Path
  1.27      +15 -10    jakarta-avalon-excalibur/assembly/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/build.xml,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- build.xml	17 Jul 2002 15:47:23 -0000	1.26
  +++ build.xml	18 Jul 2002 16:57:00 -0000	1.27
  @@ -20,10 +20,11 @@
         General Targets:
         ----------------
   
  -      all              - clean, build and dist
  +      all              - clean, build, dist and docs (everything)
         build            - compilation and jar creation
         deploy           - places internal and external jars into an extensions directory
         javadoc          - javadoc API generation
  +      docs             - projects documentation
         clean            - destroy the build, dist and extensions directory
         help             - this message
         
  @@ -69,7 +70,11 @@
     <target name="dist" depends="build"/>
     <target name="meta" depends="meta.javadoc"/>
     <target name="merlin" depends="merlin.javadoc"/>
  -  <target name="all" depends="clean,meta,merlin,deploy"/>
  +  <target name="all" depends="clean,deploy,docs"/>
  +
  +  <target name="docs" depends="meta,merlin">
  +    <ant antfile="docs.xml"/>
  +  </target>
   
     <target name="clean">
        <delete dir="${build}"/>
  @@ -202,9 +207,9 @@
     <target name="javadoc" depends="meta.javadoc,merlin.javadoc" />
   
     <target name="merlin.javadoc" depends="build" >
  -    <echo message="path: ${javadoc.root.path}/${ant.project.name}"/>
  -    <mkdir dir="${javadoc.root.path}/${ant.project.name}" />
  -    <javadoc destdir="${javadoc.root.path}/${ant.project.name}" 
  +    <echo message="path: ${docs.dir}/api/${ant.project.name}"/>
  +    <mkdir dir="${docs.dir}/api/${ant.project.name}" />
  +    <javadoc destdir="${docs.dir}/api/${ant.project.name}" 
   	doctitle="&lt;h1&gt;${project.title}&lt;/h1&gt;" 
         noindex="false" author="false" 
         use="true"
  @@ -223,7 +228,7 @@
   	  <link href="${avalon.href}" />
   	  <link href="${meta.href}" />
       </javadoc>
  -    <copy todir="${javadoc.root.path}/${ant.project.name}">
  +    <copy todir="${docs.dir}/api/${ant.project.name}">
         <fileset dir="${src.dir}/etc">
           <include name="*.gif"/>
           <include name="*.xml"/>
  @@ -232,9 +237,9 @@
     </target>
   
     <target name="meta.javadoc" depends="meta.build" >
  -    <echo message="path: ${javadoc.root.path}/meta"/>
  -    <mkdir dir="${javadoc.root.path}/meta" />
  -    <javadoc destdir="${javadoc.root.path}/meta" 
  +    <echo message="path: ${docs.dir}/api/meta"/>
  +    <mkdir dir="${docs.dir}/api/meta" />
  +    <javadoc destdir="${docs.dir}/api/meta" 
   	doctitle="&lt;h1&gt;Avalon Component Meta Model&lt;/h1&gt;" 
         noindex="false" author="false" 
         use="true"
  @@ -251,7 +256,7 @@
   	  <link href="${jdk.href}" />
   	  <link href="${avalon.href}" />
       </javadoc>
  -    <copy todir="${javadoc.root.path}/meta" file="${src.dir}/etc/meta.gif"/>
  +    <copy todir="${docs.dir}/api/meta" file="${src.dir}/etc/meta.gif"/>
     </target>
   
     <target name="deploy" depends="build">
  
  
  
  1.4       +38 -3     jakarta-avalon-excalibur/assembly/demo/src/java/org/apache/excalibur/playground/BasicComponent.java
  
  Index: BasicComponent.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/demo/src/java/org/apache/excalibur/playground/BasicComponent.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- BasicComponent.java	4 Jul 2002 09:01:32 -0000	1.3
  +++ BasicComponent.java	18 Jul 2002 16:57:00 -0000	1.4
  @@ -3,6 +3,11 @@
   package org.apache.excalibur.playground;
   
   import org.apache.avalon.framework.logger.AbstractLogEnabled;
  +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.activity.Initializable;
  +import org.apache.avalon.framework.activity.Startable;
   
   /**
    * This is a minimal demonstration component that implements the 
  @@ -10,17 +15,47 @@
    *
    * @author <a href="mailto:mcconnell@osm.net">Stephen McConnell</a>
    */
  -public class BasicComponent extends AbstractLogEnabled
  -implements BasicService
  +public class BasicComponent extends AbstractLogEnabled 
  +implements Contextualizable, Initializable, Startable, BasicService
   {
   
  +    private String m_location;
  +
  +    public void contextualize( Context context )
  +    {
  +        getLogger().info( "contextualization: " + context.getClass().getName() );
  +        try
  +        {
  +            m_location = (String) context.get("location");
  +        }
  +        catch( Throwable e )
  +        {
  +            getLogger().error("contextualization failure", e );
  +        }
  +    }
  +
  +    public void initialize()
  +    {
  +        getLogger().info("initialize");
  +    }
  +
  +    public void start()
  +    {
  +        doPrimeObjective();
  +    }
  +
  +    public void stop()
  +    {
  +        getLogger().info("stopping");
  +    }
  +
       //=======================================================================
       // BasicService
       //=======================================================================
   
       public void doPrimeObjective()
       {
  -        getLogger().info("hello from BasicComponent");
  +        getLogger().info("hello from '" + m_location + "'.");
       }
   
   }
  
  
  
  1.5       +4 -2      jakarta-avalon-excalibur/assembly/demo/src/java/org/apache/excalibur/playground/BasicComponent.xinfo
  
  Index: BasicComponent.xinfo
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/demo/src/java/org/apache/excalibur/playground/BasicComponent.xinfo,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- BasicComponent.xinfo	7 Jul 2002 23:06:39 -0000	1.4
  +++ BasicComponent.xinfo	18 Jul 2002 16:57:00 -0000	1.5
  @@ -6,12 +6,14 @@
   <component-info>
   
     <component>
  -    <!-- the component name -->
       <name>basic-component</name>
     </component>
   
  +  <context>
  +    <entry key="location"/>
  +  </context>
  +
     <services>
  -    <!-- services that this component provides --> 
       <service> 
         <service-ref type="org.apache.excalibur.playground.BasicService"/>
       </service> 
  
  
  
  1.2       +14 -1     jakarta-avalon-excalibur/assembly/demo/src/java/org/apache/excalibur/playground/BasicComponent.xprofile
  
  Index: BasicComponent.xprofile
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/demo/src/java/org/apache/excalibur/playground/BasicComponent.xprofile,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- BasicComponent.xprofile	7 Jul 2002 04:43:35 -0000	1.1
  +++ BasicComponent.xprofile	18 Jul 2002 16:57:00 -0000	1.2
  @@ -1,6 +1,19 @@
   <?xml version="1.0"?>
   
   <profiles>
  -   <component/>
  +   
  +   <!-- 
  +   A packaged profile is equivalent to a compoent declaration inside a container, 
  +   except that it is provided by a component type.  A PACKAGED profiles take priority
  +   over an IMPLICIT profile. An EXPLICIT profile declared inside a container defintion

  +   will take priority over PACKAGED profiles.
  +   -->
  + 
  +   <component name="basic">
  +     <context class="org.apache.excalibur.playground.BasicContext">
  +       <entry key="location">Paris</entry>
  +     </context>
  +   </component>
  +
   </profiles>
   
  
  
  
  1.13      +28 -11    jakarta-avalon-excalibur/assembly/src/etc/kernel.xml
  
  Index: kernel.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/etc/kernel.xml,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- kernel.xml	18 Jul 2002 03:40:11 -0000	1.12
  +++ kernel.xml	18 Jul 2002 16:57:00 -0000	1.13
  @@ -90,7 +90,7 @@
           -->
   
           <context>
  -          <entry name="location" value="Paris"/>
  +          <entry key="location" value="Paris"/>
           </context>
   
           <!--
  @@ -142,16 +142,33 @@
          -->
   
          <!--
  -       <component name="test" class="org.apache.avalon.merlin.DefaultContainer">
  -         <configuration>
  -          <container>
  -           <classpath>
  -             <fileset dir="dist">
  -               <include name="demo.jar"/>
  -             </fileset>
  -           </classpath>
  -          </container>
  -        </configuration>
  +       <component name="test" class="org.apache.avalon.merlin.kernel.DefaultKernel">
  +
  +         <context>
  +
  +           <import as="classloader">
  +              <classpath>
  +                <fileset dir="dist">
  +                  <include name="demo.jar"/>
  +                </fileset>
  +              </classpath>
  +           </import>
  +
  +           <import key="logging" as="logging"/>
  +
  +           <import as="descriptor">
  +             <kernel name="embedded">
  +               <container name="root-embedded">
  +                 <classpath>
  +                   <fileset dir="dist">
  +                     <include name="demo.jar"/>
  +                   </fileset>
  +                 </classpath>
  +               </container>
  +             </kernel>
  +           </import>
  +         </context>
  +
          </component>
          -->
   
  
  
  
  1.5       +2 -2      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.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ResourceProvider.java	18 Jul 2002 03:40:11 -0000	1.4
  +++ ResourceProvider.java	18 Jul 2002 16:57:00 -0000	1.5
  @@ -199,7 +199,7 @@
       public Context createContext( Profile profile )
           throws Exception
       {
  -        return profile.getContext();
  +        return profile.getContext().getContext( m_classloader, null );
       }
   
       /**
  
  
  
  1.7       +6 -7      jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/Profile.java
  
  Index: Profile.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/Profile.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- Profile.java	18 Jul 2002 03:40:11 -0000	1.6
  +++ Profile.java	18 Jul 2002 16:57:00 -0000	1.7
  @@ -131,7 +131,7 @@
       /**
        * The configuration for component (if any).
        */
  -    private final Context m_context;
  +    private final ContextDirective m_context;
   
       /**
        * The logging descriptor.
  @@ -163,7 +163,7 @@
       public Profile( final String name,
                              final Parameters parameters,
                              final Configuration configuration,
  -                           final Context context,
  +                           final ContextDirective context,
                              final CategoryDescriptor loggers,
                              final Type type,
                              final boolean enabled,
  @@ -244,12 +244,11 @@
       }
   
       /**
  -     * Return the Context for profile.  This operation may be changed to a 
  -     * ContextDirective in the near future.
  +     * Return the context directive for the profile.  
        *
  -     * @return the Context  for component.
  +     * @return the ContextDirective for the profile.
        */
  -    public Context getContext()
  +    public ContextDirective getContext()
       {
           return m_context;
       }
  
  
  
  1.1                  jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/ContextDirective.java
  
  Index: ContextDirective.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included  with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.excalibur.merlin.model;
  
  import java.util.Map;
  import java.util.Hashtable;
  import java.lang.reflect.Constructor;
  
  import org.apache.avalon.framework.context.Context;
  import org.apache.avalon.framework.context.DefaultContext;
  import org.apache.avalon.framework.context.ContextException;
  
  
  /**
   * A context descriptor declares the context creation criteria for 
   * the context instance and context entries.
   * 
   * <p><b>XML</b></p>
   * <p>A context directive may contain multiple import statements.  Each import
   * 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="base"/&gt;
   *       &lt;entry key="<font color="darkred">location</font>" value="Paris"/&gt;
   *    <font color="gray">&lt;/context&gt;</font>
   * </pre>
   *
   * @see Entry
   * @author <a href="mailto:mcconnell@apache.org">Stephen McConnell</a>
   * @version $Revision: 1.1 $ $Date: 2002/07/18 16:57:00 $
   */
  public class ContextDirective 
  {
  
      public static final String DEFAULT_CONTEXT_CLASS = 
        "org.apache.avalon.framework.context.DefaultContext";
  
     /**
      * The set of entry directives.
      */
      private final Entry[] m_entries;
  
     /**
      * The set of entry directives.
      */
      private final String m_classname;
  
     /**
      * Cached reference to created context value.
      */
      private Context m_context;
  
     /**
      * Creation of a new context directive.
      * @param location the filename of the logging destination
      */
      public ContextDirective( final Entry[] entries )
      {
          this( DEFAULT_CONTEXT_CLASS, entries );
      }
  
     /**
      * Creation of a new file target.
      * @param classname the context implementation class
      * @param parameters the context implementation constructor arguments
      * @param entries the context entry descriptors
      */
      public ContextDirective( final String classname, final Entry[] entries )
      {
          m_classname = classname;
          m_entries = entries;
      }
  
     /**
      * Return the classname of the context implementation to use.
      * @return the classname
      */
      public String getClassname()
      {
          return m_classname;
      }
  
     /**
      * Return the set of entry directives.
      * @return the entries
      */
      public Entry[] getEntries()
      {
          return m_entries;
      }
  
     /**
      * Returns the context object based on the context directives.
      * @param parent a possibly null parent context
      * @return the context object
      */
      public Context getContext( ClassLoader loader, Context parent ) throws ModelException
      {
          if( m_context != null )
            return m_context;
  
          final String classname = getClassname();
          Class clazz;
          try
          {
              clazz = loader.loadClass( classname );
          }
          catch( ClassNotFoundException cnfe )
          {
              throw new ModelException(
                  "Could not find context class " + classname, cnfe );
          }
  
          Map map = new Hashtable();
          try
          {
              Constructor constructor = clazz.getConstructor(
                  new Class[]{Map.class, Context.class} );
              m_context = (Context)constructor.newInstance( new Object[]{map, parent} );
          }
          catch( Throwable e )
          {
              throw new ModelException(
                  "Unexpected exception while creating context form "
                  + classname, e );
          }
  
          Entry[] entries = getEntries();
          for( int i=0; i<entries.length; i++ )
          {
              Entry entry = entries[i];
              final String key = entry.getKey();
              try
              {
                  final Object value = entry.getValue( loader );
                  map.put( key, value );
              }
              catch( Throwable e )
              {
                  final String error =
                    "Unable to create the context entry for the key: " + key;
                  throw new ModelException( error, e );
              }
          }
  
          if( m_context instanceof DefaultContext )
          {
              ((DefaultContext)m_context).makeReadOnly();
          }
          return m_context;
      }
  }
  
  
  
  1.1                  jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/Entry.java
  
  Index: Entry.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included  with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.excalibur.merlin.model;
  
  
  /**
   * A entry descriptor declares the context entry creation criteria for 
   * a single context entry instance.
   * 
   * <p><b>XML</b></p>
   * <p>A entry may container either (a) body content, or (b) a set of constructor
   * parameters to be applied as arguments to a constructor of the supplied classname.</p>
   * <pre>
   *    &lt;entry key="<font color="darkred">location</font>"&gt;<font
color="darkred">Paris</font>&lt/entry&gt;;
   *    &lt;entry key="<font color="darkred">home</font>" class="<font
color="darkred">java.io.File</font>"&gt;<font color="darkred">../home</font>&lt/entry&gt;;
   *    &lt;entry key="<font color="darkred">special</font>" class="<font
color="darkred">MyObjectCLass</font>"&gt;
   *      &lt;parameter"&gt;<font color="darkred">Paris</font>&lt/parameter&gt;
   *      &lt;parameter class="<font color="darkred">java.io.File</font>"&gt;<font
color="darkred">../home</font>&lt/parameter&gt;;
   *    &lt;/entry&gt; 
   * </pre>
   *
   * @see Parameter
   * @see ContextDirective
   * @author <a href="mailto:mcconnell@apache.org">Stephen McConnell</a>
   * @version $Revision: 1.1 $ $Date: 2002/07/18 16:57:00 $
   */
  public class Entry extends Parameter
  {
     /**
      * The entry key.
      */
      private final String m_key;
  
     /**
      * Creation of a new entry directive.
      * @param key the entry key
      * @param classname the classname of the entry implementation
      * @param parameters implementation class constructor parameter directives
      */
      public Entry( final String key, final String classname, final String value )
      {
          super( classname, value );
  
          if( null == key )
            throw new NullPointerException("key");
  
          m_key = key;
      }
  
     /**
      * Creation of a new entry directive.
      * @param key the entry key
      * @param classname the classname of the entry implementation
      * @param parameters implementation class constructor parameter directives
      */
      public Entry( final String key, final String classname, final Parameter[] parameters
)
      {
          super( classname, parameters );
  
          if( null == key )
            throw new NullPointerException("key");
  
          m_key = key;
      }
  
     /**
      * Return the context key.
      * @return the key
      */
      public String getKey()
      {
          return m_key;
      }
  }
  
  
  
  1.1                  jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/ModelException.java
  
  Index: ModelException.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.excalibur.merlin.model;
  
  import org.apache.avalon.framework.CascadingException;
  
  /**
   * Exception to indicate that there was a model related error.
   *
   * @author <a href="mailto:mcconnell@apache.org">Stephen McConnell</a>
   * @version $Revision: 1.1 $ $Date: 2002/07/18 16:57:00 $
   */
  public final class ModelException
      extends CascadingException
  {
  
      /**
       * Construct a new <code>ModelException</code> instance.
       *
       * @param message The detail message for this exception.
       */
      public ModelException( final String message )
      {
          this( message, null );
      }
  
      /**
       * Construct a new <code>ModelException</code> instance.
       *
       * @param message The detail message for this exception.
       * @param throwable the root cause of the exception
       */
      public ModelException( final String message, final Throwable throwable )
      {
          super( message, throwable );
      }
  }
  
  
  
  
  1.1                  jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/ModelRuntimeException.java
  
  Index: ModelRuntimeException.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.excalibur.merlin.model;
  
  import org.apache.avalon.framework.CascadingRuntimeException;
  
  /**
   * Exception to indicate that there was a model related runtime error.
   *
   * @author <a href="mailto:mcconnell@apache.org">Stephen McConnell</a>
   * @version $Revision: 1.1 $ $Date: 2002/07/18 16:57:00 $
   */
  public final class ModelRuntimeException
      extends CascadingRuntimeException
  {
  
      /**
       * Construct a new <code>ModelRuntimeException</code> instance.
       *
       * @param message The detail message for this exception.
       */
      public ModelRuntimeException( final String message )
      {
          this( message, null );
      }
  
      /**
       * Construct a new <code>ModelRuntimeException</code> instance.
       *
       * @param message The detail message for this exception.
       * @param throwable the root cause of the exception
       */
      public ModelRuntimeException( final String message, final Throwable throwable )
      {
          super( message, throwable );
      }
  }
  
  
  
  
  1.1                  jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/Parameter.java
  
  Index: Parameter.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included  with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.excalibur.merlin.model;
  
  import java.lang.reflect.Constructor;
  
  
  /**
   * A <code>Parameter</code> represents a single constructor typed argument value.
 A parameter
   * container a classname (default value of <code>java.lang.String</code>) and
possible sub-parameters.
   * A parameter's value is established by creating a new instance using the parameter's classname,

   * together with the values directived from the sub-sidiary parameters as constructor arguments.
   * 
   * <p><b>XML</b></p>
   * <p>A parameter is a nested structure containing a string value or contructor parameter
arguments.</p>
   * <pre>
   *    <font color="gray">&lt;-- Simple parameter declaration --&gt;</font>
   *
   *    &lt;parameter&gt;<font color="darkred">London</font>"/parameter&gt;
   *
   *    <font color="gray">&lt;-- Typed parameter declaration --&gt;</font>
   *
   *    &lt;parameter class="<font color="darkred">java.io.File</font>"&gt;<font
color="darkred">./home</font>&lt;/parameter&gt;
   *
   *    <font color="gray">&lt;-- Multi-argument constructor parameter declaration
--&gt;</font>
   * 
   *    &lt;parameter class="<font color="darkred">MyClass</font>"&gt;
   *       &lt;parameter class="<font color="darkred">java.io.File</font>"><font
color="darkred">./home</font>&lt;/parameter&gt;
   *       &lt;parameter&gt;<font color="darkred">London</font>"/&gt;
   *    &lt;/parameter&gt;
   * </pre>
   *
   * @author <a href="mailto:mcconnell@apache.org">Stephen McConnell</a>
   * @version $Revision: 1.1 $ $Date: 2002/07/18 16:57:00 $
   */
  public class Parameter
  {
      //      <parameter>Paris</parameter>
      //      <parameter class="java.io.File">
      //         <parameter>./home</parameter>
      //      </parameter>
  
     /**
      * The classname to use as the parameter implementation class (defaults to java.lang.String)
      */ 
      private final String m_classname;
  
     /**
      * The derived value.
      */
      private Object m_value;
  
     /**
      * The sub-parameters from which the value for this parameter may be derived.
      */
      private final Parameter[] m_parameters;
  
     /**
      * Creation of a new parameter using the default <code>java.lang.String</code>

      * type and a supplied value.
      *
      * @param value the string value
      */
      public Parameter( final String value )
      {
          m_parameters = new Parameter[0];
          m_classname = "java.lang.String";
          m_value = value;
      }
  
     /**
      * Creation of a new entry directive using a supplied classname and value.
      * @param classname the classname of the parameter
      * @param value the parameter constructor value
      */
      public Parameter( final String classname, final String value )
      {
          if( null == classname )
            throw new NullPointerException("classname");
          if( null == value )
            throw new NullPointerException("value");
  
          m_parameters = new Parameter[]{ new Parameter( value ) };
          m_classname = classname;
      }
  
     /**
      * Creation of a new entry directive.
      * @param key the entry key
      * @param classname the classname of the entry implementation
      * @param parameters implementation class constructor parameter directives
      */
      public Parameter( final String classname, final Parameter[] parameters )
      {
          if( null == classname )
            throw new NullPointerException("classname");
  
          m_classname = classname;
          m_parameters = parameters;
      }
  
     /**
      * Return the classname of the parameter implementation to use.
      * @return the classname
      */
      public String getClassname()
      {
          return m_classname;
      }
  
     /**
      * Return the classname of the parameter implementation to use.
      * @return the classname
      */
      Class getParameterClass( ClassLoader loader ) throws ModelException
      {
          final String classname = getClassname();
          try
          {
              return loader.loadClass( classname );
          }
          catch( final ClassNotFoundException e )
          {
              if( classname.equals( "int" ) )
              {
                  return int.class;
              }
              else if( classname.equals( "short" ) )
              {
                  return short.class;
              }
              else if( classname.equals( "long" ) )
              {
                  return long.class;
              }
              else if( classname.equals( "byte" ) )
              {
                  return byte.class;
              }
              else if( classname.equals( "double" ) )
              {
                  return double.class;
              }
              else if( classname.equals( "byte" ) )
              {
                  return byte.class;
              }
              else if( classname.equals( "float" ) )
              {
                  return float.class;
              }
              else if( classname.equals( "char" ) )
              {
                  return char.class;
              }
              else if( classname.equals( "char" ) )
              {
                  return char.class;
              }
              else if( classname.equals( "boolean" ) )
              {
                  return boolean.class;
              }
              else
              {
                  throw new ModelRuntimeException(
                    "Could not locate the parameter implemetation for class: '" 
                    + m_classname + "'.", e );
              }
          }
      }
  
     /**
      * Return the derived parameter value.
      * @return the value
      */
      public Object getValue( ClassLoader loader ) throws ModelException
      {
          if( m_value != null )
            return m_value;
  
          if( m_parameters.length == 0 )
          {
               try
               {
                   m_value = getParameterClass( loader ).newInstance();
                   return m_value;
               }
               catch( InstantiationException e )
               {
                   final String error = "Unable to instantiate instance of class: " + m_classname;
                   throw new ModelException( error, e );
               }
               catch( IllegalAccessException e )
               {
                   final String error = 
                     "Cannot access null constructor for the class: '" 
                     + m_classname + "'.";
                   throw new ModelException( error, e );
               }
          }
          else
          {
               Class[] params = new Class[ m_parameters.length ];
               for( int i=0; i<m_parameters.length; i++ )
               {
                   try
                   {
                       params[i] = m_parameters[i].getParameterClass( loader );
                   }
                   catch( Throwable e )
                   {
                       final String error = "Unable to resolve sub-parameter class: " 
                         + m_parameters[i].getClassname() 
                         + " inside the parameter " + m_classname;
                       throw new ModelException( error, e );
                   }
               }
  
               Object[] values = new Object[ m_parameters.length ];
               for( int i=0; i<m_parameters.length; i++ )
               {
                   
                   try
                   {
                       values[i] = m_parameters[i].getValue( loader );
                   }
                   catch( Throwable e )
                   {
                       final String error = "Unable to instantiate sub-parameter for value:
" 
                         + m_parameters[i].getClassname() 
                         + " inside the parameter " + m_classname;
                       throw new ModelException( error, e );
                   }
               }
  
               Constructor constructor;
               try
               {
                   constructor = getParameterClass( loader ).getConstructor( params );
               }
               catch( NoSuchMethodException e )
               {
                   final String error = 
                     "Supplied parameters in " + m_classname 
                     + " do not match an available constructor.";
                   throw new ModelException( error, e );
               }
  
               
               try
               {
                   m_value = constructor.newInstance( values );
                   return m_value;
               }
               catch( InstantiationException e )
               {
                   final String error = 
                     "Unable to instantiate an instance of a multi-parameter constructor for
class: '" 
                     + m_classname + "'.";
                   throw new ModelException( error, e );
               }
               catch( IllegalAccessException e )
               {
                   final String error = 
                     "Cannot access multi-parameter constructor for the class: '" 
                     + m_classname + "'.";
                   throw new ModelException( error, e );
               }
               catch( Throwable e )
               {
                   final String error = 
                     "Unexpected error while attmpting to instantiate a multi-parameter constructor
"
                     + "for the class: '" + m_classname + "'.";
                   throw new ModelException( error, e );
               }
          }
      }
  }
  
  
  
  1.5       +71 -9     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.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- XMLProfileCreator.java	13 Jul 2002 21:28:18 -0000	1.4
  +++ XMLProfileCreator.java	18 Jul 2002 16:57:00 -0000	1.5
  @@ -24,6 +24,9 @@
   import org.apache.excalibur.meta.ConfigurationBuilder;
   import org.apache.excalibur.merlin.model.Profile;
   import org.apache.excalibur.merlin.model.CategoryDescriptor;
  +import org.apache.excalibur.merlin.model.ContextDirective;
  +import org.apache.excalibur.merlin.model.Entry;
  +import org.apache.excalibur.merlin.model.Parameter;
   import org.apache.excalibur.configuration.ContextFactory;
   import org.xml.sax.InputSource;
   
  @@ -80,9 +83,10 @@
   
               CategoryDescriptor loggers = new CategoryDescriptor( 
                 type.getInfo().getName(), null, null );
  +            ContextDirective context = new ContextDirective( new Entry[0] );
   
               return new Profile[]{ 
  -               new Profile( null, null, null, null, loggers, type, true, Profile.IMPLICIT
 ) };
  +               new Profile( null, null, null, context, loggers, type, true, Profile.IMPLICIT
 ) };
           }
           for( int i=0; i<profiles.length; i++ )
           {
  @@ -99,20 +103,78 @@
   
       private Profile buildProfile( Type type, Configuration profile, int mode ) throws Exception
       {
  -        String name = null;
  -        if( mode == Profile.EXPLICIT )
  -        {
  -            name = profile.getAttribute("name");
  -        }
  +        final String name = profile.getAttribute("name");
           boolean enabled = profile.getAttributeAsBoolean( "enabled", true );
           Parameters params = Parameters.fromConfiguration( profile.getChild("parameters")
);
           Configuration config = profile.getChild("configuration");
           Configuration loggersConfig = profile.getChild("loggers");
           CategoryDescriptor loggers = createCategoryDescriptor( loggersConfig, name );
  -        Context context = ContextFactory.createContextFromConfiguration( 
  -          null, profile.getChild("context") );
  +        ContextDirective context = createContextDirective( profile.getChild("context")
);
           return new Profile( name, params, config, context, loggers, type, enabled, mode
 );
       }
  +
  +    public ContextDirective createContextDirective( Configuration config ) throws ConfigurationException
  +    {
  +        String classname = config.getAttribute( "class", ContextDirective.DEFAULT_CONTEXT_CLASS
);
  +        Entry[] entries = createEntries( config.getChildren("entry") );
  +        return new ContextDirective( classname, entries );
  +    }
  +
  +    public Entry[] createEntries( Configuration[] configs ) throws ConfigurationException
  +    {
  +        ArrayList list = new ArrayList();
  +        for( int i=0; i<configs.length; i++ )
  +        {
  +            Entry entry = createEntry( configs[i] );
  +            list.add( entry );
  +        }
  +        return (Entry[]) list.toArray( new Entry[0] );
  +    }
  +
  +    public Entry createEntry( Configuration config ) throws ConfigurationException
  +    {
  +        String key = config.getAttribute( "key" );
  +        String classname = config.getAttribute( "classname", "java.lang.String" );
  +        String value = config.getValue( null );
  +        if( value != null )
  +        {
  +            return new Entry( key, classname, value );
  +        }
  +        else
  +        {
  +            Configuration[] params = config.getChildren("parameter");
  +            Parameter[] parameters = createParameters( params );
  +            return new Entry( key, classname, parameters );
  +        }
  +    }
  +
  +    public Parameter[] createParameters( Configuration[] configs ) throws ConfigurationException
  +    {
  +        ArrayList list = new ArrayList();
  +        for( int i=0; i<configs.length; i++ )
  +        {
  +            Parameter parameter = createParameter( configs[i] );
  +            list.add( parameter );
  +        }
  +        return (Parameter[]) list.toArray( new Parameter[0] );
  +    }
  +
  +    public Parameter createParameter( Configuration config ) throws ConfigurationException
  +    {
  +        String classname = config.getAttribute( "classname", "java.lang.String" );
  +        String value = config.getValue( null );
  +        if( value != null )
  +        {
  +            return new Parameter( classname, value );
  +        }
  +        else
  +        {
  +            Configuration[] params = config.getChildren("parameter");
  +            Parameter[] parameters = createParameters( params );
  +            return new Parameter( classname, parameters );
  +        }
  +    }
  +
   
       public CategoryDescriptor createCategoryDescriptor( Configuration config, String fallback
) 
         throws ConfigurationException
  
  
  
  1.3       +4 -4      jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/info/builder/XMLTypeCreator.java
  
  Index: XMLTypeCreator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/info/builder/XMLTypeCreator.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XMLTypeCreator.java	12 Jul 2002 17:11:04 -0000	1.2
  +++ XMLTypeCreator.java	18 Jul 2002 16:57:00 -0000	1.3
  @@ -252,7 +252,7 @@
           throws ConfigurationException
       {
           final EntryDescriptor[] entrys =
  -            buildEntrys( context.getChildren( "entry" ) );
  +            buildEntries( context.getChildren( "entry" ) );
   
           final Properties attributes =
               buildAttributes( context.getChild( "attributes" ) );
  @@ -272,7 +272,7 @@
        * @return the created {@link EntryDescriptor}s
        * @throws ConfigurationException if an error occurs
        */
  -    private EntryDescriptor[] buildEntrys( final Configuration[] entrySet )
  +    private EntryDescriptor[] buildEntries( final Configuration[] entrySet )
           throws ConfigurationException
       {
           final ArrayList entrys = new ArrayList();
  @@ -297,7 +297,7 @@
           throws ConfigurationException
       {
           final String key = config.getAttribute( "key" );
  -        final String type = config.getAttribute( "type" );
  +        final String type = config.getAttribute( "type", "java.lang.String" );
           final boolean optional =
               config.getAttributeAsBoolean( "optional", false );
   
  
  
  

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


Mime
View raw message