From cd2079f0e4aa292492b5d6c0d0af5bfa41a39043 Mon Sep 17 00:00:00 2001 From: Tsz-wo Sze Date: Wed, 11 May 2011 20:20:18 +0000 Subject: [PATCH] HADOOP-7237. Refactor the touchz commands to conform to new FsCommand class. Contributed by Daryn Sharp git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1102068 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES.txt | 3 + src/java/org/apache/hadoop/fs/FsShell.java | 41 +--------- .../org/apache/hadoop/fs/shell/FsCommand.java | 1 + .../org/apache/hadoop/fs/shell/Touchz.java | 80 +++++++++++++++++++ .../core/org/apache/hadoop/cli/testConf.xml | 4 +- 5 files changed, 89 insertions(+), 40 deletions(-) create mode 100644 src/java/org/apache/hadoop/fs/shell/Touchz.java diff --git a/CHANGES.txt b/CHANGES.txt index b24f4877786..0f8014778ef 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -144,6 +144,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 diff --git a/src/java/org/apache/hadoop/fs/FsShell.java b/src/java/org/apache/hadoop/fs/FsShell.java index a429263e6b9..afdda2f0f09 100644 --- a/src/java/org/apache/hadoop/fs/FsShell.java +++ b/src/java/org/apache/hadoop/fs/FsShell.java @@ -432,27 +432,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. */ @@ -765,7 +744,7 @@ public class FsShell extends Configured implements Tool { GET_SHORT_USAGE + "\n\t" + "[" + COPYTOLOCAL_SHORT_USAGE + "] [-moveToLocal ]\n\t" + "[-report]\n\t" + - "[-touchz ] [-test -[ezd] ]"; + "[-test -[ezd] ]"; String conf ="-conf : Specify an application configuration file."; @@ -838,10 +817,6 @@ public class FsShell extends Configured implements Tool { String moveToLocal = "-moveToLocal : Not implemented yet \n"; - String touchz = "-touchz : Creates a file of zero length\n" - + "\t\t at with current time as the timestamp of that .\n" - + "\t\t An error is returned if the file exists with non-zero length\n"; - String test = "-test -[ezd] : If file { exists, has zero length, is a directory\n" + "\t\tthen return 0, else return 1.\n"; @@ -889,8 +864,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)) { @@ -917,7 +890,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()) { @@ -974,8 +946,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); @@ -1005,8 +975,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 + " ]"); } else if ("-df".equals(cmd) ) { @@ -1048,7 +1017,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] ]"); - System.err.println(" [-touchz ]"); System.err.println(" [-test -[ezd] ]"); for (String name : commandFactory.getNames()) { instance = commandFactory.getInstance(name); @@ -1098,8 +1066,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; @@ -1168,8 +1135,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)) { diff --git a/src/java/org/apache/hadoop/fs/shell/FsCommand.java b/src/java/org/apache/hadoop/fs/shell/FsCommand.java index 79cbfb3df24..73473f8c02f 100644 --- a/src/java/org/apache/hadoop/fs/shell/FsCommand.java +++ b/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() {} diff --git a/src/java/org/apache/hadoop/fs/shell/Touchz.java b/src/java/org/apache/hadoop/fs/shell/Touchz.java new file mode 100644 index 00000000000..f384ab51df9 --- /dev/null +++ b/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 = " ..."; + public static final String DESCRIPTION = + "Creates a file of zero length\n" + + "at with current time as the timestamp of that .\n" + + "An error is returned if the file exists with non-zero length\n"; + + @Override + protected void processOptions(LinkedList 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(); + } + } +} diff --git a/src/test/core/org/apache/hadoop/cli/testConf.xml b/src/test/core/org/apache/hadoop/cli/testConf.xml index 1b82fd2ef14..c513a300db7 100644 --- a/src/test/core/org/apache/hadoop/cli/testConf.xml +++ b/src/test/core/org/apache/hadoop/cli/testConf.xml @@ -541,7 +541,7 @@ RegexpComparator - ^-touchz <path>: Creates a file of zero length( )* + ^-touchz <path> \.\.\.:( |\t)*Creates a file of zero length( )* RegexpComparator @@ -549,7 +549,7 @@ RegexpComparator - ^( |\t)* An error is returned if the file exists with non-zero length( )* + ^( |\t)*An error is returned if the file exists with non-zero length( )*