Repository: sqoop
Updated Branches:
  refs/heads/sqoop2 190b78fcb -> 25b0df5c8


SQOOP-2688: Sqoop2: Provide utility method to safely retrieve value from 
JSONObject
(Jarek Jarcec  Cecho via Kate Ting)


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

Branch: refs/heads/sqoop2
Commit: 25b0df5c8c5934c483fb340ffdf1596d2164c94a
Parents: 190b78f
Author: Kate Ting <[email protected]>
Authored: Wed Nov 18 14:34:17 2015 -0800
Committer: Kate Ting <[email protected]>
Committed: Wed Nov 18 14:34:17 2015 -0800

----------------------------------------------------------------------
 .../org/apache/sqoop/json/ConnectorBean.java    | 37 +++++-----
 .../org/apache/sqoop/json/ConnectorsBean.java   |  2 +-
 .../java/org/apache/sqoop/json/DriverBean.java  | 13 ++--
 .../java/org/apache/sqoop/json/JSONUtils.java   | 49 +++++++++++++
 .../java/org/apache/sqoop/json/JobBean.java     | 52 +++++++-------
 .../java/org/apache/sqoop/json/JobsBean.java    |  2 +-
 .../java/org/apache/sqoop/json/LinkBean.java    | 24 +++----
 .../java/org/apache/sqoop/json/LinksBean.java   |  2 +-
 .../org/apache/sqoop/json/PrincipalBean.java    |  4 +-
 .../org/apache/sqoop/json/PrincipalsBean.java   |  2 +-
 .../org/apache/sqoop/json/PrivilegeBean.java    |  8 +--
 .../org/apache/sqoop/json/PrivilegesBean.java   |  2 +-
 .../java/org/apache/sqoop/json/RoleBean.java    |  4 +-
 .../java/org/apache/sqoop/json/RolesBean.java   |  2 +-
 .../org/apache/sqoop/json/SubmissionBean.java   | 32 ++++-----
 .../org/apache/sqoop/json/SubmissionsBean.java  |  2 +-
 .../apache/sqoop/json/ValidationResultBean.java |  9 +--
 .../json/util/ConfigInputSerialization.java     | 50 ++++++-------
 .../sqoop/json/util/SchemaSerialization.java    | 43 ++++++------
 .../sqoop/json/util/SerializationError.java     |  4 ++
 .../org/apache/sqoop/json/TestJSONUtils.java    | 74 ++++++++++++++++++++
 21 files changed, 262 insertions(+), 155 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/main/java/org/apache/sqoop/json/ConnectorBean.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/json/ConnectorBean.java 
