donaldp     01/04/12 05:24:06

  Modified:    src/java/org/apache/phoenix/engine DefaultSarDeployer.java
                        DefaultServerApplication.java PhoenixKernel.java
               src/java/org/apache/phoenix/engine/blocks BlockDAG.java
               src/java/org/apache/phoenix/engine/facilities
                        DefaultComponentManagerBuilder.java
  Added:       src/java/org/apache/phoenix/engine ApplicationFactory.java
               src/java/org/apache/phoenix/engine/facilities/classmanager
                        PolicyClassLoader.java SarClassLoader.java
               src/java/org/apache/phoenix/engine/facilities/security
                        AbstractPolicy.java DefaultPolicy.java
  Removed:     src/java/org/apache/phoenix/engine ServerApplication.java
               src/java/org/apache/phoenix/engine/facilities
                        DefaultPolicy.java SarClassLoader.java
  Log:
  Removed ServerApplication interface and directly use Application interface.
  
  Migrate across the Avalon ClassLoader/Security components and place them with 
facilities that use them in sub-directory
  ie AbstractPolicy+DefaultPolicy->phoenix.engine.facilities.security
  ie PolicyClassLoader+SarClassLoader->phoenix.engine.facilities.classManager
  
  Revision  Changes    Path
  1.6       +6 -5      
jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/DefaultSarDeployer.java
  
  Index: DefaultSarDeployer.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/DefaultSarDeployer.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- DefaultSarDeployer.java   2001/04/12 05:32:54     1.5
  +++ DefaultSarDeployer.java   2001/04/12 12:23:58     1.6
  @@ -24,6 +24,7 @@
   import org.apache.avalon.Composer;
   import org.apache.avalon.DefaultComponentManager;
   import org.apache.avalon.DefaultContext;
  +import org.apache.avalon.atlantis.Application;
   import org.apache.avalon.atlantis.Kernel;
   import org.apache.avalon.camelot.AbstractCamelotDeployer;
   import org.apache.avalon.camelot.CamelotUtil;
  @@ -207,10 +208,10 @@
           addEntry( name, entry );
   
           final Kernel kernel = getKernel();
  -        ServerApplication serverApplication = null;
  +        Application application = null;
           try
           {
  -            serverApplication = (ServerApplication)kernel.getApplication( name );
  +            application = kernel.getApplication( name );
           }
           catch( final ContainerException ce )
           {
  @@ -229,7 +230,7 @@
           {
               final Configuration configuration = getConfigurationFor( file );
               final Configuration[] blocks = configuration.getChildren( "block" );
  -            handleBlocks( serverApplication, entry, blocks );
  +            handleBlocks( application, entry, blocks );
           }
           catch( final ComponentManagerException cme )
           {
  @@ -273,7 +274,7 @@
           return deployer;
       }
   
  -    protected void handleBlocks( final ServerApplication serverApplication,
  +    protected void handleBlocks( final Application application,
                                    final ServerApplicationEntry saEntry,
                                    final Configuration[] blocks )
           throws ComponentManagerException, ConfigurationException, 
DeploymentException
  @@ -326,7 +327,7 @@
               entry.setBlockInfo( info );
               entry.setConfiguration( block.getChild( "configuration" ) );
   
  -            try { serverApplication.add( name, entry ); }
  +            try { application.add( name, entry ); }
               catch( final ContainerException ce )
               {
                   throw new DeploymentException( "Error adding component to 
container", ce );
  
  
  
  1.9       +30 -29    
jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/DefaultServerApplication.java
  
  Index: DefaultServerApplication.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/DefaultServerApplication.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- DefaultServerApplication.java     2001/04/03 03:50:35     1.8
  +++ DefaultServerApplication.java     2001/04/12 12:23:59     1.9
  @@ -19,12 +19,13 @@
   import org.apache.avalon.DefaultComponentManager;
   import org.apache.avalon.DefaultContext;
   import org.apache.avalon.Initializable;
  +import org.apache.avalon.atlantis.Application;
   import org.apache.avalon.atlantis.ApplicationException;
   import org.apache.avalon.camelot.AbstractContainer;
  -import org.apache.avalon.camelot.pipeline.AvalonState;
   import org.apache.avalon.camelot.ContainerException;
   import org.apache.avalon.camelot.Entry;
   import org.apache.avalon.camelot.Factory;
  +import org.apache.avalon.camelot.pipeline.AvalonState;
   import org.apache.avalon.camelot.pipeline.ComponentBuilder;
   import org.apache.avalon.camelot.pipeline.ComponentManagerBuilder;
   import org.apache.avalon.camelot.pipeline.ConfigurationRepository;
  @@ -45,16 +46,16 @@
   import org.apache.phoenix.engine.facilities.DefaultContextBuilder;
   import org.apache.phoenix.engine.facilities.DefaultLogManager;
   import org.apache.phoenix.engine.facilities.DefaultLoggerBuilder;
  -import org.apache.phoenix.engine.facilities.DefaultPolicy;
  +import org.apache.phoenix.engine.facilities.security.DefaultPolicy;
   import org.apache.phoenix.engine.facilities.DefaultThreadManager;
  -import org.apache.phoenix.engine.facilities.SarClassLoader;
  +import org.apache.phoenix.engine.facilities.classmanager.SarClassLoader;
   import org.apache.phoenix.engine.phases.DefaultPhase;
   import org.apache.phoenix.engine.phases.Phase;
   import org.apache.phoenix.engine.phases.Traversal;
   import org.apache.phoenix.metainfo.DependencyDescriptor;
   
   /**
  - * This is the basic container of blocks. A server application 
  + * This is the basic container of blocks. A server application
    * represents an aggregation of blocks that act together to form
    * an application.
    *
  @@ -63,7 +64,7 @@
    */
   public class DefaultServerApplication
       extends AbstractContainer
  -    implements ServerApplication
  +    implements Application, Configurable, Contextualizable
   {
       protected HashMap                  m_phases           = new HashMap();
       protected BlockDAG                 m_dag              = new BlockDAG();
  @@ -103,11 +104,11 @@
           throws ConfigurationException
       {
           m_configuration = configuration;
  -    }    
  +    }
   
  -    public void init() 
  -        throws Exception 
  -    {        
  +    public void init()
  +        throws Exception
  +    {
           createComponents();
   
           //setup the component manager
  @@ -124,13 +125,13 @@
       {
           Phase phase = null;
   
  -        phase = new DefaultPhase( Phase.FORWARD, 
  +        phase = new DefaultPhase( Phase.FORWARD,
                                     new StartupPipeline(),
                                     AvalonState.BASE,
                                     AvalonState.RUNNING );
           m_phases.put( "startup", phase );
   
  -        phase = new DefaultPhase( Phase.REVERSE, 
  +        phase = new DefaultPhase( Phase.REVERSE,
                                     new ShutdownPipeline(),
                                     AvalonState.RUNNING,
                                     AvalonState.DISPOSED );
  @@ -151,8 +152,8 @@
       public void start()
           throws Exception
       {
  -        // load blocks 
  -        try 
  +        // load blocks
  +        try
           {
               getLogger().info( "Number of blocks to load: " + m_entries.size() );
               final Phase phase = (Phase)m_phases.get( "startup" );
  @@ -168,9 +169,9 @@
       public void stop()
           throws Exception
       {
  -    }    
  +    }
   
  -    public void dispose() 
  +    public void dispose()
           throws Exception
       {
           getLogger().info( "Number of blocks to unload: " + m_entries.size() );
  @@ -240,8 +241,8 @@
           setupComponent( object, null, null );
       }
   
  -    protected void setupComponent( final Component object, 
  -                                   final String logName, 
  +    protected void setupComponent( final Component object,
  +                                   final String logName,
                                      final Configuration configuration )
           throws Exception
       {
  @@ -275,7 +276,7 @@
           if( Phase.FORWARD == phase.getTraversal() )
           {
               final Iterator entries = list();
  -            while( entries.hasNext() ) 
  +            while( entries.hasNext() )
               {
                   final String name = (String)entries.next();
                   m_dag.walkGraph( name, phase );
  @@ -283,9 +284,9 @@
           }
           else if( Phase.REVERSE == phase.getTraversal() )
           {
  -            //TODO: 
  +            //TODO:
               final Iterator entries = list();
  -            while( entries.hasNext() ) 
  +            while( entries.hasNext() )
               {
                   final String name = (String)entries.next();
                   //m_dag.reverseWalkGraph( name, phase );
  @@ -295,7 +296,7 @@
           {
               //TODO: Does this make sense ????
               final Iterator entries = list();
  -            while( entries.hasNext() ) 
  +            while( entries.hasNext() )
               {
                   final String name = (String)entries.next();
                   final BlockEntry entry = (BlockEntry)getEntry( name );
  @@ -320,9 +321,9 @@
       }
   
       /**
  -     * Retrieve a list of RoleEntry objects that were specified 
  -     * in configuration file and verify they were expected based 
  -     * on BlockInfo file. Also verify that all entries specified 
  +     * Retrieve a list of RoleEntry objects that were specified
  +     * in configuration file and verify they were expected based
  +     * on BlockInfo file. Also verify that all entries specified
        * in BlockInfo file have been provided.
        *
        * @param entry the BlockEntry describing block
  @@ -337,10 +338,10 @@
           {
               final String role = roleEntrys[ i ].getRole();
               final DependencyDescriptor descriptor = 
entry.getBlockInfo().getDependency( role );
  -            
  +
               if( null == descriptor )
               {
  -                final String message = "Unknown dependency " + roleEntrys[ i 
].getName() + 
  +                final String message = "Unknown dependency " + roleEntrys[ i 
].getName() +
                       " with role " + role + " declared for Block " + name;
   
                   getLogger().warn( message );
  @@ -352,9 +353,9 @@
           final DependencyDescriptor[] dependencies = 
entry.getBlockInfo().getDependencies();
           for( int i = 0; i < dependencies.length; i++ )
           {
  -            final RoleEntry roleEntry = 
  +            final RoleEntry roleEntry =
                   entry.getRoleEntry( dependencies[ i ].getRole() );
  -            
  +
               if( null == roleEntry )
               {
                   final String message = "Dependency " + dependencies[ i ].getRole() +
  @@ -385,7 +386,7 @@
                                 m_componentBuilder );
           componentManager.put( 
"org.apache.avalon.camelot.pipeline.ComponentManagerBuilder",
                                 m_componentManagerBuilder );
  -        componentManager.put( 
"org.apache.avalon.camelot.pipeline.ConfigurationRepository", 
  +        componentManager.put( 
"org.apache.avalon.camelot.pipeline.ConfigurationRepository",
                                 m_configurationRepository );
   
           return componentManager;
  
  
  
  1.2       +28 -20    
jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/PhoenixKernel.java
  
  Index: PhoenixKernel.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/PhoenixKernel.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- PhoenixKernel.java        2001/04/12 05:32:54     1.1
  +++ PhoenixKernel.java        2001/04/12 12:23:59     1.2
  @@ -8,25 +8,27 @@
   package org.apache.phoenix.engine;
   
   import org.apache.avalon.Composer;
  -import org.apache.avalon.atlantis.Kernel;
  +import org.apache.avalon.Contextualizable;
   import org.apache.avalon.atlantis.AbstractKernel;
   import org.apache.avalon.atlantis.Application;
  +import org.apache.avalon.atlantis.Kernel;
   import org.apache.avalon.camelot.Entry;
  +import org.apache.avalon.configuration.Configurable;
   import org.apache.log.LogKit;
   
   /**
    * The ServerKernel is the core of the Phoenix system.
  - * The kernel is responsible for orchestrating low level services 
  - * such as loading, configuring and destroying blocks. It also 
  + * The kernel is responsible for orchestrating low level services
  + * such as loading, configuring and destroying blocks. It also
    * gives access to basic facilities such as scheduling sub-systems,
    * protected execution contexts, naming and directory services etc.
    *
  - * Note that no facilities are available until after the Kernel has been 
  + * Note that no facilities are available until after the Kernel has been
    * configured and initialized.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]">Peter Donald</a>
    */
  -public class PhoenixKernel 
  +public class PhoenixKernel
       extends AbstractKernel
       implements Kernel
   {
  @@ -35,11 +37,11 @@
       public PhoenixKernel()
       {
           m_entryClass = ServerApplicationEntry.class;
  -        m_applicationClass = ServerApplication.class;
  +        m_applicationClass = Application.class;
       }
   
  -    public void init() 
  -        throws Exception 
  +    public void init()
  +        throws Exception
       {
           System.out.println();
           System.out.println( BANNER );
  @@ -57,31 +59,37 @@
   
       /**
        * Prepare an application before it is initialized.
  -     * Overide to provide functionality. 
  +     * Overide to provide functionality.
        * Usually used to setLogger(), contextualize, compose, configure.
        *
        * @param name the name of application
  -     * @param entry the application entry 
  +     * @param entry the application entry
        * @param application the application instance
        * @exception Exception if an error occurs
        */
  -    protected void prepareApplication( final String name, 
  -                                       final Entry entry, 
  +    protected void prepareApplication( final String name,
  +                                       final Entry entry,
                                          final Application application )
           throws Exception
       {
           final ServerApplicationEntry saEntry = (ServerApplicationEntry)entry;
  -        final ServerApplication saApplication = (ServerApplication)application;
  +
  +        setupLogger( application, LogKit.getLoggerFor( name ) );
   
  -        setupLogger( saApplication, LogKit.getLoggerFor( name ) );
  -        saApplication.contextualize( saEntry.getContext() );
  -        
  -        if( saApplication instanceof Composer )
  -        { 
  -            ((Composer)saApplication).compose( saEntry.getComponentManager() );
  +        if( application instanceof Contextualizable )
  +        {
  +            ((Contextualizable)application).contextualize( saEntry.getContext() );
           }
   
  -        saApplication.configure( saEntry.getConfiguration() );
  +        if( application instanceof Composer )
  +        {
  +            ((Composer)application).compose( saEntry.getComponentManager() );
  +        }
  +
  +        if( application instanceof Configurable )
  +        {
  +            ((Configurable)application).configure( saEntry.getConfiguration() );
  +        }
       }
   
       protected void postAdd( final String name, final Entry entry )
  
  
  
  1.1                  
jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/ApplicationFactory.java
  
  Index: ApplicationFactory.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 file.
   */
  package org.apache.phoenix.engine;
  
  import org.apache.avalon.atlantis.Application;
  
  /**
   * This interface is used to create an Application.
   * The application created is usually specific to a particular kernel.
   *
   * Note this should eventually be moved to Atlantis.
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">Leo Simons</a>
   * @author <a href="mailto:[EMAIL PROTECTED]">Peter Donald</a>
   */
  public interface ApplicationFactory
  {
      /**
       * Create new Application.
       *
       * @return the new Application
       */
      Application createApplication();
  }
  
  
  
  1.6       +15 -15    
jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/blocks/BlockDAG.java
  
  Index: BlockDAG.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/blocks/BlockDAG.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- BlockDAG.java     2001/04/03 03:50:35     1.5
  +++ BlockDAG.java     2001/04/12 12:24:02     1.6
  @@ -12,9 +12,9 @@
   import org.apache.avalon.ComponentManager;
   import org.apache.avalon.ComponentManagerException;
   import org.apache.avalon.Composer;
  +import org.apache.avalon.atlantis.Application;
   import org.apache.avalon.camelot.ContainerException;
   import org.apache.phoenix.Block;
  -import org.apache.phoenix.engine.ServerApplication;
   import org.apache.phoenix.metainfo.DependencyDescriptor;
   import org.apache.phoenix.metainfo.ServiceDescriptor;
   
  @@ -27,12 +27,12 @@
       extends AbstractLoggable
       implements Composer
   {
  -    protected ServerApplication       m_serverApplication;
  +    protected Application       m_application;
   
       public void compose( final ComponentManager componentManager )
           throws ComponentManagerException
       {
  -        m_serverApplication = (ServerApplication)componentManager.
  +        m_application = (Application)componentManager.
               lookup( "org.apache.phoenix.engine.ServerApplication" );
       }
   
  @@ -51,7 +51,7 @@
       protected BlockEntry getBlockEntry( final String name )
           throws Exception
       {
  -        return (BlockEntry)m_serverApplication.getEntry( name );
  +        return (BlockEntry)m_application.getEntry( name );
           //catch( final ContainerException ce )
       }
   
  @@ -61,8 +61,8 @@
        * @param name name of BlockEntry
        * @param entry the BlockEntry
        */
  -    protected void visitDependencies( final String name, 
  -                                      final BlockEntry entry, 
  +    protected void visitDependencies( final String name,
  +                                      final BlockEntry entry,
                                         final BlockVisitor visitor )
           throws Exception
       {
  @@ -74,10 +74,10 @@
               final ServiceDescriptor serviceDescriptor = descriptors[ i 
].getService();
               final String role = descriptors[ i ].getRole();
   
  -            getLogger().debug( "Traversing dependency of " + name + " with role " + 
role + 
  +            getLogger().debug( "Traversing dependency of " + name + " with role " + 
role +
                                  " to provide service " + serviceDescriptor.getName() 
);
   
  -            //roleEntry should NEVER be null as it is checked when 
  +            //roleEntry should NEVER be null as it is checked when
               //entry is added to container
               final RoleEntry roleEntry = entry.getRoleEntry( role );
               final String dependencyName = roleEntry.getName();
  @@ -97,18 +97,18 @@
           throws Exception
       {
           getLogger().debug( "Traversing reverse dependencies for " + name );
  -        
  -        final Iterator entries = m_serverApplication.list();
  -        while( entries.hasNext() ) 
  +
  +        final Iterator entries = m_application.list();
  +        while( entries.hasNext() )
           {
               final String blockName = (String)entries.next();
  -            final BlockEntry entry = getBlockEntry( blockName );           
  +            final BlockEntry entry = getBlockEntry( blockName );
               final RoleEntry[] roles = entry.getRoleEntrys();
   
               for( int i = 0; i < roles.length; i++ )
               {
                   final String depends = roles[ i ].getName();
  -                
  +
                   if( depends.equals( name ) )
                   {
                       getLogger().debug( "Attempting to unload block " + blockName +
  @@ -121,13 +121,13 @@
           }
       }
   
  -    protected void visitBlock( final String name, 
  +    protected void visitBlock( final String name,
                                  final BlockEntry entry,
                                  final BlockVisitor visitor,
                                  final boolean forward )
           throws Exception
       {
  -        if( forward ) 
  +        if( forward )
           {
               visitDependencies( name, entry, visitor );
           }
  
  
  
  1.5       +14 -13    
jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/facilities/DefaultComponentManagerBuilder.java
  
  Index: DefaultComponentManagerBuilder.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/facilities/DefaultComponentManagerBuilder.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- DefaultComponentManagerBuilder.java       2001/04/03 03:50:36     1.4
  +++ DefaultComponentManagerBuilder.java       2001/04/12 12:24:03     1.5
  @@ -11,11 +11,12 @@
   import org.apache.avalon.ComponentManagerException;
   import org.apache.avalon.Composer;
   import org.apache.avalon.DefaultComponentManager;
  +import org.apache.avalon.atlantis.Application;
   import org.apache.avalon.atlantis.Facility;
   import org.apache.avalon.camelot.ContainerException;
   import org.apache.avalon.camelot.Entry;
   import org.apache.avalon.camelot.pipeline.ComponentManagerBuilder;
  -import org.apache.phoenix.engine.ServerApplication;
  +import org.apache.avalon.component.ComponentException;
   import org.apache.phoenix.engine.blocks.BlockEntry;
   import org.apache.phoenix.engine.blocks.RoleEntry;
   import org.apache.phoenix.metainfo.BlockInfo;
  @@ -31,12 +32,12 @@
       implements Facility, ComponentManagerBuilder, Composer
   {
       //container to get dependencies from
  -    protected ServerApplication        m_serverApplication;
  +    protected Application        m_application;
   
       public void compose( final ComponentManager componentManager )
           throws ComponentManagerException
       {
  -        m_serverApplication = (ServerApplication)componentManager.
  +        m_application = (Application)componentManager.
               lookup( "org.apache.phoenix.engine.ServerApplication" );
       }
   
  @@ -48,40 +49,40 @@
        * @return the created ComponentManager
        */
       public ComponentManager createComponentManager( String name, Entry entry )
  -        throws ComponentManagerException
  +        throws ComponentException
       {
           final DefaultComponentManager componentManager = new 
DefaultComponentManager();
           final BlockEntry blockEntry = (BlockEntry)entry;
           final BlockInfo info = (BlockInfo)blockEntry.getInfo();
           final RoleEntry[] roleEntrys = blockEntry.getRoleEntrys();
  -        
  +
           for( int i = 0; i < roleEntrys.length; i++ )
           {
               final String dependencyName = roleEntrys[ i ].getName();
  -            final ServiceDescriptor serviceDescriptor = 
  +            final ServiceDescriptor serviceDescriptor =
                   info.getDependency( roleEntrys[ i ].getRole() ).getService();
   
               try
               {
  -                //dependency should NEVER be null here as it 
  +                //dependency should NEVER be null here as it
                   //is validated at entry time
  -                final BlockEntry dependency = 
  -                    (BlockEntry)m_serverApplication.getEntry( dependencyName );
  +                final BlockEntry dependency =
  +                    (BlockEntry)m_application.getEntry( dependencyName );
   
                   //make sure that the block offers service it supposed to be 
providing
                   final ServiceDescriptor[] services = 
dependency.getBlockInfo().getServices();
                   if( !BlockUtil.hasMatchingService( services, serviceDescriptor ) )
                   {
  -                    throw new ComponentManagerException( "Dependency " + 
dependencyName + 
  -                                                         " does not offer service 
required: " + 
  -                                                         serviceDescriptor );
  +                    throw new ComponentException( "Dependency " + dependencyName +
  +                                                  " does not offer service 
required: " +
  +                                                  serviceDescriptor );
                   }
   
                   componentManager.put( roleEntrys[ i ].getRole(), 
dependency.getBlock() );
               }
               catch( final ContainerException ce ) {}
           }
  -        
  +
           return componentManager;
       }
   }
  
  
  
  1.1                  
jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/facilities/classmanager/PolicyClassLoader.java
  
  Index: PolicyClassLoader.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 file.
   */
  package org.apache.phoenix.engine.facilities.classmanager;
  
  import java.net.URL;
  import java.net.URLClassLoader;
  import java.security.CodeSource;
  import java.security.PermissionCollection;
  import java.security.Permissions;
  import java.security.Policy;
  
  /**
   * Classloader that applies correct policy information.
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">Peter Donald</a>
   */
  public class PolicyClassLoader
      extends URLClassLoader
  {
      protected Policy      m_policy;
  
      public PolicyClassLoader( final URL[] urls,
                                final ClassLoader classLoader,
                                final Policy policy )
      {
          super( urls, classLoader );
          m_policy = policy;
      }
  
      /**
       * Overide so we can have a per-application security policy with
       * no side-effects to other applications.
       *
       * @param codeSource the codeSource to get permissions for
       * @return the PermissionCollection
       */
      protected PermissionCollection getPermissions( final CodeSource codeSource )
      {
          if( null == m_policy )
          {
              final Permissions permissions = new Permissions();
              permissions.add( new java.security.AllPermission() );
              return permissions;
          }
          else
          {
              return m_policy.getPermissions( codeSource );
          }
      }
  }
  
  
  
  1.1                  
jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/facilities/classmanager/SarClassLoader.java
  
  Index: SarClassLoader.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 file. 
   */
  package org.apache.phoenix.engine.facilities.classmanager;
  
  import java.io.File;
  import java.net.MalformedURLException;
  import java.net.URL;
  import java.security.Policy;
  import org.apache.avalon.ComponentManager;
  import org.apache.avalon.ComponentManagerException;
  import org.apache.avalon.Composer;
  import org.apache.avalon.Context;
  import org.apache.avalon.Contextualizable;
  import org.apache.avalon.Initializable;
  import org.apache.avalon.atlantis.Facility;
  import org.apache.avalon.util.io.ExtensionFileFilter;
  import org.apache.phoenix.engine.SarContextResources;
  
  /**
   * This component creates blocks and blockInfos.
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">Peter Donald</a>
   */
  public class SarClassLoader
      extends PolicyClassLoader
      implements Facility, Contextualizable, Composer, Initializable
  {
      protected File              m_baseDirectory;
  
      public SarClassLoader()
      {
          super( new URL[ 0 ], Thread.currentThread().getContextClassLoader(), null );
      }
  
      public void contextualize( final Context context )
      {
          m_baseDirectory = (File)context.get( SarContextResources.APP_HOME_DIR );
      }
  
      public void compose( final ComponentManager componentManager )
          throws ComponentManagerException
      {
          m_policy = (Policy)componentManager.lookup( "java.security.Policy" );
      }
  
      public void init()
          throws Exception
      {
          final File blockDir =
              (new File( m_baseDirectory, "blocks" )).getAbsoluteFile();
          final File libDir =
              (new File( m_baseDirectory, "lib" )).getAbsoluteFile();
  
          addURLs( blockDir, new String[] { ".bar" } );
          addURLs( libDir, new String[] { ".jar", ".zip" } );
      }
  
      protected void addURLs( final File directory, final String[] extentions )
          throws MalformedURLException
      {
          final ExtensionFileFilter filter = new ExtensionFileFilter( extentions );
          final File[] files = directory.listFiles( filter );
          if( null == files ) return;
          addURLs( files );
      }
  
      protected void addURLs( final File[] files )
          throws MalformedURLException
      {
          for( int i = 0; i < files.length; i++ )
          {
              addURL( files[ i ].toURL() );
          }
      }
  
      public String toString()
      {
          final StringBuffer sb = new StringBuffer();
          sb.append( "ClassLoader[" );
  
          final URL[] urls = getURLs();
  
          for( int i = 0; i < urls.length; i++ )
          {
              sb.append( ' ' );
              sb.append( urls[ i ] );
          }
  
          sb.append( " ]" );
          return sb.toString();
      }
  }
  
  
  
  1.1                  
jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/facilities/security/AbstractPolicy.java
  
  Index: AbstractPolicy.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 file. 
   */
  package org.apache.phoenix.engine.facilities.security;
  
  import java.io.File;
  import java.net.MalformedURLException;
  import java.net.URL;
  import java.security.AccessController;
  import java.security.CodeSource;
  import java.security.Permission;
  import java.security.PermissionCollection;
  import java.security.Permissions;
  import java.security.Policy;
  import java.security.PrivilegedActionException;
  import java.security.PrivilegedExceptionAction;
  import java.security.cert.Certificate;
  import java.util.ArrayList;
  import java.util.Enumeration;
  import java.util.PropertyPermission;
  import org.apache.avalon.Component;
  import org.apache.avalon.Loggable;
  import org.apache.avalon.util.io.FileUtil;
  import org.apache.log.Logger;
  
  /**
   * Abstract policy extended in avalon.
   * 
   * @author <a href="mailto:[EMAIL PROTECTED]">Peter Donald</a>
   */
  public abstract class AbstractPolicy
      extends Policy
      implements Component, Loggable
  {
      protected final static boolean     DEBUG         = true;
  
      protected final ArrayList        m_entries     = new ArrayList();
      
      protected Logger                 m_logger;
  
      /**
       * Internal Policy Entry holder class.
       */
      protected final static class PolicyEntry
      {
          CodeSource                      m_codeSource;
          Permissions                     m_permissions;
      }
  
      public void setLogger( final Logger logger )
      {
          m_logger = logger;
      }
  
      /**
       * Overide so we can have a per-application security policy with 
       * no side-effects to other applications.
       *
       * @param codeSource the codeSource to get permissions for 
       * @return the PermissionCollection
       */
      public PermissionCollection getPermissions( CodeSource codeSource )
      {
          codeSource = normalize( codeSource );
  
          getLogger().debug( "getPermissions(" + codeSource.getLocation() + ");" );
          
          final Permissions permissions = new Permissions();
          final int size = m_entries.size();
          
          for( int i = 0; i < size; i++ )
          {
              final PolicyEntry entry = (PolicyEntry)m_entries.get( i );
              
              if( entry.m_codeSource.implies( codeSource ) )
              {
                  if( DEBUG )
                  {
                      getLogger().debug( entry.m_codeSource.getLocation() + " implies 
" +
                                         codeSource.getLocation() );
                  }
  
                  copyPermissions( permissions, entry.m_permissions );
              }
          }
          
          if( DEBUG )
          {
              getLogger().debug( codeSource.getLocation() + " permissions = " + 
permissions );
          }
          
          return permissions;        
      }
  
      /**
       * Refresh policy. Ignored in this implementation.
       */
      public void refresh()
      {
      }
      
      /**
       * Normalizing CodeSource involves removing relative addressing 
       * (like .. and .) for file urls.
       *
       * @param codeSource the codeSource to be normalized
       * @return the normalized codeSource
       */
      protected CodeSource normalize( final CodeSource codeSource )
      {
          final URL initialLocation = codeSource.getLocation();
          
          // This is a bit of a hack.  I don't know why CodeSource should behave like 
this
          // Fear not, this only seems to be a problem for home grown classloaders.
          // - Paul Hammant, Nov 2000
          if( null == initialLocation ) return codeSource;
  
          String location = null;
          
          if( !initialLocation.getProtocol().equalsIgnoreCase( "file" ) )
          {
              location = initialLocation.getFile();
              location = FileUtil.normalize( location );
          }
          else
          {
              final File file = new File( initialLocation.getFile() );
              location = file.getAbsoluteFile().toString().replace( 
File.separatorChar, '/' );
              location =  FileUtil.normalize( location );
          }
          
          URL finalLocation = null;
  
          try
          {
              finalLocation = new URL( initialLocation.getProtocol(),
                                       initialLocation.getHost(),
                                       initialLocation.getPort(),
                                       location );
          }
          catch( final MalformedURLException mue )
          {
              getLogger().warn( "Error building codeBase", mue );
          }
  
          return new CodeSource( finalLocation, codeSource.getCertificates() );
      }
  
      protected void copyPermissions( final Permissions destination, final Permissions 
src )
      {
          final Enumeration enum = src.elements();
          while( enum.hasMoreElements() )
          {
              destination.add( (Permission)enum.nextElement() );
          }
      }
  
      /**
       * Create a permission set for a codeBase.
       * These are read-write permissions and can be written till until the
       * time in which they are applied to code.
       *
       * @param location the location of codes to apply permission set to.
       * @param signers a comma seperated string of thos who signed codebase
       * @return the new permission set
       * @exception MalformedURLException if location string is malformed
       */
      protected Permissions createPermissionSetFor( final String location,
                                                    final Certificate[] signers )
          throws MalformedURLException
      {
          final PolicyEntry entry = new PolicyEntry();
          entry.m_codeSource = new CodeSource( new URL( location ), signers );
          entry.m_codeSource = normalize( entry.m_codeSource );
  
          getLogger().debug( "createPermissionSetFor(" +
                             entry.m_codeSource.getLocation() + ");" );
  
          entry.m_permissions = new Permissions();
  
          m_entries.add( entry );
          return entry.m_permissions;
      }
  
      protected final Logger getLogger()
      {
          return m_logger;
      }
  }
  
  
  
  1.1                  
jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/facilities/security/DefaultPolicy.java
  
  Index: DefaultPolicy.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 file. 
   */
  package org.apache.phoenix.engine.facilities.security;
  
  import java.io.File;
  import java.io.InputStream;
  import java.lang.reflect.Constructor;
  import java.net.MalformedURLException;
  import java.net.URL;
  import java.security.KeyStore;
  import java.security.KeyStoreException;
  import java.security.Permission;
  import java.security.PermissionCollection;
  import java.security.Permissions;
  import java.security.UnresolvedPermission;
  import java.security.cert.Certificate;
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.Hashtable;
  import java.util.Iterator;
  import java.util.PropertyPermission;
  import java.util.StringTokenizer;
  import org.apache.avalon.Component;
  import org.apache.avalon.Context;
  import org.apache.avalon.Contextualizable;
  import org.apache.avalon.DefaultContext;
  import org.apache.avalon.Initializable;
  import org.apache.avalon.atlantis.Facility;
  import org.apache.avalon.configuration.Configurable;
  import org.apache.avalon.configuration.Configuration;
  import org.apache.avalon.configuration.ConfigurationException;
  import org.apache.avalon.util.PropertyException;
  import org.apache.avalon.util.PropertyUtil;
  
  /**
   * Policy that extracts information from policy files.
   * 
   * @author <a href="mailto:[EMAIL PROTECTED]">Peter Donald</a>
   */
  public class DefaultPolicy
      extends AbstractPolicy
      implements Facility, Contextualizable, Configurable, Initializable
  {
      protected DefaultContext    m_context;
  
      public void contextualize( final Context context )
      {
          m_context = new DefaultContext( System.getProperties(), context );
          m_context.put( "/", File.separator );
      }
  
      public void configure( final Configuration configuration )
          throws ConfigurationException
      {
          final Configuration[] keyStoreConfigurations = configuration.getChildren( 
"keystore" );
          final HashMap keyStores = configureKeyStores( keyStoreConfigurations );
  
          final Configuration[] grants = configuration.getChildren( "grant" );
          configureGrants( grants, keyStores );
      }
  
      public void init()
          throws Exception
      {
          //these properties straight out ot ${java.home}/lib/security/java.policy
          final Permissions permissions = createPermissionSetFor( "file:/-", null );
  
          permissions.add( new PropertyPermission( "os.name", "read" ) );
          permissions.add( new PropertyPermission( "os.arch", "read" ) );
          permissions.add( new PropertyPermission( "os.version", "read" ) );
          permissions.add( new PropertyPermission( "file.separator", "read" ) );
          permissions.add( new PropertyPermission( "path.separator", "read" ) );
          permissions.add( new PropertyPermission( "line.separator", "read" ) );
          
          permissions.add( new PropertyPermission( "java.version", "read" ) );
          permissions.add( new PropertyPermission( "java.vendor", "read" ) );
          permissions.add( new PropertyPermission( "java.vendor.url", "read" ) );
          
          permissions.add( new PropertyPermission( "java.class.version", "read" ) );
          permissions.add( new PropertyPermission( "java.vm.version", "read" ) );
          permissions.add( new PropertyPermission( "java.vm.vendor", "read" ) );
          permissions.add( new PropertyPermission( "java.vm.name", "read" ) );
          
          permissions.add( new PropertyPermission( "java.specification.version", 
"read" ) );
          permissions.add( new PropertyPermission( "java.specification.vendor", "read" 
) );
          permissions.add( new PropertyPermission( "java.specification.name", "read" ) 
);
          permissions.add( new PropertyPermission( "java.vm.specification.version", 
"read" ) );
          permissions.add( new PropertyPermission( "java.vm.specification.vendor", 
"read" ) );
          permissions.add( new PropertyPermission( "java.vm.specification.name", 
"read" ) );
      }
  
      protected HashMap configureKeyStores( final Configuration[] configurations )
          throws ConfigurationException
      {
          final HashMap keyStores = new HashMap();
  
          for( int i = 0; i < configurations.length; i++ )
          {
              final Configuration configuration = configurations[ i ];
              final String type = configuration.getAttribute( "type" );
              final String location = configuration.getAttribute( "location" );
              final String name = configuration.getAttribute( "name" );
  
              try
              {
                  final KeyStore keyStore = KeyStore.getInstance( type );
                  final URL url = new URL( location );
                  final InputStream ins = url.openStream();
                  
                  keyStore.load( ins, null );
  
                  keyStores.put( name, keyStore );
              }
              catch( final Exception e )
              {
                  throw new ConfigurationException( "Error configuring keystore " + 
name, e );
              }
          }
  
          return keyStores;
      }
      
      protected void configureGrants( final Configuration[] configurations, 
                                      final HashMap keyStores )
          throws ConfigurationException
      {
          for( int i = 0; i < configurations.length; i++ )
          {
              configureGrant( configurations[ i ], keyStores );
          }
      }
  
      protected void configureGrant( final Configuration configuration, final HashMap 
keyStores )
          throws ConfigurationException
      {
          //<grant signed-by="Fred" code-base="file:${sar.home}/blocks/*" 
key-store="foo-keystore">
          //<permission class="java.io.FilePermission" target="/tmp/*" 
action="read,write" />
          //</grant>
  
          final String signedBy = configuration.getAttribute( "signed-by", null );
          final String keyStoreName = configuration.getAttribute( "key-store", null );
  
          String codeBase = configuration.getAttribute( "code-base", null );
          if( null != codeBase )
          {
              codeBase = expand( codeBase );
          }
  
          final Certificate[] signers = getSigners( signedBy, keyStoreName, keyStores 
);
  
          Permissions permissions = null;
  
          try { permissions = createPermissionSetFor( codeBase, signers ); }
          catch( final MalformedURLException mue )
          {
              throw new ConfigurationException( "Malformed code-base " + codeBase, mue 
);
          }
  
          
          configurePermissions( configuration.getChildren( "permission" ), 
                                permissions,
                                keyStores );
      }
  
      protected void configurePermissions( final Configuration[] configurations, 
                                           final Permissions permissions,
                                           final HashMap keyStores )
          throws ConfigurationException
      {
          for( int i = 0; i < configurations.length; i++ )
          {
              configurePermission( configurations[ i ], permissions, keyStores );
          }
      }
  
      protected void configurePermission( final Configuration configuration,
                                          final Permissions permissions,
                                          final HashMap keyStores )
          throws ConfigurationException
      {
          final String type = configuration.getAttribute( "class" );
          final String actions = configuration.getAttribute( "actions", null );
          final String signedBy = configuration.getAttribute( "signed-by", null );
          final String keyStoreName = configuration.getAttribute( "key-store", null );
  
          String target = configuration.getAttribute( "target", null );
          if( null != target )
          {
              target = expand( target );
          }
  
          final Certificate[] signers = getSigners( signedBy, keyStoreName, keyStores 
);
          final Permission permission = createPermission( type, target, actions, 
signers );
  
          permissions.add( permission );
      }
  
      protected String expand( final String value )
          throws ConfigurationException
      {
          try
          {
              final Object resolvedValue = PropertyUtil.resolveProperty( value, 
m_context, false );
              return resolvedValue.toString();
          }
          catch( final PropertyException pe )
          {
              throw new ConfigurationException( "Error resolving property " + value, 
pe );
          }
      }
  
      protected Permission createPermission( final String type, 
                                             final String target, 
                                             final String actions, 
                                             final Certificate[] signers )
          throws ConfigurationException
      {
          if( null != signers ) 
          {
              return createUnresolvedPermission( type, target, actions, signers );
          }
          
          try
          {
              final Class c = Class.forName( type );
              
              Class paramClasses[] = null;
              Object params[] = null;
  
              if( null == actions && null == target )
              {
                  paramClasses = new Class[ 0 ];
                  params = new Object[ 0 ];
              }
              else if( null == actions ) 
              {
                  paramClasses = new Class[1];
                  paramClasses[0] = String.class;
                  params = new Object[1];
                  params[0] = target;
              }
              else
              {
                  paramClasses = new Class[2];
                  paramClasses[0] = String.class;
                  paramClasses[1] = String.class;
                  params = new Object[2];
                  params[0] = target;
                  params[1] = actions;
              }
              
              final Constructor constructor = c.getConstructor( paramClasses );
              final Object o = constructor.newInstance( params );
              return (Permission)o;                
          }
          catch( final ClassNotFoundException cnfe )
          {
              return createUnresolvedPermission( type, target, actions, signers );
          }
          catch( final Exception e )
          {
              throw new ConfigurationException( "Failed to create permission " + type 
+ 
                                                " due to " + e, e );
          }
      }
      
      protected Permission createUnresolvedPermission( final String type,
                                                       final String target,
                                                       final String actions,
                                                       final Certificate[] signers )
      {
          return new UnresolvedPermission( type, target, actions, signers );
      }
  
      protected Certificate[] getSigners( final String signedBy,
                                          String keyStoreName,
                                          final HashMap keyStores )
          throws ConfigurationException
      {
          if( null != signedBy && null == keyStoreName )
          {
              keyStoreName = "default";
          }
  
          Certificate[] signers = null;
  
          if( null != signedBy )
          {
              signers = getCertificates( signedBy, keyStoreName, keyStores );
          }
  
          return signers;
      }
  
      protected Certificate[] getCertificates( final String signedBy,
                                               final String keyStoreName,
                                               final HashMap keyStores )
          throws ConfigurationException
      {
          final KeyStore keyStore = (KeyStore)keyStores.get( keyStoreName );
  
          if( null == keyStore )
          {
              throw new ConfigurationException( "Unable to aquire keyStore " + 
keyStoreName );
          }
  
          final ArrayList certificateSet = new ArrayList();
  
          final StringTokenizer tokenizer = new StringTokenizer( signedBy, "," );
  
          while( tokenizer.hasMoreTokens() )
          {
              final String alias = ((String)tokenizer.nextToken()).trim();
              Certificate certificate = null;
  
              try { certificate = keyStore.getCertificate( alias ); }
              catch( final KeyStoreException kse )
              {
                  throw new ConfigurationException( "Error aquiring certificate " + 
alias,
                                                    kse );
              }
  
              if( null == certificate )
              {
                  throw new ConfigurationException( "Unable to locate alias " + alias +
                                                    " in keystore named " + 
keyStoreName );
              }
  
              if( !certificateSet.contains( certificate ) )
              {
                  if( DEBUG ) getLogger().debug( "Certificate " + certificate );
                  certificateSet.add( certificate );
              }
          }
  
          return (Certificate[])certificateSet.toArray( new Certificate[ 0 ] );
      }
  }
  
  
  

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

Reply via email to