You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sqoop.apache.org by ja...@apache.org on 2015/09/13 14:24:41 UTC

sqoop git commit: SQOOP-2559: Sqoop2: Provide DateTime type for configuration objects

Repository: sqoop
Updated Branches:
  refs/heads/sqoop2 c6047c4f2 -> 00ada83b7


SQOOP-2559: Sqoop2: Provide DateTime type for configuration objects

(Dian Fu via Jarek Jarcec Cecho)


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

Branch: refs/heads/sqoop2
Commit: 00ada83b792de31784195bfd018a71e9b3508887
Parents: c6047c4
Author: Jarek Jarcec Cecho <ja...@apache.org>
Authored: Sun Sep 13 05:24:13 2015 -0700
Committer: Jarek Jarcec Cecho <ja...@apache.org>
Committed: Sun Sep 13 05:24:13 2015 -0700

----------------------------------------------------------------------
 common/pom.xml                                  |   5 +
 .../json/util/ConfigInputSerialization.java     |   5 +
 .../org/apache/sqoop/model/ConfigUtils.java     |   3 +
 .../java/org/apache/sqoop/model/MConfig.java    |   4 +
 .../org/apache/sqoop/model/MConfigList.java     |   4 +
 .../org/apache/sqoop/model/MDateTimeInput.java  |  94 ++++++++++++++
 .../java/org/apache/sqoop/model/MInputType.java |   3 +
 .../json/util/TestConfigSerialization.java      |   9 ++
 .../org/apache/sqoop/model/TestMConfig.java     |   3 +
 .../org/apache/sqoop/model/TestMConfigList.java |   3 +
 .../apache/sqoop/model/TestMDateTimeInput.java  | 122 +++++++++++++++++++
 connector/connector-sdk/pom.xml                 |   4 -
 .../common/CommonRepositoryHandler.java         |   7 ++
 .../sqoop/shell/utils/ConfigDisplayer.java      |  13 ++
 .../apache/sqoop/shell/utils/ConfigFiller.java  | 108 ++++++++++++++++
 15 files changed, 383 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/sqoop/blob/00ada83b/common/pom.xml
----------------------------------------------------------------------
diff --git a/common/pom.xml b/common/pom.xml
index ecd42bc..748fa7a 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -76,6 +76,11 @@ limitations under the License.
       <groupId>com.google.guava</groupId>
       <artifactId>guava</artifactId>
     </dependency>
+
+    <dependency>
+      <groupId>joda-time</groupId>
+      <artifactId>joda-time</artifactId>
+    </dependency>
   </dependencies>
 
   <build>

http://git-wip-us.apache.org/repos/asf/sqoop/blob/00ada83b/common/src/main/java/org/apache/sqoop/json/util/ConfigInputSerialization.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/json/util/ConfigInputSerialization.java b/common/src/main/java/org/apache/sqoop/json/util/ConfigInputSerialization.java
index e2e5b67..eb42da3 100644
--- a/common/src/main/java/org/apache/sqoop/json/util/ConfigInputSerialization.java
+++ b/common/src/main/java/org/apache/sqoop/json/util/ConfigInputSerialization.java
@@ -23,6 +23,7 @@ import org.apache.sqoop.classification.InterfaceStability;
 import org.apache.sqoop.common.SqoopException;
 import org.apache.sqoop.model.InputEditable;
 import org.apache.sqoop.model.MBooleanInput;
+import org.apache.sqoop.model.MDateTimeInput;
 import org.apache.sqoop.model.MEnumInput;
 import org.apache.sqoop.model.MConfig;
 import org.apache.sqoop.model.MConfigType;
@@ -187,6 +188,10 @@ public final class ConfigInputSerialization {
         mInput = new MListInput(name, sensitive.booleanValue(), editable, overrides);
         break;
       }
+      case DATETIME: {
+        mInput = new MDateTimeInput(name, sensitive.booleanValue(), editable, overrides);
+        break;
+      }
       default:
         // do nothing
         break;

http://git-wip-us.apache.org/repos/asf/sqoop/blob/00ada83b/common/src/main/java/org/apache/sqoop/model/ConfigUtils.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/model/ConfigUtils.java b/common/src/main/java/org/apache/sqoop/model/ConfigUtils.java
index 5d53437..cf48425 100644
--- a/common/src/main/java/org/apache/sqoop/model/ConfigUtils.java
+++ b/common/src/main/java/org/apache/sqoop/model/ConfigUtils.java
@@ -27,6 +27,7 @@ import org.apache.sqoop.utils.ClassUtils;
 import org.apache.sqoop.validation.ConfigValidationRunner;
 import org.apache.sqoop.validation.Message;
 import org.apache.sqoop.validation.ConfigValidationResult;
