Author: hairong
Date: Wed Aug 11 04:43:26 2010
New Revision: 984301

URL: http://svn.apache.org/viewvc?rev=984301&view=rev
Log:
HADOOP-6900. Make the iterator returned by FileSystem#listLocatedStatus to 
throw IOException rather than RuntimeException when there is an IO error 
fetching the next file. Contributed by Hairong Kuang. 


Added:
    hadoop/common/trunk/src/java/org/apache/hadoop/fs/RemoteIterator.java
Modified:
    hadoop/common/trunk/CHANGES.txt
    hadoop/common/trunk/src/java/org/apache/hadoop/fs/AbstractFileSystem.java
    hadoop/common/trunk/src/java/org/apache/hadoop/fs/ChecksumFileSystem.java
    hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileContext.java
    hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileSystem.java
    hadoop/common/trunk/src/java/org/apache/hadoop/fs/FilterFileSystem.java
    
hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextMainOperationsBaseTest.java
    
hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextSymlinkBaseTest.java
    
hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextURIBase.java
    hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestListFiles.java

Modified: hadoop/common/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/hadoop/common/trunk/CHANGES.txt?rev=984301&r1=984300&r2=984301&view=diff
==============================================================================
--- hadoop/common/trunk/CHANGES.txt (original)
+++ hadoop/common/trunk/CHANGES.txt Wed Aug 11 04:43:26 2010
@@ -111,7 +111,11 @@ Trunk (unreleased changes)
     HADOOP-6862. Adds api to add/remove user and group to AccessControlList
     (amareshwari)
 
-    HADOOP6911. doc update for DelegationTokenFetcher (boryas)
+    HADOOP-6911. doc update for DelegationTokenFetcher (boryas)
+
+    HADOOP-6900. Make the iterator returned by FileSystem#listLocatedStatus to 
+    throw IOException rather than RuntimeException when there is an IO error
+    fetching the next file. (hairong)
 
   OPTIMIZATIONS
 

