Issue #346: Create a dispose method for Parm and use it like AWIPS1's C++ destructor.

Change-Id: I2e8a4e82d5efd210e546abbaf8c0aba960803a9d

Former-commit-id: 5aa5b51a55 [formerly d79f7e9613 [formerly b6d7661be725d8a37a8294b0eda982208c35ecbe]]
Former-commit-id: d79f7e9613
Former-commit-id: ef903bc728
This commit is contained in:
David Gillingham 2012-02-23 14:40:25 -06:00
parent adfd42b5ce
commit 586f77e788
7 changed files with 96 additions and 9 deletions

View file

@ -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.
*
* </pre>
*
@ -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();
}

View file

@ -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.
* </pre>
*
* @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<DatabaseID> removedDbs,
@ -1197,6 +1205,7 @@ public class ParmManager extends AbstractParmManager {
return new ArrayList<DatabaseID>(iscDbs);
}
@Override
public ParmID getISCParmID(ParmID pid) {
List<DatabaseID> iscDbs = getIscDatabases();

View file

@ -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.
*
* </pre>
*
@ -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()

View file

@ -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.
* </pre>
*
* @author chammack
@ -346,7 +348,37 @@ public abstract class Parm implements Comparable<Parm> {
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;
}
/**

View file

@ -55,6 +55,7 @@ import com.raytheon.viz.gfe.core.wxvalue.WxValue;
* Jun 13, 2008 chammack Initial creation
* Sep 01, 2009 #2788 randerso Changed listener lists to sets to prevent
* multiple registration
* Feb 23, 2012 #346 dgilling Implement clearParmListeners.
*
* </pre>
*
@ -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()) {

View file

@ -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.
*
* </pre>
*
@ -109,6 +111,16 @@ public class ParmOp {
this.dataManager = dataManager;
}
/**
* Removes a parm from the list that can be undone.
*
* @param p
* <code>Parm</code> 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.

View file

@ -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.
*
* </pre>
*
@ -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