SlopeSteepness.java [tools/MetaModelTools/src/data/interpretors] Revision: ec5f4cade4553a8341e1cd241b111bfdb77a87a8  Date: Fri Jan 10 10:59:55 MST 2020
package data.interpretors;

import csip.ServiceException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author <a href="mailto:shaun.case@colostate.edu">Shaun Case</a>
 */
public class SlopeSteepness {

  private String messages = "";
  private boolean badData = false;
  private HashMap<String, SlopeData> slopes;

  public SlopeSteepness(String slopeFileData) throws ServiceException {
    try {
      readSlopeData(slopeFileData);
    } catch (IOException ex) {
      Logger.getLogger(WindGenData.class.getName()).log(Level.SEVERE, null, ex);
    }
  }

  public boolean badSlopeData() {
    return badData;
  }

  public String slopeDataMessages() {
    return messages;
  }

  public SlopeData slope(String id) {
    if (slopes.containsKey(id)) {
      return slopes.get(id);
    }

    return null;
  }

  private void readSlopeData(String fileContents) throws IOException, ServiceException {
    if ((null != fileContents) && (!fileContents.isEmpty())) {

      BufferedReader slopeDataReader = new BufferedReader(new StringReader(fileContents));
      String slopeLine;

      //Strip header line
      slopeDataReader.readLine();

      while ((slopeLine = slopeDataReader.readLine()) != null) {
        String[] elements = slopeLine.trim().split("{");

        if (elements.length >= 2) {
          String id = elements[0].replace(",", " ").trim();
          String dataLine = "{" + elements[1].trim();

          SlopeData slopeData = new SlopeData(id, dataLine);
          slopes.put(id, slopeData);
        }
      }
    }
  }

  public class SlopeData {

    private double min, max, mean, median, sum, majority;
    private String id = null;

    public SlopeData(String _id, String dataLine) throws ServiceException {
      if (null != dataLine) {
        String inLine = dataLine.trim();

        if (inLine.startsWith("{")) {
          id = _id;

          String[] values = inLine.split(",");

          for (int i = 0; i < values.length; i++) {
            String[] data = values[i].trim().split(":");
            if (data.length >= 2) {
              switch (data[0].toLowerCase()) {
                case "'min'":
                  min = Double.parseDouble(data[1].trim());
                  break;

                case "'max'":
                  max = Double.parseDouble(data[1].trim());
                  break;

                case "'mean'":
                  mean = Double.parseDouble(data[1].trim());
                  break;

                case "'median'":
                  median = Double.parseDouble(data[1].trim());
                  break;

                case "'sum'":
                  sum = Double.parseDouble(data[1].trim());
                  break;

                case "'majority'":
                  majority = Double.parseDouble(data[1].trim());
                  break;
              }
            } else {
              break;
            }
          }
        }
      } else {
        throw new ServiceException("No input provided to the SlopeData object");
      }
    }

    public double min() {
      return min;
    }

    public double max() {
      return min;
    }

    public double mean() {
      return min;
    }

    public double median() {
      return min;
    }

    public double sum() {
      return min;
    }

    public double majority() {
      return min;
    }

    public String id() {
      return id;
    }
  }
}