package net.sf.openrocket.preset.xml;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import net.sf.openrocket.database.Databases;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.util.Chars;
/**
* XML handler for materials.
*/
@XmlRootElement(name = "Material")
@XmlAccessorType(XmlAccessType.FIELD)
public class MaterialDTO {
@XmlElement(name = "Name")
private String name;
@XmlElement(name = "Density")
private double density;
@XmlElement(name = "Type")
private MaterialTypeDTO type;
@XmlAttribute(name = "UnitsOfMeasure")
private String uom;
/**
* Default constructor.
*/
public MaterialDTO() {
}
public MaterialDTO(final Material theMaterial) {
this(theMaterial.getName(), theMaterial.getDensity(), MaterialTypeDTO.asDTO(theMaterial.getType()),
theMaterial.getType().getUnitGroup().getDefaultUnit().toString());
}
public MaterialDTO(final String theName, final double theDensity, final MaterialTypeDTO theType, final String theUom) {
name = theName;
density = theDensity;
type = theType;
uom = theUom;
}
public String getName() {
return name;
}
public void setName(final String theName) {
name = theName;
}
public double getDensity() {
return density;
}
public void setDensity(final double theDensity) {
density = theDensity;
}
public MaterialTypeDTO getType() {
return type;
}
public void setType(final MaterialTypeDTO theType) {
type = theType;
}
public String getUom() {
return uom;
}
public void setUom(final String theUom) {
uom = theUom;
}
Material asMaterial() {
return Databases.findMaterial(type.getORMaterialType(), name, density);
}
/**
* Special directive to the JAXB system. After the object is parsed from xml,
* we replace the '2' with Chars.SQUARED, and '3' with Chars.CUBED. Just the
* opposite transformation as doen in beforeMarshal.
* @param unmarshaller
* @param parent
*/
@SuppressWarnings("unused")
private void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
if (uom != null) {
uom = uom.replace('2', Chars.SQUARED);
uom = uom.replace('3', Chars.CUBED);
}
}
/**
* Special directive to the JAXB system. Before the object is serialized into xml,
* we strip out the special unicode characters for cubed and squared so they appear
* as simple "3" and "2" chars. The reverse transformation is done in afterUnmarshal.
* @param marshaller
*/
@SuppressWarnings("unused")
private void beforeMarshal(Marshaller marshaller) {
if (uom != null) {
uom = uom.replace(Chars.SQUARED, '2');
uom = uom.replace(Chars.CUBED, '3');
}
}
}