Weakened references to static listener types for unit pref change and fuel change.
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / fuel / FuelResolver.java
index 7152b9176e2371cdccdc79f46768bf1d71f4ae79..ad9f09fb06edce650af67c8358836ff2731b31d6 100644 (file)
@@ -1,30 +1,66 @@
 package com.billkuker.rocketry.motorsim.fuel;\r
 \r
+import java.io.File;\r
+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
+       \r
+       public static interface FuelsChangeListener {\r
+               public void fuelsChanged();\r
+       }\r
 \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
        static {\r
-               add(new KNSB());\r
-               add(new KNDX());\r
-               add(new KNSU());\r
-               add(new KNER());\r
+               try {\r
+                       add(new KNSB(), new URI("motorsim:KNSB"));\r
+                       add(new KNDX(), new URI("motorsim:KNDX"));\r
+                       add(new KNSU(), new URI("motorsim:KNSU"));\r
+                       add(new KNER(), new URI("motorsim:KNER"));\r
+               } catch (URISyntaxException e) {\r
+                       e.printStackTrace();\r
+               }\r
+       }\r
+       \r
+       public static void addFuelsChangeListener(FuelsChangeListener l){\r
+               listeners.add(new WeakReference<FuelResolver.FuelsChangeListener>(l));\r
+       }\r
+       \r
+       public static void removeFuelsChangeListener(FuelsChangeListener l){\r
+               listeners.remove(l);\r
        }\r
        \r
-       public Map<URI, Fuel> getFuelMap(){\r
+       public static Map<URI, Fuel> getFuelMap(){\r
                return Collections.unmodifiableMap(fuels);\r
        }\r
 \r
+       public static URI getURI( Fuel f ){\r
+               return uris.get(f);\r
+       }\r
+       \r
        public static Fuel getFuel(URI u) throws FuelNotFound {\r
                if (fuels.containsKey(u))\r
                        return fuels.get(u);\r
@@ -32,10 +68,32 @@ public class FuelResolver {
        }\r
 \r
        private static Fuel tryResolve(URI u) throws FuelNotFound {\r
-               throw new FuelNotFound();\r
+               File f = new File(u);\r
+               try {\r
+                       Fuel fuel = MotorIO.readFuel(new FileInputStream(f));\r
+                       add(fuel, u);\r
+                       return fuel;\r
+               } catch (FileNotFoundException e) {\r
+                       throw new FuelNotFound();\r
+               } catch (IOException e) {\r
+                       throw new FuelNotFound();\r
+               }\r
        }\r
 \r
-       private static void add(Fuel f) {\r
-               fuels.put(f.getURI(), f);\r
+       public static void add(Fuel f, URI uri) {\r
+               fuels.put(uri, f);\r
+               uris.put(f, uri);\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