+import org.joda.time.DateTime;
 import org.json.simple.JSONObject;
 
 import java.lang.reflect.Field;
@@ -169,6 +170,8 @@ public class  ConfigUtils {
               ClassUtils.getEnumStrings(type));
         } else if (type.isAssignableFrom(List.class)) {
           input = new MListInput(inputName, sensitive, editable, overrides);
+        } else if (type == DateTime.class) {
+          input = new MDateTimeInput(inputName, sensitive, editable, overrides);
         } else {
           throw new SqoopException(ModelError.MODEL_004, "Unsupported type "
               + type.getName() + " for input " + fieldName);

http://git-wip-us.apache.org/repos/asf/sqoop/blob/00ada83b/common/src/main/java/org/apache/sqoop/model/MConfig.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/model/MConfig.java b/common/src/main/java/org/apache/sqoop/model/MConfig.java
index 6f11d92..b618946 100644
--- a/common/src/main/java/org/apache/sqoop/model/MConfig.java
+++ b/common/src/main/java/org/apache/sqoop/model/MConfig.java
@@ -102,6 +102,10 @@ public final class MConfig extends MValidatedElement implements MClonable {
     return (MListInput)getInput(inputName);
   }
 
+  public MDateTimeInput getDateTimeInput(String inputName) {
+    return (MDateTimeInput)getInput(inputName);
+  }
+
   @Override
   public String toString() {
     StringBuilder sb = new StringBuilder("config-").append(getName());

http://git-wip-us.apache.org/repos/asf/sqoop/blob/00ada83b/common/src/main/java/org/apache/sqoop/model/MConfigList.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/model/MConfigList.java b/common/src/main/java/org/apache/sqoop/model/MConfigList.java
index 2a3c3e4..35cb17a 100644
--- a/common/src/main/java/org/apache/sqoop/model/MConfigList.java
+++ b/common/src/main/java/org/apache/sqoop/model/MConfigList.java
@@ -93,6 +93,10 @@ public class MConfigList implements MClonable {
     return (MListInput) getInput(name);
   }
 
+  public MDateTimeInput getDateTimeInput(String name) {
+    return (MDateTimeInput) getInput(name);
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) {

http://git-wip-us.apache.org/repos/asf/sqoop/blob/00ada83b/common/src/main/java/org/apache/sqoop/model/MDateTimeInput.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/model/MDateTimeInput.java b/common/src/main/java/org/apache/sqoop/model/MDateTimeInput.java
new file mode 100644
index 0000000..7ce2558
--- /dev/null
+++ b/common/src/main/java/org/apache/sqoop/model/MDateTimeInput.java
@@ -0,0 +1,94 @@
+/**
+ * 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.sqoop.model;
+
+import org.joda.time.DateTime;
+
+import org.apache.sqoop.classification.InterfaceAudience;
+import org.apache.sqoop.classification.InterfaceStability;
+
+@InterfaceAudience.Public
+@InterfaceStability.Unstable
+public class MDateTimeInput extends MInput<DateTime> {
+
+  public MDateTimeInput(String name, boolean sensitive, InputEditable editable, String overrides) {
+    super(name, sensitive, editable, overrides);
+  }
+
+  @Override
+  public String getUrlSafeValueString() {
+    if (isEmpty()) {
+      return "";
+    }
+
+    return String.valueOf(getValue().getMillis());
+  }
+
+  @Override
+  public void restoreFromUrlSafeValueString(String valueString) {
+    if (valueString == null || valueString.isEmpty()) {
+      setValue(null);
+    } else {
+      setValue(new DateTime(Long.parseLong(valueString)));
+    }
+  }
+
+  @Override
+  public MInputType getType() {
+    return MInputType.DATETIME;
+  }
+
+  @Override
+  public boolean equals(Object other) {
+    if (other == this) {
+      return true;
+    }
+
+    if (!(other instanceof MDateTimeInput)) {
+      return false;
+    }
+
+    MDateTimeInput mdi = (MDateTimeInput) other;
+    return getName().equals(mdi.getName());
+  }
+
+  @Override
+  public int hashCode() {
+    return 23 + 31 * getName().hashCode();
+  }
+
+  @Override
+  public boolean isEmpty() {
+    return getValue() == null;
+  }
+
+  @Override
+  public void setEmpty() {
+    setValue(null);
+  }
+
+  @Override
+  public MDateTimeInput clone(boolean cloneWithValue) {
+    MDateTimeInput copy = new MDateTimeInput(getName(), isSensitive(), getEditable(), getOverrides());
+    copy.setPersistenceId(getPersistenceId());
+    if(cloneWithValue && this.getValue() != null) {
+      copy.setValue(new DateTime(this.getValue()));
+    }
+    return copy;
+  }
+}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/00ada83b/common/src/main/java/org/apache/sqoop/model/MInputType.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/model/MInputType.java b/common/src/main/java/org/apache/sqoop/model/MInputType.java
index 0f1fe0a..bc9d34f 100644
--- a/common/src/main/java/org/apache/sqoop/model/MInputType.java
+++ b/common/src/main/java/org/apache/sqoop/model/MInputType.java
@@ -51,5 +51,8 @@ public enum MInputType {
   /** List input type */
   LIST,
 
+  /** DateTime input type */
+  DATETIME
+
   ;
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/00ada83b/common/src/test/java/org/apache/sqoop/json/util/TestConfigSerialization.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/json/util/TestConfigSerialization.java b/common/src/test/java/org/apache/sqoop/json/util/TestConfigSerialization.java
index 2a2cfe8..ab4f258 100644
--- a/common/src/test/java/org/apache/sqoop/json/util/TestConfigSerialization.java
+++ b/common/src/test/java/org/apache/sqoop/json/util/TestConfigSerialization.java
@@ -33,6 +33,7 @@ import org.apache.sqoop.model.InputEditable;
 import org.apache.sqoop.model.MBooleanInput;
 import org.apache.sqoop.model.MConfig;
 import org.apache.sqoop.model.MConfigType;
+import org.apache.sqoop.model.MDateTimeInput;
 import org.apache.sqoop.model.MEnumInput;
 import org.apache.sqoop.model.MInput;
 import org.apache.sqoop.model.MIntegerInput;
@@ -40,6 +41,7 @@ import org.apache.sqoop.model.MListInput;
 import org.apache.sqoop.model.MLongInput;
 import org.apache.sqoop.model.MMapInput;
 import org.apache.sqoop.model.MStringInput;
+import org.joda.time.DateTime;
 import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 import org.testng.annotations.Test;
@@ -130,6 +132,8 @@ public class TestConfigSerialization {
     List<String> list = new LinkedList<String>();
     list.add("C");
 
+    DateTime dt = new DateTime(12345678L);
+
     // Fill config with all values
     MConfig config = getConfig();
     config.getStringInput("String").setValue("A");
@@ -138,6 +142,7 @@ public class TestConfigSerialization {
     config.getBooleanInput("Boolean").setValue(true);
     config.getEnumInput("Enum").setValue("YES");
     config.getListInput("List").setValue(list);
+    config.getDateTimeInput("DateTime").setValue(dt);
 
     // Serialize that into JSON
     JSONObject jsonObject = ConfigInputSerialization.extractConfig(config, MConfigType.JOB,  false);
@@ -174,6 +179,7 @@ public class TestConfigSerialization {
     assertEquals(true, retrieved.getBooleanInput("Boolean").getValue().booleanValue());
     assertEquals("YES", retrieved.getEnumInput("Enum").getValue());
     assertEquals(list, retrieved.getListInput("List").getValue());
+    assertEquals(dt, retrieved.getDateTimeInput("DateTime").getValue());
   }
 
   protected MConfig getMapConfig() {
@@ -220,6 +226,9 @@ public class TestConfigSerialization {
     input = new MListInput("List", false, InputEditable.ANY, StringUtils.EMPTY);
     inputs.add(input);
 
+    input = new MDateTimeInput("DateTime", false, InputEditable.ANY, StringUtils.EMPTY);
+    inputs.add(input);
+
     return new MConfig("c", inputs);
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/00ada83b/common/src/test/java/org/apache/sqoop/model/TestMConfig.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/model/TestMConfig.java b/common/src/test/java/org/apache/sqoop/model/TestMConfig.java
index 2cb3989..f18b069 100644
--- a/common/src/test/java/org/apache/sqoop/model/TestMConfig.java
+++ b/common/src/test/java/org/apache/sqoop/model/TestMConfig.java
@@ -75,6 +75,7 @@ public class TestMConfig {
     MEnumInput enumInput = new MEnumInput("Config.D", false, InputEditable.ANY, StringUtils.EMPTY,
         new String[] { "I", "V" });
     MListInput listInput = new MListInput("Config.E", false, InputEditable.ANY, StringUtils.EMPTY );
+    MDateTimeInput dtInput = new MDateTimeInput("Config.F", false, InputEditable.ANY, StringUtils.EMPTY );
 
     List<MInput<?>> inputs = new ArrayList<MInput<?>>();
     inputs.add(intInput);
@@ -83,6 +84,7 @@ public class TestMConfig {
     inputs.add(stringInput);
     inputs.add(enumInput);
     inputs.add(listInput);
+    inputs.add(dtInput);
 
     MConfig config = new MConfig("Config", inputs);
     assertEquals(intInput, config.getIntegerInput("Config.A"));
@@ -91,5 +93,6 @@ public class TestMConfig {
     assertEquals(stringInput, config.getStringInput("Config.C"));
     assertEquals(enumInput, config.getEnumInput("Config.D"));
     assertEquals(listInput, config.getListInput("Config.E"));
+    assertEquals(dtInput, config.getDateTimeInput("Config.F"));
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/00ada83b/common/src/test/java/org/apache/sqoop/model/TestMConfigList.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/model/TestMConfigList.java b/common/src/test/java/org/apache/sqoop/model/TestMConfigList.java
index fd100b1..d0847fe 100644
--- a/common/src/test/java/org/apache/sqoop/model/TestMConfigList.java
+++ b/common/src/test/java/org/apache/sqoop/model/TestMConfigList.java
@@ -44,11 +44,13 @@ public class TestMConfigList {
     MEnumInput enumInput = new MEnumInput("Config2.D", false, InputEditable.ANY, StringUtils.EMPTY,
         new String[] { "I", "V" });
     MListInput listInput = new MListInput("Config2.E", false, InputEditable.ANY, StringUtils.EMPTY);
+    MDateTimeInput dtInput = new MDateTimeInput("Config2.F", false, InputEditable.ANY, StringUtils.EMPTY);
 
     inputs = new ArrayList<MInput<?>>();
     inputs.add(stringInput);
     inputs.add(enumInput);
     inputs.add(listInput);
+    inputs.add(dtInput);
     configs.add(new MConfig("Config2", inputs));
 
     MConfigList config = new MConfigList(configs, MConfigType.JOB);
@@ -57,5 +59,6 @@ public class TestMConfigList {
     assertEquals(stringInput, config.getStringInput("Config2.C"));
     assertEquals(enumInput, config.getEnumInput("Config2.D"));
     assertEquals(listInput, config.getListInput("Config2.E"));
+    assertEquals(dtInput, config.getDateTimeInput("Config2.F"));
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/00ada83b/common/src/test/java/org/apache/sqoop/model/TestMDateTimeInput.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/model/TestMDateTimeInput.java b/common/src/test/java/org/apache/sqoop/model/TestMDateTimeInput.java
new file mode 100644
index 0000000..9c110cd
--- /dev/null
+++ b/common/src/test/java/org/apache/sqoop/model/TestMDateTimeInput.java
@@ -0,0 +1,122 @@
+/**
+ * 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.sqoop.model;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import org.apache.commons.lang.StringUtils;
+import org.joda.time.DateTime;
+import org.testng.annotations.Test;
+
+/**
+ * Test class for org.apache.sqoop.model.MDateTimeInput
+ */
+public class TestMDateTimeInput {
+  /**
+   * Test for class initialization
+   */
+  @Test
+  public void testInitialization() {
+    MDateTimeInput input = new MDateTimeInput("sqoopsqoop", false, InputEditable.ANY, StringUtils.EMPTY);
+    assertEquals("sqoopsqoop", input.getName());
+    assertEquals(MInputType.DATETIME, input.getType());
+  }
+
+  /**
+   * Test for equals() method
+   */
+  @Test
+  public void testEquals() {
+    // Positive test
+    MDateTimeInput input1 = new MDateTimeInput("sqoopsqoop", false, InputEditable.ANY, StringUtils.EMPTY);
+    MDateTimeInput input2 = new MDateTimeInput("sqoopsqoop", false, InputEditable.ANY, StringUtils.EMPTY);
+    assertTrue(input1.equals(input2));
+
+    // Negative test
+    MDateTimeInput input3 = new MDateTimeInput("sqoopsqoop", false, InputEditable.ANY, StringUtils.EMPTY);
+    MDateTimeInput input4 = new MDateTimeInput("sqoopsqoop1", false, InputEditable.ANY, StringUtils.EMPTY);
+    assertFalse(input3.equals(input4));
+  }
+
+  /**
+   * Test for value
+   */
+  @Test
+  public void testValue() {
+    MDateTimeInput input1 = new MDateTimeInput("sqoopsqoop", false, InputEditable.ANY, StringUtils.EMPTY);
+
+    //  Test for long format
+    DateTime dt = new DateTime(1234567L);
+    input1.setValue(dt);
+    assertEquals(dt, input1.getValue());
+
+    // Test for ISO8601 format
+    dt = DateTime.parse("2010-06-30T01:20");
+    input1.setValue(dt);
+    assertEquals(dt, input1.getValue());
+
+    input1.setEmpty();
+    assertNull(input1.getValue());
+  }
+
+  /**
+   * Test for getUrlSafeValueString() and restoreFromUrlSafeValueString()
+   */
+  @Test
+  public void testUrlSafe() {
+    MDateTimeInput input1 = new MDateTimeInput("sqoopsqoop", false, InputEditable.ANY, StringUtils.EMPTY);
+    DateTime dt = new DateTime(1234567L);
+    input1.setValue(dt);
+    // Getting URL safe string
+    String tmp = input1.getUrlSafeValueString();
+    // Restore to actual value
+    input1.restoreFromUrlSafeValueString(tmp);
+    assertNotNull(input1.getValue());
+    assertEquals(dt, input1.getValue());
+
+    input1.setValue(null);
+    tmp = input1.getUrlSafeValueString();
+    input1.restoreFromUrlSafeValueString(tmp);
+    assertNull(input1.getValue());
+  }
+
+  /**
+   * Test case for MNamedElement.getLabelKey() and MNamedElement.getHelpKey()
+   */
+  @Test
+  public void testNamedElement() {
+    MDateTimeInput input1 = new MDateTimeInput("sqoopsqoop", true, InputEditable.ANY, StringUtils.EMPTY);
+    assertEquals("sqoopsqoop.label", input1.getLabelKey());
+    assertEquals("sqoopsqoop.help", input1.getHelpKey());
+  }
+
+  /**
+   * Test for sensitivity
+   */
+  @Test
+  public void testSensitivity() {
+    MDateTimeInput input1 = new MDateTimeInput("NAME", false, InputEditable.ANY, StringUtils.EMPTY );
+    MDateTimeInput input2 = new MDateTimeInput("NAME", true, InputEditable.ANY, StringUtils.EMPTY );
+    assertFalse(input1.isSensitive());
+    assertTrue(input2.isSensitive());
+  }
+}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/00ada83b/connector/connector-sdk/pom.xml
----------------------------------------------------------------------
diff --git a/connector/connector-sdk/pom.xml b/connector/connector-sdk/pom.xml
index c888aa0..0cbbb04 100644
--- a/connector/connector-sdk/pom.xml
+++ b/connector/connector-sdk/pom.xml
@@ -33,10 +33,6 @@ limitations under the License.
 
   <dependencies>
     <dependency>
-      <groupId>joda-time</groupId>
-      <artifactId>joda-time</artifactId>
-    </dependency>
-    <dependency>
       <groupId>commons-codec</groupId>
       <artifactId>commons-codec</artifactId>
     </dependency>

http://git-wip-us.apache.org/repos/asf/sqoop/blob/00ada83b/repository/repository-common/src/main/java/org/apache/sqoop/repository/common/CommonRepositoryHandler.java
----------------------------------------------------------------------
diff --git a/repository/repository-common/src/main/java/org/apache/sqoop/repository/common/CommonRepositoryHandler.java b/repository/repository-common/src/main/java/org/apache/sqoop/repository/common/CommonRepositoryHandler.java
index 6d303c8..c2ba6e3 100644
--- a/repository/repository-common/src/main/java/org/apache/sqoop/repository/common/CommonRepositoryHandler.java
+++ b/repository/repository-common/src/main/java/org/apache/sqoop/repository/common/CommonRepositoryHandler.java
@@ -49,6 +49,7 @@ import org.apache.sqoop.model.MConfigType;
 import org.apache.sqoop.model.MConfigUpdateEntityType;
 import org.apache.sqoop.model.MConfigurableType;
 import org.apache.sqoop.model.MConnector;
+import org.apache.sqoop.model.MDateTimeInput;
 import org.apache.sqoop.model.MDriver;
 import org.apache.sqoop.model.MDriverConfig;
 import org.apache.sqoop.model.MEnumInput;
@@ -1982,6 +1983,9 @@ public abstract class CommonRepositoryHandler extends JdbcRepositoryHandler {
               case LIST:
                 input = new MListInput(inputName, inputSensitivity, editableEnum, overrides);
                 break;
+              case DATETIME:
+                input = new MDateTimeInput(inputName, inputSensitivity, editableEnum, overrides);
+                break;
               default:
                 throw new SqoopException(CommonRepositoryError.COMMON_0003,
                         "input-" + inputName + ":" + inputId + ":"
@@ -2128,6 +2132,9 @@ public abstract class CommonRepositoryHandler extends JdbcRepositoryHandler {
               case LIST:
                 input = new MListInput(inputName, inputSensitivity, editableEnum, overrides);
                 break;
+              case DATETIME:
+                input = new MDateTimeInput(inputName, inputSensitivity, editableEnum, overrides);
+                break;
               default:
                 throw new SqoopException(CommonRepositoryError.COMMON_0003, "input-" + inputName + ":"
                         + inputId + ":" + "config-" + inputConfig + ":" + mit.name());

http://git-wip-us.apache.org/repos/asf/sqoop/blob/00ada83b/shell/src/main/java/org/apache/sqoop/shell/utils/ConfigDisplayer.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/utils/ConfigDisplayer.java b/shell/src/main/java/org/apache/sqoop/shell/utils/ConfigDisplayer.java
index ab442fe..8414fe8 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/utils/ConfigDisplayer.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/utils/ConfigDisplayer.java
@@ -33,6 +33,7 @@ import org.apache.sqoop.model.MAccountableEntity;
 import org.apache.sqoop.model.MBooleanInput;
 import org.apache.sqoop.model.MConfig;
 import org.apache.sqoop.model.MConnector;
+import org.apache.sqoop.model.MDateTimeInput;
 import org.apache.sqoop.model.MDriverConfig;
 import org.apache.sqoop.model.MEnumInput;
 import org.apache.sqoop.model.MInput;
@@ -206,6 +207,9 @@ public final class ConfigDisplayer {
             case LIST:
               displayInputList((MListInput) input);
               break;
+            case DATETIME:
+              displayInputDateTime((MDateTimeInput) input);
+              break;
             default:
               print("\n%s " + input.getType(), resourceString(Constants.RES_CONFIG_DISPLAYER_UNSUPPORTED_DATATYPE));
               return;
@@ -289,6 +293,15 @@ public final class ConfigDisplayer {
     }
   }
 
+  /**
+   * Display content of DateTime input
+   *
+   * @param input DateTime input
+   */
+  private static void displayInputDateTime(MDateTimeInput input) {
+    print(input.getValue());
+  }
+
   private ConfigDisplayer() {
     // Do not instantiate
   }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/00ada83b/shell/src/main/java/org/apache/sqoop/shell/utils/ConfigFiller.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/utils/ConfigFiller.java b/shell/src/main/java/org/apache/sqoop/shell/utils/ConfigFiller.java
index 6f1af94..39bc914 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/utils/ConfigFiller.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/utils/ConfigFiller.java
@@ -24,6 +24,7 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.sqoop.common.Direction;
 import org.apache.sqoop.model.InputEditable;
 import org.apache.sqoop.model.MBooleanInput;
+import org.apache.sqoop.model.MDateTimeInput;
 import org.apache.sqoop.model.MLink;
 import org.apache.sqoop.model.MEnumInput;
 import org.apache.sqoop.model.MConfig;
@@ -38,6 +39,7 @@ import org.apache.sqoop.model.MStringInput;
 import org.apache.sqoop.model.MValidatedElement;
 import org.apache.sqoop.validation.Message;
 import org.apache.sqoop.validation.Status;
+import org.joda.time.DateTime;
 
 import java.io.IOException;
 import java.util.LinkedList;
@@ -202,6 +204,9 @@ public final class ConfigFiller {
     case LIST:
       assert input instanceof MListInput;
       return fillInputList(prefix, (MListInput) input, line);
+    case DATETIME:
+      assert input instanceof MDateTimeInput;
+      return fillInputDateTime(prefix, (MDateTimeInput) input, line);
     default:
       println("Unsupported data type " + input.getType());
       return true;
@@ -209,6 +214,55 @@ public final class ConfigFiller {
   }
 
   /**
+   * Load CLI options for datetime type.
+   *
+   * Supports the following two types of format:
+   * <ul>
+   * <li> ISO8601 format (yyyy-MM-ddTHH:mm:ss.SSSZZ)
+   * <li> Long which represents the milliseconds from 1970-01-01T00:00:00Z
+   * </ul>
+   *
+   * @param prefix placed at the beginning of the CLI option key
+   * @param input Input that we should read or edit
+   * @param line CLI options container
+   * @return
+   * @throws IOException
+   */
+  private static boolean fillInputDateTime(String prefix,
+                                       MDateTimeInput input,
+                                       CommandLine line)
+                                       throws IOException {
+    String opt = ConfigOptions.getOptionKey(prefix, input);
+    if (line.hasOption(opt)) {
+      DateTime dt = parseDateTime(line.getOptionValue(opt));
+      if (dt == null) {
+        errorMessage(input, "Input is not valid DateTime format");
+        return false;
+      }
+      input.setValue(dt);
+    } else {
+      input.setEmpty();
+    }
+    return true;
+  }
+
+  private static DateTime parseDateTime(String value) {
+    DateTime dt = null;
+    try {
+      dt = DateTime.parse(value);
+    } catch (IllegalArgumentException iae) {
+      // value is not valid ISO8601 format
+      try {
+        long a  = Long.parseLong(value);
+        dt = new DateTime(a);
+      } catch (NumberFormatException nfe) {
+        // value is not numeric string
+      }
+    }
+    return dt;
+  }
+
+  /**
    * Load CLI options for list type.
    *
    * Parses elements that take the config "<element1>&<element2>&...".
@@ -542,6 +596,8 @@ public final class ConfigFiller {
         return fillInputEnumWithBundle((MEnumInput) input, reader, bundle);
       case LIST:
         return fillInputListWithBundle((MListInput) input, reader, bundle);
+      case DATETIME:
+        return fillInputDateTimeWithBundle((MDateTimeInput) input, reader, bundle);
       default:
         println("Unsupported data type " + input.getType());
         return true;
@@ -549,6 +605,58 @@ public final class ConfigFiller {
   }
 
   /**
+   * Load user input for datetime type.
+   *
+   * This implementation supports the following two types of format:
+   * <ul>
+   * <li> ISO8601 format (yyyy-MM-ddTHH:mm:ss.SSSZZ)
+   * <li> Long which represents the milliseconds from 1970-01-01T00:00:00Z
+   * </ul>
+   *
+   * If user did not enter anything (empty input) finish loading and return from function.
+   *
+   * @param input Input that we should read or edit
+   * @param reader Associated console reader
+   * @param bundle Resource bundle
+   * @return True if user wish to continue with loading additional inputs
+   * @throws IOException
+   */
+  private static boolean fillInputDateTimeWithBundle(MDateTimeInput input,
+                                                     ConsoleReader reader,
+                                                     ResourceBundle bundle)
+                                                     throws IOException {
+    generatePrompt(reader, bundle, input);
+
+    if (!input.isEmpty() && !input.isSensitive()) {
+      reader.putString(input.getValue().toString());
+    }
+
+    // Get the data
+    String userTyped;
+    if (input.isSensitive()) {
+      userTyped = reader.readLine('*');
+    } else {
+      userTyped = reader.readLine();
+    }
+
+    if (userTyped == null) {
+      return false;
+    } else if (userTyped.isEmpty()) {
+      input.setEmpty();
+    } else {
+      DateTime dt = parseDateTime(userTyped);
+      if (dt == null) {
+        errorMessage("Input is not a valid DateTime");
+        return fillInputDateTimeWithBundle(input, reader, bundle);
+      }
+
+      input.setValue(dt);
+    }
+
+    return true;
+  }
+
+  /**
    * Load user input for list type.
    *
    * This implementation will load one element at a time. If user did not