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; } }