WEPS.java [src/java/crp/utils] Revision:   Date:
/*
 * $Id$
 *
 * This file is part of the Cloud Services Integration Platform (CSIP),
 * a Model-as-a-Service framework, API, and application suite.
 *
 * 2012-2019, OMSLab, Colorado State University.
 *
 * OMSLab licenses this file to you under the MIT license.
 * See the LICENSE file in the project root for more information.
 */
package crp.utils;

import static csip.ModelDataService.KEY_METAINFO;
import static csip.ModelDataService.KEY_PARAMETER;
import csip.ServiceException;
import csip.utils.JSONUtils;
import java.util.Map;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;

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

  private String metaInfo;
  private String climateData;
  double windErosion;
  private JSONObject rotation;
  private double latitude, longitude, regionLength, regionWidth, regionOrientation;
  private String cokey;
  private WEPSFallowRotation fallowRotation;

  public WEPS(String metaInfo, double _latitude, double _longitude, double _regionLength, double _regionWidth,
      double _regionOrientation, String _cokey, JSONObject _rotation, String URI) throws JSONException {
    super(URI);
    this.metaInfo = metaInfo;
    if (null == _rotation) {
      rotation = new WEPSFallowRotation(0).rotation();
    } else {
      rotation = _rotation;
    }
    latitude = _latitude;
    longitude = _longitude;
    cokey = _cokey;
    regionLength = _regionLength;
    regionWidth = _regionWidth;
    regionOrientation = _regionOrientation;
    asyncCall = true;

    errorPrefix = "WEPSServiceCall";
  }

  public WEPS(String metaInfo, double _latitude, double _longitude, double _regionLength, double _regionWidth,
      double _regionOrientation, String _cokey, JSONObject _rotation, String URI,
      Object data, CheckedServiceResult<ServiceCallData> serviceCallback) throws JSONException {
    super(URI, data, serviceCallback);
    this.metaInfo = metaInfo;
    if (null == _rotation) {
      rotation = new WEPSFallowRotation(0).rotation();
    } else {
      rotation = _rotation;
    }
    latitude = _latitude;
    longitude = _longitude;
    cokey = _cokey;
    regionLength = _regionLength;
    regionWidth = _regionWidth;
    regionOrientation = _regionOrientation;
    asyncCall = true;

    errorPrefix = "WEPSServiceCall";
  }

  public WEPS(String metaInfo, double _latitude, double _longitude, double _regionLength, double _regionWidth,
      double _regionOrientation, String _cokey, JSONObject _rotation, String URI,
      CheckedServiceResult<ServiceCallData> serviceCallback) throws JSONException {
    super(URI, serviceCallback);
    this.metaInfo = metaInfo;
    if (null == _rotation) {
      rotation = new WEPSFallowRotation(0).rotation();
    } else {
      rotation = _rotation;
    }
    latitude = _latitude;
    longitude = _longitude;
    cokey = _cokey;
    regionLength = _regionLength;
    regionWidth = _regionWidth;
    regionOrientation = _regionOrientation;
    asyncCall = true;

    errorPrefix = "WEPSServiceCall";
  }

  public String data() {
    return climateData;
  }

  @Override
  protected void parseResults() throws ServiceException {
    //   Error checking has already been done on these results.
    // If we get to this function, no further error
    // checking is necessary, except to look at the "results" array in the output, if desired.
    if (null == callResultSection) {
      throw new ServiceException((errorPrefix.isEmpty() ? "" : (errorPrefix + ":  ")) + "Cannot find results in the call to " + this.URI + " .");
    }

    try {
      //  Get the climate file and store it.
      Map<String, JSONObject> resultMap = JSONUtils.getResults(results);
      if (resultMap.containsKey("wind_eros")) {
        windErosion = JSONUtils.getDoubleParam(resultMap, "wind_eros", Double.NaN);
      } else {
        throwServiceCallException("Cannot find the wind_eros result.");
      }
    } catch (JSONException ex) {
      throwServiceCallException("Error trying to find results section", ex);
    }
  }

  @Override
  protected void createRequest() throws ServiceException {
    JSONArray dataArray;

    requestMetainfoObject = new JSONObject();
    request = new JSONObject();

    dataArray = new JSONArray();
    try {
      requestMetainfoObject.put("MultipartRequest", "Bundled Service Request From csip-crp MetaModeling CliWindSoil Service");
      requestMetainfoObject.put("CRPAssessment_Metainfo", new JSONObject(metaInfo));
      if (asyncCall) {
        requestMetainfoObject.put("mode", "async");
      }
      requestMetainfoObject.put("report", false);

      request.put(KEY_METAINFO, requestMetainfoObject);

      JSONArray windBarriers = new JSONArray();
      JSONObject windBarrier = new JSONObject("{\"name\": \"wind_barrier\",\"value\": null,\"properties\": {} }");

      windBarriers.put(windBarrier);
      windBarriers.put(windBarrier);
      windBarriers.put(windBarrier);
      windBarriers.put(windBarrier);

      //  Non-Changing values
      dataArray.put(JSONUtils.data("wind_barriers", windBarriers));
      dataArray.put(JSONUtils.data("crop_calibration_mode", false));
      dataArray.put(JSONUtils.data("usePRISM", true));
      dataArray.put(JSONUtils.data("field_shape", "rectangle"));
      dataArray.put(JSONUtils.data("elevation", 0));
      dataArray.put(JSONUtils.data("field_radius", 0));
      dataArray.put(JSONUtils.data("soil_rock_fragments", 0));

      //  User or other service provided values
      dataArray.put(JSONUtils.data("latitude", latitude));
      dataArray.put(JSONUtils.data("longitude", longitude));
      dataArray.put(JSONUtils.data("soil", cokey));
      dataArray.put(JSONUtils.data("field_length", regionLength));
      dataArray.put(JSONUtils.data("field_width", regionWidth));
      dataArray.put(JSONUtils.data("field_orientation", regionOrientation));

      //  Rotation object retrieved from CRP Database
      dataArray.put(rotation);

      request.put(KEY_PARAMETER, dataArray);
      this.requestJSON = request;

    } catch (JSONException ex) {
      throwServiceCallException("Cannot create the JSON request.", ex);
    }
  }

  public double windErosion() {
    return windErosion;
  }
}