diff --git a/azkaban-common/src/main/java/azkaban/project/validator/XmlValidatorManager.java b/azkaban-common/src/main/java/azkaban/project/validator/XmlValidatorManager.java
index 882145d..c231b0a 100644
--- a/azkaban-common/src/main/java/azkaban/project/validator/XmlValidatorManager.java
+++ b/azkaban-common/src/main/java/azkaban/project/validator/XmlValidatorManager.java
@@ -68,7 +68,7 @@ public class XmlValidatorManager implements ValidatorManager {
validatorDirPath = props.getString(VALIDATOR_PLUGIN_DIR, DEFAULT_VALIDATOR_DIR);
File validatorDir = new File(validatorDirPath);
if (!validatorDir.canRead() || !validatorDir.isDirectory()) {
- throw new ValidatorManagerException("Validator directory " + validatorDirPath
+ logger.warn("Validator directory " + validatorDirPath
+ " does not exist or is not a directory.");
}
@@ -76,11 +76,14 @@ public class XmlValidatorManager implements ValidatorManager {
List<URL> resources = new ArrayList<URL>();
try {
logger.info("Adding validator resources.");
- for (File f : validatorDir.listFiles()) {
- if (f.getName().endsWith(".jar")) {
- resourceTimestamps.put(f.getName(), f.lastModified());
- resources.add(f.toURI().toURL());
- logger.debug("adding to classpath " + f.toURI().toURL());
+ // Find JAR files only if the validator directory exists
+ if (validatorDir.canRead() && validatorDir.isDirectory()) {
+ for (File f : validatorDir.listFiles()) {
+ if (f.getName().endsWith(".jar")) {
+ resourceTimestamps.put(f.getName(), f.lastModified());
+ resources.add(f.toURI().toURL());
+ logger.debug("adding to classpath " + f.toURI().toURL());
+ }
}
}
} catch (MalformedURLException e) {
@@ -102,14 +105,16 @@ public class XmlValidatorManager implements ValidatorManager {
List<URL> resources = new ArrayList<URL>();
boolean reloadResources = false;
try {
- for (File f : validatorDir.listFiles()) {
- if (f.getName().endsWith(".jar")) {
- resources.add(f.toURI().toURL());
- if (resourceTimestamps.get(f.getName()) == null
- || resourceTimestamps.get(f.getName()) != f.lastModified()) {
- reloadResources = true;
- logger.info("Resource " + f.getName() + " is updated. Reload the classloader.");
- resourceTimestamps.put(f.getName(), f.lastModified());
+ if (validatorDir.canRead() && validatorDir.isDirectory()) {
+ for (File f : validatorDir.listFiles()) {
+ if (f.getName().endsWith(".jar")) {
+ resources.add(f.toURI().toURL());
+ if (resourceTimestamps.get(f.getName()) == null
+ || resourceTimestamps.get(f.getName()) != f.lastModified()) {
+ reloadResources = true;
+ logger.info("Resource " + f.getName() + " is updated. Reload the classloader.");
+ resourceTimestamps.put(f.getName(), f.lastModified());
+ }
}
}
}
diff --git a/azkaban-common/src/test/java/azkaban/project/validator/XmlValidatorManagerTest.java b/azkaban-common/src/test/java/azkaban/project/validator/XmlValidatorManagerTest.java
index 1e97efa..217e9a6 100644
--- a/azkaban-common/src/test/java/azkaban/project/validator/XmlValidatorManagerTest.java
+++ b/azkaban-common/src/test/java/azkaban/project/validator/XmlValidatorManagerTest.java
@@ -15,13 +15,17 @@ public class XmlValidatorManagerTest {
/**
* Test that if the validator directory does not exist, XmlValidatorManager
- * should throw an exception.
+ * should still load the default validator.
*/
- @Test(expected=ValidatorManagerException.class)
+ @Test
public void testNoValidatorsDir() {
Props props = new Props(baseProps);
- new XmlValidatorManager(props);
+ XmlValidatorManager manager = new XmlValidatorManager(props);
+ assertEquals("XmlValidatorManager should contain only the default validator when no xml configuration "
+ + "file is present.", manager.getValidatorsInfo().size(), 1);
+ assertEquals("XmlValidatorManager should contain only the default validator when no xml configuration "
+ + "file is present.", manager.getValidatorsInfo().get(0), XmlValidatorManager.DEFAULT_VALIDATOR_KEY);
}
/**