1 package com.billkuker.rocketry.motorsim.fuel;
\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
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
17 import org.apache.log4j.Logger;
\r
19 import com.billkuker.rocketry.motorsim.Fuel;
\r
20 import com.billkuker.rocketry.motorsim.io.MotorIO;
\r
22 public class FuelResolver {
\r
23 private static final Logger log = Logger.getLogger(FuelResolver.class);
\r
25 public static class FuelNotFound extends Exception {
\r
26 private static final long serialVersionUID = 1L;
\r
29 public static interface FuelsChangeListener {
\r
30 public void fuelsChanged();
\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
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
48 public static void addFuelsChangeListener(FuelsChangeListener l){
\r
49 listeners.add(new WeakReference<FuelResolver.FuelsChangeListener>(l));
\r
52 public static void removeFuelsChangeListener(FuelsChangeListener l){
\r
53 listeners.remove(l);
\r
56 public static Map<URI, Fuel> getFuelMap(){
\r
57 return Collections.unmodifiableMap(fuels);
\r
60 public static URI getURI( Fuel f ){
\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
70 private static Fuel tryResolve(URI u) throws FuelNotFound {
\r
71 File f = new File(u);
\r
73 Fuel fuel = MotorIO.readFuel(new FileInputStream(f));
\r
76 } catch (FileNotFoundException e) {
\r
77 throw new FuelNotFound();
\r
78 } catch (IOException e) {
\r
79 throw new FuelNotFound();
\r
83 public static void add(Fuel f, URI uri) {
\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
94 log.debug("Weak reference to FCL is null");
\r