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 05:07:08 UTC

[16/50] [abbrv] SQOOP-1497: Sqoop2: Entity Nomenclature Revisited

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/common/src/test/java/org/apache/sqoop/json/TestConnectionBean.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/json/TestConnectionBean.java b/common/src/test/java/org/apache/sqoop/json/TestConnectionBean.java
deleted file mode 100644
index 19f81a8..0000000
--- a/common/src/test/java/org/apache/sqoop/json/TestConnectionBean.java
+++ /dev/null
@@ -1,138 +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.MConnection;
-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 junit.framework.Assert.*;
-import static org.apache.sqoop.json.TestUtil.*;
-
-/**
- *
- */
-public class TestConnectionBean {
-  @Test
-  public void testSerialization() {
-    Date created = new Date();
-    Date updated = new Date();
-    MConnection connection = getConnection("ahoj");
-    connection.setName("Connection");
-    connection.setPersistenceId(666);
-    connection.setCreationUser("admin");
-    connection.setCreationDate(created);
-    connection.setLastUpdateUser("user");
-    connection.setLastUpdateDate(updated);
-    connection.setEnabled(false);
-
-    // Fill some data at the beginning
-    MStringInput input = (MStringInput) connection.getConnectorPart().getForms()
-      .get(0).getInputs().get(0);
-    input.setValue("Hi there!");
-
-    // Serialize it to JSON object
-    ConnectionBean bean = new ConnectionBean(connection);
-    JSONObject json = bean.extract(false);
-
-    // Check for sensitivity
-    JSONArray all = (JSONArray)json.get("all");
-    JSONObject allItem = (JSONObject)all.get(0);
-    JSONArray connectors = (JSONArray)allItem.get("connector");
-    JSONObject connector = (JSONObject)connectors.get(0);
-    JSONArray inputs = (JSONArray)connector.get("inputs");
-    for (Object input1 : inputs) {
-      assertTrue(((JSONObject)input1).containsKey("sensitive"));
-    }
-
-    // "Move" it across network in text form
-    String string = json.toJSONString();
-
-    // Retrieved transferred object
-    JSONObject retrievedJson = (JSONObject) JSONValue.parse(string);
-    ConnectionBean retrievedBean = new ConnectionBean();
-    retrievedBean.restore(retrievedJson);
-    MConnection target = retrievedBean.getConnections().get(0);
-
-    // Check id and name
-    assertEquals(666, target.getPersistenceId());
-    assertEquals("Connection", target.getName());
-    assertEquals("admin", target.getCreationUser());
-    assertEquals(created, target.getCreationDate());
-    assertEquals("user", target.getLastUpdateUser());
-    assertEquals(updated, target.getLastUpdateDate());
-    assertEquals(false, target.getEnabled());
-
-    // Test that value was correctly moved
-    MStringInput targetInput = (MStringInput) target.getConnectorPart()
-      .getForms().get(0).getInputs().get(0);
-    assertEquals("Hi there!", targetInput.getValue());
-  }
-
-  @Test
-  public void testSensitivityFilter() {
-    Date created = new Date();
-    Date updated = new Date();
-    MConnection connection = getConnection("ahoj");
-    connection.setName("Connection");
-    connection.setPersistenceId(666);
-    connection.setCreationUser("admin");
-    connection.setCreationDate(created);
-    connection.setLastUpdateUser("user");
-    connection.setLastUpdateDate(updated);
-    connection.setEnabled(true);
-
-    // Fill some data at the beginning
-    MStringInput input = (MStringInput) connection.getConnectorPart().getForms()
-      .get(0).getInputs().get(0);
-    input.setValue("Hi there!");
-
-    // Serialize it to JSON object
-    ConnectionBean bean = new ConnectionBean(connection);
-    JSONObject json = bean.extract(false);
-    JSONObject jsonFiltered = bean.extract(true);
-
-    // Sensitive values should exist
-    JSONArray all = (JSONArray)json.get("all");
-    JSONObject allItem = (JSONObject)all.get(0);
-    JSONArray connectors = (JSONArray)allItem.get("connector");
-    JSONObject connector = (JSONObject)connectors.get(0);
-    JSONArray inputs = (JSONArray)connector.get("inputs");
-    assertEquals(3, inputs.size());
-    // Inputs are ordered when creating connection
-    JSONObject password = (JSONObject)inputs.get(2);
-    assertTrue(password.containsKey("value"));
-
-    // Sensitive values should not exist
-    all = (JSONArray)jsonFiltered.get("all");
-    allItem = (JSONObject)all.get(0);
-    connectors = (JSONArray)allItem.get("connector");
-    connector = (JSONObject)connectors.get(0);
-    inputs = (JSONArray)connector.get("inputs");
-    assertEquals(3, inputs.size());
-    // Inputs are ordered when creating connection
-    password = (JSONObject)inputs.get(2);
-    assertFalse(password.containsKey("value"));
-  }
-}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/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
new file mode 100644
index 0000000..4309f10
--- /dev/null
+++ b/common/src/test/java/org/apache/sqoop/json/TestDriverConfigBean.java
@@ -0,0 +1,64 @@
+/**
+ * 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/049994a0/common/src/test/java/org/apache/sqoop/json/TestFrameworkBean.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/json/TestFrameworkBean.java b/common/src/test/java/org/apache/sqoop/json/TestFrameworkBean.java
deleted file mode 100644
index 5cc110a..0000000
--- a/common/src/test/java/org/apache/sqoop/json/TestFrameworkBean.java
+++ /dev/null
@@ -1,64 +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.MFramework;
-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 TestFrameworkBean {
-
-  /**
-   * Test that by JSON serialization followed by deserialization we will get
-   * equal framework object.
-   */
-  @Test
-  public void testSerialization() {
-    MFramework framework = getFramework();
-
-    // Serialize it to JSON object
-    FrameworkBean bean = new FrameworkBean(framework, 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);
-    FrameworkBean retrievedBean = new FrameworkBean();
-    retrievedBean.restore(retrievedJson);
-
-    assertEquals(framework, retrievedBean.getFramework());
-
-    ResourceBundle retrievedBundle = retrievedBean.getResourceBundle();
-    assertEquals("a", retrievedBundle.getString("a"));
-    assertEquals("b", retrievedBundle.getString("b"));
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/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 3106d39..c6461bf 100644
--- a/common/src/test/java/org/apache/sqoop/json/TestJobBean.java
+++ b/common/src/test/java/org/apache/sqoop/json/TestJobBean.java
@@ -68,8 +68,8 @@ public class TestJobBean {
 
     // Check id and name
     assertEquals(666, target.getPersistenceId());
-    assertEquals(target.getConnectionId(Direction.FROM), 1);
-    assertEquals(target.getConnectionId(Direction.TO), 2);
+    assertEquals(target.getLinkId(Direction.FROM), 1);
+    assertEquals(target.getLinkId(Direction.TO), 2);
     assertEquals(target.getConnectorId(Direction.FROM), 1);
     assertEquals(target.getConnectorId(Direction.TO), 2);
     assertEquals("The big job", target.getName());

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/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
new file mode 100644
index 0000000..8235275
--- /dev/null
+++ b/common/src/test/java/org/apache/sqoop/json/TestLinkBean.java
@@ -0,0 +1,138 @@
+/**
+ * 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.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 junit.framework.Assert.*;
+import static org.apache.sqoop.json.TestUtil.*;
+
+/**
+ *
+ */
+public class TestLinkBean {
+  @Test
+  public void testSerialization() {
+    Date created = new Date();
+    Date updated = new Date();
+    MLink link = getLink("ahoj");
+    link.setName("Connection");
+    link.setPersistenceId(666);
+    link.setCreationUser("admin");
+    link.setCreationDate(created);
+    link.setLastUpdateUser("user");
+    link.setLastUpdateDate(updated);
+    link.setEnabled(false);
+
+    // Fill some data at the beginning
+    MStringInput input = (MStringInput) link.getConnectorPart().getForms()
+      .get(0).getInputs().get(0);
+    input.setValue("Hi there!");
+
+    // Serialize it to JSON object
+    LinkBean bean = new LinkBean(link);
+    JSONObject json = bean.extract(false);
+
+    // Check for sensitivity
+    JSONArray all = (JSONArray)json.get("all");
+    JSONObject allItem = (JSONObject)all.get(0);
+    JSONArray connectors = (JSONArray)allItem.get("connector");
+    JSONObject connector = (JSONObject)connectors.get(0);
+    JSONArray inputs = (JSONArray)connector.get("inputs");
+    for (Object input1 : inputs) {
+      assertTrue(((JSONObject)input1).containsKey("sensitive"));
+    }
+
+    // "Move" it across network in text form
+    String string = json.toJSONString();
+
+    // Retrieved transferred object
+    JSONObject retrievedJson = (JSONObject) JSONValue.parse(string);
+    LinkBean retrievedBean = new LinkBean();
+    retrievedBean.restore(retrievedJson);
+    MLink target = retrievedBean.getLinks().get(0);
+
+    // Check id and name
+    assertEquals(666, target.getPersistenceId());
+    assertEquals("Connection", target.getName());
+    assertEquals("admin", target.getCreationUser());
+    assertEquals(created, target.getCreationDate());
+    assertEquals("user", target.getLastUpdateUser());
+    assertEquals(updated, target.getLastUpdateDate());
+    assertEquals(false, target.getEnabled());
+
+    // Test that value was correctly moved
+    MStringInput targetInput = (MStringInput) target.getConnectorPart()
+      .getForms().get(0).getInputs().get(0);
+    assertEquals("Hi there!", targetInput.getValue());
+  }
+
+  @Test
+  public void testSensitivityFilter() {
+    Date created = new Date();
+    Date updated = new Date();
+    MLink link = getLink("ahoj");
+    link.setName("Connection");
+    link.setPersistenceId(666);
+    link.setCreationUser("admin");
+    link.setCreationDate(created);
+    link.setLastUpdateUser("user");
+    link.setLastUpdateDate(updated);
+    link.setEnabled(true);
+
+    // Fill some data at the beginning
+    MStringInput input = (MStringInput) link.getConnectorPart().getForms()
+      .get(0).getInputs().get(0);
+    input.setValue("Hi there!");
+
+    // Serialize it to JSON object
+    LinkBean bean = new LinkBean(link);
+    JSONObject json = bean.extract(false);
+    JSONObject jsonFiltered = bean.extract(true);
+
+    // Sensitive values should exist
+    JSONArray all = (JSONArray)json.get("all");
+    JSONObject allItem = (JSONObject)all.get(0);
+    JSONArray connectors = (JSONArray)allItem.get("connector");
+    JSONObject connector = (JSONObject)connectors.get(0);
+    JSONArray inputs = (JSONArray)connector.get("inputs");
+    assertEquals(3, inputs.size());
+    // Inputs are ordered when creating link
+    JSONObject password = (JSONObject)inputs.get(2);
+    assertTrue(password.containsKey("value"));
+
+    // Sensitive values should not exist
+    all = (JSONArray)jsonFiltered.get("all");
+    allItem = (JSONObject)all.get(0);
+    connectors = (JSONArray)allItem.get("connector");
+    connector = (JSONObject)connectors.get(0);
+    inputs = (JSONArray)connector.get("inputs");
+    assertEquals(3, inputs.size());
+    // Inputs are ordered when creating link
+    password = (JSONObject)inputs.get(2);
+    assertFalse(password.containsKey("value"));
+  }
+}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/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
index a9aa233..eaf9122 100644
--- a/common/src/test/java/org/apache/sqoop/json/TestUtil.java
+++ b/common/src/test/java/org/apache/sqoop/json/TestUtil.java
@@ -18,11 +18,11 @@
 package org.apache.sqoop.json;
 
 import org.apache.sqoop.common.Direction;
-import org.apache.sqoop.model.MConnection;
+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.MFramework;
+import org.apache.sqoop.model.MDriverConfig;
 import org.apache.sqoop.model.MInput;
 import org.apache.sqoop.model.MJob;
 import org.apache.sqoop.model.MJobForms;
@@ -44,23 +44,18 @@ public class TestUtil {
       getConnectionForms(), getJobForms(), getJobForms());
   }
 
-  public static MFramework getFramework() {
-    return new MFramework(getConnectionForms(), getJobForms(), "1");
+  public static MDriverConfig getDriverConfig() {
+    return new MDriverConfig(getConnectionForms(), getJobForms(), "1");
   }
 
-  public static MConnection getConnection(String name) {
-    return new MConnection(1,
-                           getConnector(name).getConnectionForms(),
-                           getFramework().getConnectionForms()
-    );
+  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),
-                    getFramework().getJobForms()
-    );
+    return new MJob(1, 2, 1, 2, getConnector(name).getJobForms(Direction.FROM), getConnector(name)
+        .getJobForms(Direction.TO), getDriverConfig().getJobForms());
   }
 
   public static MConnectionForms getConnectionForms() {

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/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 c6086dd..f5f3389 100644
--- a/common/src/test/java/org/apache/sqoop/json/TestValidationBean.java
+++ b/common/src/test/java/org/apache/sqoop/json/TestValidationBean.java
@@ -102,9 +102,9 @@ public class TestValidationBean {
   }
 
   @Test
-  public void testConnectionValidationBeanSerialization() {
+  public void testLinkValidationBeanSerialization() {
     // Serialize it to JSON object
-    ConnectionValidationBean bean = new ConnectionValidationBean(
+    LinkValidationBean bean = new LinkValidationBean(
         getValidation(Status.FINE),
         getValidation(Status.UNACCEPTABLE)
     );
@@ -115,7 +115,7 @@ public class TestValidationBean {
 
     // Retrieved transferred object
     JSONObject retrievedJson = (JSONObject) JSONValue.parse(string);
-    ConnectionValidationBean retrievedBean = new ConnectionValidationBean();
+    LinkValidationBean retrievedBean = new LinkValidationBean();
     retrievedBean.restore(retrievedJson);
 
     assertNull(retrievedBean.getId());
@@ -139,9 +139,9 @@ public class TestValidationBean {
   }
 
   @Test
-  public void testConnectionValidationBeanId() {
+  public void testLinkValidationBeanId() {
     // Serialize it to JSON object
-    ConnectionValidationBean bean = new ConnectionValidationBean(
+    LinkValidationBean bean = new LinkValidationBean(
         getValidation(Status.FINE),
         getValidation(Status.FINE)
     );
@@ -153,7 +153,7 @@ public class TestValidationBean {
 
     // Retrieved transferred object
     JSONObject retrievedJson = (JSONObject) JSONValue.parse(string);
-    ConnectionValidationBean retrievedBean = new ConnectionValidationBean();
+    LinkValidationBean retrievedBean = new LinkValidationBean();
     retrievedBean.restore(retrievedJson);
 
     assertEquals((Long)(long) 10, retrievedBean.getId());

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/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 f3d4166..d56e165 100644
--- a/common/src/test/java/org/apache/sqoop/model/TestMAccountableEntity.java
+++ b/common/src/test/java/org/apache/sqoop/model/TestMAccountableEntity.java
@@ -41,21 +41,21 @@ public class TestMAccountableEntity {
     list.add(input);
     MForm form = new MForm("FORMNAME", list);
     forms.add(form);
-    MAccountableEntity connection = new MConnection(123l, new MConnectionForms(
+    MAccountableEntity link = new MLink(123l, new MConnectionForms(
         forms), new MConnectionForms(forms));
     // Initially creation date and last update date is same
-    assertEquals(connection.getCreationDate(), connection.getLastUpdateDate());
+    assertEquals(link.getCreationDate(), link.getLastUpdateDate());
     Date testCreationDate = new Date();
     Date testLastUpdateDate = new Date();
-    connection.setCreationUser("admin");
-    connection.setCreationDate(testCreationDate);
-    connection.setLastUpdateUser("user");
-    connection.setLastUpdateDate(testLastUpdateDate);
-    connection.setEnabled(false);
-    assertEquals(testCreationDate, connection.getCreationDate());
-    assertEquals("admin", connection.getCreationUser());
-    assertEquals(testLastUpdateDate, connection.getLastUpdateDate());
-    assertEquals(false, connection.getEnabled());
-    assertEquals("user", connection.getLastUpdateUser());
+    link.setCreationUser("admin");
+    link.setCreationDate(testCreationDate);
+    link.setLastUpdateUser("user");
+    link.setLastUpdateDate(testLastUpdateDate);
+    link.setEnabled(false);
+    assertEquals(testCreationDate, link.getCreationDate());
+    assertEquals("admin", link.getCreationUser());
+    assertEquals(testLastUpdateDate, link.getLastUpdateDate());
+    assertEquals(false, link.getEnabled());
+    assertEquals("user", link.getLastUpdateUser());
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/common/src/test/java/org/apache/sqoop/model/TestMConnection.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/model/TestMConnection.java b/common/src/test/java/org/apache/sqoop/model/TestMConnection.java
deleted file mode 100644
index 27959fb..0000000
--- a/common/src/test/java/org/apache/sqoop/model/TestMConnection.java
+++ /dev/null
@@ -1,122 +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 static org.junit.Assert.*;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.junit.Test;
-
-/**
- * Test class for org.apache.sqoop.model.MConnection
- */
-public class TestMConnection {
-
-  /**
-   * Test for initialization
-   */
-  @Test
-  public void testInitialization() {
-    // Test default constructor
-    MConnection connection = connection();
-    assertEquals(123l, connection.getConnectorId());
-    assertEquals("Vampire", connection.getName());
-    assertEquals("Buffy", connection.getCreationUser());
-    assertEquals(forms1(), connection.getConnectorPart());
-    assertEquals(forms2(), connection.getFrameworkPart());
-
-    // Test copy constructor
-    MConnection copy = new MConnection(connection);
-    assertEquals(123l, copy.getConnectorId());
-    assertEquals("Vampire", copy.getName());
-    assertEquals("Buffy", copy.getCreationUser());
-    assertEquals(connection.getCreationDate(), copy.getCreationDate());
-    assertEquals(forms1(), copy.getConnectorPart());
-    assertEquals(forms2(), copy.getFrameworkPart());
-
-    // Test constructor for metadata upgrade (the order of forms is different)
-    MConnection upgradeCopy = new MConnection(connection, forms2(), forms1());
-    assertEquals(123l, upgradeCopy.getConnectorId());
-    assertEquals("Vampire", upgradeCopy.getName());
-    assertEquals("Buffy", upgradeCopy.getCreationUser());
-    assertEquals(connection.getCreationDate(), upgradeCopy.getCreationDate());
-    assertEquals(forms2(), upgradeCopy.getConnectorPart());
-    assertEquals(forms1(), upgradeCopy.getFrameworkPart());
-  }
-
-  @Test
-  public void testClone() {
-    MConnection connection = connection();
-
-    // Clone without value
-    MConnection withoutValue = connection.clone(false);
-    assertEquals(connection, withoutValue);
-    assertEquals(MPersistableEntity.PERSISTANCE_ID_DEFAULT, withoutValue.getPersistenceId());
-    assertNull(withoutValue.getName());
-    assertNull(withoutValue.getCreationUser());
-    assertEquals(forms1(), withoutValue.getConnectorPart());
-    assertEquals(forms2(), withoutValue.getFrameworkPart());
-    assertNull(withoutValue.getConnectorPart().getForm("FORMNAME").getInput("INTEGER-INPUT").getValue());
-    assertNull(withoutValue.getConnectorPart().getForm("FORMNAME").getInput("STRING-INPUT").getValue());
-
-    // Clone with value
-    MConnection withValue = connection.clone(true);
-    assertEquals(connection, withValue);
-    assertEquals(connection.getPersistenceId(), withValue.getPersistenceId());
-    assertEquals(connection.getName(), withValue.getName());
-    assertEquals(connection.getCreationUser(), withValue.getCreationUser());
-    assertEquals(forms1(), withValue.getConnectorPart());
-    assertEquals(forms2(), withValue.getFrameworkPart());
-    assertEquals(100, withValue.getConnectorPart().getForm("FORMNAME").getInput("INTEGER-INPUT").getValue());
-    assertEquals("TEST-VALUE", withValue.getConnectorPart().getForm("FORMNAME").getInput("STRING-INPUT").getValue());
-  }
-
-  private MConnection connection() {
-    MConnection connection = new MConnection(123l, forms1(), forms2());
-    connection.setName("Vampire");
-    connection.setCreationUser("Buffy");
-    return connection;
-  }
-
-  private MConnectionForms forms1() {
-    List<MForm> forms = new ArrayList<MForm>();
-    MIntegerInput input = new MIntegerInput("INTEGER-INPUT", false);
-    input.setValue(100);
-    MStringInput strInput = new MStringInput("STRING-INPUT",false,(short)20);
-    strInput.setValue("TEST-VALUE");
-    List<MInput<?>> list = new ArrayList<MInput<?>>();
-    list.add(input);
-    list.add(strInput);
-    MForm form = new MForm("FORMNAME", list);
-    forms.add(form);
-    return new MConnectionForms(forms);
-  }
-
-  private MConnectionForms forms2() {
-    List<MForm> forms = new ArrayList<MForm>();
-    MMapInput input = new MMapInput("MAP-INPUT", false);
-    List<MInput<?>> list = new ArrayList<MInput<?>>();
-    list.add(input);
-    MForm form = new MForm("form", list);
-    forms.add(form);
-    return new MConnectionForms(forms);
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/common/src/test/java/org/apache/sqoop/model/TestMDriverConfig.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/model/TestMDriverConfig.java b/common/src/test/java/org/apache/sqoop/model/TestMDriverConfig.java
new file mode 100644
index 0000000..9c23cc3
--- /dev/null
+++ b/common/src/test/java/org/apache/sqoop/model/TestMDriverConfig.java
@@ -0,0 +1,47 @@
+/**
+ * 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.List;
+
+import static org.junit.Assert.*;
+
+/**
+ *
+ */
+public class TestMDriverConfig {
+
+  @Test
+  public void testForms() {
+    List<MForm> connectionFormList = new ArrayList<MForm>();
+    List<MForm> jobFormList = new ArrayList<MForm>();
+    connectionFormList.add(new MForm("connection-test", new ArrayList<MInput<?>>()));
+    jobFormList.add(new MForm("job-test", new ArrayList<MInput<?>>()));
+    MConnectionForms connectionForms = new MConnectionForms(connectionFormList);
+    MJobForms jobForms = new MJobForms(jobFormList);
+
+    MDriverConfig driver = new MDriverConfig(connectionForms, jobForms, "1");
+    assertEquals(1, driver.getJobForms().getForms().size());
+    assertEquals("job-test", driver.getJobForms().getForms().get(0).getName());
+    assertEquals(1, driver.getConnectionForms().getForms().size());
+    assertEquals("connection-test", driver.getConnectionForms().getForms().get(0).getName());
+  }
+}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/common/src/test/java/org/apache/sqoop/model/TestMFramework.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/model/TestMFramework.java b/common/src/test/java/org/apache/sqoop/model/TestMFramework.java
deleted file mode 100644
index 5273a90..0000000
--- a/common/src/test/java/org/apache/sqoop/model/TestMFramework.java
+++ /dev/null
@@ -1,47 +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.junit.Test;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.junit.Assert.*;
-
-/**
- *
- */
-public class TestMFramework {
-
-  @Test
-  public void testForms() {
-    List<MForm> connectionFormList = new ArrayList<MForm>();
-    List<MForm> jobFormList = new ArrayList<MForm>();
-    connectionFormList.add(new MForm("connection-test", new ArrayList<MInput<?>>()));
-    jobFormList.add(new MForm("job-test", new ArrayList<MInput<?>>()));
-    MConnectionForms connectionForms = new MConnectionForms(connectionFormList);
-    MJobForms jobForms = new MJobForms(jobFormList);
-
-    MFramework framework = new MFramework(connectionForms, jobForms, "1");
-    assertEquals(1, framework.getJobForms().getForms().size());
-    assertEquals("job-test", framework.getJobForms().getForms().get(0).getName());
-    assertEquals(1, framework.getConnectionForms().getForms().size());
-    assertEquals("connection-test", framework.getConnectionForms().getForms().get(0).getName());
-  }
-}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/common/src/test/java/org/apache/sqoop/model/TestMLink.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/model/TestMLink.java b/common/src/test/java/org/apache/sqoop/model/TestMLink.java
new file mode 100644
index 0000000..1be37a1
--- /dev/null
+++ b/common/src/test/java/org/apache/sqoop/model/TestMLink.java
@@ -0,0 +1,122 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sqoop.model;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+
+/**
+ * Test class for org.apache.sqoop.model.MConnection
+ */
+public class TestMLink {
+
+  /**
+   * Test for initialization
+   */
+  @Test
+  public void testInitialization() {
+    // Test default constructor
+    MLink link = link();
+    assertEquals(123l, link.getConnectorId());
+    assertEquals("Vampire", link.getName());
+    assertEquals("Buffy", link.getCreationUser());
+    assertEquals(forms1(), link.getConnectorPart());
+    assertEquals(forms2(), link.getFrameworkPart());
+
+    // Test copy constructor
+    MLink copy = new MLink(link);
+    assertEquals(123l, copy.getConnectorId());
+    assertEquals("Vampire", copy.getName());
+    assertEquals("Buffy", copy.getCreationUser());
+    assertEquals(link.getCreationDate(), copy.getCreationDate());
+    assertEquals(forms1(), copy.getConnectorPart());
+    assertEquals(forms2(), copy.getFrameworkPart());
+
+    // Test constructor for metadata upgrade (the order of forms is different)
+    MLink upgradeCopy = new MLink(link, forms2(), forms1());
+    assertEquals(123l, upgradeCopy.getConnectorId());
+    assertEquals("Vampire", upgradeCopy.getName());
+    assertEquals("Buffy", upgradeCopy.getCreationUser());
+    assertEquals(link.getCreationDate(), upgradeCopy.getCreationDate());
+    assertEquals(forms2(), upgradeCopy.getConnectorPart());
+    assertEquals(forms1(), upgradeCopy.getFrameworkPart());
+  }
+
+  @Test
+  public void testClone() {
+    MLink link = link();
+
+    // Clone without value
+    MLink withoutValue = link.clone(false);
+    assertEquals(link, withoutValue);
+    assertEquals(MPersistableEntity.PERSISTANCE_ID_DEFAULT, withoutValue.getPersistenceId());
+    assertNull(withoutValue.getName());
+    assertNull(withoutValue.getCreationUser());
+    assertEquals(forms1(), withoutValue.getConnectorPart());
+    assertEquals(forms2(), withoutValue.getFrameworkPart());
+    assertNull(withoutValue.getConnectorPart().getForm("FORMNAME").getInput("INTEGER-INPUT").getValue());
+    assertNull(withoutValue.getConnectorPart().getForm("FORMNAME").getInput("STRING-INPUT").getValue());
+
+    // Clone with value
+    MLink withValue = link.clone(true);
+    assertEquals(link, withValue);
+    assertEquals(link.getPersistenceId(), withValue.getPersistenceId());
+    assertEquals(link.getName(), withValue.getName());
+    assertEquals(link.getCreationUser(), withValue.getCreationUser());
+    assertEquals(forms1(), withValue.getConnectorPart());
+    assertEquals(forms2(), withValue.getFrameworkPart());
+    assertEquals(100, withValue.getConnectorPart().getForm("FORMNAME").getInput("INTEGER-INPUT").getValue());
+    assertEquals("TEST-VALUE", withValue.getConnectorPart().getForm("FORMNAME").getInput("STRING-INPUT").getValue());
+  }
+
+  private MLink link() {
+    MLink link = new MLink(123l, forms1(), forms2());
+    link.setName("Vampire");
+    link.setCreationUser("Buffy");
+    return link;
+  }
+
+  private MConnectionForms forms1() {
+    List<MForm> forms = new ArrayList<MForm>();
+    MIntegerInput input = new MIntegerInput("INTEGER-INPUT", false);
+    input.setValue(100);
+    MStringInput strInput = new MStringInput("STRING-INPUT",false,(short)20);
+    strInput.setValue("TEST-VALUE");
+    List<MInput<?>> list = new ArrayList<MInput<?>>();
+    list.add(input);
+    list.add(strInput);
+    MForm form = new MForm("FORMNAME", list);
+    forms.add(form);
+    return new MConnectionForms(forms);
+  }
+
+  private MConnectionForms forms2() {
+    List<MForm> forms = new ArrayList<MForm>();
+    MMapInput input = new MMapInput("MAP-INPUT", false);
+    List<MInput<?>> list = new ArrayList<MInput<?>>();
+    list.add(input);
+    MForm form = new MForm("form", list);
+    forms.add(form);
+    return new MConnectionForms(forms);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnector.java
----------------------------------------------------------------------
diff --git a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnector.java b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnector.java
index 3790daa..b4b6966 100644
--- a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnector.java
+++ b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnector.java
@@ -22,10 +22,10 @@ import java.util.ResourceBundle;
 
 import org.apache.sqoop.common.Direction;
 import org.apache.sqoop.common.VersionInfo;
-import org.apache.sqoop.connector.jdbc.configuration.ConnectionConfiguration;
+import org.apache.sqoop.connector.jdbc.configuration.LinkConfiguration;
 import org.apache.sqoop.connector.jdbc.configuration.FromJobConfiguration;
 import org.apache.sqoop.connector.jdbc.configuration.ToJobConfiguration;
-import org.apache.sqoop.connector.spi.MetadataUpgrader;
+import org.apache.sqoop.connector.spi.RepositoryUpgrader;
 import org.apache.sqoop.job.etl.From;
 import org.apache.sqoop.job.etl.To;
 import org.apache.sqoop.connector.spi.SqoopConnector;
@@ -65,8 +65,8 @@ public class GenericJdbcConnector extends SqoopConnector {
   }
 
   @Override
-  public Class getConnectionConfigurationClass() {
-    return ConnectionConfiguration.class;
+  public Class getLinkConfigurationClass() {
+    return LinkConfiguration.class;
   }
 
   @Override
@@ -97,8 +97,8 @@ public class GenericJdbcConnector extends SqoopConnector {
   }
 
   @Override
-  public MetadataUpgrader getMetadataUpgrader() {
-    return new GenericJdbcConnectorMetadataUpgrader();
+  public RepositoryUpgrader getRepositoryUpgrader() {
+    return new GenericJdbcConnectorUpgrader();
   }
 
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnectorConstants.java
----------------------------------------------------------------------
diff --git a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnectorConstants.java b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnectorConstants.java
index 62da2db..f63f013 100644
--- a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnectorConstants.java
+++ b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnectorConstants.java
@@ -24,7 +24,7 @@ public final class GenericJdbcConnectorConstants {
 
   // Resource bundle name
   public static final String RESOURCE_BUNDLE_NAME =
-      "generic-jdbc-connector-resources";
+      "generic-jdbc-connector-config";
 
   /*
    * All jdbc connector related configuration is prefixed with this:

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnectorMetadataUpgrader.java
----------------------------------------------------------------------
diff --git a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnectorMetadataUpgrader.java b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnectorMetadataUpgrader.java
deleted file mode 100644
index cbe72f6..0000000
--- a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnectorMetadataUpgrader.java
+++ /dev/null
@@ -1,83 +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.connector.jdbc;
-
-import org.apache.log4j.Logger;
-import org.apache.sqoop.common.SqoopException;
-import org.apache.sqoop.connector.spi.MetadataUpgrader;
-import org.apache.sqoop.model.MConnectionForms;
-import org.apache.sqoop.model.MForm;
-import org.apache.sqoop.model.MInput;
-import org.apache.sqoop.model.MJobForms;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class GenericJdbcConnectorMetadataUpgrader extends MetadataUpgrader {
-  private static final Logger LOG =
-    Logger.getLogger(GenericJdbcConnectorMetadataUpgrader.class);
-
-  /*
-   * For now, there is no real upgrade. So copy all data over,
-   * set the validation messages and error messages to be the same as for the
-   * inputs in the original one.
-   */
-
-  @Override
-  public void upgrade(MConnectionForms original,
-    MConnectionForms upgradeTarget) {
-    doUpgrade(original.getForms(), upgradeTarget.getForms());
-  }
-
-  @Override
-  public void upgrade(MJobForms original, MJobForms upgradeTarget) {
-    doUpgrade(original.getForms(), upgradeTarget.getForms());
-  }
-
-  @SuppressWarnings("unchecked")
-  private void doUpgrade(List<MForm> original, List<MForm> target) {
-    // Easier to find the form in the original forms list if we use a map.
-    // Since the constructor of MJobForms takes a list,
-    // index is not guaranteed to be the same, so we need to look for
-    // equivalence
-    Map<String, MForm> formMap = new HashMap<String, MForm>();
-    for (MForm form : original) {
-      formMap.put(form.getName(), form);
-    }
-    for (MForm form : target) {
-      List<MInput<?>> inputs = form.getInputs();
-      MForm originalForm = formMap.get(form.getName());
-      if (originalForm == null) {
-        LOG.warn("Form: '" + form.getName() + "' not present in old " +
-            "connector. So it and its inputs will not be transferred by the upgrader.");
-        continue;
-      }
-      for (MInput input : inputs) {
-        try {
-          MInput originalInput = originalForm.getInput(input.getName());
-          input.setValue(originalInput.getValue());
-        } catch (SqoopException ex) {
-          LOG.warn("Input: '" + input.getName() + "' not present in old " +
-            "connector. So it will not be transferred by the upgrader.");
-        }
-      }
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnectorUpgrader.java
----------------------------------------------------------------------
diff --git a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnectorUpgrader.java b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnectorUpgrader.java
new file mode 100644
index 0000000..8deddb0
--- /dev/null
+++ b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnectorUpgrader.java
@@ -0,0 +1,83 @@
+/*
+ * 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.connector.jdbc;
+
+import org.apache.log4j.Logger;
+import org.apache.sqoop.common.SqoopException;
+import org.apache.sqoop.connector.spi.RepositoryUpgrader;
+import org.apache.sqoop.model.MConnectionForms;
+import org.apache.sqoop.model.MForm;
+import org.apache.sqoop.model.MInput;
+import org.apache.sqoop.model.MJobForms;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class GenericJdbcConnectorUpgrader extends RepositoryUpgrader {
+  private static final Logger LOG =
+    Logger.getLogger(GenericJdbcConnectorUpgrader.class);
+
+  /*
+   * For now, there is no real upgrade. So copy all data over,
+   * set the validation messages and error messages to be the same as for the
+   * inputs in the original one.
+   */
+
+  @Override
+  public void upgrade(MConnectionForms original,
+    MConnectionForms upgradeTarget) {
+    doUpgrade(original.getForms(), upgradeTarget.getForms());
+  }
+
+  @Override
+  public void upgrade(MJobForms original, MJobForms upgradeTarget) {
+    doUpgrade(original.getForms(), upgradeTarget.getForms());
+  }
+
+  @SuppressWarnings("unchecked")
+  private void doUpgrade(List<MForm> original, List<MForm> target) {
+    // Easier to find the form in the original forms list if we use a map.
+    // Since the constructor of MJobForms takes a list,
+    // index is not guaranteed to be the same, so we need to look for
+    // equivalence
+    Map<String, MForm> formMap = new HashMap<String, MForm>();
+    for (MForm form : original) {
+      formMap.put(form.getName(), form);
+    }
+    for (MForm form : target) {
+      List<MInput<?>> inputs = form.getInputs();
+      MForm originalForm = formMap.get(form.getName());
+      if (originalForm == null) {
+        LOG.warn("Form: '" + form.getName() + "' not present in old " +
+            "connector. So it and its inputs will not be transferred by the upgrader.");
+        continue;
+      }
+      for (MInput input : inputs) {
+        try {
+          MInput originalInput = originalForm.getInput(input.getName());
+          input.setValue(originalInput.getValue());
+        } catch (SqoopException ex) {
+          LOG.warn("Input: '" + input.getName() + "' not present in old " +
+            "connector. So it will not be transferred by the upgrader.");
+        }
+      }
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcExtractor.java
----------------------------------------------------------------------
diff --git a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcExtractor.java b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcExtractor.java
index 9915603..e52610a 100644
--- a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcExtractor.java
+++ b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcExtractor.java
@@ -23,22 +23,23 @@ import java.sql.SQLException;
 
 import org.apache.log4j.Logger;
 import org.apache.sqoop.common.SqoopException;
-import org.apache.sqoop.connector.jdbc.configuration.ConnectionConfiguration;
+import org.apache.sqoop.connector.jdbc.configuration.LinkConfiguration;
 import org.apache.sqoop.connector.jdbc.configuration.FromJobConfiguration;
 import org.apache.sqoop.job.etl.ExtractorContext;
 import org.apache.sqoop.job.etl.Extractor;
 
-public class GenericJdbcExtractor extends Extractor<ConnectionConfiguration, FromJobConfiguration, GenericJdbcPartition> {
+public class GenericJdbcExtractor extends Extractor<LinkConfiguration, FromJobConfiguration, GenericJdbcPartition> {
 
  public static final Logger LOG = Logger.getLogger(GenericJdbcExtractor.class);
 
  private long rowsRead = 0;
   @Override
-  public void extract(ExtractorContext context, ConnectionConfiguration connection, FromJobConfiguration job, GenericJdbcPartition partition) {
-    String driver = connection.connection.jdbcDriver;
-    String url = connection.connection.connectionString;
-    String username = connection.connection.username;
-    String password = connection.connection.password;
+  public void extract(ExtractorContext context, LinkConfiguration linkConf,
+      FromJobConfiguration fromJobConf, GenericJdbcPartition partition) {
+    String driver = linkConf.link.jdbcDriver;
+    String url = linkConf.link.connectionString;
+    String username = linkConf.link.username;
+    String password = linkConf.link.password;
     GenericJdbcExecutor executor = new GenericJdbcExecutor(driver, url, username, password);
 
     String query = context.getString(GenericJdbcConnectorConstants.CONNECTOR_JDBC_FROM_DATA_SQL);

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcFromDestroyer.java
----------------------------------------------------------------------
diff --git a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcFromDestroyer.java b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcFromDestroyer.java
index 2df193c..d3a893f 100644
--- a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcFromDestroyer.java
+++ b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcFromDestroyer.java
@@ -18,18 +18,18 @@
 package org.apache.sqoop.connector.jdbc;
 
 import org.apache.log4j.Logger;
-import org.apache.sqoop.connector.jdbc.configuration.ConnectionConfiguration;
+import org.apache.sqoop.connector.jdbc.configuration.LinkConfiguration;
 import org.apache.sqoop.connector.jdbc.configuration.FromJobConfiguration;
 import org.apache.sqoop.job.etl.Destroyer;
 import org.apache.sqoop.job.etl.DestroyerContext;
 
-public class GenericJdbcFromDestroyer extends Destroyer<ConnectionConfiguration, FromJobConfiguration> {
+public class GenericJdbcFromDestroyer extends Destroyer<LinkConfiguration, FromJobConfiguration> {
 
   private static final Logger LOG =
     Logger.getLogger(GenericJdbcFromDestroyer.class);
 
   @Override
-  public void destroy(DestroyerContext context, ConnectionConfiguration connection, FromJobConfiguration job) {
+  public void destroy(DestroyerContext context, LinkConfiguration linkConf, FromJobConfiguration fromJobConf) {
     LOG.info("Running generic JDBC connector destroyer");
   }
 

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcFromInitializer.java
----------------------------------------------------------------------
diff --git a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcFromInitializer.java b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcFromInitializer.java
index 87e0862..9d0c178 100644
--- a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcFromInitializer.java
+++ b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcFromInitializer.java
@@ -27,7 +27,7 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 import org.apache.sqoop.common.MutableContext;
 import org.apache.sqoop.common.SqoopException;
-import org.apache.sqoop.connector.jdbc.configuration.ConnectionConfiguration;
+import org.apache.sqoop.connector.jdbc.configuration.LinkConfiguration;
 import org.apache.sqoop.connector.jdbc.configuration.FromJobConfiguration;
 import org.apache.sqoop.connector.jdbc.util.SqlTypesUtils;
 import org.apache.sqoop.job.Constants;
@@ -37,7 +37,7 @@ import org.apache.sqoop.schema.Schema;
 import org.apache.sqoop.schema.type.Column;
 import org.apache.sqoop.utils.ClassUtils;
 
-public class GenericJdbcFromInitializer extends Initializer<ConnectionConfiguration, FromJobConfiguration> {
+public class GenericJdbcFromInitializer extends Initializer<LinkConfiguration, FromJobConfiguration> {
 
   private static final Logger LOG =
     Logger.getLogger(GenericJdbcFromInitializer.class);
@@ -45,34 +45,34 @@ public class GenericJdbcFromInitializer extends Initializer<ConnectionConfigurat
   private GenericJdbcExecutor executor;
 
   @Override
-  public void initialize(InitializerContext context, ConnectionConfiguration connection, FromJobConfiguration job) {
-    configureJdbcProperties(context.getContext(), connection, job);
+  public void initialize(InitializerContext context, LinkConfiguration linkConf, FromJobConfiguration fromJobConf) {
+    configureJdbcProperties(context.getContext(), linkConf, fromJobConf);
     try {
-      configurePartitionProperties(context.getContext(), connection, job);
-      configureTableProperties(context.getContext(), connection, job);
+      configurePartitionProperties(context.getContext(), linkConf, fromJobConf);
+      configureTableProperties(context.getContext(), linkConf, fromJobConf);
     } finally {
       executor.close();
     }
   }
 
   @Override
-  public List<String> getJars(InitializerContext context, ConnectionConfiguration connection, FromJobConfiguration job) {
+  public List<String> getJars(InitializerContext context, LinkConfiguration linkConf, FromJobConfiguration fromJobConf) {
     List<String> jars = new LinkedList<String>();
 
-    jars.add(ClassUtils.jarForClass(connection.connection.jdbcDriver));
+    jars.add(ClassUtils.jarForClass(linkConf.link.jdbcDriver));
 
     return jars;
   }
 
   @Override
-  public Schema getSchema(InitializerContext context, ConnectionConfiguration connectionConfiguration, FromJobConfiguration fromJobConfiguration) {
-    configureJdbcProperties(context.getContext(), connectionConfiguration, fromJobConfiguration);
+  public Schema getSchema(InitializerContext context, LinkConfiguration linkConf, FromJobConfiguration fromJobConf) {
+    configureJdbcProperties(context.getContext(), linkConf, fromJobConf);
 
-    String schemaName = fromJobConfiguration.fromTable.tableName;
+    String schemaName = fromJobConf.fromJobConfig.tableName;
     if(schemaName == null) {
       schemaName = "Query";
-    } else if(fromJobConfiguration.fromTable.schemaName != null) {
-      schemaName = fromJobConfiguration.fromTable.schemaName + "." + schemaName;
+    } else if(fromJobConf.fromJobConfig.schemaName != null) {
+      schemaName = fromJobConf.fromJobConfig.schemaName + "." + schemaName;
     }
 
     Schema schema = new Schema(schemaName);
@@ -117,11 +117,11 @@ public class GenericJdbcFromInitializer extends Initializer<ConnectionConfigurat
     }
   }
 
-  private void configureJdbcProperties(MutableContext context, ConnectionConfiguration connectionConfig, FromJobConfiguration jobConfig) {
-    String driver = connectionConfig.connection.jdbcDriver;
-    String url = connectionConfig.connection.connectionString;
-    String username = connectionConfig.connection.username;
-    String password = connectionConfig.connection.password;
+  private void configureJdbcProperties(MutableContext context, LinkConfiguration connectionConfig, FromJobConfiguration fromJobConfig) {
+    String driver = connectionConfig.link.jdbcDriver;
+    String url = connectionConfig.link.connectionString;
+    String username = connectionConfig.link.username;
+    String password = connectionConfig.link.password;
 
     assert driver != null;
     assert url != null;
@@ -129,15 +129,15 @@ public class GenericJdbcFromInitializer extends Initializer<ConnectionConfigurat
     executor = new GenericJdbcExecutor(driver, url, username, password);
   }
 
-  private void configurePartitionProperties(MutableContext context, ConnectionConfiguration connectionConfig, FromJobConfiguration jobConfig) {
+  private void configurePartitionProperties(MutableContext context, LinkConfiguration connectionConfig, FromJobConfiguration fromJobConfig) {
     // ----- configure column name -----
 
-    String partitionColumnName = jobConfig.fromTable.partitionColumn;
+    String partitionColumnName = fromJobConfig.fromJobConfig.partitionColumn;
 
     if (partitionColumnName == null) {
       // if column is not specified by the user,
       // find the primary key of the fromTable (when there is a fromTable).
-      String tableName = jobConfig.fromTable.tableName;
+      String tableName = fromJobConfig.fromJobConfig.tableName;
       if (tableName != null) {
         partitionColumnName = executor.getPrimaryKey(tableName);
       }
@@ -155,14 +155,14 @@ public class GenericJdbcFromInitializer extends Initializer<ConnectionConfigurat
 
     // ----- configure column type, min value, and max value -----
 
-    String minMaxQuery = jobConfig.fromTable.boundaryQuery;
+    String minMaxQuery = fromJobConfig.fromJobConfig.boundaryQuery;
 
     if (minMaxQuery == null) {
       StringBuilder builder = new StringBuilder();
 
-      String schemaName = jobConfig.fromTable.schemaName;
-      String tableName = jobConfig.fromTable.tableName;
-      String tableSql = jobConfig.fromTable.sql;
+      String schemaName = fromJobConfig.fromJobConfig.schemaName;
+      String tableName = fromJobConfig.fromJobConfig.tableName;
+      String tableSql = fromJobConfig.fromJobConfig.sql;
 
       if (tableName != null && tableSql != null) {
         // when both fromTable name and fromTable sql are specified:
@@ -234,14 +234,14 @@ public class GenericJdbcFromInitializer extends Initializer<ConnectionConfigurat
     }
   }
 
-  private void configureTableProperties(MutableContext context, ConnectionConfiguration connectionConfig, FromJobConfiguration jobConfig) {
+  private void configureTableProperties(MutableContext context, LinkConfiguration connectionConfig, FromJobConfiguration fromJobConfig) {
     String dataSql;
     String fieldNames;
 
-    String schemaName = jobConfig.fromTable.schemaName;
-    String tableName = jobConfig.fromTable.tableName;
-    String tableSql = jobConfig.fromTable.sql;
-    String tableColumns = jobConfig.fromTable.columns;
+    String schemaName = fromJobConfig.fromJobConfig.schemaName;
+    String tableName = fromJobConfig.fromJobConfig.tableName;
+    String tableSql = fromJobConfig.fromJobConfig.sql;
+    String tableColumns = fromJobConfig.fromJobConfig.columns;
 
     if (tableName != null && tableSql != null) {
       // when both fromTable name and fromTable sql are specified:

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcLoader.java
----------------------------------------------------------------------
diff --git a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcLoader.java b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcLoader.java
index 07ae988..991e686 100644
--- a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcLoader.java
+++ b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcLoader.java
@@ -17,12 +17,12 @@
  */
 package org.apache.sqoop.connector.jdbc;
 
-import org.apache.sqoop.connector.jdbc.configuration.ConnectionConfiguration;
+import org.apache.sqoop.connector.jdbc.configuration.LinkConfiguration;
 import org.apache.sqoop.connector.jdbc.configuration.ToJobConfiguration;
 import org.apache.sqoop.job.etl.Loader;
 import org.apache.sqoop.job.etl.LoaderContext;
 
-public class GenericJdbcLoader extends Loader<ConnectionConfiguration, ToJobConfiguration> {
+public class GenericJdbcLoader extends Loader<LinkConfiguration, ToJobConfiguration> {
 
   public static final int DEFAULT_ROWS_PER_BATCH = 100;
   public static final int DEFAULT_BATCHES_PER_TRANSACTION = 100;
@@ -30,11 +30,11 @@ public class GenericJdbcLoader extends Loader<ConnectionConfiguration, ToJobConf
   private int batchesPerTransaction = DEFAULT_BATCHES_PER_TRANSACTION;
 
   @Override
-  public void load(LoaderContext context, ConnectionConfiguration connection, ToJobConfiguration job) throws Exception{
-    String driver = connection.connection.jdbcDriver;
-    String url = connection.connection.connectionString;
-    String username = connection.connection.username;
-    String password = connection.connection.password;
+  public void load(LoaderContext context, LinkConfiguration linkConf, ToJobConfiguration toJobConf) throws Exception{
+    String driver = linkConf.link.jdbcDriver;
+    String url = linkConf.link.connectionString;
+    String username = linkConf.link.username;
+    String password = linkConf.link.password;
     GenericJdbcExecutor executor = new GenericJdbcExecutor(driver, url, username, password);
     executor.setAutoCommit(false);
 

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcPartitioner.java
----------------------------------------------------------------------
diff --git a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcPartitioner.java b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcPartitioner.java
index a25f344..6b11228 100644
--- a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcPartitioner.java
+++ b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcPartitioner.java
@@ -28,13 +28,13 @@ import java.util.List;
 import java.util.TimeZone;
 
 import org.apache.sqoop.common.SqoopException;
-import org.apache.sqoop.connector.jdbc.configuration.ConnectionConfiguration;
+import org.apache.sqoop.connector.jdbc.configuration.LinkConfiguration;
 import org.apache.sqoop.connector.jdbc.configuration.FromJobConfiguration;
 import org.apache.sqoop.job.etl.Partition;
 import org.apache.sqoop.job.etl.Partitioner;
 import org.apache.sqoop.job.etl.PartitionerContext;
 
-public class GenericJdbcPartitioner extends Partitioner<ConnectionConfiguration, FromJobConfiguration> {
+public class GenericJdbcPartitioner extends Partitioner<LinkConfiguration, FromJobConfiguration> {
 
   private static final BigDecimal NUMERIC_MIN_INCREMENT = new BigDecimal(10000 * Double.MIN_VALUE);
 
@@ -47,7 +47,7 @@ public class GenericJdbcPartitioner extends Partitioner<ConnectionConfiguration,
   private Boolean partitionColumnNull;
 
   @Override
-  public List<Partition> getPartitions(PartitionerContext context,ConnectionConfiguration connection, FromJobConfiguration job) {
+  public List<Partition> getPartitions(PartitionerContext context,LinkConfiguration linkConf, FromJobConfiguration fromJobConf) {
     List<Partition> partitions = new LinkedList<Partition>();
 
     numberPartitions = context.getMaxPartitions();
@@ -56,7 +56,7 @@ public class GenericJdbcPartitioner extends Partitioner<ConnectionConfiguration,
     partitionMinValue = context.getString(GenericJdbcConnectorConstants.CONNECTOR_JDBC_PARTITION_MINVALUE);
     partitionMaxValue = context.getString(GenericJdbcConnectorConstants.CONNECTOR_JDBC_PARTITION_MAXVALUE);
 
-    partitionColumnNull = job.fromTable.partitionColumnNull;
+    partitionColumnNull = fromJobConf.fromJobConfig.partitionColumnNull;
     if (partitionColumnNull == null) {
       partitionColumnNull = false;
     }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcToDestroyer.java
----------------------------------------------------------------------
diff --git a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcToDestroyer.java b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcToDestroyer.java
index 4ba278e..7bed1d9 100644
--- a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcToDestroyer.java
+++ b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcToDestroyer.java
@@ -18,36 +18,36 @@
 package org.apache.sqoop.connector.jdbc;
 
 import org.apache.log4j.Logger;
-import org.apache.sqoop.connector.jdbc.configuration.ConnectionConfiguration;
+import org.apache.sqoop.connector.jdbc.configuration.LinkConfiguration;
 import org.apache.sqoop.connector.jdbc.configuration.ToJobConfiguration;
 import org.apache.sqoop.job.etl.Destroyer;
 import org.apache.sqoop.job.etl.DestroyerContext;
 
-public class GenericJdbcToDestroyer extends Destroyer<ConnectionConfiguration, ToJobConfiguration> {
+public class GenericJdbcToDestroyer extends Destroyer<LinkConfiguration, ToJobConfiguration> {
 
   private static final Logger LOG = Logger.getLogger(GenericJdbcToDestroyer.class);
 
   @Override
-  public void destroy(DestroyerContext context, ConnectionConfiguration connection, ToJobConfiguration job) {
+  public void destroy(DestroyerContext context, LinkConfiguration linkConf, ToJobConfiguration toJobConf) {
     LOG.info("Running generic JDBC connector destroyer");
 
-    final String tableName = job.toTable.tableName;
-    final String stageTableName = job.toTable.stageTableName;
+    final String tableName = toJobConf.toJobConfig.tableName;
+    final String stageTableName = toJobConf.toJobConfig.stageTableName;
     final boolean stageEnabled = stageTableName != null &&
       stageTableName.length() > 0;
     if(stageEnabled) {
-      moveDataToDestinationTable(connection,
+      moveDataToDestinationTable(linkConf,
         context.isSuccess(), stageTableName, tableName);
     }
   }
 
-  private void moveDataToDestinationTable(ConnectionConfiguration connectorConf,
+  private void moveDataToDestinationTable(LinkConfiguration linkConf,
     boolean success, String stageTableName, String tableName) {
     GenericJdbcExecutor executor =
-      new GenericJdbcExecutor(connectorConf.connection.jdbcDriver,
-        connectorConf.connection.connectionString,
-        connectorConf.connection.username,
-        connectorConf.connection.password);
+      new GenericJdbcExecutor(linkConf.link.jdbcDriver,
+        linkConf.link.connectionString,
+        linkConf.link.username,
+        linkConf.link.password);
     try {
       if(success) {
         LOG.info("Job completed, transferring data from stage fromTable to " +

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcToInitializer.java
----------------------------------------------------------------------
diff --git a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcToInitializer.java b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcToInitializer.java
index 73a49b1..5d0ec93 100644
--- a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcToInitializer.java
+++ b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcToInitializer.java
@@ -27,7 +27,7 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 import org.apache.sqoop.common.MutableContext;
 import org.apache.sqoop.common.SqoopException;
-import org.apache.sqoop.connector.jdbc.configuration.ConnectionConfiguration;
+import org.apache.sqoop.connector.jdbc.configuration.LinkConfiguration;
 import org.apache.sqoop.connector.jdbc.configuration.ToJobConfiguration;
 import org.apache.sqoop.connector.jdbc.util.SqlTypesUtils;
 import org.apache.sqoop.job.etl.Initializer;
@@ -36,44 +36,42 @@ import org.apache.sqoop.schema.Schema;
 import org.apache.sqoop.schema.type.Column;
 import org.apache.sqoop.utils.ClassUtils;
 
-public class GenericJdbcToInitializer extends Initializer<ConnectionConfiguration, ToJobConfiguration> {
+public class GenericJdbcToInitializer extends Initializer<LinkConfiguration, ToJobConfiguration> {
 
   private GenericJdbcExecutor executor;
   private static final Logger LOG =
     Logger.getLogger(GenericJdbcToInitializer.class);
 
   @Override
-  public void initialize(InitializerContext context, ConnectionConfiguration connection, ToJobConfiguration job) {
-    configureJdbcProperties(context.getContext(), connection, job);
+  public void initialize(InitializerContext context, LinkConfiguration linkConf, ToJobConfiguration toJobConf) {
+    configureJdbcProperties(context.getContext(), linkConf, toJobConf);
     try {
-      configureTableProperties(context.getContext(), connection, job);
+      configureTableProperties(context.getContext(), linkConf, toJobConf);
     } finally {
       executor.close();
     }
   }
 
   @Override
-  public List<String> getJars(InitializerContext context, ConnectionConfiguration connection, ToJobConfiguration job) {
+  public List<String> getJars(InitializerContext context, LinkConfiguration linkConf, ToJobConfiguration toJobConf) {
     List<String> jars = new LinkedList<String>();
-
-    jars.add(ClassUtils.jarForClass(connection.connection.jdbcDriver));
-
+    jars.add(ClassUtils.jarForClass(linkConf.link.jdbcDriver));
     return jars;
   }
 
   @Override
-  public Schema getSchema(InitializerContext context, ConnectionConfiguration connectionConfiguration, ToJobConfiguration toJobConfiguration) {
-    configureJdbcProperties(context.getContext(), connectionConfiguration, toJobConfiguration);
+  public Schema getSchema(InitializerContext context, LinkConfiguration linkConf, ToJobConfiguration toJobConf) {
+    configureJdbcProperties(context.getContext(), linkConf, toJobConf);
 
-    String schemaName = toJobConfiguration.toTable.tableName;
+    String schemaName = toJobConf.toJobConfig.tableName;
 
     if (schemaName == null) {
       throw new SqoopException(GenericJdbcConnectorError.GENERIC_JDBC_CONNECTOR_0019,
           "Table name extraction not supported yet.");
     }
 
-    if(toJobConfiguration.toTable.schemaName != null) {
-      schemaName = toJobConfiguration.toTable.schemaName + "." + schemaName;
+    if(toJobConf.toJobConfig.schemaName != null) {
+      schemaName = toJobConf.toJobConfig.schemaName + "." + schemaName;
     }
 
     Schema schema = new Schema(schemaName);
@@ -112,11 +110,11 @@ public class GenericJdbcToInitializer extends Initializer<ConnectionConfiguratio
     }
   }
 
-  private void configureJdbcProperties(MutableContext context, ConnectionConfiguration connectionConfig, ToJobConfiguration jobConfig) {
-    String driver = connectionConfig.connection.jdbcDriver;
-    String url = connectionConfig.connection.connectionString;
-    String username = connectionConfig.connection.username;
-    String password = connectionConfig.connection.password;
+  private void configureJdbcProperties(MutableContext context, LinkConfiguration linkConf, ToJobConfiguration toJobConf) {
+    String driver = linkConf.link.jdbcDriver;
+    String url = linkConf.link.connectionString;
+    String username = linkConf.link.username;
+    String password = linkConf.link.password;
 
     assert driver != null;
     assert url != null;
@@ -124,18 +122,18 @@ public class GenericJdbcToInitializer extends Initializer<ConnectionConfiguratio
     executor = new GenericJdbcExecutor(driver, url, username, password);
   }
 
-  private void configureTableProperties(MutableContext context, ConnectionConfiguration connectionConfig, ToJobConfiguration jobConfig) {
+  private void configureTableProperties(MutableContext context, LinkConfiguration linkConf, ToJobConfiguration toJobConfig) {
     String dataSql;
 
-    String schemaName = jobConfig.toTable.schemaName;
-    String tableName = jobConfig.toTable.tableName;
-    String stageTableName = jobConfig.toTable.stageTableName;
-    boolean clearStageTable = jobConfig.toTable.clearStageTable == null ?
-      false : jobConfig.toTable.clearStageTable;
+    String schemaName = toJobConfig.toJobConfig.schemaName;
+    String tableName = toJobConfig.toJobConfig.tableName;
+    String stageTableName = toJobConfig.toJobConfig.stageTableName;
+    boolean clearStageTable = toJobConfig.toJobConfig.clearStageTable == null ?
+      false : toJobConfig.toJobConfig.clearStageTable;
     final boolean stageEnabled =
       stageTableName != null && stageTableName.length() > 0;
-    String tableSql = jobConfig.toTable.sql;
-    String tableColumns = jobConfig.toTable.columns;
+    String tableSql = toJobConfig.toJobConfig.sql;
+    String tableColumns = toJobConfig.toJobConfig.columns;
 
     if (tableName != null && tableSql != null) {
       // when both fromTable name and fromTable sql are specified:

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcValidator.java
----------------------------------------------------------------------
diff --git a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcValidator.java b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcValidator.java
index 0a60e90..ad1ee5c 100644
--- a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcValidator.java
+++ b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcValidator.java
@@ -18,7 +18,7 @@
 package org.apache.sqoop.connector.jdbc;
 
 import org.apache.sqoop.common.SqoopException;
-import org.apache.sqoop.connector.jdbc.configuration.ConnectionConfiguration;
+import org.apache.sqoop.connector.jdbc.configuration.LinkConfiguration;
 import org.apache.sqoop.connector.jdbc.configuration.FromJobConfiguration;
 import org.apache.sqoop.connector.jdbc.configuration.ToJobConfiguration;
 import org.apache.sqoop.validation.Status;
@@ -34,32 +34,32 @@ import java.sql.SQLException;
 public class GenericJdbcValidator extends Validator {
 
   @Override
-  public Validation validateConnection(Object configuration) {
-    Validation validation = new Validation(ConnectionConfiguration.class);
-    ConnectionConfiguration config = (ConnectionConfiguration)configuration;
+  public Validation validateLink(Object configuration) {
+    Validation validation = new Validation(LinkConfiguration.class);
+    LinkConfiguration linkConf = (LinkConfiguration)configuration;
 
-    if(config.connection.jdbcDriver == null) {
-      validation.addMessage(Status.UNACCEPTABLE, "connection", "jdbcDriver", "Driver can't be empty");
+    if(linkConf.link.jdbcDriver == null) {
+      validation.addMessage(Status.UNACCEPTABLE, "link", "jdbcDriver", "Driver can't be empty");
     } else {
       try {
-        Class.forName(config.connection.jdbcDriver);
+        Class.forName(linkConf.link.jdbcDriver);
       } catch (ClassNotFoundException e) {
-        validation.addMessage(Status.UNACCEPTABLE, "connection", "jdbcDriver", "Can't load specified driver");
+        validation.addMessage(Status.UNACCEPTABLE, "link", "jdbcDriver", "Can't load specified driver");
       }
     }
 
-    if(config.connection.connectionString == null) {
-      validation.addMessage(Status.UNACCEPTABLE, "connection", "connectionString", "JDBC URL can't be empty");
-    } else if(!config.connection.connectionString.startsWith("jdbc:")) {
-      validation.addMessage(Status.UNACCEPTABLE, "connection", "connectionString", "This do not seem as a valid JDBC URL");
+    if(linkConf.link.connectionString == null) {
+      validation.addMessage(Status.UNACCEPTABLE, "link", "connectionString", "JDBC URL can't be empty");
+    } else if(!linkConf.link.connectionString.startsWith("jdbc:")) {
+      validation.addMessage(Status.UNACCEPTABLE, "link", "connectionString", "This do not seem as a valid JDBC URL");
     }
 
     // See if we can connect to the database
     try {
-      DriverManager.getConnection(config.connection.connectionString,
-        config.connection.username, config.connection.password);
+      DriverManager.getConnection(linkConf.link.connectionString,
+        linkConf.link.username, linkConf.link.password);
     } catch (SQLException e) {
-      validation.addMessage(Status.ACCEPTABLE, "connection", "Can't connect to the database with given credentials: " + e.getMessage());
+      validation.addMessage(Status.ACCEPTABLE, "link", "Can't connect to the database with given credentials: " + e.getMessage());
     }
 
     // Return final validation object
@@ -81,20 +81,20 @@ public class GenericJdbcValidator extends Validator {
   private Validation validateToJobConfiguration(ToJobConfiguration configuration) {
     Validation validation = new Validation(FromJobConfiguration.class);
 
-    if(configuration.toTable.tableName == null && configuration.toTable.sql == null) {
-      validation.addMessage(Status.UNACCEPTABLE, "toTable", "Either table name or SQL must be specified");
+    if(configuration.toJobConfig.tableName == null && configuration.toJobConfig.sql == null) {
+      validation.addMessage(Status.UNACCEPTABLE, "toJobConfig", "Either table name or SQL must be specified");
     }
-    if(configuration.toTable.tableName != null && configuration.toTable.sql != null) {
-      validation.addMessage(Status.UNACCEPTABLE, "toTable", "Both table name and SQL cannot be specified");
+    if(configuration.toJobConfig.tableName != null && configuration.toJobConfig.sql != null) {
+      validation.addMessage(Status.UNACCEPTABLE, "toJobConfig", "Both table name and SQL cannot be specified");
     }
-    if(configuration.toTable.tableName == null &&
-        configuration.toTable.stageTableName != null) {
-      validation.addMessage(Status.UNACCEPTABLE, "toTable",
+    if(configuration.toJobConfig.tableName == null &&
+        configuration.toJobConfig.stageTableName != null) {
+      validation.addMessage(Status.UNACCEPTABLE, "toJobConfig",
         "Stage table name cannot be specified without specifying table name");
     }
-    if(configuration.toTable.stageTableName == null &&
-        configuration.toTable.clearStageTable != null) {
-      validation.addMessage(Status.UNACCEPTABLE, "toTable",
+    if(configuration.toJobConfig.stageTableName == null &&
+        configuration.toJobConfig.clearStageTable != null) {
+      validation.addMessage(Status.UNACCEPTABLE, "toJobConfig",
         "Clear stage table cannot be specified without specifying name of " +
         "the stage table.");
     }
@@ -105,18 +105,18 @@ public class GenericJdbcValidator extends Validator {
   private Validation validateFromJobConfiguration(FromJobConfiguration configuration) {
     Validation validation = new Validation(FromJobConfiguration.class);
 
-    if(configuration.fromTable.tableName == null && configuration.fromTable.sql == null) {
-      validation.addMessage(Status.UNACCEPTABLE, "fromTable", "Either table name or SQL must be specified");
+    if(configuration.fromJobConfig.tableName == null && configuration.fromJobConfig.sql == null) {
+      validation.addMessage(Status.UNACCEPTABLE, "fromJobConfig", "Either table name or SQL must be specified");
     }
-    if(configuration.fromTable.tableName != null && configuration.fromTable.sql != null) {
-      validation.addMessage(Status.UNACCEPTABLE, "fromTable", "Both table name and SQL cannot be specified");
+    if(configuration.fromJobConfig.tableName != null && configuration.fromJobConfig.sql != null) {
+      validation.addMessage(Status.UNACCEPTABLE, "fromJobConfig", "Both table name and SQL cannot be specified");
     }
-    if(configuration.fromTable.schemaName != null && configuration.fromTable.sql != null) {
-      validation.addMessage(Status.UNACCEPTABLE, "fromTable", "Both schema name and SQL cannot be specified");
+    if(configuration.fromJobConfig.schemaName != null && configuration.fromJobConfig.sql != null) {
+      validation.addMessage(Status.UNACCEPTABLE, "fromJobConfig", "Both schema name and SQL cannot be specified");
     }
 
-    if(configuration.fromTable.sql != null && !configuration.fromTable.sql.contains(GenericJdbcConnectorConstants.SQL_CONDITIONS_TOKEN)) {
-      validation.addMessage(Status.UNACCEPTABLE, "fromTable", "sql", "SQL statement must contain placeholder for auto generated "
+    if(configuration.fromJobConfig.sql != null && !configuration.fromJobConfig.sql.contains(GenericJdbcConnectorConstants.SQL_CONDITIONS_TOKEN)) {
+      validation.addMessage(Status.UNACCEPTABLE, "fromJobConfig", "sql", "SQL statement must contain placeholder for auto generated "
         + "conditions - " + GenericJdbcConnectorConstants.SQL_CONDITIONS_TOKEN);
     }
 

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/ConnectionConfiguration.java
----------------------------------------------------------------------
diff --git a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/ConnectionConfiguration.java b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/ConnectionConfiguration.java
deleted file mode 100644
index 6061600..0000000
--- a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/ConnectionConfiguration.java
+++ /dev/null
@@ -1,34 +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.connector.jdbc.configuration;
-
-import org.apache.sqoop.model.ConfigurationClass;
-import org.apache.sqoop.model.Form;
-
-/**
- *
- */
-@ConfigurationClass
-public class ConnectionConfiguration {
-
-  @Form public ConnectionForm connection;
-
-  public ConnectionConfiguration() {
-    connection = new ConnectionForm();
-  }
-}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/049994a0/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/ConnectionForm.java
----------------------------------------------------------------------
diff --git a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/ConnectionForm.java b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/ConnectionForm.java
deleted file mode 100644
index 3b5d70a..0000000
--- a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/ConnectionForm.java
+++ /dev/null
@@ -1,64 +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.connector.jdbc.configuration;
-
-import org.apache.sqoop.model.FormClass;
-import org.apache.sqoop.model.Input;
-import org.apache.sqoop.model.Validator;
-import org.apache.sqoop.validation.Status;
-import org.apache.sqoop.validation.validators.AbstractValidator;
-import org.apache.sqoop.validation.validators.NotEmpty;
-import org.apache.sqoop.validation.validators.ClassAvailable;
-import org.apache.sqoop.validation.validators.StartsWith;
-
-import java.sql.DriverManager;
-import java.sql.SQLException;
-import java.util.Map;
-
-/**
- *
- */
-@FormClass(validators = {@Validator(ConnectionForm.FormValidator.class)})
-public class ConnectionForm {
-  @Input(size = 128, validators = {@Validator(NotEmpty.class), @Validator(ClassAvailable.class)} )
-  public String jdbcDriver;
-
-  @Input(size = 128, validators = {@Validator(value = StartsWith.class, strArg = "jdbc:")} )
-  public String connectionString;
-
-  @Input(size = 40)
-  public String username;
-
-  @Input(size = 40, sensitive = true)
-  public String password;
-
-  @Input
-  public Map<String, String> jdbcProperties;
-
-  public static class FormValidator extends AbstractValidator<ConnectionForm> {
-    @Override
-    public void validate(ConnectionForm form) {
-      // See if we can connect to the database
-      try {
-        DriverManager.getConnection(form.connectionString, form.username, form.password);
-      } catch (SQLException e) {
-        addMessage(Status.ACCEPTABLE, "Can't connect to the database with given credentials: " + e.getMessage());
-      }
-    }
-  }
-}