Weakened references to static listener types for unit pref change and fuel change.
authorBill Kuker <bkuker@billkuker.com>
Tue, 23 Nov 2010 15:58:09 +0000 (15:58 +0000)
committerBill Kuker <bkuker@billkuker.com>
Tue, 23 Nov 2010 15:58:09 +0000 (15:58 +0000)
src/com/billkuker/rocketry/motorsim/RocketScience.java
src/com/billkuker/rocketry/motorsim/fuel/FuelResolver.java

index ed89d6bb20a7311c9abd40c162b581d6e9ce702f..b92f63cb4887ac6ad8e8bcb1be27e45ad1114201 100644 (file)
@@ -6,6 +6,7 @@ import java.lang.reflect.Modifier;
 import java.text.DecimalFormat;\r
 import java.text.NumberFormat;\r
 import java.util.HashSet;\r
+import java.util.Iterator;\r
 import java.util.Set;\r
 import java.util.prefs.Preferences;\r
 \r
@@ -17,9 +18,12 @@ import javax.measure.unit.SI;
 import javax.measure.unit.Unit;\r
 import javax.measure.unit.UnitFormat;\r
 \r
+import org.apache.log4j.Logger;\r
 import org.jscience.physics.amount.Amount;\r
 \r
 public class RocketScience {\r
+       private static final Logger log = Logger.getLogger(RocketScience.class);\r
+       \r
        public static Unit<Pressure> PSI = new ProductUnit<Pressure>(NonSI.POUND_FORCE.divide(NonSI.INCH.pow(2)));\r
        public static Unit<Impulse> NEWTON_SECOND = new ProductUnit<Impulse>(SI.NEWTON.times(SI.SECOND));\r
        public static Unit<Impulse> POUND_SECOND = new ProductUnit<Impulse>(NonSI.POUND_FORCE.times(SI.SECOND));\r
@@ -83,10 +87,16 @@ public class RocketScience {
                        preference = up;\r
                        Preferences prefs = Preferences.userNodeForPackage(RocketScience.class);\r
                        prefs.put("PreferedUnits", up.toString());\r
-                       for ( WeakReference<UnitPreferenceListener> weak : prefListeners ){\r
+                       Iterator<WeakReference<UnitPreferenceListener>> weakIter = prefListeners.iterator();\r
+                       while (weakIter.hasNext()) {\r
+                               WeakReference<UnitPreferenceListener> weak = weakIter.next();\r
                                UnitPreferenceListener l = weak.get();\r
-                               if ( l != null )\r
+                               if (l != null) {\r
                                        l.preferredUnitsChanged();\r
+                               } else {\r
+                                       log.debug("Weak reference to UPE is null");\r
+                                       weakIter.remove();\r
+                               }\r
                        }\r
                }\r
                \r
index b8ddfe94365e3d1344c2457687e3cb12b001650d..ad9f09fb06edce650af67c8358836ff2731b31d6 100644 (file)
@@ -4,18 +4,24 @@ import java.io.File;
 import java.io.FileInputStream;\r
 import java.io.FileNotFoundException;\r
 import java.io.IOException;\r
+import java.lang.ref.WeakReference;\r
 import java.net.URI;\r
 import java.net.URISyntaxException;\r
 import java.util.Collections;\r
 import java.util.HashMap;\r
 import java.util.HashSet;\r
+import java.util.Iterator;\r
 import java.util.Map;\r
 import java.util.Set;\r
 \r
+import org.apache.log4j.Logger;\r
+\r
 import com.billkuker.rocketry.motorsim.Fuel;\r
 import com.billkuker.rocketry.motorsim.io.MotorIO;\r
 \r
 public class FuelResolver {\r
+       private static final Logger log = Logger.getLogger(FuelResolver.class);\r
+       \r
        public static class FuelNotFound extends Exception {\r
                private static final long serialVersionUID = 1L;\r
        }\r
@@ -24,7 +30,7 @@ public class FuelResolver {
                public void fuelsChanged();\r
        }\r
 \r
-       private static Set<FuelsChangeListener> listeners = new HashSet<FuelResolver.FuelsChangeListener>();\r
+       private static Set<WeakReference<FuelsChangeListener>> listeners = new HashSet<WeakReference<FuelResolver.FuelsChangeListener>>();\r
        private static Map<URI, Fuel> fuels = new HashMap<URI, Fuel>();\r
        private static Map<Fuel, URI> uris = new HashMap<Fuel, URI>();\r
 \r
@@ -40,7 +46,7 @@ public class FuelResolver {
        }\r
        \r
        public static void addFuelsChangeListener(FuelsChangeListener l){\r
-               listeners.add(l);\r
+               listeners.add(new WeakReference<FuelResolver.FuelsChangeListener>(l));\r
        }\r
        \r
        public static void removeFuelsChangeListener(FuelsChangeListener l){\r
@@ -77,7 +83,17 @@ public class FuelResolver {
        public static void add(Fuel f, URI uri) {\r
                fuels.put(uri, f);\r
                uris.put(f, uri);\r
-               for ( FuelsChangeListener l : listeners )\r
-                       l.fuelsChanged();\r
+               \r
+               Iterator<WeakReference<FuelsChangeListener>> weakIter = listeners.iterator();\r
+               while (weakIter.hasNext()) {\r
+                       WeakReference<FuelsChangeListener> weak = weakIter.next();\r
+                       FuelsChangeListener l = weak.get();\r
+                       if (l != null) {\r
+                               l.fuelsChanged();\r
+                       } else {\r
+                               log.debug("Weak reference to FCL is null");\r
+                               weakIter.remove();\r
+                       }\r
+               }\r
        }\r
 }\r