You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sqoop.apache.org by ab...@apache.org on 2014/08/10 06:29:57 UTC

git commit: SQOOP-1424: Sqoop2: Simplify SqoopCommand in shell package

Repository: sqoop
Updated Branches:
  refs/heads/SQOOP-1367 dfd300366 -> f43835e7a


SQOOP-1424: Sqoop2: Simplify SqoopCommand in shell package


Project: http://git-wip-us.apache.org/repos/asf/sqoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/sqoop/commit/f43835e7
Tree: http://git-wip-us.apache.org/repos/asf/sqoop/tree/f43835e7
Diff: http://git-wip-us.apache.org/repos/asf/sqoop/diff/f43835e7

Branch: refs/heads/SQOOP-1367
Commit: f43835e7ad1c1639dac3a64743a14bef493e2a2d
Parents: dfd3003
Author: Jarek Jarcec Cecho <ja...@apache.org>
Authored: Sat Aug 9 21:28:46 2014 -0700
Committer: Abraham Elmahrek <ab...@elmahrek.com>
Committed: Sat Aug 9 21:28:46 2014 -0700

----------------------------------------------------------------------
 client/pom.xml                                  |   4 +
 pom.xml                                         |  11 +-
 .../org/apache/sqoop/shell/CloneCommand.java    |  42 ++----
 .../org/apache/sqoop/shell/CreateCommand.java   |  42 ++----
 .../org/apache/sqoop/shell/DeleteCommand.java   |  43 ++----
 .../org/apache/sqoop/shell/DisableCommand.java  |  43 ++----
 .../org/apache/sqoop/shell/EnableCommand.java   |  43 ++----
 .../java/org/apache/sqoop/shell/SetCommand.java |  46 ++----
 .../apache/sqoop/shell/SetOptionFunction.java   |   2 +-
 .../apache/sqoop/shell/SetServerFunction.java   |   3 +-
 .../org/apache/sqoop/shell/ShowCommand.java     |  96 ++----------
 .../sqoop/shell/ShowConnectionFunction.java     |   2 +-
 .../sqoop/shell/ShowConnectorFunction.java      |   2 +-
 .../sqoop/shell/ShowFrameworkFunction.java      |   2 +-
 .../org/apache/sqoop/shell/ShowJobFunction.java |   2 +-
 .../apache/sqoop/shell/ShowOptionFunction.java  |   2 +-
 .../apache/sqoop/shell/ShowServerFunction.java  |   2 +-
 .../sqoop/shell/ShowSubmissionFunction.java     |   2 +-
 .../apache/sqoop/shell/ShowVersionFunction.java |   2 +-
 .../org/apache/sqoop/shell/SqoopCommand.java    | 151 ++++++++++---------
 .../org/apache/sqoop/shell/StartCommand.java    |  38 +----
 .../org/apache/sqoop/shell/StatusCommand.java   |  36 +----
 .../org/apache/sqoop/shell/StopCommand.java     |  34 +----
 .../org/apache/sqoop/shell/UpdateCommand.java   |  42 ++----
 .../org/apache/sqoop/shell/core/Constants.java  |  50 +-----
 .../main/resources/shell-resource.properties    |  48 +++---
 26 files changed, 227 insertions(+), 563 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/client/pom.xml
----------------------------------------------------------------------
diff --git a/client/pom.xml b/client/pom.xml
index 975773d..b2e221e 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -38,6 +38,10 @@ limitations under the License.
       <scope>test</scope>
     </dependency>
     <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+    </dependency>
+    <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-all</artifactId>
       <scope>test</scope>

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 41a92b5..ae68e2a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -146,12 +146,6 @@ limitations under the License.
           </dependency>
 
           <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-            <version>${guava.version}</version>
-          </dependency>
-
-          <dependency>
             <groupId>org.apache.hadoop</groupId>
             <artifactId>hadoop-core</artifactId>
             <version>${hadoop.1.version}</version>
@@ -326,6 +320,11 @@ limitations under the License.
         <version>${json-simple.version}</version>
       </dependency>
       <dependency>
+        <groupId>com.google.guava</groupId>
+        <artifactId>guava</artifactId>
+        <version>${guava.version}</version>
+      </dependency>
+      <dependency>
         <groupId>org.apache.sqoop.submission</groupId>
         <artifactId>sqoop-submission-mapreduce</artifactId>
         <version>${project.version}</version>

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/CloneCommand.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/CloneCommand.java b/shell/src/main/java/org/apache/sqoop/shell/CloneCommand.java
index a7e7e7d..4cdf0e4 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/CloneCommand.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/CloneCommand.java
@@ -17,47 +17,23 @@
  */
 package org.apache.sqoop.shell;
 
+import com.google.common.collect.ImmutableMap;
 import org.apache.sqoop.shell.core.Constants;
 import org.codehaus.groovy.tools.shell.Shell;
 
