azkaban-aplcache

Details

diff --git a/azkaban-common/src/main/java/azkaban/AzkabanCommonModule.java b/azkaban-common/src/main/java/azkaban/AzkabanCommonModule.java
index f57c2eb..ec91f67 100644
--- a/azkaban-common/src/main/java/azkaban/AzkabanCommonModule.java
+++ b/azkaban-common/src/main/java/azkaban/AzkabanCommonModule.java
@@ -21,7 +21,9 @@ import azkaban.db.DatabaseOperator;
 import azkaban.db.DatabaseOperatorImpl;
 import azkaban.db.H2FileDataSource;
 import azkaban.db.MySQLDataSource;
+import azkaban.executor.AlerterHolder;
 import azkaban.executor.ExecutorLoader;
+import azkaban.executor.ExecutorManager;
 import azkaban.executor.JdbcExecutorLoader;
 import azkaban.project.JdbcProjectLoader;
 import azkaban.project.ProjectLoader;
@@ -78,6 +80,8 @@ public class AzkabanCommonModule extends AbstractModule {
     bind(DatabaseOperator.class).to(DatabaseOperatorImpl.class).in(Scopes.SINGLETON);
     bind(TriggerLoader.class).to(JdbcTriggerImpl.class).in(Scopes.SINGLETON);
     bind(DataSource.class).to(AzkabanDataSource.class);
+    bind(ExecutorManager.class).in(Scopes.SINGLETON);
+    bind(AlerterHolder.class).in(Scopes.SINGLETON);
   }
 
   public Class<? extends Storage> resolveStorageClassType() {
diff --git a/azkaban-common/src/main/java/azkaban/executor/AlerterHolder.java b/azkaban-common/src/main/java/azkaban/executor/AlerterHolder.java
new file mode 100644
index 0000000..10c502a
--- /dev/null
+++ b/azkaban-common/src/main/java/azkaban/executor/AlerterHolder.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright 2017 LinkedIn Corp.
+ *
+ * Licensed 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 azkaban.executor;
+
+import azkaban.alert.Alerter;
+import azkaban.utils.Emailer;
+import azkaban.utils.FileIOUtils;
+import azkaban.utils.Props;
+import azkaban.utils.PropsUtils;
+import com.google.inject.Inject;
+import java.io.File;
+import java.lang.reflect.Constructor;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.log4j.Logger;
+
+
+public class AlerterHolder {
+  private Map<String, Alerter> alerters;
+
+  private static Logger logger = Logger.getLogger(AlerterHolder.class);
+
+  @Inject
+  public AlerterHolder(Props props) {
+    try {
+      alerters = loadAlerters(props);
+    }
+    catch (Exception ex) {
+      logger.error(ex);
+      alerters = new HashMap<>();
+    }
+  }
+
+  private Map<String, Alerter> loadAlerters(Props props) {
+    Map<String, Alerter> allAlerters = new HashMap<String, Alerter>();
+    // load built-in alerters
+    Emailer mailAlerter = new Emailer(props);
+    allAlerters.put("email", mailAlerter);
+    // load all plugin alerters
+    String pluginDir = props.getString("alerter.plugin.dir", "plugins/alerter");
+    allAlerters.putAll(loadPluginAlerters(pluginDir));
+    return allAlerters;
+  }
+
+  private Map<String, Alerter> loadPluginAlerters(String pluginPath) {
+    File alerterPluginPath = new File(pluginPath);
+    if (!alerterPluginPath.exists()) {
+      return Collections.<String, Alerter> emptyMap();
+    }
+
+    Map<String, Alerter> installedAlerterPlugins =
+        new HashMap<String, Alerter>();
+    ClassLoader parentLoader = getClass().getClassLoader();
+    File[] pluginDirs = alerterPluginPath.listFiles();
+    ArrayList<String> jarPaths = new ArrayList<String>();
+    for (File pluginDir : pluginDirs) {
+      if (!pluginDir.isDirectory()) {
+        logger.error("The plugin path " + pluginDir + " is not a directory.");
+        continue;
+      }
+
+      // Load the conf directory
+      File propertiesDir = new File(pluginDir, "conf");
+      Props pluginProps = null;
+      if (propertiesDir.exists() && propertiesDir.isDirectory()) {
+        File propertiesFile = new File(propertiesDir, "plugin.properties");
+        File propertiesOverrideFile =
+            new File(propertiesDir, "override.properties");
+
+        if (propertiesFile.exists()) {
+          if (propertiesOverrideFile.exists()) {
+            pluginProps =
+                PropsUtils.loadProps(null, propertiesFile,
+                    propertiesOverrideFile);
+          } else {
+            pluginProps = PropsUtils.loadProps(null, propertiesFile);
+          }
+        } else {
+          logger.error("Plugin conf file " + propertiesFile + " not found.");
+          continue;
+        }
+      } else {
+        logger.error("Plugin conf path " + propertiesDir + " not found.");
+        continue;
+      }
+
+      String pluginName = pluginProps.getString("alerter.name");
+      List<String> extLibClasspath =
+          pluginProps.getStringList("alerter.external.classpaths",
+              (List<String>) null);
+
+      String pluginClass = pluginProps.getString("alerter.class");
+      if (pluginClass == null) {
+        logger.error("Alerter class is not set.");
+      } else {
+        logger.info("Plugin class " + pluginClass);
+      }
+
+      URLClassLoader urlClassLoader = null;
+      File libDir = new File(pluginDir, "lib");
+      if (libDir.exists() && libDir.isDirectory()) {
+        File[] files = libDir.listFiles();
+
+        ArrayList<URL> urls = new ArrayList<URL>();
+        for (int i = 0; i < files.length; ++i) {
+          try {
+            URL url = files[i].toURI().toURL();
+            urls.add(url);
+          } catch (MalformedURLException e) {
+            logger.error(e);
+          }
+        }
+        if (extLibClasspath != null) {
+          for (String extLib : extLibClasspath) {
+            try {
+              File file = new File(pluginDir, extLib);
+              URL url = file.toURI().toURL();
+              urls.add(url);
+            } catch (MalformedURLException e) {
+              logger.error(e);
+            }
+          }
+        }
+
+        urlClassLoader =
+            new URLClassLoader(urls.toArray(new URL[urls.size()]), parentLoader);
+      } else {
+        logger.error("Library path " + propertiesDir + " not found.");
+        continue;
+      }
+
+      Class<?> alerterClass = null;
+      try {
+        alerterClass = urlClassLoader.loadClass(pluginClass);
+      } catch (ClassNotFoundException e) {
+        logger.error("Class " + pluginClass + " not found.");
+        continue;
+      }
+
+      String source = FileIOUtils.getSourcePathFromClass(alerterClass);
+      logger.info("Source jar " + source);
+      jarPaths.add("jar:file:" + source);
+
+      Constructor<?> constructor = null;
+      try {
+        constructor = alerterClass.getConstructor(Props.class);
+      } catch (NoSuchMethodException e) {
+        logger.error("Constructor not found in " + pluginClass);
+        continue;
+      }
+
+      Object obj = null;
+      try {
+        obj = constructor.newInstance(pluginProps);
+      } catch (Exception e) {
+        logger.error(e);
+      }
+
+      if (!(obj instanceof Alerter)) {
+        logger.error("The object is not an Alerter");
+        continue;
+      }
+
+      Alerter plugin = (Alerter) obj;
+      installedAlerterPlugins.put(pluginName, plugin);
+    }
+
+    return installedAlerterPlugins;
+  }
+
+  public Alerter get(String alerterType) {
+    return this.alerters.get(alerterType);
+  }
+}
diff --git a/azkaban-common/src/main/java/azkaban/executor/ExecutorManager.java b/azkaban-common/src/main/java/azkaban/executor/ExecutorManager.java
index 1b0a86c..50bc5ca 100644
--- a/azkaban-common/src/main/java/azkaban/executor/ExecutorManager.java
+++ b/azkaban-common/src/main/java/azkaban/executor/ExecutorManager.java
@@ -20,6 +20,7 @@ import azkaban.Constants;
 import azkaban.metrics.CommonMetrics;
 import azkaban.utils.FlowUtils;
 import com.google.common.collect.Lists;
+import com.google.inject.Inject;
 import java.io.File;
 import java.io.IOException;
 import java.lang.Thread.State;
@@ -111,7 +112,7 @@ public class ExecutorManager extends EventHandler implements
   private long lastThreadCheckTime = -1;
   private String updaterStage = "not started";
 
-  private Map<String, Alerter> alerters;
+  private final AlerterHolder alerterHolder;
 
   File cacheDir;
 
@@ -121,15 +122,14 @@ public class ExecutorManager extends EventHandler implements
   private long lastSuccessfulExecutorInfoRefresh;
   private ExecutorService executorInforRefresherService;
 
-  public ExecutorManager(Props azkProps, ExecutorLoader loader,
-      Map<String, Alerter> alerters) throws ExecutorManagerException {
-    this.alerters = alerters;
+  @Inject
+  public ExecutorManager(Props azkProps, ExecutorLoader loader, AlerterHolder alerterHolder) throws ExecutorManagerException {
+    this.alerterHolder = alerterHolder;
     this.azkProps = azkProps;
     this.executorLoader = loader;
     this.setupExecutors();
 
-    queuedFlows =
-        new QueuedExecutions(azkProps.getLong(AZKABAN_WEBSERVER_QUEUE_SIZE, 100000));
+    queuedFlows = new QueuedExecutions(azkProps.getLong(AZKABAN_WEBSERVER_QUEUE_SIZE, 100000));
     this.loadQueuedFlows();
 
     cacheDir = new File(azkProps.getString("cache.directory", "cache"));
@@ -1436,7 +1436,7 @@ public class ExecutorManager extends EventHandler implements
     if(alertUser) {
       ExecutionOptions options = flow.getExecutionOptions();
       // But we can definitely email them.
-      Alerter mailAlerter = alerters.get("email");
+      Alerter mailAlerter = alerterHolder.get("email");
       if (flow.getStatus() == Status.FAILED || flow.getStatus() == Status.KILLED) {
         if (options.getFailureEmails() != null && !options.getFailureEmails().isEmpty()) {
           try {
@@ -1447,7 +1447,7 @@ public class ExecutorManager extends EventHandler implements
         }
         if (options.getFlowParameters().containsKey("alert.type")) {
           String alertType = options.getFlowParameters().get("alert.type");
-          Alerter alerter = alerters.get(alertType);
+          Alerter alerter = alerterHolder.get(alertType);
           if (alerter != null) {
             try {
               alerter.alertOnError(flow);
@@ -1471,7 +1471,7 @@ public class ExecutorManager extends EventHandler implements
         }
         if (options.getFlowParameters().containsKey("alert.type")) {
           String alertType = options.getFlowParameters().get("alert.type");
-          Alerter alerter = alerters.get(alertType);
+          Alerter alerter = alerterHolder.get(alertType);
           if (alerter != null) {
             try {
               alerter.alertOnSuccess(flow);
@@ -1576,7 +1576,7 @@ public class ExecutorManager extends EventHandler implements
     if (oldStatus != newStatus && newStatus.equals(Status.FAILED_FINISHING)) {
       // We want to see if we should give an email status on first failure.
       if (options.getNotifyOnFirstFailure()) {
-        Alerter mailAlerter = alerters.get("email");
+        Alerter mailAlerter = alerterHolder.get("email");
         try {
           mailAlerter.alertOnFirstError(flow);
         } catch (Exception e) {
@@ -1586,7 +1586,7 @@ public class ExecutorManager extends EventHandler implements
       }
       if (options.getFlowParameters().containsKey("alert.type")) {
         String alertType = options.getFlowParameters().get("alert.type");
-        Alerter alerter = alerters.get(alertType);
+        Alerter alerter = alerterHolder.get(alertType);
         if (alerter != null) {
           try {
             alerter.alertOnFirstError(flow);
diff --git a/azkaban-common/src/main/java/azkaban/trigger/builtin/SlaAlertAction.java b/azkaban-common/src/main/java/azkaban/trigger/builtin/SlaAlertAction.java
index 5b89ca7..2da27f8 100644
--- a/azkaban-common/src/main/java/azkaban/trigger/builtin/SlaAlertAction.java
+++ b/azkaban-common/src/main/java/azkaban/trigger/builtin/SlaAlertAction.java
@@ -16,6 +16,8 @@
 
 package azkaban.trigger.builtin;
 
+import azkaban.ServiceProvider;
+import azkaban.executor.AlerterHolder;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -36,17 +38,14 @@ public class SlaAlertAction implements TriggerAction {
   private String actionId;
   private SlaOption slaOption;
   private int execId;
-  private static Map<String, azkaban.alert.Alerter> alerters;
+  private AlerterHolder alerters;
   private static ExecutorManagerAdapter executorManager;
 
   public SlaAlertAction(String id, SlaOption slaOption, int execId) {
     this.actionId = id;
     this.slaOption = slaOption;
     this.execId = execId;
-  }
-
-  public static void setAlerters(Map<String, Alerter> alts) {
-    alerters = alts;
+    this.alerters = ServiceProvider.SERVICE_PROVIDER.getInstance(AlerterHolder.class);
   }
 
   public static void setExecutorManager(ExecutorManagerAdapter em) {
diff --git a/azkaban-common/src/test/java/azkaban/executor/ExecutorManagerTest.java b/azkaban-common/src/test/java/azkaban/executor/ExecutorManagerTest.java
index 8f84eca..abfdeee 100644
--- a/azkaban-common/src/test/java/azkaban/executor/ExecutorManagerTest.java
+++ b/azkaban-common/src/test/java/azkaban/executor/ExecutorManagerTest.java
@@ -16,6 +16,10 @@
 
 package azkaban.executor;
 
+import azkaban.AzkabanCommonModule;
+import azkaban.ServiceProvider;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -28,7 +32,6 @@ import java.util.Set;
 import org.junit.Assert;
 import org.junit.Test;
 
-import azkaban.alert.Alerter;
 import azkaban.user.User;
 import azkaban.utils.Pair;
 import azkaban.utils.Props;
@@ -65,7 +68,7 @@ public class ExecutorManagerTest {
 
     loader.addExecutor("localhost", 12345);
     loader.addExecutor("localhost", 12346);
-    return new ExecutorManager(props, loader, new HashMap<String, Alerter>());
+    return new ExecutorManager(props, loader, new AlerterHolder(props));
   }
 
   /*
@@ -79,7 +82,7 @@ public class ExecutorManagerTest {
     ExecutorLoader loader = new MockExecutorLoader();
     @SuppressWarnings("unused")
     ExecutorManager manager =
-      new ExecutorManager(props, loader, new HashMap<String, Alerter>());
+      new ExecutorManager(props, loader, new AlerterHolder(props));
   }
 
   /*
@@ -92,7 +95,7 @@ public class ExecutorManagerTest {
 
     ExecutorLoader loader = new MockExecutorLoader();
     ExecutorManager manager =
-      new ExecutorManager(props, loader, new HashMap<String, Alerter>());
+      new ExecutorManager(props, loader, new AlerterHolder(props));
     Set<Executor> activeExecutors =
       new HashSet(manager.getAllActiveExecutors());
 
@@ -116,7 +119,7 @@ public class ExecutorManagerTest {
     Executor executor2 = loader.addExecutor("localhost", 12346);
 
     ExecutorManager manager =
-      new ExecutorManager(props, loader, new HashMap<String, Alerter>());
+      new ExecutorManager(props, loader, new AlerterHolder(props));
     Set<Executor> activeExecutors =
       new HashSet(manager.getAllActiveExecutors());
     Assert.assertArrayEquals(activeExecutors.toArray(), new Executor[] {
@@ -134,7 +137,7 @@ public class ExecutorManagerTest {
     Executor executor1 = loader.addExecutor("localhost", 12345);
 
     ExecutorManager manager =
-      new ExecutorManager(props, loader, new HashMap<String, Alerter>());
+      new ExecutorManager(props, loader, new AlerterHolder(props));
     Assert.assertArrayEquals(manager.getAllActiveExecutors().toArray(),
       new Executor[] { executor1 });
 
@@ -161,7 +164,7 @@ public class ExecutorManagerTest {
     Executor executor1 = loader.addExecutor("localhost", 12345);
 
     ExecutorManager manager =
-      new ExecutorManager(props, loader, new HashMap<String, Alerter>());
+      new ExecutorManager(props, loader, new AlerterHolder(props));
     Set<Executor> activeExecutors =
       new HashSet(manager.getAllActiveExecutors());
     Assert.assertArrayEquals(activeExecutors.toArray(),
@@ -333,7 +336,7 @@ public class ExecutorManagerTest {
     executors.add(executor2);
 
     when(loader.fetchActiveExecutors()).thenReturn(executors);
-    manager = new ExecutorManager(props, loader, new HashMap<>());
+    manager = new ExecutorManager(props, loader, new AlerterHolder(props));
 
     flow1 = TestUtils.createExecutableFlow("exectest1", "exec1");
     flow2 = TestUtils.createExecutableFlow("exectest1", "exec2");
diff --git a/azkaban-common/src/test/java/azkaban/trigger/TriggerManagerDeadlockTest.java b/azkaban-common/src/test/java/azkaban/trigger/TriggerManagerDeadlockTest.java
index 8474606..b5d3076 100644
--- a/azkaban-common/src/test/java/azkaban/trigger/TriggerManagerDeadlockTest.java
+++ b/azkaban-common/src/test/java/azkaban/trigger/TriggerManagerDeadlockTest.java
@@ -16,6 +16,7 @@
 
 package azkaban.trigger;
 
+import azkaban.executor.AlerterHolder;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -47,9 +48,7 @@ public class TriggerManagerDeadlockTest {
     props.put("trigger.scan.interval", 1000);
     props.put("executor.port", 12321);
     execLoader = new MockExecutorLoader();
-    Map<String, Alerter> alerters = new HashMap<String, Alerter>();
-    ExecutorManager executorManager =
-        new ExecutorManager(props, execLoader, alerters);
+    ExecutorManager executorManager = new ExecutorManager(props, execLoader, new AlerterHolder(props));
     triggerManager = new TriggerManager(props, loader, executorManager);
   }
 
diff --git a/azkaban-web-server/src/main/java/azkaban/webapp/AzkabanWebServer.java b/azkaban-web-server/src/main/java/azkaban/webapp/AzkabanWebServer.java
index 3e301e7..e0a57cf 100644
--- a/azkaban-web-server/src/main/java/azkaban/webapp/AzkabanWebServer.java
+++ b/azkaban-web-server/src/main/java/azkaban/webapp/AzkabanWebServer.java
@@ -17,6 +17,7 @@
 package azkaban.webapp;
 
 import azkaban.AzkabanCommonModule;
+import azkaban.executor.AlerterHolder;
 import com.codahale.metrics.MetricRegistry;
 
 import com.google.inject.Guice;
@@ -159,7 +160,6 @@ public class AzkabanWebServer extends AzkabanServer {
   private final ExecutorManager executorManager;
   private final ScheduleManager scheduleManager;
   private final TriggerManager triggerManager;
-  private final Map<String, Alerter> alerters;
 
   private final ClassLoader baseClassLoader;
 
@@ -191,10 +191,8 @@ public class AzkabanWebServer extends AzkabanServer {
     sessionCache = new SessionCache(props);
     userManager = loadUserManager(props);
 
-    alerters = loadAlerters(props);
-
-    executorManager = loadExecutorManager(props);
     // TODO remove hack. Move injection to constructor
+    executorManager = SERVICE_PROVIDER.getInstance(ExecutorManager.class);
     projectManager = SERVICE_PROVIDER.getInstance(ProjectManager.class);
 
     triggerManager = loadTriggerManager(props);
@@ -272,11 +270,6 @@ public class AzkabanWebServer extends AzkabanServer {
     return manager;
   }
 
-  private ExecutorManager loadExecutorManager(Props props) throws Exception {
-    JdbcExecutorLoader loader = new JdbcExecutorLoader(props);
-    return new ExecutorManager(props, loader, alerters);
-  }
-
   private ScheduleManager loadScheduleManager(TriggerManager tm)
       throws Exception {
     logger.info("Loading trigger based scheduler");
@@ -299,7 +292,6 @@ public class AzkabanWebServer extends AzkabanServer {
     ExecuteFlowAction.setTriggerManager(triggerManager);
     KillExecutionAction.setExecutorManager(executorManager);
     SlaAlertAction.setExecutorManager(executorManager);
-    SlaAlertAction.setAlerters(alerters);
     SlaAlertAction.setExecutorManager(executorManager);
     CreateTriggerAction.setTriggerManager(triggerManager);
     ExecutionChecker.setExecutorManager(executorManager);
@@ -313,144 +305,6 @@ public class AzkabanWebServer extends AzkabanServer {
     triggerManager.registerActionType(CreateTriggerAction.type, CreateTriggerAction.class);
   }
 
-  private Map<String, Alerter> loadAlerters(Props props) {
-    Map<String, Alerter> allAlerters = new HashMap<String, Alerter>();
-    // load built-in alerters
-    Emailer mailAlerter = new Emailer(props);
-    allAlerters.put("email", mailAlerter);
-    // load all plugin alerters
-    String pluginDir = props.getString("alerter.plugin.dir", "plugins/alerter");
-    allAlerters.putAll(loadPluginAlerters(pluginDir));
-    return allAlerters;
-  }
-
-  private Map<String, Alerter> loadPluginAlerters(String pluginPath) {
-    File alerterPluginPath = new File(pluginPath);
-    if (!alerterPluginPath.exists()) {
-      return Collections.<String, Alerter> emptyMap();
-    }
-
-    Map<String, Alerter> installedAlerterPlugins =
-        new HashMap<String, Alerter>();
-    ClassLoader parentLoader = getClass().getClassLoader();
-    File[] pluginDirs = alerterPluginPath.listFiles();
-    ArrayList<String> jarPaths = new ArrayList<String>();
-    for (File pluginDir : pluginDirs) {
-      if (!pluginDir.isDirectory()) {
-        logger.error("The plugin path " + pluginDir + " is not a directory.");
-        continue;
-      }
-
-      // Load the conf directory
-      File propertiesDir = new File(pluginDir, "conf");
-      Props pluginProps = null;
-      if (propertiesDir.exists() && propertiesDir.isDirectory()) {
-        File propertiesFile = new File(propertiesDir, "plugin.properties");
-        File propertiesOverrideFile =
-            new File(propertiesDir, "override.properties");
-
-        if (propertiesFile.exists()) {
-          if (propertiesOverrideFile.exists()) {
-            pluginProps =
-                PropsUtils.loadProps(null, propertiesFile,
-                    propertiesOverrideFile);
-          } else {
-            pluginProps = PropsUtils.loadProps(null, propertiesFile);
-          }
-        } else {
-          logger.error("Plugin conf file " + propertiesFile + " not found.");
-          continue;
-        }
-      } else {
-        logger.error("Plugin conf path " + propertiesDir + " not found.");
-        continue;
-      }
-
-      String pluginName = pluginProps.getString("alerter.name");
-      List<String> extLibClasspath =
-          pluginProps.getStringList("alerter.external.classpaths",
-              (List<String>) null);
-
-      String pluginClass = pluginProps.getString("alerter.class");
-      if (pluginClass == null) {
-        logger.error("Alerter class is not set.");
-      } else {
-        logger.info("Plugin class " + pluginClass);
-      }
-
-      URLClassLoader urlClassLoader = null;
-      File libDir = new File(pluginDir, "lib");
-      if (libDir.exists() && libDir.isDirectory()) {
-        File[] files = libDir.listFiles();
-
-        ArrayList<URL> urls = new ArrayList<URL>();
-        for (int i = 0; i < files.length; ++i) {
-          try {
-            URL url = files[i].toURI().toURL();
-            urls.add(url);
-          } catch (MalformedURLException e) {
-            logger.error(e);
-          }
-        }
-        if (extLibClasspath != null) {
-          for (String extLib : extLibClasspath) {
-            try {
-              File file = new File(pluginDir, extLib);
-              URL url = file.toURI().toURL();
-              urls.add(url);
-            } catch (MalformedURLException e) {
-              logger.error(e);
-            }
-          }
-        }
-
-        urlClassLoader =
-            new URLClassLoader(urls.toArray(new URL[urls.size()]), parentLoader);
-      } else {
-        logger.error("Library path " + propertiesDir + " not found.");
-        continue;
-      }
-
-      Class<?> alerterClass = null;
-      try {
-        alerterClass = urlClassLoader.loadClass(pluginClass);
-      } catch (ClassNotFoundException e) {
-        logger.error("Class " + pluginClass + " not found.");
-        continue;
-      }
-
-      String source = FileIOUtils.getSourcePathFromClass(alerterClass);
-      logger.info("Source jar " + source);
-      jarPaths.add("jar:file:" + source);
-
-      Constructor<?> constructor = null;
-      try {
-        constructor = alerterClass.getConstructor(Props.class);
-      } catch (NoSuchMethodException e) {
-        logger.error("Constructor not found in " + pluginClass);
-        continue;
-      }
-
-      Object obj = null;
-      try {
-        obj = constructor.newInstance(pluginProps);
-      } catch (Exception e) {
-        logger.error(e);
-      }
-
-      if (!(obj instanceof Alerter)) {
-        logger.error("The object is not an Alerter");
-        continue;
-      }
-
-      Alerter plugin = (Alerter) obj;
-      installedAlerterPlugins.put(pluginName, plugin);
-    }
-
-    return installedAlerterPlugins;
-
-  }
-
   private void loadPluginCheckersAndActions(String pluginPath) {
     logger.info("Loading plug-in checker and action types");
     File triggerPluginPath = new File(pluginPath);