package org.stagemonitor.core; import org.stagemonitor.configuration.ConfigurationRegistry; import org.stagemonitor.configuration.ConfigurationOptionProvider; import org.stagemonitor.core.metrics.metrics2.Metric2Registry; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** * Base class for stagemonitor Plugins. * * The {@link #initializePlugin(InitArguments)} )} method serves as a initialisation callback * for plugins. */ public abstract class StagemonitorPlugin extends ConfigurationOptionProvider implements StagemonitorSPI { volatile boolean initialized; List<Runnable> onInitCallbacks = new CopyOnWriteArrayList<Runnable>(); public boolean isInitialized() { return initialized; } /** * Implementing classes have to initialize the plugin by registering their metrics the * {@link Metric2Registry} * @param initArguments */ public void initializePlugin(InitArguments initArguments) throws Exception { } /** * This method is called when stagemonitor shuts down. * The shutdown is triggered by {@link org.stagemonitor.web.monitor.filter.HttpRequestMonitorFilter#destroy()}, * for example. In non-servlet applications this method has to be called manually. * <p> * Note that this method will be called even if {@link #initializePlugin(InitArguments)} has not been called. */ public void onShutDown() throws Exception { } /** * StagemonitorPlugins can add additional tabs to the in browser widget. * A tab plugin consists of a javascript file and a html file. * <p/> * The files should be placed under * <code>src/main/resources/stagemonitor/static/some/sub/folder/myPlugin[.js|.html]</code> * if you return the path <code>/stagemonitor/static/some/sub/folder/myPlugin</code> * <p/> * The FileServlet serves all files under /src/main/resources/stagemonitor/static and * src/main/resources/stagemonitor/public/static */ public void registerWidgetTabPlugins(WidgetTabPluginsRegistry widgetTabPluginsRegistry) { } /** * StagemonitorPlugins can extend the metrics tab in the in browser widget. * A widget metrics tab plugin consists of a javascript file and a html file. * <p/> * The files should be placed under * <code>/src/main/resources/stagemonitor/static/some/sub/folder/{pluginId}[.js|.html]</code> * <p/> * The FileServlet serves all files under /src/main/resources/stagemonitor/static and * /src/main/resources/stagemonitor/public/static * <p/> * For documentation and a example of how a plugin should look like, see * <code>stagemonitor-ehcache/src/main/resources/stagemonitor/static/tabs/metrics</code> and * <code>stagemonitor-jvm/src/main/resources/stagemonitor/static/tabs/metrics</code> */ public void registerWidgetMetricTabPlugins(WidgetMetricTabPluginsRegistry widgetMetricTabPluginsRegistry) { } /** * If this plugin is initialized, the callback is executed immediately. Otherwise, it is executed after the plugin * has been initialized. * * @param onInitCallback the callback which is not executed in a different thread */ public void onInit(Runnable onInitCallback) { if (initialized) { onInitCallback.run(); } else { onInitCallbacks.add(onInitCallback); } } public static class InitArguments { private final Metric2Registry metricRegistry; private final ConfigurationRegistry configuration; private final MeasurementSession measurementSession; public InitArguments(Metric2Registry metricRegistry, ConfigurationRegistry configuration, MeasurementSession measurementSession) { this.metricRegistry = metricRegistry; this.configuration = configuration; this.measurementSession = measurementSession; } public Metric2Registry getMetricRegistry() { return metricRegistry; } public ConfigurationRegistry getConfiguration() { return configuration; } public <T extends StagemonitorPlugin> T getPlugin(Class<T> plugin) { return configuration.getConfig(plugin); } public MeasurementSession getMeasurementSession() { return measurementSession; } } public static class WidgetTabPluginsRegistry { private final List<String> pathsOfWidgetTabPlugins; WidgetTabPluginsRegistry(List<String> pathsOfWidgetTabPlugins) { this.pathsOfWidgetTabPlugins = pathsOfWidgetTabPlugins; } public void addWidgetTabPlugin(String pathOfWidgetTabPlugin) { pathsOfWidgetTabPlugins.add(pathOfWidgetTabPlugin); } } public static class WidgetMetricTabPluginsRegistry { private final List<String> pathsOfWidgetMetricTabPlugins; WidgetMetricTabPluginsRegistry(List<String> pathsOfWidgetMetricTabPlugins) { this.pathsOfWidgetMetricTabPlugins = pathsOfWidgetMetricTabPlugins; } public void addWidgetMetricTabPlugin(String pathOfWidgetMetricTabPlugin) { pathsOfWidgetMetricTabPlugins.add(pathOfWidgetMetricTabPlugin); } } }