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:35 UTC

[06/52] [abbrv] git commit: SQOOP-1465: Sqoop2: Validations: Add support for multiple validation messages to Model classes

SQOOP-1465: Sqoop2: Validations: Add support for multiple validation messages to Model classes


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

Branch: refs/heads/SQOOP-1367
Commit: f89368e2a0cc6236b2c50dfe544134f9d55208b9
Parents: e71dd75
Author: Jarek Jarcec Cecho <ja...@apache.org>
Authored: Mon Sep 8 23:16:19 2014 -0700
Committer: Abraham Elmahrek <ab...@elmahrek.com>
Committed: Thu Oct 9 17:58:17 2014 -0700

----------------------------------------------------------------------
 .../java/org/apache/sqoop/model/FormUtils.java  |  10 +-
 .../apache/sqoop/model/MValidatedElement.java   | 107 +++++++------------
 .../org/apache/sqoop/validation/Status.java     |  16 ++-
 .../org/apache/sqoop/model/TestFormUtils.java   |  31 ------
 .../sqoop/model/TestMValidatedElement.java      |  36 +++----
 .../apache/sqoop/shell/utils/FormDisplayer.java |   5 +-
 .../apache/sqoop/shell/utils/FormFiller.java    |  17 ++-
 7 files changed, 88 insertions(+), 134 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/sqoop/blob/f89368e2/common/src/main/java/org/apache/sqoop/model/FormUtils.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/model/FormUtils.java b/common/src/main/java/org/apache/sqoop/model/FormUtils.java
index bfd97d5..586e0fe 100644
--- a/common/src/main/java/org/apache/sqoop/model/FormUtils.java
+++ b/common/src/main/java/org/apache/sqoop/model/FormUtils.java
@@ -314,9 +314,9 @@ public class FormUtils {
 
     if (messages.containsKey(name)) {
       Validation.Message message = messages.get(name);
-      element.setValidationMessage(message.getStatus(), message.getMessage());
+      element.addValidationMessage(new Message(message.getStatus(), message.getMessage()));
     } else {
-      element.setValidationMessage(Status.getDefault(), null);
+      element.addValidationMessage(new Message(Status.getDefault(), null));
     }
   }
 
@@ -349,11 +349,9 @@ public class FormUtils {
     List<Message> messages = result.getMessages().get(element.getName());
 
     if(messages != null) {
-      // TODO(SQOOP-1465) Add support for multiple messages (showing only the first one for now)
-      Message message = messages.get(0);
-      element.setValidationMessage(message.getStatus(), message.getMessage());
+      element.setValidationMessages(messages);
     } else {
-      element.setValidationMessage(Status.getDefault(), null);
+      element.resetValidationMessages();
     }
   }
 

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f89368e2/common/src/main/java/org/apache/sqoop/model/MValidatedElement.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/model/MValidatedElement.java b/common/src/main/java/org/apache/sqoop/model/MValidatedElement.java
index ab5473c..a50c815 100644
--- a/common/src/main/java/org/apache/sqoop/model/MValidatedElement.java
+++ b/common/src/main/java/org/apache/sqoop/model/MValidatedElement.java
@@ -17,122 +17,87 @@
  */
 package org.apache.sqoop.model;
 
+import org.apache.sqoop.validation.Message;
 import org.apache.sqoop.validation.Status;
 
