1 package net.sf.openrocket.database;
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;
12 * A class that contains single instances of {@link Database} for specific purposes.
14 * @author Sampo Niskanen <sampo.niskanen@iki.fi>
16 public class Databases {
17 private static final LogHelper log = Application.getLogger();
19 /* Static implementations of specific databases: */
22 * A database of bulk materials (with bulk densities).
24 public static final Database<Material> BULK_MATERIAL = new Database<Material>();
26 * A database of surface materials (with surface densities).
28 public static final Database<Material> SURFACE_MATERIAL = new Database<Material>();
30 * A database of linear material (with length densities).
32 public static final Database<Material> LINE_MATERIAL = new Database<Material>();
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));
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));
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));
83 // Add user-defined materials
84 for (Material m : Prefs.getUserMaterials()) {
85 switch (m.getType()) {
91 SURFACE_MATERIAL.add(m);
99 log.warn("ERROR: Unknown material type " + m);
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);
112 * Used just for ensuring initialization of the class.
114 public static void fakeMethod() {
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.
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.
127 public static Material findMaterial(Material.Type type, String name) {
128 Database<Material> db;
134 db = SURFACE_MATERIAL;
140 throw new IllegalArgumentException("Illegal material type: " + type);
143 for (Material m : db) {
144 if (m.getName().equalsIgnoreCase(name)) {
153 * Find a material from the database or return a new material if the specified
154 * material with the specified density is not found.
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.
162 public static Material findMaterial(Material.Type type, String name, double density,
163 boolean userDefined) {
164 Database<Material> db;
170 db = SURFACE_MATERIAL;
176 throw new IllegalArgumentException("Illegal material type: " + type);
179 for (Material m : db) {
180 if (m.getName().equalsIgnoreCase(name) && MathUtil.equals(m.getDensity(), density)) {
184 return Material.newMaterial(type, name, density, userDefined);