package org.stagemonitor.web.monitor.widget;
import org.stagemonitor.configuration.ConfigurationRegistry;
import org.stagemonitor.core.Stagemonitor;
import org.stagemonitor.core.util.JsonUtils;
import org.stagemonitor.tracing.reporter.ReadbackSpan;
import org.stagemonitor.tracing.utils.SpanUtils;
import org.stagemonitor.util.IOUtils;
import org.stagemonitor.web.WebPlugin;
import org.stagemonitor.web.monitor.filter.HtmlInjector;
import java.util.ArrayList;
import java.util.List;
public class StagemonitorWidgetHtmlInjector extends HtmlInjector {
/**
* Whether the in browser widget should be opened automatically
* (without needing to click on the speaker icon)
*/
private final boolean openImmediately;
private WebPlugin webPlugin;
private ConfigurationRegistry configuration;
private String widgetTemplate;
private String contextPath;
public StagemonitorWidgetHtmlInjector() {
this(false);
}
public StagemonitorWidgetHtmlInjector(boolean openImmediately) {
this.openImmediately = openImmediately;
}
@Override
public void init(HtmlInjector.InitArguments initArguments) {
this.configuration = initArguments.getConfiguration();
this.webPlugin = initArguments.getConfiguration().getConfig(WebPlugin.class);
contextPath = initArguments.getServletContext().getContextPath();
this.widgetTemplate = buildWidgetTemplate(contextPath);
}
private String buildWidgetTemplate(String contextPath) {
return IOUtils.getResourceAsString("stagemonitorWidget.html")
.replace("@@CONTEXT_PREFIX_PATH@@", contextPath)
.replace("@@OPEN_IMMEDIATELY@@", Boolean.toString(openImmediately))
.replace("@@OVERLAY_DISPLAY@@", openImmediately ? "block" : "none");
}
@Override
public boolean isActive(HtmlInjector.IsActiveArguments isActiveArguments) {
return webPlugin.isWidgetAndStagemonitorEndpointsAllowed(isActiveArguments.getHttpServletRequest(), configuration);
}
@Override
public void injectHtml(HtmlInjector.InjectArguments injectArguments) {
ReadbackSpan span = null;
if (injectArguments.getSpanContext() != null) {
span = injectArguments.getSpanContext().getReadbackSpan();
}
final List<String> pathsOfWidgetTabPlugins = new ArrayList<String>();
for (String path : Stagemonitor.getPathsOfWidgetTabPlugins()) {
pathsOfWidgetTabPlugins.add(contextPath + path);
}
final List<String> pathsOfWidgetMetricTabPlugins = new ArrayList<String>();
for (String path : Stagemonitor.getPathsOfWidgetMetricTabPlugins()) {
pathsOfWidgetMetricTabPlugins.add(contextPath + path);
}
injectArguments.setContentToInjectBeforeClosingBody(widgetTemplate
.replace("@@JSON_REQUEST_TACE_PLACEHOLDER@@", span != null ? JsonUtils.toJson(span, SpanUtils.CALL_TREE_ASCII) : "null")
.replace("@@CONFIGURATION_OPTIONS@@", JsonUtils.toJson(configuration.getConfigurationOptionsByCategory()))
.replace("@@CONFIGURATION_PWD_SET@@", Boolean.toString(configuration.isPasswordSet()))
.replace("@@CONFIGURATION_SOURCES@@", JsonUtils.toJson(configuration.getNamesOfConfigurationSources()))
.replace("@@MEASUREMENT_SESSION@@", JsonUtils.toJson(Stagemonitor.getMeasurementSession()))
.replace("@@PATHS_OF_TAB_PLUGINS@@", JsonUtils.toJson(pathsOfWidgetTabPlugins))
.replace("@@PATHS_OF_WIDGET_METRIC_TAB_PLUGINS@@", JsonUtils.toJson(pathsOfWidgetMetricTabPlugins)));
}
}