You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sqoop.apache.org by ab...@apache.org on 2014/10/10 04:51:53 UTC

[24/52] [abbrv] git commit: SQOOP-1454: Sqoop2: From/To: Add client support for supported directions

SQOOP-1454: Sqoop2: From/To: Add client support for supported directions

(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/27fb31d4
Tree: http://git-wip-us.apache.org/repos/asf/sqoop/tree/27fb31d4
Diff: http://git-wip-us.apache.org/repos/asf/sqoop/diff/27fb31d4

Branch: refs/heads/SQOOP-1367
Commit: 27fb31d42e7e76ca14def568e454121437f4e9e5
Parents: 3d539dd
Author: Jarek Jarcec Cecho <ja...@apache.org>
Authored: Sun Sep 21 12:42:10 2014 -0700
Committer: Abraham Elmahrek <ab...@elmahrek.com>
Committed: Thu Oct 9 17:58:18 2014 -0700

----------------------------------------------------------------------
 .../sqoop/common/SupportedDirections.java       |  41 ++++++
 .../java/org/apache/sqoop/model/MConnector.java |   6 +
 .../sqoop/common/TestSupportedDirections.java   |  55 ++++++++
 .../org/apache/sqoop/model/TestMConnector.java  | 127 ++++++++++++-------
 .../sqoop/connector/ConnectorHandler.java       |   4 -
 .../sqoop/shell/ShowConnectorFunction.java      |  37 +++++-
 .../org/apache/sqoop/shell/core/Constants.java  |   2 +
 .../main/resources/shell-resource.properties    |   5 +-
 8 files changed, 226 insertions(+), 51 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/sqoop/blob/27fb31d4/common/src/main/java/org/apache/sqoop/common/SupportedDirections.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/common/SupportedDirections.java b/common/src/main/java/org/apache/sqoop/common/SupportedDirections.java
new file mode 100644
index 0000000..25ba276
--- /dev/null
+++ b/common/src/main/java/org/apache/sqoop/common/SupportedDirections.java
@@ -0,0 +1,41 @@
+/**
+ * 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.common;
+
+/**
+ * Represents which Directions are supported.
+ */
+public class SupportedDirections {
+  private boolean from;
+  private boolean to;
+
+  public SupportedDirections(boolean from, boolean to) {
+    this.from = from;
+    this.to = to;
+  }
+
+  /**
+   * Check if direction is supported.
+   * @param direction
+   * @return boolean
+   */
+  public boolean isDirectionSupported(Direction direction) {
+    return direction == Direction.FROM && from
+        || direction == Direction.TO && to;
+  }
+}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/27fb31d4/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 335a0cc..3dc1014 100644
--- a/common/src/main/java/org/apache/sqoop/model/MConnector.java
+++ b/common/src/main/java/org/apache/sqoop/model/MConnector.java
@@ -20,6 +20,7 @@ package org.apache.sqoop.model;
 import org.apache.sqoop.common.Direction;
 import org.apache.sqoop.common.DirectionError;
 import org.apache.sqoop.common.SqoopException;
+import org.apache.sqoop.common.SupportedDirections;
 
 /**
  * Connector metadata.
@@ -139,4 +140,9 @@ public final class MConnector extends MPersistableEntity implements MClonable {
   public void setVersion(String version) {
     this.version = version;
   }
+
+  public SupportedDirections getSupportedDirections() {
+    return new SupportedDirections(this.getJobForms(Direction.FROM) != null,
+        this.getJobForms(Direction.TO) != null);
+  }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/27fb31d4/common/src/test/java/org/apache/sqoop/common/TestSupportedDirections.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/common/TestSupportedDirections.java b/common/src/test/java/org/apache/sqoop/common/TestSupportedDirections.java
new file mode 100644
index 0000000..4fbaf82
--- /dev/null
+++ b/common/src/test/java/org/apache/sqoop/common/TestSupportedDirections.java
@@ -0,0 +1,55 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sqoop.common;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestSupportedDirections {
+
+  @Test
+  public void testIsDirectionSupported() {
+    // Both
+    SupportedDirections supportedDirections = new SupportedDirections(true, true);
+    Assert.assertTrue(
+        supportedDirections.isDirectionSupported(Direction.FROM));
+    Assert.assertTrue(
+        supportedDirections.isDirectionSupported(Direction.TO));
+
+    // FROM
+    supportedDirections = new SupportedDirections(true, false);
+    Assert.assertTrue(
+        supportedDirections.isDirectionSupported(Direction.FROM));
+    Assert.assertFalse(
+        supportedDirections.isDirectionSupported(Direction.TO));
+
+    // TO
+    supportedDirections = new SupportedDirections(false, true);
+    Assert.assertFalse(
+        supportedDirections.isDirectionSupported(Direction.FROM));
+    Assert.assertTrue(
+        supportedDirections.isDirectionSupported(Direction.TO));
+
+    // NONE
+    supportedDirections = new SupportedDirections(false, false);
+    Assert.assertFalse(
+        supportedDirections.isDirectionSupported(Direction.FROM));
+    Assert.assertFalse(
+        supportedDirections.isDirectionSupported(Direction.TO));
+  }
+}

http://git-wip-us.apache.org/repos/asf/sqoop/blob/27fb31d4/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 9672d9d..3fde47b 100644
--- a/common/src/test/java/org/apache/sqoop/model/TestMConnector.java
+++ b/common/src/test/java/org/apache/sqoop/model/TestMConnector.java
@@ -20,8 +20,10 @@ package org.apache.sqoop.model;
 import static org.junit.Assert.*;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
+import org.apache.sqoop.common.Direction;
 import org.junit.Test;
 
 /**
@@ -29,6 +31,34 @@ import org.junit.Test;
  */
 public class TestMConnector {
 
+  private MConnector createConnector(List<Direction> supportedDirections) {
+    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);
+
+    MConnectionForms connectionForms1 = new MConnectionForms(forms);
+    MJobForms fromForm = null;
+    MJobForms toForm = null;
+
+    if (supportedDirections.contains(Direction.FROM)) {
+      fromForm = new MJobForms(forms);
+    }
+
+    if (supportedDirections.contains(Direction.TO)) {
+      toForm = new MJobForms(forms);
+    }
+
+    return new MConnector("NAME", "CLASSNAME", "1.0",
+        connectionForms1, fromForm, toForm);
+  }
+
   /**
    * Test for initialization
    */
@@ -65,47 +95,58 @@ public class TestMConnector {
     }
   }
 
