V1_0.java [src/java/m/comet/comet04_climate] Revision: default  Date:
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package m.comet.comet04_climate;

import csip.Config;
import csip.ModelDataService;
import csip.ServiceException;
import csip.annotations.Polling;
import csip.annotations.Resource;
import static csip.annotations.ResourceType.OUTPUT;
import csip.utils.JSONUtils;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import javax.ws.rs.Path;
import javax.ws.rs.core.UriBuilder;
import m.comet.utils.ServiceCall;
import m.comet.utils.COMETools;
import oms3.annotations.Description;
import oms3.annotations.Name;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;

/**
 *
 * @author rumpal
 */
@Name("COMET-04:  Get Climate Data for the COMET API")
@Description("This service generates a daily weather data file for the "
    + "COMET DayCent model from NRCS CDSI PRISM provisioned to the "
    + "agency data center.")
@Path("m/comet/cometcliinput/1.0")
@Polling(first = 10000, next = 2000)
@Resource(file = "*.txt", type = OUTPUT)
@Deprecated
public class V1_0 extends ModelDataService {

  private double latitude, longitude;


  @Override
  public void preProcess() throws ServiceException, JSONException {
    latitude = parameter().getParamJSON("aoa_centroid").getDouble("latitude");
    longitude = parameter().getParamJSON("aoa_centroid").getDouble("longitude");
  }


  @Override
  public void doProcess() throws ServiceException, JSONException, FileNotFoundException, ParseException {
    String prism = UriBuilder.fromUri(Config.getString("prism.uri")).toString();

    JSONObject request = createPrismRequest();
    JSONObject result = new ServiceCall().getResult(prism, request);
    parsePrismResponse(result);
  }


  @Override
  public void postProcess() {
  }


  public JSONObject createPrismRequest() throws JSONException {
    //Request
    JSONObject requestJSON = new JSONObject();

    //Metainfo
    JSONObject metainfo = new JSONObject();
    requestJSON.put("metainfo", metainfo);

    //Parameter
    //Adding FeatureCollection to the request array
    JSONArray parameter = new JSONArray();
    parameter.put(JSONUtils.data("input_zone_features", COMETools.createFeatureCollection(latitude, longitude)));
    parameter.put(JSONUtils.data("units", "metric"));
    parameter.put(JSONUtils.data("start_date", Config.getString("prism.start.date")));
    parameter.put(JSONUtils.data("end_date", Config.getString("prism.end.date")));
    JSONArray data = new JSONArray();
    data.put("tmin");
    data.put("tmax");
    data.put("ppt");
    parameter.put(JSONUtils.data("climate_data", data));
    parameter.put(JSONUtils.data(VALUE, VALUE));
    requestJSON.put("parameter", parameter);

    return requestJSON;
  }


  public void parsePrismResponse(JSONObject result) throws ServiceException, FileNotFoundException, ParseException, JSONException {

    JSONObject metaInfoObject = result.getJSONObject("metainfo");
    String metaError = metaInfoObject.optString("error");

    if ((null == metaError) || (metaError.isEmpty())) {
      JSONArray resultArray = result.getJSONArray("result");
      Map<String, JSONObject> topLevel = JSONUtils.preprocess(resultArray);
      JSONArray data = JSONUtils.getJSONArrayParam(topLevel, "output").getJSONObject(0).getJSONArray("data");

      generateWeatherFile(data);
    }

  }


  public void generateWeatherFile(JSONArray data) throws JSONException, FileNotFoundException, ParseException {
    int dateIndex, tminIndex, tmaxIndex, precipIndex;
    dateIndex = tminIndex = tmaxIndex = precipIndex = -1;

    JSONArray line = data.getJSONArray(0);
    for (int j = 0; j < line.length(); j++) {
      String column = line.getString(j);
      if (column.toLowerCase().contains("date")) {
        dateIndex = j;
      } else if (column.toLowerCase().contains("tmin")) {
        tminIndex = j;
      } else if (column.toLowerCase().contains("tmax")) {
        tmaxIndex = j;
      } else if (column.toLowerCase().contains("ppt")) {
        precipIndex = j;
      }
    }

    DateFormat df = new SimpleDateFormat(Config.getString("prism.date.format"));
    Calendar cal = Calendar.getInstance();

    try (PrintWriter writer = new PrintWriter(new File(getWorkspaceDir(), "DAILY_WEATHER.txt"));) {
      if (dateIndex != -1 && tminIndex != -1 && tmaxIndex != -1 && precipIndex != -1) {
        for (int i = 1; i < data.length(); i++) {
          line = data.getJSONArray(i);

          Date today = df.parse(line.getString(dateIndex));
          cal.setTime(today);

          writer.print(String.format("%-4s", cal.get(Calendar.DAY_OF_MONTH)));
          writer.print(String.format("%-4s", cal.get(Calendar.MONTH) + 1));
          writer.print(String.format("%-6s", cal.get(Calendar.YEAR)));
          writer.print(String.format("%-6s", cal.get(Calendar.DAY_OF_YEAR)));
          writer.print(String.format("%-8s", line.getDouble(tmaxIndex)));
          writer.print(String.format("%-8s", line.getDouble(tminIndex)));
          writer.print(String.format("%-8s", line.getDouble(precipIndex)));
          writer.println();
        }
      }
      writer.close();
    }
  }

}