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/10/10 04:52:14 UTC

[45/52] [abbrv] SQOOP-1498: Sqoop2: Repository Object refactoring (objects prefixed with M)

http://git-wip-us.apache.org/repos/asf/sqoop/blob/8362c73c/common/src/test/java/org/apache/sqoop/json/ConfigTestUtil.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/json/ConfigTestUtil.java b/common/src/test/java/org/apache/sqoop/json/ConfigTestUtil.java
new file mode 100644
index 0000000..4372171
--- /dev/null
+++ b/common/src/test/java/org/apache/sqoop/json/ConfigTestUtil.java
@@ -0,0 +1,217 @@
+/**
+ * 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.json;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.ResourceBundle;
+
+import org.apache.sqoop.model.MConfig;
+import org.apache.sqoop.model.MConnector;
+import org.apache.sqoop.model.MDriver;
+import org.apache.sqoop.model.MDriverConfig;
+import org.apache.sqoop.model.MFromConfig;
+import org.apache.sqoop.model.MInput;
+import org.apache.sqoop.model.MIntegerInput;
+import org.apache.sqoop.model.MJob;
+import org.apache.sqoop.model.MLink;
+import org.apache.sqoop.model.MLinkConfig;
+import org.apache.sqoop.model.MStringInput;
+import org.apache.sqoop.model.MToConfig;
+import org.apache.sqoop.utils.MapResourceBundle;
+
+/**
+ *
+ */
+public class ConfigTestUtil {
+  public static MConnector getConnector(String name) {
+    return getConnector(name, true, true);
+  }
+
+  public static MConnector getConnector(String name, boolean from, boolean to) {
+    MFromConfig fromConfig = null;
+    MToConfig toConfig = null;
+    if (from) {
+      fromConfig = getFromConfig();
+    }
+    if (to) {
+      toConfig = getToConfig();
+    }
+    return new MConnector(name, name + ".class", "1.0-test",
+      getLinkConfig(), fromConfig, toConfig);
+  }
+
+
+  public static MLink getLink(String name) {
+    return new MLink(1, getConnector(name).getLinkConfig());
+  }
+
+  public static MJob getJob(String name) {
+    return new MJob(1, 2, 1, 2, getConnector(name).getFromConfig(), getConnector(name)
+        .getToConfig(), getDriverConfig());
+  }
+
+  public static MDriverConfig getDriverConfig() {
+    List<MInput<?>> inputs;
+    MIntegerInput input;
+    MConfig config;
+    List<MConfig> driverConfigs = new ArrayList<MConfig>();
+    inputs = new ArrayList<MInput<?>>();
+
+    input = new MIntegerInput("numExtractors", false);
+    input.setPersistenceId(1);
+    inputs.add(input);
+
+    input = new MIntegerInput("numLoaders", false);
+    input.setPersistenceId(2);
+    inputs.add(input);
+
+    config = new MConfig("driver", inputs);
+    config.setPersistenceId(10);
+    driverConfigs.add(config);
+    return new MDriverConfig(driverConfigs);
+  }
+
+  public static MLinkConfig getLinkConfig() {
+    List<MInput<?>> inputs;
+    MStringInput input;
+    MConfig config;
+    List<MConfig> linkConfig = new ArrayList<MConfig>();
+    inputs = new ArrayList<MInput<?>>();
+
+    input = new MStringInput("url", false, (short) 10);
+    input.setPersistenceId(1);
+    inputs.add(input);
+
+    input = new MStringInput("username", false, (short) 10);
+    input.setPersistenceId(2);
+    input.setValue("test");
+    inputs.add(input);
+
+    input = new MStringInput("password", true, (short) 10);
+    input.setPersistenceId(3);
+    input.setValue("test");
+    inputs.add(input);
+
+    config = new MConfig("connection", inputs);
+    config.setPersistenceId(10);
+    linkConfig.add(config);
+
+    return new MLinkConfig(linkConfig);
+  }
+
+  static MFromConfig getFromConfig() {
+    List<MInput<?>> inputs;
+    MStringInput input;
+    MConfig config;
+    List<MConfig> jobConfigs = new ArrayList<MConfig>();
+
+    inputs = new ArrayList<MInput<?>>();
+
+    input = new MStringInput("A", false, (short) 10);
+    input.setPersistenceId(4);
+    inputs.add(input);
+
+    input = new MStringInput("B", false, (short) 10);
+    input.setPersistenceId(5);
+    inputs.add(input);
+
+    input = new MStringInput("C", false, (short) 10);
+    input.setPersistenceId(6);
+    inputs.add(input);
+
+    config = new MConfig("Z", inputs);
+    config.setPersistenceId(11);
+    jobConfigs.add(config);
+
+    inputs = new ArrayList<MInput<?>>();
+
+    input = new MStringInput("D", false, (short) 10);
+    input.setPersistenceId(7);
+    inputs.add(input);
+
+    input = new MStringInput("E", false, (short) 10);
+    input.setPersistenceId(8);
+    inputs.add(input);
+
+    input = new MStringInput("F", false, (short) 10);
+    input.setPersistenceId(9);
+    inputs.add(input);
+
+    config = new MConfig("from-table", inputs);
+    config.setPersistenceId(12);
+    jobConfigs.add(config);
+
+    return new MFromConfig(jobConfigs);
+  }
+
+  static MToConfig getToConfig() {
+    List<MInput<?>> inputs;
+    MStringInput input;
+    MConfig config;
+    List<MConfig> jobConfigs = new ArrayList<MConfig>();
+
+    inputs = new ArrayList<MInput<?>>();
+
+    input = new MStringInput("A", false, (short) 10);
+    input.setPersistenceId(4);
+    inputs.add(input);
+
+    input = new MStringInput("B", false, (short) 10);
+    input.setPersistenceId(5);
+    inputs.add(input);
+
+    input = new MStringInput("C", false, (short) 10);
+    input.setPersistenceId(6);
+    inputs.add(input);
+
+    config = new MConfig("Z", inputs);
+    config.setPersistenceId(11);
+    jobConfigs.add(config);
+
+    inputs = new ArrayList<MInput<?>>();
+
+    input = new MStringInput("D", false, (short) 10);
+    input.setPersistenceId(7);
+    inputs.add(input);
+
+    input = new MStringInput("E", false, (short) 10);
+    input.setPersistenceId(8);
+    inputs.add(input);
+
+    input = new MStringInput("F", false, (short) 10);
+    input.setPersistenceId(9);
+    inputs.add(input);
+
+    config = new MConfig("to-table", inputs);
+    config.setPersistenceId(12);
+    jobConfigs.add(config);
+
+    return new MToConfig(jobConfigs);
+  }
+
+  public static ResourceBundle getResourceBundle() {
+    Map<String, Object> map = new HashMap<String, Object>();
+    map.put("a", "a");
+    map.put("b", "b");
+
+    return new MapResourceBundle(map);
+  }
+}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/8362c73c/common/src/test/java/org/apache/sqoop/json/TestConnectorBean.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/json/TestConnectorBean.java b/common/src/test/java/org/apache/sqoop/json/TestConnectorBean.java
index fe75ee0..9fd2fe3 100644
--- a/common/src/test/java/org/apache/sqoop/json/TestConnectorBean.java
+++ b/common/src/test/java/org/apache/sqoop/json/TestConnectorBean.java
@@ -17,10 +17,9 @@
  */
 package org.apache.sqoop.json;
 
-import org.apache.sqoop.model.MConnector;
-import org.json.simple.JSONObject;
-import org.json.simple.JSONValue;
-import org.junit.Test;
+import static org.apache.sqoop.json.ConfigTestUtil.getConnector;
+import static org.apache.sqoop.json.ConfigTestUtil.getResourceBundle;
+import static org.junit.Assert.*;
 
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -28,8 +27,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.ResourceBundle;
 
