You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2012/07/20 23:59:49 UTC

svn commit: r1363962 - in /commons/proper/vfs/trunk: core/src/main/java/org/apache/commons/vfs2/provider/ core/src/main/java/org/apache/commons/vfs2/provider/bzip2/ core/src/main/java/org/apache/commons/vfs2/provider/compressed/ core/src/main/java/org/...

Author: ggregory
Date: Fri Jul 20 21:59:48 2012
New Revision: 1363962

URL: http://svn.apache.org/viewvc?rev=1363962&view=rev
Log:
[VFS-429] Remove extra FileSystem ivar in AbstractFileObject subclasses with generics.

Modified:
    commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/AbstractFileObject.java
    commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/DelegateFileObject.java
    commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/bzip2/Bzip2FileObject.java
    commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/compressed/CompressedFileFileObject.java
    commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftp/FtpFileObject.java
    commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/gzip/GzipFileObject.java
    commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileObject.java
    commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/local/LocalFile.java
    commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ram/RamFileObject.java
    commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/sftp/SftpFileObject.java
    commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/tar/TarFileObject.java
    commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/url/UrlFileObject.java
    commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/zip/ZipFileObject.java
    commons/proper/vfs/trunk/src/changes/changes.xml

Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/AbstractFileObject.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/AbstractFileObject.java?rev=1363962&r1=1363961&r2=1363962&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/AbstractFileObject.java (original)
+++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/AbstractFileObject.java Fri Jul 20 21:59:48 2012
@@ -55,13 +55,14 @@ import org.apache.commons.vfs2.util.Rand
 
 /**
  * A partial file object implementation.
+ * @param <AFS> An AbstractFileSystem subclass
  *
  * @todo Chop this class up - move all the protected methods to several
  * interfaces, so that structure and content can be separately overridden.
  * @todo Check caps in methods like getChildren(), etc, and give better error messages
  * (eg 'this file type does not support listing children', vs 'this is not a folder')
  */
-public abstract class AbstractFileObject implements FileObject
+public abstract class AbstractFileObject<AFS extends AbstractFileSystem> implements FileObject
 {
     // private static final FileObject[] EMPTY_FILE_ARRAY = {};
     private static final FileName[] EMPTY_FILE_ARRAY = {};
@@ -69,7 +70,7 @@ public abstract class AbstractFileObject
     private static final int INITIAL_LIST_SIZE = 5;
 
     private final AbstractFileName name;
-    private final AbstractFileSystem fs;
+    private final AFS fs;
 
     private FileContent content;
 
@@ -96,7 +97,7 @@ public abstract class AbstractFileObject
      * @throws ClassCastException if {@code name} is not an instance of {@link AbstractFileName}
      */
     protected AbstractFileObject(final AbstractFileName name,
-                                 final AbstractFileSystem fs)
+                                 final AFS fs)
     {
         this.name = name;
         this.fs = fs;
@@ -505,6 +506,15 @@ public abstract class AbstractFileObject
     }
 
     /**
+     * Returns the file system this file belongs to.
+     * @return The FileSystem this file is associated with.
+     */
+    protected AFS getAbstractFileSystem()
+    {
+        return fs;
+    }
+
+    /**
      * Returns a URL representation of the file.
      * @return The URL representation of the file.
      * @throws FileSystemException if an error occurs.

Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/DelegateFileObject.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/DelegateFileObject.java?rev=1363962&r1=1363961&r2=1363962&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/DelegateFileObject.java (original)
+++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/DelegateFileObject.java Fri Jul 20 21:59:48 2012
@@ -37,17 +37,19 @@ import org.apache.commons.vfs2.util.Weak
 
 /**
  * A file backed by another file.
+ * 
+ * @param <AFS>  A subclass of AbstractFileSystem.
  *
  * @todo Extract subclass that overlays the children
  */
