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