b/common/src/main/java/org/apache/sqoop/json/ConnectorBean.java
index 2509e3e..89ae20c 100644
--- a/common/src/main/java/org/apache/sqoop/json/ConnectorBean.java
+++ b/common/src/main/java/org/apache/sqoop/json/ConnectorBean.java
@@ -130,7 +130,7 @@ public class ConnectorBean extends ConfigurableBean {
   public void restore(JSONObject jsonObject) {
     connectors = new ArrayList<MConnector>();
     connectorConfigBundles = new HashMap<Long, ResourceBundle>();
-    JSONObject obj = (JSONObject) jsonObject.get(CONNECTOR);
+    JSONObject obj = JSONUtils.getJSONObject(jsonObject, CONNECTOR);
     connectors.add(restoreConnector(obj));
   }
 
@@ -144,34 +144,30 @@ public class ConnectorBean extends ConfigurableBean {
 
   private MConnector restoreConnector(Object obj) {
     JSONObject object = (JSONObject) obj;
-    long connectorId = (Long) object.get(ID);
-    String uniqueName = (String) object.get(NAME);
-    String className = (String) object.get(CLASS);
-    String version = (String) object.get(CONFIGURABLE_VERSION);
+    long connectorId = JSONUtils.getLong(object, ID);
+    String uniqueName = JSONUtils.getString(object, NAME);
+    String className = JSONUtils.getString(object, CLASS);
+    String version = JSONUtils.getString(object, CONFIGURABLE_VERSION);
 
-    JSONObject jsonLink = (JSONObject) object.get(CONNECTOR_LINK_CONFIG);
-    List<MConfig> linkConfigs = restoreConfigs((JSONArray) 
jsonLink.get(ConfigInputConstants.CONFIGS));
-    List<MValidator> linkValidators = restoreValidator((JSONArray) jsonLink
-      .get(ConfigInputConstants.CONFIG_VALIDATORS));
+    JSONObject jsonLink = JSONUtils.getJSONObject(object, 
CONNECTOR_LINK_CONFIG);
+    List<MConfig> linkConfigs = 
restoreConfigs(JSONUtils.getJSONArray(jsonLink, ConfigInputConstants.CONFIGS));
+    List<MValidator> linkValidators = 
restoreValidator(JSONUtils.getJSONArray(jsonLink, 
ConfigInputConstants.CONFIG_VALIDATORS));
 
     // parent that encapsulates both the from/to configs
-    JSONObject jobConfigJson = (JSONObject) object.get(CONNECTOR_JOB_CONFIG);
-    JSONObject fromJobConfigJson = (JSONObject) 
jobConfigJson.get(Direction.FROM.name());
-    JSONObject toJobConfigJson = (JSONObject) 
jobConfigJson.get(Direction.TO.name());
+    JSONObject jobConfigJson = JSONUtils.getJSONObject(object, 
CONNECTOR_JOB_CONFIG);
+    JSONObject fromJobConfigJson = 
jobConfigJson.containsKey(Direction.FROM.name()) ? 
JSONUtils.getJSONObject(jobConfigJson, Direction.FROM.name()) : null;
+    JSONObject toJobConfigJson = 
jobConfigJson.containsKey(Direction.TO.name()) ? 
JSONUtils.getJSONObject(jobConfigJson, Direction.TO.name()) : null;
 
     MFromConfig fromConfig = null;
     MToConfig toConfig = null;
     if (fromJobConfigJson != null) {
-      List<MConfig> fromLinkConfigs = restoreConfigs((JSONArray) 
fromJobConfigJson.get(ConfigInputConstants.CONFIGS));
-      List<MValidator> fromLinkValidators = restoreValidator((JSONArray)
-        fromJobConfigJson.get(ConfigInputConstants.CONFIG_VALIDATORS));
+      List<MConfig> fromLinkConfigs = 
restoreConfigs(JSONUtils.getJSONArray(fromJobConfigJson, 
ConfigInputConstants.CONFIGS));
+      List<MValidator> fromLinkValidators = 
restoreValidator(JSONUtils.getJSONArray(fromJobConfigJson, 
ConfigInputConstants.CONFIG_VALIDATORS));
       fromConfig = new MFromConfig(fromLinkConfigs, fromLinkValidators);
-
     }
     if (toJobConfigJson != null) {
-      List<MConfig> toLinkConfigs = restoreConfigs((JSONArray) 
toJobConfigJson.get(ConfigInputConstants.CONFIGS));
-      List<MValidator> toLinkValidators = restoreValidator((JSONArray)
-        toJobConfigJson.get(ConfigInputConstants.CONFIG_VALIDATORS));
+      List<MConfig> toLinkConfigs = 
restoreConfigs(JSONUtils.getJSONArray(toJobConfigJson, 
ConfigInputConstants.CONFIGS));
+      List<MValidator> toLinkValidators = 
restoreValidator(JSONUtils.getJSONArray(toJobConfigJson, 
ConfigInputConstants.CONFIG_VALIDATORS));
       toConfig = new MToConfig(toLinkConfigs, toLinkValidators);
     }
 
@@ -181,8 +177,7 @@ public class ConnectorBean extends ConfigurableBean {
 
     connector.setPersistenceId(connectorId);
     if (object.containsKey(ALL_CONFIGS)) {
-
-      JSONObject jsonConfigBundle = (JSONObject) object.get(ALL_CONFIGS);
+      JSONObject jsonConfigBundle = JSONUtils.getJSONObject(object, 
ALL_CONFIGS);
       connectorConfigBundles.put(connectorId, 
restoreConfigParamBundle(jsonConfigBundle));
     }
     return connector;

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/main/java/org/apache/sqoop/json/ConnectorsBean.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/json/ConnectorsBean.java 
b/common/src/main/java/org/apache/sqoop/json/ConnectorsBean.java
index 88b71f5..9762ffa 100644
--- a/common/src/main/java/org/apache/sqoop/json/ConnectorsBean.java
+++ b/common/src/main/java/org/apache/sqoop/json/ConnectorsBean.java
@@ -58,7 +58,7 @@ public class ConnectorsBean extends ConnectorBean {
 
   @Override
   public void restore(JSONObject jsonObject) {
-    JSONArray array = (JSONArray) jsonObject.get(CONNECTORS);
+    JSONArray array = JSONUtils.getJSONArray(jsonObject, CONNECTORS);
     super.restoreConnectors(array);
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/main/java/org/apache/sqoop/json/DriverBean.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/json/DriverBean.java 
b/common/src/main/java/org/apache/sqoop/json/DriverBean.java
index 6f03be2..988e0a8 100644
--- a/common/src/main/java/org/apache/sqoop/json/DriverBean.java
+++ b/common/src/main/java/org/apache/sqoop/json/DriverBean.java
@@ -85,14 +85,13 @@ public class DriverBean extends ConfigurableBean {
 
   @Override
   public void restore(JSONObject jsonObject) {
-    long id = (Long) jsonObject.get(ID);
-    String driverVersion = (String) jsonObject.get(CONFIGURABLE_VERSION);
-    JSONObject driverJobConfig = (JSONObject) 
jsonObject.get(DRIVER_JOB_CONFIG);
-    List<MConfig> driverConfigs = restoreConfigs((JSONArray) 
driverJobConfig.get(ConfigInputConstants.CONFIGS));
-    List<MValidator> driverValidators = restoreValidator((JSONArray)
-      driverJobConfig.get(ConfigInputConstants.CONFIG_VALIDATORS));
+    long id = JSONUtils.getLong(jsonObject, ID);
+    String driverVersion = JSONUtils.getString(jsonObject, 
CONFIGURABLE_VERSION);
+    JSONObject driverJobConfig = JSONUtils.getJSONObject(jsonObject, 
DRIVER_JOB_CONFIG);
+    List<MConfig> driverConfigs = 
restoreConfigs(JSONUtils.getJSONArray(driverJobConfig, 
ConfigInputConstants.CONFIGS));
+    List<MValidator> driverValidators = 
restoreValidator(JSONUtils.getJSONArray(driverJobConfig, 
ConfigInputConstants.CONFIG_VALIDATORS));
     driver = new MDriver(new MDriverConfig(driverConfigs, driverValidators), 
driverVersion);
     driver.setPersistenceId(id);
-    driverConfigBundle = restoreConfigParamBundle((JSONObject) 
jsonObject.get(ALL_CONFIGS));
+    driverConfigBundle = 
restoreConfigParamBundle(JSONUtils.getJSONObject(jsonObject, ALL_CONFIGS));
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/main/java/org/apache/sqoop/json/JSONUtils.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/json/JSONUtils.java 
b/common/src/main/java/org/apache/sqoop/json/JSONUtils.java
index ff8f9ea..3b1ff08 100644
--- a/common/src/main/java/org/apache/sqoop/json/JSONUtils.java
+++ b/common/src/main/java/org/apache/sqoop/json/JSONUtils.java
@@ -21,12 +21,14 @@ import org.apache.sqoop.classification.InterfaceAudience;
 import org.apache.sqoop.classification.InterfaceStability;
 import org.apache.sqoop.common.SqoopException;
 import org.apache.sqoop.json.util.SerializationError;
+import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 import org.json.simple.JSONValue;
 import org.json.simple.parser.ParseException;
 
 import java.io.IOException;
 import java.io.Reader;
+import java.util.Date;
 
 /**
  */
@@ -68,6 +70,53 @@ public class JSONUtils {
     }
   }
 
+  /**
+   * Retrieve safely given key from JSONObject and ensure that it's of given 
class.
+   */
+  public static <T> T getType(JSONObject jsonObject, String key, Class<T> 
targetClass) {
+    if(!jsonObject.containsKey(key)) {
+      throw new SqoopException(SerializationError.SERIALIZATION_003, "Key: " + 
key);
+    }
+    Object ret = jsonObject.get(key);
+
+    if(ret == null) {
+      return null;
+    }
+
+    if( !(targetClass.isInstance(ret))) {
+      throw new SqoopException(SerializationError.SERIALIZATION_004, "Found " 
+ ret.getClass().getName() + " instead of " + targetClass.getName() + " for 
key: " + key);
+    }
+
+    return (T)ret;
+  }
+
+  public static Long getLong(JSONObject jsonObject, String key) {
+    return getType(jsonObject, key, Long.class);
+  }
+  public static JSONObject getJSONObject(JSONObject jsonObject, String key) {
+    return getType(jsonObject, key, JSONObject.class);
+  }
+  public static JSONArray getJSONArray(JSONObject jsonObject, String key) {
+    return getType(jsonObject, key, JSONArray.class);
+  }
+  public static String getString(JSONObject jsonObject, String key) {
+    return getType(jsonObject, key, String.class);
+  }
+  public static Boolean getBoolean(JSONObject jsonObject, String key) {
+    return getType(jsonObject, key, Boolean.class);
+  }
+  public static Double getDouble(JSONObject jsonObject, String key) {
+    return getType(jsonObject, key, Double.class);
+  }
+  public static Date getDate(JSONObject jsonObject, String key) {
+    Long epoch = getType(jsonObject, key, Long.class);
+    if(epoch == null) {
+      return null;
+    }
+
+    return new Date(epoch);
+  }
+
   private JSONUtils() {
     // Instantiation is prohibited
   }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/main/java/org/apache/sqoop/json/JobBean.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/json/JobBean.java 
b/common/src/main/java/org/apache/sqoop/json/JobBean.java
index df7a804..b703987 100644
--- a/common/src/main/java/org/apache/sqoop/json/JobBean.java
+++ b/common/src/main/java/org/apache/sqoop/json/JobBean.java
@@ -155,7 +155,7 @@ public class JobBean implements JsonBean {
   @Override
   public void restore(JSONObject jsonObject) {
     jobs = new ArrayList<MJob>();
-    JSONObject obj = (JSONObject) jsonObject.get(JOB);
+    JSONObject obj = JSONUtils.getJSONObject(jsonObject, JOB);
     jobs.add(restoreJob(obj));
   }
 
@@ -168,26 +168,22 @@ public class JobBean implements JsonBean {
 
   private MJob restoreJob(Object obj) {
     JSONObject object = (JSONObject) obj;
-    long fromConnectorId = (Long) object.get(FROM_CONNECTOR_ID);
-    long toConnectorId = (Long) object.get(TO_CONNECTOR_ID);
-    long fromConnectionId = (Long) object.get(FROM_LINK_ID);
-    long toConnectionId = (Long) object.get(TO_LINK_ID);
-    JSONObject fromConfigJson = (JSONObject) object.get(FROM_CONFIG_VALUES);
-    JSONObject toConfigJson = (JSONObject) object.get(TO_CONFIG_VALUES);
-    JSONObject driverConfigJson = (JSONObject) 
object.get(DRIVER_CONFIG_VALUES);
-
-    List<MConfig> fromConfigs = restoreConfigs((JSONArray) 
fromConfigJson.get(ConfigInputConstants.CONFIGS));
-    List<MValidator> fromValidators = restoreValidator((JSONArray)
-      fromConfigJson.get(ConfigInputConstants.CONFIG_VALIDATORS));
-
-    List<MConfig> toConfigs = restoreConfigs((JSONArray) 
toConfigJson.get(ConfigInputConstants.CONFIGS));
-    List<MValidator> toValidators = restoreValidator((JSONArray)
-      toConfigJson.get(ConfigInputConstants.CONFIG_VALIDATORS));
-
-    List<MConfig> driverConfigs = restoreConfigs((JSONArray) driverConfigJson
-      .get(ConfigInputConstants.CONFIGS));
-    List<MValidator> driverValidators = restoreValidator((JSONArray)
-      driverConfigJson.get(ConfigInputConstants.CONFIG_VALIDATORS));
+    long fromConnectorId = JSONUtils.getLong(object, FROM_CONNECTOR_ID);
+    long toConnectorId = JSONUtils.getLong(object, TO_CONNECTOR_ID);
+    long fromConnectionId = JSONUtils.getLong(object, FROM_LINK_ID);
+    long toConnectionId = JSONUtils.getLong(object, TO_LINK_ID);
+    JSONObject fromConfigJson = JSONUtils.getJSONObject(object, 
FROM_CONFIG_VALUES);
+    JSONObject toConfigJson = JSONUtils.getJSONObject(object, 
TO_CONFIG_VALUES);
+    JSONObject driverConfigJson = JSONUtils.getJSONObject(object, 
DRIVER_CONFIG_VALUES);
+
+    List<MConfig> fromConfigs = 
restoreConfigs(JSONUtils.getJSONArray(fromConfigJson, 
ConfigInputConstants.CONFIGS));
+    List<MValidator> fromValidators = 
restoreValidator(JSONUtils.getJSONArray(fromConfigJson, 
ConfigInputConstants.CONFIG_VALIDATORS));
+
+    List<MConfig> toConfigs = 
restoreConfigs(JSONUtils.getJSONArray(toConfigJson, 
ConfigInputConstants.CONFIGS));
+    List<MValidator> toValidators = 
restoreValidator(JSONUtils.getJSONArray(toConfigJson, 
ConfigInputConstants.CONFIG_VALIDATORS));
+
+    List<MConfig> driverConfigs = 
restoreConfigs(JSONUtils.getJSONArray(driverConfigJson, 
ConfigInputConstants.CONFIGS));
+    List<MValidator> driverValidators = 
restoreValidator(JSONUtils.getJSONArray(driverConfigJson, 
ConfigInputConstants.CONFIG_VALIDATORS));
 
     MJob job = new MJob(
       fromConnectorId,
@@ -199,13 +195,13 @@ public class JobBean implements JsonBean {
       new MDriverConfig(driverConfigs, driverValidators)
     );
 
-    job.setPersistenceId((Long) object.get(ID));
-    job.setName((String) object.get(NAME));
-    job.setEnabled((Boolean) object.get(ENABLED));
-    job.setCreationUser((String) object.get(CREATION_USER));
-    job.setCreationDate(new Date((Long) object.get(CREATION_DATE)));
-    job.setLastUpdateUser((String) object.get(UPDATE_USER));
-    job.setLastUpdateDate(new Date((Long) object.get(UPDATE_DATE)));
+    job.setPersistenceId(JSONUtils.getLong(object, ID));
+    job.setName(JSONUtils.getString(object, NAME));
+    job.setEnabled(JSONUtils.getBoolean(object, ENABLED));
+    job.setCreationUser( JSONUtils.getString(object, CREATION_USER));
+    job.setCreationDate(new Date(JSONUtils.getLong(object, CREATION_DATE)));
+    job.setLastUpdateUser(JSONUtils.getString(object, UPDATE_USER));
+    job.setLastUpdateDate(new Date(JSONUtils.getLong(object, UPDATE_DATE)));
     return job;
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/main/java/org/apache/sqoop/json/JobsBean.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/json/JobsBean.java 
b/common/src/main/java/org/apache/sqoop/json/JobsBean.java
index c62ab49..28411a2 100644
--- a/common/src/main/java/org/apache/sqoop/json/JobsBean.java
+++ b/common/src/main/java/org/apache/sqoop/json/JobsBean.java
@@ -57,7 +57,7 @@ public class JobsBean extends JobBean {
 
   @Override
   public void restore(JSONObject jsonObject) {
-    JSONArray array = (JSONArray) jsonObject.get(JOBS);
+    JSONArray array = JSONUtils.getJSONArray(jsonObject, JOBS);
     restoreJobs(array);
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/main/java/org/apache/sqoop/json/LinkBean.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/json/LinkBean.java 
b/common/src/main/java/org/apache/sqoop/json/LinkBean.java
index 99e7319..c9a8ab3 100644
--- a/common/src/main/java/org/apache/sqoop/json/LinkBean.java
+++ b/common/src/main/java/org/apache/sqoop/json/LinkBean.java
@@ -128,7 +128,7 @@ public class LinkBean implements JsonBean {
   @Override
   public void restore(JSONObject jsonObject) {
     links = new ArrayList<MLink>();
-    JSONObject obj = (JSONObject) jsonObject.get(LINK);
+    JSONObject obj = JSONUtils.getJSONObject(jsonObject, LINK);
     links.add(restoreLink(obj));
   }
 
@@ -141,18 +141,18 @@ public class LinkBean implements JsonBean {
 
   private MLink restoreLink(Object obj) {
     JSONObject object = (JSONObject) obj;
-    long connectorId = (Long) object.get(CONNECTOR_ID);
-    JSONObject connectorLinkConfig = (JSONObject) 
object.get(LINK_CONFIG_VALUES);
-    List<MConfig> linkConfigs = restoreConfigs((JSONArray) 
connectorLinkConfig.get(ConfigInputConstants.CONFIGS));
-    List<MValidator> linkValidators = restoreValidator((JSONArray) 
connectorLinkConfig.get(ConfigInputConstants.CONFIG_VALIDATORS));
+    long connectorId = JSONUtils.getLong(object, CONNECTOR_ID);
+    JSONObject connectorLinkConfig = JSONUtils.getJSONObject(object, 
LINK_CONFIG_VALUES);
+    List<MConfig> linkConfigs = 
restoreConfigs(JSONUtils.getJSONArray(connectorLinkConfig, 
ConfigInputConstants.CONFIGS));
+    List<MValidator> linkValidators = 
restoreValidator(JSONUtils.getJSONArray(connectorLinkConfig, 
ConfigInputConstants.CONFIG_VALIDATORS));
     MLink link = new MLink(connectorId, new MLinkConfig(linkConfigs, 
linkValidators));
-    link.setPersistenceId((Long) object.get(ID));
-    link.setName((String) object.get(NAME));
-    link.setEnabled((Boolean) object.get(ENABLED));
-    link.setCreationUser((String) object.get(CREATION_USER));
-    link.setCreationDate(new Date((Long) object.get(CREATION_DATE)));
-    link.setLastUpdateUser((String) object.get(UPDATE_USER));
-    link.setLastUpdateDate(new Date((Long) object.get(UPDATE_DATE)));
+    link.setPersistenceId(JSONUtils.getLong(object, ID));
+    link.setName(JSONUtils.getString(object, NAME));
+    link.setEnabled(JSONUtils.getBoolean(object, ENABLED));
+    link.setCreationUser(JSONUtils.getString(object, CREATION_USER));
+    link.setCreationDate(new Date(JSONUtils.getLong(object, CREATION_DATE)));
+    link.setLastUpdateUser(JSONUtils.getString(object, UPDATE_USER));
+    link.setLastUpdateDate(new Date(JSONUtils.getLong(object, UPDATE_DATE)));
     return link;
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/main/java/org/apache/sqoop/json/LinksBean.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/json/LinksBean.java 
b/common/src/main/java/org/apache/sqoop/json/LinksBean.java
index 6e4a906..87e873d 100644
--- a/common/src/main/java/org/apache/sqoop/json/LinksBean.java
+++ b/common/src/main/java/org/apache/sqoop/json/LinksBean.java
@@ -55,7 +55,7 @@ public class LinksBean extends LinkBean {
 
   @Override
   public void restore(JSONObject jsonObject) {
-    JSONArray array = (JSONArray) jsonObject.get(LINKS);
+    JSONArray array = JSONUtils.getJSONArray(jsonObject, LINKS);
     super.restoreLinks(array);
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/main/java/org/apache/sqoop/json/PrincipalBean.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/json/PrincipalBean.java 
b/common/src/main/java/org/apache/sqoop/json/PrincipalBean.java
index e540b75..f89d9ee 100644
--- a/common/src/main/java/org/apache/sqoop/json/PrincipalBean.java
+++ b/common/src/main/java/org/apache/sqoop/json/PrincipalBean.java
@@ -89,7 +89,7 @@ public class PrincipalBean implements JsonBean {
   @Override
   public void restore(JSONObject json) {
     principals = new ArrayList<MPrincipal>();
-    JSONObject obj = (JSONObject) json.get(PRINCIPAL);
+    JSONObject obj = JSONUtils.getJSONObject(json, PRINCIPAL);
     principals.add(restorePrincipal(obj));
   }
 
@@ -102,6 +102,6 @@ public class PrincipalBean implements JsonBean {
 
   private MPrincipal restorePrincipal(Object obj) {
     JSONObject object = (JSONObject) obj;
-    return new MPrincipal((String) object.get(NAME), (String) 
object.get(TYPE));
+    return new MPrincipal(JSONUtils.getString(object, NAME), 
JSONUtils.getString(object, TYPE));
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/main/java/org/apache/sqoop/json/PrincipalsBean.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/json/PrincipalsBean.java 
b/common/src/main/java/org/apache/sqoop/json/PrincipalsBean.java
index a4d56dc..d52a462 100644
--- a/common/src/main/java/org/apache/sqoop/json/PrincipalsBean.java
+++ b/common/src/main/java/org/apache/sqoop/json/PrincipalsBean.java
@@ -56,7 +56,7 @@ public class PrincipalsBean extends PrincipalBean {
 
   @Override
   public void restore(JSONObject json) {
-    JSONArray principalsArray = (JSONArray) json.get(PRINCIPALS);
+    JSONArray principalsArray = JSONUtils.getJSONArray(json, PRINCIPALS);
     restorePrincipals(principalsArray);
   }
 

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/main/java/org/apache/sqoop/json/PrivilegeBean.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/json/PrivilegeBean.java 
b/common/src/main/java/org/apache/sqoop/json/PrivilegeBean.java
index 6819063..e7861c4 100644
--- a/common/src/main/java/org/apache/sqoop/json/PrivilegeBean.java
+++ b/common/src/main/java/org/apache/sqoop/json/PrivilegeBean.java
@@ -94,7 +94,7 @@ public class PrivilegeBean implements JsonBean {
   @Override
   public void restore(JSONObject json) {
     privileges = new ArrayList<MPrivilege>();
-    JSONObject obj = (JSONObject) json.get(PRIVILEGE);
+    JSONObject obj = JSONUtils.getJSONObject(json, PRIVILEGE);
     privileges.add(restorePrivilege(obj));
   }
 
@@ -107,9 +107,7 @@ public class PrivilegeBean implements JsonBean {
 
   private MPrivilege restorePrivilege(Object obj) {
     JSONObject object = (JSONObject) obj;
-    MResource resource = new MResource(
-            (String) object.get(RESOURCE_NAME), (String) 
object.get(RESOURCE_TYPE));
-    return new MPrivilege(resource, (String) object.get(ACTION),
-            Boolean.valueOf(object.get(WITH_GRANT_OPTION).toString()));
+    MResource resource = new MResource(JSONUtils.getString(object, 
RESOURCE_NAME), JSONUtils.getString(object,  RESOURCE_TYPE));
+    return new MPrivilege(resource, JSONUtils.getString(object, ACTION), 
JSONUtils.getBoolean(object, WITH_GRANT_OPTION));
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/main/java/org/apache/sqoop/json/PrivilegesBean.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/json/PrivilegesBean.java 
b/common/src/main/java/org/apache/sqoop/json/PrivilegesBean.java
index fbca54b..31b0195 100644
--- a/common/src/main/java/org/apache/sqoop/json/PrivilegesBean.java
+++ b/common/src/main/java/org/apache/sqoop/json/PrivilegesBean.java
@@ -56,7 +56,7 @@ public class PrivilegesBean extends PrivilegeBean {
 
   @Override
   public void restore(JSONObject json) {
-    JSONArray rolesArray = (JSONArray) json.get(PRIVILEGES);
+    JSONArray rolesArray = JSONUtils.getJSONArray(json, PRIVILEGES);
     restorePrivileges(rolesArray);
   }
 

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/main/java/org/apache/sqoop/json/RoleBean.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/json/RoleBean.java 
b/common/src/main/java/org/apache/sqoop/json/RoleBean.java
index e1f5783..ffafddb 100644
--- a/common/src/main/java/org/apache/sqoop/json/RoleBean.java
+++ b/common/src/main/java/org/apache/sqoop/json/RoleBean.java
@@ -87,7 +87,7 @@ public class RoleBean implements JsonBean {
   @Override
   public void restore(JSONObject json) {
     roles = new ArrayList<MRole>();
-    JSONObject obj = (JSONObject) json.get(ROLE);
+    JSONObject obj = JSONUtils.getJSONObject(json, ROLE);
     roles.add(restoreRole(obj));
   }
 
@@ -100,6 +100,6 @@ public class RoleBean implements JsonBean {
 
   private MRole restoreRole(Object obj) {
     JSONObject object = (JSONObject) obj;
-    return new MRole((String) object.get(NAME));
+    return new MRole(JSONUtils.getString(object, NAME));
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/main/java/org/apache/sqoop/json/RolesBean.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/json/RolesBean.java 
b/common/src/main/java/org/apache/sqoop/json/RolesBean.java
index da8fc1f..c09ba95 100644
--- a/common/src/main/java/org/apache/sqoop/json/RolesBean.java
+++ b/common/src/main/java/org/apache/sqoop/json/RolesBean.java
@@ -56,7 +56,7 @@ public class RolesBean extends RoleBean {
 
   @Override
   public void restore(JSONObject json) {
-    JSONArray rolesArray = (JSONArray) json.get(ROLES);
+    JSONArray rolesArray = JSONUtils.getJSONArray(json, ROLES);
     restoreRoles(rolesArray);
   }
 

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/main/java/org/apache/sqoop/json/SubmissionBean.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/json/SubmissionBean.java 
b/common/src/main/java/org/apache/sqoop/json/SubmissionBean.java
index c7d6958..e6b300d 100644
--- a/common/src/main/java/org/apache/sqoop/json/SubmissionBean.java
+++ b/common/src/main/java/org/apache/sqoop/json/SubmissionBean.java
@@ -162,7 +162,7 @@ public class SubmissionBean implements JsonBean {
   @Override
   public void restore(JSONObject json) {
     submissions = new ArrayList<MSubmission>();
-    JSONObject obj = (JSONObject) json.get(SUBMISSION);
+    JSONObject obj = JSONUtils.getJSONObject(json, SUBMISSION);
     submissions.add(restoreSubmission(obj));
   }
 
@@ -176,47 +176,47 @@ public class SubmissionBean implements JsonBean {
   private MSubmission restoreSubmission(Object obj) {
     JSONObject object = (JSONObject) obj;
     MSubmission submission = new MSubmission();
-    Long jobId = (Long) object.get(JOB_ID);
+    Long jobId = JSONUtils.getLong(object, JOB_ID);
     if (jobId == null) {
-      jobId = (Long) object.get(JOB);
+      jobId = JSONUtils.getLong(object, JOB);
     }
     submission.setJobId(jobId);
-    submission.setStatus(SubmissionStatus.valueOf((String) 
object.get(STATUS)));
-    submission.setProgress((Double) object.get(PROGRESS));
+    submission.setStatus(SubmissionStatus.valueOf(JSONUtils.getString(object, 
STATUS)));
+    submission.setProgress(JSONUtils.getDouble(object, PROGRESS));
 
     if (object.containsKey(CREATION_USER)) {
-      submission.setCreationUser((String) object.get(CREATION_USER));
+      submission.setCreationUser(JSONUtils.getString(object, CREATION_USER));
     }
     if (object.containsKey(CREATION_DATE)) {
-      submission.setCreationDate(new Date((Long) object.get(CREATION_DATE)));
+      submission.setCreationDate(JSONUtils.getDate(object, CREATION_DATE));
     }
     if (object.containsKey(LAST_UPDATE_USER)) {
-      submission.setLastUpdateUser((String) object.get(LAST_UPDATE_USER));
+      submission.setLastUpdateUser(JSONUtils.getString(object, 
LAST_UPDATE_USER));
     }
     if (object.containsKey(LAST_UPDATE_DATE)) {
-      submission.setLastUpdateDate(new Date((Long) 
object.get(LAST_UPDATE_DATE)));
+      submission.setLastUpdateDate(JSONUtils.getDate(object, 
LAST_UPDATE_DATE));
     }
     if (object.containsKey(EXTERNAL_ID)) {
-      submission.setExternalJobId((String) object.get(EXTERNAL_ID));
+      submission.setExternalJobId(JSONUtils.getString(object, EXTERNAL_ID));
     }
     if (object.containsKey(EXTERNAL_LINK)) {
-      submission.setExternalLink((String) object.get(EXTERNAL_LINK));
+      submission.setExternalLink(JSONUtils.getString(object, EXTERNAL_LINK));
     }
     if (object.containsKey(ERROR_SUMMARY)) {
-      submission.getError().setErrorSummary((String) 
object.get(ERROR_SUMMARY));
+      submission.getError().setErrorSummary(JSONUtils.getString(object, 
ERROR_SUMMARY));
     }
     if (object.containsKey(ERROR_DETAILS)) {
-      submission.getError().setErrorDetails((String) 
object.get(ERROR_DETAILS));
+      submission.getError().setErrorDetails(JSONUtils.getString(object, 
ERROR_DETAILS));
     }
     if (object.containsKey(COUNTERS)) {
-      submission.setCounters(restoreCounters((JSONObject) 
object.get(COUNTERS)));
+      submission.setCounters(restoreCounters(JSONUtils.getJSONObject(object, 
COUNTERS)));
     }
 
     if (object.containsKey(FROM_SCHEMA)) {
-      submission.setFromSchema(restoreSchema((JSONObject) 
object.get(FROM_SCHEMA)));
+      submission.setFromSchema(restoreSchema(JSONUtils.getJSONObject(object, 
FROM_SCHEMA)));
     }
     if (object.containsKey(TO_SCHEMA)) {
-      submission.setToSchema(restoreSchema((JSONObject) 
object.get(TO_SCHEMA)));
+      submission.setToSchema(restoreSchema(JSONUtils.getJSONObject(object, 
TO_SCHEMA)));
     }
     return submission;
   }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/main/java/org/apache/sqoop/json/SubmissionsBean.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/json/SubmissionsBean.java 
b/common/src/main/java/org/apache/sqoop/json/SubmissionsBean.java
index 019abf1..52e8efa 100644
--- a/common/src/main/java/org/apache/sqoop/json/SubmissionsBean.java
+++ b/common/src/main/java/org/apache/sqoop/json/SubmissionsBean.java
@@ -56,7 +56,7 @@ public class SubmissionsBean extends SubmissionBean {
 
   @Override
   public void restore(JSONObject json) {
-    JSONArray submissionsArray = (JSONArray) json.get(SUBMISSIONS);
+    JSONArray submissionsArray = JSONUtils.getJSONArray(json, SUBMISSIONS);
     restoreSubmissions(submissionsArray);
   }
 

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/main/java/org/apache/sqoop/json/ValidationResultBean.java
----------------------------------------------------------------------
diff --git 
a/common/src/main/java/org/apache/sqoop/json/ValidationResultBean.java 
b/common/src/main/java/org/apache/sqoop/json/ValidationResultBean.java
index 7dfd9fc..b328a25 100644
--- a/common/src/main/java/org/apache/sqoop/json/ValidationResultBean.java
+++ b/common/src/main/java/org/apache/sqoop/json/ValidationResultBean.java
@@ -118,14 +118,14 @@ public class ValidationResultBean implements JsonBean {
 
   @Override
   public void restore(JSONObject jsonObject) {
-    JSONArray array = (JSONArray) jsonObject.get(VALIDATION_RESULT);
+    JSONArray array = JSONUtils.getJSONArray(jsonObject, VALIDATION_RESULT);
     results = new ConfigValidationResult[array.size()];
     int i = 0;
     for(Object item : array) {
       results[i++] = restoreValidationResult((JSONObject) item);
     }
     if(jsonObject.containsKey(ID)) {
-      id = (Long) jsonObject.get(ID);
+      id = JSONUtils.getLong(jsonObject, ID);
     }
   }
 
@@ -150,9 +150,6 @@ public class ValidationResultBean implements JsonBean {
   }
 
   private Message restoreMessage(JSONObject item) {
-    return new Message(
-      Status.valueOf((String) item.get(STATUS)),
-      (String) item.get(MESSAGE)
-    );
+    return new Message(Status.valueOf(JSONUtils.getString(item, STATUS)), 
JSONUtils.getString(item, MESSAGE));
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/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 bd4f5c4..4ce977c 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
@@ -21,6 +21,7 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.sqoop.classification.InterfaceAudience;
 import org.apache.sqoop.classification.InterfaceStability;
 import org.apache.sqoop.common.SqoopException;
+import org.apache.sqoop.json.JSONUtils;
 import org.apache.sqoop.model.InputEditable;
 import org.apache.sqoop.model.MBooleanInput;
 import org.apache.sqoop.model.MConfigList;
@@ -163,8 +164,8 @@ public final class ConfigInputSerialization {
     List<MValidator> mValidators = new ArrayList<>();
     for (int validatorCounter = 0; validatorCounter < jsonValidators.size(); 
validatorCounter++) {
       JSONObject jsonValidator = (JSONObject) 
jsonValidators.get(validatorCounter);
-      String validatorClassName = (String) 
jsonValidator.get(ConfigValidatorConstants.VALIDATOR_CLASS);
-      String validatorStrArg = (String) 
jsonValidator.get(ConfigValidatorConstants.VALIDATOR_STR_ARG);
+      String validatorClassName = JSONUtils.getString(jsonValidator, 
ConfigValidatorConstants.VALIDATOR_CLASS);
+      String validatorStrArg = JSONUtils.getString(jsonValidator, 
ConfigValidatorConstants.VALIDATOR_STR_ARG);
       mValidators.add(new MValidator(validatorClassName, validatorStrArg));
     }
     return mValidators;
@@ -194,28 +195,23 @@ public final class ConfigInputSerialization {
    */
   @SuppressWarnings({ "rawtypes", "unchecked" })
   static MConfig restoreConfig(JSONObject config) {
-    JSONArray inputs = (JSONArray) 
config.get(ConfigInputConstants.CONFIG_INPUTS);
+    JSONArray inputs = JSONUtils.getJSONArray(config, 
ConfigInputConstants.CONFIG_INPUTS);
 
     List<MInput<?>> mInputs = new ArrayList<MInput<?>>();
     for (int i = 0; i < inputs.size(); i++) {
       JSONObject input = (JSONObject) inputs.get(i);
-      MInputType type =
-          MInputType.valueOf((String) 
input.get(ConfigInputConstants.CONFIG_INPUT_TYPE));
-      String name = (String) input.get(ConfigInputConstants.CONFIG_INPUT_NAME);
-      Boolean sensitive = (Boolean) 
input.get(ConfigInputConstants.CONFIG_INPUT_SENSITIVE);
-      InputEditable editable =  
(input.containsKey(ConfigInputConstants.CONFIG_INPUT_EDITABLE)) ?
-          
InputEditable.valueOf((String)input.get(ConfigInputConstants.CONFIG_INPUT_EDITABLE))
-              : InputEditable.USER_ONLY;
-      String overrides = (String) 
input.get(ConfigInputConstants.CONFIG_INPUT_OVERRIDES);
-      String sensitveKeyPattern = (String) 
input.get(ConfigInputConstants.CONFIG_INPUT_SENSITIVE_KEY_PATTERN);
-
-      List<MValidator> mValidatorsForInput = restoreValidator((JSONArray)
-        input.get(ConfigInputConstants.CONFIG_VALIDATORS));
+      MInputType type =  MInputType.valueOf(JSONUtils.getString(input, 
ConfigInputConstants.CONFIG_INPUT_TYPE));
+      String name = JSONUtils.getString(input, 
ConfigInputConstants.CONFIG_INPUT_NAME);
+      Boolean sensitive = JSONUtils.getBoolean(input, 
ConfigInputConstants.CONFIG_INPUT_SENSITIVE);
+      InputEditable editable =  
(input.containsKey(ConfigInputConstants.CONFIG_INPUT_EDITABLE)) ? 
InputEditable.valueOf(JSONUtils.getString(input, 
ConfigInputConstants.CONFIG_INPUT_EDITABLE)) : InputEditable.USER_ONLY;
+      String overrides = JSONUtils.getString(input, 
ConfigInputConstants.CONFIG_INPUT_OVERRIDES);
+      String sensitveKeyPattern = 
input.containsKey(ConfigInputConstants.CONFIG_INPUT_SENSITIVE_KEY_PATTERN) ? 
JSONUtils.getString(input, 
ConfigInputConstants.CONFIG_INPUT_SENSITIVE_KEY_PATTERN) : null;
+      List<MValidator> mValidatorsForInput = 
restoreValidator(JSONUtils.getJSONArray(input, 
ConfigInputConstants.CONFIG_VALIDATORS));
 
       MInput mInput = null;
       switch (type) {
       case STRING: {
-        long size = (Long) input.get(ConfigInputConstants.CONFIG_INPUT_SIZE);
+        long size = JSONUtils.getLong(input, 
ConfigInputConstants.CONFIG_INPUT_SIZE);
         mInput = new MStringInput(name, sensitive.booleanValue(), editable, 
overrides, (short) size, mValidatorsForInput);
         break;
       }
@@ -236,7 +232,7 @@ public final class ConfigInputSerialization {
         break;
       }
       case ENUM: {
-        String values = (String) 
input.get(ConfigInputConstants.CONFIG_INPUT_ENUM_VALUES);
+        String values = JSONUtils.getString(input, 
ConfigInputConstants.CONFIG_INPUT_ENUM_VALUES);
         mInput = new MEnumInput(name, sensitive.booleanValue(), editable, 
overrides, values.split(","), mValidatorsForInput);
         break;
       }
@@ -254,7 +250,7 @@ public final class ConfigInputSerialization {
       }
 
       // Propagate config ID
-      Long id = (Long)input.get(ConfigInputConstants.INPUT_ID);
+      Long id = JSONUtils.getLong(input, ConfigInputConstants.INPUT_ID);
       if(id == null) {
         throw new SqoopException(SerializationError.SERIALIZATION_002, 
"Missing field: " + ConfigInputConstants.INPUT_ID);
       }
@@ -271,24 +267,20 @@ public final class ConfigInputSerialization {
           }
           break;
         default:
-          mInput.restoreFromUrlSafeValueString(
-              (String) input.get(ConfigInputConstants.CONFIG_INPUT_VALUE));
+          mInput.restoreFromUrlSafeValueString(JSONUtils.getString(input, 
ConfigInputConstants.CONFIG_INPUT_VALUE));
           break;
         }
       }
       mInputs.add(mInput);
     }
 
+    List<MValidator> mValidatorsForConfig = 
restoreValidator(JSONUtils.getJSONArray(config, 
ConfigInputConstants.CONFIG_VALIDATORS));
+    MConfig mConfig = new MConfig(JSONUtils.getString(config, 
ConfigInputConstants.CONFIG_NAME), mInputs, mValidatorsForConfig);
+    mConfig.setPersistenceId(JSONUtils.getLong(config, 
ConfigInputConstants.CONFIG_ID));
+    return mConfig;
+  }
 
-
-    List<MValidator> mValidatorsForConfig = restoreValidator((JSONArray)
-      config.get(ConfigInputConstants.CONFIG_VALIDATORS));
-    MConfig mConfig = new MConfig((String) 
config.get(ConfigInputConstants.CONFIG_NAME), mInputs, mValidatorsForConfig);
-    mConfig.setPersistenceId((Long) 
config.get(ConfigInputConstants.CONFIG_ID));
-      return mConfig;
-    }
-
-    private ConfigInputSerialization() {
+  private ConfigInputSerialization() {
     // Do not instantiate
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/main/java/org/apache/sqoop/json/util/SchemaSerialization.java
----------------------------------------------------------------------
diff --git 
a/common/src/main/java/org/apache/sqoop/json/util/SchemaSerialization.java 
b/common/src/main/java/org/apache/sqoop/json/util/SchemaSerialization.java
index 1fa5743..3a3f9e8 100644
--- a/common/src/main/java/org/apache/sqoop/json/util/SchemaSerialization.java
+++ b/common/src/main/java/org/apache/sqoop/json/util/SchemaSerialization.java
@@ -22,6 +22,7 @@ import java.util.HashSet;
 import org.apache.sqoop.classification.InterfaceAudience;
 import org.apache.sqoop.classification.InterfaceStability;
 import org.apache.sqoop.common.SqoopException;
+import org.apache.sqoop.json.JSONUtils;
 import org.apache.sqoop.schema.NullSchema;
 import org.apache.sqoop.schema.Schema;
 import org.apache.sqoop.schema.type.AbstractComplexListType;
@@ -189,9 +190,9 @@ public class SchemaSerialization {
   }
 
   private static Column restoreColumn(JSONObject obj) {
-    String name = (String) obj.get(NAME);
+    String name = JSONUtils.getString(obj, NAME);
 
-    Boolean nullable = (Boolean) obj.get(NULLABLE);
+    Boolean nullable = JSONUtils.getBoolean(obj, NULLABLE);
     AbstractPrimitiveType key = null;
     Column value = null;
     Long arraySize = null;
@@ -200,29 +201,31 @@ public class SchemaSerialization {
 
     // complex type attribute
     if (obj.containsKey(MAP)) {
-      JSONObject map = (JSONObject) obj.get(MAP);
+      JSONObject map = JSONUtils.getJSONObject(obj, MAP);
 
       if (map.containsKey(KEY)) {
-        key = (AbstractPrimitiveType) restoreColumn((JSONObject) map.get(KEY));
+        key = (AbstractPrimitiveType) 
restoreColumn(JSONUtils.getJSONObject(map, KEY));
       }
       if (map.containsKey(VALUE)) {
-        value = restoreColumn((JSONObject) map.get(VALUE));
+        value = restoreColumn(JSONUtils.getJSONObject(map, VALUE));
       }
     }
     if (obj.containsKey(LIST)) {
-      JSONObject list = (JSONObject) obj.get(LIST);
+      JSONObject list = JSONUtils.getJSONObject(obj, LIST);
       if (list.containsKey(LIST_TYPE)) {
-        listType = restoreColumn((JSONObject) list.get(LIST_TYPE));
+        listType = restoreColumn(JSONUtils.getJSONObject(list, LIST_TYPE));
+      }
+      if(list.containsKey(SIZE)) {
+        arraySize = JSONUtils.getLong(list, SIZE);
       }
-      arraySize = (Long) list.get(SIZE);
       if (list.containsKey(ENUM_OPTIONS)) {
-        JSONArray optionsArray = (JSONArray) list.get(ENUM_OPTIONS);
+        JSONArray optionsArray = JSONUtils.getJSONArray(list, ENUM_OPTIONS);
         for (int n = 0; n < optionsArray.size(); n++) {
           options.add((String) optionsArray.get(n));
         }
       }
     }
-    ColumnType type = ColumnType.valueOf((String) obj.get(TYPE));
+    ColumnType type = ColumnType.valueOf(JSONUtils.getString(obj, TYPE));
     Column output = null;
     switch (type) {
     case ARRAY:
@@ -239,25 +242,25 @@ public class SchemaSerialization {
       output = new Date(name);
       break;
     case DATE_TIME:
-      Boolean hasFraction = (Boolean) obj.get(FRACTION);
-      Boolean hasTimezone = (Boolean) obj.get(TIMEZONE);
+      Boolean hasFraction = JSONUtils.getBoolean(obj, FRACTION);
+      Boolean hasTimezone = JSONUtils.getBoolean(obj, TIMEZONE);
       output = new DateTime(name, hasFraction, hasTimezone);
       break;
     case DECIMAL:
-      Integer precision = obj.get(PRECISION) != null ? ((Long) 
obj.get(PRECISION)).intValue() : null;
-      Integer scale = obj.get(SCALE) != null ? ((Long) 
obj.get(SCALE)).intValue() : null;
+      Integer precision = obj.get(PRECISION) != null ? (JSONUtils.getLong(obj, 
PRECISION)).intValue() : null;
+      Integer scale = obj.get(SCALE) != null ? (JSONUtils.getLong(obj, 
SCALE)).intValue() : null;
       output = new Decimal(name, precision, scale);
       break;
     case ENUM:
       output = new Enum(name, options);
       break;
     case FIXED_POINT:
-      Boolean signed = (Boolean) obj.get(SIGNED);
-      Long fixedPointByteSize = (Long) obj.get(BYTE_SIZE);
+      Boolean signed = JSONUtils.getBoolean(obj, SIGNED);
+      Long fixedPointByteSize = JSONUtils.getLong(obj, BYTE_SIZE);
       output = new FixedPoint(name, fixedPointByteSize, signed);
       break;
     case FLOATING_POINT:
-      Long floatingPointByteSize = (Long) obj.get(BYTE_SIZE);
+      Long floatingPointByteSize = JSONUtils.getLong(obj, BYTE_SIZE);
       output = new FloatingPoint(name, floatingPointByteSize);
       break;
     case MAP:
@@ -267,15 +270,15 @@ public class SchemaSerialization {
       output = new Set(name, listType);
       break;
     case TEXT:
-      charSize = (Long) obj.get(CHAR_SIZE);
+      charSize = JSONUtils.getLong(obj, CHAR_SIZE);
       output = new Text(name).setCharSize(charSize);
       break;
     case TIME:
-      Boolean hasTimeFraction = (Boolean) obj.get(FRACTION);
+      Boolean hasTimeFraction = JSONUtils.getBoolean(obj, FRACTION);
       output = new Time(name, hasTimeFraction);
       break;
     case UNKNOWN:
-      Long jdbcType = (Long) obj.get(JDBC_TYPE);
+      Long jdbcType = JSONUtils.getLong(obj, JDBC_TYPE);
       output = new Unknown(name).setJdbcType(jdbcType);
       break;
     default:

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/main/java/org/apache/sqoop/json/util/SerializationError.java
----------------------------------------------------------------------
diff --git 
a/common/src/main/java/org/apache/sqoop/json/util/SerializationError.java 
b/common/src/main/java/org/apache/sqoop/json/util/SerializationError.java
index d5cdb31..8479db1 100644
--- a/common/src/main/java/org/apache/sqoop/json/util/SerializationError.java
+++ b/common/src/main/java/org/apache/sqoop/json/util/SerializationError.java
@@ -29,6 +29,10 @@ public enum SerializationError implements ErrorCode {
 
   SERIALIZATION_002("Invalid JSON"),
 
+  SERIALIZATION_003("Required key field is missing"),
+
+  SERIALIZATION_004("Invalid type for key"),
+
   ;
 
   private final String message;

http://git-wip-us.apache.org/repos/asf/sqoop/blob/25b0df5c/common/src/test/java/org/apache/sqoop/json/TestJSONUtils.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/json/TestJSONUtils.java 
b/common/src/test/java/org/apache/sqoop/json/TestJSONUtils.java
index 67ab412..6b434ff 100644
--- a/common/src/test/java/org/apache/sqoop/json/TestJSONUtils.java
+++ b/common/src/test/java/org/apache/sqoop/json/TestJSONUtils.java
@@ -18,11 +18,13 @@
 package org.apache.sqoop.json;
 
 import org.apache.sqoop.common.SqoopException;
+import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 import org.testng.annotations.Test;
 
 import java.io.Reader;
 import java.io.StringReader;
+import java.sql.Date;
 
 import static org.testng.Assert.assertEquals;
 
@@ -61,4 +63,76 @@ public class TestJSONUtils {
   public void testReaderNull() {
     JSONUtils.parse((Reader)null);
   }
+
+  @Test
+  public void testGetType() {
+    JSONObject object = JSONUtils.parse("{\"id\":3}");
+    assertEquals(new Long(3), JSONUtils.getType(object, "id", Long.class));
+  }
+
+  @Test
+  public void testGetTypeNull() {
+    JSONObject object = JSONUtils.parse("{\"id\": null}");
+    assertEquals(null, JSONUtils.getType(object, "id", String.class));
+  }
+
+  @Test(expectedExceptions = SqoopException.class)
+  public void testGetTypeNonExistingKey() {
+    JSONObject object = JSONUtils.parse("{\"id\":3}");
+    JSONUtils.getType(object, "non-existing", Long.class);
+  }
+
+  @Test(expectedExceptions = SqoopException.class)
+  public void testGetTypeIncorrectType() {
+    JSONObject object = JSONUtils.parse("{\"id\":3}");
+    JSONUtils.getType(object, "id", String.class);
+  }
+
+  @Test
+  public void testGetLong() {
+    JSONObject object = JSONUtils.parse("{\"id\":3}");
+    assertEquals(new Long(3), JSONUtils.getLong(object, "id"));
+  }
+
+  @Test
+  public void testGetJSONObject() {
+    JSONObject object = JSONUtils.parse("{\"id\": {}}");
+    assertEquals(new JSONObject(), JSONUtils.getJSONObject(object, "id"));
+  }
+
+  @Test
+  public void testGetJSONArray() {
+    JSONObject object = JSONUtils.parse("{\"id\": []}");
+    assertEquals(new JSONArray(), JSONUtils.getJSONArray(object, "id"));
+  }
+
+  @Test
+  public void testGetString() {
+    JSONObject object = JSONUtils.parse("{\"id\": \"sqoop-is-awesome\"}");
+    assertEquals("sqoop-is-awesome", JSONUtils.getString(object, "id"));
+  }
+
+  @Test
+  public void testGetBoolean() {
+    JSONObject object = JSONUtils.parse("{\"id\": true}");
+    assertEquals(Boolean.TRUE, JSONUtils.getBoolean(object, "id"));
+  }
+
+  @Test
+  public void testGetDouble() {
+    JSONObject object = JSONUtils.parse("{\"id\": 0.1}");
+    assertEquals(0.1, JSONUtils.getDouble(object, "id"));
+  }
+
+  @Test
+  public void testGetDate() {
+    JSONObject object = JSONUtils.parse("{\"id\": 1447628346000}");
+    assertEquals(new Date(1447628346000L), JSONUtils.getDate(object, "id"));
+  }
+
+  @Test
+  public void testGetDateNull() {
+    JSONObject object = JSONUtils.parse("{\"id\": null}");
+    assertEquals(null, JSONUtils.getDate(object, "id"));
+  }
 }

Reply via email to