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);