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