azkaban-memoizeit

Display validator error and warning messages in different

1/28/2015 10:22:48 PM

Details

diff --git a/azkaban-common/src/main/java/azkaban/project/ProjectManager.java b/azkaban-common/src/main/java/azkaban/project/ProjectManager.java
index 98456c1..4af1c9e 100644
--- a/azkaban-common/src/main/java/azkaban/project/ProjectManager.java
+++ b/azkaban-common/src/main/java/azkaban/project/ProjectManager.java
@@ -80,6 +80,8 @@ public class ProjectManager {
     // initialize itself.
     Props prop = new Props(props);
     prop.put(ValidatorConfigs.PROJECT_ARCHIVE_FILE_PATH, "initialize");
+    // By instantiating an object of XmlValidatorManager, this will verify the
+    // config files for the validators.
     new XmlValidatorManager(prop);
     loadAllProjects();
   }
@@ -361,7 +363,7 @@ public class ProjectManager {
    * caller of this method should call method
    * {@ProjectFileHandler.deleteLocalFile}
    * to delete the temporary file.
-   * 
+   *
    * @param project
    * @param version - latest version is used if value is -1
    * @return ProjectFileHandler - null if can't find project zip file based on
diff --git a/azkaban-soloserver/.gitignore b/azkaban-soloserver/.gitignore
index 5ab4d17..eb3d928 100644
--- a/azkaban-soloserver/.gitignore
+++ b/azkaban-soloserver/.gitignore
@@ -4,5 +4,5 @@ executions/
 plugins/
 projects/
 temp/
-validators/
+validator_jars/
 *.log
diff --git a/azkaban-webserver/src/main/java/azkaban/webapp/servlet/AbstractAzkabanServlet.java b/azkaban-webserver/src/main/java/azkaban/webapp/servlet/AbstractAzkabanServlet.java
index 5b54af4..12c5993 100644
--- a/azkaban-webserver/src/main/java/azkaban/webapp/servlet/AbstractAzkabanServlet.java
+++ b/azkaban-webserver/src/main/java/azkaban/webapp/servlet/AbstractAzkabanServlet.java
@@ -52,6 +52,8 @@ public abstract class AbstractAzkabanServlet extends HttpServlet {
       .forPattern("z");
   private static final String AZKABAN_SUCCESS_MESSAGE =
       "azkaban.success.message";
+  private static final String AZKABAN_WARN_MESSAGE =
+      "azkaban.warn.message";
   private static final String AZKABAN_FAILURE_MESSAGE =
       "azkaban.failure.message";
 
@@ -222,6 +224,20 @@ public abstract class AbstractAzkabanServlet extends HttpServlet {
   }
 
   /**
+   * Sets a warning message in azkaban.warn.message in the cookie. This will
+   * be used by the web client javascript to somehow display the message
+   *
+   * @param response
+   * @param warnMsg
+   */
+  protected void setWarnMessageInCookie(HttpServletResponse response,
+      String errorMsg) {
+    Cookie cookie = new Cookie(AZKABAN_WARN_MESSAGE, errorMsg);
+    cookie.setPath("/");
+    response.addCookie(cookie);
+  }
+
+  /**
    * Sets a message in azkaban.success.message in the cookie. This will be used
    * by the web client javascript to somehow display the message
    *
@@ -251,6 +267,21 @@ public abstract class AbstractAzkabanServlet extends HttpServlet {
   }
 
   /**
+   * Retrieves a warn message from a cookie. azkaban.warn.message
+   *
+   * @param request
+   * @return
+   */
+  protected String getWarnMessageFromCookie(HttpServletRequest request) {
+    Cookie cookie = getCookieByName(request, AZKABAN_WARN_MESSAGE);
+
+    if (cookie == null) {
+      return null;
+    }
+    return cookie.getValue();
+  }
+
+  /**
    * Retrieves a success message from a cookie. azkaban.failure.message
    *
    * @param request
@@ -312,6 +343,11 @@ public abstract class AbstractAzkabanServlet extends HttpServlet {
         : errorMsg);
     setErrorMessageInCookie(resp, null);
 
+    String warnMsg = getWarnMessageFromCookie(req);
+    page.add("warn_message", warnMsg == null || warnMsg.isEmpty() ? "null"
+        : warnMsg);
+    setWarnMessageInCookie(resp, null);
+
     String successMsg = getSuccessMessageFromCookie(req);
     page.add("success_message",
         successMsg == null || successMsg.isEmpty() ? "null" : successMsg);
diff --git a/azkaban-webserver/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java b/azkaban-webserver/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java
index e7d5883..0997597 100644
--- a/azkaban-webserver/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java
+++ b/azkaban-webserver/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java
@@ -426,9 +426,9 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
 
   /**
    * Download project zip file from DB and send it back client.
-   * 
+   *
    * This method requires a project name and an optional project version.
-   * 
+   *
    * @param req
    * @param resp
    * @param session
@@ -1582,34 +1582,45 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
         Map<String, ValidationReport> reports =
             projectManager.uploadProject(project, archiveFile, type, user,
                 props);
-        StringBuffer message = new StringBuffer();
+        StringBuffer errorMsgs = new StringBuffer();
+        StringBuffer warnMsgs = new StringBuffer();
         for (Entry<String, ValidationReport> reportEntry : reports.entrySet()) {
           ValidationReport report = reportEntry.getValue();
           if (!report.getPassMsgs().isEmpty()) {
             for (String msg : report.getPassMsgs()) {
-              message.append(msg + "<br/>");
+              if (msg.startsWith("ERROR")) {
+                errorMsgs.append(msg.replaceFirst("ERROR", "") + "<br/>");
+              } else if (msg.startsWith("WARN")) {
+                warnMsgs.append(msg.replaceFirst("WARN", "") + "<br/>");
+              }
             }
-            message.append("<br/>");
           }
           if (!report.getErrorMsgs().isEmpty()) {
-            message.append("Validator " + reportEntry.getKey()
+            errorMsgs.append("Validator " + reportEntry.getKey()
                 + " reports errors:<ul>");
             for (String msg : report.getErrorMsgs()) {
-              message.append("<li>" + msg + "</li>");
+              errorMsgs.append("<li>" + msg + "</li>");
             }
-            message.append("</ul>");
+            errorMsgs.append("</ul>");
           }
           if (!report.getWarningMsgs().isEmpty()) {
-            message.append("Validator " + reportEntry.getKey()
+            warnMsgs.append("Validator " + reportEntry.getKey()
                 + " reports warnings:<ul>");
             for (String msg : report.getWarningMsgs()) {
-              message.append("<li>" + msg + "</li>");
+              warnMsgs.append("<li>" + msg + "</li>");
             }
-            message.append("</ul>");
+            warnMsgs.append("</ul>");
           }
         }
-        if (message.length() > 0) {
-          ret.put("error", message.toString());
+        if (errorMsgs.length() > 0) {
+          // If putting more than 4000 characters in the cookie, the entire message
+          // will somehow get discarded.
+          ret.put("error", errorMsgs.length() > 4000 ?
+              errorMsgs.substring(0, 4000) : errorMsgs.toString());
+        }
+        if (warnMsgs.length() > 0) {
+          ret.put("warn", warnMsgs.length() > 4000 ?
+              warnMsgs.substring(0, 4000) : warnMsgs.toString());
         }
       } catch (Exception e) {
         logger.info("Installation Failed.", e);
@@ -1643,6 +1654,10 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
       setErrorMessageInCookie(resp, ret.get("error"));
     }
 
+    if (ret.containsKey("warn")) {
+      setWarnMessageInCookie(resp, ret.get("warn"));
+    }
+
     resp.sendRedirect(req.getRequestURI() + "?project=" + projectName);
   }
 
diff --git a/azkaban-webserver/src/main/resources/azkaban/webapp/servlet/velocity/alerts.vm b/azkaban-webserver/src/main/resources/azkaban/webapp/servlet/velocity/alerts.vm
index 10831fb..1516519 100644
--- a/azkaban-webserver/src/main/resources/azkaban/webapp/servlet/velocity/alerts.vm
+++ b/azkaban-webserver/src/main/resources/azkaban/webapp/servlet/velocity/alerts.vm
@@ -21,6 +21,11 @@
         <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
         $error_message
       </div>
+#elseif ($warn_message != "null")
+      <div class="alert alert-warning alert-dismissable">
+        <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
+        $warn_message
+      </div>
 #elseif ($success_message != "null")
       <div class="alert alert-success">
         <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>