ServiceCall.java [src/java/util] Revision: default  Date:
/*
 * $Id$
 *
 * This file is part of the Cloud Services Integration Platform (CSIP),
 * a Model-as-a-Service framework, API, and application suite.
 *
 * 2012-2017, 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 util;

import csip.api.server.ServiceException;
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>
 */
abstract public class ServiceCall extends csip.utils.Client {

  protected JSONObject request;
  protected JSONObject results = null;
  protected JSONObject requestMetainfoObject = null;
  protected JSONObject resultMetaInfoObject = null;
  protected JSONArray callResultSection = null;
  protected String metaError = "";
  protected String URI;
  protected String errorPrefix = "";


  public ServiceCall(String URI) {
    super();
    this.URI = URI;
  }


  public void call() throws ServiceException {
    try {
      execPost();
    } catch (ServiceException ex) {
      throw new ServiceException((errorPrefix.isEmpty() ? "" : (errorPrefix + ":  ")) + ex.getMessage(), ex);
    }
  }


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


  abstract protected void createRequest() throws ServiceException;


  public String getMetaError() {
    return metaError;
  }


  public JSONObject getRequest() {
    return request;
  }


  public JSONObject getResults() {
    return results;
  }


  public JSONObject getReturnMetainfo() {
    return resultMetaInfoObject;
  }


  public JSONArray getResultSection() {
    return callResultSection;
  }


  public void setRequest(String request) throws JSONException, ServiceException {
    if ((null != request) && (!request.isEmpty())) {
      this.request = new JSONObject(request);
    } else {
      throw new ServiceException((errorPrefix.isEmpty() ? "" : (errorPrefix + ":  ")) + "Attempt to set request data with empty string.");
    }
  }


  public void setRequest(JSONObject request) throws ServiceException {
    if ((null != request) && (request.length() > 0)) {
      this.request = request;
    } else {
      throw new ServiceException((errorPrefix.isEmpty() ? "" : (errorPrefix + ":  ")) + "Attempt to set request data with empty JSONObject.");
    }
  }


  public void setURI(String URI) throws ServiceException {
    if ((null != URI) && (!URI.isEmpty())) {
      this.URI = URI;
    } else {
      throw new ServiceException((errorPrefix.isEmpty() ? "" : (errorPrefix + ":  ")) + "Attempt to set URI with empty string.");
    }
  }


  private void checkErrors() throws ServiceException {
    try {

      if ((null == results) || (results.length() <= 0)) {
        throw new ServiceException((errorPrefix.isEmpty() ? "" : (errorPrefix + ":  ")) + "No data was returned from " + URI + " for this request. ");
      }

      resultMetaInfoObject = results.getJSONObject("metainfo");
      metaError = resultMetaInfoObject.optString("error", "");

      if ((null != metaError) && (!metaError.isEmpty())) {
        throw new ServiceException((errorPrefix.isEmpty() ? "" : (errorPrefix + ":  ")) + "Service Call failed with error: " + metaError);
      }

      callResultSection = this.results.optJSONArray("result");

    } catch (JSONException ex) {
      throw new ServiceException((errorPrefix.isEmpty() ? "" : (errorPrefix + ":  ")) + "Missing metainfo in return data. ", ex);
    }
  }


  protected void throwServiceCallException(String message) throws ServiceException {
    throw new ServiceException((errorPrefix.isEmpty() ? "" : (errorPrefix + ":  ")) + message);
  }


  protected void throwServiceCallException(String message, Exception ex) throws ServiceException {
    throw new ServiceException((errorPrefix.isEmpty() ? "" : (errorPrefix + ":  ")) + message + ex.getMessage(), ex);
  }


  protected final void execPost() throws ServiceException {
    createRequest();

    try {
      results = super.doPOST(URI, request);
    } catch (Exception ex) {
      throw new ServiceException((errorPrefix.isEmpty() ? "" : (errorPrefix + ":  ")) + "Error making a connection to that location: " + URI + ".  " + ex.getMessage(), ex);
    }

    checkErrors();
    parseResults();
  }
}