fe6abcbf2f29606dfa762f5e4c580cea44aa7f57
[debian/openrocket] / src / net / sf / openrocket / database / Databases.java
1 package net.sf.openrocket.database;
2
3 import net.sf.openrocket.logging.LogHelper;
4 import net.sf.openrocket.material.Material;
5 import net.sf.openrocket.material.MaterialStorage;
6 import net.sf.openrocket.startup.Application;
7 import net.sf.openrocket.util.MathUtil;
8 import net.sf.openrocket.util.Prefs;
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         
19         /* Static implementations of specific databases: */
20
21         /**
22          * A database of bulk materials (with bulk densities).
23          */
24         public static final Database<Material> BULK_MATERIAL = new Database<Material>();
25         /**
26          * A database of surface materials (with surface densities).
27          */
28         public static final Database<Material> SURFACE_MATERIAL = new Database<Material>();
29         /**
30          * A database of linear material (with length densities).
31          */
32         public static final Database<Material> LINE_MATERIAL = new Database<Material>();
33         
34
35
36         static {
37                 
38                 // Add default materials
39                 BULK_MATERIAL.add(new Material.Bulk("Acrylic", 1190, false));
40                 BULK_MATERIAL.add(new Material.Bulk("Balsa", 170, false));
41                 BULK_MATERIAL.add(new Material.Bulk("Birch", 670, false));
42                 BULK_MATERIAL.add(new Material.Bulk("Cardboard", 680, false));
43                 BULK_MATERIAL.add(new Material.Bulk("Carbon fiber", 1780, false));
44                 BULK_MATERIAL.add(new Material.Bulk("Cork", 240, false));
45                 BULK_MATERIAL.add(new Material.Bulk("Depron (XPS)", 40, false));
46                 BULK_MATERIAL.add(new Material.Bulk("Fiberglass", 1850, false));
47                 BULK_MATERIAL.add(new Material.Bulk("Kraft phenolic", 950, false));
48                 BULK_MATERIAL.add(new Material.Bulk("Maple", 755, false));
49                 BULK_MATERIAL.add(new Material.Bulk("Paper (office)", 820, false));
50                 BULK_MATERIAL.add(new Material.Bulk("Pine", 530, false));
51                 BULK_MATERIAL.add(new Material.Bulk("Plywood (birch)", 630, false));
52                 BULK_MATERIAL.add(new Material.Bulk("Polycarbonate (Lexan)", 1200, false));
53                 BULK_MATERIAL.add(new Material.Bulk("Polystyrene", 1050, false));
54                 BULK_MATERIAL.add(new Material.Bulk("PVC", 1390, false));
55                 BULK_MATERIAL.add(new Material.Bulk("Spruce", 450, false));
56                 BULK_MATERIAL.add(new Material.Bulk("Styrofoam (generic EPS)", 20, false));
57                 //              BULK_MATERIAL.add(new Material.Bulk("Styrofoam (Blue foam, XPS)", 32, false));
58                 BULK_MATERIAL.add(new Material.Bulk("Styrofoam \"Blue foam\" (XPS)", 32, false));
59                 BULK_MATERIAL.add(new Material.Bulk("Quantum tubing", 1050, false));
60                 
61                 SURFACE_MATERIAL.add(new Material.Surface("Ripstop nylon", 0.067, false));
62                 SURFACE_MATERIAL.add(new Material.Surface("Mylar", 0.021, false));
63                 SURFACE_MATERIAL.add(new Material.Surface("Polyethylene (thin)", 0.015, false));
64                 SURFACE_MATERIAL.add(new Material.Surface("Polyethylene (heavy)", 0.040, false));
65                 SURFACE_MATERIAL.add(new Material.Surface("Silk", 0.060, false));
66                 SURFACE_MATERIAL.add(new Material.Surface("Paper (office)", 0.080, false));
67                 SURFACE_MATERIAL.add(new Material.Surface("Cellophane", 0.018, false));
68                 SURFACE_MATERIAL.add(new Material.Surface("Cr\u00eape paper", 0.025, false));
69                 
70                 LINE_MATERIAL.add(new Material.Line("Thread (heavy-duty)", 0.0003, false));
71                 LINE_MATERIAL.add(new Material.Line("Elastic cord (round 2mm, 1/16 in)", 0.0018, false));
72                 LINE_MATERIAL.add(new Material.Line("Elastic cord (flat  6mm, 1/4 in)", 0.0043, false));
73                 LINE_MATERIAL.add(new Material.Line("Elastic cord (flat 12mm, 1/2 in)", 0.008, false));
74                 LINE_MATERIAL.add(new Material.Line("Elastic cord (flat 19mm, 3/4 in)", 0.0012, false));
75                 LINE_MATERIAL.add(new Material.Line("Elastic cord (flat 25mm, 1 in)", 0.0016, false));
76                 LINE_MATERIAL.add(new Material.Line("Braided nylon (2 mm, 1/16 in)", 0.001, false));
77                 LINE_MATERIAL.add(new Material.Line("Braided nylon (3 mm, 1/8 in)", 0.0035, false));
78                 LINE_MATERIAL.add(new Material.Line("Tubular nylon (11 mm, 7/16 in)", 0.013, false));
79                 LINE_MATERIAL.add(new Material.Line("Tubular nylon (14 mm, 9/16 in)", 0.016, false));
80                 LINE_MATERIAL.add(new Material.Line("Tubular nylon (25 mm, 1 in)", 0.029, false));
81                 
82
83                 // Add user-defined materials
84                 for (Material m : Prefs.getUserMaterials()) {
85                         switch (m.getType()) {
86                         case LINE:
87                                 LINE_MATERIAL.add(m);
88                                 break;
89                         
90                         case SURFACE:
91                                 SURFACE_MATERIAL.add(m);
92                                 break;
93                         
94                         case BULK:
95                                 BULK_MATERIAL.add(m);
96                                 break;
97                         
98                         default:
99                                 log.warn("ERROR: Unknown material type " + m);
100                         }
101                 }
102                 
103                 // Add database storage listener
104                 MaterialStorage listener = new MaterialStorage();
105                 LINE_MATERIAL.addDatabaseListener(listener);
106                 SURFACE_MATERIAL.addDatabaseListener(listener);
107                 BULK_MATERIAL.addDatabaseListener(listener);
108         }
109         
110         
111         /*
112          * Used just for ensuring initialization of the class.
113          */
114         public static void fakeMethod() {
115                 
116         }
117         
118         
119         /**
120          * Find a material from the database with the specified type and name.  Returns
121          * <code>null</code> if the specified material could not be found.
122          * 
123          * @param type  the material type.
124          * @param name  the material name in the database.
125          * @return              the material, or <code>null</code> if not found.
126          */
127         public static Material findMaterial(Material.Type type, String name) {
128                 Database<Material> db;
129                 switch (type) {
130                 case BULK:
131                         db = BULK_MATERIAL;
132                         break;
133                 case SURFACE:
134                         db = SURFACE_MATERIAL;
135                         break;
136                 case LINE:
137                         db = LINE_MATERIAL;
138                         break;
139                 default:
140                         throw new IllegalArgumentException("Illegal material type: " + type);
141                 }
142                 
143                 for (Material m : db) {
144                         if (m.getName().equalsIgnoreCase(name)) {
145                                 return m;
146                         }
147                 }
148                 return null;
149         }
150         
151         
152         /**
153          * Find a material from the database or return a new material if the specified
154          * material with the specified density is not found.
155          * 
156          * @param type                  the material type.
157          * @param name                  the material name.
158          * @param density               the density of the material.
159          * @param userDefined   whether a newly created material should be user-defined.
160          * @return                              the material object from the database or a new material.
161          */
162         public static Material findMaterial(Material.Type type, String name, double density,
163                         boolean userDefined) {
164                 Database<Material> db;
165                 switch (type) {
166                 case BULK:
167                         db = BULK_MATERIAL;
168                         break;
169                 case SURFACE:
170                         db = SURFACE_MATERIAL;
171                         break;
172                 case LINE:
173                         db = LINE_MATERIAL;
174                         break;
175                 default:
176                         throw new IllegalArgumentException("Illegal material type: " + type);
177                 }
178                 
179                 for (Material m : db) {
180                         if (m.getName().equalsIgnoreCase(name) && MathUtil.equals(m.getDensity(), density)) {
181                                 return m;
182                         }
183                 }
184                 return Material.newMaterial(type, name, density, userDefined);
185         }
186         
187
188 }