Browse Source

svn merge -c 1102068 from trunk for HADOOP-7237.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/yahoo-merge@1127287 13f79535-47bb-0310-9956-ffa450edef68
Tsz-wo Sze 14 years ago
parent
commit
ce461c61bd

+ 3 - 0
CHANGES.txt

@@ -65,6 +65,9 @@ Trunk (unreleased changes)
     HADOOP-7275. Refactor the stat commands to conform to new FsCommand
     class.  (Daryn Sharp via szetszwo)
 
+    HADOOP-7237. Refactor the touchz commands to conform to new FsCommand
+    class.  (Daryn Sharp via szetszwo)
+
   OPTIMIZATIONS
 
   BUG FIXES

+ 3 - 38
src/java/org/apache/hadoop/fs/FsShell.java

@@ -431,27 +431,6 @@ public class FsShell extends Configured implements Tool {
     }
   }
 
-  /**
-   * (Re)create zero-length file at the specified path.
-   * This will be replaced by a more UNIX-like touch when files may be
-   * modified.
-   */
-  void touchz(String src) throws IOException {
-    Path f = new Path(src);
-    FileSystem srcFs = f.getFileSystem(getConf());
-    FileStatus st;
-    if (srcFs.exists(f)) {
-      st = srcFs.getFileStatus(f);
-      if (st.isDirectory()) {
-        // TODO: handle this
-        throw new IOException(src + " is a directory");
-      } else if (st.getLen() != 0)
-        throw new IOException(src + " must be a zero-length file");
-    }
-    FSDataOutputStream out = srcFs.create(f);
-    out.close();
-  }
-
   /**
    * Check file types.
    */
