mcconnell    2003/02/27 19:45:07

  Modified:    assembly/src/java/org/apache/avalon/assembly/appliance
                        DefaultApplianceFactory.java
                        DefaultApplianceRepository.java
  Log:
  Upgraded support for loading of custom appliance classes as first-class 
components.
  
  Revision  Changes    Path
  1.11      +115 -63   
avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/appliance/DefaultApplianceFactory.java
  
  Index: DefaultApplianceFactory.java
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/appliance/DefaultApplianceFactory.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- DefaultApplianceFactory.java      27 Feb 2003 23:06:38 -0000      1.10
  +++ DefaultApplianceFactory.java      28 Feb 2003 03:45:07 -0000      1.11
  @@ -197,48 +197,6 @@
                "Could not create appliance factory using : " + classname;
               throw new ApplianceException( error, e );
           }
  -
  -
  -        /*
  -            Class clazz;
  -            try
  -            {
  -                clazz = loader.loadClass( classname );
  -            }
  -            catch( ClassNotFoundException cnfe )
  -            {
  -                throw new ApplianceException(
  -                  "Could not find appliance factory class " + classname, 
cnfe );
  -            }
  -
  -            ApplianceFactory factory;
  -            try
  -            {
  -                factory = (ApplianceFactory) clazz.newInstance();
  -                if( factory instanceof LogEnabled )
  -                {
  -                    ((LogEnabled)factory).enableLogging( logger );
  -                }
  -                if( factory instanceof Contextualizable )
  -                {
  -                    DefaultLocator context = new DefaultLocator( system  );
  -                    context.put( "urn:assembly:appliance.repository", 
repository );
  -                    ((Contextualizable)factory).contextualize( context );
  -                }
  -                if( factory instanceof Initializable )
  -                {
  -                    ((Initializable)factory).initialize();
  -                }
  -                return factory;
  -            }
  -            catch( Throwable e )
  -            {
  -                final String error = 
  -                  "Appliance factory creation failure for the class: " + 
classname;
  -                throw new ApplianceException( error, e );
  -            }
  -        }
  -        */
       }
   
      /**
  @@ -279,6 +237,8 @@
   
       private ApplianceRepository m_repository;
   
  +    private PoolManager m_pool;
  +
       
//---------------------------------------------------------------------------
       // contextualization
       
//---------------------------------------------------------------------------
  @@ -287,6 +247,7 @@
       {
           m_system = context;
           m_repository = (ApplianceRepository) context.get( 
"urn:assembly:appliance.repository" );
  +        m_pool = (PoolManager) context.get( "urn:assembly:threads.manager" );
       }
   
       
//---------------------------------------------------------------------------
  @@ -328,21 +289,102 @@
               throw new NullPointerException( "logger" );
           }
   
  -        Appliance appliance = getApplianceInstance( engine, context );
  -
  -        appliance.enableLogging( logger );
  -
  +        //
  +        // we are building a custom appliance
  +        // 
  +        
  +        LifestyleService lifestyle = createLifestyleService( engine, m_pool 
);
  +        DefaultLocator locator = null;
           try
           {
  -            PoolManager pool = (PoolManager) system.get( 
"urn:assembly:threads.manager" );
  -
  -            DefaultLocator locator = new DefaultLocator( context );
  +            locator = new DefaultLocator( context );
               locator.put( "urn:assembly:engine", engine );
  -            locator.put( "urn:assembly:lifestyle.service", 
createLifestyleService( engine, pool ) );
  +            locator.put( "urn:assembly:lifestyle.service", lifestyle );
               locator.put( "urn:assembly:appliance.context", context );
               locator.put( "urn:assembly:appliance.system", system );
               locator.put( "urn:assembly:appliance.repository", m_repository );
  +            locator.put( "urn:assembly:threads.manager", m_pool );
               locator.makeReadOnly();
  +        }
  +        catch( Throwable e )
  +        {
  +            final String error = 
  +              "Unexpected error while building appliance context.";
  +            throw new ApplianceException( error, e );
  +        }
  +
  +        String classname = context.getApplianceClassname();
  +        if(( classname == null ) || ( classname.equals( 
DefaultAppliance.class.getName() ) ) )
  +        {
  +
  +            //
  +            // bootstrap the appliance using DefaultAppliance
  +            //
  +
  +            DefaultAppliance appliance = new DefaultAppliance();
  +            appliance.enableLogging( logger );
  +            try
  +            {
  +                appliance.contextualize( locator );
  +                appliance.initialize();
  +                return appliance;
  +            }
  +            catch( Throwable e )
  +            {
  +                final String error = 
  +                  "Unable to create appliance from context: " + 
context.getName();
  +                throw new ApplianceException( error, e );
  +            }
  +        }
  +        else
  +        {
  +            //
  +            // its a custom appliance so in this case we use an apppliance to
  +            // construct the appliance
  +            //
  +
  +            try
  +            {
  +                Type type = engine.getRepository().getTypeManager().getType( 
classname );
  +                Profile profile = 
engine.getRepository().getProfileManager().getProfile( type );
  +                DefaultApplianceContext cntx = new DefaultApplianceContext( 
profile );
  +                cntx.put( "urn:assembly:engine", engine );
  +                cntx.put( "urn:assembly:lifestyle.service", lifestyle );
  +                cntx.put( "urn:assembly:appliance.context", context );
  +                cntx.put( "urn:assembly:appliance.system", system );
  +                cntx.put( "urn:assembly:appliance.repository", m_repository 
);
  +                cntx.put( "urn:assembly:threads.manager", m_pool );
  +                cntx.makeReadOnly();
  +
  +                Appliance appliance = engine.createAppliance( cntx, false );
  +                appliance.assemble( new DependencyGraph() );
  +                Object object = appliance.resolve( this );
  +                if( object instanceof Appliance )
  +                {
  +                    return (Appliance) object;
  +                }
  +                else
  +                {
  +                    final String error = 
  +                      "Supplied classname '" + classname 
  +                      + "' does not implement the Appliance interface.";
  +                    throw new ApplianceException( error );
  +                }
  +            }
  +            catch( Throwable e )
  +            {
  +                final String error = 
  +                  "Could not create appliance using : " + classname;
  +                throw new ApplianceException( error, e );
  +            }
  +        }
  +
  +        /*
  +        Appliance appliance = getApplianceInstance( engine, context );
  +        appliance.enableLogging( logger );
  +
  +        try
  +        {
               appliance.contextualize( locator );
               appliance.initialize();
           }
  @@ -353,6 +395,7 @@
               throw new ApplianceException( error, e );
           }
           return appliance;
  +        */
       }
   
      /**
  @@ -389,19 +432,28 @@
       * @param pool the pool manager
       * @return the lifestyle service
       */
  -    private LifestyleService createLifestyleService( EngineClassLoader 
engine, PoolManager pool ) throws Exception
  +    private LifestyleService createLifestyleService( EngineClassLoader 
engine, PoolManager pool ) throws ApplianceException
       {
  -        DeploymentService deployment = createDeploymentService();
  -        DefaultLifestyleService lifestyle = new DefaultLifestyleService();
  -        lifestyle.enableLogging( getLogger().getChildLogger( "lifestyle" ) );
  -        DefaultLocator context = new DefaultLocator();
  -        context.put( "urn:assembly:pool-manager", pool );
  -        context.put( "urn:assembly:lifecycle.deployment", deployment );
  -        context.put( "urn:assembly:engine.classloader", engine );
  -        context.makeReadOnly();
  -        lifestyle.contextualize( context );
  -        lifestyle.initialize();
  -        return lifestyle;
  +        try
  +        {
  +            DeploymentService deployment = createDeploymentService();
  +            DefaultLifestyleService lifestyle = new 
DefaultLifestyleService();
  +            lifestyle.enableLogging( getLogger().getChildLogger( "lifestyle" 
) );
  +            DefaultLocator context = new DefaultLocator();
  +            context.put( "urn:assembly:pool-manager", pool );
  +            context.put( "urn:assembly:lifecycle.deployment", deployment );
  +            context.put( "urn:assembly:engine.classloader", engine );
  +            context.makeReadOnly();
  +            lifestyle.contextualize( context );
  +            lifestyle.initialize();
  +            return lifestyle;
  +        }
  +        catch( Throwable e )
  +        {
  +            final String error = 
  +             "Unexpected error during bootstrap lifecycle service creation.";
  +            throw new ApplianceException( error, e );
  +        }
       }
   
       private DeploymentService createDeploymentService() 
  
  
  
  1.5       +1 -2      
avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/appliance/DefaultApplianceRepository.java
  
  Index: DefaultApplianceRepository.java
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/appliance/DefaultApplianceRepository.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- DefaultApplianceRepository.java   23 Feb 2003 14:08:43 -0000      1.4
  +++ DefaultApplianceRepository.java   28 Feb 2003 03:45:07 -0000      1.5
  @@ -127,7 +127,6 @@
               }
               catch( Throwable e )
               {
  -                // should not happen
                   final String error =
                     "Unexpected error while creating a root URL for 
repository: " + name;
                   throw new ApplianceRuntimeException( error, e );
  
  
  

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

Reply via email to