-import static org.apache.sqoop.json.TestUtil.*;
-import static org.junit.Assert.*;
+import org.apache.sqoop.model.MConnector;
+import org.json.simple.JSONObject;
+import org.json.simple.JSONValue;
+import org.junit.Test;
 
 /**
  *
@@ -48,26 +49,26 @@ public class TestConnectorBean {
     connectors.add(getConnector("mysql"));
 
     // Create testing bundles
-    Map<Long, ResourceBundle> bundles = new HashMap<Long, ResourceBundle>();
-    bundles.put(1L, getResourceBundle());
-    bundles.put(2L, getResourceBundle());
+    Map<Long, ResourceBundle> configBundles = new HashMap<Long, ResourceBundle>();
+    configBundles.put(1L, getResourceBundle());
+    configBundles.put(2L, getResourceBundle());
 
     // Serialize it to JSON object
-    ConnectorBean bean = new ConnectorBean(connectors, bundles);
-    JSONObject json = bean.extract(false);
+    ConnectorBean connectorBean = new ConnectorBean(connectors, configBundles);
+    JSONObject connectorJSON = connectorBean.extract(false);
 
     // "Move" it across network in text form
-    String string = json.toJSONString();
+    String connectorJSONString = connectorJSON.toJSONString();
 
     // Retrieved transferred object
-    JSONObject retrievedJson = (JSONObject) JSONValue.parse(string);
-    ConnectorBean retrievedBean = new ConnectorBean();
-    retrievedBean.restore(retrievedJson);
+    JSONObject parsedConnector = (JSONObject) JSONValue.parse(connectorJSONString);
+    ConnectorBean parsedConnectorBean = new ConnectorBean();
+    parsedConnectorBean.restore(parsedConnector);
 
-    assertEquals(connectors.size(), retrievedBean.getConnectors().size());
-    assertEquals(connectors.get(0), retrievedBean.getConnectors().get(0));
+    assertEquals(connectors.size(), parsedConnectorBean.getConnectors().size());
+    assertEquals(connectors.get(0), parsedConnectorBean.getConnectors().get(0));
 
-    ResourceBundle retrievedBundle = retrievedBean.getResourceBundles().get(1L);
+    ResourceBundle retrievedBundle = parsedConnectorBean.getResourceBundles().get(1L);
     assertNotNull(retrievedBundle);
     assertEquals("a", retrievedBundle.getString("a"));
     assertEquals("b", retrievedBundle.getString("b"));

http://git-wip-us.apache.org/repos/asf/sqoop/blob/8362c73c/common/src/test/java/org/apache/sqoop/json/TestDriverBean.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/json/TestDriverBean.java b/common/src/test/java/org/apache/sqoop/json/TestDriverBean.java
new file mode 100644
index 0000000..8c92aef
--- /dev/null
+++ b/common/src/test/java/org/apache/sqoop/json/TestDriverBean.java
@@ -0,0 +1,62 @@
+/**
+ * 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.json;
+
+import static org.apache.sqoop.json.ConfigTestUtil.getResourceBundle;
+import static org.junit.Assert.assertEquals;
+
+import java.util.ResourceBundle;
+
+import org.apache.sqoop.model.MDriver;
+import org.json.simple.JSONObject;
+import org.json.simple.JSONValue;
+import org.junit.Test;
+
+/**
+ *
+ */
+public class TestDriverBean {
+
+  /**
+   * Test that by JSON serialization followed by deserialization we will get
+   * equal drive config object.
+   */
+  @Test
+  public void testSerialization() {
+    MDriver driver = new MDriver(ConfigTestUtil.getDriverConfig(), DriverBean.CURRENT_DRIVER_VERSION);
+
+    // Serialize it to JSON object
+    DriverBean bean = new DriverBean(driver, getResourceBundle());
+    JSONObject json = bean.extract(false);
+
+    // "Move" it across network in text form
+    String string = json.toJSONString();
+
+    // Retrieved transferred object
+    JSONObject retrievedJson = (JSONObject) JSONValue.parse(string);
+    DriverBean retrievedBean = new DriverBean();
+    retrievedBean.restore(retrievedJson);
+
+    assertEquals(driver, retrievedBean.getDriver());
+
+    ResourceBundle retrievedBundle = retrievedBean.getDriverConfigResourceBundle();
+    assertEquals("a", retrievedBundle.getString("a"));
+    assertEquals("b", retrievedBundle.getString("b"));
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/8362c73c/common/src/test/java/org/apache/sqoop/json/TestDriverConfigBean.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/json/TestDriverConfigBean.java b/common/src/test/java/org/apache/sqoop/json/TestDriverConfigBean.java
deleted file mode 100644
index fcce7b5..0000000
--- a/common/src/test/java/org/apache/sqoop/json/TestDriverConfigBean.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * 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.json;
-
-import org.apache.sqoop.model.MDriverConfig;
-import org.json.simple.JSONObject;
-import org.json.simple.JSONValue;
-import org.junit.Test;
-
-import java.util.ResourceBundle;
-
-import static org.apache.sqoop.json.TestUtil.*;
-import static org.junit.Assert.*;
-
-/**
- *
- */
-public class TestDriverConfigBean {
-
-  /**
-   * Test that by JSON serialization followed by deserialization we will get
-   * equal framework object.
-   */
-  @Test
-  public void testSerialization() {
-    MDriverConfig driverConfig = getDriverConfig();
-
-    // Serialize it to JSON object
-    DriverConfigBean bean = new DriverConfigBean(driverConfig, getResourceBundle());
-    JSONObject json = bean.extract(false);
-
-    // "Move" it across network in text form
-    String string = json.toJSONString();
-
-    // Retrieved transferred object
-    JSONObject retrievedJson = (JSONObject) JSONValue.parse(string);
-    DriverConfigBean retrievedBean = new DriverConfigBean();
-    retrievedBean.restore(retrievedJson);
-
-    assertEquals(driverConfig, retrievedBean.getDriverConfig());
-
-    ResourceBundle retrievedBundle = retrievedBean.getResourceBundle();
-    assertEquals("a", retrievedBundle.getString("a"));
-    assertEquals("b", retrievedBundle.getString("b"));
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/8362c73c/common/src/test/java/org/apache/sqoop/json/TestJobBean.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/json/TestJobBean.java b/common/src/test/java/org/apache/sqoop/json/TestJobBean.java
index 78a3420..1fc8dbd 100644
--- a/common/src/test/java/org/apache/sqoop/json/TestJobBean.java
+++ b/common/src/test/java/org/apache/sqoop/json/TestJobBean.java
@@ -17,6 +17,11 @@
  */
 package org.apache.sqoop.json;
 
+import static org.apache.sqoop.json.ConfigTestUtil.getJob;
+import static org.junit.Assert.assertEquals;
+
+import java.util.Date;
+
 import org.apache.sqoop.common.Direction;
 import org.apache.sqoop.model.MJob;
 import org.apache.sqoop.model.MStringInput;
@@ -25,11 +30,6 @@ import org.json.simple.JSONValue;
 import org.json.simple.parser.ParseException;
 import org.junit.Test;
 
-import java.util.Date;
-
-import static org.apache.sqoop.json.TestUtil.getJob;
-import static org.junit.Assert.assertEquals;
-
 /**
  *
  */
@@ -46,25 +46,25 @@ public class TestJobBean {
     job.setEnabled(false);
 
     // Fill some data at the beginning
-    MStringInput input = (MStringInput) job.getConnectorPart(Direction.FROM)
-        .getForms().get(0).getInputs().get(0);
+    MStringInput input = (MStringInput) job.getJobConfig(Direction.FROM)
+        .getConfigs().get(0).getInputs().get(0);
     input.setValue("Hi there!");
-    input = (MStringInput) job.getConnectorPart(Direction.TO)
-        .getForms().get(0).getInputs().get(0);
+    input = (MStringInput) job.getJobConfig(Direction.TO)
+        .getConfigs().get(0).getInputs().get(0);
     input.setValue("Hi there again!");
 
     // Serialize it to JSON object
-    JobBean bean = new JobBean(job);
-    JSONObject json = bean.extract(false);
+    JobBean jobBean = new JobBean(job);
+    JSONObject jobJson = jobBean.extract(false);
 
     // "Move" it across network in text form
-    String string = json.toJSONString();
+    String jobJsonString = jobJson.toJSONString();
 
     // Retrieved transferred object
-    JSONObject retrievedJson = (JSONObject)JSONValue.parseWithException(string);
-    JobBean retrievedBean = new JobBean();
-    retrievedBean.restore(retrievedJson);
-    MJob target = retrievedBean.getJobs().get(0);
+    JSONObject parsedJobJson = (JSONObject)JSONValue.parseWithException(jobJsonString);
+    JobBean parsedJobBean = new JobBean();
+    parsedJobBean.restore(parsedJobJson);
+    MJob target = parsedJobBean.getJobs().get(0);
 
     // Check id and name
     assertEquals(666, target.getPersistenceId());
@@ -78,11 +78,11 @@ public class TestJobBean {
     assertEquals(false, target.getEnabled());
 
     // Test that value was correctly moved
-    MStringInput targetInput = (MStringInput) target.getConnectorPart(Direction.FROM)
-      .getForms().get(0).getInputs().get(0);
+    MStringInput targetInput = (MStringInput) target.getJobConfig(Direction.FROM)
+      .getConfigs().get(0).getInputs().get(0);
     assertEquals("Hi there!", targetInput.getValue());
-    targetInput = (MStringInput) target.getConnectorPart(Direction.TO)
-        .getForms().get(0).getInputs().get(0);
+    targetInput = (MStringInput) target.getJobConfig(Direction.TO)
+        .getConfigs().get(0).getInputs().get(0);
     assertEquals("Hi there again!", targetInput.getValue());
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/8362c73c/common/src/test/java/org/apache/sqoop/json/TestLinkBean.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/json/TestLinkBean.java b/common/src/test/java/org/apache/sqoop/json/TestLinkBean.java
index 9ca6b64..ac07137 100644
--- a/common/src/test/java/org/apache/sqoop/json/TestLinkBean.java
+++ b/common/src/test/java/org/apache/sqoop/json/TestLinkBean.java
@@ -17,19 +17,21 @@
  */
 package org.apache.sqoop.json;
 
+import static org.apache.sqoop.json.ConfigTestUtil.getLink;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Date;
+
+import org.apache.sqoop.json.util.ConfigSerialization;
 import org.apache.sqoop.model.MLink;
 import org.apache.sqoop.model.MStringInput;
 import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
-import org.json.simple.JSONArray;
 import org.json.simple.JSONValue;
 import org.junit.Test;
 
-import java.util.Date;
-
-import static org.junit.Assert.*;
-import static org.apache.sqoop.json.TestUtil.*;
-
 /**
  *
  */
@@ -48,31 +50,31 @@ public class TestLinkBean {
     link.setEnabled(false);
 
     // Fill some data at the beginning
-    MStringInput input = (MStringInput) link.getConnectorPart().getForms()
+    MStringInput input = (MStringInput) link.getConnectorLinkConfig().getConfigs()
       .get(0).getInputs().get(0);
     input.setValue("Hi there!");
 
     // Serialize it to JSON object
-    LinkBean bean = new LinkBean(link);
-    JSONObject json = bean.extract(false);
+    LinkBean linkBean = new LinkBean(link);
+    JSONObject json = linkBean.extract(false);
 
     // Check for sensitivity
-    JSONArray all = (JSONArray)json.get("all");
+    JSONArray all = (JSONArray)json.get(ConfigSerialization.ALL);
     JSONObject allItem = (JSONObject)all.get(0);
-    JSONArray connectors = (JSONArray)allItem.get("connector");
+    JSONArray connectors = (JSONArray)allItem.get(LinkBean.LINK_CONFIG);
     JSONObject connector = (JSONObject)connectors.get(0);
-    JSONArray inputs = (JSONArray)connector.get("inputs");
+    JSONArray inputs = (JSONArray)connector.get(ConfigSerialization.CONFIG_INPUTS);
     for (Object input1 : inputs) {
-      assertTrue(((JSONObject)input1).containsKey("sensitive"));
+      assertTrue(((JSONObject)input1).containsKey(ConfigSerialization.CONFIG_INPUT_SENSITIVE));
     }
 
     // "Move" it across network in text form
-    String string = json.toJSONString();
+    String linkJsonString = json.toJSONString();
 
     // Retrieved transferred object
-    JSONObject retrievedJson = (JSONObject) JSONValue.parse(string);
+    JSONObject parsedLinkJson = (JSONObject) JSONValue.parse(linkJsonString);
     LinkBean retrievedBean = new LinkBean();
-    retrievedBean.restore(retrievedJson);
+    retrievedBean.restore(parsedLinkJson);
     MLink target = retrievedBean.getLinks().get(0);
 
     // Check id and name
@@ -85,8 +87,8 @@ public class TestLinkBean {
     assertEquals(false, target.getEnabled());
 
     // Test that value was correctly moved
-    MStringInput targetInput = (MStringInput) target.getConnectorPart()
-      .getForms().get(0).getInputs().get(0);
+    MStringInput targetInput = (MStringInput) target.getConnectorLinkConfig()
+      .getConfigs().get(0).getInputs().get(0);
     assertEquals("Hi there!", targetInput.getValue());
   }
 
@@ -104,7 +106,7 @@ public class TestLinkBean {
     link.setEnabled(true);
 
     // Fill some data at the beginning
-    MStringInput input = (MStringInput) link.getConnectorPart().getForms()
+    MStringInput input = (MStringInput) link.getConnectorLinkConfig().getConfigs()
       .get(0).getInputs().get(0);
     input.setValue("Hi there!");
 
@@ -114,25 +116,25 @@ public class TestLinkBean {
     JSONObject jsonFiltered = bean.extract(true);
 
     // Sensitive values should exist
-    JSONArray all = (JSONArray)json.get("all");
+    JSONArray all = (JSONArray)json.get(ConfigSerialization.ALL);
     JSONObject allItem = (JSONObject)all.get(0);
-    JSONArray connectors = (JSONArray)allItem.get("connector");
+    JSONArray connectors = (JSONArray)allItem.get(LinkBean.LINK_CONFIG);
     JSONObject connector = (JSONObject)connectors.get(0);
-    JSONArray inputs = (JSONArray)connector.get("inputs");
+    JSONArray inputs = (JSONArray)connector.get(ConfigSerialization.CONFIG_INPUTS);
     assertEquals(3, inputs.size());
     // Inputs are ordered when creating link
     JSONObject password = (JSONObject)inputs.get(2);
-    assertTrue(password.containsKey("value"));
+    assertTrue(password.containsKey(ConfigSerialization.CONFIG_INPUT_VALUE));
 
     // Sensitive values should not exist
-    all = (JSONArray)jsonFiltered.get("all");
+    all = (JSONArray)jsonFiltered.get(ConfigSerialization.ALL);
     allItem = (JSONObject)all.get(0);
-    connectors = (JSONArray)allItem.get("connector");
+    connectors = (JSONArray)allItem.get(LinkBean.LINK_CONFIG);
     connector = (JSONObject)connectors.get(0);
-    inputs = (JSONArray)connector.get("inputs");
+    inputs = (JSONArray)connector.get(ConfigSerialization.CONFIG_INPUTS);
     assertEquals(3, inputs.size());
     // Inputs are ordered when creating link
     password = (JSONObject)inputs.get(2);
-    assertFalse(password.containsKey("value"));
+    assertFalse(password.containsKey(ConfigSerialization.CONFIG_INPUT_VALUE));
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/8362c73c/common/src/test/java/org/apache/sqoop/json/TestUtil.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/json/TestUtil.java b/common/src/test/java/org/apache/sqoop/json/TestUtil.java
deleted file mode 100644
index 9875219..0000000
--- a/common/src/test/java/org/apache/sqoop/json/TestUtil.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/**
- * 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.json;
-
-import org.apache.sqoop.common.Direction;
-import org.apache.sqoop.model.MLink;
-import org.apache.sqoop.model.MConnectionForms;
-import org.apache.sqoop.model.MConnector;
-import org.apache.sqoop.model.MForm;
-import org.apache.sqoop.model.MDriverConfig;
-import org.apache.sqoop.model.MInput;
-import org.apache.sqoop.model.MJob;
-import org.apache.sqoop.model.MJobForms;
-import org.apache.sqoop.model.MStringInput;
-import org.apache.sqoop.utils.MapResourceBundle;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.ResourceBundle;
-
-/**
- *
- */
-public class TestUtil {
-  public static MConnector getConnector(String name) {
-    return getConnector(name, true, true);
-  }
-
-  public static MConnector getConnector(String name, boolean from, boolean to) {
-    MJobForms fromJobForms = null;
-    MJobForms toJobForms = null;
-    if (from) {
-      fromJobForms = getJobForms();
-    }
-    if (to) {
-      toJobForms = getJobForms();
-    }
-    return new MConnector(name, name + ".class", "1.0-test",
-      getConnectionForms(), fromJobForms, toJobForms);
-  }
-
-  public static MDriverConfig getDriverConfig() {
-    return new MDriverConfig(getConnectionForms(), getJobForms(), "1");
-  }
-
-  public static MLink getLink(String name) {
-    return new MLink(1, getConnector(name).getConnectionForms(), getDriverConfig()
-        .getConnectionForms());
-  }
-
-  public static MJob getJob(String name) {
-    return new MJob(1, 2, 1, 2, getConnector(name).getJobForms(Direction.FROM), getConnector(name)
-        .getJobForms(Direction.TO), getDriverConfig().getJobForms());
-  }
-
-  public static MConnectionForms getConnectionForms() {
-    List<MInput<?>> inputs;
-    MStringInput input;
-    MForm form;
-    List<MForm> connectionForms = new ArrayList<MForm>();
-    inputs = new ArrayList<MInput<?>>();
-
-    input = new MStringInput("url", false, (short) 10);
-    input.setPersistenceId(1);
-    inputs.add(input);
-
-    input = new MStringInput("username", false, (short) 10);
-    input.setPersistenceId(2);
-    input.setValue("test");
-    inputs.add(input);
-
-    input = new MStringInput("password", true, (short) 10);
-    input.setPersistenceId(3);
-    input.setValue("test");
-    inputs.add(input);
-
-    form = new MForm("connection", inputs);
-    form.setPersistenceId(10);
-    connectionForms.add(form);
-
-    return new MConnectionForms(connectionForms);
-  }
-
-  public static MJobForms getJobForms() {
-    List<MInput<?>> inputs;
-    MStringInput input;
-    MForm form;
-    List<MForm> jobForms = new ArrayList<MForm>();
-
-    inputs = new ArrayList<MInput<?>>();
-
-    input = new MStringInput("A", false, (short) 10);
-    input.setPersistenceId(4);
-    inputs.add(input);
-
-    input = new MStringInput("B", false, (short) 10);
-    input.setPersistenceId(5);
-    inputs.add(input);
-
-    input = new MStringInput("C", false, (short) 10);
-    input.setPersistenceId(6);
-    inputs.add(input);
-
-    form = new MForm("Z", inputs);
-    form.setPersistenceId(11);
-    jobForms.add(form);
-
-    inputs = new ArrayList<MInput<?>>();
-
-    input = new MStringInput("D", false, (short) 10);
-    input.setPersistenceId(7);
-    inputs.add(input);
-
-    input = new MStringInput("E", false, (short) 10);
-    input.setPersistenceId(8);
-    inputs.add(input);
-
-    input = new MStringInput("F", false, (short) 10);
-    input.setPersistenceId(9);
-    inputs.add(input);
-
-    form = new MForm("connection", inputs);
-    form.setPersistenceId(12);
-    jobForms.add(form);
-
-    return new MJobForms(jobForms);
-  }
-
-  public static ResourceBundle getResourceBundle() {
-    Map<String, Object> map = new HashMap<String, Object>();
-    map.put("a", "a");
-    map.put("b", "b");
-
-    return new MapResourceBundle(map);
-  }
-}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/8362c73c/common/src/test/java/org/apache/sqoop/json/TestValidationBean.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/json/TestValidationBean.java b/common/src/test/java/org/apache/sqoop/json/TestValidationBean.java
index f5f3389..fc5b21d 100644
--- a/common/src/test/java/org/apache/sqoop/json/TestValidationBean.java
+++ b/common/src/test/java/org/apache/sqoop/json/TestValidationBean.java
@@ -17,18 +17,20 @@
  */
 package org.apache.sqoop.json;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.sqoop.common.Direction;
+import org.apache.sqoop.validation.ConfigValidator;
 import org.apache.sqoop.validation.Status;
-import org.apache.sqoop.validation.Validation;
 import org.json.simple.JSONObject;
 import org.json.simple.JSONValue;
 import org.junit.Test;
 
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.junit.Assert.*;
-
 /**
  *
  */
@@ -44,7 +46,7 @@ public class TestValidationBean {
     );
     JSONObject json = bean.extract(false);
 
-    // "Move" it across network in text form
+    // "Move" it across network in text config
     String string = json.toJSONString();
 
     // Retrieved transferred object
@@ -54,43 +56,43 @@ public class TestValidationBean {
 
     assertNull(retrievedBean.getId());
 
-    Validation.FormInput fa = new Validation.FormInput("f", "i");
-    Validation.FormInput fb = new Validation.FormInput("f2", "i2");
+    ConfigValidator.ConfigInput fa = new ConfigValidator.ConfigInput("c", "i");
+    ConfigValidator.ConfigInput fb = new ConfigValidator.ConfigInput("c2", "i2");
 
-    Validation fromConnector = retrievedBean.getConnectorValidation(Direction.FROM);
+    ConfigValidator fromConnector = retrievedBean.getConnectorValidation(Direction.FROM);
     assertEquals(Status.FINE, fromConnector.getStatus());
     assertEquals(2, fromConnector.getMessages().size());
     assertTrue(fromConnector.getMessages().containsKey(fa));
-    assertEquals(new Validation.Message(Status.FINE, "d"),
+    assertEquals(new ConfigValidator.Message(Status.FINE, "d"),
         fromConnector.getMessages().get(fa));
 
-    Validation toConnector = retrievedBean.getConnectorValidation(Direction.TO);
+    ConfigValidator toConnector = retrievedBean.getConnectorValidation(Direction.TO);
     assertEquals(Status.FINE, toConnector.getStatus());
     assertEquals(2, toConnector.getMessages().size());
     assertTrue(toConnector.getMessages().containsKey(fa));
-    assertEquals(new Validation.Message(Status.FINE, "d"),
+    assertEquals(new ConfigValidator.Message(Status.FINE, "d"),
         toConnector.getMessages().get(fa));
 
-    Validation framework = retrievedBean.getFrameworkValidation();
+    ConfigValidator framework = retrievedBean.getFrameworkValidation();
     assertEquals(Status.UNACCEPTABLE, framework.getStatus());
     assertEquals(2, framework.getMessages().size());
     assertTrue(framework.getMessages().containsKey(fb));
-    assertEquals(new Validation.Message(Status.UNACCEPTABLE, "c"),
+    assertEquals(new ConfigValidator.Message(Status.UNACCEPTABLE, "c"),
       framework.getMessages().get(fb));
   }
 
   @Test
   public void testJobValidationBeanId() {
     // Serialize it to JSON object
-    JobValidationBean bean = new JobValidationBean(
+    JobValidationBean jobValidatioBean = new JobValidationBean(
         getValidation(Status.FINE),
         getValidation(Status.FINE),
         getValidation(Status.FINE)
     );
-    bean.setId((long) 10);
-    JSONObject json = bean.extract(false);
+    jobValidatioBean.setId((long) 10);
+    JSONObject json = jobValidatioBean.extract(false);
 
-    // "Move" it across network in text form
+    // "Move" it across network in text config
     String string = json.toJSONString();
 
     // Retrieved transferred object
@@ -105,12 +107,10 @@ public class TestValidationBean {
   public void testLinkValidationBeanSerialization() {
     // Serialize it to JSON object
     LinkValidationBean bean = new LinkValidationBean(
-        getValidation(Status.FINE),
-        getValidation(Status.UNACCEPTABLE)
-    );
+        getValidation(Status.FINE));
     JSONObject json = bean.extract(false);
 
-    // "Move" it across network in text form
+    // "Move" it across network in text config
     String string = json.toJSONString();
 
     // Retrieved transferred object
@@ -120,35 +120,25 @@ public class TestValidationBean {
 
     assertNull(retrievedBean.getId());
 
-    Validation.FormInput fa = new Validation.FormInput("f", "i");
-    Validation.FormInput fb = new Validation.FormInput("f2", "i2");
-
-    Validation connector = retrievedBean.getConnectorValidation();
+    ConfigValidator.ConfigInput ca = new ConfigValidator.ConfigInput("c", "i");
+    ConfigValidator connector = retrievedBean.getLinkConfigValidator();
     assertEquals(Status.FINE, connector.getStatus());
     assertEquals(2, connector.getMessages().size());
-    assertTrue(connector.getMessages().containsKey(fa));
-    assertEquals(new Validation.Message(Status.FINE, "d"),
-        connector.getMessages().get(fa));
-
-    Validation framework = retrievedBean.getFrameworkValidation();
-    assertEquals(Status.UNACCEPTABLE, framework.getStatus());
-    assertEquals(2, framework.getMessages().size());
-    assertTrue(framework.getMessages().containsKey(fb));
-    assertEquals(new Validation.Message(Status.UNACCEPTABLE, "c"),
-        framework.getMessages().get(fb));
+    assertTrue(connector.getMessages().containsKey(ca));
+    assertEquals(new ConfigValidator.Message(Status.FINE, "d"),
+        connector.getMessages().get(ca));
   }
 
   @Test
   public void testLinkValidationBeanId() {
     // Serialize it to JSON object
     LinkValidationBean bean = new LinkValidationBean(
-        getValidation(Status.FINE),
         getValidation(Status.FINE)
     );
     bean.setId((long) 10);
     JSONObject json = bean.extract(false);
 
-    // "Move" it across network in text form
+    // "Move" it across network in text config
     String string = json.toJSONString();
 
     // Retrieved transferred object
@@ -159,17 +149,12 @@ public class TestValidationBean {
     assertEquals((Long)(long) 10, retrievedBean.getId());
   }
 
-  public Validation getValidation(Status status) {
-    Map<Validation.FormInput, Validation.Message> messages =
-      new HashMap<Validation.FormInput, Validation.Message>();
+  public ConfigValidator getValidation(Status status) {
+    Map<ConfigValidator.ConfigInput, ConfigValidator.Message> messages = new HashMap<ConfigValidator.ConfigInput, ConfigValidator.Message>();
 
-    messages.put(
-      new Validation.FormInput("f", "i"),
-      new Validation.Message(status, "d"));
-    messages.put(
-      new Validation.FormInput("f2", "i2"),
-      new Validation.Message(status, "c"));
+    messages.put(new ConfigValidator.ConfigInput("c", "i"), new ConfigValidator.Message(status, "d"));
+    messages.put(new ConfigValidator.ConfigInput("c2", "i2"), new ConfigValidator.Message(status, "c"));
 
-    return new Validation(status, messages);
+    return new ConfigValidator(status, messages);
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/8362c73c/common/src/test/java/org/apache/sqoop/json/TestValidationResultBean.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/json/TestValidationResultBean.java b/common/src/test/java/org/apache/sqoop/json/TestValidationResultBean.java
index 5c094fb..bdbad72 100644
--- a/common/src/test/java/org/apache/sqoop/json/TestValidationResultBean.java
+++ b/common/src/test/java/org/apache/sqoop/json/TestValidationResultBean.java
@@ -19,7 +19,7 @@ package org.apache.sqoop.json;
 
 import org.apache.sqoop.validation.Message;
 import org.apache.sqoop.validation.Status;
-import org.apache.sqoop.validation.ValidationResult;
+import org.apache.sqoop.validation.ConfigValidationResult;
 import org.json.simple.JSONObject;
 import org.json.simple.JSONValue;
 import org.junit.Test;
@@ -39,31 +39,31 @@ public class TestValidationResultBean {
 
   @Test
   public void testEmptyTransfer() {
-    ValidationResult []empty = new ValidationResult[0];
+    ConfigValidationResult []empty = new ConfigValidationResult[0];
 
-    ValidationResult []retrieved = transfer(empty);
+    ConfigValidationResult []retrieved = transfer(empty);
     assertEquals(0, retrieved.length);
   }
 
   @Test
   public void testOneMessage() {
-    ValidationResult []empty = new ValidationResult[] {
+    ConfigValidationResult []empty = new ConfigValidationResult[] {
       getResultA()
     };
 
-    ValidationResult []retrieved = transfer(empty);
+    ConfigValidationResult []retrieved = transfer(empty);
     assertEquals(1, retrieved.length);
     verifyResultA(retrieved[0]);
   }
 
   @Test
   public void testTwoMessages() {
-     ValidationResult []empty = new ValidationResult[] {
+     ConfigValidationResult []empty = new ConfigValidationResult[] {
       getResultA(),
       getResultA()
     };
 
-    ValidationResult []retrieved = transfer(empty);
+    ConfigValidationResult []retrieved = transfer(empty);
     assertEquals(2, retrieved.length);
 
     verifyResultA(retrieved[0]);
@@ -79,7 +79,7 @@ public class TestValidationResultBean {
     assertNull(idNull);
   }
 
-  public void verifyResultA(ValidationResult result) {
+  public void verifyResultA(ConfigValidationResult result) {
     assertNotNull(result);
     assertEquals(Status.UNACCEPTABLE, result.getStatus());
 
@@ -98,8 +98,8 @@ public class TestValidationResultBean {
     assertEquals("B", messagesA.get(1).getMessage());
   }
 
-  public ValidationResult getResultA() {
-    ValidationResult result = new ValidationResult();
+  public ConfigValidationResult getResultA() {
+    ConfigValidationResult result = new ConfigValidationResult();
     List<Message> messages = new LinkedList<Message>();
     messages.add(new Message(Status.ACCEPTABLE, "A"));
     messages.add(new Message(Status.UNACCEPTABLE, "B"));
@@ -109,7 +109,7 @@ public class TestValidationResultBean {
 
 
   private Long transfer(Long id) {
-    ValidationResultBean bean = new ValidationResultBean(new ValidationResult[0]);
+    ValidationResultBean bean = new ValidationResultBean(new ConfigValidationResult[0]);
     bean.setId(id);
     JSONObject json = bean.extract(false);
 
@@ -122,7 +122,7 @@ public class TestValidationResultBean {
     return retrievedBean.getId();
   }
 
-  private ValidationResult[] transfer(ValidationResult [] results) {
+  private ConfigValidationResult[] transfer(ConfigValidationResult [] results) {
     ValidationResultBean bean = new ValidationResultBean(results);
     JSONObject json = bean.extract(false);
 

http://git-wip-us.apache.org/repos/asf/sqoop/blob/8362c73c/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
new file mode 100644
index 0000000..4f0c84d
--- /dev/null
+++ b/common/src/test/java/org/apache/sqoop/json/util/TestConfigSerialization.java
@@ -0,0 +1,157 @@
+/**
+ * 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.json.util;
+
+import org.apache.sqoop.common.SqoopException;
+import org.apache.sqoop.model.MBooleanInput;
+import org.apache.sqoop.model.MEnumInput;
+import org.apache.sqoop.model.MConfig;
+import org.apache.sqoop.model.MInput;
+import org.apache.sqoop.model.MIntegerInput;
+import org.apache.sqoop.model.MMapInput;
+import org.apache.sqoop.model.MStringInput;
+import org.json.simple.JSONObject;
+import org.json.simple.JSONValue;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+/**
+ *
+ */
+public class TestConfigSerialization {
+
+  @Test
+  public void testAllDataTypes() {
+    // Inserted values
+    Map<String, String> map = new HashMap<String, String>();
+    map.put("A", "B");
+
+    // Fill config with all values
+    MConfig config = getConfig();
+    config.getStringInput("String").setValue("A");
+    config.getMapInput("Map").setValue(map);
+    config.getIntegerInput("Integer").setValue(1);
+    config.getBooleanInput("Boolean").setValue(true);
+    config.getEnumInput("Enum").setValue("YES");
+
+    // Serialize that into JSON
+    JSONObject jsonObject = ConfigSerialization.extractConfig(config, false);
+    assertNotNull(jsonObject);
+
+    // Exchange the data on string level
+    String serializedJson = jsonObject.toJSONString();
+    JSONObject retrievedJson = (JSONObject) JSONValue.parse(serializedJson);
+
+    // And retrieve back from JSON representation
+    MConfig retrieved = ConfigSerialization.restoreConfig(retrievedJson);
+
+    // Verify all expected values
+    assertEquals("A", retrieved.getStringInput("String").getValue());
+    assertEquals(map, retrieved.getMapInput("Map").getValue());
+    assertEquals(1, (int)retrieved.getIntegerInput("Integer").getValue());
+    assertEquals(true, retrieved.getBooleanInput("Boolean").getValue());
+    assertEquals("YES", retrieved.getEnumInput("Enum").getValue());
+  }
+
+  @Test
+  public void testMapDataType() {
+    MConfig config = getMapConfig();
+
+    // Inserted values
+    Map<String, String> map = new HashMap<String, String>();
+    map.put("A", "B");
+    config.getMapInput("Map").setValue(map);
+
+    // Serialize
+    JSONObject jsonObject = ConfigSerialization.extractConfig(config, false);
+    String serializedJson = jsonObject.toJSONString();
+
+    // Deserialize
+    JSONObject retrievedJson = (JSONObject) JSONValue.parse(serializedJson);
+    MConfig retrieved = ConfigSerialization.restoreConfig(retrievedJson);
+    assertEquals(map, retrieved.getMapInput("Map").getValue());
+  }
+
+  @Test(expected=SqoopException.class)
+  public void testMapDataTypeException() {
+    MConfig config = getMapConfig();
+
+    // Inserted values
+    Map<String, String> map = new HashMap<String, String>();
+    map.put("A", "B");
+    config.getMapInput("Map").setValue(map);
+
+    // Serialize
+    JSONObject jsonObject = ConfigSerialization.extractConfig(config, false);
+    String serializedJson = jsonObject.toJSONString();
+
+    // Replace map value with a fake string to force exception
+    String badSerializedJson = serializedJson.replace("{\"A\":\"B\"}", "\"nonsensical string\"");
+    System.out.println(badSerializedJson);
+    JSONObject retrievedJson = (JSONObject) JSONValue.parse(badSerializedJson);
+    ConfigSerialization.restoreConfig(retrievedJson);
+  }
+
+  protected MConfig getMapConfig() {
+    List<MInput<?>> inputs;
+    MInput input;
+
+    inputs = new LinkedList<MInput<?>>();
+
+    input = new MMapInput("Map", false);
+    inputs.add(input);
+
+    return new MConfig("c", inputs);
+  }
+
+  /**
+   * Return config with all data types.
+   *
+   * @return
+   */
+  protected MConfig getConfig() {
+    List<MInput<?>> inputs;
+    MInput input;
+
+    inputs = new LinkedList<MInput<?>>();
+
+    input = new MStringInput("String", false, (short)30);
+    inputs.add(input);
+
+    input = new MMapInput("Map", false);
+    inputs.add(input);
+
+    input = new MIntegerInput("Integer", false);
+    inputs.add(input);
+
+    input = new MBooleanInput("Boolean", false);
+    inputs.add(input);
+
+    input = new MEnumInput("Enum", false, new String[] {"YES", "NO"});
+    inputs.add(input);
+
+    return new MConfig("c", inputs);
+  }
+}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/8362c73c/common/src/test/java/org/apache/sqoop/json/util/TestFormSerialization.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/json/util/TestFormSerialization.java b/common/src/test/java/org/apache/sqoop/json/util/TestFormSerialization.java
deleted file mode 100644
index c4223ec..0000000
--- a/common/src/test/java/org/apache/sqoop/json/util/TestFormSerialization.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/**
- * 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.json.util;
-
-import org.apache.sqoop.common.SqoopException;
-import org.apache.sqoop.model.MBooleanInput;
-import org.apache.sqoop.model.MEnumInput;
-import org.apache.sqoop.model.MForm;
-import org.apache.sqoop.model.MInput;
-import org.apache.sqoop.model.MIntegerInput;
-import org.apache.sqoop.model.MMapInput;
-import org.apache.sqoop.model.MStringInput;
-import org.json.simple.JSONObject;
-import org.json.simple.JSONValue;
-import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-/**
- *
- */
-public class TestFormSerialization {
-
-  @Test
-  public void testAllDataTypes() {
-    // Inserted values
-    Map<String, String> map = new HashMap<String, String>();
-    map.put("A", "B");
-
-    // Fill form with all values
-    MForm form = getForm();
-    form.getStringInput("String").setValue("A");
-    form.getMapInput("Map").setValue(map);
-    form.getIntegerInput("Integer").setValue(1);
-    form.getBooleanInput("Boolean").setValue(true);
-    form.getEnumInput("Enum").setValue("YES");
-
-    // Serialize that into JSON
-    JSONObject jsonObject = FormSerialization.extractForm(form, false);
-    assertNotNull(jsonObject);
-
-    // Exchange the data on string level
-    String serializedJson = jsonObject.toJSONString();
-    JSONObject retrievedJson = (JSONObject) JSONValue.parse(serializedJson);
-
-    // And retrieve back from JSON representation
-    MForm retrieved = FormSerialization.restoreForm(retrievedJson);
-
-    // Verify all expected values
-    assertEquals("A", retrieved.getStringInput("String").getValue());
-    assertEquals(map, retrieved.getMapInput("Map").getValue());
-    assertEquals(1, (int)retrieved.getIntegerInput("Integer").getValue());
-    assertEquals(true, retrieved.getBooleanInput("Boolean").getValue());
-    assertEquals("YES", retrieved.getEnumInput("Enum").getValue());
-  }
-
-  @Test
-  public void testMapDataType() {
-    MForm form = getMapForm();
-
-    // Inserted values
-    Map<String, String> map = new HashMap<String, String>();
-    map.put("A", "B");
-    form.getMapInput("Map").setValue(map);
-
-    // Serialize
-    JSONObject jsonObject = FormSerialization.extractForm(form, false);
-    String serializedJson = jsonObject.toJSONString();
-
-    // Deserialize
-    JSONObject retrievedJson = (JSONObject) JSONValue.parse(serializedJson);
-    MForm retrieved = FormSerialization.restoreForm(retrievedJson);
-    assertEquals(map, retrieved.getMapInput("Map").getValue());
-  }
-
-  @Test(expected=SqoopException.class)
-  public void testMapDataTypeException() {
-    MForm form = getMapForm();
-
-    // Inserted values
-    Map<String, String> map = new HashMap<String, String>();
-    map.put("A", "B");
-    form.getMapInput("Map").setValue(map);
-
-    // Serialize
-    JSONObject jsonObject = FormSerialization.extractForm(form, false);
-    String serializedJson = jsonObject.toJSONString();
-
-    // Replace map value with a fake string to force exception
-    String badSerializedJson = serializedJson.replace("{\"A\":\"B\"}", "\"nonsensical string\"");
-    System.out.println(badSerializedJson);
-    JSONObject retrievedJson = (JSONObject) JSONValue.parse(badSerializedJson);
-    FormSerialization.restoreForm(retrievedJson);
-  }
-
-  protected MForm getMapForm() {
-    List<MInput<?>> inputs;
-    MInput input;
-
-    inputs = new LinkedList<MInput<?>>();
-
-    input = new MMapInput("Map", false);
-    inputs.add(input);
-
-    return new MForm("f", inputs);
-  }
-
-  /**
-   * Return form with all data types.
-   *
-   * @return
-   */
-  protected MForm getForm() {
-    List<MInput<?>> inputs;
-    MInput input;
-
-    inputs = new LinkedList<MInput<?>>();
-
-    input = new MStringInput("String", false, (short)30);
-    inputs.add(input);
-
-    input = new MMapInput("Map", false);
-    inputs.add(input);
-
-    input = new MIntegerInput("Integer", false);
-    inputs.add(input);
-
-    input = new MBooleanInput("Boolean", false);
-    inputs.add(input);
-
-    input = new MEnumInput("Enum", false, new String[] {"YES", "NO"});
-    inputs.add(input);
-
-    return new MForm("f", inputs);
-  }
-}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/8362c73c/common/src/test/java/org/apache/sqoop/model/TestConfigUtils.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/model/TestConfigUtils.java b/common/src/test/java/org/apache/sqoop/model/TestConfigUtils.java
new file mode 100644
index 0000000..d5377f8
--- /dev/null
+++ b/common/src/test/java/org/apache/sqoop/model/TestConfigUtils.java
@@ -0,0 +1,290 @@
+/**
+ * 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 java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.sqoop.common.SqoopException;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+/**
+ * Test config utils
+ */
+public class TestConfigUtils extends TestCase {
+
+  public void testConfigs() {
+    TestConfiguration config = new TestConfiguration();
+    config.aConfig.a1 = "value";
+
+    List<MConfig> configsByInstance = ConfigUtils.toConfigs(config);
+    assertEquals(getConfigs(), configsByInstance);
+    assertEquals("value", configsByInstance.get(0).getInputs().get(0).getValue());
+
+    List<MConfig> configsByClass = ConfigUtils.toConfigs(TestConfiguration.class);
+    assertEquals(getConfigs(), configsByClass);
+
+    List<MConfig> configsByBoth = ConfigUtils.toConfigs(TestConfiguration.class, config);
+    assertEquals(getConfigs(), configsByBoth);
+    assertEquals("value", configsByBoth.get(0).getInputs().get(0).getValue());
+  }
+
+  public void testConfigsMissingAnnotation() {
+    try {
+      ConfigUtils.toConfigs(ConfigWithout.class);
+    } catch(SqoopException ex) {
+      assertEquals(ModelError.MODEL_003, ex.getErrorCode());
+      return;
+    }
+
+    fail("Correct exception wasn't thrown");
+  }
+
+  public void testNonUniqueFormNameAttributes() {
+    try {
+      ConfigUtils.toConfigs(ConfigurationWithNonUniqueFormNameAttribute.class);
+    } catch (SqoopException ex) {
+      assertEquals(ModelError.MODEL_012, ex.getErrorCode());
+      return;
+    }
+
+    fail("Correct exception wasn't thrown");
+  }
+
+  public void testInvalidFormNameAttribute() {
+    try {
+      ConfigUtils.toConfigs(ConfigurationWithInvalidFormNameAttribute.class);
+    } catch (SqoopException ex) {
+      assertEquals(ModelError.MODEL_013, ex.getErrorCode());
+      return;
+    }
+
+    fail("Correct exception wasn't thrown");
+  }
+
+  public void testInvalidFormNameAttributeLength() {
+    try {
+      ConfigUtils.toConfigs(ConfigurationWithInvalidFormNameAttributeLength.class);
+    } catch (SqoopException ex) {
+      assertEquals(ModelError.MODEL_014, ex.getErrorCode());
+      return;
+    }
+    fail("Correct exception wasn't thrown");
+  }
+
+  public void testFailureOnPrimitiveType() {
+    PrimitiveConfig config = new PrimitiveConfig();
+
+    try {
+      ConfigUtils.toConfigs(config);
+      fail("We were expecting exception for unsupported type.");
+    } catch(SqoopException ex) {
+      assertEquals(ModelError.MODEL_007, ex.getErrorCode());
+    }
+  }
+
+  public void testFillValues() {
+    List<MConfig> configs = getConfigs();
+
+    ((MStringInput)configs.get(0).getInputs().get(0)).setValue("value");
+
+    TestConfiguration config = new TestConfiguration();
+
+    ConfigUtils.fromConfigs(configs, config);
+    assertEquals("value", config.aConfig.a1);
+  }
+
+  public void testFillValuesObjectReuse() {
+    List<MConfig> configs = getConfigs();
+
+    ((MStringInput)configs.get(0).getInputs().get(0)).setValue("value");
+
+    TestConfiguration config = new TestConfiguration();
+    config.aConfig.a2 = "x";
+    config.bConfig.b1 = "y";
+
+    ConfigUtils.fromConfigs(configs, config);
+    assertEquals("value", config.aConfig.a1);
+    assertNull(config.aConfig.a2);
+    assertNull(config.bConfig.b2);
+    assertNull(config.bConfig.b2);
+  }
+
+  public void testJson() {
+    TestConfiguration config = new TestConfiguration();
+    config.aConfig.a1 = "A";
+    config.bConfig.b2 = "B";
+    config.cConfig.intValue = 4;
+    config.cConfig.map.put("C", "D");
+    config.cConfig.enumeration = Enumeration.X;
+
+    String json = ConfigUtils.toJson(config);
+
+    TestConfiguration targetConfig = new TestConfiguration();
+
+    // Old values from should be always removed
+    targetConfig.aConfig.a2 = "X";
+    targetConfig.bConfig.b1 = "Y";
+    // Nulls in configs shouldn't be an issue either
+    targetConfig.cConfig = null;
+
+    ConfigUtils.fillValues(json, targetConfig);
+
+    assertEquals("A", targetConfig.aConfig.a1);
+    assertNull(targetConfig.aConfig.a2);
+
+    assertNull(targetConfig.bConfig.b1);
+    assertEquals("B", targetConfig.bConfig.b2);
+
+    assertEquals((Integer)4, targetConfig.cConfig.intValue);
+    assertEquals(1, targetConfig.cConfig.map.size());
+    assertTrue(targetConfig.cConfig.map.containsKey("C"));
+    assertEquals("D", targetConfig.cConfig.map.get("C"));
+    assertEquals(Enumeration.X, targetConfig.cConfig.enumeration);
+  }
+
+  /**
+   * Config structure that corresponds to Config class declared below
+   * @return Config structure
+   */
+  protected List<MConfig> getConfigs() {
+    List<MConfig> ret = new LinkedList<MConfig>();
+
+    List<MInput<?>> inputs;
+
+    // Config A
+    inputs = new LinkedList<MInput<?>>();
+    inputs.add(new MStringInput("aConfig.a1", false, (short)30));
+    inputs.add(new MStringInput("aConfig.a2", true, (short)-1));
+    ret.add(new MConfig("aConfig", inputs));
+
+    // Config B
+    inputs = new LinkedList<MInput<?>>();
+    inputs.add(new MStringInput("bConfig.b1", false, (short)2));
+    inputs.add(new MStringInput("bConfig.b2", false, (short)3));
+    ret.add(new MConfig("bConfig", inputs));
+
+    // Config C
+    inputs = new LinkedList<MInput<?>>();
+    inputs.add(new MIntegerInput("cConfig.intValue", false));
+    inputs.add(new MMapInput("cConfig.map", false));
+    inputs.add(new MEnumInput("cConfig.enumeration", false, new String[]{"X", "Y"}));
+    ret.add(new MConfig("cConfig", inputs));
+
+    return ret;
+  }
+
+  @ConfigurationClass
+  public static class ConfigurationWithNonUniqueFormNameAttribute {
+    public ConfigurationWithNonUniqueFormNameAttribute() {
+      aForm = new InvalidConfig();
+      bForm = new InvalidConfig();
+    }
+
+    @Config(name = "sameName")
+    InvalidConfig aForm;
+    @Config(name = "sameName")
+    InvalidConfig bForm;
+  }
+
+  @ConfigurationClass
+  public static class ConfigurationWithInvalidFormNameAttribute {
+    public ConfigurationWithInvalidFormNameAttribute() {
+      invalidForm = new InvalidConfig();
+    }
+
+    @Config(name = "#_form")
+    InvalidConfig invalidForm;
+  }
+
+  @ConfigurationClass
+  public static class ConfigurationWithInvalidFormNameAttributeLength {
+    public ConfigurationWithInvalidFormNameAttributeLength() {
+      invalidLengthForm = new InvalidConfig();
+    }
+
+    @Config(name = "longest_form_more_than_30_characers")
+    InvalidConfig invalidLengthForm;
+  }
+
+  @ConfigurationClass
+  public static class TestConfiguration {
+
+    public TestConfiguration() {
+      aConfig = new AConfig();
+      bConfig = new BConfig();
+      cConfig = new CConfig();
+    }
+
+    @Config AConfig aConfig;
+    @Config BConfig bConfig;
+    @Config CConfig cConfig;
+  }
+
+  @ConfigurationClass
+  public static class PrimitiveConfig {
+    @Config DConfig dConfig;
+  }
+
+  @ConfigClass
+  public static class AConfig {
+    @Input(size = 30)  String a1;
+    @Input(sensitive = true)  String a2;
+  }
+
+  @ConfigClass
+  public static class BConfig {
+    @Input(size = 2) String b1;
+    @Input(size = 3) String b2;
+  }
+
+  @ConfigClass
+  public static class CConfig {
+    @Input Integer intValue;
+    @Input Map<String, String> map;
+    @Input Enumeration enumeration;
+
+    public CConfig() {
+      map = new HashMap<String, String>();
+    }
+  }
+
+  @ConfigClass
+  public static class InvalidConfig {
+
+  }
+
+  @ConfigClass
+  public static class DConfig {
+    @Input int value;
+  }
+
+  public static class ConfigWithout {
+  }
+
+  enum Enumeration {
+    X,
+    Y,
+  }
+}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/8362c73c/common/src/test/java/org/apache/sqoop/model/TestFormUtils.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/model/TestFormUtils.java b/common/src/test/java/org/apache/sqoop/model/TestFormUtils.java
deleted file mode 100644
index d2a3476..0000000
--- a/common/src/test/java/org/apache/sqoop/model/TestFormUtils.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/**
- * 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.apache.sqoop.common.SqoopException;
-import org.apache.sqoop.validation.Status;
-import org.apache.sqoop.validation.Validation;
-import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import static org.junit.Assert.*;
-
-/**
- * Test form utils
- */
-public class TestFormUtils {
-
-  @Test
-  public void testToForms() {
-    Config config = new Config();
-    config.aForm.a1 = "value";
-
-    List<MForm> formsByInstance = FormUtils.toForms(config);
-    assertEquals(getForms(), formsByInstance);
-    assertEquals("value", formsByInstance.get(0).getInputs().get(0).getValue());
-
-    List<MForm> formsByClass = FormUtils.toForms(Config.class);
-    assertEquals(getForms(), formsByClass);
-
-    List<MForm> formsByBoth = FormUtils.toForms(Config.class, config);
-    assertEquals(getForms(), formsByBoth);
-    assertEquals("value", formsByBoth.get(0).getInputs().get(0).getValue());
-  }
-
-  @Test
-  public void testToFormsMissingAnnotation() {
-    try {
-      FormUtils.toForms(ConfigWithout.class);
-    } catch(SqoopException ex) {
-      assertEquals(ModelError.MODEL_003, ex.getErrorCode());
-      return;
-    }
-
-    fail("Correct exception wasn't thrown");
-  }
-
-  public void testNonUniqueFormNameAttributes() {
-    try {
-      FormUtils.toForms(ConfigurationWithNonUniqueFormNameAttribute.class);
-    } catch (SqoopException ex) {
-      assertEquals(ModelError.MODEL_012, ex.getErrorCode());
-      return;
-    }
-
-    fail("Correct exception wasn't thrown");
-  }
-
-  public void testInvalidFormNameAttribute() {
-    try {
-      FormUtils.toForms(ConfigurationWithInvalidFormNameAttribute.class);
-    } catch (SqoopException ex) {
-      assertEquals(ModelError.MODEL_013, ex.getErrorCode());
-      return;
-    }
-
-    fail("Correct exception wasn't thrown");
-  }
-
-  public void testInvalidFormNameAttributeLength() {
-    try {
-      FormUtils.toForms(ConfigurationWithInvalidFormNameAttributeLength.class);
-    } catch (SqoopException ex) {
-      assertEquals(ModelError.MODEL_014, ex.getErrorCode());
-      return;
-    }
-    fail("Correct exception wasn't thrown");
-  }
-
-  @Test
-  public void testFailureOnPrimitiveType() {
-    PrimitiveConfig config = new PrimitiveConfig();
-
-    try {
-      FormUtils.toForms(config);
-      fail("We were expecting exception for unsupported type.");
-    } catch(SqoopException ex) {
-      assertEquals(ModelError.MODEL_007, ex.getErrorCode());
-    }
-  }
-
-  @Test
-  public void testFillValues() {
-    List<MForm> forms = getForms();
-
-    ((MStringInput)forms.get(0).getInputs().get(0)).setValue("value");
-
-    Config config = new Config();
-
-    FormUtils.fromForms(forms, config);
-    assertEquals("value", config.aForm.a1);
-  }
-
-  @Test
-  public void testFillValuesObjectReuse() {
-    List<MForm> forms = getForms();
-
-    ((MStringInput)forms.get(0).getInputs().get(0)).setValue("value");
-
-    Config config = new Config();
-    config.aForm.a2 = "x";
-    config.bForm.b1 = "y";
-
-    FormUtils.fromForms(forms, config);
-    assertEquals("value", config.aForm.a1);
-    assertNull(config.aForm.a2);
-    assertNull(config.bForm.b2);
-    assertNull(config.bForm.b2);
-  }
-
-  @Test
-  public void testJson() {
-    Config config = new Config();
-    config.aForm.a1 = "A";
-    config.bForm.b2 = "B";
-    config.cForm.intValue = 4;
-    config.cForm.map.put("C", "D");
-    config.cForm.enumeration = Enumeration.X;
-
-    String json = FormUtils.toJson(config);
-
-    Config targetConfig = new Config();
-
-    // Old values from should be always removed
-    targetConfig.aForm.a2 = "X";
-    targetConfig.bForm.b1 = "Y";
-    // Nulls in forms shouldn't be an issue either
-    targetConfig.cForm = null;
-
-    FormUtils.fillValues(json, targetConfig);
-
-    assertEquals("A", targetConfig.aForm.a1);
-    assertNull(targetConfig.aForm.a2);
-
-    assertNull(targetConfig.bForm.b1);
-    assertEquals("B", targetConfig.bForm.b2);
-
-    assertEquals((Integer)4, targetConfig.cForm.intValue);
-    assertEquals(1, targetConfig.cForm.map.size());
-    assertTrue(targetConfig.cForm.map.containsKey("C"));
-    assertEquals("D", targetConfig.cForm.map.get("C"));
-    assertEquals(Enumeration.X, targetConfig.cForm.enumeration);
-  }
-
-  /**
-   * Form structure that corresponds to Config class declared below
-   * @return Form structure
-   */
-  protected List<MForm> getForms() {
-    List<MForm> ret = new LinkedList<MForm>();
-
-    List<MInput<?>> inputs;
-
-    // Form A
-    inputs = new LinkedList<MInput<?>>();
-    inputs.add(new MStringInput("aForm.a1", false, (short)30));
-    inputs.add(new MStringInput("aForm.a2", true, (short)-1));
-    ret.add(new MForm("aForm", inputs));
-
-    // Form B
-    inputs = new LinkedList<MInput<?>>();
-    inputs.add(new MStringInput("bForm.b1", false, (short)2));
-    inputs.add(new MStringInput("bForm.b2", false, (short)3));
-    ret.add(new MForm("bForm", inputs));
-
-    // Form C
-    inputs = new LinkedList<MInput<?>>();
-    inputs.add(new MIntegerInput("cForm.intValue", false));
-    inputs.add(new MMapInput("cForm.map", false));
-    inputs.add(new MEnumInput("cForm.enumeration", false, new String[]{"X", "Y"}));
-    ret.add(new MForm("cForm", inputs));
-
-    return ret;
-  }
-
-  @ConfigurationClass
-  public static class ConfigurationWithNonUniqueFormNameAttribute {
-    public ConfigurationWithNonUniqueFormNameAttribute() {
-      aForm = new InvalidForm();
-      bForm = new InvalidForm();
-    }
-
-    @Form(name = "sameName")
-    InvalidForm aForm;
-    @Form(name = "sameName")
-    InvalidForm bForm;
-  }
-
-  @ConfigurationClass
-  public static class ConfigurationWithInvalidFormNameAttribute {
-    public ConfigurationWithInvalidFormNameAttribute() {
-      invalidForm = new InvalidForm();
-    }
-
-    @Form(name = "#_form")
-    InvalidForm invalidForm;
-  }
-
-  @ConfigurationClass
-  public static class ConfigurationWithInvalidFormNameAttributeLength {
-    public ConfigurationWithInvalidFormNameAttributeLength() {
-      invalidLengthForm = new InvalidForm();
-    }
-
-    @Form(name = "longest_form_more_than_30_characers")
-    InvalidForm invalidLengthForm;
-  }
-
-  @ConfigurationClass
-  public static class Config {
-
-    public Config() {
-      aForm = new AForm();
-      bForm = new BForm();
-      cForm = new CForm();
-    }
-
-    @Form AForm aForm;
-    @Form BForm bForm;
-    @Form CForm cForm;
-  }
-
-  @ConfigurationClass
-  public static class PrimitiveConfig {
-    @Form DForm dForm;
-  }
-
-  @FormClass
-  public static class AForm {
-    @Input(size = 30)  String a1;
-    @Input(sensitive = true)  String a2;
-  }
-
-  @FormClass
-  public static class BForm {
-    @Input(size = 2) String b1;
-    @Input(size = 3) String b2;
-  }
-
-  @FormClass
-  public static class CForm {
-    @Input Integer intValue;
-    @Input Map<String, String> map;
-    @Input Enumeration enumeration;
-
-    public CForm() {
-      map = new HashMap<String, String>();
-    }
-  }
-
-  @FormClass
-  public static class InvalidForm {
-
-  }
-  @FormClass
-  public static class DForm {
-    @Input int value;
-  }
-
-  public static class ConfigWithout {
-  }
-
-  enum Enumeration {
-    X,
-    Y,
-  }
-}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/8362c73c/common/src/test/java/org/apache/sqoop/model/TestMAccountableEntity.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/model/TestMAccountableEntity.java b/common/src/test/java/org/apache/sqoop/model/TestMAccountableEntity.java
index af0f450..ba53739 100644
--- a/common/src/test/java/org/apache/sqoop/model/TestMAccountableEntity.java
+++ b/common/src/test/java/org/apache/sqoop/model/TestMAccountableEntity.java
@@ -35,14 +35,13 @@ public class TestMAccountableEntity {
    */
   @Test
   public void testInitialization() {
-    List<MForm> forms = new ArrayList<MForm>();
+    List<MConfig> configs = new ArrayList<MConfig>();
     MIntegerInput input = new MIntegerInput("INTEGER-INPUT", false);
     List<MInput<?>> list = new ArrayList<MInput<?>>();
     list.add(input);
-    MForm form = new MForm("FORMNAME", list);
-    forms.add(form);
-    MAccountableEntity link = new MLink(123l, new MConnectionForms(
-        forms), new MConnectionForms(forms));
+    MConfig config = new MConfig("CONFIGNAME", list);
+    configs.add(config);
+    MAccountableEntity link = new MLink(123l, new MLinkConfig(configs));
     // Initially creation date and last update date is same
     assertEquals(link.getCreationDate(), link.getLastUpdateDate());
     Date testCreationDate = new Date();

http://git-wip-us.apache.org/repos/asf/sqoop/blob/8362c73c/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
new file mode 100644
index 0000000..c5a07a0
--- /dev/null
+++ b/common/src/test/java/org/apache/sqoop/model/TestMConfig.java
@@ -0,0 +1,86 @@
+/**
+ * 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 java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class TestMConfig {
+
+  /**
+   * Test for initialization
+   */
+  @Test
+  public void testInitialization() {
+    MInput<String> input1 = new MStringInput("sqoopsqoop1", true, (short) 5);
+    MInput<String> input2 = new MStringInput("sqoopsqoop2", true, (short) 5);
+
+    List<MInput<?>> list = new ArrayList<MInput<?>>();
+    list.add(input1);
+    list.add(input2);
+    MConfig mConfig = new MConfig("config", list);
+
+    assertEquals("config", mConfig.getName());
+    assertEquals(2, mConfig.getInputs().size());
+  }
+
+  /**
+   * Test for equals method
+   */
+  @Test
+  public void testEquals() {
+    MInput<Integer> input1 = new MIntegerInput("sqoopsqoop1", false);
+    MInput<Integer> input2 = new MIntegerInput("sqoopsqoop2", false);
+    List<MInput<?>> list1 = new ArrayList<MInput<?>>();
+    list1.add(input1);
+    list1.add(input2);
+    MConfig mform1 = new MConfig("config", list1);
+
+    MInput<Integer> input3 = new MIntegerInput("sqoopsqoop1", false);
+    MInput<Integer> input4 = new MIntegerInput("sqoopsqoop2", false);
+    List<MInput<?>> list2 = new ArrayList<MInput<?>>();
+    list2.add(input3);
+    list2.add(input4);
+    MConfig mform2 = new MConfig("config", list2);
+    assertEquals(mform2, mform1);
+  }
+
+  @Test
+  public void testGetInputs() {
+    MIntegerInput intInput = new MIntegerInput("Config.A", false);
+    MMapInput mapInput = new MMapInput("Config.B", false);
+    MStringInput stringInput = new MStringInput("Config.C", false, (short)3);
+    MEnumInput enumInput = new MEnumInput("Config.D", false, new String[] {"I", "V"});
+
+    List<MInput<?>> inputs = new ArrayList<MInput<?>>();
+    inputs.add(intInput);
+    inputs.add(mapInput);
+    inputs.add(stringInput);
+    inputs.add(enumInput);
+
+    MConfig config = new MConfig("Config", inputs);
+    assertEquals(intInput, config.getIntegerInput("Config.A"));
+    assertEquals(mapInput, config.getMapInput("Config.B"));
+    assertEquals(stringInput, config.getStringInput("Config.C"));
+    assertEquals(enumInput, config.getEnumInput("Config.D"));
+  }
+}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/8362c73c/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
new file mode 100644
index 0000000..9b60055
--- /dev/null
+++ b/common/src/test/java/org/apache/sqoop/model/TestMConfigList.java
@@ -0,0 +1,55 @@
+/**
+ * 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.junit.Test;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class TestMConfigList {
+  @Test
+  public void testGetInputs() {
+    List<MConfig> configs = new LinkedList<MConfig>();
+
+    MIntegerInput intInput = new MIntegerInput("Config1.A", false);
+    MMapInput mapInput = new MMapInput("Config1.B", false);
+
+    List<MInput<?>> inputs = new ArrayList<MInput<?>>();
+    inputs.add(intInput);
+    inputs.add(mapInput);
+    configs.add(new MConfig("Config1", inputs));
+
+    MStringInput stringInput = new MStringInput("Config2.C", false, (short)3);
+    MEnumInput enumInput = new MEnumInput("Config2.D", false, new String[] {"I", "V"});
+
+    inputs = new ArrayList<MInput<?>>();
+    inputs.add(stringInput);
+    inputs.add(enumInput);
+    configs.add(new MConfig("Config2", inputs));
+
+    MConfigList config = new MConfigList(configs);
+    assertEquals(intInput, config.getIntegerInput("Config1.A"));
+    assertEquals(mapInput, config.getMapInput("Config1.B"));
+    assertEquals(stringInput, config.getStringInput("Config2.C"));
+    assertEquals(enumInput, config.getEnumInput("Config2.D"));
+  }
+}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/8362c73c/common/src/test/java/org/apache/sqoop/model/TestMConnectionForms.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/model/TestMConnectionForms.java b/common/src/test/java/org/apache/sqoop/model/TestMConnectionForms.java
deleted file mode 100644
index 243fff9..0000000
--- a/common/src/test/java/org/apache/sqoop/model/TestMConnectionForms.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * 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 java.util.ArrayList;
-import java.util.List;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * Test class for org.apache.sqoop.model.MConnectionForms
- */
-public class TestMConnectionForms {
-
-  /**
-   * Test for class initialization and values
-   */
-  @Test
-  public void testInitialization() {
-    List<MForm> forms = new ArrayList<MForm>();
-    MConnectionForms connectionForms1 = new MConnectionForms(forms);
-    List<MForm> testForms = new ArrayList<MForm>();
-    assertEquals(testForms, connectionForms1.getForms());
-    MConnectionForms connectionForms2 = new MConnectionForms(testForms);
-    assertEquals(connectionForms2, connectionForms1);
-    // Add a form to list for checking not equals
-    MForm m = new MForm("test", null);
-    testForms.add(m);
-    assertFalse(connectionForms1.equals(connectionForms2));
-  }
-}