From 85c082f1e91e9de61b02f0e04dbe4f27ef165c56 Mon Sep 17 00:00:00 2001 From: David Gillingham Date: Thu, 23 Feb 2012 14:40:25 -0600 Subject: [PATCH] Issue #346: Create a dispose method for Parm and use it like AWIPS1's C++ destructor. Change-Id: I2e8a4e82d5efd210e546abbaf8c0aba960803a9d Former-commit-id: d79f7e961358a81999f6182e0bd423b1c533f2ff [formerly d79f7e961358a81999f6182e0bd423b1c533f2ff [formerly b6d7661be725d8a37a8294b0eda982208c35ecbe]] Former-commit-id: 5aa5b51a55079c61bae057c0171a5565f29920d6 Former-commit-id: f9ed20bada15f268158b162ca6fb3e107ab9fc09 --- .../core/internal/AbstractParmManager.java | 16 ++++++---- .../viz/gfe/core/internal/ParmManager.java | 11 ++++++- .../raytheon/viz/gfe/core/parm/DbParm.java | 12 +++++++ .../com/raytheon/viz/gfe/core/parm/Parm.java | 32 +++++++++++++++++++ .../viz/gfe/core/parm/ParmListeners.java | 16 +++++++++- .../raytheon/viz/gfe/core/parm/ParmOp.java | 14 +++++++- .../raytheon/viz/gfe/core/parm/VCParm.java | 4 +++ 7 files changed, 96 insertions(+), 9 deletions(-) diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/AbstractParmManager.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/AbstractParmManager.java index 6522d10e87..57cd43a73f 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/AbstractParmManager.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/AbstractParmManager.java @@ -74,7 +74,6 @@ import com.raytheon.viz.gfe.core.msgs.Message; import com.raytheon.viz.gfe.core.msgs.ShowISCGridsMsg; import com.raytheon.viz.gfe.core.parm.ABVParmID; import com.raytheon.viz.gfe.core.parm.Parm; -import com.raytheon.viz.gfe.core.parm.VCParm; import com.raytheon.viz.gfe.core.parm.vcparm.VCModule; /** @@ -88,6 +87,8 @@ import com.raytheon.viz.gfe.core.parm.vcparm.VCModule; * 03/26/2008 chammack Split non-mock code from MockParmManager * 02/23/2012 #346 dgilling Dispose of VCParms from this class's * dispose method. + * 02/23/2012 #346 dgilling Ensure all Parms are disposed when calling + * dispose method. * * * @@ -400,13 +401,16 @@ public abstract class AbstractParmManager implements IParmManager { dataManager.getNotificationRouter().removeObserver( this.siteActivationListener); - for (VCModule module : vcModules) { - ParmID pid = module.getGpi().getParmID(); - Parm p = getParm(pid); - if (p != null) { - ((VCParm) p).dispose(); + parms.acquireReadLock(); + try { + for (Parm p : parms) { + p.dispose(); } + } finally { + parms.releaseReadLock(); + } + for (VCModule module : vcModules) { module.dispose(); } diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/ParmManager.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/ParmManager.java index b7a6d41ddb..1b16042b98 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/ParmManager.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/ParmManager.java @@ -51,9 +51,9 @@ import com.raytheon.viz.gfe.core.DataManager; import com.raytheon.viz.gfe.core.parm.DbParm; import com.raytheon.viz.gfe.core.parm.Parm; import com.raytheon.viz.gfe.core.parm.ParmDisplayAttributes.VisMode; -import com.raytheon.viz.gfe.core.parm.vcparm.VCModule; import com.raytheon.viz.gfe.core.parm.VCParm; import com.raytheon.viz.gfe.core.parm.VParm; +import com.raytheon.viz.gfe.core.parm.vcparm.VCModule; import com.raytheon.viz.gfe.types.MutableInteger; /** @@ -69,6 +69,8 @@ import com.raytheon.viz.gfe.types.MutableInteger; * 05/19/08 #875 bphillip Implemented save forecast for vectors * 06/17/08 #940 bphillip Implemented GFE Locking * 08/19/09 2547 rjpeter Implement Test/Prac database display. + * 02/23/12 #346 dgilling Call Parm's dispose method when removing + * a Parm. * * * @author bphillip @@ -529,6 +531,7 @@ public class ParmManager extends AbstractParmManager { return mutableDb; } + @Override public DatabaseID getOrigMutableDatabase() { return origMutableDb; } @@ -766,6 +769,11 @@ public class ParmManager extends AbstractParmManager { } catch (GFEServerException e) { statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e); } + + // dispose the old parms + for (Parm p : removeParms) { + p.dispose(); + } } private void updateParmIdCache(final Collection removedDbs, @@ -1197,6 +1205,7 @@ public class ParmManager extends AbstractParmManager { return new ArrayList(iscDbs); } + @Override public ParmID getISCParmID(ParmID pid) { List iscDbs = getIscDatabases(); diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/DbParm.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/DbParm.java index c136d11d16..b36969bc13 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/DbParm.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/DbParm.java @@ -70,6 +70,7 @@ import com.raytheon.viz.gfe.core.griddata.IGridData; * 06/17/08 #940 bphillip Implemented GFE Locking * 01/29/08 #1271 njensen Rewrote populateGridFromData() * to use IFPClient + * 02/23/12 #346 dgilling Implement a dispose method. * * * @@ -114,6 +115,17 @@ public class DbParm extends Parm { } } + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.gfe.core.parm.Parm#dispose() + */ + @Override + public void dispose() { + super.dispose(); + looseLocks(); + } + // -- private // ---------------------------------------------------------------- // DbParm::getGridsFromDb() diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/Parm.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/Parm.java index 35201ab0f0..78a52ded63 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/Parm.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/Parm.java @@ -171,6 +171,8 @@ import com.vividsolutions.jts.geom.Coordinate; * 12Sep2008 #1332 wdougherty Added deleteLockedTR() for editing hazards. * 04/16/2009 #2262 rjpeter Updated pencilStretch to return Grid2DBit. * 06/08/2009 #2159 rjpeter Fixed undo. + * 02/23/2012 #346 dgilling Implement a dispose method to mimic + * AWIPS1 use of C++ destructor. * * * @author chammack @@ -346,7 +348,37 @@ public abstract class Parm implements Comparable { if (this.officeType == null) { this.officeType = dataManager.getOfficeType(); } + } + public void dispose() { + if (isModified()) { + statusHandler.warn("Destroying parm " + getParmID().toString() + + " with modified data."); + } + + if (dataManager.getParmOp() != null) { + dataManager.getParmOp().clearUndoParmList(this); + } + + // cleanup interpolator stuff + finishInterpolation(true); + + // Once this is done we had better not talk to any of the parm clients + // again... + parmListeners.clearParmListeners(); + + // Remove the undo grids + purgeUndoGrids(); + + // remove all grids + grids.acquireWriteLock(); + try { + grids.clear(); + } finally { + grids.releaseWriteLock(); + } + + return; } /** diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/ParmListeners.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/ParmListeners.java index 5164b5e514..f5eebb9ced 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/ParmListeners.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/ParmListeners.java @@ -53,8 +53,9 @@ import com.raytheon.viz.gfe.core.wxvalue.WxValue; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jun 13, 2008 chammack Initial creation - * Sep 01, 2009 #2788 randerso Changed listener lists to sets to prevent + * Sep 01, 2009 #2788 randerso Changed listener lists to sets to prevent * multiple registration + * Feb 23, 2012 #346 dgilling Implement clearParmListeners. * * * @@ -100,6 +101,19 @@ public class ParmListeners { this.notificationPool = pool; } + protected void clearParmListeners() { + this.gridChangedListeners.clear(); + this.parmInventoryChangedListeners.clear(); + this.parmIDChangedListeners.clear(); + this.selectionTimeRangeChangedListeners.clear(); + this.parameterSelectionChangedListeners.clear(); + this.combineModeChangedListeners.clear(); + this.vectorModeChangedListeners.clear(); + this.pickupValueChangedListeners.clear(); + this.colorTableModifiedListeners.clear(); + this.lockTableChangedListeners.clear(); + } + public void fireGridChangedListener(final ParmID parmID, final TimeRange validTime) { for (Object listener : this.gridChangedListeners.getListeners()) { diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/ParmOp.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/ParmOp.java index 428453a845..0af5718f08 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/ParmOp.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/ParmOp.java @@ -77,7 +77,9 @@ import com.raytheon.viz.gfe.core.wxvalue.WxValue; * ------------ ---------- ----------- -------------------------- * 04/04/2008 1066 Dan Fitch Initial Creation * 11/11/2008 1666 njensen Added procedure cmds - * 06/24/09 1876 njensen Publish updates inventory + * 06/24/2009 1876 njensen Publish updates inventory + * 02/23/2012 1876 dgilling Implement missing clearUndoParmList + * function. * * * @@ -109,6 +111,16 @@ public class ParmOp { this.dataManager = dataManager; } + /** + * Removes a parm from the list that can be undone. + * + * @param p + * Parm to remove from the undo list. + */ + public void clearUndoParmList(Parm p) { + undoParmList.remove(p); + } + /** * Resets the undo parm list. This is normally commanded by the edit tools * prior to an edit operation. diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/VCParm.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/VCParm.java index ecb4a4d242..437656701e 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/VCParm.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/VCParm.java @@ -63,6 +63,7 @@ import com.raytheon.viz.gfe.core.parm.vcparm.VCModule.VCInventory; * safety and fix disappearing ISC * data. Also, remove overridden * finalize function. + * Feb 23, 2012 #346 dgilling Implement a dispose method. * * * @@ -115,7 +116,10 @@ public class VCParm extends VParm implements IParmListChangedListener, dataMgr.getParmManager().addParmListChangedListener(this); } + @Override public void dispose() { + super.dispose(); + this.dataManager.getParmManager().removeParmListChangedListener(this); // Unregister for the parm client notifications