Make unit listeners weak refs
[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.net.URI;\r
8 import java.net.URISyntaxException;\r
9 import java.util.Collections;\r
10 import java.util.HashMap;\r
11 import java.util.HashSet;\r
12 import java.util.Map;\r
13 import java.util.Set;\r
14 \r
15 import com.billkuker.rocketry.motorsim.Fuel;\r
16 import com.billkuker.rocketry.motorsim.io.MotorIO;\r
17 \r
18 public class FuelResolver {\r
19         public static class FuelNotFound extends Exception {\r
20                 private static final long serialVersionUID = 1L;\r
21         }\r
22         \r
23         public static interface FuelsChangeListener {\r
24                 public void fuelsChanged();\r
25         }\r
26 \r
27         private static Set<FuelsChangeListener> listeners = new HashSet<FuelResolver.FuelsChangeListener>();\r
28         private static Map<URI, Fuel> fuels = new HashMap<URI, Fuel>();\r
29         private static Map<Fuel, URI> uris = new HashMap<Fuel, URI>();\r
30 \r
31         static {\r
32                 try {\r
33                         add(new KNSB(), new URI("motorsim:KNSB"));\r
34                         add(new KNDX(), new URI("motorsim:KNDX"));\r
35                         add(new KNSU(), new URI("motorsim:KNSU"));\r
36                         add(new KNER(), new URI("motorsim:KNER"));\r
37                 } catch (URISyntaxException e) {\r
38                         e.printStackTrace();\r
39                 }\r
40         }\r
41         \r
42         public static void addFuelsChangeListener(FuelsChangeListener l){\r
43                 listeners.add(l);\r
44         }\r
45         \r
46         public static void removeFuelsChangeListener(FuelsChangeListener l){\r
47                 listeners.remove(l);\r
48         }\r
49         \r
50         public static Map<URI, Fuel> getFuelMap(){\r
51                 return Collections.unmodifiableMap(fuels);\r
52         }\r
53 \r
54         public static URI getURI( Fuel f ){\r
55                 return uris.get(f);\r
56         }\r
57         \r
58         public static Fuel getFuel(URI u) throws FuelNotFound {\r
59                 if (fuels.containsKey(u))\r
60                         return fuels.get(u);\r
61                 return tryResolve(u);\r
62         }\r
63 \r
64         private static Fuel tryResolve(URI u) throws FuelNotFound {\r
65                 File f = new File(u);\r
66                 try {\r
67                         Fuel fuel = MotorIO.readFuel(new FileInputStream(f));\r
68                         add(fuel, u);\r
69                         return fuel;\r
70                 } catch (FileNotFoundException e) {\r
71                         throw new FuelNotFound();\r
72                 } catch (IOException e) {\r
73                         throw new FuelNotFound();\r
74                 }\r
75         }\r
76 \r
77         public static void add(Fuel f, URI uri) {\r
78                 fuels.put(uri, f);\r
79                 uris.put(f, uri);\r
80                 for ( FuelsChangeListener l : listeners )\r
81                         l.fuelsChanged();\r
82         }\r
83 }\r