@@ -763,7 +742,7 @@ public class FsShell extends Configured implements Tool {
       GET_SHORT_USAGE + "\n\t" +
       "[" + COPYTOLOCAL_SHORT_USAGE + "] [-moveToLocal <src> <localdst>]\n\t" +
       "[-report]\n\t" +
-      "[-touchz <path>] [-test -[ezd] <path>]";
+      "[-test -[ezd] <path>]";
 
     String conf ="-conf <configuration file>:  Specify an application configuration file.";
  
@@ -836,10 +815,6 @@ public class FsShell extends Configured implements Tool {
 
     String moveToLocal = "-moveToLocal <src> <localdst>:  Not implemented yet \n";
         
-    String touchz = "-touchz <path>: Creates a file of zero length\n"
-	+ "\t\t at <path> with current time as the timestamp of that <path>.\n"
-	+ "\t\t An error is returned if the file exists with non-zero length\n";
-
     String test = "-test -[ezd] <path>: If file { exists, has zero length, is a directory\n" +
       "\t\tthen return 0, else return 1.\n";
 
@@ -887,8 +862,6 @@ public class FsShell extends Configured implements Tool {
       System.out.println(moveToLocal);
     } else if ("get".equals(cmd)) {
       System.out.println(get);
-    } else if ("touchz".equals(cmd)) {
-      System.out.println(touchz);
     } else if ("test".equals(cmd)) {
       System.out.println(test);
     } else if ("help".equals(cmd)) {
@@ -915,7 +888,6 @@ public class FsShell extends Configured implements Tool {
       System.out.println(get);
       System.out.println(copyToLocal);
       System.out.println(moveToLocal);
-      System.out.println(touchz);
       System.out.println(test);
 
       for (String thisCmdName : commandFactory.getNames()) {
@@ -972,8 +944,6 @@ public class FsShell extends Configured implements Tool {
           delete(argv[i], true, rmSkipTrash);
         } else if ("-df".equals(cmd)) {
           df(argv[i]);
-        } else if ("-touchz".equals(cmd)) {
-          touchz(argv[i]);
         }
       } catch (IOException e) {
         LOG.debug("Error", e);
@@ -1003,8 +973,7 @@ public class FsShell extends Configured implements Tool {
     } else if ("-D".equals(cmd)) {
       System.err.println("Usage: java FsShell" + 
                          " [-D <[property=value>]");
-    } else if ("-du".equals(cmd) || "-dus".equals(cmd) ||
-               "-touchz".equals(cmd)) {
+    } else if ("-du".equals(cmd) || "-dus".equals(cmd)) {
       System.err.println("Usage: java FsShell" + 
                          " [" + cmd + " <path>]");
     } else if ("-df".equals(cmd) ) {
@@ -1046,7 +1015,6 @@ public class FsShell extends Configured implements Tool {
       System.err.println("           [" + GET_SHORT_USAGE + "]");
       System.err.println("           [" + COPYTOLOCAL_SHORT_USAGE + "]");
       System.err.println("           [-moveToLocal [-crc] <src> <localdst>]");
-      System.err.println("           [-touchz <path>]");
       System.err.println("           [-test -[ezd] <path>]");
       for (String name : commandFactory.getNames()) {
       	instance = commandFactory.getInstance(name);
@@ -1096,8 +1064,7 @@ public class FsShell extends Configured implements Tool {
         printUsage(cmd);
         return exitCode;
       }
-    } else if ("-rm".equals(cmd) || "-rmr".equals(cmd) ||
-               "-touchz".equals(cmd)) {
+    } else if ("-rm".equals(cmd) || "-rmr".equals(cmd)) {
       if (argv.length < 2) {
         printUsage(cmd);
         return exitCode;
@@ -1166,8 +1133,6 @@ public class FsShell extends Configured implements Tool {
         du(argv, i);
       } else if ("-dus".equals(cmd)) {
         dus(argv, i);
-      } else if ("-touchz".equals(cmd)) {
-        exitCode = doall(cmd, argv, i);
       } else if ("-test".equals(cmd)) {
         exitCode = test(argv, i);
       } else if ("-help".equals(cmd)) {

+ 1 - 0
src/java/org/apache/hadoop/fs/shell/FsCommand.java

@@ -52,6 +52,7 @@ abstract public class FsCommand extends Command {
     factory.registerCommands(SetReplication.class);
     factory.registerCommands(Stat.class);
     factory.registerCommands(Tail.class);
+    factory.registerCommands(Touch.class);
   }
 
   protected FsCommand() {}

+ 80 - 0
src/java/org/apache/hadoop/fs/shell/Touchz.java

@@ -0,0 +1,80 @@
+/**
+ * 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.shell;
+
+import java.io.IOException;
+import java.util.LinkedList;
+
+import org.apache.hadoop.classification.InterfaceAudience;
+import org.apache.hadoop.classification.InterfaceStability;
+import org.apache.hadoop.fs.shell.PathExceptions.PathIOException;
+import org.apache.hadoop.fs.shell.PathExceptions.PathIsDirectoryException;
+
+/**
+ * Unix touch like commands 
+ */
+@InterfaceAudience.Private
+@InterfaceStability.Unstable
+
+class Touch extends FsCommand {
+  public static void registerCommands(CommandFactory factory) {
+    factory.addClass(Touchz.class, "-touchz");
+  }
+
+  /**
+   * (Re)create zero-length file at the specified path.
+   * This will be replaced by a more UNIX-like touch when files may be
+   * modified.
+   */
+  public static class Touchz extends Touch {
+    public static final String NAME = "touchz";
+    public static final String USAGE = "<path> ...";
+    public static final String DESCRIPTION =
+      "Creates a file of zero length\n" +
+      "at <path> with current time as the timestamp of that <path>.\n" +
+      "An error is returned if the file exists with non-zero length\n";
+
+    @Override
+    protected void processOptions(LinkedList<String> args) {
+      CommandFormat cf = new CommandFormat(null, 1, Integer.MAX_VALUE);
+      cf.parse(args);
+    }
+
+    @Override
+    protected void processPath(PathData item) throws IOException {
+      if (item.stat.isDirectory()) {
+        // TODO: handle this
+        throw new PathIsDirectoryException(item.toString());
+      }
+      if (item.stat.getLen() != 0) {
+        throw new PathIOException(item.toString(), "Not a zero-length file");
+      }
+      touchz(item);
+    }
+
+    @Override
+    protected void processNonexistentPath(PathData item) throws IOException {
+      touchz(item);
+    }
+
+    private void touchz(PathData item) throws IOException {
+      item.fs.create(item.path).close();
+    }
+  }
+}

+ 2 - 2
src/test/core/org/apache/hadoop/cli/testConf.xml

@@ -541,7 +541,7 @@
       <comparators>
         <comparator>
           <type>RegexpComparator</type>
-          <expected-output>^-touchz &lt;path&gt;: Creates a file of zero length( )*</expected-output>
+          <expected-output>^-touchz &lt;path&gt; \.\.\.:( |\t)*Creates a file of zero length( )*</expected-output>
         </comparator>
         <comparator>
           <type>RegexpComparator</type>
@@ -549,7 +549,7 @@
         </comparator>
         <comparator>
           <type>RegexpComparator</type>
-          <expected-output>^( |\t)* An error is returned if the file exists with non-zero length( )*</expected-output>
+          <expected-output>^( |\t)*An error is returned if the file exists with non-zero length( )*</expected-output>
         </comparator>
       </comparators>
     </test>