Modified: 
hadoop/common/trunk/src/java/org/apache/hadoop/fs/AbstractFileSystem.java
URL: 
http://svn.apache.org/viewvc/hadoop/common/trunk/src/java/org/apache/hadoop/fs/AbstractFileSystem.java?rev=984301&r1=984300&r2=984301&view=diff
==============================================================================
--- hadoop/common/trunk/src/java/org/apache/hadoop/fs/AbstractFileSystem.java 
(original)
+++ hadoop/common/trunk/src/java/org/apache/hadoop/fs/AbstractFileSystem.java 
Wed Aug 11 04:43:26 2010
@@ -619,7 +619,7 @@ public abstract class AbstractFileSystem
       }
       // Delete the destination that is a file or an empty directory
       if (dstStatus.isDirectory()) {
-        Iterator<FileStatus> list = listStatusIterator(dst);
+        RemoteIterator<FileStatus> list = listStatusIterator(dst);
         if (list != null && list.hasNext()) {
           throw new IOException(
               "Rename cannot overwrite non empty destination directory " + 
dst);
@@ -757,10 +757,10 @@ public abstract class AbstractFileSystem
    * {...@link FileContext#listStatus(Path)} except that Path f must be for 
this
    * file system.
    */
-  protected Iterator<FileStatus> listStatusIterator(final Path f)
+  protected RemoteIterator<FileStatus> listStatusIterator(final Path f)
       throws AccessControlException, FileNotFoundException,
       UnresolvedLinkException, IOException {
-    return new Iterator<FileStatus>() {
+    return new RemoteIterator<FileStatus>() {
       private int i = 0;
       private FileStatus[] statusList = listStatus(f);
       
@@ -776,11 +776,6 @@ public abstract class AbstractFileSystem
         }
         return statusList[i++];
       }
-      
-      @Override
-      public void remove() {
-        throw new UnsupportedOperationException("Remove is not supported");
-      }
     };
   }
 
@@ -789,52 +784,29 @@ public abstract class AbstractFileSystem
    * {...@link FileContext#listLocatedStatus(Path)} except that Path f 
    * must be for this file system.
    */
-  protected Iterator<LocatedFileStatus> listLocatedStatus(final Path f)
+  protected RemoteIterator<LocatedFileStatus> listLocatedStatus(final Path f)
       throws AccessControlException, FileNotFoundException,
       UnresolvedLinkException, IOException {
-    return new Iterator<LocatedFileStatus>() {
-      private Iterator<FileStatus> itor = listStatusIterator(f);
+    return new RemoteIterator<LocatedFileStatus>() {
+      private RemoteIterator<FileStatus> itor = listStatusIterator(f);
       
-      /**
-       *  {...@inheritdoc}
-       *  @return {...@inheritdog} 
-       *  @throws Runtimeexception if any IOException occurs during traversal;
-       *  the IOException is set as the cause of the RuntimeException
-       */
       @Override
-      public boolean hasNext() {
+      public boolean hasNext() throws IOException {
         return itor.hasNext();
       }
       
-      /**
-       *  {...@inheritdoc}
-       *  @return {...@inheritdoc} 
-       *  @throws Runtimeexception if any IOException occurs during traversal;
-       *  the IOException is set as the cause of the RuntimeException
-       *  @exception {...@inheritdoc}
-       */
       @Override
-      public LocatedFileStatus next() {
+      public LocatedFileStatus next() throws IOException {
         if (!hasNext()) {
           throw new NoSuchElementException("No more entry in " + f);
         }
         FileStatus result = itor.next();
-        try {
-          
-          BlockLocation[] locs = null;
-          if (result.isFile()) {
-            locs = getFileBlockLocations(
+        BlockLocation[] locs = null;
+        if (result.isFile()) {
+          locs = getFileBlockLocations(
               result.getPath(), 0, result.getLen());
-          }
-          return new LocatedFileStatus(result, locs);
-        } catch (IOException ioe) {
-          throw (RuntimeException)new RuntimeException().initCause(ioe);
         }
-      }
-      
-      @Override
-      public void remove() {
-        throw new UnsupportedOperationException("Remove is not supported");
+        return new LocatedFileStatus(result, locs);
       }
     };
   }

Modified: 
hadoop/common/trunk/src/java/org/apache/hadoop/fs/ChecksumFileSystem.java
URL: 
http://svn.apache.org/viewvc/hadoop/common/trunk/src/java/org/apache/hadoop/fs/ChecksumFileSystem.java?rev=984301&r1=984300&r2=984301&view=diff
==============================================================================
--- hadoop/common/trunk/src/java/org/apache/hadoop/fs/ChecksumFileSystem.java 
(original)
+++ hadoop/common/trunk/src/java/org/apache/hadoop/fs/ChecksumFileSystem.java 
Wed Aug 11 04:43:26 2010
@@ -504,7 +504,7 @@ public abstract class ChecksumFileSystem
    * @throws IOException
    */
   @Override
-  public Iterator<LocatedFileStatus> listLocatedStatus(Path f)
+  public RemoteIterator<LocatedFileStatus> listLocatedStatus(Path f)
   throws IOException {
     return fs.listLocatedStatus(f, DEFAULT_FILTER);
   }

Modified: hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileContext.java
URL: 
http://svn.apache.org/viewvc/hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileContext.java?rev=984301&r1=984300&r2=984301&view=diff
==============================================================================
--- hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileContext.java 
(original)
+++ hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileContext.java Wed Aug 
11 04:43:26 2010
@@ -27,10 +27,8 @@ import java.util.Arrays;
 import java.util.EnumSet;
 import java.util.IdentityHashMap;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.Stack;
 import java.util.TreeSet;
@@ -1275,12 +1273,13 @@ public final class FileContext {
    * @throws UnexpectedServerException If server implementation throws 
    *           undeclared exception to RPC server
    */
-  public Iterator<FileStatus> listStatus(final Path f) throws
+  public RemoteIterator<FileStatus> listStatus(final Path f) throws
       AccessControlException, FileNotFoundException,
       UnsupportedFileSystemException, IOException {
     final Path absF = fixRelativePart(f);
-    return new FSLinkResolver<Iterator<FileStatus>>() {
-      public Iterator<FileStatus> next(final AbstractFileSystem fs, final Path 
p) 
+    return new FSLinkResolver<RemoteIterator<FileStatus>>() {
+      public RemoteIterator<FileStatus> next(
+          final AbstractFileSystem fs, final Path p) 
         throws IOException, UnresolvedLinkException {
         return fs.listStatusIterator(p);
       }
@@ -1314,12 +1313,13 @@ public final class FileContext {
    * @throws UnexpectedServerException If server implementation throws 
    *           undeclared exception to RPC server
    */
-  public Iterator<LocatedFileStatus> listLocatedStatus(final Path f) throws
+  public RemoteIterator<LocatedFileStatus> listLocatedStatus(
+      final Path f) throws
       AccessControlException, FileNotFoundException,
       UnsupportedFileSystemException, IOException {
     final Path absF = fixRelativePart(f);
-    return new FSLinkResolver<Iterator<LocatedFileStatus>>() {
-      public Iterator<LocatedFileStatus> next(
+    return new FSLinkResolver<RemoteIterator<LocatedFileStatus>>() {
+      public RemoteIterator<LocatedFileStatus> next(
           final AbstractFileSystem fs, final Path p) 
         throws IOException, UnresolvedLinkException {
         return fs.listLocatedStatus(p);
@@ -1466,7 +1466,8 @@ public final class FileContext {
         return new ContentSummary(status.getLen(), 1, 0);
       }
       long[] summary = {0, 0, 1};
-      Iterator<FileStatus> statusIterator = FileContext.this.listStatus(f);
+      RemoteIterator<FileStatus> statusIterator = 
+        FileContext.this.listStatus(f);
       while(statusIterator.hasNext()) {
         FileStatus s = statusIterator.next();
         ContentSummary c = s.isDirectory() ? getContentSummary(s.getPath()) :
@@ -1626,24 +1627,32 @@ public final class FileContext {
      * @throws UnexpectedServerException If server implementation throws 
      *           undeclared exception to RPC server
      */
-    public Iterator<LocatedFileStatus> listFiles(
+    public RemoteIterator<LocatedFileStatus> listFiles(
         final Path f, final boolean recursive) throws AccessControlException,
         FileNotFoundException, UnsupportedFileSystemException, 
         IOException {
-      return new Iterator<LocatedFileStatus>() {
-        private Stack<Iterator<LocatedFileStatus>> itors = 
-          new Stack<Iterator<LocatedFileStatus>>();
-        Iterator<LocatedFileStatus> curItor = listLocatedStatus(f);
+      return new RemoteIterator<LocatedFileStatus>() {
+        private Stack<RemoteIterator<LocatedFileStatus>> itors = 
+          new Stack<RemoteIterator<LocatedFileStatus>>();
+        RemoteIterator<LocatedFileStatus> curItor = listLocatedStatus(f);
         LocatedFileStatus curFile;
-       
+
         /**
-         *  {...@inheritdoc}
-         *  @return {...@inheritdog} 
-         *  @throws Runtimeexception if any IOException occurs during 
traversal;
-         *  the IOException is set as the cause of the RuntimeException
+         * Returns <tt>true</tt> if the iterator has more files.
+         *
+         * @return <tt>true</tt> if the iterator has more files.
+         * @throws AccessControlException if not allowed to access next
+         *                                file's status or locations
+         * @throws FileNotFoundException if next file does not exist any more
+         * @throws UnsupportedFileSystemException if next file's 
+         *                                        fs is unsupported
+         * @throws IOException for all other IO errors
+         *                     for example, NameNode is not avaialbe or
+         *                     NameNode throws IOException due to an error
+         *                     while getting the status or block locations
          */
         @Override
-        public boolean hasNext() {
+        public boolean hasNext() throws IOException {
           while (curFile == null) {
             if (curItor.hasNext()) {
               handleFileStat(curItor.next());
@@ -1659,44 +1668,49 @@ public final class FileContext {
         /**
          * Process the input stat.
          * If it is a file, return the file stat.
-         * If it is a directory, tranverse the directory if recursive is true;
+         * If it is a directory, traverse the directory if recursive is true;
          * ignore it if recursive is false.
          * If it is a symlink, resolve the symlink first and then process it
          * depending on if it is a file or directory.
          * @param stat input status
-         * @throws RuntimeException if any io error occurs; the io exception
-         * is set as the cause of RuntimeException
+         * @throws AccessControlException if access is denied
+         * @throws FileNotFoundException if file is not found
+         * @throws UnsupportedFileSystemException if fs is not supported
+         * @throws IOException for all other IO errors
          */
-        private void handleFileStat(LocatedFileStatus stat) {
-          try {
-            if (stat.isFile()) { // file
-              curFile = stat;
-            } else if (stat.isSymlink()) { // symbolic link
-              // resolve symbolic link
-              FileStatus symstat = FileContext.this.getFileStatus(
-                  stat.getSymlink());
-              if (symstat.isFile() || (recursive && symstat.isDirectory())) {
-                itors.push(curItor);
-                curItor = listLocatedStatus(stat.getPath());
-              }
-            } else if (recursive) { // directory
+        private void handleFileStat(LocatedFileStatus stat)
+        throws IOException {
+          if (stat.isFile()) { // file
+            curFile = stat;
+          } else if (stat.isSymlink()) { // symbolic link
+            // resolve symbolic link
+            FileStatus symstat = FileContext.this.getFileStatus(
+                stat.getSymlink());
+            if (symstat.isFile() || (recursive && symstat.isDirectory())) {
               itors.push(curItor);
               curItor = listLocatedStatus(stat.getPath());
             }
-          } catch (IOException ioe) {
-            throw (RuntimeException)new RuntimeException().initCause(ioe);
+          } else if (recursive) { // directory
+            itors.push(curItor);
+            curItor = listLocatedStatus(stat.getPath());
           }
         }
 
         /**
-         *  {...@inheritdoc}
-         *  @return {...@inheritdoc} 
-         *  @throws Runtimeexception if any IOException occurs during 
traversal;
-         *  the IOException is set as the cause of the RuntimeException
-         *  @exception {...@inheritdoc}
+         * Returns the next file's status with its block locations
+         *
+         * @throws AccessControlException if not allowed to access next
+         *                                file's status or locations
+         * @throws FileNotFoundException if next file does not exist any more
+         * @throws UnsupportedFileSystemException if next file's 
+         *                                        fs is unsupported
+         * @throws IOException for all other IO errors
+         *                     for example, NameNode is not avaialbe or
+         *                     NameNode throws IOException due to an error
+         *                     while getting the status or block locations
          */
         @Override
-        public LocatedFileStatus next() {
+        public LocatedFileStatus next() throws IOException {
           if (hasNext()) {
             LocatedFileStatus result = curFile;
             curFile = null;
@@ -1704,12 +1718,6 @@ public final class FileContext {
           } 
           throw new java.util.NoSuchElementException("No more entry in " + f);
         }
-
-        @Override
-        public void remove() {
-          throw new UnsupportedOperationException("Remove is not supported");
-
-        }
       };
     }
 

Modified: hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileSystem.java
URL: 
http://svn.apache.org/viewvc/hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileSystem.java?rev=984301&r1=984300&r2=984301&view=diff
==============================================================================
--- hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileSystem.java (original)
+++ hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileSystem.java Wed Aug 
11 04:43:26 2010
@@ -1326,18 +1326,14 @@ public abstract class FileSystem extends
    * If a returned status is a file, it contains the file's block locations.
    * 
    * @param f is the path
-   * @param filter path filter
    *
    * @return an iterator that traverses statuses of the files/directories 
    *         in the given path
-   * If any IO exception (for example the input directory gets deleted while
-   * listing is being executed), next() or hasNext() of the returned iterator
-   * may throw a RuntimeException with the IO exception as the cause.
    *
    * @throws FileNotFoundException If <code>f</code> does not exist
    * @throws IOException If an I/O error occurred
    */
-  public Iterator<LocatedFileStatus> listLocatedStatus(final Path f)
+  public RemoteIterator<LocatedFileStatus> listLocatedStatus(final Path f)
   throws FileNotFoundException, IOException {
     return listLocatedStatus(f, DEFAULT_FILTER);
   }
@@ -1353,50 +1349,28 @@ public abstract class FileSystem extends
    * @throws FileNotFoundException if <code>f</code> does not exist
    * @throws IOException if any I/O error occurred
    */
-  protected Iterator<LocatedFileStatus> listLocatedStatus(final Path f,
+  protected RemoteIterator<LocatedFileStatus> listLocatedStatus(final Path f,
       final PathFilter filter)
   throws FileNotFoundException, IOException {
-    return new Iterator<LocatedFileStatus>() {
+    return new RemoteIterator<LocatedFileStatus>() {
       private final FileStatus[] stats = listStatus(f, filter);
       private int i = 0;
 
-      /**
-       *  {...@inheritdoc}
-       *  @return {...@inheritdog} 
-       *  @throws Runtimeexception if any IOException occurs during traversal;
-       *  the IOException is set as the cause of the RuntimeException
-       */
       @Override
       public boolean hasNext() {
         return i<stats.length;
       }
 
-      /**
-       *  {...@inheritdoc}
-       *  @return {...@inheritdoc} 
-       *  @throws Runtimeexception if any IOException occurs during traversal;
-       *  the IOException is set as the cause of the RuntimeException
-       *  @exception {...@inheritdoc}
-       */
       @Override
-      public LocatedFileStatus next() {
+      public LocatedFileStatus next() throws IOException {
         if (!hasNext()) {
           throw new NoSuchElementException("No more entry in " + f);
         }
         FileStatus result = stats[i++];
-        try {
-          BlockLocation[] locs = result.isFile() ?
+        BlockLocation[] locs = result.isFile() ?
             getFileBlockLocations(result.getPath(), 0, result.getLen()) :
             null;
-          return new LocatedFileStatus(result, locs);
-        } catch (IOException ioe) {
-          throw (RuntimeException)new RuntimeException().initCause(ioe);
-        }
-      }
-      
-      @Override
-      public void remove() {
-        throw new UnsupportedOperationException("Remove is not supported");
+        return new LocatedFileStatus(result, locs);
       }
     };
   }
@@ -1413,30 +1387,22 @@ public abstract class FileSystem extends
    * @param recursive if the subdirectories need to be traversed recursively
    *
    * @return an iterator that traverses statuses of the files
-   * If any IO exception (for example a sub-directory gets deleted while
-   * listing is being executed), next() or hasNext() of the returned iterator
-   * may throw a RuntimeException with the IO exception as the cause.
    *
    * @throws FileNotFoundException when the path does not exist;
    *         IOException see specific implementation
    */
-  public Iterator<LocatedFileStatus> listFiles(
+  public RemoteIterator<LocatedFileStatus> listFiles(
       final Path f, final boolean recursive)
   throws FileNotFoundException, IOException {
-    return new Iterator<LocatedFileStatus>() {
-      private Stack<Iterator<LocatedFileStatus>> itors = 
-        new Stack<Iterator<LocatedFileStatus>>();
-      Iterator<LocatedFileStatus> curItor = listLocatedStatus(f);
-      LocatedFileStatus curFile;
+    return new RemoteIterator<LocatedFileStatus>() {
+      private Stack<RemoteIterator<LocatedFileStatus>> itors = 
+        new Stack<RemoteIterator<LocatedFileStatus>>();
+      private RemoteIterator<LocatedFileStatus> curItor =
+        listLocatedStatus(f);
+      private LocatedFileStatus curFile;
      
-      /**
-       *  {...@inheritdoc}
-       *  @return {...@inheritdog} 
-       *  @throws Runtimeexception if any IOException occurs during traversal;
-       *  the IOException is set as the cause of the RuntimeException
-       */
       @Override
-      public boolean hasNext() {
+      public boolean hasNext() throws IOException {
         while (curFile == null) {
           if (curItor.hasNext()) {
             handleFileStat(curItor.next());
@@ -1452,34 +1418,22 @@ public abstract class FileSystem extends
       /**
        * Process the input stat.
        * If it is a file, return the file stat.
-       * If it is a directory, tranverse the directory if recursive is true;
+       * If it is a directory, traverse the directory if recursive is true;
        * ignore it if recursive is false.
        * @param stat input status
-       * @throws RuntimeException if any io error occurs; the io exception
-       * is set as the cause of RuntimeException
+       * @throws IOException if any IO error occurs
        */
-      private void handleFileStat(LocatedFileStatus stat) {
-        try {
-          if (stat.isFile()) { // file
-            curFile = stat;
-          } else if (recursive) { // directory
-            itors.push(curItor);
-            curItor = listLocatedStatus(stat.getPath());
-          }
-        } catch (IOException ioe) {
-          throw (RuntimeException)new RuntimeException().initCause(ioe);
+      private void handleFileStat(LocatedFileStatus stat) throws IOException {
+        if (stat.isFile()) { // file
+          curFile = stat;
+        } else if (recursive) { // directory
+          itors.push(curItor);
+          curItor = listLocatedStatus(stat.getPath());
         }
       }
 
-      /**
-       *  {...@inheritdoc}
-       *  @return {...@inheritdoc} 
-       *  @throws Runtimeexception if any IOException occurs during traversal;
-       *  the IOException is set as the cause of the RuntimeException
-       *  @exception {...@inheritdoc}
-       */
       @Override
-      public LocatedFileStatus next() {
+      public LocatedFileStatus next() throws IOException {
         if (hasNext()) {
           LocatedFileStatus result = curFile;
           curFile = null;
@@ -1487,11 +1441,6 @@ public abstract class FileSystem extends
         } 
         throw new java.util.NoSuchElementException("No more entry in " + f);
       }
-
-      @Override
-      public void remove() {
-        throw new UnsupportedOperationException("Remove is not supported");
-      }
     };
   }
   

Modified: 
hadoop/common/trunk/src/java/org/apache/hadoop/fs/FilterFileSystem.java
URL: 
http://svn.apache.org/viewvc/hadoop/common/trunk/src/java/org/apache/hadoop/fs/FilterFileSystem.java?rev=984301&r1=984300&r2=984301&view=diff
==============================================================================
--- hadoop/common/trunk/src/java/org/apache/hadoop/fs/FilterFileSystem.java 
(original)
+++ hadoop/common/trunk/src/java/org/apache/hadoop/fs/FilterFileSystem.java Wed 
Aug 11 04:43:26 2010
@@ -167,7 +167,7 @@ public class FilterFileSystem extends Fi
   }
   
   /** List files and its block locations in a directory. */
-  public Iterator<LocatedFileStatus> listLocatedStatus(Path f)
+  public RemoteIterator<LocatedFileStatus> listLocatedStatus(Path f)
   throws IOException {
     return fs.listLocatedStatus(f);
   }

Added: hadoop/common/trunk/src/java/org/apache/hadoop/fs/RemoteIterator.java
URL: 
http://svn.apache.org/viewvc/hadoop/common/trunk/src/java/org/apache/hadoop/fs/RemoteIterator.java?rev=984301&view=auto
==============================================================================
--- hadoop/common/trunk/src/java/org/apache/hadoop/fs/RemoteIterator.java 
(added)
+++ hadoop/common/trunk/src/java/org/apache/hadoop/fs/RemoteIterator.java Wed 
Aug 11 04:43:26 2010
@@ -0,0 +1,42 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.fs;
+
+import java.io.IOException;
+import java.util.NoSuchElementException;
+/**
+ * An iterator over a collection whose elements need to be fetched remotely
+ */
+public interface RemoteIterator<E> {
+  /**
+   * Returns <tt>true</tt> if the iteration has more elements.
+   *
+   * @return <tt>true</tt> if the iterator has more elements.
+   * @throws IOException if any IO error occurs
+   */
+  boolean hasNext() throws IOException;
+
+  /**
+   * Returns the next element in the iteration.
+   *
+   * @return the next element in the iteration.
+   * @throws NoSuchElementException iteration has no more elements.
+   * @throws IOException if any IO error occurs
+   */
+  E next() throws IOException;
+}

Modified: 
hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextMainOperationsBaseTest.java
URL: 
http://svn.apache.org/viewvc/hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextMainOperationsBaseTest.java?rev=984301&r1=984300&r2=984301&view=diff
==============================================================================
--- 
hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextMainOperationsBaseTest.java
 (original)
+++ 
hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextMainOperationsBaseTest.java
 Wed Aug 11 04:43:26 2010
@@ -282,7 +282,7 @@ public abstract class FileContextMainOpe
     Assert.assertEquals(0, paths.length);
     
     // test listStatus that returns an iterator
-    Iterator<FileStatus> pathsIterator = 
+    RemoteIterator<FileStatus> pathsIterator = 
       fc.listStatus(getTestRootPath(fc, "test"));
     Assert.assertEquals(getTestRootPath(fc, "test/hadoop"), 
         pathsIterator.next().getPath());

Modified: 
hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextSymlinkBaseTest.java
URL: 
http://svn.apache.org/viewvc/hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextSymlinkBaseTest.java?rev=984301&r1=984300&r2=984301&view=diff
==============================================================================
--- 
hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextSymlinkBaseTest.java
 (original)
+++ 
hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextSymlinkBaseTest.java
 Wed Aug 11 04:43:26 2010
@@ -657,7 +657,7 @@ public abstract class FileContextSymlink
     // and link) and LocalFs is 3 (file, link, file crc).
     FileStatus[] stats = fc.util().listStatus(link);
     assertTrue(stats.length == 2 || stats.length == 3);
-    Iterator<FileStatus> statsItor = fc.listStatus(link);
+    RemoteIterator<FileStatus> statsItor = fc.listStatus(link);
     int dirLen = 0;
     while(statsItor.hasNext()) {
       statsItor.next();
@@ -1274,7 +1274,7 @@ public abstract class FileContextSymlink
     assertTrue(fc.getFileStatus(dirViaLink).isDirectory());
     FileStatus[] stats = fc.util().listStatus(dirViaLink);
     assertEquals(0, stats.length);
-    Iterator<FileStatus> statsItor = fc.listStatus(dirViaLink);
+    RemoteIterator<FileStatus> statsItor = fc.listStatus(dirViaLink);
     assertFalse(statsItor.hasNext());
     fc.delete(dirViaLink, false);
     assertFalse(exists(fc, dirViaLink));

Modified: 
hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextURIBase.java
URL: 
http://svn.apache.org/viewvc/hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextURIBase.java?rev=984301&r1=984300&r2=984301&view=diff
==============================================================================
--- 
hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextURIBase.java 
(original)
+++ 
hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextURIBase.java 
Wed Aug 11 04:43:26 2010
@@ -523,7 +523,8 @@ public abstract class FileContextURIBase
     Assert.assertEquals(0, paths.length);
     
     // test listStatus that returns an iterator of FileStatus
-    Iterator<FileStatus> pathsItor = fc1.listStatus(qualifiedPath("test", 
fc1));
+    RemoteIterator<FileStatus> pathsItor = 
+      fc1.listStatus(qualifiedPath("test", fc1));
     Assert.assertEquals(qualifiedPath(hPrefix, fc1), 
pathsItor.next().getPath());
     Assert.assertFalse(pathsItor.hasNext());
 

Modified: 
hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestListFiles.java
URL: 
http://svn.apache.org/viewvc/hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestListFiles.java?rev=984301&r1=984300&r2=984301&view=diff
==============================================================================
--- hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestListFiles.java 
(original)
+++ hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestListFiles.java 
Wed Aug 11 04:43:26 2010
@@ -80,7 +80,7 @@ public class TestListFiles {
     fs.mkdirs(TEST_DIR);
     writeFile(fs, FILE1, FILE_LEN);
 
-    Iterator<LocatedFileStatus> itor = fs.listFiles(
+    RemoteIterator<LocatedFileStatus> itor = fs.listFiles(
         FILE1, true);
     LocatedFileStatus stat = itor.next();
     assertFalse(itor.hasNext());
@@ -107,7 +107,7 @@ public class TestListFiles {
     fs.mkdirs(DIR1);
 
     // test empty directory
-    Iterator<LocatedFileStatus> itor = fs.listFiles(
+    RemoteIterator<LocatedFileStatus> itor = fs.listFiles(
         DIR1, true);
     assertFalse(itor.hasNext());
     itor = fs.listFiles(DIR1, false);


Reply via email to