avalon-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mcconn...@apache.org
Subject cvs commit: avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/lifestyle AbstractLifestyleHandler.java
Date Sat, 21 Dec 2002 09:26:34 GMT
mcconnell    2002/12/21 01:26:34

  Modified:    assembly/src/java/org/apache/avalon/assembly/appliance
                        Appliance.java DefaultAppliance.java
               assembly/src/java/org/apache/avalon/assembly/lifecycle
                        DefaultDeploymentService.java
                        DeploymentService.java
               assembly/src/java/org/apache/avalon/assembly/lifecycle/context
                        ContextualizationService.java
                        DefaultContextualizationService.java
               assembly/src/java/org/apache/avalon/assembly/lifecycle/disposal
                        ExtendedDisposalService.java
               assembly/src/java/org/apache/avalon/assembly/lifecycle/initialization
                        ExtendedInitializationService.java
               assembly/src/java/org/apache/avalon/assembly/lifestyle
                        AbstractLifestyleHandler.java
  Added:       assembly/src/java/org/apache/avalon/assembly/appliance
                        ContextBuilder.java
  Log:
  Context related cleanup.
  
  Revision  Changes    Path
  1.14      +15 -1     avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/appliance/Appliance.java
  
  Index: Appliance.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/appliance/Appliance.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- Appliance.java	21 Dec 2002 05:17:22 -0000	1.13
  +++ Appliance.java	21 Dec 2002 09:26:33 -0000	1.14
  @@ -55,6 +55,7 @@
   
   import org.apache.avalon.framework.activity.Initializable;
   import org.apache.avalon.framework.parameters.Parameters;
  +import org.apache.avalon.framework.context.Context;
   import org.apache.avalon.framework.configuration.Configuration;
   import org.apache.avalon.assembly.lifestyle.LifestyleException;
   import org.apache.avalon.assembly.lifecycle.AssemblyException;
  @@ -112,6 +113,12 @@
       Type getType();
   
       /**
  +     * Return the component class
  +     * @return the class
  +     */
  +    Class getComponentClass();
  +
  +    /**
        * Return the profile backing the appliance.
        * @return the profile that this appliance is managing
        */
  @@ -161,6 +168,13 @@
        * @return the Configuration for the appliance.
        */
       Configuration getConfiguration();
  +
  +   /**
  +    * Get the component context.
  +    *
  +    * @return the component context
  +    */
  +    Context getContext();
   
       /**
        * Return the context directive for the profile. A context directive
  
  
  
  1.18      +204 -78   avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/appliance/DefaultAppliance.java
  
  Index: DefaultAppliance.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/appliance/DefaultAppliance.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- DefaultAppliance.java	21 Dec 2002 05:17:22 -0000	1.17
  +++ DefaultAppliance.java	21 Dec 2002 09:26:33 -0000	1.18
  @@ -81,6 +81,7 @@
   import org.apache.avalon.meta.info.Type;
   import org.apache.avalon.meta.info.StageDescriptor;
   import org.apache.avalon.meta.info.LoggerDescriptor;
  +import org.apache.avalon.meta.info.ContextDescriptor;
   import org.apache.avalon.meta.model.Profile;
   import org.apache.avalon.meta.model.LoggingDirective;
   import org.apache.avalon.meta.model.ContextDirective;
  @@ -101,6 +102,8 @@
   
       protected static String PROTOCOL = "native";
   
  +    private static final ContextBuilder BUILDER = new ContextBuilder();
  +
       //=====================================================================
       // state
       //=====================================================================
  @@ -108,7 +111,7 @@
       /**
        * The profile.
        */
  -    private ApplianceContext m_context;
  +    private ApplianceContext m_applianceContext;
   
       /**
        * The lifestyle service from which the appliance lifestyle handler is established.
  @@ -121,11 +124,16 @@
       private AssemblyService m_assembly;
   
       /**
  -     * The appliance context.
  +     * The system context.
        */
       private Context m_system;
   
       /**
  +     * The derived component context.
  +     */
  +    private Context m_context;
  +
  +    /**
        * The lifestyle handler.
        */
       private LifestyleHandler m_handler;
  @@ -181,6 +189,16 @@
       */
       private String m_name;
   
  +   /**
  +    * The assembled state of the appliance.
  +    */
  +    private boolean m_assembled;
  +
  +   /**
  +    * The appliance target component class.
  +    */
  +    private Class m_class;
  +
       //==============================================================
       // constructor
       //==============================================================
  @@ -216,73 +234,34 @@
           }
   
           m_assembly = assembly;
  -        m_context = context;
  +        m_applianceContext = context;
           m_logger = logger;
           m_engine = engine;
           m_system = system;
   
  +        String classname = getType().getInfo().getClassname();
           try
           {
  -            m_domain = (String) m_system.get( "urn:assembly:domain" );
  +            m_class = engine.loadClass( classname );
           }
           catch( Throwable e )
           {
  -            m_domain = "localhost";
  +            final String error =
  +              "Cannot load class for appliance " + this 
  +              + " from classname: " + classname;
  +            throw new ApplianceException( error, e );
           }
  -
  -        m_name = context.getName();
  -
  -        m_path = m_context.getPartitionName() + m_name;
  -
  -        //
  -        // make sure that the deployment context is fully populated
  -        //
  -
  +   
           try
           {
  -            Map map = context.getDeploymentContext();
  -
  -            //
  -            // setup the name and the partition
  -            //
  -
  -            map.put( "urn:avalon:name", m_name );
  -            map.put( "urn:avalon:partition.name", m_context.getPartitionName() );
  -
  -            //
  -            // setup the home and working directory for the component
  -            //
  -
  -            File base = (File) system.get( "urn:assembly:home" );
  -            File dir = new File( base, "work" );
  -            dir.mkdirs();
  -            File home = new File( dir, m_path );
  -            File work = new File( home, "temp" );
  -            home.mkdir();
  -            work.mkdir();
  -            work.deleteOnExit();
  -            map.put( "urn:avalon:home", home );
  -            map.put( "urn:avalon:work", work );
  -
  -            //
  -            // assign the updated map as the deployment context
  -            //
  -
  -            m_deployment = map;
  -
  -        }
  -        catch( ContextException e )
  -        {
  -            final String error = "System context does not contain the entry 'urn:assembly:home'"
  -             + " in appliance: " + this;
  -            throw new IllegalStateException( error );
  +            m_domain = (String) m_system.get( "urn:assembly:domain" );
           }
           catch( Throwable e )
           {
  -            final String error = 
  -              "Unexpected exception while preparing deployment context in appliance: " + this;
  -            throw new ApplianceException( error, e );
  +            m_domain = "localhost";
           }
  +        m_name = context.getName();
  +        m_path = m_applianceContext.getPartitionName() + m_name;
   
           //
           // finally, create the lifestyle handler
  @@ -318,7 +297,16 @@
        */
       public Type getType()
       {
  -        return m_context.getType();
  +        return m_applianceContext.getType();
  +    }
  +
  +    /**
  +     * Return the component class
  +     * @return the class
  +     */
  +    public Class getComponentClass()
  +    {
  +        return m_class;
       }
   
      /**
  @@ -348,7 +336,7 @@
       */
       public String getPartitionName()
       {
  -        return m_context.getPartitionName();
  +        return m_applianceContext.getPartitionName();
       }
   
      /**
  @@ -360,6 +348,16 @@
       }
   
      /**
  +    * Get the component context.
  +    *
  +    * @return the component context
  +    */
  +    public Context getContext()
  +    {
  +        return m_context;
  +    }
  +
  +   /**
       * Get the deployment context. The deployment context includes
       * supplimentary context values provided by the client that can be
       * used by the context management framework during the creation 
  @@ -386,7 +384,7 @@
        */
       public ContextDirective getContextDirective()
       {
  -        return m_context.getContextDirective();
  +        return m_applianceContext.getContextDirective();
       }
   
       /**
  @@ -396,7 +394,7 @@
        */
       public Parameters getParameters()
       {
  -        return m_context.getParameters();
  +        return m_applianceContext.getParameters();
       }
   
       /**
  @@ -406,7 +404,7 @@
        */
       public Configuration getConfiguration()
       {
  -        return m_context.getConfiguration();
  +        return m_applianceContext.getConfiguration();
       }
   
       /**
  @@ -416,7 +414,7 @@
        */
       public Profile getProfile()
       {
  -        return m_context.getProfile();
  +        return m_applianceContext.getProfile();
       }
   
       /**
  @@ -428,7 +426,7 @@
        */
       public boolean getActivationPolicy()
       {
  -        return m_context.getActivationPolicy();
  +        return m_applianceContext.getActivationPolicy();
       }
   
       /**
  @@ -460,7 +458,140 @@
        */
       public LoggingDirective getLoggingDirective()
       {
  -        return m_context.getLoggingDirective();
  +        return m_applianceContext.getLoggingDirective();
  +    }
  +
  +   /**
  +    * Assemble the appliance.
  +    * @exception AssemblyException if an error occurs during appliance assembly
  +    */
  +    public void assemble() throws AssemblyException
  +    {
  +        if( m_assembled )
  +        {
  +            return;
  +        }
  +
  +        m_assembly.assemble( this );
  +        if( isContextEnabled() )
  +        {
  +            Map map = buildContextMap();
  +            m_context = buildContextObject( map );
  +        }
  +
  +        setEnabled( true );
  +        m_assembled = true;
  +    }
  +
  +    private boolean isContextEnabled()
  +    {
  +        if( getContextProvider() != null )
  +        {
  +            return true;
  +        }
  +        else
  +        {
  +            return Contextualizable.class.isAssignableFrom( m_class );
  +        }
  +    }
  +
  +   /**
  +    * Build the context map.
  +    * @exception AssemblyException if an error occurs during context creation
  +    */
  +    private Map buildContextMap() throws AssemblyException
  +    {
  +        ContextDescriptor descriptor = getType().getContext();
  +
  +        //
  +        // make sure that the deployment context is fully populated
  +        //
  +
  +        try
  +        {
  +            Map map = m_applianceContext.getDeploymentContext();
  +
  +            //
  +            // setup the name and the partition
  +            //
  +
  +            map.put( "urn:avalon:name", m_name );
  +            map.put( "urn:avalon:partition.name", m_applianceContext.getPartitionName() );
  +
  +            //
  +            // setup the home and working directory for the component
  +            //
  +
  +            File base = (File) m_system.get( "urn:assembly:home" );
  +            File dir = new File( base, "work" );
  +            dir.mkdirs();
  +            File home = new File( dir, m_path );
  +            File work = new File( home, "temp" );
  +            home.mkdir();
  +            work.mkdir();
  +            work.deleteOnExit();
  +            map.put( "urn:avalon:home", home );
  +            map.put( "urn:avalon:work", work );
  +
  +            //
  +            // assign the updated map as the deployment context
  +            //
  +
  +            m_deployment = map;
  +
  +        }
  +        catch( ContextException e )
  +        {
  +            final String error = "System context does not contain the entry 'urn:assembly:home'"
  +             + " in appliance: " + this;
  +            throw new IllegalStateException( error );
  +        }
  +        catch( Throwable e )
  +        {
  +            final String error = 
  +              "Unexpected exception while preparing deployment context in appliance: " + this;
  +            throw new AssemblyException( error, e );
  +        }
  +
  +        try
  +        {
  +            return BUILDER.buildContextMap( m_engine, this, m_deployment, m_system );
  +        }
  +        catch( Throwable e )
  +        {
  +            final String error = 
  +              "Unable to create context map in appliance: " + this;
  +            throw new AssemblyException( error, e );
  +        }
  +    }
  +
  +
  +   /**
  +    * Assemble the appliance.
  +    * @exception AssemblyException if an error occurs during appliance assembly
  +    */
  +    private Context buildContextObject( Map map ) throws AssemblyException
  +    {
  +        ContextDirective directive = getContextDirective();
  +        try
  +        {
  +            return BUILDER.createContextInstance( m_engine, directive, map );
  +        }
  +        catch( Throwable e )
  +        {
  +            final String error = 
  +              "Unable to create context carrier in appliance: " + this;
  +            throw new AssemblyException( error, e );
  +        }
  +    }
  +
  +
  +   /**
  +    * Disassemble the appliance.
  +    */
  +    public void disassemble()
  +    {
  +        m_assembly.disassemble( this );
       }
   
       /**
  @@ -556,6 +687,10 @@
       */
       public Object access( DependencyDescriptor dependency ) throws LifestyleException
       {
  +        if( !m_assembled )
  +        {
  +            throw new IllegalStateException( "assembly" );
  +        }
           return m_handler.access( dependency );
       }
   
  @@ -564,6 +699,10 @@
       */
       public Object access() throws LifestyleException
       {
  +        if( !m_assembled )
  +        {
  +            throw new IllegalStateException( "assembly" );
  +        }
           return m_handler.access();
       }
   
  @@ -573,6 +712,10 @@
       */
       public Object access( StageDescriptor stage ) throws LifestyleException
       {
  +        if( !m_assembled )
  +        {
  +            throw new IllegalStateException( "assembly" );
  +        }
           return m_handler.access( stage );
       }
   
  @@ -593,23 +736,6 @@
                 "Lifestyle handler raised a release error in appliance: " + this;
               throw new ApplianceRuntimeException( error, e );
           }
  -    }
  -
  -   /**
  -    * Assemble the appliance.
  -    * @exception AssemblyException if an error occurs during appliance assembly
  -    */
  -    public void assemble() throws AssemblyException
  -    {
  -        m_assembly.assemble( this );
  -    }
  -
  -   /**
  -    * Disassemble the appliance.
  -    */
  -    public void disassemble()
  -    {
  -        m_assembly.disassemble( this );
       }
   
       public String toString()
  
  
  
  1.1                  avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/appliance/ContextBuilder.java
  
  Index: ContextBuilder.java
  ===================================================================
  /*
  
   ============================================================================
                     The Apache Software License, Version 1.1
   ============================================================================
  
   Copyright (C) 1999-2002 The Apache Software Foundation. All rights reserved.
  
   Redistribution and use in source and binary forms, with or without modifica-
   tion, are permitted provided that the following conditions are met:
  
   1. Redistributions of  source code must  retain the above copyright  notice,
      this list of conditions and the following disclaimer.
  
   2. Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
  
   3. The end-user documentation included with the redistribution, if any, must
      include  the following  acknowledgment:  "This product includes  software
      developed  by the  Apache Software Foundation  (http://www.apache.org/)."
      Alternately, this  acknowledgment may  appear in the software itself,  if
      and wherever such third-party acknowledgments normally appear.
  
   4. The names "Jakarta", "Apache Avalon", "Avalon Framework" and
      "Apache Software Foundation"  must not be used to endorse or promote
      products derived  from this  software without  prior written
      permission. For written permission, please contact apache@apache.org.
  
   5. Products  derived from this software may not  be called "Apache", nor may
      "Apache" appear  in their name,  without prior written permission  of the
      Apache Software Foundation.
  
   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  
   This software  consists of voluntary contributions made  by many individuals
   on  behalf of the Apache Software  Foundation. For more  information on the
   Apache Software Foundation, please see <http://www.apache.org/>.
  
  */
  
  package org.apache.avalon.assembly.appliance;
  
  import java.util.Map;
  import java.lang.reflect.Constructor;
  import java.util.HashMap;
  
  import org.apache.avalon.framework.activity.Initializable;
  import org.apache.avalon.framework.context.Contextualizable;
  import org.apache.avalon.framework.context.Context;
  import org.apache.avalon.framework.context.DefaultContext;
  import org.apache.avalon.framework.context.ContextException;
  import org.apache.avalon.framework.logger.AbstractLogEnabled;
  import org.apache.avalon.framework.service.ServiceManager;
  import org.apache.avalon.framework.service.DefaultServiceManager;
  import org.apache.avalon.framework.service.ServiceException;
  import org.apache.avalon.framework.service.Serviceable;
  import org.apache.avalon.assembly.appliance.Appliance;
  import org.apache.avalon.assembly.engine.RepositoryManager;
  import org.apache.avalon.assembly.engine.EngineClassLoader;
  import org.apache.avalon.assembly.service.UnknownServiceException;
  import org.apache.avalon.meta.model.Entry;
  import org.apache.avalon.meta.model.Import;
  import org.apache.avalon.meta.model.Profile;
  import org.apache.avalon.meta.model.ContextDirective;
  import org.apache.avalon.meta.info.ContextDescriptor;
  import org.apache.avalon.meta.info.EntryDescriptor;
  import org.apache.avalon.meta.info.ExtensionDescriptor;
  import org.apache.avalon.meta.info.ReferenceDescriptor;
  import org.apache.avalon.meta.info.Service;
  
  /**
   * The context service provides support for the contextualization of a 
   * supplied component instance relative to the criteria establihsed under a 
   * supplied appliance.
   *
   * @author <a href="mailto:avalon-dev@jakarta.apache.org">Avalon Development Team</a>
   * @version $Revision: 1.1 $ $Date: 2002/12/21 09:26:33 $
   */
  class ContextBuilder
  {
      /**
       * Internal utility to construct a context map using a descriptor, directive and source
       * context instances.
       *
       * @param engine the service management engine
       * @param appliance the appliance containing the context dependency declarations
       * @param map supplimentary context values supplied by the client
       * @param system th system context
       * @return a context map containing only those context entries required under the
       *   supplied descriptor
       * @exception Exception if a required context value cannot be resolved or an error
       *   occurs during context value creation
       */
      static Map buildContextMap( 
        EngineClassLoader engine, Appliance appliance, Map map, Context system )
        throws ContextException
      {
          //
          // get the type descriptor for the context and the profile
          // directive
          //
  
          ContextDescriptor descriptor = appliance.getType().getContext();
          ContextDirective directive = appliance.getContextDirective();
          RepositoryManager repository = engine.getRepository();
  
          //
          // create a temporary context object to hold both the system context
          // and any context values supplied by the client
          //
  
          Context source = new DefaultContext( map, system );
  
          //
          // construct a new map based on the target components requirements
          //
  
          return buildContext( engine, repository, descriptor, directive, source );
      }
  
  
      /**
       * Internal utility to construct a context map using a descriptor, directive and source
       * context instances.
       *
       * @param classloader the classloader
       * @param descriptor the target component context descriptor
       * @param directive the target component context directives
       * @param context the context containing source values
       * @return a context map containing only those context entries required under the
       *   supplied descriptor
       * @exception ContextException if a required context value cannot be resolved
       */
      private static Map buildContext( 
        ClassLoader classloader, RepositoryManager repository, ContextDescriptor descriptor, 
        ContextDirective directive, Context context )
        throws ContextException
      {
  
          //
          // Create a new empty map that we will populate based on the descriptor
          // criteria, with assistance from the supplied directive, using the supplied 
          // context as the source
          //
  
          Map map = new HashMap();
  
          //
          // get the entries declared by the context descriptor plus and 
          // entries declared within a service definition if one exists
          //
  
          EntryDescriptor[] entries = getMergedEntries( repository, descriptor );
         
          //
          // commence population of the map
          //
  
          for( int i = 0; i < entries.length; i++ )
          {
              EntryDescriptor entry = entries[ i ];
              String key = entry.getKey();
  
              //
              // if the entry is already in the supplied context then use it
              //
  
              // ### converge next two operation into a if then else on 
              // system context entries with the next line as the final else
              // case
  
              Object object = getContextValue( context, key );
              //object = resolveStandardKey( appliance, context, key );
  
              //
              // If the context value is unresolved, try to handle resolution
              // using an import directive supplied under the directive
              //
  
              if( object == null )
              {
  
                  //
                  // check if the profile declares an import directive
                  // for the context
                  //
  
                  if( directive != null )
                  {
                      Import imp = directive.getImport( key );
                      if( imp != null )
                      {
                          String name = imp.getImportName();
                          object = getContextValue( context, name );
                          if( object == null )
                          {
                              if( entry.isRequired() )
                              {
                                  final String error =
                                    "Import directive for key: " + key + " via name: " + name
                                    + " cannot be resolved.";
                                  throw new ContextException( error );
                              }
                          }
                      }
  
                      //
                      // if the context value is unresolved, try to construct a context
                      // value using an entry constructor directive
                      //
  
                      if( object == null )
                      {
                          //
                          // check if the directive declares a context value constructor
                          //
  
                          Entry ent = directive.getEntry( key );
                          if( ent != null )
                          {
                              try
                              {
                                  object = ent.getValue( classloader, map );
                              }
                              catch( Throwable e )
                              {
                                  final String error =
                                    "Rresolution error for context entry directive: "
                                    + ent;
                                  throw new ContextException( error, e );
                              }
  
                              if( object == null )
                              {
                                  final String error =
                                    "Unable to build a context value for the entry: '" 
                                    + key + "' type: "
                                    + entry.getType();
  
                                  if( entry.isRequired() )
                                  {
                                      throw new ContextException( error );
                                  }
                              }
                          }
                      }
                  }
              }
  
              //
              // finally, if the object is still null, and its not optional, then
              // throw an exception, otherwise, add the object to the context
              //
  
              if( object != null )
              {
                  try
                  {
                      boolean ok = objectImplementsType( classloader, object, entry.getType() );
                      if( ok )
                      {
                          map.put( key, object );
                      }
                      else
                      {
                          final String error =
                              "Object resolved for the key '" + key + "' of class '"
                              + object.getClass().getName() + "' does not implement the type '"
                              + entry.getType();
                          throw new ContextException( error );
                      }
                  }
                  catch( ClassNotFoundException cnfe )
                  {
                      final String error =
                          "Context criteria for the key '" + key + "' specifies an unknown type '"
                          + entry.getType() + "'.";
                      throw new ContextException( error );
                  }
              }
              else
              {
                  if( entry.isRequired() )
                  {
                      final String error =
                        "Unable to resolve a context value for the entry: '" 
                        + key + "' type: "
                        + entry.getType();
                      throw new ContextException( error );
                  }
              }
          }
  
          return map;
      }
  
      private static EntryDescriptor[] getMergedEntries( 
        RepositoryManager repository, ContextDescriptor descriptor ) 
        throws IllegalArgumentException
      {
          try
          {
              Service service = 
                repository.getServiceManager().getService( descriptor.getReference() );
              EntryDescriptor[] entries = service.getEntries();
              EntryDescriptor[] result = descriptor.merge( service.getEntries() );
              return result;
          }
          catch( UnknownServiceException e )
          {
              return descriptor.getEntries();
          }
      }
  
      /**
       * Internal utility to get a context value or null if the context key
       * is unknown.
       * @param context the context object
       * @param key the context key to lookup
       * @return the context value derived from the key or null if the key is unknown
       */
      protected static Object getContextValue( Context context, String key )
      {
          if( context == null )
          {
              return null;
          }
  
          try
          {
              return context.get( key );
          }
          catch( ContextException e )
          {
              return null;
          }
      }
  
      /**
       * Check whether the specified value is compatible with specified type.
       *
       * @param value the value
       * @param type the desired type
       * @return true if value is compatible with type, false otherwise
       */
      private static boolean objectImplementsType( 
           ClassLoader classloader, final Object value, final String type )
         throws ClassNotFoundException
      {
          if( type == null )
          {
              throw new NullPointerException( "type" );
          }
  
          if( value == null )
          {
              throw new NullPointerException( "value" );
          }
  
          final Class clazz = value.getClass();
          final Class typeClass = classloader.loadClass( type );
          return typeClass.isAssignableFrom( clazz );
      }
  
      /**
       * Internal utility to construct a custom context instance.  The object returned
       * is based on the declarations in the supplied directive and defaults to the 
       * {@link DefaultContext} class.
       *
       * @param classloader the classloader to use
       * @param directive the context creation directive
       * @param map a map to apply to the created instance under its constructor
       * @return a context object created in accordance with the supplied directive
       * @exception ContextException if a required context value cannot be resolved or an error
       *   occurs during context value creation
       */
      static Context createContextInstance( ClassLoader classloader, ContextDirective directive, Map map ) 
        throws ContextException
      {
  
          //
          // check for meta-data about how to create a specialized context type
          // and if its present then create it using the standard constructor 
          // pattern otherwise use the DefaultContext implementation
          //
  
          if( directive != null )
          {
              final String classname = directive.getClassname();
              Class clazz;
              try
              {
                  clazz = classloader.loadClass( classname );
              }
              catch( ClassNotFoundException cnfe )
              {
                  throw new ContextException(
                      "Could not find context class " + classname, cnfe );
              }
  
              if( !Context.class.isAssignableFrom( clazz ) )
              {
                  final String error = 
                    "Context directive references a type that is not derived from "
                    + Context.class.getName();
                  throw new ContextException( error );
              }
  
              try
              {
                  Constructor constructor = clazz.getConstructor(
                      new Class[]{Map.class, Context.class} );
                  return (Context) constructor.newInstance( new Object[]{map, null} );
              }
              catch( NoSuchMethodException e )
              {
                  final String error = 
                    "Custom context class: [" + classname 
                    + "] does not implement the required constructor pattern <init>( Map, Context ).";
   
                  throw new ContextException( error, e );
              }
              catch( Throwable e )
              {
                  throw new ContextException(
                      "Unexpected exception while creating context from "
                      + classname, e );
              }
          }
          else
          {
              return new DefaultContext( map );
          }
          
      }
  }
  
  
  
  1.11      +3 -16     avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/lifecycle/DefaultDeploymentService.java
  
  Index: DefaultDeploymentService.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/lifecycle/DefaultDeploymentService.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- DefaultDeploymentService.java	21 Dec 2002 05:17:22 -0000	1.10
  +++ DefaultDeploymentService.java	21 Dec 2002 09:26:34 -0000	1.11
  @@ -297,7 +297,7 @@
       * @param context the containment context
       * @return the deployed component
       */
  -    public Object deploy( Appliance appliance, ClassLoader classloader, Context context ) 
  +    public Object deploy( Appliance appliance, ClassLoader classloader ) 
         throws DeploymentException
       {
           if( !m_initialized )
  @@ -313,10 +313,6 @@
           {
               throw new NullPointerException( "classloader" );
           }
  -        if( context == null )
  -        {
  -            throw new NullPointerException( "context" );
  -        }
   
           //
           // make sure we are deploying a fully assembled appliance
  @@ -359,7 +355,7 @@
               m_logging.enableLogging( appliance, instance );
               m_configuration.configure( appliance, instance );
               m_parameters.parameterize( appliance, instance );
  -            m_contextualization.contextualize( appliance, instance, context );
  +            m_contextualization.contextualize( appliance, instance );
               m_composition.service( appliance, instance );
               m_initialization.initialize( appliance, instance );
               m_startup.start( appliance, instance );
  @@ -473,9 +469,6 @@
           {
               DefaultContextualizationService service = new DefaultContextualizationService();
               service.enableLogging( getLogger().getChildLogger( "context" ) );
  -            service.contextualize( m_context );
  -            service.service( m_manager );
  -            service.initialize();
               return service;
           }
           catch( Throwable e )
  @@ -510,9 +503,6 @@
               {
                   ExtendedInitializationService service = new ExtendedInitializationService();
                   service.enableLogging( getLogger().getChildLogger( "init" ) );
  -                service.contextualize( m_context );
  -                service.service( m_manager );
  -                service.initialize();
                   return service;
               }
               else
  @@ -554,9 +544,6 @@
               {
                   ExtendedDisposalService service = new ExtendedDisposalService();
                   service.enableLogging( getLogger().getChildLogger( "disposal" ) );
  -                service.contextualize( m_context );
  -                service.service( m_manager );
  -                service.initialize();
                   return service;
               }
               else
  
  
  
  1.4       +2 -3      avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/lifecycle/DeploymentService.java
  
  Index: DeploymentService.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/lifecycle/DeploymentService.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DeploymentService.java	17 Dec 2002 11:35:50 -0000	1.3
  +++ DeploymentService.java	21 Dec 2002 09:26:34 -0000	1.4
  @@ -77,10 +77,9 @@
       * @param classloader the classloader to use
       * @param appliance the appliance to deploy
       * @param logger the logging channel to assign to the component
  -    * @param context the containment context
       * @return the deployed component
       */
  -    Object deploy( Appliance appliance, ClassLoader classloader, Context context ) 
  +    Object deploy( Appliance appliance, ClassLoader classloader ) 
         throws DeploymentException;
   
      /**
  
  
  
  1.2       +2 -2      avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/lifecycle/context/ContextualizationService.java
  
  Index: ContextualizationService.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/lifecycle/context/ContextualizationService.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ContextualizationService.java	29 Nov 2002 13:04:55 -0000	1.1
  +++ ContextualizationService.java	21 Dec 2002 09:26:34 -0000	1.2
  @@ -70,6 +70,6 @@
       * @param object the object to contextualize
       */
       void contextualize( 
  -      Appliance appliance, Object object, Context context ) 
  +      Appliance appliance, Object object ) 
         throws ContextException;
   }
  
  
  
  1.9       +11 -88    avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/lifecycle/context/DefaultContextualizationService.java
  
  Index: DefaultContextualizationService.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/lifecycle/context/DefaultContextualizationService.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- DefaultContextualizationService.java	20 Dec 2002 11:54:28 -0000	1.8
  +++ DefaultContextualizationService.java	21 Dec 2002 09:26:34 -0000	1.9
  @@ -60,7 +60,6 @@
   import org.apache.avalon.framework.context.ContextException;
   import org.apache.avalon.framework.logger.AbstractLogEnabled;
   import org.apache.avalon.assembly.appliance.Appliance;
  -import org.apache.avalon.assembly.lifecycle.ContextHandler;
   import org.apache.avalon.meta.model.Entry;
   import org.apache.avalon.meta.model.Import;
   import org.apache.avalon.meta.model.Profile;
  @@ -76,44 +75,19 @@
    * @author <a href="mailto:avalon-dev@jakarta.apache.org">Avalon Development Team</a>
    * @version $Revision$ $Date$
    */
  -public class DefaultContextualizationService extends ContextHandler 
  +public class DefaultContextualizationService extends AbstractLogEnabled 
     implements ContextualizationService
   {
       //==============================================================
  -    // state
  -    //==============================================================
  -
  -    private Context m_context;
  -
  -    //==============================================================
  -    // Contextualizable
  -    //==============================================================
  -
  -   /**
  -    * <p>Application of a runtime context to this appliance.
  -    * The supplied context contains standard and container specific context
  -    * entries and may be used by the context service in establish the 
  -    * context to apply to components.</p>
  -    * @param context the containerment context
  -    */
  -    public void contextualize( Context context ) throws ContextException
  -    {
  -        super.contextualize( context );
  -        m_context = context;
  -    }
  -
  -    //==============================================================
       // ContextService
       //==============================================================
   
      /**
  -    * Contextualization of a supplied object in accordance with the profile 
  -    * directives assiacted with the supplied appliance.
  +    * Contextualization of a supplied object.
       * @param appliance the appliace
  -    * @param object the object to configure
  +    * @param object the object to contextualize
       */
  -    public void contextualize( 
  -      Appliance appliance, Object object, Context context ) throws ContextException
  +    public void contextualize( Appliance appliance, Object object ) throws ContextException
       {
           if( appliance == null )
           {
  @@ -124,44 +98,18 @@
               throw new NullPointerException( "object" );
           }
   
  -        Appliance provider = appliance.getContextProvider();
  +        Context context = appliance.getContext();
   
  -        if(( provider != null ) || (object instanceof Contextualizable ))
  +        if( context != null )
           {
   
  -            //
  -            // the component is requesting contextualization in one form or another
  -            //
  -
  -            if( getLogger().isDebugEnabled() )
  -            {
  -                final String message = appliance.toString();
  -                getLogger().debug( message );
  -            }
  - 
  -            Context source;
  -            if( appliance.getDeploymentContext() != null )
  -            {
  -                source = new DefaultContext( appliance.getDeploymentContext(), context );
  -            }
  -            else
  -            {
  -                source = context;
  -            }
  -
  -            //
  -            // populate the "standard" context with the actual context entries that 
  -            // the component is requesting
  -            //
  -
  -            Context standard =
  -              createStandardContext( appliance, source );
  +            Appliance provider = appliance.getContextProvider();
   
               //
               // resolve the contextualization strategy - either its a custom 
               // interface and handler, or its classic Avalon - try custom first
               //
  -
  +  
               if( provider != null )
               {
                   if( getLogger().isDebugEnabled() )
  @@ -175,7 +123,7 @@
                   try
                   {
                       Contextualization handler = (Contextualization) provider.access();
  -                    handler.contextualize( object, standard );
  +                    handler.contextualize( object, context );
                       return;
                   }
                   catch( Throwable e )
  @@ -192,7 +140,7 @@
   
               try
               {
  -                ((Contextualizable)object).contextualize( standard );
  +                ((Contextualizable)object).contextualize( context );
               }
               catch( ContextException e )
               {
  @@ -213,31 +161,6 @@
                     "Unexpected exception during contextualization of target: " + appliance;
                   throw new ContextException( error, e );
               }
  -        }
  -    }
  -
  -    /**
  -     * Create a new Context for component.
  -     *
  -     * @param profile the profile
  -     * @param context a supplimentary context usable during import resolution
  -     * @return a new Context for service
  -     * @throws DeploymentException if an error occurs in standard
  -     *   context creation
  -     */
  -    public Context createStandardContext( Appliance appliance, Context context )
  -        throws ContextException
  -    {
  -        try
  -        {
  -            return buildContext( appliance, context );
  -        }
  -        catch( Throwable e )
  -        {
  -            final String error =
  -              "Unexpected error while preparing standard context for the appliance: " 
  -              + appliance;
  -            throw new ContextException( error, e );
           }
       }
   }
  
  
  
  1.9       +7 -51     avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/lifecycle/disposal/ExtendedDisposalService.java
  
  Index: ExtendedDisposalService.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/lifecycle/disposal/ExtendedDisposalService.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- ExtendedDisposalService.java	21 Dec 2002 03:28:37 -0000	1.8
  +++ ExtendedDisposalService.java	21 Dec 2002 09:26:34 -0000	1.9
  @@ -53,16 +53,11 @@
   import java.util.Map;
   import java.util.Hashtable;
   
  -import org.apache.avalon.framework.logger.AbstractLogEnabled;
  -import org.apache.avalon.framework.activity.Disposable;
  -import org.apache.avalon.framework.context.Context;
  -import org.apache.avalon.framework.context.DefaultContext;
  -import org.apache.avalon.framework.context.ContextException;
  -import org.apache.avalon.framework.context.Contextualizable;
   import org.apache.avalon.assembly.appliance.Appliance;
  -import org.apache.avalon.assembly.lifecycle.ContextHandler;
   import org.apache.avalon.assembly.lifecycle.DeploymentException;
  -import org.apache.avalon.assembly.engine.Engine;
  +import org.apache.avalon.framework.activity.Disposable;
  +import org.apache.avalon.framework.context.Context;
  +import org.apache.avalon.framework.logger.AbstractLogEnabled;
   import org.apache.avalon.meta.info.StageDescriptor;
   import org.apache.avalon.meta.info.Type;
   import org.apache.avalon.meta.info.ExtensionDescriptor;
  @@ -78,26 +73,9 @@
    * @author <a href="mailto:avalon-dev@jakarta.apache.org">Avalon Development Team</a>
    * @version $Revision$ $Date$
    */
  -public class ExtendedDisposalService extends ContextHandler implements DisposalService
  -{
  -    Context m_context;
   
  -    //==============================================================
  -    // Contextualizable
  -    //==============================================================
  -
  -   /**
  -    * <p>Application of a runtime context to this appliance.
  -    * The supplied context contains standard and container specific context
  -    * entries and may be used by the context service in establish the 
  -    * context to apply to components.</p>
  -    * @param context the containerment context
  -    */
  -    public void contextualize( Context context ) throws ContextException
  -    {
  -        super.contextualize( context );
  -        m_context = context;
  -    }
  +public class ExtendedDisposalService extends AbstractLogEnabled implements DisposalService
  +{
   
      /**
       * Dispose of the supplied object.
  @@ -106,11 +84,6 @@
       */
       public void dispose( Appliance appliance, Object object ) 
       {
  -        if( m_context == null )
  -        {
  -            throw new IllegalStateException("context");
  -        }
  -
           if( appliance == null )
           {
               throw new NullPointerException("appliance");
  @@ -178,23 +151,6 @@
                   throw new DeploymentException( error );
               }
   
  -            Context context;
  -            try
  -            {
  -                Type type = provider.getType();
  -                final ExtensionDescriptor descriptor = type.getExtension( stage );
  -                context = createContext( provider, descriptor, m_context );
  -            }
  -            catch( Throwable e )
  -            {
  -                final String error = 
  -                  "Extension handler context establishment error on appliance: '"
  -                  + appliance 
  -                  + "' under stage: '" + stage
  -                  + "' for provider: '" + provider;
  -                throw new DeploymentException( error, e );
  -            }
  -
               Creator handler = null;
               try
               {
  @@ -212,7 +168,7 @@
   
               try
               {
  -                handler.destroy( object, context );
  +                handler.destroy( object, appliance.getContext() );
                   provider.release( handler );
               }
               catch( Throwable e )
  
  
  
  1.10      +3 -45     avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/lifecycle/initialization/ExtendedInitializationService.java
  
  Index: ExtendedInitializationService.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/lifecycle/initialization/ExtendedInitializationService.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- ExtendedInitializationService.java	21 Dec 2002 03:28:37 -0000	1.9
  +++ ExtendedInitializationService.java	21 Dec 2002 09:26:34 -0000	1.10
  @@ -60,7 +60,6 @@
   import org.apache.avalon.framework.context.ContextException;
   import org.apache.avalon.framework.context.Contextualizable;
   import org.apache.avalon.assembly.appliance.Appliance;
  -import org.apache.avalon.assembly.lifecycle.ContextHandler;
   import org.apache.avalon.assembly.lifecycle.DeploymentException;
   import org.apache.avalon.assembly.engine.Engine;
   import org.apache.avalon.meta.info.StageDescriptor;
  @@ -78,27 +77,8 @@
    * @author <a href="mailto:avalon-dev@jakarta.apache.org">Avalon Development Team</a>
    * @version $Revision$ $Date$
    */
  -public class ExtendedInitializationService extends ContextHandler implements InitializationService
  +public class ExtendedInitializationService extends AbstractLogEnabled implements InitializationService
   {
  -    Context m_context;
  -
  -    //==============================================================
  -    // Contextualizable
  -    //==============================================================
  -
  -   /**
  -    * <p>Application of a runtime context to this appliance.
  -    * The supplied context contains standard and container specific context
  -    * entries and may be used by the context service in establish the 
  -    * context to apply to components.</p>
  -    * @param context the containerment context
  -    */
  -    public void contextualize( Context context ) throws ContextException
  -    {
  -        super.contextualize( context );
  -        m_context = context;
  -    }
  -
      /**
       * Initialize a supplied object in accordance with the parameters 
       * associated with the supplied appliance.
  @@ -108,11 +88,6 @@
       public void initialize( Appliance appliance, Object object ) 
         throws Exception
       {
  -        if( m_context == null )
  -        {
  -            throw new IllegalStateException("context");
  -        }
  -
           if( appliance == null )
           {
               throw new NullPointerException("appliance");
  @@ -158,23 +133,6 @@
                       throw new DeploymentException( error );
                   }
   
  -                Context context;
  -                try
  -                {
  -                    Type type = provider.getType();
  -                    final ExtensionDescriptor descriptor = type.getExtension( stage );
  -                    context = createContext( provider, descriptor, m_context );
  -                }
  -                catch( Throwable e )
  -                {
  -                    final String error = 
  -                      "Extension handler context establishment error on appliance: '"
  -                      + appliance 
  -                      + "' under stage: '" + stage
  -                      + "' for provider: '" + provider;
  -                    throw new DeploymentException( error, e );
  -                }
  -
                   Creator handler = null;
                   try
                   {
  @@ -192,7 +150,7 @@
   
                   try
                   {
  -                    handler.create( object, context );
  +                    handler.create( object, appliance.getContext() );
                       provider.release( handler );
                   }
                   catch( Throwable e )
  
  
  
  1.14      +4 -92     avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/lifestyle/AbstractLifestyleHandler.java
  
  Index: AbstractLifestyleHandler.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/lifestyle/AbstractLifestyleHandler.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- AbstractLifestyleHandler.java	21 Dec 2002 03:28:38 -0000	1.13
  +++ AbstractLifestyleHandler.java	21 Dec 2002 09:26:34 -0000	1.14
  @@ -80,7 +80,7 @@
    * @author <a href="mailto:avalon-dev@jakarta.apache.org">Avalon Development Team</a>
    * @version $Revision$ $Date$
    */
  -public abstract class AbstractLifestyleHandler extends ContextHandler implements Serviceable, Initializable, Disposable, LifestyleHandler
  +public abstract class AbstractLifestyleHandler extends AbstractLogEnabled implements Serviceable, Initializable, Disposable, LifestyleHandler
   {
       //==============================================================
       // state
  @@ -137,7 +137,6 @@
       */
       public void contextualize( Context context ) throws ContextException
       {
  -        super.contextualize( context );
           m_classloader = (ClassLoader) context.get( "urn:avalon:classloader" );
           m_appliance = (Appliance) context.get( "urn:assembly:appliance.target" );
           try
  @@ -171,7 +170,6 @@
       */
       public void service( ServiceManager manager ) throws ServiceException
       {
  -        super.service( manager );
           m_deployment = (DeploymentService) manager.lookup( "urn:assembly:lifecycle.deployment" );
       }
   
  @@ -188,7 +186,6 @@
       */
       public void initialize() throws Exception 
       {
  -        super.initialize();
           if( getLogger() == null )
           {
               throw new LifestyleException("logger");
  @@ -276,7 +273,7 @@
       {
           try
           {
  -            return m_deployment.deploy( m_appliance, m_classloader, m_context );
  +            return m_deployment.deploy( m_appliance, m_classloader );
           }
           catch( Throwable e )
           {
  @@ -357,7 +354,7 @@
               Accessor extension = (Accessor) provider.access( stage );
               try
               {
  -                Context context = getStageContext( stage );
  +                Context context = getAppliance().getContext();
                   if( access )
                   {
                       extension.access( object, context );
  @@ -379,33 +376,6 @@
           }
       }
   
  -    private Context getStageContext( StageDescriptor stage )
  -    {
  -        if( m_map == null )
  -        {
  -            try
  -            {
  -                m_map = createExtensionContextMap( m_appliance, m_context );
  -            }
  -            catch( Throwable e )
  -            {
  -                final String error = 
  -                  "Internal error while attempting to construct the extension context map for appliance: "
  -                  + m_appliance;
  -                throw new LifestyleRuntimeException( error, e );
  -            }
  -        }
  -        Context context = (Context) m_map.get( stage );
  -        if( context == null )
  -        {
  -            final String error = 
  -              "Null context returned in appliance: " + m_appliance
  -              + " for the stage: " + stage;
  -            throw new NullPointerException( error );
  -        }
  -        return context;
  -    }
  -
       private Class getImplementationClass( Appliance appliance )
       {
           try
  @@ -420,64 +390,6 @@
                + m_appliance;
               throw new LifestyleRuntimeException( error, e );
           }
  -    }
  -
  -    /**
  -     * Handles creation of a map of context entries keyed by extension stage. Context
  -     * entries are built using the supplied deployment context argument together
  -     * with profile directives relative to type constraints.
  -     *
  -     * @param profile the profile
  -     * @param context the deployment context
  -     * @return the map of context entries keyed by stage
  -     * @exception LifestyleException if an error occurs while preparing the map
  -     */
  -    private Map createExtensionContextMap( Appliance appliance, Context context )
  -        throws LifestyleException
  -    {
  -        if( appliance == null )
  -        {
  -            throw new NullPointerException( "appliance" );
  -        }
  -        if( context == null )
  -        {
  -            throw new NullPointerException( "context" );
  -        }
  -
  -        //
  -        // build the set of extension context instances
  -        //
  -
  -        Profile profile = appliance.getProfile();
  -        Hashtable table = new Hashtable();
  -        StageDescriptor[] stages = profile.getType().getStages();
  -        for( int i = 0; i < stages.length; i++ )
  -        {
  -            StageDescriptor stage = stages[ i ];
  -            Appliance provider = appliance.getExtensionProvider( stage );
  -            if( provider == null )
  -            {
  -                throw new NullPointerException( "provider" );
  -            }
  -
  -            Type type = provider.getType();
  -            final ExtensionDescriptor ext = type.getExtension( stage );
  -            try
  -            {
  -                Context extensionContext = createContext( provider, ext, context );
  -                table.put( stage, extensionContext );
  -            }
  -            catch( Throwable e )
  -            {
  -                final String error = 
  -                  "Unexpected error while creating context for extension: "
  -                    + provider
  -                    + " in appliance " + appliance
  -                    + " for stage: " + stage;
  -                throw new LifestyleException( error, e );
  -            }
  -        }
  -        return table;
       }
   
      /**
  
  
  

--
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