You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by do...@apache.org on 2002/07/14 03:30:00 UTC

cvs commit: jakarta-avalon-excalibur/extension/src/java/org/apache/avalon/excalibur/extension DefaultPackageRepository.java

donaldp     2002/07/13 18:29:59

  Modified:    extension/src/java/org/apache/avalon/excalibur/extension
                        DefaultPackageRepository.java
  Log:
  Start fleshing out the package repository
  implementation by pushing back functionality
  that was implemented in subclasses.
  
  Revision  Changes    Path
  1.17      +239 -30   jakarta-avalon-excalibur/extension/src/java/org/apache/avalon/excalibur/extension/DefaultPackageRepository.java
  
  Index: DefaultPackageRepository.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/extension/src/java/org/apache/avalon/excalibur/extension/DefaultPackageRepository.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- DefaultPackageRepository.java	15 Jun 2002 07:21:09 -0000	1.16
  +++ DefaultPackageRepository.java	14 Jul 2002 01:29:59 -0000	1.17
  @@ -11,6 +11,7 @@
   import java.io.IOException;
   import java.util.ArrayList;
   import java.util.HashMap;
  +import java.util.StringTokenizer;
   import java.util.jar.JarFile;
   import java.util.jar.Manifest;
   
  @@ -31,7 +32,12 @@
       private static final boolean DEBUG = false;
   
       /**
  -     * Map between files and <code>OptionalPackage</code> objects.
  +     * separator used to separate path elements in a string.
  +     */
  +    private static final String SEPARATOR = "|";
  +
  +    /**
  +     * Map between files and {@link OptionalPackage} objects.
        */
       private final HashMap m_packages = new HashMap();
   
  @@ -47,6 +53,14 @@
       private boolean m_needToScan;
   
       /**
  +     * Construct a package repository with no path specified.
  +     */
  +    public DefaultPackageRepository()
  +    {
  +        this( new File[ 0 ] );
  +    }
  +
  +    /**
        * Construct a package repository with path.
        *
        * @param path The set of directories in which to look for Optional Packages
  @@ -57,10 +71,23 @@
       }
   
       /**
  -     * Return all the <code>OptionalPackage</code>s that satisfy specified
  -     * <code>Extension</code>. It is expected that this <code>Extension</code>
  +     * Return an array of path elements where each
  +     * element in array represents a directory
  +     * in which the ExtensionManager will look
  +     * for Extensions.
  +     *
  +     * @return the list of paths to search in
  +     */
  +    public File[] getPaths()
  +    {
  +        return m_path;
  +    }
  +
  +    /**
  +     * Return all the {@link OptionalPackage}s that satisfy specified
  +     * {@link Extension}. It is expected that this {@link Extension}
        * object will be one retrieved via getLocalExtension() method. If the
  -     * specified <code>Extension</code> is not local then <code>null</code>
  +     * specified {@link Extension} is not local then <code>null</code>
        * is returned.
        *
        * @param extension the extension to search for
  @@ -71,7 +98,6 @@
       {
           if( m_needToScan )
           {
  -            //Check cache consistency and reload if necessary..
               scanPath();
           }
   
  @@ -102,36 +128,81 @@
       }
   
       /**
  -     * Set the path for the Repository.
  +     * Add path elements to repository search path
        *
  -     * @param path the list of directories in which to search
  +     * @param pathElements the path elements to add to repository search path
        */
  -    protected synchronized void setPath( final File[] path )
  +    protected synchronized void addPathElements( final String[] pathElements )
       {
  -        if( null == path )
  -        {
  -            throw new NullPointerException( "path property is null" );
  -        }
  +        final File[] path = toFiles( pathElements );
  +        addPathElements( path );
  +    }
   
  -        for( int i = 0; i < path.length; i++ )
  -        {
  -            final File directory = path[ i ];
  +    /**
  +     * Add path elements to repository search path
  +     *
  +     * @param path the path elements to add to repository search path
  +     */
  +    protected synchronized void addPathElements( final File[] path )
  +    {
  +        validatePath( path );
  +        final File[] files = resolvePath( path );
  +        m_path = mergePaths( files );
  +        m_needToScan = true;
  +    }
   
  -            if( !directory.exists() || !directory.isDirectory() )
  -            {
  -                throw new IllegalArgumentException( "path element " + directory +
  -                                                    " must exist and must be a directory" );
  -            }
  -        }
  +    /**
  +     * Add path elements to repository search path.
  +     * Note that each path element is separated by a '|' character.
  +     *
  +     * @param pathString the path elements to add to repository search path
  +     */
  +    protected synchronized void addPathElements( final String pathString )
  +    {
  +        final String[] pathElements = split( pathString, SEPARATOR );
  +        addPathElements( pathElements );
  +    }
   
  -        m_path = path;
  +    /**
  +     * Set the path for the Repository.
  +     * Note thart each path element is separated by a '|' character.
  +     *
  +     * @param pathString the list of directories in which to search
  +     */
  +    protected synchronized void setPath( final String pathString )
  +    {
  +        final String[] pathElements = split( pathString, SEPARATOR );
  +        setPath( pathElements );
  +    }
  +
  +    /**
  +     * Set the path for the Repository.
  +     *
  +     * @param pathElements the list of directories in which to search
  +     */
  +    protected synchronized void setPath( final String[] pathElements )
  +    {
  +        final File[] path = toFiles( pathElements );
  +        setPath( path );
  +    }
  +
  +    /**
  +     * Set the path for the Repository.
  +     *
  +     * @param path the list of directories in which to search
  +     */
  +    protected synchronized void setPath( final File[] path )
  +    {
  +        validatePath( path );
  +        m_path = resolvePath( path );
           m_needToScan = true;
       }
   
       /**
        * Scan the path for this repository and reload all
        * the "Optional Packages" found in the path.
  -     *
  +     * All of the old Extensions/Optional Packages will
  +     * be removed.
        */
       protected final synchronized void scanPath()
       {
  @@ -143,6 +214,13 @@
           }
       }
   
  +    /**
  +     * Utility method to scan a directory for
  +     * all jar fi;les in directory and add them as
  +     * OptionalPackages.
  +     *
  +     * @param directory the directory to scan
  +     */
       private synchronized void scanDirectory( final File directory )
       {
           final File[] files = directory.listFiles();
  @@ -153,19 +231,25 @@
   
               if( !name.endsWith( ".jar" ) )
               {
  -                debug( "Skipping " + file + " as it does not end with '.jar'" );
  +                final String message =
  +                    "Skipping " + file + " as it does not end with '.jar'";
  +                debug( message );
                   continue;
               }
   
               if( !file.isFile() )
               {
  -                debug( "Skipping " + file + " as it is not a file." );
  +                final String message =
  +                    "Skipping " + file + " as it is not a file.";
  +                debug( message );
                   continue;
               }
   
               if( !file.canRead() )
               {
  -                debug( "Skipping " + file + " as it is not readable." );
  +                final String message =
  +                    "Skipping " + file + " as it is not readable.";
  +                debug( message );
                   continue;
               }
   
  @@ -176,7 +260,10 @@
               }
               catch( final IOException ioe )
               {
  -                debug( "Skipping " + file + " as it could not be loaded due to " + ioe );
  +                final String message =
  +                    "Skipping " + file + " as it could not be loaded " +
  +                    "due to " + ioe;
  +                debug( message );
               }
           }
       }
  @@ -201,9 +288,11 @@
       {
           m_needToScan = false;
   
  -        // SJM: added to avoid out of bounds exception - pending validation
  +        // added to avoid out of bounds exception
           if( optionalPackage.getAvailableExtensions().length == 0 )
  +        {
               return;
  +        }
   
           final Extension extension = optionalPackage.getAvailableExtensions()[ 0 ];
           ArrayList candidates = (ArrayList)m_packages.get( extension.getExtensionName() );
  @@ -261,6 +350,126 @@
           {
               System.out.println( message );
           }
  -        //getLogger().debug( message );
  +    }
  +
  +    /**
  +     * Get Canonical or failing that the absolute file
  +     * for every specified file.
  +     *
  +     * @param path the files that make up path
  +     * @return the resolved path
  +     */
  +    private File[] resolvePath( final File[] path )
  +    {
  +        final File[] resultPath = new File[ path.length ];
  +        for( int i = 0; i < path.length; i++ )
  +        {
  +            resultPath[ i ] = resolveFile( path[ i ] );
  +        }
  +        return resultPath;
  +    }
  +
  +    /**
  +     * Get Canonical or failing that the absolute file
  +     * for specified file.
  +     *
  +     * @param file the file
  +     * @return the resolved file
  +     */
  +    private File resolveFile( final File file )
  +    {
  +        try
  +        {
  +            return file.getCanonicalFile();
  +        }
  +        catch( IOException e )
  +        {
  +            return file.getAbsoluteFile();
  +        }
  +    }
  +
  +    /**
  +     * Validate each element in path to make sure they are valid.
  +     *
  +     * @param path the path
  +     */
  +    private void validatePath( final File[] path )
  +    {
  +        if( null == path )
  +        {
  +            throw new NullPointerException( "path" );
  +        }
  +
  +        for( int i = 0; i < path.length; i++ )
  +        {
  +            validatePathElement( path[ i ] );
  +        }
  +    }
  +
  +    /**
  +     * Make sure specified path element is valid.
  +     * The elements should exist and should be a directory.
  +     *
  +     * @param file the path element
  +     */
  +    private void validatePathElement( final File file )
  +    {
  +        if( !file.exists() || !file.isDirectory() )
  +        {
  +            final String message = "path element " + file +
  +                " must exist and must be a directory";
  +            throw new IllegalArgumentException( message );
  +        }
  +    }
  +
  +    /**
  +     * Merge the specified file list with existing path.
  +     *
  +     * @param files the files to merge
  +     * @return the merged path
  +     */
  +    private File[] mergePaths( final File[] files )
  +    {
  +        final File[] resultPath =
  +            new File[ m_path.length + files.length ];
  +        System.arraycopy( m_path, 0, resultPath, 0, m_path.length );
  +        System.arraycopy( files, m_path.length, resultPath, 0, files.length );
  +        return resultPath;
  +    }
  +
  +    /**
  +     * Convert set of string elements into file objects
  +     *
  +     * @param pathElements the string path elements
  +     * @return the file array representing each element
  +     */
  +    private File[] toFiles( final String[] pathElements )
  +    {
  +        final File[] path = new File[ pathElements.length ];
  +        for( int i = 0; i < path.length; i++ )
  +        {
  +            path[ i ] = new File( pathElements[ i ] );
  +        }
  +        return path;
  +    }
  +
  +    /**
  +     * Splits the string on every token into an array of strings.
  +     *
  +     * @param string the string
  +     * @param onToken the token
  +     * @return the resultant array
  +     */
  +    private static String[] split( final String string, final String onToken )
  +    {
  +        final StringTokenizer tokenizer = new StringTokenizer( string, onToken );
  +        final String[] result = new String[ tokenizer.countTokens() ];
  +
  +        for( int i = 0; i < result.length; i++ )
  +        {
  +            result[ i ] = tokenizer.nextToken();
  +        }
  +
  +        return result;
       }
   }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>