Climate.java [src/java/crp/utils] Revision: fad70b35517781f034beb514ca90f123dc4edaf6  Date: Fri Dec 06 14:19:16 MST 2019
/*
 * $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 csip.Client;
import static csip.ModelDataService.KEY_METAINFO;
import static csip.ModelDataService.KEY_PARAMETER;
import csip.ServiceException;
import csip.utils.JSONUtils;
import gisobjects.GISObject;
import java.io.IOException;
import java.net.URI;
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 Climate extends ServiceCall {

    GISObject shape;
    JSONObject metaInfo;
    String climateData;

    public Climate(JSONObject metaInfo, GISObject shape, String URI) {
        super(URI);
        this.shape = shape;
        this.metaInfo = metaInfo;

        errorPrefix = "CligenServiceCall";
    }

    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);
            URI cliURI = new URI(JSONUtils.getStringParam(resultMap, metaInfo.getString("suid") + ".cli", ""));
            
            Client fileGet = new Client();

            climateData = fileGet.doGET(cliURI.toString());

        } catch (Exception ex) {
            throwServiceCallException("Could not retrieve the climate file: ", 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("CliWindSoil_Metainfo", metaInfo);
            request.put(KEY_METAINFO, requestMetainfoObject);

            try {
                JSONObject geometry = shape.toJSON();
                JSONObject feature = new JSONObject();
                JSONObject properties = new JSONObject();

                properties.put("name", "pt one");
                properties.put("gid", 1);

                feature.put("type", "feature");
                feature.put("geometry", geometry);
                feature.put("properties", properties);

                JSONArray features = new JSONArray();
                features.put(feature);

                JSONObject zoneFeatures = new JSONObject();
                zoneFeatures.put("type", "FeatureCollection");
                zoneFeatures.put("features", features);

                dataArray.put(JSONUtils.data("input_zone_features", zoneFeatures));

                dataArray.put(JSONUtils.data("outputFile", metaInfo.get("suid") + ".cli"));
                dataArray.put(JSONUtils.data("duration", 100));
                dataArray.put(JSONUtils.data("dataVersion", 2015));
                dataArray.put(JSONUtils.data("usePRISM", true));

                request.put(KEY_PARAMETER, dataArray);

            } catch (IOException ex) {
                throwServiceCallException("Cannot create input to cligen_prism", ex);
            }

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

}