Merge commit '42b2e5ca519766e37ce6941ba4faecc9691cc403' into upstream
[debian/openrocket] / core / src / net / sf / openrocket / preset / loader / MaterialHolder.java
diff --git a/core/src/net/sf/openrocket/preset/loader/MaterialHolder.java b/core/src/net/sf/openrocket/preset/loader/MaterialHolder.java
new file mode 100644 (file)
index 0000000..7ab176b
--- /dev/null
@@ -0,0 +1,134 @@
+package net.sf.openrocket.preset.loader;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+import net.sf.openrocket.database.Database;
+import net.sf.openrocket.database.Databases;
+import net.sf.openrocket.material.Material;
+import net.sf.openrocket.unit.UnitGroup;
+
+public class MaterialHolder {
+       
+       private final Map<String, Material.Bulk> bulkMaterials = new HashMap<String, Material.Bulk>();
+       
+       private final Map<String, Material.Surface> surfaceMaterials = new HashMap<String, Material.Surface>();
+       
+       private final Map<String, Material.Line> lineMaterials = new HashMap<String, Material.Line>();
+       
+       public MaterialHolder() {
+       }
+       
+       public MaterialHolder(List<Material> materials) {
+               if (materials == null) {
+                       return;
+               }
+               for (Material material : materials) {
+                       this.put(material);
+               }
+       }
+       
+       public void put(Material material) {
+               switch (material.getType()) {
+               case BULK:
+                       bulkMaterials.put(material.getName(), (Material.Bulk) material);
+                       break;
+               case SURFACE:
+                       surfaceMaterials.put(material.getName(), (Material.Surface) material);
+                       break;
+               case LINE:
+                       lineMaterials.put(material.getName(), (Material.Line) material);
+                       break;
+               }
+       }
+       
+       public Material getMaterial(Material material) {
+               switch (material.getType()) {
+               case BULK:
+                       return getBulkMaterial((Material.Bulk) material);
+               case SURFACE:
+                       return getSurfaceMaterial((Material.Surface) material, null);
+               case LINE:
+                       return getLineMaterial((Material.Line) material);
+               default:
+                       return null;
+               }
+       }
+       
+       public Material.Bulk getBulkMaterial(Material.Bulk material) {
+               Material.Bulk m = bulkMaterials.get(material.getName());
+               return m;
+       }
+       
+       public Material.Surface getSurfaceMaterial(Material.Surface material, Double thickness) {
+               Material.Surface m = surfaceMaterials.get(material.getName());
+               if (m != null) {
+                       return m;
+               }
+               // Try to see if we can convert a bulk material.
+               if (thickness == null) {
+                       // if we have no thickness, there is nothing we can do
+                       return null;
+               }
+               String thicknessName = UnitGroup.UNITS_LENGTH.getUnit("mm").toString(thickness);
+               String convertedMaterialName = material.getName() + "(" + thicknessName + ")";
+               m = surfaceMaterials.get(convertedMaterialName);
+               if (m != null) {
+                       return m;
+               }
+               Material.Bulk bulk = bulkMaterials.get(material.getName());
+               
+               if (bulk == null) {
+                       return null;
+               }
+               
+               // Ok, now we have a thickness and a bulk material of the correct name,
+               // we can make our own surface material.
+               
+               Material.Surface surface = (Material.Surface) Databases.findMaterial(Material.Type.SURFACE, convertedMaterialName, bulk.getDensity() * thickness);
+               
+               this.put(surface);
+               
+               return surface;
+               
+       }
+       
+       public Material.Line getLineMaterial(Material.Line material) {
+               Material.Line m = lineMaterials.get(material.getName());
+               return m;
+       }
+       
+       public int size() {
+               return bulkMaterials.size() + surfaceMaterials.size() + lineMaterials.size();
+       }
+       
+       public Collection<Material> values() {
+               
+               HashSet<Material> allMats = new HashSet<Material>();
+               allMats.addAll(bulkMaterials.values());
+               allMats.addAll(surfaceMaterials.values());
+               allMats.addAll(lineMaterials.values());
+               
+               return allMats;
+               
+       }
+       
+       public Database<Material> asDatabase(Material.Type theType) {
+               Database<Material> result = new Database<Material>();
+               switch (theType) {
+               case LINE:
+                       result.addAll(lineMaterials.values());
+                       break;
+               case SURFACE:
+                       result.addAll(surfaceMaterials.values());
+                       break;
+               case BULK:
+               default:
+                       result.addAll(bulkMaterials.values());
+               }
+               return result;
+       }
+}