create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / preset / loader / MaterialHolder.java
1 package net.sf.openrocket.preset.loader;
2
3 import java.util.Collection;
4 import java.util.HashMap;
5 import java.util.HashSet;
6 import java.util.List;
7 import java.util.Map;
8
9 import net.sf.openrocket.database.Database;
10 import net.sf.openrocket.database.Databases;
11 import net.sf.openrocket.material.Material;
12 import net.sf.openrocket.unit.UnitGroup;
13
14 public class MaterialHolder {
15         
16         private final Map<String, Material.Bulk> bulkMaterials = new HashMap<String, Material.Bulk>();
17         
18         private final Map<String, Material.Surface> surfaceMaterials = new HashMap<String, Material.Surface>();
19         
20         private final Map<String, Material.Line> lineMaterials = new HashMap<String, Material.Line>();
21         
22         public MaterialHolder() {
23         }
24         
25         public MaterialHolder(List<Material> materials) {
26                 if (materials == null) {
27                         return;
28                 }
29                 for (Material material : materials) {
30                         this.put(material);
31                 }
32         }
33         
34         public void put(Material material) {
35                 switch (material.getType()) {
36                 case BULK:
37                         bulkMaterials.put(material.getName(), (Material.Bulk) material);
38                         break;
39                 case SURFACE:
40                         surfaceMaterials.put(material.getName(), (Material.Surface) material);
41                         break;
42                 case LINE:
43                         lineMaterials.put(material.getName(), (Material.Line) material);
44                         break;
45                 }
46         }
47         
48         public Material getMaterial(Material material) {
49                 switch (material.getType()) {
50                 case BULK:
51                         return getBulkMaterial((Material.Bulk) material);
52                 case SURFACE:
53                         return getSurfaceMaterial((Material.Surface) material, null);
54                 case LINE:
55                         return getLineMaterial((Material.Line) material);
56                 default:
57                         return null;
58                 }
59         }
60         
61         public Material.Bulk getBulkMaterial(Material.Bulk material) {
62                 Material.Bulk m = bulkMaterials.get(material.getName());
63                 return m;
64         }
65         
66         public Material.Surface getSurfaceMaterial(Material.Surface material, Double thickness) {
67                 Material.Surface m = surfaceMaterials.get(material.getName());
68                 if (m != null) {
69                         return m;
70                 }
71                 // Try to see if we can convert a bulk material.
72                 if (thickness == null) {
73                         // if we have no thickness, there is nothing we can do
74                         return null;
75                 }
76                 String thicknessName = UnitGroup.UNITS_LENGTH.getUnit("mm").toString(thickness);
77                 String convertedMaterialName = material.getName() + "(" + thicknessName + ")";
78                 m = surfaceMaterials.get(convertedMaterialName);
79                 if (m != null) {
80                         return m;
81                 }
82                 Material.Bulk bulk = bulkMaterials.get(material.getName());
83                 
84                 if (bulk == null) {
85                         return null;
86                 }
87                 
88                 // Ok, now we have a thickness and a bulk material of the correct name,
89                 // we can make our own surface material.
90                 
91                 Material.Surface surface = (Material.Surface) Databases.findMaterial(Material.Type.SURFACE, convertedMaterialName, bulk.getDensity() * thickness);
92                 
93                 this.put(surface);
94                 
95                 return surface;
96                 
97         }
98         
99         public Material.Line getLineMaterial(Material.Line material) {
100                 Material.Line m = lineMaterials.get(material.getName());
101                 return m;
102         }
103         
104         public int size() {
105                 return bulkMaterials.size() + surfaceMaterials.size() + lineMaterials.size();
106         }
107         
108         public Collection<Material> values() {
109                 
110                 HashSet<Material> allMats = new HashSet<Material>();
111                 allMats.addAll(bulkMaterials.values());
112                 allMats.addAll(surfaceMaterials.values());
113                 allMats.addAll(lineMaterials.values());
114                 
115                 return allMats;
116                 
117         }
118         
119         public Database<Material> asDatabase(Material.Type theType) {
120                 Database<Material> result = new Database<Material>();
121                 switch (theType) {
122                 case LINE:
123                         result.addAll(lineMaterials.values());
124                         break;
125                 case SURFACE:
126                         result.addAll(surfaceMaterials.values());
127                         break;
128                 case BULK:
129                 default:
130                         result.addAll(bulkMaterials.values());
131                 }
132                 return result;
133         }
134 }