Weakened references to static listener types for unit pref change and fuel change.
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / fuel / FuelResolver.java
1 package com.billkuker.rocketry.motorsim.fuel;\r
2 \r
3 import java.io.File;\r
4 import java.io.FileInputStream;\r
5 import java.io.FileNotFoundException;\r
6 import java.io.IOException;\r
7 import java.lang.ref.WeakReference;\r
8 import java.net.URI;\r
9 import java.net.URISyntaxException;\r
10 import java.util.Collections;\r
11 import java.util.HashMap;\r
12 import java.util.HashSet;\r
13 import java.util.Iterator;\r
14 import java.util.Map;\r
15 import java.util.Set;\r
16 \r
17 import org.apache.log4j.Logger;\r
18 \r
19 import com.billkuker.rocketry.motorsim.Fuel;\r
20 import com.billkuker.rocketry.motorsim.io.MotorIO;\r
21 \r
22 public class FuelResolver {\r
23         private static final Logger log = Logger.getLogger(FuelResolver.class);\r
24         \r
25         public static class FuelNotFound extends Exception {\r
26                 private static final long serialVersionUID = 1L;\r
27         }\r
28         \r
29         public static interface FuelsChangeListener {\r
30                 public void fuelsChanged();\r
31         }\r
32 \r
33         private static Set<WeakReference<FuelsChangeListener>> listeners = new HashSet<WeakReference<FuelResolver.FuelsChangeListener>>();\r
34         private static Map<URI, Fuel> fuels = new HashMap<URI, Fuel>();\r
35         private static Map<Fuel, URI> uris = new HashMap<Fuel, URI>();\r
36 \r
37         static {\r
38                 try {\r
39                         add(new KNSB(), new URI("motorsim:KNSB"));\r
40                         add(new KNDX(), new URI("motorsim:KNDX"));\r
41                         add(new KNSU(), new URI("motorsim:KNSU"));\r
42                         add(new KNER(), new URI("motorsim:KNER"));\r
43                 } catch (URISyntaxException e) {\r
44                         e.printStackTrace();\r
45                 }\r
46         }\r
47         \r
48         public static void addFuelsChangeListener(FuelsChangeListener l){\r
49                 listeners.add(new WeakReference<FuelResolver.FuelsChangeListener>(l));\r
50         }\r
51         \r
52         public static void removeFuelsChangeListener(FuelsChangeListener l){\r
53                 listeners.remove(l);\r
54         }\r
55         \r
56         public static Map<URI, Fuel> getFuelMap(){\r
57                 return Collections.unmodifiableMap(fuels);\r
58         }\r
59 \r
60         public static URI getURI( Fuel f ){\r
61                 return uris.get(f);\r
62         }\r
63         \r
64         public static Fuel getFuel(URI u) throws FuelNotFound {\r
65                 if (fuels.containsKey(u))\r
66                         return fuels.get(u);\r
67                 return tryResolve(u);\r
68         }\r
69 \r
70         private static Fuel tryResolve(URI u) throws FuelNotFound {\r
71                 File f = new File(u);\r
72                 try {\r
73                         Fuel fuel = MotorIO.readFuel(new FileInputStream(f));\r
74                         add(fuel, u);\r
75                         return fuel;\r
76                 } catch (FileNotFoundException e) {\r
77                         throw new FuelNotFound();\r
78                 } catch (IOException e) {\r
79                         throw new FuelNotFound();\r
80                 }\r
81         }\r
82 \r
83         public static void add(Fuel f, URI uri) {\r
84                 fuels.put(uri, f);\r
85                 uris.put(f, uri);\r
86                 \r
87                 Iterator<WeakReference<FuelsChangeListener>> weakIter = listeners.iterator();\r
88                 while (weakIter.hasNext()) {\r
89                         WeakReference<FuelsChangeListener> weak = weakIter.next();\r
90                         FuelsChangeListener l = weak.get();\r
91                         if (l != null) {\r
92                                 l.fuelsChanged();\r
93                         } else {\r
94                                 log.debug("Weak reference to FCL is null");\r
95                                 weakIter.remove();\r
96                         }\r
97                 }\r
98         }\r
99 }\r