From 2c687a406488359b77ea942370ac23341c133740 Mon Sep 17 00:00:00 2001 From: Ben Steffensmeier Date: Wed, 5 Mar 2014 11:04:05 -0600 Subject: [PATCH] Issue #2843 Harden recycle. Former-commit-id: 26c1a8e494d8c9eb1a5bb2492de7eda61c78a305 [formerly 26c1a8e494d8c9eb1a5bb2492de7eda61c78a305 [formerly 364b818dbd055b13fd8d5bb9f40c16f730f30b53]] Former-commit-id: 3cd6b29e75d09d49fc6e28549631aed75547d5d8 Former-commit-id: af1bdf1b53bd6a56e44da645eaf00beeed701f98 --- .../dataprovider/CollaborationDispatcher.java | 27 +++++++++++++++---- .../scales/MapScaleRenderableDisplay.java | 14 ++++++++-- .../uf/viz/core/rsc/AbstractVizResource.java | 4 +++ .../graphics/DispatchingGraphicsFactory.java | 24 +++++++++++++---- 4 files changed, 57 insertions(+), 12 deletions(-) diff --git a/cave/com.raytheon.uf.viz.collaboration.display/src/com/raytheon/uf/viz/collaboration/display/roles/dataprovider/CollaborationDispatcher.java b/cave/com.raytheon.uf.viz.collaboration.display/src/com/raytheon/uf/viz/collaboration/display/roles/dataprovider/CollaborationDispatcher.java index 0b2296fa99..baa0ad9b0e 100644 --- a/cave/com.raytheon.uf.viz.collaboration.display/src/com/raytheon/uf/viz/collaboration/display/roles/dataprovider/CollaborationDispatcher.java +++ b/cave/com.raytheon.uf.viz.collaboration.display/src/com/raytheon/uf/viz/collaboration/display/roles/dataprovider/CollaborationDispatcher.java @@ -62,10 +62,12 @@ import com.raytheon.viz.ui.input.InputAdapter; * * SOFTWARE HISTORY * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * Apr 19, 2012 mschenke Initial creation - * Feb 19, 2014 2751 bclement added check for closed session + * Date Ticket# Engineer Description + * ------------- -------- ----------- -------------------------- + * Apr 19, 2012 mschenke Initial creation + * Feb 19, 2014 2751 bclement added check for closed session + * Mar 05, 2014 2843 bsteffen Prevent exceptions on dispose. + * * * * @@ -250,7 +252,22 @@ public class CollaborationDispatcher extends Dispatcher { }); // Need to immediately send eventObject if (immediateSend) { - send(eventObject); + try { + send(eventObject); + } catch (RuntimeException e) { + /* + * Dispose events should never throw exceptions. Since + * disposed objects are not used after dispose the exception + * is not useful and it often corrupts the display + * permanently so it is better to log it and ignore it. + */ + if (eventObject instanceof DisposeObjectEvent) { + Activator.statusHandler.handle(Priority.PROBLEM, + e.getLocalizedMessage(), e); + } else { + throw e; + } + } } } else if (eventObject instanceof IRenderEvent) { if (eventObject instanceof BeginFrameEvent && currentFrame == null) { diff --git a/cave/com.raytheon.uf.viz.core.maps/src/com/raytheon/uf/viz/core/maps/scales/MapScaleRenderableDisplay.java b/cave/com.raytheon.uf.viz.core.maps/src/com/raytheon/uf/viz/core/maps/scales/MapScaleRenderableDisplay.java index 96b66eb999..f0aea4934b 100644 --- a/cave/com.raytheon.uf.viz.core.maps/src/com/raytheon/uf/viz/core/maps/scales/MapScaleRenderableDisplay.java +++ b/cave/com.raytheon.uf.viz.core.maps/src/com/raytheon/uf/viz/core/maps/scales/MapScaleRenderableDisplay.java @@ -53,6 +53,8 @@ import com.raytheon.uf.viz.core.rsc.ResourceProperties; * Mar 22, 2013 mschenke Initial creation * Oct 10, 2013 2104 mschenke Switched to use MapScalesManager * Nov 20, 2013 2492 bsteffen Recycle resources in clear. + * Mar 05, 2014 2843 bsteffen Catch recycle errors in clear. + * * * * @@ -140,8 +142,16 @@ public class MapScaleRenderableDisplay extends PlainMapRenderableDisplay && props.isSystemResource() == false) { list.remove(rp); } else { - props.setVisible(true); - rp.getResource().recycle(); + try { + props.setVisible(true); + rp.getResource().recycle(); + } catch (Throwable e) { + props.setVisible(false); + statusHandler.handle(Priority.PROBLEM, "Clear error: " + + e.getMessage() + ":: The resource [" + + rp.getResource().getSafeName() + + "] has been disabled.", e); + } } } diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractVizResource.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractVizResource.java index f4e6cfdf38..69757ebc75 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractVizResource.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractVizResource.java @@ -70,6 +70,9 @@ import com.raytheon.uf.viz.core.rsc.capabilities.Capabilities; * Jun 24, 2013 2140 randerso Added getSafeName method * Nov 18, 2013 2544 bsteffen Add recycleInternal so IResourceGroups * can recycle better. + * Mar 05, 2014 2843 bsteffen Set status to disposed during recycle and + * when recycle fails. + * * * * @@ -756,6 +759,7 @@ public abstract class AbstractVizResource * @@ -57,6 +60,9 @@ import com.vividsolutions.jts.geom.Coordinate; public class DispatchingGraphicsFactory extends AbstractGraphicsFactoryAdapter { + private static final IUFStatusHandler statusHandler = UFStatus + .getHandler(DispatchingGraphicsFactory.class); + private AbstractGraphicsFactoryAdapter delegate; private Dispatcher dispatcher; @@ -211,7 +217,15 @@ public class DispatchingGraphicsFactory extends AbstractGraphicsFactoryAdapter { for (ResourcePair rp : descriptor.getResourceList()) { if (rp.getResource() != null) { - rp.getResource().recycle(); + try { + rp.getResource().recycle(); + } catch (Throwable e) { + rp.getProperties().setVisible(false); + statusHandler.handle(Priority.PROBLEM, "Refresh error: " + + e.getMessage() + ":: The resource [" + + rp.getResource().getSafeName() + + "] has been disabled.", e); + } } } @@ -219,7 +233,7 @@ public class DispatchingGraphicsFactory extends AbstractGraphicsFactoryAdapter { try { descriptor.getTimeMatcher().redoTimeMatching(descriptor); } catch (VizException e) { - Activator.statusHandler.handle(Priority.PROBLEM, + statusHandler.handle(Priority.PROBLEM, "Error redoing time matching", e); } }