diff --git a/opennms-base-assembly/src/main/filtered/etc/events/opennms.events.xml b/opennms-base-assembly/src/main/filtered/etc/events/opennms.events.xml
index 6b9086f..438e3fb 100644
--- a/opennms-base-assembly/src/main/filtered/etc/events/opennms.events.xml
+++ b/opennms-base-assembly/src/main/filtered/etc/events/opennms.events.xml
@@ -1939,4 +1939,15 @@
clear-key="uei.opennms.org/internal/discovery/hardwareInventoryFailed:%dpname%:%nodeid%:%interface%"/>
-->
+
+ uei.opennms.org/internal/kscReportUpdated
+ OpenNMS-defined internal event: KSC report updated
+ <p>The KSC Report '%parm[reportTitle]%' has been updated (remaining graphs: %parm[graphCount]%).</p>
+ <p>Some graphs defined on the report have been removed, due to an invalid resource or chart.</p>
+ <p>A resource is not valid on any of the following situations: the nodeId (or nodeSource) doesn't exist, the resource type
+ is not valid or doesn't exist on the node, the resource name is not valid or doesn't exist on the node.</p>
+ <p>Check the logs for more details.</p>
+ The KSC Report %parm[reportTitle]% has been updated.
+ Warning
+
diff --git a/opennms-model/src/main/java/org/opennms/netmgt/EventConstants.java b/opennms-model/src/main/java/org/opennms/netmgt/EventConstants.java
index f29dfe9..e178c6c 100644
--- a/opennms-model/src/main/java/org/opennms/netmgt/EventConstants.java
+++ b/opennms-model/src/main/java/org/opennms/netmgt/EventConstants.java
@@ -664,6 +664,10 @@ public abstract class EventConstants {
public static final String HARDWARE_INVENTORY_FAILED_UEI = "uei.opennms.org/internal/discovery/hardwareInventoryFailed";
public static final String HARDWARE_INVENTORY_SUCCESSFUL_UEI = "uei.opennms.org/internal/discovery/hardwareInventorySuccessful";
+ public static final String KSC_REPORT_UPDATED_UEI = "uei.opennms.org/internal/kscReportUpdated";
+ public static final String PARAM_REPORT_TITLE = "reportTitle";
+ public static final String PARAM_REPORT_GRAPH_COUNT = "graphCount";
+
//
// end eventUEIs
//
diff --git a/opennms-webapp/src/main/java/org/opennms/web/controller/ksc/CustomViewController.java b/opennms-webapp/src/main/java/org/opennms/web/controller/ksc/CustomViewController.java
index b117e13..451425e 100644
--- a/opennms-webapp/src/main/java/org/opennms/web/controller/ksc/CustomViewController.java
+++ b/opennms-webapp/src/main/java/org/opennms/web/controller/ksc/CustomViewController.java
@@ -49,12 +49,15 @@ import javax.servlet.http.HttpServletResponse;
import org.opennms.core.concurrent.LogPreservingThreadFactory;
import org.opennms.core.utils.WebSecurityUtils;
+import org.opennms.netmgt.EventConstants;
import org.opennms.netmgt.config.KSC_PerformanceReportFactory;
import org.opennms.netmgt.config.kscReports.Graph;
import org.opennms.netmgt.config.kscReports.Report;
import org.opennms.netmgt.model.OnmsResource;
import org.opennms.netmgt.model.PrefabGraph;
+import org.opennms.netmgt.model.events.EventBuilder;
import org.opennms.web.api.Authentication;
+import org.opennms.web.api.Util;
import org.opennms.web.graph.KscResultSet;
import org.opennms.web.servlet.MissingParameterException;
import org.opennms.web.svclayer.KscReportService;
@@ -148,7 +151,18 @@ public class CustomViewController extends AbstractController implements Initiali
// Get the list of available prefabricated graph options
Map resourceMap = new HashMap();
Set prefabGraphs = new TreeSet();
- removeBrokenGraphsFromReport(report);
+ if (removeBrokenGraphsFromReport(report) && reportId > -1) {
+ m_kscReportFactory.setReport(reportId, report);
+ m_kscReportFactory.saveCurrent();
+ EventBuilder eb = new EventBuilder(EventConstants.KSC_REPORT_UPDATED_UEI, "Web UI");
+ eb.addParam(EventConstants.PARAM_REPORT_TITLE, report.getTitle() == null ? "Report #" + report.getId() : report.getTitle());
+ eb.addParam(EventConstants.PARAM_REPORT_GRAPH_COUNT, report.getGraphCount());
+ try {
+ Util.createEventProxy().send(eb.getEvent());
+ } catch (Throwable e) {
+ LOG.error("Can't send event " + eb.getEvent(), e);
+ }
+ }
List graphCollection = report.getGraphCollection();
if (!graphCollection.isEmpty()) {
List resources = getKscReportService().getResourcesFromGraphs(graphCollection);
@@ -285,19 +299,28 @@ public class CustomViewController extends AbstractController implements Initiali
return modelAndView;
}
- private void removeBrokenGraphsFromReport(Report report) {
+ // Returns true if the report was modified due to invalid resource IDs.
+ private boolean removeBrokenGraphsFromReport(Report report) {
for (Iterator itr = report.getGraphCollection().iterator(); itr.hasNext();) {
Graph graph = itr.next();
try {
- getKscReportService().getResourceFromGraph(graph);
+ OnmsResource r = getKscReportService().getResourceFromGraph(graph);
+ if (r == null) {
+ LOG.error("Removing graph '{}' in KSC report '{}' because the resource it refers to could not be found. Perhaps resource '{}' (or its ancestor) referenced by this graph no longer exists?", graph.getTitle(), report.getTitle(), graph.getResourceId());
+ itr.remove();
+ return true;
+ }
} catch (ObjectRetrievalFailureException orfe) {
LOG.error("Removing graph '{}' in KSC report '{}' because the resource it refers to could not be found. Perhaps resource '{}' (or its ancestor) referenced by this graph no longer exists?", graph.getTitle(), report.getTitle(), graph.getResourceId());
itr.remove();
+ return true;
} catch (Throwable e) {
LOG.error("Unexpected error while scanning through graphs in report: {}", e.getMessage(), e);
itr.remove();
+ return true;
}
}
+ return false;
}
private void promoteResourceAttributesIfNecessary(final OnmsResource resource) {
diff --git a/opennms-webapp/src/main/java/org/opennms/web/svclayer/KscReportService.java b/opennms-webapp/src/main/java/org/opennms/web/svclayer/KscReportService.java
index c5f9254..2a57209 100644
--- a/opennms-webapp/src/main/java/org/opennms/web/svclayer/KscReportService.java
+++ b/opennms-webapp/src/main/java/org/opennms/web/svclayer/KscReportService.java
@@ -79,7 +79,7 @@ public interface KscReportService {
* @param graphs a {@link java.util.List} object.
* @return a {@link java.util.List} object.
*/
- public ListgetResourcesFromGraphs(List graphs);
+ public List getResourcesFromGraphs(List graphs);
/**
* getTimeSpans
*
diff --git a/opennms-webapp/src/main/java/org/opennms/web/svclayer/ResourceService.java b/opennms-webapp/src/main/java/org/opennms/web/svclayer/ResourceService.java
index cadc735..9692755 100644
--- a/opennms-webapp/src/main/java/org/opennms/web/svclayer/ResourceService.java
+++ b/opennms-webapp/src/main/java/org/opennms/web/svclayer/ResourceService.java
@@ -34,6 +34,7 @@ import java.util.List;
import org.opennms.netmgt.model.OnmsNode;
import org.opennms.netmgt.model.OnmsResource;
import org.opennms.netmgt.model.PrefabGraph;
+import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
@@ -140,5 +141,6 @@ public interface ResourceService {
* @param resourceId a {@link java.lang.String} object.
* @return a {@link java.util.List} object.
*/
+ @Transactional(propagation = Propagation.REQUIRES_NEW)
public List getResourceListById(String resourceId);
}