public static Automobile parseProperties(Properties properObj) {
    Automobile autoObj = new Automobile();

    autoObj.setModelName(properObj.getProperty("CarModel"));
    properObj.remove("CarModel");
    autoObj.setMaker(properObj.getProperty("CarMake"));
    properObj.remove("CarMake");
    autoObj.setBasePrice(Float.parseFloat(properObj.getProperty("CarPrice")));
    properObj.remove("CarPrice");

    int i = 1;
    String key = "Option";
    while (!properObj.isEmpty()) {
      String optionsetName = properObj.getProperty(key + i);
      autoObj.setOptionset(optionsetName);
      properObj.remove(key + i);

      int j = 1;
      while (properObj.containsKey(key + i + "Value" + j)) {
        float optionPrice = 0;
        String optionName = properObj.getProperty(key + i + "Value" + j);
        properObj.remove(key + i + "Value" + j);
        if (properObj.containsKey(key + i + "Value" + j + "price")) {
          optionPrice = Float.parseFloat(properObj.getProperty(key + i + "Value" + j + "price"));
          properObj.remove(key + i + "Value" + j + "price");
        }
        autoObj.setOption(optionsetName, optionName, optionPrice);
        j++;
      }
      i++;
    }
    return autoObj;
  }
  public static Automobile buildAutoObject(String fileName) throws AutoException {
    Automobile model = new Automobile();
    try {
      FileReader file = new FileReader(fileName);
      BufferedReader buff = new BufferedReader(file);
      boolean eof = false;

      String line;
      for (int i = 0; i < 3; i++) {
        line = buff.readLine();
        if (line == null) {
          eof = true;
        } else {
          String[] array = line.split(": ");
          try {
            if (array.length == 2) {
              if (i == 0) {
                model.setModelName(array[1]);
              } else if (i == 1) {
                try {
                  float basePrice =
                      NumberFormat.getNumberInstance(java.util.Locale.US)
                          .parse(array[1])
                          .floatValue();
                  model.setBasePrice(basePrice);
                } catch (ParseException e) {
                  e.printStackTrace();
                }
              } else if (i == 2) {
                model.setMaker(array[1]);
              }
            } else {
              if (i == 0) {
                throw new AutoException(ModelError.MISSING_MODEL_NAME);
              } else if (i == 1) {
                throw new AutoException(ModelError.MISSING_MODEL_PRICE);
              }
            }
          } catch (AutoException e) {
            e.fix(e.getErrorCode().getNumber(), model);
          }
        }
      }

      int i = 0; // number of line
      while (!eof) {
        line = buff.readLine();
        if (line == null) {
          eof = true;
        } else {
          String[] optionSet = line.split(": "); // setName + options
          try {
            if (optionSet.length != 2 || optionSet[0].isEmpty() || optionSet[1].isEmpty()) {
              throw new AutoException(ModelError.MISSING_OPTIONSET_DATA);
            } else {
              String[] options = optionSet[1].split("; "); // (optionName + price)*n
              model.setOptionset(optionSet[0]);
              for (int j = 0; j < options.length; j++) {
                String[] option = options[j].split(", "); // optionName + price
                if (option.length < 2) {
                  throw new AutoException(ModelError.MISSING_OPTION_DATA);
                } else {
                  try {
                    float price =
                        NumberFormat.getNumberInstance(java.util.Locale.US)
                            .parse(option[1])
                            .floatValue();
                    model.setOption(i, option[0], price);
                  } catch (ParseException e) {
                    e.printStackTrace();
                  }
                }
              }
            }
          } catch (AutoException e) {
            e.fix(e.getErrorCode().getNumber(), model);
          }
        }
        i++;
      }
      buff.close();
    } catch (IOException e) {
      System.out.println("Error -- " + e.toString());
    }
    return model;
  }