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..9f71e92 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 @@ -148,7 +148,10 @@ 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(); + } List graphCollection = report.getGraphCollection(); if (!graphCollection.isEmpty()) { List resources = getKscReportService().getResourcesFromGraphs(graphCollection); @@ -285,19 +288,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); }