-//  @Test
-//  public void testClone() {
-//    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);
-//    MConnectionForms connectionForms1 = new MConnectionForms(forms);
-//    MJobForms jobform1 = new MJobForms(MJob.Type.EXPORT, forms);
-//    List<MJobForms> jobFormList = new ArrayList<MJobForms>();
-//    jobFormList.add(jobform1);
-//    MConnector connector1 = new MConnector("NAME", "CLASSNAME", "1.0",
-//        connectionForms1, jobFormList);
-//    assertEquals("NAME", connector1.getUniqueName());
-//    assertEquals("CLASSNAME", connector1.getClassName());
-//    assertEquals("1.0", connector1.getVersion());
-//    //Clone with values. Checking values copying after the cloning. But form values will be null
-//    MConnector clone1 = connector1.clone(true);
-//    assertEquals("NAME", clone1.getUniqueName());
-//    assertEquals("CLASSNAME", clone1.getClassName());
-//    assertEquals("1.0", clone1.getVersion());
-//    MForm clonedForm1 = clone1.getConnectionForms().getForms().get(0);
-//    assertNull(clonedForm1.getInputs().get(0).getValue());
-//    assertNull(clonedForm1.getInputs().get(1).getValue());
-//
-//    MForm clonedForm2 = clone1.getJobForms(MJob.Type.EXPORT).getForms().get(0);
-//    assertNull(clonedForm2.getInputs().get(0).getValue());
-//    assertNull(clonedForm2.getInputs().get(1).getValue());
-//
-//    //Clone without values. Inputs value will be null after cloning.
-//    MConnector clone2 = connector1.clone(false);
-//    clonedForm1 = clone2.getConnectionForms().getForms().get(0);
-//    assertNull(clonedForm1.getInputs().get(0).getValue());
-//    assertNull(clonedForm1.getInputs().get(1).getValue());
-//    clonedForm2 = clone2.getJobForms(MJob.Type.EXPORT).getForms().get(0);
-//    assertNull(clonedForm2.getInputs().get(0).getValue());
-//    assertNull(clonedForm2.getInputs().get(1).getValue());
-//  }
+  @Test
+  public void testClone() {
+    MConnector connector1 = createConnector(Arrays.asList(Direction.FROM, Direction.TO));
+    assertEquals("NAME", connector1.getUniqueName());
+    assertEquals("CLASSNAME", connector1.getClassName());
+    assertEquals("1.0", connector1.getVersion());
+    //Clone with values. Checking values copying after the cloning. But form values will be null
+    MConnector clone1 = connector1.clone(true);
+    assertEquals("NAME", clone1.getUniqueName());
+    assertEquals("CLASSNAME", clone1.getClassName());
+    assertEquals("1.0", clone1.getVersion());
+    MForm clonedForm1 = clone1.getConnectionForms().getForms().get(0);
+    assertNull(clonedForm1.getInputs().get(0).getValue());
+    assertNull(clonedForm1.getInputs().get(1).getValue());
+
+    MForm clonedForm2 = clone1.getJobForms(Direction.FROM).getForms().get(0);
+    assertNull(clonedForm2.getInputs().get(0).getValue());
+    assertNull(clonedForm2.getInputs().get(1).getValue());
+
+    MForm clonedForm3 = clone1.getJobForms(Direction.TO).getForms().get(0);
+    assertNull(clonedForm3.getInputs().get(0).getValue());
+    assertNull(clonedForm3.getInputs().get(1).getValue());
+
+    //Clone without values. Inputs value will be null after cloning.
+    MConnector clone2 = connector1.clone(false);
+    clonedForm1 = clone2.getConnectionForms().getForms().get(0);
+    assertNull(clonedForm1.getInputs().get(0).getValue());
+    assertNull(clonedForm1.getInputs().get(1).getValue());
+    clonedForm2 = clone2.getJobForms(Direction.FROM).getForms().get(0);
+    assertNull(clonedForm2.getInputs().get(0).getValue());
+    assertNull(clonedForm2.getInputs().get(1).getValue());
+    clonedForm3 = clone2.getJobForms(Direction.TO).getForms().get(0);
+    assertNull(clonedForm3.getInputs().get(0).getValue());
+    assertNull(clonedForm3.getInputs().get(1).getValue());
+  }
+
+  @Test
+  public void testGetSupportedDirections() {
+    MConnector connector = createConnector(Arrays.asList(Direction.FROM, Direction.TO));
+    assertTrue(connector.getSupportedDirections().isDirectionSupported(Direction.FROM));
+    assertTrue(connector.getSupportedDirections().isDirectionSupported(Direction.TO));
+
+    connector = createConnector(Arrays.asList(Direction.FROM));
+    assertTrue(connector.getSupportedDirections().isDirectionSupported(Direction.FROM));
+    assertFalse(connector.getSupportedDirections().isDirectionSupported(Direction.TO));
+
+    connector = createConnector(Arrays.asList(Direction.TO));
+    assertFalse(connector.getSupportedDirections().isDirectionSupported(Direction.FROM));
+    assertTrue(connector.getSupportedDirections().isDirectionSupported(Direction.TO));
+
+    connector = createConnector(Arrays.asList(new Direction[]{}));
+    assertFalse(connector.getSupportedDirections().isDirectionSupported(Direction.FROM));
+    assertFalse(connector.getSupportedDirections().isDirectionSupported(Direction.TO));
+  }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/27fb31d4/core/src/main/java/org/apache/sqoop/connector/ConnectorHandler.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/sqoop/connector/ConnectorHandler.java b/core/src/main/java/org/apache/sqoop/connector/ConnectorHandler.java
index 8782209..6c10b54 100644
--- a/core/src/main/java/org/apache/sqoop/connector/ConnectorHandler.java
+++ b/core/src/main/java/org/apache/sqoop/connector/ConnectorHandler.java
@@ -98,15 +98,11 @@ public final class ConnectorHandler {
     if (connector.getSupportedDirections().contains(Direction.FROM)) {
       fromJobForms = new MJobForms(FormUtils.toForms(
           connector.getJobConfigurationClass(Direction.FROM)));
-    } else {
-      fromJobForms = new MJobForms(new ArrayList<MForm>());
     }
 
     if (connector.getSupportedDirections().contains(Direction.TO)) {
       toJobForms = new MJobForms(FormUtils.toForms(
           connector.getJobConfigurationClass(Direction.TO)));
-    } else {
-      toJobForms = new MJobForms(new ArrayList<MForm>());
     }
 
     MConnectionForms connectionForms = new MConnectionForms(

http://git-wip-us.apache.org/repos/asf/sqoop/blob/27fb31d4/shell/src/main/java/org/apache/sqoop/shell/ShowConnectorFunction.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/ShowConnectorFunction.java b/shell/src/main/java/org/apache/sqoop/shell/ShowConnectorFunction.java
index bbfbb3f..50978ff 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/ShowConnectorFunction.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/ShowConnectorFunction.java
@@ -23,6 +23,8 @@ import java.util.List;
 
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.OptionBuilder;
+import org.apache.sqoop.common.Direction;
+import org.apache.sqoop.common.SupportedDirections;
 import org.apache.sqoop.model.MConnector;
 import org.apache.sqoop.shell.core.Constants;
 import org.apache.sqoop.shell.utils.TableDisplayer;
@@ -33,6 +35,8 @@ import static org.apache.sqoop.shell.utils.FormDisplayer.*;
 
 @SuppressWarnings("serial")
 public class ShowConnectorFunction extends SqoopFunction {
+  private static final char SUPPORTED_DIRECTIONS_SEPARATOR = '/';
+
   @SuppressWarnings("static-access")
   public ShowConnectorFunction() {
     this.addOption(OptionBuilder
@@ -66,20 +70,23 @@ public class ShowConnectorFunction extends SqoopFunction {
     header.add(resourceString(Constants.RES_TABLE_HEADER_NAME));
     header.add(resourceString(Constants.RES_TABLE_HEADER_VERSION));
     header.add(resourceString(Constants.RES_TABLE_HEADER_CLASS));
+    header.add(resourceString(Constants.RES_TABLE_HEADER_SUPPORTED_DIRECTIONS));
 
     List<String> ids = new LinkedList<String>();
     List<String> uniqueNames = new LinkedList<String>();
     List<String> versions = new LinkedList<String>();
     List<String> classes = new LinkedList<String>();
+    List<String> supportedDirections = new LinkedList<String>();
 
     for(MConnector connector : connectors) {
       ids.add(String.valueOf(connector.getPersistenceId()));
       uniqueNames.add(connector.getUniqueName());
       versions.add(connector.getVersion());
       classes.add(connector.getClassName());
+      supportedDirections.add(getSupportedDirections(connector));
     }
 
-    TableDisplayer.display(header, ids, uniqueNames, versions, classes);
+    TableDisplayer.display(header, ids, uniqueNames, versions, classes, supportedDirections);
   }
 
   private void showConnectors() {
@@ -105,8 +112,34 @@ public class ShowConnectorFunction extends SqoopFunction {
       connector.getPersistenceId(),
       connector.getUniqueName(),
       connector.getClassName(),
-      connector.getVersion()
+      connector.getVersion(),
+      getSupportedDirections(connector)
     );
     displayFormMetadataDetails(connector, client.getResourceBundle(connector.getPersistenceId()));
   }
+
+  /**
+   * Creates a nicely formatted string for which directions are supported.
+   * Example: FROM/TO.
+   * @param connector
+   * @return String
+   */
+  private String getSupportedDirections(MConnector connector) {
+    StringBuffer supportedDirectionsBuffer = new StringBuffer();
+    SupportedDirections supportedDirections
+        = connector.getSupportedDirections();
+
+    if (supportedDirections.isDirectionSupported(Direction.FROM)) {
+      supportedDirectionsBuffer.append(Direction.FROM);
+
+      if (supportedDirections.isDirectionSupported(Direction.TO)) {
+        supportedDirectionsBuffer.append(SUPPORTED_DIRECTIONS_SEPARATOR);
+        supportedDirectionsBuffer.append(Direction.TO);
+      }
+    } else if (supportedDirections.isDirectionSupported(Direction.TO)) {
+      supportedDirectionsBuffer.append(Direction.TO);
+    }
+
+    return supportedDirectionsBuffer.toString();
+  }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/27fb31d4/shell/src/main/java/org/apache/sqoop/shell/core/Constants.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/core/Constants.java b/shell/src/main/java/org/apache/sqoop/shell/core/Constants.java
index efabc46..f0dc3a6 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/core/Constants.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/core/Constants.java
@@ -333,6 +333,8 @@ public class Constants {
       "table.header.version";
   public static final String RES_TABLE_HEADER_CLASS =
       "table.header.class";
+  public static final String RES_TABLE_HEADER_SUPPORTED_DIRECTIONS =
+      "table.header.supported_directions";
   public static final String RES_TABLE_HEADER_CONNECTOR =
       "table.header.connector";
   public static final String RES_TABLE_HEADER_FROM_CONNECTOR =

http://git-wip-us.apache.org/repos/asf/sqoop/blob/27fb31d4/shell/src/main/resources/shell-resource.properties
----------------------------------------------------------------------
diff --git a/shell/src/main/resources/shell-resource.properties b/shell/src/main/resources/shell-resource.properties
index 73a19e8..247ceae 100644
--- a/shell/src/main/resources/shell-resource.properties
+++ b/shell/src/main/resources/shell-resource.properties
@@ -137,8 +137,8 @@ show.prompt_display_all_connectors = Display all connectors
 show.prompt_display_connector_cid = Display the connector with cid
 show.connector_usage = Usage: show connector
 show.prompt_connectors_to_show = @|bold {0} connector(s) to show: |@
-show.prompt_connector_info = Connector with id {0}:\n  Name: {1} \n \
-Class: {2}\n  Version: {3}
+show.prompt_connector_info = Connector with id {0}:\n  Name: {1} \n  \
+Class: {2}\n  Version: {3}\n  Supported Directions {4}
 
 show.framework_usage = Usage: show framework
 show.prompt_framework_opts = @|bold Framework specific options: |@\nPersistent id: {0}
@@ -190,6 +190,7 @@ table.header.id = Id
 table.header.name = Name
 table.header.version = Version
 table.header.class = Class
+table.header.supported_directions = Supported Directions
 table.header.connector = Connector
 table.header.connector.from = From Connector
 table.header.connector.to = To Connector