/* * TransitionHandler.java */ package net.sf.openrocket.file.rocksim.importt; import java.util.HashMap; import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.file.DocumentLoadingContext; import net.sf.openrocket.file.rocksim.RocksimCommonConstants; import net.sf.openrocket.file.rocksim.RocksimFinishCode; import net.sf.openrocket.file.rocksim.RocksimNoseConeCode; import net.sf.openrocket.file.simplesax.ElementHandler; import net.sf.openrocket.file.simplesax.PlainTextHandler; import net.sf.openrocket.material.Material; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.Transition; import org.xml.sax.SAXException; /** * The SAX handler for Transition components. */ class TransitionHandler extends BaseHandler<Transition> { /** * The OpenRocket Transition. */ private final Transition transition = new Transition(); /** * The wall thickness. Used for hollow nose cones. */ private double thickness = 0d; /** * Constructor. * * @param c the parent component * @param warnings the warning set * @throws IllegalArgumentException thrown if <code>c</code> is null */ public TransitionHandler(DocumentLoadingContext context, RocketComponent c, WarningSet warnings) throws IllegalArgumentException { super(context); if (c == null) { throw new IllegalArgumentException("The parent of a transition may not be null."); } if (isCompatible(c, Transition.class, warnings)) { c.addChild(transition); } } @Override public ElementHandler openElement(String element, HashMap<String, String> attributes, WarningSet warnings) { if (RocksimCommonConstants.ATTACHED_PARTS.equals(element)) { return new AttachedPartsHandler(context, transition); } return PlainTextHandler.INSTANCE; } @Override public void closeElement(String element, HashMap<String, String> attributes, String content, WarningSet warnings) throws SAXException { super.closeElement(element, attributes, content, warnings); try { if ("ShapeCode".equals(element)) { transition.setType(RocksimNoseConeCode.fromCode(Integer.parseInt(content)).asOpenRocket()); } if ("Len".equals(element)) { transition.setLength(Math.max(0, Double.parseDouble( content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH)); } if ("FrontDia".equals(element)) { transition.setForeRadius(Math.max(0, Double.parseDouble( content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_RADIUS)); } if ("RearDia".equals(element)) { transition.setAftRadius(Math.max(0, Double.parseDouble( content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_RADIUS)); } if ("WallThickness".equals(element)) { thickness = Math.max(0d, Double.parseDouble(content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH); } if ("FrontShoulderDia".equals(element)) { transition.setForeShoulderRadius(Math.max(0d, Double.parseDouble( content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_RADIUS)); } if ("RearShoulderDia".equals(element)) { transition.setAftShoulderRadius(Math.max(0d, Double.parseDouble( content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_RADIUS)); } if ("FrontShoulderLen".equals(element)) { transition.setForeShoulderLength(Math.max(0d, Double.parseDouble( content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH)); } if ("RearShoulderLen".equals(element)) { transition.setAftShoulderLength(Math.max(0d, Double.parseDouble( content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH)); } if ("ShapeParameter".equals(element)) { if (Transition.Shape.POWER.equals(transition.getType()) || Transition.Shape.HAACK.equals(transition.getType()) || Transition.Shape.PARABOLIC.equals(transition.getType())) { transition.setShapeParameter(Double.parseDouble(content)); } } if ("ConstructionType".equals(element)) { int typeCode = Integer.parseInt(content); if (typeCode == 0) { //SOLID transition.setFilled(true); } else if (typeCode == 1) { //HOLLOW transition.setFilled(false); } } if ("FinishCode".equals(element)) { transition.setFinish(RocksimFinishCode.fromCode(Integer.parseInt(content)).asOpenRocket()); } if ("Material".equals(element)) { setMaterialName(content); } } catch (NumberFormatException nfe) { warnings.add("Could not convert " + element + " value of " + content + ". It is expected to be a number."); } } @Override public void endHandler(String element, HashMap<String, String> attributes, String content, WarningSet warnings) throws SAXException { super.endHandler(element, attributes, content, warnings); if (transition.isFilled()) { transition.setAftShoulderThickness(transition.getAftShoulderRadius()); transition.setForeShoulderThickness(transition.getForeShoulderRadius()); } else { transition.setThickness(thickness); transition.setAftShoulderThickness(thickness); transition.setForeShoulderThickness(thickness); } } @Override public Transition getComponent() { return transition; } /** * Get the required type of material for this component. * * @return BULK */ public Material.Type getMaterialType() { return Material.Type.BULK; } }