-public class DelegateFileObject extends AbstractFileObject implements FileListener
+public class DelegateFileObject<AFS extends AbstractFileSystem> extends AbstractFileObject<AFS> implements FileListener
 {
     private FileObject file;
     private final Set<String> children = new HashSet<String>();
     private boolean ignoreEvent;
 
     public DelegateFileObject(final AbstractFileName name,
-                              final AbstractFileSystem fileSystem,
+                              final AFS fileSystem,
                               final FileObject file) throws FileSystemException
     {
         super(name, fileSystem);

Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/bzip2/Bzip2FileObject.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/bzip2/Bzip2FileObject.java?rev=1363962&r1=1363961&r2=1363962&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/bzip2/Bzip2FileObject.java (original)
+++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/bzip2/Bzip2FileObject.java Fri Jul 20 21:59:48 2012
@@ -25,14 +25,13 @@ import org.apache.commons.compress.compr
 import org.apache.commons.vfs2.FileObject;
 import org.apache.commons.vfs2.provider.AbstractFileName;
 import org.apache.commons.vfs2.provider.compressed.CompressedFileFileObject;
-import org.apache.commons.vfs2.provider.compressed.CompressedFileFileSystem;
 
 /**
  * the bzip2 file.
  */
-public class Bzip2FileObject extends CompressedFileFileObject
+public class Bzip2FileObject extends CompressedFileFileObject<Bzip2FileSystem>
 {
-    protected Bzip2FileObject(AbstractFileName name, FileObject container, CompressedFileFileSystem fs)
+    protected Bzip2FileObject(AbstractFileName name, FileObject container, Bzip2FileSystem fs)
     {
         super(name, container, fs);
     }

Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/compressed/CompressedFileFileObject.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/compressed/CompressedFileFileObject.java?rev=1363962&r1=1363961&r2=1363962&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/compressed/CompressedFileFileObject.java (original)
+++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/compressed/CompressedFileFileObject.java Fri Jul 20 21:59:48 2012
@@ -24,15 +24,21 @@ import org.apache.commons.vfs2.provider.
 import org.apache.commons.vfs2.provider.AbstractFileObject;
 
 /**
- * A compressed file.<br>
- * Such a file do only have one child (the compressed filename with stripped last extension)
+ * A compressed file.
+ * 
+ * <p>
+ * Such a file only has one child (the compressed filename with stripped last extension)
+ * </p>
+ * 
+ * @param <FS>
+ *            A CompressedFileFileSystem
  */
-public abstract class CompressedFileFileObject extends AbstractFileObject
+public abstract class CompressedFileFileObject<FS extends CompressedFileFileSystem> extends AbstractFileObject<FS>
 {
     private final FileObject container;
     private final String[] children;
 
-    protected CompressedFileFileObject(AbstractFileName name, FileObject container, CompressedFileFileSystem fs)
+    protected CompressedFileFileObject(AbstractFileName name, FileObject container, FS fs)
     {
         super(name, fs);
         this.container = container;

Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftp/FtpFileObject.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftp/FtpFileObject.java?rev=1363962&r1=1363961&r2=1363962&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftp/FtpFileObject.java (original)
+++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftp/FtpFileObject.java Fri Jul 20 21:59:48 2012
@@ -47,14 +47,13 @@ import org.apache.commons.vfs2.util.Rand
 /**
  * An FTP file.
  */
-public class FtpFileObject extends AbstractFileObject
+public class FtpFileObject extends AbstractFileObject<FtpFileSystem>
 {
     private static final Map<String, FTPFile> EMPTY_FTP_FILE_MAP =
         Collections.unmodifiableMap(new TreeMap<String, FTPFile>());
     private static final FTPFile UNKNOWN = new FTPFile();
 
     private final Log log = LogFactory.getLog(FtpFileObject.class);
-    private final FtpFileSystem ftpFs;
     private final String relPath;
 
     // Cached info
@@ -70,7 +69,6 @@ public class FtpFileObject extends Abstr
         throws FileSystemException
     {
         super(name, fileSystem);
-        ftpFs = fileSystem;
         String relPath = UriParser.decode(rootName.getRelativeName(name));
         if (".".equals(relPath))
         {
@@ -128,7 +126,7 @@ public class FtpFileObject extends Abstr
             return;
         }
 
-        final FtpClient client = ftpFs.getClient();
+        final FtpClient client = getAbstractFileSystem().getClient();
         try
         {
             final String path = fileInfo != null && fileInfo.isSymbolicLink()
@@ -167,7 +165,7 @@ public class FtpFileObject extends Abstr
         }
         finally
         {
-            ftpFs.putClient(client);
+            getAbstractFileSystem().putClient(client);
         }
     }
 
@@ -459,7 +457,7 @@ public class FtpFileObject extends Abstr
         synchronized (getFileSystem())
         {
             final boolean ok;
-            final FtpClient ftpClient = ftpFs.getClient();
+            final FtpClient ftpClient = getAbstractFileSystem().getClient();
             try
             {
                 if (this.fileInfo.isDirectory())
@@ -473,7 +471,7 @@ public class FtpFileObject extends Abstr
             }
             finally
             {
-                ftpFs.putClient(ftpClient);
+                getAbstractFileSystem().putClient(ftpClient);
             }
 
             if (!ok)
@@ -494,7 +492,7 @@ public class FtpFileObject extends Abstr
         synchronized (getFileSystem())
         {
             final boolean ok;
-            final FtpClient ftpClient = ftpFs.getClient();
+            final FtpClient ftpClient = getAbstractFileSystem().getClient();
             try
             {
                 String oldName = getName().getPath();
@@ -503,7 +501,7 @@ public class FtpFileObject extends Abstr
             }
             finally
             {
-                ftpFs.putClient(ftpClient);
+                getAbstractFileSystem().putClient(ftpClient);
             }
 
             if (!ok)
@@ -524,14 +522,14 @@ public class FtpFileObject extends Abstr
         throws Exception
     {
         final boolean ok;
-        final FtpClient client = ftpFs.getClient();
+        final FtpClient client = getAbstractFileSystem().getClient();
         try
         {
             ok = client.makeDirectory(relPath);
         }
         finally
         {
-            ftpFs.putClient(client);
+            getAbstractFileSystem().putClient(client);
         }
 
         if (!ok)
@@ -594,7 +592,7 @@ public class FtpFileObject extends Abstr
     @Override
     protected InputStream doGetInputStream() throws Exception
     {
-        final FtpClient client = ftpFs.getClient();
+        final FtpClient client = getAbstractFileSystem().getClient();
         try
         {
             final InputStream instr = client.retrieveFileStream(relPath);
@@ -607,7 +605,7 @@ public class FtpFileObject extends Abstr
         }
         catch (Exception e)
         {
-            ftpFs.putClient(client);
+            getAbstractFileSystem().putClient(client);
             throw e;
         }
     }
@@ -625,7 +623,7 @@ public class FtpFileObject extends Abstr
     protected OutputStream doGetOutputStream(boolean bAppend)
         throws Exception
     {
-        final FtpClient client = ftpFs.getClient();
+        final FtpClient client = getAbstractFileSystem().getClient();
         try
         {
             OutputStream out = null;
@@ -649,7 +647,7 @@ public class FtpFileObject extends Abstr
         }
         catch (Exception e)
         {
-            ftpFs.putClient(client);
+            getAbstractFileSystem().putClient(client);
             throw e;
         }
     }
@@ -661,7 +659,7 @@ public class FtpFileObject extends Abstr
 
     FtpInputStream getInputStream(long filePointer) throws IOException
     {
-        final FtpClient client = ftpFs.getClient();
+        final FtpClient client = getAbstractFileSystem().getClient();
         try
         {
             final InputStream instr = client.retrieveFileStream(relPath, filePointer);
@@ -675,7 +673,7 @@ public class FtpFileObject extends Abstr
         }
         catch (IOException e)
         {
-            ftpFs.putClient(client);
+            getAbstractFileSystem().putClient(client);
             throw e;
         }
     }
@@ -713,7 +711,7 @@ public class FtpFileObject extends Abstr
             }
             finally
             {
-                ftpFs.putClient(client);
+                getAbstractFileSystem().putClient(client);
             }
 
             if (!ok)
@@ -750,7 +748,7 @@ public class FtpFileObject extends Abstr
             }
             finally
             {
-                ftpFs.putClient(client);
+                getAbstractFileSystem().putClient(client);
             }
 
             if (!ok)

Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/gzip/GzipFileObject.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/gzip/GzipFileObject.java?rev=1363962&r1=1363961&r2=1363962&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/gzip/GzipFileObject.java (original)
+++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/gzip/GzipFileObject.java Fri Jul 20 21:59:48 2012
@@ -24,14 +24,13 @@ import java.util.zip.GZIPOutputStream;
 import org.apache.commons.vfs2.FileObject;
 import org.apache.commons.vfs2.provider.AbstractFileName;
 import org.apache.commons.vfs2.provider.compressed.CompressedFileFileObject;
-import org.apache.commons.vfs2.provider.compressed.CompressedFileFileSystem;
 
 /**
  * the gzip file.
  */
-public class GzipFileObject extends CompressedFileFileObject
+public class GzipFileObject extends CompressedFileFileObject<GzipFileSystem>
 {
-    protected GzipFileObject(AbstractFileName name, FileObject container, CompressedFileFileSystem fs)
+    protected GzipFileObject(AbstractFileName name, FileObject container, GzipFileSystem fs)
     {
         super(name, container, fs);
     }

Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileObject.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileObject.java?rev=1363962&r1=1363961&r2=1363962&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileObject.java (original)
+++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileObject.java Fri Jul 20 21:59:48 2012
@@ -44,16 +44,14 @@ import org.apache.commons.vfs2.util.Rand
  *
  * @todo status codes
  */
-public class HttpFileObject extends AbstractFileObject
+public class HttpFileObject extends AbstractFileObject<HttpFileSystem>
 {
-    private final HttpFileSystem fileSystem;
     private final String urlCharset;
     private HeadMethod method;
 
     protected HttpFileObject(final AbstractFileName name, final HttpFileSystem fileSystem)
     {
         super(name, fileSystem);
-        this.fileSystem = fileSystem;
         urlCharset = HttpFileSystemConfigBuilder.getInstance().getUrlCharset(getFileSystem().getFileSystemOptions());
     }
 
@@ -144,7 +142,7 @@ public class HttpFileObject extends Abst
     {
         final GetMethod getMethod = new GetMethod();
         setupMethod(getMethod);
-        final int status = fileSystem.getClient().executeMethod(getMethod);
+        final int status = getAbstractFileSystem().getClient().executeMethod(getMethod);
         if (status == HttpURLConnection.HTTP_NOT_FOUND)
         {
             throw new FileNotFoundException(getName());
@@ -219,7 +217,7 @@ public class HttpFileObject extends Abst
         }
         method = new HeadMethod();
         setupMethod(method);
-        final HttpClient client = fileSystem.getClient();
+        final HttpClient client = getAbstractFileSystem().getClient();
         client.executeMethod(method);
         method.releaseConnection();
         return method;

Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/local/LocalFile.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/local/LocalFile.java?rev=1363962&r1=1363961&r2=1363962&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/local/LocalFile.java (original)
+++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/local/LocalFile.java Fri Jul 20 21:59:48 2012
@@ -36,7 +36,7 @@ import org.apache.commons.vfs2.util.Rand
 /**
  * A file object implementation which uses direct file access.
  */
-public class LocalFile extends AbstractFileObject
+public class LocalFile extends AbstractFileObject<LocalFileSystem>
 {
     private final String rootFile;
 

Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ram/RamFileObject.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ram/RamFileObject.java?rev=1363962&r1=1363961&r2=1363962&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ram/RamFileObject.java (original)
+++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ram/RamFileObject.java Fri Jul 20 21:59:48 2012
@@ -23,6 +23,7 @@ import java.io.OutputStream;
 
 import org.apache.commons.vfs2.FileObject;
 import org.apache.commons.vfs2.FileSystemException;
+import org.apache.commons.vfs2.FileSystemOptions;
 import org.apache.commons.vfs2.FileType;
 import org.apache.commons.vfs2.RandomAccessContent;
 import org.apache.commons.vfs2.provider.AbstractFileName;
@@ -34,14 +35,9 @@ import org.apache.commons.vfs2.util.Rand
  * A RAM File contains a single RAM FileData instance, it provides methods to access the data by implementing FileObject
  * interface.
  */
-public class RamFileObject extends AbstractFileObject
+public class RamFileObject extends AbstractFileObject<RamFileSystem>
 {
     /**
-     * File System.
-     */
-    private final RamFileSystem fs;
-
-    /**
      * RAM File Object Data.
      */
     private RamFileData data;
@@ -55,13 +51,12 @@ public class RamFileObject extends Abstr
     protected RamFileObject(AbstractFileName name, RamFileSystem fs)
     {
         super(name, fs);
-        this.fs = fs;
-        this.fs.attach(this);
+        this.getAbstractFileSystem().attach(this);
     }
 
     private void save() throws FileSystemException
     {
-        this.fs.save(this);
+        this.getAbstractFileSystem().save(this);
     }
 
     /*
@@ -83,7 +78,7 @@ public class RamFileObject extends Abstr
     @Override
     protected String[] doListChildren() throws Exception
     {
-        return this.fs.listChildren(this.getName());
+        return this.getAbstractFileSystem().listChildren(this.getName());
     }
 
     /*
@@ -142,7 +137,7 @@ public class RamFileObject extends Abstr
         {
             throw new FileSystemException(this.getName() + " cannot be deleted while the file is openg");
         }
-        fs.delete(this);
+        getAbstractFileSystem().delete(this);
     }
 
     /*
@@ -190,7 +185,7 @@ public class RamFileObject extends Abstr
     protected void doRename(FileObject newFile) throws Exception
     {
         RamFileObject newRamFileObject = (RamFileObject) FileObjectUtils.getAbstractFileObject(newFile);
-        fs.rename(this, newRamFileObject);
+        getAbstractFileSystem().rename(this, newRamFileObject);
     }
 
     /*
@@ -213,7 +208,7 @@ public class RamFileObject extends Abstr
     @Override
     protected void doAttach() throws Exception
     {
-        this.fs.attach(this);
+        this.getAbstractFileSystem().attach(this);
     }
 
     /**
@@ -272,11 +267,13 @@ public class RamFileObject extends Abstr
      */
     synchronized void resize(long newSize) throws IOException
     {
-        if (fs.getFileSystemOptions() != null)
+        final RamFileSystem afs = getAbstractFileSystem();
+        final FileSystemOptions afsOptions = afs.getFileSystemOptions();
+        if (afsOptions != null)
         {
             // A future implementation may allow longs...
-            int maxSize = RamFileSystemConfigBuilder.getInstance().getMaxSize(fs.getFileSystemOptions());
-            if (fs.size() + newSize - this.size() > maxSize)
+            int maxSize = RamFileSystemConfigBuilder.getInstance().getMaxSize(afsOptions);
+            if (afs.size() + newSize - this.size() > maxSize)
             {
                 throw new IOException("FileSystem capacity (" + maxSize + ") exceeded.");
             }

Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/sftp/SftpFileObject.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/sftp/SftpFileObject.java?rev=1363962&r1=1363961&r2=1363962&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/sftp/SftpFileObject.java (original)
+++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/sftp/SftpFileObject.java Fri Jul 20 21:59:48 2012
@@ -49,11 +49,10 @@ import com.jcraft.jsch.SftpException;
  *
  * @version $Id$
  */
-public class SftpFileObject extends AbstractFileObject
+public class SftpFileObject extends AbstractFileObject<SftpFileSystem>
 {
     private static final long MOD_TIME_FACTOR = 1000L;
 
-    private final SftpFileSystem fileSystem;
     private SftpATTRS attrs;
     private final String relPath;
 
@@ -63,7 +62,6 @@ public class SftpFileObject extends Abst
             final SftpFileSystem fileSystem) throws FileSystemException
     {
         super(name, fileSystem);
-        this.fileSystem = fileSystem;
         relPath = UriParser.decode(fileSystem.getRootName().getRelativeName(
                 name));
     }
@@ -153,7 +151,7 @@ public class SftpFileObject extends Abst
      */
     private void statSelf() throws IOException
     {
-        ChannelSftp channel = fileSystem.getChannel();
+        ChannelSftp channel = getAbstractFileSystem().getChannel();
         try
         {
             setStat(channel.stat(relPath));
@@ -166,7 +164,7 @@ public class SftpFileObject extends Abst
                 if (e.id != ChannelSftp.SSH_FX_NO_SUCH_FILE)
                 {
                     channel.disconnect();
-                    channel = fileSystem.getChannel();
+                    channel = getAbstractFileSystem().getChannel();
                     setStat(channel.stat(relPath));
                 }
                 else
@@ -190,7 +188,7 @@ public class SftpFileObject extends Abst
         }
         finally
         {
-            fileSystem.putChannel(channel);
+            getAbstractFileSystem().putChannel(channel);
         }
     }
 
@@ -208,14 +206,14 @@ public class SftpFileObject extends Abst
     @Override
     protected void doCreateFolder() throws Exception
     {
-        final ChannelSftp channel = fileSystem.getChannel();
+        final ChannelSftp channel = getAbstractFileSystem().getChannel();
         try
         {
             channel.mkdir(relPath);
         }
         finally
         {
-            fileSystem.putChannel(channel);
+            getAbstractFileSystem().putChannel(channel);
         }
     }
 
@@ -251,14 +249,14 @@ public class SftpFileObject extends Abst
 
     private void flushStat() throws IOException, SftpException
     {
-        final ChannelSftp channel = fileSystem.getChannel();
+        final ChannelSftp channel = getAbstractFileSystem().getChannel();
         try
         {
             channel.setStat(relPath, attrs);
         }
         finally
         {
-            fileSystem.putChannel(channel);
+            getAbstractFileSystem().putChannel(channel);
         }
     }
 
@@ -268,7 +266,7 @@ public class SftpFileObject extends Abst
     @Override
     protected void doDelete() throws Exception
     {
-        final ChannelSftp channel = fileSystem.getChannel();
+        final ChannelSftp channel = getAbstractFileSystem().getChannel();
         try
         {
             if (isFile())
@@ -282,7 +280,7 @@ public class SftpFileObject extends Abst
         }
         finally
         {
-            fileSystem.putChannel(channel);
+            getAbstractFileSystem().putChannel(channel);
         }
     }
 
@@ -292,7 +290,7 @@ public class SftpFileObject extends Abst
     @Override
     protected void doRename(FileObject newFile) throws Exception
     {
-        final ChannelSftp channel = fileSystem.getChannel();
+        final ChannelSftp channel = getAbstractFileSystem().getChannel();
         try
         {
             SftpFileObject newSftpFileObject = (SftpFileObject) FileObjectUtils.getAbstractFileObject(newFile);
@@ -300,7 +298,7 @@ public class SftpFileObject extends Abst
         }
         finally
         {
-            fileSystem.putChannel(channel);
+            getAbstractFileSystem().putChannel(channel);
         }
     }
 
@@ -318,7 +316,7 @@ public class SftpFileObject extends Abst
         boolean isInGroup = false;
         if (checkIds)
         {
-            for (int groupId : fileSystem.getGroupsIds())
+            for (int groupId : getAbstractFileSystem().getGroupsIds())
             {
                 if (groupId == attrs.getGId())
                 {
@@ -327,7 +325,7 @@ public class SftpFileObject extends Abst
                 }
             }
         }
-        final boolean isOwner = checkIds ?  attrs.getUId() == fileSystem.getUId() : false;
+        final boolean isOwner = checkIds ?  attrs.getUId() == getAbstractFileSystem().getUId() : false;
         final PosixPermissions permissions = new PosixPermissions(attrs.getPermissions(), isOwner, isInGroup);
 
         return permissions;
@@ -413,7 +411,7 @@ public class SftpFileObject extends Abst
         }
         // List the contents of the folder
         Vector<?> vector = null;
-        final ChannelSftp channel = fileSystem.getChannel();
+        final ChannelSftp channel = getAbstractFileSystem().getChannel();
 
         try
         {
@@ -469,7 +467,7 @@ public class SftpFileObject extends Abst
         }
         finally
         {
-            fileSystem.putChannel(channel);
+            getAbstractFileSystem().putChannel(channel);
         }
         if (vector == null)
         {
@@ -553,7 +551,7 @@ public class SftpFileObject extends Abst
      */
     InputStream getInputStream(long filePointer) throws IOException
     {
-        final ChannelSftp channel = fileSystem.getChannel();
+        final ChannelSftp channel = getAbstractFileSystem().getChannel();
         // Using InputStream directly from the channel
         // is much faster than the memory method.
         try
@@ -563,7 +561,7 @@ public class SftpFileObject extends Abst
         } 
         catch (SftpException e)
         {
-            fileSystem.putChannel(channel);
+            getAbstractFileSystem().putChannel(channel);
             throw new FileSystemException(e);
         }
     }
@@ -575,9 +573,9 @@ public class SftpFileObject extends Abst
     protected InputStream doGetInputStream() throws Exception
     {
         // VFS-113: avoid npe
-        synchronized (fileSystem)
+        synchronized (getAbstractFileSystem())
         {
-            final ChannelSftp channel = fileSystem.getChannel();
+            final ChannelSftp channel = getAbstractFileSystem().getChannel();
             try
             {
                 // return channel.get(getName().getPath());
@@ -620,7 +618,7 @@ public class SftpFileObject extends Abst
             }
             finally
             {
-//              fileSystem.putChannel(channel);
+//              getAbstractFileSystem().putChannel(channel);
             }
         }
     }
@@ -634,11 +632,11 @@ public class SftpFileObject extends Abst
         // TODO - Don't write the entire file into memory. Use the stream-based
         // methods on ChannelSftp once the work properly
         /*
-        final ChannelSftp channel = fileSystem.getChannel();
+        final ChannelSftp channel = getAbstractFileSystem().getChannel();
         return new SftpOutputStream(channel);
         */
 
-        final ChannelSftp channel = fileSystem.getChannel();
+        final ChannelSftp channel = getAbstractFileSystem().getChannel();
         return new SftpOutputStream(channel, channel.put(relPath));
     }
 
@@ -661,7 +659,7 @@ public class SftpFileObject extends Abst
         @Override
         protected void onClose() throws IOException
         {
-            fileSystem.putChannel(channel);
+            getAbstractFileSystem().putChannel(channel);
         }
     }
 
@@ -685,7 +683,7 @@ public class SftpFileObject extends Abst
         @Override
         protected void onClose() throws IOException
         {
-            fileSystem.putChannel(channel);
+            getAbstractFileSystem().putChannel(channel);
         }
     }
 

Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/tar/TarFileObject.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/tar/TarFileObject.java?rev=1363962&r1=1363961&r2=1363962&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/tar/TarFileObject.java (original)
+++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/tar/TarFileObject.java Fri Jul 20 21:59:48 2012
@@ -29,12 +29,11 @@ import org.apache.commons.vfs2.provider.
 /**
  * A file in a Tar file system.
  */
-public class TarFileObject extends AbstractFileObject
+public class TarFileObject extends AbstractFileObject<TarFileSystem>
 {
     /** The TarArchiveEntry */
     private TarArchiveEntry entry;
     private final HashSet<String> children = new HashSet<String>();
-    private final TarFileSystem fs;
     private FileType type;
 
     protected TarFileObject(AbstractFileName name,
@@ -43,7 +42,6 @@ public class TarFileObject extends Abstr
                             boolean tarExists) throws FileSystemException
     {
         super(name, fs);
-        this.fs = fs;
         setTarEntry(entry);
         if (!tarExists)
         {
@@ -170,6 +168,6 @@ public class TarFileObject extends Abstr
             throw new FileSystemException("vfs.provider/read-not-file.error", getName());
         }
 
-        return fs.getInputStream(entry);
+        return getAbstractFileSystem().getInputStream(entry);
     }
 }

Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/url/UrlFileObject.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/url/UrlFileObject.java?rev=1363962&r1=1363961&r2=1363962&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/url/UrlFileObject.java (original)
+++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/url/UrlFileObject.java Fri Jul 20 21:59:48 2012
@@ -38,7 +38,7 @@ import org.apache.commons.vfs2.provider.
  * @todo Implement set lastModified and get/set attribute
  * @todo Implement getOutputStream()
  */
-public class UrlFileObject extends AbstractFileObject
+public class UrlFileObject extends AbstractFileObject<UrlFileSystem>
 {
     private URL url;
 

Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/zip/ZipFileObject.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/zip/ZipFileObject.java?rev=1363962&r1=1363961&r2=1363962&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/zip/ZipFileObject.java (original)
+++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/zip/ZipFileObject.java Fri Jul 20 21:59:48 2012
@@ -29,12 +29,11 @@ import org.apache.commons.vfs2.provider.
 /**
  * A file in a Zip file system.
  */
-public class ZipFileObject extends AbstractFileObject
+public class ZipFileObject extends AbstractFileObject<ZipFileSystem>
 {
     /** The ZipEntry. */
     protected ZipEntry entry;
     private final HashSet<String> children = new HashSet<String>();
-    private final ZipFileSystem fs;
     // protected final ZipFile file;
 
     private FileType type;
@@ -45,7 +44,6 @@ public class ZipFileObject extends Abstr
                             boolean zipExists) throws FileSystemException
     {
         super(name, fs);
-        this.fs = fs;
         setZipEntry(entry);
         if (!zipExists)
         {
@@ -163,6 +161,6 @@ public class ZipFileObject extends Abstr
             throw new FileSystemException("vfs.provider/read-not-file.error", getName());
         }
 
-        return fs.getZipFile().getInputStream(entry);
+        return getAbstractFileSystem().getZipFile().getInputStream(entry);
     }
 }

Modified: commons/proper/vfs/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/src/changes/changes.xml?rev=1363962&r1=1363961&r2=1363962&view=diff
==============================================================================
--- commons/proper/vfs/trunk/src/changes/changes.xml (original)
+++ commons/proper/vfs/trunk/src/changes/changes.xml Fri Jul 20 21:59:48 2012
@@ -23,6 +23,9 @@
 
   <body>
     <release version="2.1" date="TBD" description="New features and bug fix release.">
+      <action issue="VFS-429" dev="ggregory" type="add" due-to="awelynant">
+        Remove extra FileSystem ivar in AbstractFileObject subclasses with generics.
+      </action>
       <action issue="VFS-427" dev="ggregory" type="add" due-to="awelynant">
         [HTTP] NPE on HttpFileObject.getContent().getContentInfo().
       </action>