@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 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.");
    }
  }