SQOOP-1542: Sqoop2: From/To: MConnector should handle null forms (Abraham Elmahrek via Jarek Jarcec Cecho)
Project: http://git-wip-us.apache.org/repos/asf/sqoop/repo Commit: http://git-wip-us.apache.org/repos/asf/sqoop/commit/d0153621 Tree: http://git-wip-us.apache.org/repos/asf/sqoop/tree/d0153621 Diff: http://git-wip-us.apache.org/repos/asf/sqoop/diff/d0153621 Branch: refs/heads/SQOOP-1367 Commit: d0153621d38c4c8478276417b12e36bd67ed6121 Parents: 049994a Author: Jarek Jarcec Cecho <[email protected]> Authored: Wed Sep 24 16:16:54 2014 -0700 Committer: Abraham Elmahrek <[email protected]> Committed: Thu Oct 9 17:58:18 2014 -0700 ---------------------------------------------------------------------- .../java/org/apache/sqoop/model/MConnector.java | 64 +++++++++++++++++--- .../org/apache/sqoop/model/TestMConnector.java | 52 ++++++++++++++++ 2 files changed, 107 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/sqoop/blob/d0153621/common/src/main/java/org/apache/sqoop/model/MConnector.java ---------------------------------------------------------------------- diff --git a/common/src/main/java/org/apache/sqoop/model/MConnector.java b/common/src/main/java/org/apache/sqoop/model/MConnector.java index 3dc1014..7999b08 100644 --- a/common/src/main/java/org/apache/sqoop/model/MConnector.java +++ b/common/src/main/java/org/apache/sqoop/model/MConnector.java @@ -63,12 +63,18 @@ public final class MConnector extends MPersistableEntity implements MClonable { @Override public String toString() { + MJobForms fromJobForms = this.getJobForms(Direction.FROM); + MJobForms toJobForms = this.getJobForms(Direction.TO); StringBuilder sb = new StringBuilder("connector-"); sb.append(uniqueName).append(":").append(getPersistenceId()).append(":"); sb.append(className); sb.append(", ").append(getConnectionForms().toString()); - sb.append(", ").append(getJobForms(Direction.FROM).toString()); - sb.append(", ").append(getJobForms(Direction.TO).toString()); + if (fromJobForms != null) { + sb.append(", ").append(fromJobForms.toString()); + } + if (toJobForms != null) { + sb.append(", ").append(toJobForms.toString()); + } return sb.toString(); } @@ -83,19 +89,47 @@ public final class MConnector extends MPersistableEntity implements MClonable { } MConnector mc = (MConnector) other; + SupportedDirections supportedDirections = this.getSupportedDirections(); + SupportedDirections mcSupportedDirections = mc.getSupportedDirections(); + + if (supportedDirections.isDirectionSupported(Direction.FROM) + && mcSupportedDirections.isDirectionSupported(Direction.FROM) + && !getJobForms(Direction.FROM).equals(mc.getJobForms(Direction.FROM))) { + return false; + } + + if (supportedDirections.isDirectionSupported(Direction.FROM) + != mcSupportedDirections.isDirectionSupported(Direction.FROM)) { + return false; + } + + if (supportedDirections.isDirectionSupported(Direction.TO) + && mcSupportedDirections.isDirectionSupported(Direction.TO) + && !getJobForms(Direction.TO).equals(mc.getJobForms(Direction.TO))) { + return false; + } + + if (supportedDirections.isDirectionSupported(Direction.TO) + != mcSupportedDirections.isDirectionSupported(Direction.TO)) { + return false; + } + return uniqueName.equals(mc.uniqueName) && className.equals(mc.className) && version.equals(mc.version) - && connectionForms.equals(mc.getConnectionForms()) - && fromJobForms.equals(mc.getJobForms(Direction.FROM)) - && toJobForms.equals(mc.getJobForms(Direction.TO)); + && connectionForms.equals(mc.getConnectionForms()); } @Override public int hashCode() { + SupportedDirections supportedDirections = getSupportedDirections(); int result = getConnectionForms().hashCode(); - result = 31 * result + getJobForms(Direction.FROM).hashCode(); - result = 31 * result + getJobForms(Direction.TO).hashCode(); + if (supportedDirections.isDirectionSupported(Direction.FROM)) { + result = 31 * result + getJobForms(Direction.FROM).hashCode(); + } + if (supportedDirections.isDirectionSupported(Direction.TO)) { + result = 31 * result + getJobForms(Direction.TO).hashCode(); + } result = 31 * result + version.hashCode(); result = 31 * result + uniqueName.hashCode(); result = 31 * result + className.hashCode(); @@ -105,13 +139,25 @@ public final class MConnector extends MPersistableEntity implements MClonable { public MConnector clone(boolean cloneWithValue) { //Connector never have any values filled cloneWithValue = false; + + MJobForms fromJobForms = this.getJobForms(Direction.FROM); + MJobForms toJobForms = this.getJobForms(Direction.TO); + + if (fromJobForms != null) { + fromJobForms = fromJobForms.clone(cloneWithValue); + } + + if (toJobForms != null) { + toJobForms = toJobForms.clone(cloneWithValue); + } + MConnector copy = new MConnector( this.getUniqueName(), this.getClassName(), this.getVersion(), this.getConnectionForms().clone(cloneWithValue), - this.getJobForms(Direction.FROM).clone(cloneWithValue), - this.getJobForms(Direction.TO).clone(cloneWithValue)); + fromJobForms, + toJobForms); copy.setPersistenceId(this.getPersistenceId()); return copy; } http://git-wip-us.apache.org/repos/asf/sqoop/blob/d0153621/common/src/test/java/org/apache/sqoop/model/TestMConnector.java ---------------------------------------------------------------------- diff --git a/common/src/test/java/org/apache/sqoop/model/TestMConnector.java b/common/src/test/java/org/apache/sqoop/model/TestMConnector.java index 3fde47b..0a5fd90 100644 --- a/common/src/test/java/org/apache/sqoop/model/TestMConnector.java +++ b/common/src/test/java/org/apache/sqoop/model/TestMConnector.java @@ -132,6 +132,58 @@ public class TestMConnector { } @Test + public void testFromDirection() { + MConnector connector = createConnector(Arrays.asList(Direction.FROM)); + + // Clone should clone only one job form. + MConnector clone = connector.clone(true); + assertNotNull(clone.getJobForms(Direction.FROM)); + assertNull(clone.getJobForms(Direction.TO)); + assertEquals(connector, clone); + assertEquals(connector.toString(), clone.toString()); + assertNotEquals(connector.hashCode(), clone.hashCode()); + } + + @Test + public void testToDirection() { + MConnector connector = createConnector(Arrays.asList(Direction.TO)); + + // Clone should clone only one job form. + MConnector clone = connector.clone(true); + assertNull(clone.getJobForms(Direction.FROM)); + assertNotNull(clone.getJobForms(Direction.TO)); + assertEquals(connector, clone); + assertEquals(connector.toString(), clone.toString()); + assertNotEquals(connector.hashCode(), clone.hashCode()); + } + + @Test + public void testNoDirection() { + MConnector connector = createConnector(Arrays.asList(new Direction[0])); + + // Clone should clone only one job form. + MConnector clone = connector.clone(true); + assertNull(clone.getJobForms(Direction.FROM)); + assertNull(clone.getJobForms(Direction.TO)); + assertEquals(connector, clone); + assertEquals(connector.toString(), clone.toString()); + assertNotEquals(connector.hashCode(), clone.hashCode()); + } + + @Test + public void testBothDirections() { + MConnector connector = createConnector(Arrays.asList(Direction.FROM, Direction.TO)); + + // Clone should clone only one job form. + MConnector clone = connector.clone(true); + assertNotNull(clone.getJobForms(Direction.FROM)); + assertNotNull(clone.getJobForms(Direction.TO)); + assertEquals(connector, clone); + assertEquals(connector.toString(), clone.toString()); + assertNotEquals(connector.hashCode(), clone.hashCode()); + } + + @Test public void testGetSupportedDirections() { MConnector connector = createConnector(Arrays.asList(Direction.FROM, Direction.TO)); assertTrue(connector.getSupportedDirections().isDirectionSupported(Direction.FROM));
