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
}\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