From 5e50620d533eb31b4bce1eb5b1c9a2982f1187c6 Mon Sep 17 00:00:00 2001 From: Bill Kuker Date: Tue, 23 Nov 2010 15:58:09 +0000 Subject: [PATCH] Weakened references to static listener types for unit pref change and fuel change. --- .../rocketry/motorsim/RocketScience.java | 14 +++++++++-- .../rocketry/motorsim/fuel/FuelResolver.java | 24 +++++++++++++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/com/billkuker/rocketry/motorsim/RocketScience.java b/src/com/billkuker/rocketry/motorsim/RocketScience.java index ed89d6b..b92f63c 100644 --- a/src/com/billkuker/rocketry/motorsim/RocketScience.java +++ b/src/com/billkuker/rocketry/motorsim/RocketScience.java @@ -6,6 +6,7 @@ import java.lang.reflect.Modifier; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.HashSet; +import java.util.Iterator; import java.util.Set; import java.util.prefs.Preferences; @@ -17,9 +18,12 @@ import javax.measure.unit.SI; import javax.measure.unit.Unit; import javax.measure.unit.UnitFormat; +import org.apache.log4j.Logger; import org.jscience.physics.amount.Amount; public class RocketScience { + private static final Logger log = Logger.getLogger(RocketScience.class); + public static Unit PSI = new ProductUnit(NonSI.POUND_FORCE.divide(NonSI.INCH.pow(2))); public static Unit NEWTON_SECOND = new ProductUnit(SI.NEWTON.times(SI.SECOND)); public static Unit POUND_SECOND = new ProductUnit(NonSI.POUND_FORCE.times(SI.SECOND)); @@ -83,10 +87,16 @@ public class RocketScience { preference = up; Preferences prefs = Preferences.userNodeForPackage(RocketScience.class); prefs.put("PreferedUnits", up.toString()); - for ( WeakReference weak : prefListeners ){ + Iterator> weakIter = prefListeners.iterator(); + while (weakIter.hasNext()) { + WeakReference weak = weakIter.next(); UnitPreferenceListener l = weak.get(); - if ( l != null ) + if (l != null) { l.preferredUnitsChanged(); + } else { + log.debug("Weak reference to UPE is null"); + weakIter.remove(); + } } } diff --git a/src/com/billkuker/rocketry/motorsim/fuel/FuelResolver.java b/src/com/billkuker/rocketry/motorsim/fuel/FuelResolver.java index b8ddfe9..ad9f09f 100644 --- a/src/com/billkuker/rocketry/motorsim/fuel/FuelResolver.java +++ b/src/com/billkuker/rocketry/motorsim/fuel/FuelResolver.java @@ -4,18 +4,24 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; +import java.lang.ref.WeakReference; import java.net.URI; import java.net.URISyntaxException; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.Map; import java.util.Set; +import org.apache.log4j.Logger; + import com.billkuker.rocketry.motorsim.Fuel; import com.billkuker.rocketry.motorsim.io.MotorIO; public class FuelResolver { + private static final Logger log = Logger.getLogger(FuelResolver.class); + public static class FuelNotFound extends Exception { private static final long serialVersionUID = 1L; } @@ -24,7 +30,7 @@ public class FuelResolver { public void fuelsChanged(); } - private static Set listeners = new HashSet(); + private static Set> listeners = new HashSet>(); private static Map fuels = new HashMap(); private static Map uris = new HashMap(); @@ -40,7 +46,7 @@ public class FuelResolver { } public static void addFuelsChangeListener(FuelsChangeListener l){ - listeners.add(l); + listeners.add(new WeakReference(l)); } public static void removeFuelsChangeListener(FuelsChangeListener l){ @@ -77,7 +83,17 @@ public class FuelResolver { public static void add(Fuel f, URI uri) { fuels.put(uri, f); uris.put(f, uri); - for ( FuelsChangeListener l : listeners ) - l.fuelsChanged(); + + Iterator> weakIter = listeners.iterator(); + while (weakIter.hasNext()) { + WeakReference weak = weakIter.next(); + FuelsChangeListener l = weak.get(); + if (l != null) { + l.fuelsChanged(); + } else { + log.debug("Weak reference to FCL is null"); + weakIter.remove(); + } + } } } -- 2.30.2