updates for 0.9.3
[debian/openrocket] / src / net / sf / openrocket / database / Databases.java
1 package net.sf.openrocket.database;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.net.URL;
6 import java.util.ArrayList;
7
8 import net.sf.openrocket.file.GeneralMotorLoader;
9 import net.sf.openrocket.material.Material;
10 import net.sf.openrocket.rocketcomponent.Motor;
11 import net.sf.openrocket.util.JarUtil;
12 import net.sf.openrocket.util.MathUtil;
13
14
15 /**
16  * A class that contains single instances of {@link Database} for specific purposes.
17  * 
18  * @author Sampo Niskanen <sampo.niskanen@iki.fi>
19  */
20 public class Databases {
21
22         /* Static implementations of specific databases: */
23         /**
24          * The motor database.
25          */
26         public static final Database<Motor> MOTOR = new Database<Motor>(new GeneralMotorLoader());
27         
28         
29         /**
30          * A database of bulk materials (with bulk densities).
31          */
32         public static final Database<Material> BULK_MATERIAL = new Database<Material>();
33         /**
34          * A database of surface materials (with surface densities).
35          */
36         public static final Database<Material> SURFACE_MATERIAL = new Database<Material>();
37         /**
38          * A database of linear material (with length densities).
39          */
40         public static final Database<Material> LINE_MATERIAL = new Database<Material>();
41         
42         
43
44         // TODO: HIGH: loading the thrust curves and other databases
45         static {
46                 
47                 try {
48                         MOTOR.loadJarDirectory("datafiles/thrustcurves/", ".*\\.[eE][nN][gG]$");
49                 } catch (IOException e) {
50                         System.out.println("Could not read thrust curves from JAR: "+e.getMessage());
51                         
52                         // Try to find directory as a system resource
53                         File dir;
54                         URL url = ClassLoader.getSystemResource("datafiles/thrustcurves/");
55                         
56                         try {
57                                 dir = JarUtil.urlToFile(url);
58                         } catch (Exception e1) {
59                                 dir = new File("datafiles/thrustcurves/");
60                         }
61                                 
62                         try {
63                                 MOTOR.loadDirectory(dir, ".*\\.[eE][nN][gG]$");
64                         } catch (IOException e1) {
65                                 System.out.println("Could not read thrust curves from directory either.");
66                                 throw new RuntimeException(e1);
67                         }
68                 }
69         }
70         
71         // TODO: HIGH: Move materials into data files
72         static {
73                 
74                 BULK_MATERIAL.add(new Material.Bulk("Acrylic",          1190, false));
75                 BULK_MATERIAL.add(new Material.Bulk("Balsa",             170, false));
76                 BULK_MATERIAL.add(new Material.Bulk("Birch",             670, false));
77                 BULK_MATERIAL.add(new Material.Bulk("Cardboard",         680, false));
78                 BULK_MATERIAL.add(new Material.Bulk("Carbon fiber",     1780, false));
79                 BULK_MATERIAL.add(new Material.Bulk("Cork",                      240, false));
80                 BULK_MATERIAL.add(new Material.Bulk("Fiberglass",       1850, false));
81                 BULK_MATERIAL.add(new Material.Bulk("Kraft phenolic",950, false));
82                 BULK_MATERIAL.add(new Material.Bulk("Maple",             755, false));
83                 BULK_MATERIAL.add(new Material.Bulk("Paper (office)",820, false));
84                 BULK_MATERIAL.add(new Material.Bulk("Pine",                      530, false));
85                 BULK_MATERIAL.add(new Material.Bulk("Plywood (birch)",630, false));
86                 BULK_MATERIAL.add(new Material.Bulk("Polycarbonate (Lexan)",1200, false));
87                 BULK_MATERIAL.add(new Material.Bulk("Polystyrene",  1050, false));
88                 BULK_MATERIAL.add(new Material.Bulk("PVC",                      1390, false));
89                 BULK_MATERIAL.add(new Material.Bulk("Spruce",            450, false));
90                 BULK_MATERIAL.add(new Material.Bulk("Quantum tubing",1050, false));
91                 
92                 SURFACE_MATERIAL.add(new Material.Surface("Ripstop nylon",                      0.067, false));
93                 SURFACE_MATERIAL.add(new Material.Surface("Mylar",                                      0.021, false));
94                 SURFACE_MATERIAL.add(new Material.Surface("Polyethylene (thin)",        0.015, false));
95                 SURFACE_MATERIAL.add(new Material.Surface("Polyethylene (heavy)",       0.040, false));
96                 SURFACE_MATERIAL.add(new Material.Surface("Silk",                                       0.060, false));
97                 SURFACE_MATERIAL.add(new Material.Surface("Paper (office)",                     0.080, false));
98                 SURFACE_MATERIAL.add(new Material.Surface("Cellophane",                         0.018, false));
99                 SURFACE_MATERIAL.add(new Material.Surface("Cr\u00eape paper",           0.025, false));
100                 
101                 LINE_MATERIAL.add(new Material.Line("Thread (heavy-duty)",                              0.0003, false));
102                 LINE_MATERIAL.add(new Material.Line("Elastic cord (round 2mm, 1/16 in)",0.0018, false));
103                 LINE_MATERIAL.add(new Material.Line("Elastic cord (flat  6mm, 1/4 in)", 0.0043, false));
104                 LINE_MATERIAL.add(new Material.Line("Elastic cord (flat 12mm, 1/2 in)", 0.008, false));
105                 LINE_MATERIAL.add(new Material.Line("Elastic cord (flat 19mm, 3/4 in)", 0.0012, false));
106                 LINE_MATERIAL.add(new Material.Line("Elastic cord (flat 25mm, 1 in)",   0.0016, false));
107                 LINE_MATERIAL.add(new Material.Line("Braided nylon (2 mm, 1/16 in)",    0.001, false));
108                 LINE_MATERIAL.add(new Material.Line("Braided nylon (3 mm, 1/8 in)",     0.0035, false));
109                 LINE_MATERIAL.add(new Material.Line("Tubular nylon (11 mm, 7/16 in)",   0.013, false));
110                 LINE_MATERIAL.add(new Material.Line("Tubular nylon (14 mm, 9/16 in)",   0.016, false));
111                 LINE_MATERIAL.add(new Material.Line("Tubular nylon (25 mm, 1 in)",              0.029, false));
112         }
113         
114         
115         /**
116          * Find a material from the database with the specified type and name.  Returns
117          * <code>null</code> if the specified material could not be found.
118          * 
119          * @param type  the material type.
120          * @param name  the material name in the database.
121          * @return              the material, or <code>null</code> if not found.
122          */
123         public static Material findMaterial(Material.Type type, String name) {
124                 Database<Material> db;
125                 switch (type) {
126                 case BULK:
127                         db = BULK_MATERIAL;
128                         break;
129                 case SURFACE:
130                         db = SURFACE_MATERIAL;
131                         break;
132                 case LINE:
133                         db = LINE_MATERIAL;
134                         break;
135                 default:
136                         throw new IllegalArgumentException("Illegal material type: "+type);
137                 }
138                 
139                 for (Material m: db) {
140                         if (m.getName().equalsIgnoreCase(name)) {
141                                 return m;
142                         }
143                 }
144                 return null;
145         }
146         
147         
148         /**
149          * Find a material from the database or return a new material if the specified
150          * material with the specified density is not found.
151          * 
152          * @param type          the material type.
153          * @param name          the material name.
154          * @param density       the density of the material.
155          * @return                      the material object from the database or a new material.
156          */
157         public static Material findMaterial(Material.Type type, String name, double density) {
158                 Database<Material> db;
159                 switch (type) {
160                 case BULK:
161                         db = BULK_MATERIAL;
162                         break;
163                 case SURFACE:
164                         db = SURFACE_MATERIAL;
165                         break;
166                 case LINE:
167                         db = LINE_MATERIAL;
168                         break;
169                 default:
170                         throw new IllegalArgumentException("Illegal material type: "+type);
171                 }
172
173                 for (Material m: db) {
174                         if (m.getName().equalsIgnoreCase(name) && MathUtil.equals(m.getDensity(), density)) {
175                                 return m;
176                         }
177                 }
178                 return Material.newMaterial(type, name, density);
179         }       
180         
181         
182
183         /**
184          * Return all motor in the database matching a search criteria.  Any search criteria that
185          * is null or NaN is ignored.
186          * 
187          * @param type                  the motor type, or null.
188          * @param manufacturer  the manufacturer, or null.
189          * @param designation   the designation, or null.
190          * @param diameter              the diameter, or NaN.
191          * @param length                the length, or NaN.
192          * @return                              an array of all the matching motors.
193          */
194         public static Motor[] findMotors(Motor.Type type, String manufacturer, String designation, double diameter, double length) {
195                 ArrayList<Motor> results = new ArrayList<Motor>();
196                 
197                 for (Motor m: MOTOR) {
198                         boolean match = true;
199                         if (type != null  &&  type != m.getMotorType())
200                                 match = false;
201                         else if (manufacturer != null  &&  !manufacturer.equalsIgnoreCase(m.getManufacturer()))
202                                 match = false;
203                         else if (designation != null  &&  !designation.equalsIgnoreCase(m.getDesignation()))
204                                 match = false;
205                         else if (!Double.isNaN(diameter)  &&  (Math.abs(diameter - m.getDiameter()) > 0.0015))
206                                 match = false;
207                         else if (!Double.isNaN(length) && (Math.abs(length - m.getLength()) > 0.0015))
208                                 match = false;
209                         
210                         if (match)
211                                 results.add(m);
212                 }
213                 
214                 return results.toArray(new Motor[0]);
215         }
216
217 }