-import java.util.List;
-
-import static org.apache.sqoop.shell.ShellEnvironment.*;
-
 /**
  * Client side cloning of connection and job objects.
  */
 public class CloneCommand extends SqoopCommand {
 
-  private CloneConnectionFunction connectionFunction;
-  private CloneJobFunction jobFunction;
-
   public CloneCommand(Shell shell) {
-    super(shell, Constants.CMD_CLONE, Constants.CMD_CLONE_SC,
-      new String[] {Constants.FN_CONNECTION, Constants.FN_JOB},
-      Constants.PRE_CLONE, Constants.SUF_INFO);
-  }
-
-  public Object executeCommand(List args) {
-    if (args.size() == 0) {
-      printlnResource(Constants.RES_CLONE_USAGE, getUsage());
-      return null;
-    }
-
-    String func = (String)args.get(0);
-    if (func.equals(Constants.FN_CONNECTION)) {
-      if (connectionFunction == null) {
-        connectionFunction = new CloneConnectionFunction();
-      }
-      return connectionFunction.execute(args);
-    } else if (func.equals(Constants.FN_JOB)) {
-      if (jobFunction == null) {
-        jobFunction = new CloneJobFunction();
-      }
-      return jobFunction.execute(args);
-    } else {
-      printlnResource(Constants.RES_FUNCTION_UNKNOWN, func);
-      return null;
-    }
+    super(shell,
+      Constants.CMD_CLONE,
+      Constants.CMD_CLONE_SC,
+      ImmutableMap.of(
+        Constants.FN_CONNECTION, CloneConnectionFunction.class,
+        Constants.FN_JOB, CloneJobFunction.class
+      )
+    );
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/CreateCommand.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/CreateCommand.java b/shell/src/main/java/org/apache/sqoop/shell/CreateCommand.java
index 9ad007b..fce7c86 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/CreateCommand.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/CreateCommand.java
@@ -17,47 +17,23 @@
  */
 package org.apache.sqoop.shell;
 
+import com.google.common.collect.ImmutableMap;
 import org.apache.sqoop.shell.core.Constants;
 import org.codehaus.groovy.tools.shell.Shell;
 
-import java.util.List;
-
-import static org.apache.sqoop.shell.ShellEnvironment.*;
-
 /**
  *
  */
 public class CreateCommand extends SqoopCommand {
 
-  private CreateConnectionFunction connectionFunction;
-  private CreateJobFunction jobFunction;
-
   public CreateCommand(Shell shell) {
-    super(shell, Constants.CMD_CREATE, Constants.CMD_CREATE_SC,
-      new String[] {Constants.FN_CONNECTION, Constants.FN_JOB},
-      Constants.PRE_CREATE, Constants.SUF_INFO);
-  }
-
-  public Object executeCommand(List args) {
-    if (args.size() == 0) {
-      printlnResource(Constants.RES_CREATE_USAGE, getUsage());
-      return null;
-    }
-
-    String func = (String)args.get(0);
-    if (func.equals(Constants.FN_CONNECTION)) {
-      if (connectionFunction == null) {
-        connectionFunction = new CreateConnectionFunction();
-      }
-      return connectionFunction.execute(args);
-    } else if (func.equals(Constants.FN_JOB)) {
-      if (jobFunction == null) {
-        jobFunction = new CreateJobFunction();
-      }
-      return jobFunction.execute(args);
-    } else {
-      printlnResource(Constants.RES_FUNCTION_UNKNOWN, func);
-      return null;
-    }
+    super(shell,
+      Constants.CMD_CREATE,
+      Constants.CMD_CREATE_SC,
+      ImmutableMap.of(
+        Constants.FN_CONNECTION, CreateConnectionFunction.class,
+        Constants.FN_JOB, CreateJobFunction.class
+      )
+    );
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/DeleteCommand.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/DeleteCommand.java b/shell/src/main/java/org/apache/sqoop/shell/DeleteCommand.java
index abfcf2e..107e5e0 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/DeleteCommand.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/DeleteCommand.java
@@ -17,48 +17,23 @@
  */
 package org.apache.sqoop.shell;
 
+import com.google.common.collect.ImmutableMap;
 import org.apache.sqoop.shell.core.Constants;
 import org.codehaus.groovy.tools.shell.Shell;
-import java.util.List;
-
-import static org.apache.sqoop.shell.ShellEnvironment.*;
 
 /**
  *
  */
 public class DeleteCommand extends SqoopCommand {
 
-  private DeleteConnectionFunction connectionFunction;
-  private DeleteJobFunction jobFunction;
-
   public DeleteCommand(Shell shell) {
-    super(shell, Constants.CMD_DELETE, Constants.CMD_DELETE_SC,
-      new String[] {Constants.FN_CONNECTION, Constants.FN_JOB},
-      Constants.PRE_DELETE, Constants.SUF_INFO);
-  }
-
-  @Override
-  @SuppressWarnings("unchecked")
-  public Object executeCommand(List args) {
-    if (args.size() == 0) {
-      printlnResource(Constants.RES_DELETE_USAGE, getUsage());
-      return null;
-    }
-
-    String func = (String)args.get(0);
-    if (func.equals(Constants.FN_CONNECTION)) {
-      if (connectionFunction == null) {
-        connectionFunction = new DeleteConnectionFunction();
-      }
-      return connectionFunction.execute(args);
-    } else if (func.equals(Constants.FN_JOB)) {
-      if (jobFunction == null) {
-        jobFunction = new DeleteJobFunction();
-      }
-      return jobFunction.execute(args);
-    } else {
-      printlnResource(Constants.RES_FUNCTION_UNKNOWN, func);
-      return null;
-    }
+    super(shell,
+      Constants.CMD_DELETE,
+      Constants.CMD_DELETE_SC,
+      ImmutableMap.of(
+        Constants.FN_CONNECTION, DeleteConnectionFunction.class,
+        Constants.FN_JOB, DeleteJobFunction.class
+      )
+    );
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/DisableCommand.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/DisableCommand.java b/shell/src/main/java/org/apache/sqoop/shell/DisableCommand.java
index 5a6d942..fa3263f 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/DisableCommand.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/DisableCommand.java
@@ -17,48 +17,23 @@
  */
 package org.apache.sqoop.shell;
 
+import com.google.common.collect.ImmutableMap;
 import org.apache.sqoop.shell.core.Constants;
 import org.codehaus.groovy.tools.shell.Shell;
-import java.util.List;
-
-import static org.apache.sqoop.shell.ShellEnvironment.*;
 
 /**
  *
  */
 public class DisableCommand extends SqoopCommand {
 
-  private DisableConnectionFunction connectionFunction;
-  private DisableJobFunction jobFunction;
-
   public DisableCommand(Shell shell) {
-    super(shell, Constants.CMD_DISABLE, Constants.CMD_DISABLE_SC,
-      new String[] {Constants.FN_CONNECTION, Constants.FN_JOB},
-      Constants.PRE_DISABLE, Constants.SUF_INFO);
-  }
-
-  @Override
-  @SuppressWarnings("unchecked")
-  public Object executeCommand(List args) {
-    if (args.size() == 0) {
-      printlnResource(Constants.RES_DISABLE_USAGE, getUsage());
-      return null;
-    }
-
-    String func = (String)args.get(0);
-    if (func.equals(Constants.FN_CONNECTION)) {
-      if (connectionFunction == null) {
-        connectionFunction = new DisableConnectionFunction();
-      }
-      return connectionFunction.execute(args);
-    } else if (func.equals(Constants.FN_JOB)) {
-      if (jobFunction == null) {
-        jobFunction = new DisableJobFunction();
-      }
-      return jobFunction.execute(args);
-    } else {
-      printlnResource(Constants.RES_FUNCTION_UNKNOWN, func);
-      return null;
-    }
+    super(shell,
+      Constants.CMD_DISABLE,
+      Constants.CMD_DISABLE_SC,
+      ImmutableMap.of(
+        Constants.FN_CONNECTION, DisableConnectionFunction.class,
+        Constants.FN_JOB, DisableJobFunction.class
+      )
+    );
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/EnableCommand.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/EnableCommand.java b/shell/src/main/java/org/apache/sqoop/shell/EnableCommand.java
index 3b8c0b1..b48647b 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/EnableCommand.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/EnableCommand.java
@@ -17,48 +17,23 @@
  */
 package org.apache.sqoop.shell;
 
+import com.google.common.collect.ImmutableMap;
 import org.apache.sqoop.shell.core.Constants;
 import org.codehaus.groovy.tools.shell.Shell;
-import java.util.List;
-
-import static org.apache.sqoop.shell.ShellEnvironment.*;
 
 /**
  *
  */
 public class EnableCommand extends SqoopCommand {
 
-  private EnableConnectionFunction connectionFunction;
-  private EnableJobFunction jobFunction;
-
   public EnableCommand(Shell shell) {
-    super(shell, Constants.CMD_ENABLE, Constants.CMD_ENABLE_SC,
-      new String[] {Constants.FN_CONNECTION, Constants.FN_JOB},
-      Constants.PRE_ENABLE, Constants.SUF_INFO);
-  }
-
-  @Override
-  @SuppressWarnings("unchecked")
-  public Object executeCommand(List args) {
-    if (args.size() == 0) {
-      printlnResource(Constants.RES_ENABLE_USAGE, getUsage());
-      return null;
-    }
-
-    String func = (String)args.get(0);
-    if (func.equals(Constants.FN_CONNECTION)) {
-      if (connectionFunction == null) {
-        connectionFunction = new EnableConnectionFunction();
-      }
-      return connectionFunction.execute(args);
-    } else if (func.equals(Constants.FN_JOB)) {
-      if (jobFunction == null) {
-        jobFunction = new EnableJobFunction();
-      }
-      return jobFunction.execute(args);
-    } else {
-      printlnResource(Constants.RES_FUNCTION_UNKNOWN, func);
-      return null;
-    }
+    super(shell,
+      Constants.CMD_ENABLE,
+      Constants.CMD_ENABLE_SC,
+      ImmutableMap.of(
+        Constants.FN_CONNECTION, EnableConnectionFunction.class,
+        Constants.FN_JOB, EnableJobFunction.class
+      )
+    );
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/SetCommand.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/SetCommand.java b/shell/src/main/java/org/apache/sqoop/shell/SetCommand.java
index 548def0..3b8f4c2 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/SetCommand.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/SetCommand.java
@@ -17,48 +17,20 @@
  */
 package org.apache.sqoop.shell;
 
-import java.util.List;
-
+import com.google.common.collect.ImmutableMap;
 import org.apache.sqoop.shell.core.Constants;
 import org.codehaus.groovy.tools.shell.Shell;
 
-import static org.apache.sqoop.shell.ShellEnvironment.*;
-
 public class SetCommand extends SqoopCommand {
 
-  private SetServerFunction serverFunction;
-  private SetOptionFunction optionFunction;
-
   protected SetCommand(Shell shell) {
-    super(shell, Constants.CMD_SET, Constants.CMD_SET_SC,
-        new String[] {Constants.FN_SERVER, Constants.FN_OPTION},
-        Constants.PRE_SET, Constants.SUF_INFO);
-  }
-
-  @SuppressWarnings({ "rawtypes", "unchecked" })
-  @Override
-  public Object executeCommand(List args) {
-
-    if (args.size() == 0) {
-      printlnResource(Constants.RES_SET_USAGE, getUsage());
-      return null;
-    }
-    String func = (String)args.get(0);
-    if (func.equals(Constants.FN_SERVER)) {
-      if (serverFunction == null) {
-        serverFunction = new SetServerFunction();
-      }
-      return serverFunction.execute(args);
-
-    } else if (func.equals(Constants.FN_OPTION)) {
-      if (optionFunction == null) {
-        optionFunction = new SetOptionFunction();
-      }
-      return optionFunction.execute(args);
-
-    } else {
-      printlnResource(Constants.RES_FUNCTION_UNKNOWN, func);
-      return null;
-    }
+    super(shell,
+      Constants.CMD_SET,
+      Constants.CMD_SET_SC,
+      ImmutableMap.of(
+        Constants.FN_SERVER, SetServerFunction.class,
+        Constants.FN_OPTION, SetOptionFunction.class
+      )
+    );
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/SetOptionFunction.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/SetOptionFunction.java b/shell/src/main/java/org/apache/sqoop/shell/SetOptionFunction.java
index 5a15a54..700f646 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/SetOptionFunction.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/SetOptionFunction.java
@@ -30,7 +30,7 @@ import static org.apache.sqoop.shell.ShellEnvironment.*;
 @SuppressWarnings("serial")
 public class SetOptionFunction extends SqoopFunction {
   @SuppressWarnings("static-access")
-  protected SetOptionFunction() {
+  public SetOptionFunction() {
     this.addOption(OptionBuilder.hasArg()
       .withDescription(resourceString(Constants.RES_SET_PROMPT_OPT_NAME))
       .withLongOpt(Constants.OPT_NAME)

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/SetServerFunction.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/SetServerFunction.java b/shell/src/main/java/org/apache/sqoop/shell/SetServerFunction.java
index af99480..84df281 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/SetServerFunction.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/SetServerFunction.java
@@ -26,8 +26,9 @@ import static org.apache.sqoop.shell.ShellEnvironment.*;
 
 @SuppressWarnings("serial")
 public class SetServerFunction extends SqoopFunction {
+
   @SuppressWarnings("static-access")
-  protected SetServerFunction() {
+  public SetServerFunction() {
     this.addOption(OptionBuilder.hasArg().withArgName(Constants.OPT_HOST)
         .withDescription(resourceString(Constants.RES_SET_HOST_DESCRIPTION))
         .withLongOpt(Constants.OPT_HOST)

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/ShowCommand.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/ShowCommand.java b/shell/src/main/java/org/apache/sqoop/shell/ShowCommand.java
index 672fa85..ba1d384 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/ShowCommand.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/ShowCommand.java
@@ -17,90 +17,26 @@
  */
 package org.apache.sqoop.shell;
 
-import java.util.List;
-
+import com.google.common.collect.ImmutableMap;
 import org.apache.sqoop.shell.core.Constants;
 import org.codehaus.groovy.tools.shell.Shell;
 
-import static org.apache.sqoop.shell.ShellEnvironment.*;
-
-public class ShowCommand extends SqoopCommand
-{
-  private ShowServerFunction serverFunction;
-  private ShowVersionFunction versionFunction;
-  private ShowConnectorFunction connectorFunction;
-  private ShowJobFunction jobFunction;
-  private ShowSubmissionFunction submissionFunction;
-  private ShowFrameworkFunction frameworkFunction;
-  private ShowConnectionFunction connectionFunction;
-  private ShowOptionFunction optionFunction;
-
+public class ShowCommand extends SqoopCommand {
 
   protected ShowCommand(Shell shell) {
-    super(shell, Constants.CMD_SHOW, Constants.CMD_SHOW_SC,
-        new String[] {Constants.FN_SERVER, Constants.FN_VERSION,
-          Constants.FN_CONNECTOR, Constants.FN_FRAMEWORK,
-          Constants.FN_CONNECTION, Constants.FN_JOB, Constants.FN_SUBMISSION, Constants.FN_OPTION },
-          Constants.PRE_SHOW, Constants.SUF_INFO);
-  }
-
-  @SuppressWarnings({ "rawtypes", "unchecked" })
-  @Override
-  public Object executeCommand(List args) {
-    if (args.size() == 0) {
-      printlnResource(Constants.RES_SHOW_USAGE, getUsage());
-      return null;
-    }
-
-    String func = (String)args.get(0);
-    if (func.equals(Constants.FN_SERVER)) {
-      if (serverFunction == null) {
-        serverFunction = new ShowServerFunction();
-      }
-      return serverFunction.execute(args);
-
-    } else if (func.equals(Constants.FN_VERSION)) {
-      if (versionFunction == null) {
-        versionFunction = new ShowVersionFunction();
-      }
-      return versionFunction.execute(args);
-
-    } else if (func.equals(Constants.FN_CONNECTOR)) {
-      if (connectorFunction == null) {
-        connectorFunction = new ShowConnectorFunction();
-      }
-      return connectorFunction.execute(args);
-
-    } else if (func.equals(Constants.FN_FRAMEWORK)) {
-      if (frameworkFunction == null) {
-        frameworkFunction = new ShowFrameworkFunction();
-      }
-      return frameworkFunction.execute(args);
-
-    } else if (func.equals(Constants.FN_CONNECTION)) {
-      if (connectionFunction == null) {
-        connectionFunction = new ShowConnectionFunction();
-      }
-      return connectionFunction.execute(args);
-
-    } else if (func.equals(Constants.FN_JOB)) {
-      if (jobFunction == null) {
-        jobFunction = new ShowJobFunction();
-      }
-      return jobFunction.execute(args);
-    } else if (func.equals(Constants.FN_SUBMISSION)) {
-      if (submissionFunction == null) {
-        submissionFunction = new ShowSubmissionFunction();
-      }
-      return submissionFunction.execute(args);
-    } else if (func.equals(Constants.FN_OPTION)) {
-      if (optionFunction == null) {
-        optionFunction = new ShowOptionFunction();
-      }
-      return optionFunction.execute(args);
-    } else {
-      printlnResource(Constants.RES_FUNCTION_UNKNOWN, func);
-      return null;
-    }
+    super(shell,
+      Constants.CMD_SHOW,
+      Constants.CMD_SHOW_SC,
+      new ImmutableMap.Builder<String, Class<? extends SqoopFunction>>()
+        .put(Constants.FN_SERVER, ShowServerFunction.class)
+        .put(Constants.FN_VERSION, ShowVersionFunction.class)
+        .put(Constants.FN_CONNECTOR, ShowConnectorFunction.class)
+        .put(Constants.FN_FRAMEWORK, ShowFrameworkFunction.class)
+        .put(Constants.FN_CONNECTION, ShowConnectionFunction.class)
+        .put(Constants.FN_JOB, ShowJobFunction.class)
+        .put(Constants.FN_SUBMISSION, ShowSubmissionFunction.class)
+        .put(Constants.FN_OPTION, ShowOptionFunction.class)
+        .build()
+    );
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/ShowConnectionFunction.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/ShowConnectionFunction.java b/shell/src/main/java/org/apache/sqoop/shell/ShowConnectionFunction.java
index dfaa90e..3e8cc0a 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/ShowConnectionFunction.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/ShowConnectionFunction.java
@@ -37,7 +37,7 @@ import static org.apache.sqoop.shell.utils.FormDisplayer.*;
 @SuppressWarnings("serial")
 public class ShowConnectionFunction extends SqoopFunction {
   @SuppressWarnings("static-access")
-  protected ShowConnectionFunction() {
+  public ShowConnectionFunction() {
     this.addOption(OptionBuilder
         .withDescription(resourceString(Constants.RES_SHOW_PROMPT_DISPLAY_ALL_CONNS))
         .withLongOpt(Constants.OPT_ALL)

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/ShowConnectorFunction.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/ShowConnectorFunction.java b/shell/src/main/java/org/apache/sqoop/shell/ShowConnectorFunction.java
index 7b9b00c..bbfbb3f 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/ShowConnectorFunction.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/ShowConnectorFunction.java
@@ -34,7 +34,7 @@ import static org.apache.sqoop.shell.utils.FormDisplayer.*;
 @SuppressWarnings("serial")
 public class ShowConnectorFunction extends SqoopFunction {
   @SuppressWarnings("static-access")
-  protected ShowConnectorFunction() {
+  public ShowConnectorFunction() {
     this.addOption(OptionBuilder
         .withDescription(resourceString(Constants.RES_SHOW_PROMPT_DISPLAY_ALL_CONNECTORS))
         .withLongOpt(Constants.OPT_ALL)

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/ShowFrameworkFunction.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/ShowFrameworkFunction.java b/shell/src/main/java/org/apache/sqoop/shell/ShowFrameworkFunction.java
index 6e43072..0c587b2 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/ShowFrameworkFunction.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/ShowFrameworkFunction.java
@@ -32,7 +32,7 @@ import static org.apache.sqoop.shell.utils.FormDisplayer.*;
  */
 @SuppressWarnings("serial")
 public class ShowFrameworkFunction extends SqoopFunction {
-  protected ShowFrameworkFunction() {
+  public ShowFrameworkFunction() {
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/ShowJobFunction.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/ShowJobFunction.java b/shell/src/main/java/org/apache/sqoop/shell/ShowJobFunction.java
index 4618211..464f66e 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/ShowJobFunction.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/ShowJobFunction.java
@@ -38,7 +38,7 @@ import static org.apache.sqoop.shell.utils.FormDisplayer.*;
 @SuppressWarnings("serial")
 public class ShowJobFunction extends SqoopFunction {
   @SuppressWarnings("static-access")
-  protected ShowJobFunction() {
+  public ShowJobFunction() {
     this.addOption(OptionBuilder
         .withDescription(resourceString(Constants.RES_SHOW_PROMPT_DISPLAY_ALL_JOBS))
         .withLongOpt(Constants.OPT_ALL)

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/ShowOptionFunction.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/ShowOptionFunction.java b/shell/src/main/java/org/apache/sqoop/shell/ShowOptionFunction.java
index 920e659..4bb0cab 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/ShowOptionFunction.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/ShowOptionFunction.java
@@ -33,7 +33,7 @@ public class ShowOptionFunction extends SqoopFunction {
    * Construct new object.
    */
   @SuppressWarnings("static-access")
-  protected ShowOptionFunction() {
+  public ShowOptionFunction() {
     this.addOption(OptionBuilder
         .hasArg().withArgName(Constants.OPT_NAME)
         .withDescription(resource.getString(Constants.RES_SET_PROMPT_OPT_NAME))

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/ShowServerFunction.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/ShowServerFunction.java b/shell/src/main/java/org/apache/sqoop/shell/ShowServerFunction.java
index 23016ee..67eb6a6 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/ShowServerFunction.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/ShowServerFunction.java
@@ -27,7 +27,7 @@ import static org.apache.sqoop.shell.ShellEnvironment.*;
 @SuppressWarnings("serial")
 public class ShowServerFunction extends SqoopFunction {
   @SuppressWarnings("static-access")
-  protected ShowServerFunction() {
+  public ShowServerFunction() {
     this.addOption(OptionBuilder
         .withDescription(resourceString(Constants.RES_SHOW_PROMPT_DISPLAY_ALL_SERVERS))
         .withLongOpt(Constants.OPT_ALL)

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/ShowSubmissionFunction.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/ShowSubmissionFunction.java b/shell/src/main/java/org/apache/sqoop/shell/ShowSubmissionFunction.java
index be50cef..2d00b88 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/ShowSubmissionFunction.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/ShowSubmissionFunction.java
@@ -33,7 +33,7 @@ import static org.apache.sqoop.shell.ShellEnvironment.*;
 @SuppressWarnings("serial")
 public class ShowSubmissionFunction extends SqoopFunction {
   @SuppressWarnings("static-access")
-  protected ShowSubmissionFunction() {
+  public ShowSubmissionFunction() {
     this.addOption(OptionBuilder
         .withDescription(resourceString(Constants.RES_SHOW_PROMPT_DISPLAY_ALL_SUBMISSIONS))
         .withLongOpt(Constants.OPT_DETAIL)

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/ShowVersionFunction.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/ShowVersionFunction.java b/shell/src/main/java/org/apache/sqoop/shell/ShowVersionFunction.java
index f0919d3..6cb28e5 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/ShowVersionFunction.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/ShowVersionFunction.java
@@ -35,7 +35,7 @@ public class ShowVersionFunction extends SqoopFunction {
 
 
   @SuppressWarnings("static-access")
-  protected ShowVersionFunction() {
+  public ShowVersionFunction() {
     this.addOption(OptionBuilder
         .withDescription(resourceString(Constants.RES_SHOW_PROMPT_DISPLAY_ALL_VERSIONS))
         .withLongOpt(Constants.OPT_ALL)

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/SqoopCommand.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/SqoopCommand.java b/shell/src/main/java/org/apache/sqoop/shell/SqoopCommand.java
index 241d120..cbd34f5 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/SqoopCommand.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/SqoopCommand.java
@@ -23,99 +23,75 @@ import groovy.lang.Script;
 
 import java.util.*;
 
+import org.apache.commons.lang.StringUtils;
+import org.apache.sqoop.shell.core.Constants;
 import org.apache.sqoop.common.SqoopException;
 import org.apache.sqoop.shell.core.ShellError;
+import org.apache.sqoop.utils.ClassUtils;
 import org.codehaus.groovy.tools.shell.ComplexCommandSupport;
 import org.codehaus.groovy.tools.shell.Shell;
 
-public abstract class SqoopCommand extends ComplexCommandSupport
-{
-  private String descriptionPrefix;
-  private String descriptionPostfix;
+import static org.apache.sqoop.shell.ShellEnvironment.*;
 
-  private String description;
-  private String usage;
-  private String help;
+/**
+ * Sqoop shell command.
+ *
+ * Every command should define following resource properties:
+ *
+ * $command.description
+ *    One sentence describing purpose of the command, displayed on "help" command.
+ */
+public abstract class SqoopCommand extends ComplexCommandSupport {
+
+  /**
+   * Command name
+   */
+  private String name;
+
+  /**
+   * Function map given by concrete implementation.
+   *
+   * Key: Name of the function as is present in the shell
+   * Value: Class name implementing the function
+   */
+  private final Map<String, Class<? extends SqoopFunction>> functionNames;
+
+  /**
+   * Instantiated functions for reuse. Built lazily.
+   */
+  private final Map<String, SqoopFunction> functionInstances;
 
-  @SuppressWarnings("unchecked")
-  protected SqoopCommand(Shell shell, String name, String shortcut,
-      String[] funcs, String descriptionPrefix, String descriptionPostfix) {
+  protected SqoopCommand(Shell shell,
+                         String name,
+                         String shortcut,
+                         Map<String, Class<? extends SqoopFunction>> funcs) {
     super(shell, name, shortcut);
 
-    this.functions = new LinkedList<String>();
-    for (String func : funcs) {
-      this.functions.add(func);
-    }
+    this.name = name;
+    this.functionNames = funcs;
+    this.functionInstances = new HashMap<String, SqoopFunction>();
 
-    this.descriptionPrefix = descriptionPrefix;
-    this.descriptionPostfix = descriptionPostfix;
+    this.functions = new LinkedList<String>();
+    this.functions.addAll(funcs.keySet());
   }
 
   @Override
   public String getDescription() {
-    if (description == null) {
-      StringBuilder sb = new StringBuilder();
-
-      if (descriptionPrefix != null) {
-        sb.append(descriptionPrefix);
-        sb.append(" ");
-      }
-
-      @SuppressWarnings("unchecked")
-      Iterator<String> iterator = functions.iterator();
-      int size = functions.size();
-      sb.append(iterator.next());
-      if (size > 1) {
-        for (int i = 1; i < (size - 1); i++) {
-          sb.append(", ");
-          sb.append(iterator.next());
-        }
-        sb.append(" or ");
-        sb.append(iterator.next());
-      }
-
-      if (descriptionPostfix != null) {
-        sb.append(" ");
-        sb.append(descriptionPostfix);
-      }
-
-      description = sb.toString();
-    }
-
-    return description;
+    return resourceString(name + ".description");
   }
 
   @Override
   public String getUsage() {
-    if (usage == null) {
-      StringBuilder sb = new StringBuilder();
-
-      sb.append("[");
-
-      @SuppressWarnings("unchecked")
-      Iterator<String> iterator = functions.iterator();
-      int size = functions.size();
-      sb.append(iterator.next());
-      for (int i = 1; i < size; i++) {
-        sb.append("|");
-        sb.append(iterator.next());
-      }
-
-      sb.append("]");
-
-      usage = sb.toString();
-    }
-
-    return usage;
+    return new StringBuilder()
+      .append("[")
+      .append(StringUtils.join(functionNames.keySet(), "|"))
+      .append("]")
+      .toString();
   }
 
   @Override
   public String getHelp() {
-    if (help == null) {
-      help = getDescription() + ".";
-    }
-
-    return help;
+    return getDescription() + ".";
   }
 
   /**
@@ -132,7 +108,38 @@ public abstract class SqoopCommand extends ComplexCommandSupport
    * @param args list
    * @return Object
    */
-  public abstract Object executeCommand(List args);
+  public Object executeCommand(List args) {
+    if (args.size() == 0) {
+      printlnResource(Constants.RES_SHARED_USAGE, name, getUsage());
+      return null;
+    }
+
+    String func = (String)args.get(0);
+
+    // Unknown function
+    if(!functionNames.containsKey(func)) {
+      printlnResource(Constants.RES_SHARED_UNKNOWN_FUNCTION, func);
+      return null;
+    }
+
+    // If we already do have the instance, execute it
+    if(functionInstances.containsKey(func)) {
+      return functionInstances.get(func).execute(args);
+    }
+
+    // Otherwise create new instance
+    Class klass = functionNames.get(func);
+    SqoopFunction instance = (SqoopFunction) ClassUtils.instantiate(klass);
+    if(instance == null) {
+      // This is pretty much a developer error as it shouldn't happen without changing and testing code
+      throw new SqoopException(ShellError.SHELL_0000, "Can't instantiate class " + klass);
+    }
+
+    functionInstances.put(func, instance);
+
+    // And return the function execution
+    return instance.execute(args);
+  }
 
   @SuppressWarnings({ "rawtypes", "unchecked" })
   protected void resolveVariables(List arg) {

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/StartCommand.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/StartCommand.java b/shell/src/main/java/org/apache/sqoop/shell/StartCommand.java
index 914454f..7c56980 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/StartCommand.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/StartCommand.java
@@ -17,41 +17,19 @@
  */
 package org.apache.sqoop.shell;
 
-import java.util.List;
-
-import org.apache.log4j.Logger;
+import com.google.common.collect.ImmutableMap;
 import org.apache.sqoop.shell.core.Constants;
 import org.codehaus.groovy.tools.shell.Shell;
 
-import static org.apache.sqoop.shell.ShellEnvironment.printlnResource;
-
 public class StartCommand extends SqoopCommand {
-  public static final Logger LOG = Logger.getLogger(StartCommand.class);
-
-  private StartJobFunction startJobFunction;
 
   protected StartCommand(Shell shell) {
-    super(shell, Constants.CMD_START, Constants.CMD_START_SC,
-        new String[] {Constants.FN_JOB}, Constants.PRE_START, null);
-  }
-
-  @Override
-  public Object executeCommand(List args) {
-    if (args.size() == 0) {
-      printlnResource(Constants.RES_START_USAGE, getUsage());
-      return null;
-    }
-
-    String func = (String) args.get(0);
-    if (func.equals(Constants.FN_JOB)) {
-      if (startJobFunction == null) {
-        startJobFunction = new StartJobFunction();
-      }
-      return startJobFunction.execute(args);
-    } else {
-      printlnResource(Constants.RES_FUNCTION_UNKNOWN, func);
-    }
-
-    return null;
+    super(shell,
+      Constants.CMD_START,
+      Constants.CMD_START_SC,
+      new ImmutableMap.Builder<String, Class<? extends SqoopFunction>>()
+        .put(Constants.FN_JOB, StartJobFunction.class)
+        .build()
+    );
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/StatusCommand.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/StatusCommand.java b/shell/src/main/java/org/apache/sqoop/shell/StatusCommand.java
index ebd4548..3447a87 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/StatusCommand.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/StatusCommand.java
@@ -17,39 +17,19 @@
  */
 package org.apache.sqoop.shell;
 
-import java.util.List;
-
+import com.google.common.collect.ImmutableMap;
 import org.apache.sqoop.shell.core.Constants;
 import org.codehaus.groovy.tools.shell.Shell;
 
-import static org.apache.sqoop.shell.ShellEnvironment.printlnResource;
-
 public class StatusCommand extends SqoopCommand {
 
-  private StatusJobFunction statusJobFunction;
-
   protected StatusCommand(Shell shell) {
-    super(shell, Constants.CMD_STATUS, Constants.CMD_STATUS_SC,
-        new String[] { Constants.FN_JOB }, Constants.PRE_STATUS, null);
-  }
-
-  @Override
-  public Object executeCommand(List args) {
-    if (args.size() == 0) {
-      printlnResource(Constants.RES_STATUS_USAGE, getUsage());
-      return null;
-    }
-
-    String func = (String) args.get(0);
-    if (func.equals(Constants.FN_JOB)) {
-      if (statusJobFunction == null) {
-        statusJobFunction = new StatusJobFunction();
-      }
-      return statusJobFunction.execute(args);
-    } else {
-      printlnResource(Constants.RES_FUNCTION_UNKNOWN, func);
-    }
-
-    return null;
+    super(shell,
+      Constants.CMD_STATUS,
+      Constants.CMD_STATUS_SC,
+      new ImmutableMap.Builder<String, Class<? extends SqoopFunction>>()
+        .put(Constants.FN_JOB, StatusJobFunction.class)
+        .build()
+      );
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/StopCommand.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/StopCommand.java b/shell/src/main/java/org/apache/sqoop/shell/StopCommand.java
index 65a454b..50b2e81 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/StopCommand.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/StopCommand.java
@@ -17,37 +17,19 @@
  */
 package org.apache.sqoop.shell;
 
-import java.util.List;
-
+import com.google.common.collect.ImmutableMap;
 import org.apache.sqoop.shell.core.Constants;
 import org.codehaus.groovy.tools.shell.Shell;
 
-import static org.apache.sqoop.shell.ShellEnvironment.printlnResource;
-
 public class StopCommand extends SqoopCommand {
 
-  private StopJobFunction stopJobFunction;
-
   protected StopCommand(Shell shell) {
-    super(shell, Constants.CMD_STOP, Constants.CMD_STOP_SC,
-        new String[] { Constants.FN_JOB }, Constants.PRE_STOP, null);
-  }
-  @Override
-  public Object executeCommand(List args) {
-    if (args.size() == 0) {
-      printlnResource(Constants.RES_STOP_USAGE, getUsage());
-      return null;
-    }
-
-    String func = (String) args.get(0);
-    if (func.equals(Constants.FN_JOB)) {
-      if (stopJobFunction == null) {
-        stopJobFunction = new StopJobFunction();
-      }
-      return stopJobFunction.execute(args);
-    } else {
-      printlnResource(Constants.RES_FUNCTION_UNKNOWN, func);
-    }
-    return null;
+    super(shell,
+      Constants.CMD_STOP,
+      Constants.CMD_STOP_SC,
+      new ImmutableMap.Builder<String, Class<? extends SqoopFunction>>()
+        .put(Constants.FN_JOB, StopJobFunction.class)
+        .build()
+    );
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/UpdateCommand.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/UpdateCommand.java b/shell/src/main/java/org/apache/sqoop/shell/UpdateCommand.java
index 24f31ea..d291c42 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/UpdateCommand.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/UpdateCommand.java
@@ -17,47 +17,23 @@
  */
 package org.apache.sqoop.shell;
 
+import com.google.common.collect.ImmutableMap;
 import org.apache.sqoop.shell.core.Constants;
 import org.codehaus.groovy.tools.shell.Shell;
 
-import java.util.List;
-
-import static org.apache.sqoop.shell.ShellEnvironment.*;
-
 /**
  *
  */
 public class UpdateCommand extends SqoopCommand {
 
-  private UpdateConnectionFunction connectionFunction;
-  private UpdateJobFunction jobFunction;
-
   public UpdateCommand(Shell shell) {
-    super(shell, Constants.CMD_UPDATE, Constants.CMD_UPDATE_SC,
-      new String[] {Constants.FN_CONNECTION, Constants.FN_JOB},
-      Constants.PRE_UPDATE, Constants.SUF_INFO);
-  }
-
-  public Object executeCommand(List args) {
-    if (args.size() == 0) {
-      printlnResource(Constants.RES_UPDATE_USAGE, getUsage());
-      return null;
-    }
-
-    String func = (String)args.get(0);
-    if (func.equals(Constants.FN_CONNECTION)) {
-      if (connectionFunction == null) {
-        connectionFunction = new UpdateConnectionFunction();
-      }
-      return connectionFunction.execute(args);
-    } else if (func.equals(Constants.FN_JOB)) {
-      if (jobFunction == null) {
-        jobFunction = new UpdateJobFunction();
-      }
-      return jobFunction.execute(args);
-    } else {
-      printlnResource(Constants.RES_FUNCTION_UNKNOWN, func);
-      return null;
-    }
+    super(shell,
+      Constants.CMD_UPDATE,
+      Constants.CMD_UPDATE_SC,
+      ImmutableMap.of(
+        Constants.FN_CONNECTION, UpdateConnectionFunction.class,
+        Constants.FN_JOB, UpdateJobFunction.class
+      )
+    );
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/java/org/apache/sqoop/shell/core/Constants.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/core/Constants.java b/shell/src/main/java/org/apache/sqoop/shell/core/Constants.java
index 908b44d..3ea56a4 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/core/Constants.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/core/Constants.java
@@ -122,29 +122,16 @@ public class Constants {
   public static final String FN_VERSION = "version";
   public static final String FN_FRAMEWORK = "framework";
 
-  public static final String PRE_CLONE = "Clone";
-  public static final String PRE_CREATE = "Create";
-  public static final String PRE_DELETE = "Delete";
-  public static final String PRE_SET = "Set";
-  public static final String PRE_SHOW = "Show";
-  public static final String PRE_UPDATE = "Update";
-  public static final String PRE_START = "Start";
-  public static final String PRE_STATUS = "Status";
-  public static final String PRE_STOP = "Stop";
-  public static final String PRE_ENABLE = "Enable";
-  public static final String PRE_DISABLE = "Disable";
-  public static final String SUF_INFO = "Info";
-
-
   public static final String PROP_HOMEDIR = "user.home";
   public static final String PROP_CURDIR = "user.dir";
   public static final String SQOOP_PROMPT = "sqoop";
 
+  // Shared resources
+  public static final String RES_SHARED_USAGE = "shared.usage";
+  public static final String RES_SHARED_UNKNOWN_FUNCTION =  "shared.unknown.function";
 
   // Resource Keys for various messages
 
-  public static final String RES_FUNCTION_UNKNOWN =
-      "args.function.unknown";
   public static final String RES_ARGS_XID_MISSING =
       "args.xid_missing";
   public static final String RES_ARGS_FXID_MISSING =
@@ -175,8 +162,6 @@ public class Constants {
   public static final String RES_PROMPT_FILL_JOB_METADATA =
       "prompt.fill_job_metadata";
 
-  public static final String RES_CLONE_USAGE =
-      "clone.usage";
   public static final String RES_CLONE_CONN_SUCCESSFUL =
       "clone.conn.successful";
   public static final String RES_CLONE_JOB_SUCCESSFUL =
@@ -186,8 +171,6 @@ public class Constants {
   public static final String RES_CLONE_CLONING_JOB =
       "clone.cloning_job";
 
-  public static final String RES_CREATE_USAGE =
-      "create.usage";
   public static final String RES_CREATE_CONN_SUCCESSFUL =
       "create.conn_successful";
   public static final String RES_CREATE_JOB_SUCCESSFUL =
@@ -197,18 +180,11 @@ public class Constants {
   public static final String RES_CREATE_CREATING_JOB =
       "create.creating_job";
 
-  public static final String RES_DELETE_USAGE =
-      "delete.usage";
-
-  public static final String RES_DISABLE_USAGE =
-      "disable.usage";
   public static final String RES_DISABLE_CONNECTION_SUCCESSFUL =
       "disable.conn_successful";
   public static final String RES_DISABLE_JOB_SUCCESSFUL =
       "disable.job_successful";
 
-  public static final String RES_ENABLE_USAGE =
-      "enable.usage";
   public static final String RES_ENABLE_CONNECTION_SUCCESSFUL =
       "enable.conn_successful";
   public static final String RES_ENABLE_JOB_SUCCESSFUL =
@@ -234,8 +210,6 @@ public class Constants {
   public static final String RES_UNRECOGNIZED_CMD =
       "unrecognized.cmd";
 
-  public static final String RES_SET_USAGE =
-      "set.usage";
   public static final String RES_SET_PROMPT_OPT_NAME =
       "set.prompt_opt_name";
   public static final String RES_SET_PROMPT_OPT_VALUE =
@@ -261,14 +235,10 @@ public class Constants {
   public static final String RES_SET_SERVER_IGNORED =
       "set.server_ignored";
 
-  public static final String RES_SHOW_USAGE =
-      "show.usage";
   public static final String RES_SHOW_PROMPT_DISPLAY_ALL_CONNS =
       "show.prompt_display_all_conns";
   public static final String RES_SHOW_PROMPT_DISPLAY_CONN_XID =
       "show.prompt_display_conn_xid";
-  public static final String RES_SHOW_CONN_USAGE =
-      "show.conn_usage";
   public static final String RES_SHOW_PROMPT_CONNS_TO_SHOW =
       "show.prompt_conns_to_show";
   public static final String RES_SHOW_PROMPT_CONN_INFO =
@@ -280,8 +250,6 @@ public class Constants {
       "show.prompt_display_all_connectors";
   public static final String RES_SHOW_PROMPT_DISPLAY_CONNECTOR_CID =
       "show.prompt_display_connector_cid";
-  public static final String RES_SHOW_CONNECTOR_USAGE =
-      "show.connector_usage";
   public static final String RES_SHOW_PROMPT_CONNECTORS_TO_SHOW =
       "show.prompt_connectors_to_show";
   public static final String RES_SHOW_PROMPT_CONNECTOR_INFO =
@@ -296,8 +264,6 @@ public class Constants {
       "show.prompt_display_all_jobs";
   public static final String RES_SHOW_PROMPT_DISPLAY_JOB_JID =
       "show.prompt_display_job_jid";
-  public static final String RES_SHOW_JOB_USAGE =
-      "show.job_usage";
   public static final String RES_SHOW_PROMPT_JOBS_TO_SHOW =
       "show.prompt_jobs_to_show";
   public static final String RES_SHOW_PROMPT_JOB_INFO =
@@ -342,17 +308,9 @@ public class Constants {
   public static final String RES_SHOW_PROMPT_VERSION_PROTOCOL =
       "show.prompt_version_protocol";
 
-  public static final String RES_START_USAGE =
-      "start.usage";
-
-  public static final String RES_STATUS_USAGE =
-      "status.usage";
   public static final String RES_PROMPT_SYNCHRONOUS =
       "start.prompt_synchronous";
 
-  public static final String RES_STOP_USAGE =
-      "stop.usage";
-
   public static final String RES_SQOOP_SHELL_BANNER =
       "sqoop.shell_banner";
   public static final String RES_SQOOP_PROMPT_SHELL_LOADRC =
@@ -360,8 +318,6 @@ public class Constants {
   public static final String RES_SQOOP_PROMPT_SHELL_LOADEDRC =
       "sqoop.prompt_shell_loadedrc";
 
-  public static final String RES_UPDATE_USAGE =
-      "update.usage";
   public static final String RES_UPDATE_UPDATING_CONN =
       "update.conn";
   public static final String RES_UPDATE_CONN_SUCCESSFUL =

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f43835e7/shell/src/main/resources/shell-resource.properties
----------------------------------------------------------------------
diff --git a/shell/src/main/resources/shell-resource.properties b/shell/src/main/resources/shell-resource.properties
index d4c782e..7fa5671 100644
--- a/shell/src/main/resources/shell-resource.properties
+++ b/shell/src/main/resources/shell-resource.properties
@@ -17,7 +17,7 @@
 
 ############################
 # Security Form
-#
+#############################
 object-name.label = Name
 object-name.help = Non unique name of the entity to help you remember \
                    it's purpose
@@ -25,10 +25,13 @@ object-name.help = Non unique name of the entity to help you remember \
 
 #############################
 # Messages
-#
+#############################
+
+# Shared (for all commands/functions)
+shared.usage = @|bold Usage:|@ {0} {1}
+shared.unknown.function = The specified function "{0}" is not recognized.
+
 # Argument related
-#
-args.function.unknown = The specified function "{0}" is not recognized.
 args.xid_missing = Required argument --xid is missing.
 args.fxid_missing = Required argument --fxid is missing.
 args.txid_missing = Required argument --txid is missing.
@@ -37,7 +40,6 @@ args.cid_missing = Required argument --cid is missing.
 args.name_missing = Required argument --name is missing.
 args.value_missing = Required argument --value is missing.
 
-
 ## Generic description of various ids, types etc
 prompt.conn_id = Connection ID
 prompt.connector_id = Connector ID
@@ -53,17 +55,15 @@ connection object
 prompt.fill_job_metadata = Please fill following values to create new \
 job object
 
-#
 # Update command
+update.description = Update objects in Sqoop repository
 update.conn = Updating connection with id {0}
 update.job = Updating job with id {0}
-update.usage = Usage: update {0}
 update.conn_successful = Connection was successfully updated with status {0}
 update.job_successful = Job was successfully updated with status {0}
 
-#
 # Clone command
-clone.usage = Usage: clone {0}
+clone.description = Create new object based on existing one
 clone.conn.successful = Connection was successfully created with validation \
   status {0} and persistent id {1}
 clone.job.successful = Job was successfully created with validation \
@@ -71,34 +71,28 @@ clone.job.successful = Job was successfully created with validation \
 clone.cloning_conn = Cloning connection with id {0}
 clone.cloning_job = Cloning job with id {0}
 
-#
 # Create command
-create.usage = Usage: create {0}
+create.description = Create new object in Sqoop repository
 create.conn_successful = New connection was successfully created with \
   validation status {0} and persistent id {1}
 create.job_successful = New job was successfully created with validation \
   status {0}  and persistent id {1}
-## Creating messages
 create.creating_conn = Creating connection for connector with id {0}
 create.creating_job = Creating job for connections with id {0} and {1}
 
-#
 # Delete command
-delete.usage = Usage: delete {0}
+delete.description = Delete existing object in Sqoop repository
 
-#
 # Enable command
-enable.usage = Usage: enable {0}
+enable.description = Enable object in Sqoop repository
 enable.conn_successful = Connection {0} was successfully enabled
 enable.job_successful = Job {0} was successfully enabled
 
-#
 # Disable command
-disable.usage = Usage: disable {0}
+disable.description = Disable object in Sqoop repository
 disable.conn_successful = Connection {0} was successfully disabled
 disable.job_successful = Job {0} was successfully disabled
 
-#
 # Help command
 help.usage = [<command>]
 help.description = Display this help message
@@ -114,9 +108,8 @@ help.specific_cmd_info = For help on a specific command type: \
 
 unrecognized.cmd = Unrecognized command {0}
 
-#
 # Set command
-set.usage = Usage: set {0}
+set.description = Configure various client options and settings
 set.prompt_opt_name = Client option name
 set.prompt_opt_value = New option value
 set.verbose_changed = Verbose option was changed to {0}
@@ -131,8 +124,8 @@ set.server_successful = Server is set successfully
 set.server_ignored = --host, --port or --webapp option is ignored, because --url option is given.
 
 
-show.usage = Usage: show {0}
-
+# Show command
+show.description = Display various objects and configuration options
 show.prompt_display_all_conns = Display all connections
 show.prompt_display_conn_xid = Display the connection with xid
 show.conn_usage = Usage: show connection
@@ -182,12 +175,15 @@ sqoop.shell_banner = @|green Sqoop Shell:|@ Type '@|bold help|@' or '@|bold \\h|
 sqoop.prompt_shell_loadrc = Loading resource file {0}
 sqoop.prompt_shell_loadedrc = Resource file loaded.
 
-start.usage = Usage: start {0}
+# Start command
+start.description = Start job
 start.prompt_synchronous = Wait for submission to finish
 
-stop.usage = Usage: stop  {0}
+# Stop command
+stop.description = Stop job
 
-status.usage = Usage: status {0}
+# Status command
+status.description = Display status of a job
 
 # Various Table headers
 table.header.id = Id