30797e31a7561dd48de7e5623e7e8c0db1dbe349
[debian/openrocket] / core / src / net / sf / openrocket / database / Databases.java
1 package net.sf.openrocket.database;
2
3 import net.sf.openrocket.l10n.Translator;
4 import net.sf.openrocket.logging.LogHelper;
5 import net.sf.openrocket.material.Material;
6 import net.sf.openrocket.material.MaterialStorage;
7 import net.sf.openrocket.startup.Application;
8 import net.sf.openrocket.util.MathUtil;
9
10
11 /**
12  * A class that contains single instances of {@link Database} for specific purposes.
13  * 
14  * @author Sampo Niskanen <sampo.niskanen@iki.fi>
15  */
16 public class Databases {
17         private static final LogHelper log = Application.getLogger();
18         private static final Translator trans = Application.getTranslator();
19         
20         /* Static implementations of specific databases: */
21         
22         /**
23          * A database of bulk materials (with bulk densities).
24          */
25         public static final Database<Material> BULK_MATERIAL = new Database<Material>();
26         /**
27          * A database of surface materials (with surface densities).
28          */
29         public static final Database<Material> SURFACE_MATERIAL = new Database<Material>();
30         /**
31          * A database of linear material (with length densities).
32          */
33         public static final Database<Material> LINE_MATERIAL = new Database<Material>();
34         
35         
36         
37         static {
38                 
39                 // Add default materials
40                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Acrylic"), 1190, false));
41                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Aluminum"), 2700, false));
42                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Balsa"), 170, false));
43                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Basswood"), 500, false));
44                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Birch"), 670, false));
45                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Brass"), 8600, false));
46                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Cardboard"), 680, false));
47                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Carbonfiber"), 1780, false));
48                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Cork"), 240, false));
49                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.DepronXPS"), 40, false));
50                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Fiberglass"), 1850, false));
51                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Kraftphenolic"), 950, false));
52                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Maple"), 755, false));
53                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Paperoffice"), 820, false));
54                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Pine"), 530, false));
55                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Plywoodbirch"), 630, false));
56                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.PolycarbonateLexan"), 1200, false));
57                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Polystyrene"), 1050, false));
58                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.PVC"), 1390, false));
59                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Spruce"), 450, false));
60                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Steel"), 7850, false));
61                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.StyrofoamgenericEPS"), 20, false));
62                 //              BULK_MATERIAL.add(new Material.Bulk("Styrofoam (Blue foam, XPS)", 32, false));
63                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.StyrofoamBluefoamXPS"), 32, false));
64                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Titanium"), 4500, false));
65                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Quantumtubing"), 1050, false));
66                 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.BlueTube"), 1300, false));
67                 
68                 SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Ripstopnylon"), 0.067, false));
69                 SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Mylar"), 0.021, false));
70                 SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Polyethylenethin"), 0.015, false));
71                 SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Polyethyleneheavy"), 0.040, false));
72                 SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Silk"), 0.060, false));
73                 SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Paperoffice"), 0.080, false));
74                 SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Cellophane"), 0.018, false));
75                 SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Crepepaper"), 0.025, false));
76                 
77                 //// Thread (heavy-duty)
78                 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Threadheavy-duty"), 0.0003, false));
79                 //// Elastic cord (round 2mm, 1/16 in)
80                 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Elasticcordround2mm"), 0.0018, false));
81                 //// Elastic cord (flat  6mm, 1/4 in)
82                 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Elasticcordflat6mm"), 0.0043, false));
83                 //// Elastic cord (flat 12mm, 1/2 in)
84                 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Elasticcordflat12mm"), 0.008, false));
85                 //// Elastic cord (flat 19mm, 3/4 in)
86                 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Elasticcordflat19mm"), 0.0012, false));
87                 //// Elastic cord (flat 25mm, 1 in)
88                 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Elasticcordflat25mm"), 0.0016, false));
89                 //// Braided nylon (2 mm, 1/16 in)
90                 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Braidednylon2mm"), 0.001, false));
91                 //// Braided nylon (3 mm, 1/8 in)
92                 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Braidednylon3mm"), 0.0035, false));
93                 //// Tubular nylon (11 mm, 7/16 in)
94                 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Tubularnylon11mm"), 0.013, false));
95                 //// Tubular nylon (14 mm, 9/16 in)
96                 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Tubularnylon14mm"), 0.016, false));
97                 //// Tubular nylon (25 mm, 1 in)
98                 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Tubularnylon25mm"), 0.029, false));
99                 
100                 
101                 // Add user-defined materials
102                 for (Material m : Application.getPreferences().getUserMaterials()) {
103                         switch (m.getType()) {
104                         case LINE:
105                                 LINE_MATERIAL.add(m);
106                                 break;
107                         
108                         case SURFACE:
109                                 SURFACE_MATERIAL.add(m);
110                                 break;
111                         
112                         case BULK:
113                                 BULK_MATERIAL.add(m);
114                                 break;
115                         
116                         default:
117                                 log.warn("ERROR: Unknown material type " + m);
118                         }
119                 }
120                 
121                 // Add database storage listener
122                 MaterialStorage listener = new MaterialStorage();
123                 LINE_MATERIAL.addDatabaseListener(listener);
124                 SURFACE_MATERIAL.addDatabaseListener(listener);
125                 BULK_MATERIAL.addDatabaseListener(listener);
126         }
127         
128         
129         /*
130          * Used just for ensuring initialization of the class.
131          */
132         public static void fakeMethod() {
133                 
134         }
135         
136         
137         /**
138          * Find a material from the database with the specified type and name.  Returns
139          * <code>null</code> if the specified material could not be found.
140          * 
141          * @param type  the material type.
142          * @param name  the material name in the database.
143          * @return              the material, or <code>null</code> if not found.
144          */
145         public static Material findMaterial(Material.Type type, String name) {
146                 Database<Material> db;
147                 switch (type) {
148                 case BULK:
149                         db = BULK_MATERIAL;
150                         break;
151                 case SURFACE:
152                         db = SURFACE_MATERIAL;
153                         break;
154                 case LINE:
155                         db = LINE_MATERIAL;
156                         break;
157                 default:
158                         throw new IllegalArgumentException("Illegal material type: " + type);
159                 }
160                 
161                 for (Material m : db) {
162                         if (m.getName().equalsIgnoreCase(name)) {
163                                 return m;
164                         }
165                 }
166                 return null;
167         }
168         
169         
170         /**
171          * Find a material from the database or return a new material if the specified
172          * material with the specified density is not found.
173          * 
174          * @param type                  the material type.
175          * @param name                  the material name.
176          * @param density               the density of the material.
177          * @param userDefined   whether a newly created material should be user-defined.
178          * @return                              the material object from the database or a new material.
179          */
180         public static Material findMaterial(Material.Type type, String name, double density,
181                         boolean userDefined) {
182                 Database<Material> db;
183                 switch (type) {
184                 case BULK:
185                         db = BULK_MATERIAL;
186                         break;
187                 case SURFACE:
188                         db = SURFACE_MATERIAL;
189                         break;
190                 case LINE:
191                         db = LINE_MATERIAL;
192                         break;
193                 default:
194                         throw new IllegalArgumentException("Illegal material type: " + type);
195                 }
196                 
197                 for (Material m : db) {
198                         if (m.getName().equalsIgnoreCase(name) && MathUtil.equals(m.getDensity(), density)) {
199                                 return m;
200                         }
201                 }
202                 return Material.newMaterial(type, name, density, userDefined);
203         }
204         
205         
206 }