ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From adammurd...@apache.org
Subject cvs commit: jakarta-ant-myrmidon/aut/src/test/org/apache/aut/vfs/test AbstractFileSystemTestCase.java
Date Mon, 17 Jun 2002 00:06:16 GMT
adammurdoch    2002/06/16 17:06:16

  Modified:    aut/src/java/org/apache/aut/vfs FileObject.java
                        FileSystemManager.java
               aut/src/java/org/apache/aut/vfs/impl
                        DefaultFileSystemManager.java
                        DefaultProviderContext.java
               aut/src/java/org/apache/aut/vfs/provider
                        AbstractFileObject.java
                        FileSystemProviderContext.java
               aut/src/test/org/apache/aut/vfs/test
                        AbstractFileSystemTestCase.java
  Added:       aut/src/java/org/apache/aut/vfs/impl
                        URLStreamHandlerProxy.java
               aut/src/java/org/apache/aut/vfs/provider
                        DefaultURLConnection.java
                        DefaultURLStreamHandler.java
  Log:
  Added support for accessing the VFS using java.net.URL:
  
  * Added FileSystemManager.getURLStreamHandlerFactory()
  * Added FileObject.getURL()
  * Added test cases.
  
  Patch submitted by Brian Olsen.
  
  Revision  Changes    Path
  1.5       +8 -1      jakarta-ant-myrmidon/aut/src/java/org/apache/aut/vfs/FileObject.java
  
  Index: FileObject.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant-myrmidon/aut/src/java/org/apache/aut/vfs/FileObject.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- FileObject.java	7 Apr 2002 02:27:55 -0000	1.4
  +++ FileObject.java	17 Jun 2002 00:06:16 -0000	1.5
  @@ -8,6 +8,8 @@
   package org.apache.aut.vfs;
   
   import java.io.File;
  +import java.net.URL;
  +import java.net.MalformedURLException;
   
   /**
    * This interface represents a file, and is used to access the content and
  @@ -64,6 +66,11 @@
        * Returns the name of this file.
        */
       FileName getName();
  +
  +    /**
  +     * Returns a URL representing the file.
  +     */
  +    URL getURL() throws MalformedURLException;
   
       /**
        * Determines if this file exists.
  
  
  
  1.9       +7 -1      jakarta-ant-myrmidon/aut/src/java/org/apache/aut/vfs/FileSystemManager.java
  
  Index: FileSystemManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant-myrmidon/aut/src/java/org/apache/aut/vfs/FileSystemManager.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- FileSystemManager.java	24 Apr 2002 02:20:59 -0000	1.8
  +++ FileSystemManager.java	17 Jun 2002 00:06:16 -0000	1.9
  @@ -8,6 +8,7 @@
   package org.apache.aut.vfs;
   
   import java.io.File;
  +import java.net.URLStreamHandlerFactory;
   
   /**
    * A FileSystemManager is manages a set of file systems.  This interface is
  @@ -143,4 +144,9 @@
        */
       FileObject createFileSystem( String provider, FileObject file )
           throws FileSystemException;
  +
  +    /**
  +     * Returns a streamhandler factory to enable URL lookup using this FileSystemManager.
  +     */
  +    URLStreamHandlerFactory getURLStreamHandlerFactory();
   }
  
  
  
  1.8       +32 -2     jakarta-ant-myrmidon/aut/src/java/org/apache/aut/vfs/impl/DefaultFileSystemManager.java
  
  Index: DefaultFileSystemManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant-myrmidon/aut/src/java/org/apache/aut/vfs/impl/DefaultFileSystemManager.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- DefaultFileSystemManager.java	7 Apr 2002 02:27:56 -0000	1.7
  +++ DefaultFileSystemManager.java	17 Jun 2002 00:06:16 -0000	1.8
  @@ -8,6 +8,8 @@
   package org.apache.aut.vfs.impl;
   
   import java.io.File;
  +import java.net.URLStreamHandler;
  +import java.net.URLStreamHandlerFactory;
   import java.util.HashMap;
   import java.util.HashSet;
   import java.util.Iterator;
  @@ -16,6 +18,7 @@
   import org.apache.aut.vfs.FileObject;
   import org.apache.aut.vfs.FileSystemException;
   import org.apache.aut.vfs.FileSystemManager;
  +import org.apache.aut.vfs.provider.DefaultURLStreamHandler;
   import org.apache.aut.vfs.provider.FileReplicator;
   import org.apache.aut.vfs.provider.FileSystemProvider;
   import org.apache.aut.vfs.provider.LocalFileSystemProvider;
  @@ -53,6 +56,9 @@
       /** The base file to use for relative URI. */
       private FileObject m_baseFile;
   
  +    /** The context to send to providers. */
  +    private DefaultProviderContext m_context = new DefaultProviderContext( this );
  +
       /**
        * Registers a file system provider.
        */
  @@ -83,7 +89,7 @@
   
           // Contextualise
           setupLogger( provider );
  -        provider.setContext( new DefaultProviderContext( this ) );
  +        provider.setContext( m_context );
   
           // Add to map
           for( int i = 0; i < urlSchemes.length; i++ )
  @@ -265,5 +271,29 @@
               throw new FileSystemException( message );
           }
           return m_localFileProvider;
  +    }
  +
  +    /**
  +     * Get the URLStreamHandlerFactory.
  +     */
  +    public URLStreamHandlerFactory getURLStreamHandlerFactory()
  +    {
  +      return new VfsStreamHandlerFactory();
  +    }
  +
  +    // This is an internal class because it needs access to the private member m_providers.
  +    class VfsStreamHandlerFactory implements URLStreamHandlerFactory
  +    {
  +        public URLStreamHandler createURLStreamHandler( final String protocol )
  +        {
  +            final FileSystemProvider provider = (FileSystemProvider)m_providers.get( protocol
);
  +            if( provider != null )
  +            {
  +                return new DefaultURLStreamHandler( m_context );
  +            }
  +
  +            //Route all other calls to the default URLStreamHandlerFactory
  +            return new URLStreamHandlerProxy();
  +        }
       }
   }
  
  
  
  1.3       +9 -1      jakarta-ant-myrmidon/aut/src/java/org/apache/aut/vfs/impl/DefaultProviderContext.java
  
  Index: DefaultProviderContext.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant-myrmidon/aut/src/java/org/apache/aut/vfs/impl/DefaultProviderContext.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- DefaultProviderContext.java	7 Apr 2002 02:27:56 -0000	1.2
  +++ DefaultProviderContext.java	17 Jun 2002 00:06:16 -0000	1.3
  @@ -38,6 +38,14 @@
       }
   
       /**
  +     * Locate a file by name.
  +     */
  +    public FileObject resolveFile( final String name )
  +        throws FileSystemException
  +    {
  +        return m_manager.resolveFile( name );
  +    }
  +    /**
        * Locates a file replicator for the provider to use.
        */
       public FileReplicator getReplicator() throws FileSystemException
  
  
  
  1.1                  jakarta-ant-myrmidon/aut/src/java/org/apache/aut/vfs/impl/URLStreamHandlerProxy.java
  
  Index: URLStreamHandlerProxy.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included  with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.aut.vfs.impl;
  
  import java.io.IOException;
  import java.net.URL;
  import java.net.URLConnection;
  import java.net.URLStreamHandler;
  import java.net.MalformedURLException;
  
  /**
   * A proxy for URLs that are supported by the standard stream handler factory.
   *
   * @author <a href="mailto:brian@mmmanager.org">Brian Olsen</a>
   * @version $Revision: 1.1 $ $Date: 2002/06/17 00:06:16 $
   */
  public class URLStreamHandlerProxy
      extends URLStreamHandler
  {
  
      protected URLConnection openConnection( URL url )
          throws IOException
      {
          URL proxyURL = new URL( url.toExternalForm() );
          return proxyURL.openConnection();
      }
  
      protected void parseURL( URL u, String spec, int start, int limit )
      {
          try{
              URL url = new URL( u, spec );
              setURL( u, url.getProtocol(), url.getHost(),
                      url.getPort(), url.getAuthority(), url.getUserInfo(),
                      url.getFile(), url.getQuery(), url.getRef() );
          }
          catch( MalformedURLException mue )
          {
            //We retrow this as a simple runtime exception.
            //It is retrown in URL as a MalformedURLException anyway.
            throw new RuntimeException( mue.getMessage() );
          }
      }
  }
  
  
  
  1.9       +15 -1     jakarta-ant-myrmidon/aut/src/java/org/apache/aut/vfs/provider/AbstractFileObject.java
  
  Index: AbstractFileObject.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant-myrmidon/aut/src/java/org/apache/aut/vfs/provider/AbstractFileObject.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- AbstractFileObject.java	7 Apr 2002 02:27:56 -0000	1.8
  +++ AbstractFileObject.java	17 Jun 2002 00:06:16 -0000	1.9
  @@ -12,6 +12,9 @@
   import java.io.OutputStream;
   import java.util.ArrayList;
   import java.util.List;
  +import java.net.URL;
  +import java.net.MalformedURLException;
  +import java.net.URLStreamHandler;
   import org.apache.aut.vfs.FileConstants;
   import org.apache.aut.vfs.FileContent;
   import org.apache.aut.vfs.FileName;
  @@ -211,6 +214,17 @@
       public FileName getName()
       {
           return m_name;
  +    }
  +
  +    /**
  +     * Returns a URL representation of the file.
  +     */
  +    public URL getURL() throws MalformedURLException
  +    {
  +        StringBuffer buf = new StringBuffer();
  +        
  +        return new URL( UriParser.extractScheme( m_name.getURI(), buf ), null, -1,
  +                        buf.toString(), new DefaultURLStreamHandler( m_fs.getContext()
) );
       }
   
       /**
  
  
  
  1.4       +9 -1      jakarta-ant-myrmidon/aut/src/java/org/apache/aut/vfs/provider/FileSystemProviderContext.java
  
  Index: FileSystemProviderContext.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant-myrmidon/aut/src/java/org/apache/aut/vfs/provider/FileSystemProviderContext.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FileSystemProviderContext.java	7 Apr 2002 02:27:56 -0000	1.3
  +++ FileSystemProviderContext.java	17 Jun 2002 00:06:16 -0000	1.4
  @@ -29,6 +29,14 @@
           throws FileSystemException;
   
       /**
  +     * Locate a file by name.  See
  +     * {@link FileSystemManager#resolveFile( String)} for a
  +     * description of how this works.
  +     */
  +    FileObject resolveFile( String name )
  +        throws FileSystemException;
  +
  +    /**
        * Locates a file replicator for the provider to use.
        */
       FileReplicator getReplicator() throws FileSystemException;
  
  
  
  1.1                  jakarta-ant-myrmidon/aut/src/java/org/apache/aut/vfs/provider/DefaultURLConnection.java
  
  Index: DefaultURLConnection.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.aut.vfs.provider;
  
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.net.ProtocolException;
  import java.net.URL;
  import java.net.URLConnection;
  import org.apache.aut.vfs.FileContent;
  import org.apache.aut.vfs.FileSystemException;
  
  /**
   * A default URL connection that will work for most file systems.
   *
   * @author <a href="mailto:brian@mmmanager.org">Brian Olsen</a>
   * @version $Revision: 1.1 $ $Date: 2002/06/17 00:06:16 $
   */
  public class DefaultURLConnection
      extends URLConnection
  {
      FileContent m_content;
  
      public DefaultURLConnection( URL url, FileContent content )
      {
          super( url );
          m_content = content;
      }
  
      public void connect()
      {
          connected = true;
      }
  
      public InputStream getInputStream()
          throws IOException
      {
          try{
              return m_content.getInputStream();
          }
          catch( FileSystemException fse )
          {
              throw new ProtocolException( fse.getMessage() );
          }
      }
  
      public OutputStream getOutputStream()
          throws IOException
      {
          try{
              return m_content.getOutputStream();
          }
          catch( FileSystemException fse )
          {
              throw new ProtocolException( fse.getMessage() );
          }
      }
  
      public int getContentLength()
      {
          try{
              return (int)m_content.getSize();
          }
          catch( FileSystemException fse ) {}
  
          return -1;
      }
  
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/aut/src/java/org/apache/aut/vfs/provider/DefaultURLStreamHandler.java
  
  Index: DefaultURLStreamHandler.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.aut.vfs.provider;
  
  import java.io.IOException;
  import java.net.ProtocolException;
  import java.net.URL;
  import java.net.URLConnection;
  import java.net.URLStreamHandler;
  import org.apache.aut.vfs.FileObject;
  import org.apache.aut.vfs.FileSystemException;
  
  /**
   * A default URL stream handler that will work for most file systems.
   *
   * @author <a href="mailto:brian@mmmanager.org">Brian Olsen</a>
   * @version $Revision: 1.1 $ $Date: 2002/06/17 00:06:16 $
   */
  public class DefaultURLStreamHandler
      extends URLStreamHandler
  {
  
      FileSystemProviderContext m_context;
  
      public DefaultURLStreamHandler( FileSystemProviderContext  context )
      {
          m_context = context;
      }
  
      protected URLConnection openConnection( URL url )
          throws IOException
      {
          try{
              FileObject entry = m_context.resolveFile( url.toExternalForm() );
              return new DefaultURLConnection( url, entry.getContent() );
          }
          catch( FileSystemException fse )
          {
              throw new ProtocolException( fse.getMessage() );
          }
      }
  
      protected void parseURL( URL u, String spec, int start, int limit )
      {
          try{
              FileObject old = null;
              if( u.getProtocol() != null )
                  old = m_context.resolveFile( u.toExternalForm() );
  
              FileObject newURL = null;
              if( start > 0 && spec.charAt( start-1 ) == ':' )
                  newURL = m_context.resolveFile( old, spec );
              else
                  newURL = old.resolveFile( spec );
  
              final String url = newURL.getName().getURI();
              final StringBuffer filePart = new StringBuffer();
              final String protocolPart = UriParser.extractScheme( url, filePart );
  
              setURL( u, protocolPart, null, -1, null, null, filePart.toString(), null, null
);
          }
          catch( FileSystemException fse )
          {
              // This is rethrown to MalformedURLException in URL anyway
              throw new RuntimeException( fse.getMessage() );
          }
      }
  
      protected String toExternalForm( URL u )
      {
          return u.getProtocol() + ":" + u.getFile();
      }
  }
  
  
  
  1.8       +110 -1    jakarta-ant-myrmidon/aut/src/test/org/apache/aut/vfs/test/AbstractFileSystemTestCase.java
  
  Index: AbstractFileSystemTestCase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant-myrmidon/aut/src/test/org/apache/aut/vfs/test/AbstractFileSystemTestCase.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- AbstractFileSystemTestCase.java	6 May 2002 09:29:44 -0000	1.7
  +++ AbstractFileSystemTestCase.java	17 Jun 2002 00:06:16 -0000	1.8
  @@ -9,6 +9,9 @@
   
   import java.io.ByteArrayOutputStream;
   import java.io.InputStream;
  +import java.io.IOException;
  +import java.net.URLConnection;
  +import java.net.URL;
   import java.util.ArrayList;
   import java.util.Arrays;
   import java.util.HashMap;
  @@ -738,6 +741,112 @@
           // Should be able to get child by name
           FileObject child = file.resolveFile( "some-child" );
           assertNotNull( child );
  +    }
  +
  +    /**
  +     * Tests url.
  +     */
  +    public void testURL() throws Exception
  +    {
  +        FileObject file = m_baseFolder.resolveFile( "some-dir/" );
  +        URL url = file.getURL();
  +        
  +        assertEquals( file.getName().getURI(), url.toExternalForm() );
  +
  +        URL parentURL = new URL( url, ".." );
  +        assertEquals( m_baseFolder.getURL(), parentURL ); 
  +
  +        URL rootURL = new URL( url, "/" );
  +        assertEquals( file.getRoot().getURL(), rootURL );
  +    }
  +
  +    /**
  +     * Tests content.
  +     */
  +    public void testURLContent() throws Exception
  +    {
  +        // Test non-empty file
  +        FileObject file = m_baseFolder.resolveFile( "file1.txt" );
  +        URLConnection urlCon = file.getURL().openConnection();
  +        assertSameURLContent( m_charContent, urlCon );
  +
  +        // Test empty file
  +        file = m_baseFolder.resolveFile( "empty.txt" );
  +        urlCon = file.getURL().openConnection();
  +        assertSameURLContent( "", urlCon );
  +    }
  +
  +    /**
  +     * Asserts that the content of a file is the same as expected. Checks the
  +     * length reported by getSize() is correct, then reads the content as
  +     * a byte stream, and as a char stream, and compares the result with
  +     * the expected content.  Assumes files are encoded using UTF-8.
  +     */
  +    protected void assertSameURLContent( final String expected,
  +                                         final URLConnection connection )
  +        throws Exception
  +    {
  +        // Get file content as a binary stream
  +        final byte[] expectedBin = expected.getBytes( "utf-8" );
  +
  +        // Check lengths
  +        assertEquals( "same content length", expectedBin.length, connection.getContentLength()
);
  +
  +        // Read content into byte array
  +        final InputStream instr = connection.getInputStream();
  +        final ByteArrayOutputStream outstr;
  +        try
  +        {
  +            outstr = new ByteArrayOutputStream();
  +            final byte[] buffer = new byte[ 256 ];
  +            int nread = 0;
  +            while( nread >= 0 )
  +            {
  +                outstr.write( buffer, 0, nread );
  +                nread = instr.read( buffer );
  +            }
  +        }
  +        finally
  +        {
  +            instr.close();
  +        }
  +
  +        // Compare
  +        assertTrue( "same binary content", Arrays.equals( expectedBin, outstr.toByteArray()
) );
  +    }
  +
  +    /**
  +     * Tests that folders and unknown files have no content.
  +     */
  +    public void testNoURLContent() throws Exception
  +    {
  +        // Try getting the content of a folder
  +        FileObject folder = m_baseFolder.resolveFile( "dir1" );
  +        try
  +        {
  +            folder.getURL().openConnection();
  +            fail();
  +        }
  +        catch( IOException e )
  +        {
  +            final String message = REZ.getString( "get-folder-content.error", folder );
  +            assertSameMessage( message, e );
  +        }
  +
  +        // Try getting the content of an unknown file
  +        FileObject unknownFile = m_baseFolder.resolveFile( "unknown-file" );
  +        URLConnection connection = unknownFile.getURL().openConnection();
  +        try
  +        {
  +            connection.getInputStream();
  +            fail();
  +        }
  +        catch( IOException e )
  +        {
  +            final String message = REZ.getString( "read-no-exist.error", unknownFile );
  +            assertSameMessage( message, e );
  +        }
  +        assertEquals( -1, connection.getContentLength() );
       }
   
       /**
  
  
  

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


Mime
View raw message