+import java.util.LinkedList;
+import java.util.List;
+
 /**
- * Element that can be validated for correctness.
- *
- * Two severity levels are supported at the moment - warning and error.
- *
- * Warning:
- * Warning is something suspicious, potentially wrong but something that
- * can be ignored. For example in case of JDBC URL element, warning would
- * be if specified host is not responding - it's warning because specified
- * URL might be wrong. However at the same time URL might be right as only
- * target host might be down.
- *
- * Error:
- * Error represents unacceptable element content. For example in case of JDBC
- * URL path, error would be empty element or element containing invalid URL.
+ * Element that can have associated validation messages (0..N).
  */
 public abstract class MValidatedElement extends MNamedElement {
 
   /**
-   * Validation message.
-   *
-   * One element can have only one message regardless of the type.
+   * Validation messages.
    */
-  private String validationMessage;
+  private List<Message> validationMessages;
 
   /**
-   * Severity of the message.
+   * The worst status of all validation messages.
    */
   private Status validationStatus;
 
   public MValidatedElement(String name) {
     super(name);
-    // Everything is fine by default
-    this.validationStatus = Status.getDefault();
+    resetValidationMessages();
   }
 
   public MValidatedElement(MValidatedElement other) {
     super(other);
-    this.validationMessage = other.validationMessage;
     this.validationStatus = other.validationStatus;
+    this.validationMessages.addAll(other.validationMessages);
   }
 
   /**
-   * Set validation message and given severity.
-   *
-   * @param status Message validation status
-   * @param msg Message itself
-   */
-  public void setValidationMessage(Status status, String msg) {
-    this.validationMessage = msg;
-    this.validationStatus = status;
-  }
-
-  /**
-   * Return validation message for given severity.
+   * Reset this validated element back to default state.
    *
-   * Return either associated message for given severity or null in case
-   * that there is no message with given severity.
-   *
-   * @param status Message validation status
+   * Will remove all associated messages and validation status.
    */
-  public String getValidationMessage(Status status) {
-    return (validationStatus.equals(status)) ? validationMessage : null;
+  public void resetValidationMessages() {
+    this.validationStatus = Status.getDefault();
+    this.validationMessages = new LinkedList<Message>();
   }
 
   /**
-   * Return validation message.
+   * Set validation messages (override anything that has been set before).
    *
-   * Return current validation message.
-   */
-  public String getValidationMessage() {
-    return validationMessage;
-  }
-
-  /**
-   * Return message validation status.
+   * @param msg Message itself
    */
-  public Status getValidationStatus() {
-    return validationStatus;
+  public void addValidationMessage(Message msg) {
+    this.validationMessages.add(msg);
+    this.validationStatus = Status.getWorstStatus(this.validationStatus, msg.getStatus());
   }
 
   /**
-   * Set error message for this element.
+   * Override all previously existing validation messages.
    *
-   * @param errMsg Error message
+   * @param messages
    */
-  public void setErrorMessage(String errMsg) {
-    setValidationMessage(Status.UNACCEPTABLE, errMsg);
-  }
+  public void setValidationMessages(List<Message> messages) {
+    this.validationMessages = messages;
+    this.validationStatus = Status.getDefault();
 
-  /**
-   * Return error message associated with this element.
-   *
-   * @return Error message
-   */
-  public String getErrorMessage() {
-    return getValidationMessage(Status.UNACCEPTABLE);
+    for(Message message : messages ) {
+      this.validationStatus = Status.getWorstStatus(this.validationStatus, message.getStatus());
+    }
   }
 
   /**
-   * Set warning message for this element.
+   * Return validation message for given severity.
    *
-   * @param warnMsg Warning message
+   * Return either associated message for given severity or null in case
+   * that there is no message with given severity.
    */
-  public void setWarningMessage(String warnMsg) {
-    setValidationMessage(Status.ACCEPTABLE, warnMsg);
+  public List<Message> getValidationMessages() {
+    return this.validationMessages;
   }
 
   /**
-   * Retrieve warning message associated with this element.
-   * @return
+   * Return message validation status.
    */
-  public String getWarningMessage() {
-    return getValidationMessage(Status.ACCEPTABLE);
+  public Status getValidationStatus() {
+    return validationStatus;
   }
 
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f89368e2/common/src/main/java/org/apache/sqoop/validation/Status.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/validation/Status.java b/common/src/main/java/org/apache/sqoop/validation/Status.java
index ae89e59..5a546bf 100644
--- a/common/src/main/java/org/apache/sqoop/validation/Status.java
+++ b/common/src/main/java/org/apache/sqoop/validation/Status.java
@@ -18,7 +18,21 @@
 package org.apache.sqoop.validation;
 
 /**
- * Status modes of a validation process.
+ * Severity of validation message.
+ *
+ * Fine:
+ * Everything is correct (default state).
+ *
+ * Warning:
+ * Warning is something suspicious, potentially wrong but something that
+ * can be ignored. For example in case of JDBC URL element, warning would
+ * be if specified host is not responding - it's warning because specified
+ * URL might be wrong. However at the same time URL might be right as only
+ * target host might be down.
+ *
+ * Error:
+ * Error represents unacceptable element content. For example in case of JDBC
+ * URL path, error would be empty element or element containing invalid URL.
  *
  * TODO: This should really be renamed to "severity"
  */

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f89368e2/common/src/test/java/org/apache/sqoop/model/TestFormUtils.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/model/TestFormUtils.java b/common/src/test/java/org/apache/sqoop/model/TestFormUtils.java
index 41dddb7..9fa2b6b 100644
--- a/common/src/test/java/org/apache/sqoop/model/TestFormUtils.java
+++ b/common/src/test/java/org/apache/sqoop/model/TestFormUtils.java
@@ -129,23 +129,6 @@ public class TestFormUtils extends TestCase {
     assertNull(config.bForm.b2);
   }
 
-  public void testApplyValidation() {
-    Validation validation = getValidation();
-    List<MForm> forms = getForms();
-
-    FormUtils.applyValidation(forms, validation);
-
-    assertEquals(Status.ACCEPTABLE,
-      forms.get(0).getInputs().get(0).getValidationStatus());
-    assertEquals("e1",
-      forms.get(0).getInputs().get(0).getValidationMessage());
-
-    assertEquals(Status.UNACCEPTABLE,
-      forms.get(0).getInputs().get(1).getValidationStatus());
-    assertEquals("e2",
-      forms.get(0).getInputs().get(1).getValidationMessage());
-  }
-
   public void testJson() {
     Config config = new Config();
     config.aForm.a1 = "A";
@@ -179,20 +162,6 @@ public class TestFormUtils extends TestCase {
     assertEquals(Enumeration.X, targetConfig.cForm.enumeration);
   }
 
-  protected Validation getValidation() {
-    Map<Validation.FormInput, Validation.Message> messages
-      = new HashMap<Validation.FormInput, Validation.Message>();
-
-    messages.put(
-      new Validation.FormInput("aForm", "a1"),
-      new Validation.Message(Status.ACCEPTABLE, "e1"));
-    messages.put(
-      new Validation.FormInput("aForm", "a2"),
-      new Validation.Message(Status.UNACCEPTABLE, "e2"));
-
-    return new Validation(Status.UNACCEPTABLE, messages);
-  }
-
   /**
    * Form structure that corresponds to Config class declared below
    * @return Form structure

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f89368e2/common/src/test/java/org/apache/sqoop/model/TestMValidatedElement.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/model/TestMValidatedElement.java b/common/src/test/java/org/apache/sqoop/model/TestMValidatedElement.java
index 3fd5a95..cf34983 100644
--- a/common/src/test/java/org/apache/sqoop/model/TestMValidatedElement.java
+++ b/common/src/test/java/org/apache/sqoop/model/TestMValidatedElement.java
@@ -19,6 +19,7 @@ package org.apache.sqoop.model;
 
 import static org.junit.Assert.*;
 
+import org.apache.sqoop.validation.Message;
 import org.apache.sqoop.validation.Status;
 import org.junit.Test;
 
@@ -41,30 +42,27 @@ public class TestMValidatedElement {
    * Test for validation message and status
    */
   @Test
-  public void testValidationMessageStatus() {
+  public void testVarious() {
     MValidatedElement input = new MIntegerInput("input", false);
+
     // Default status
     assertEquals(Status.FINE, input.getValidationStatus());
-    // Set status and user message
-    input.setValidationMessage(Status.ACCEPTABLE, "MY_MESSAGE");
+
+    // Add a message
+    input.addValidationMessage(new Message(Status.ACCEPTABLE, "MY_MESSAGE"));
     assertEquals(Status.ACCEPTABLE, input.getValidationStatus());
-    assertEquals("MY_MESSAGE", input.getValidationMessage());
-    // Check for null if status does not equal
-    assertNull(input.getValidationMessage(Status.FINE));
-    assertNull(input.getErrorMessage());
-    assertNotNull(input.getWarningMessage());
+    assertEquals(1, input.getValidationMessages().size());
+    assertEquals("MY_MESSAGE", input.getValidationMessages().get(0).getMessage());
+
+    // Reset
+    input.resetValidationMessages();
+    assertEquals(Status.FINE, input.getValidationStatus());
+    assertEquals(0, input.getValidationMessages().size());
+
     // Set unacceptable status
-    input.setValidationMessage(Status.UNACCEPTABLE, "MY_MESSAGE");
-    assertNotNull(input.getErrorMessage());
-    assertEquals("MY_MESSAGE", input.getErrorMessage());
-    assertNull(input.getWarningMessage());
-    // Set warning
-    input.setWarningMessage("WARN");
-    assertEquals(Status.ACCEPTABLE, input.getValidationStatus());
-    assertEquals("WARN", input.getValidationMessage());
-    // Unacceptable method
-    input.setErrorMessage("ERROR");
+    input.addValidationMessage(new Message(Status.UNACCEPTABLE, "MY_MESSAGE"));
     assertEquals(Status.UNACCEPTABLE, input.getValidationStatus());
-    assertEquals("ERROR", input.getValidationMessage());
+    assertEquals(1, input.getValidationMessages().size());
+    assertEquals("MY_MESSAGE", input.getValidationMessages().get(0).getMessage());
   }
 }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f89368e2/shell/src/main/java/org/apache/sqoop/shell/utils/FormDisplayer.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/utils/FormDisplayer.java b/shell/src/main/java/org/apache/sqoop/shell/utils/FormDisplayer.java
index e04d7b5..bbad183 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/utils/FormDisplayer.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/utils/FormDisplayer.java
@@ -33,6 +33,7 @@ import org.apache.sqoop.model.MJob;
 import org.apache.sqoop.model.MMapInput;
 import org.apache.sqoop.model.MStringInput;
 import org.apache.sqoop.shell.core.Constants;
+import org.apache.sqoop.validation.Message;
 import org.apache.sqoop.validation.Status;
 
 import java.util.ArrayList;
@@ -163,7 +164,9 @@ public final class FormDisplayer {
           print("\n@|yellow %s|@\n", resourceString(Constants.RES_FORMDISPLAYER_FORM_WARNING));
           showMessage = false;
         }
-        FormFiller.warningMessage(form.getValidationMessage());
+        for(Message message : form.getValidationMessages()) {
+          FormFiller.warningMessage(message.getMessage());
+        }
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/f89368e2/shell/src/main/java/org/apache/sqoop/shell/utils/FormFiller.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/sqoop/shell/utils/FormFiller.java b/shell/src/main/java/org/apache/sqoop/shell/utils/FormFiller.java
index 9d63c6e..bbf7af7 100644
--- a/shell/src/main/java/org/apache/sqoop/shell/utils/FormFiller.java
+++ b/shell/src/main/java/org/apache/sqoop/shell/utils/FormFiller.java
@@ -33,6 +33,8 @@ import org.apache.sqoop.model.MJob;
 import org.apache.sqoop.model.MNamedElement;
 import org.apache.sqoop.model.MStringInput;
 import org.apache.sqoop.model.MValidatedElement;
+import org.apache.sqoop.validation.Message;
+import org.apache.sqoop.validation.Status;
 
 import java.io.IOException;
 import java.util.List;
@@ -849,19 +851,24 @@ public final class FormFiller {
    * @param element Validated element
    */
   public static void printValidationMessage(MValidatedElement element, boolean includeInputPrefix) {
-    switch (element.getValidationStatus()) {
+    if(element.getValidationStatus() == Status.getDefault()) {
+      return;
+    }
+
+    for(Message message : element.getValidationMessages())
+    switch (message.getStatus()) {
       case UNACCEPTABLE:
         if (includeInputPrefix) {
-          errorMessage(element, element.getValidationMessage());
+          errorMessage(element, message.getMessage());
         } else {
-          errorMessage(element.getValidationMessage());
+          errorMessage(message.getMessage());
         }
         break;
       case ACCEPTABLE:
         if (includeInputPrefix) {
-          warningMessage(element, element.getValidationMessage());
+          warningMessage(element, message.getMessage());
         } else {
-          warningMessage(element.getValidationMessage());
+          warningMessage(message.getMessage());
         }
         break;
       default: