diff --git a/azkaban-common/src/main/java/azkaban/project/ProjectManager.java b/azkaban-common/src/main/java/azkaban/project/ProjectManager.java
index 64c450d..bd5b5a6 100644
--- a/azkaban-common/src/main/java/azkaban/project/ProjectManager.java
+++ b/azkaban-common/src/main/java/azkaban/project/ProjectManager.java
@@ -76,7 +76,12 @@ public class ProjectManager {
tempDir.mkdirs();
}
- validatorManager = new XmlValidatorManager(props);
+ // The prop passed to XmlValidatorManager is used to initialize all the validators
+ // Each validator will take certain key/value pairs from the prop to initialize
+ // itself.
+ Props prop = new Props(props);
+ prop.put(PROJECT_ARCHIVE_FILE_PATH, "initialize");
+ validatorManager = new XmlValidatorManager(prop);
loadAllProjects();
}
@@ -366,8 +371,13 @@ public class ProjectManager {
throw new ProjectManagerException("Error unzipping file.", e);
}
- props.put(PROJECT_ARCHIVE_FILE_PATH, archive.getAbsolutePath());
- validatorManager.loadValidators(props, logger);
+ // Since props is an instance variable of ProjectManager, and each invocation to the
+ // uploadProject manager needs to pass a different value for the PROJECT_ARCHIVE_FILE_PATH
+ // key, it is necessary to create a new instance of Props to make sure these different
+ // values are isolated from each other.
+ Props prop = new Props(props);
+ prop.put(PROJECT_ARCHIVE_FILE_PATH, archive.getAbsolutePath());
+ validatorManager.loadValidators(prop, logger);
logger.info("Validating project " + archive.getName() + " using the registered validators "
+ validatorManager.getValidatorsInfo().toString());
Map<String, ValidationReport> reports = validatorManager.validate(file);
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 f8215aa..45e52f1 100644
--- a/azkaban-webserver/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java
+++ b/azkaban-webserver/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java
@@ -1458,16 +1458,18 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
for (Entry<String, ValidationReport> reportEntry : reports.entrySet()) {
ValidationReport report = reportEntry.getValue();
if (!report.getErrorMsgs().isEmpty()) {
- message.append("Validator " + reportEntry.getKey() + " reports errors:\n");
+ message.append("Validator " + reportEntry.getKey() + " reports errors:<ul>");
for (String msg : report.getErrorMsgs()) {
- message.append(msg + "\n");
+ message.append("<li>" + msg + "</li>");
}
+ message.append("</ul>");
}
if (!report.getWarningMsgs().isEmpty()) {
- message.append("Validator " + reportEntry.getKey() + " reports warnings:\n");
+ message.append("Validator " + reportEntry.getKey() + " reports warnings:<ul>");
for (String msg : report.getWarningMsgs()) {
- message.append(msg + "\n");
+ message.append("<li>" + msg + "</li>");
}
+ message.append("</ul>");
}
}
if (message.length() > 0) {
@@ -1477,9 +1479,9 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
logger.info("Installation Failed.", e);
String error = e.getMessage();
if (error.length() > 512) {
- error = error.substring(0, 512) + "\nToo many errors to display.\n";
+ error = error.substring(0, 512) + "<br>Too many errors to display.<br>";
}
- ret.put("error", "Installation Failed.\n" + error);
+ ret.put("error", "Installation Failed.<br>" + error);
} finally {
if (tempDir.exists()) {
FileUtils.deleteDirectory(tempDir);