Drought_V1_0.java [src/java/m/cfa] Revision: 5f9df206c7579765eed0feaf8307ec8f46bd6981  Date: Fri Jan 23 14:22:57 MST 2015
package m.cfa;

import cfa.guiDrought_Model;
import csip.AbstractModelService;
import java.util.Map;
import java.util.concurrent.Callable;
import javax.ws.rs.Path;
import oms3.annotations.Description;
import oms3.annotations.Name;
import oms3.annotations.VersionInfo;
import org.codehaus.jettison.json.*;
import csip.utils.JSONUtils;
import csip.utils.Services;
import java.io.File;
import org.apache.commons.io.FileUtils;

@Name("drought")
@Description("drought")
@VersionInfo("1.0")
@Path("m/cfa/drought/1.0")
public class Drought_V1_0 extends AbstractModelService {

    guiDrought_Model model = new guiDrought_Model();

    @Override
    protected Callable<String> createCallable() throws Exception {
        return new Callable<String>() {
            @Override
            public String call() throws Exception {
                Map<String, JSONObject> m = getParamMap();

                model.setMainFolder(getWorkspaceDir().toString());
                model.setDatabase(m.get("database").getString(VALUE));
                model.setOrganizationName(m.get("org").getString(VALUE));
                model.setStationID(m.get("station_id").getString(VALUE));
                model.setStationName(m.get("station_name").getString(VALUE));
                model.setBeginDate(m.get("begin_date").getString(VALUE));
                model.setEndDate(m.get("end_date").getString(VALUE));
                model.setLambdaString(m.get("lambda_string").getString(VALUE));
                model.setAction(m.get("action").getString(VALUE));
                model.setPhiValues(m.get("phi_values").getString(VALUE));
                model.setThetaValues(m.get("theta_values").getString(VALUE));
                model.setDroughtLimit(m.get("drought_limit").getDouble(VALUE));
                model.setUseSTORETretrieval(m.get("useSTORETretrieval").getBoolean(VALUE));
                model.setSTORETdata(m.get("STORETdata").getString(VALUE));
                model.setMergeDatasets(m.get("merge_datasets").getBoolean(VALUE));
                model.setMergeMethod(m.get("merge_method").getString(VALUE));
                model.setUserData(m.get("user_data").getString(VALUE));

                model.run();
                return EXEC_OK;
            }
        };
    }

    @Override
    public File[] postprocess() throws Exception {
         //This result array is more complex because drought can pass back 1, 2, or 5 graphs

        if (model.getAction().equalsIgnoreCase("all")) {

            return Services.toFiles(model.getResult().getName(),
                                    model.getTimeseriesGraph(),
                                    model.getColumnChart(),
                                    model.getFittedDataGraph(),
                                    model.getProjectedDataGraph(),
                                    model.getDroughtRecurrenceGraph(),
                                    //Below are the result graph files for use by JSHighCharts on eRAMS for duplicating the above graphs
                                    model.getTimeseriesOutput().getName(),
                                    model.getColumnChartOutput().getName(),
                                    model.getFittedGraphOutput().getName(),
                                    model.getProjectedGraphOutput().getName(),
                                    model.getRecurrenceGraphOutput().getName());

        } else if (model.getAction().equalsIgnoreCase("optimizeModel")) {
            return Services.toFiles(model.get_optimizeModel_output());

        } else {
            return Services.toFiles(model.getFittedDataGraph());
        }
    }

    @Override
    protected JSONArray createResults() throws Exception {
        //This result array is more complex because drought analysis can pass back 1, 2, or 5 graphs
        if (model.getAction().equalsIgnoreCase("all")) {
            JSONArray result = new JSONArray();
            result.put(JSONUtils.data("len", model.getLen()));
            result.put(JSONUtils.data("start", model.getStart()));
            result.put(JSONUtils.data("end", model.getEnd()));
            result.put(JSONUtils.data("data_source", model.getDataSource()));
            result.put(JSONUtils.data("drought_limit", model.getDroughtLimit()));
            //Get other results
            result.put(JSONUtils.data("drought_summary",model.getResult().getName()));
            result.put(JSONUtils.data("graph1", model.getTimeseriesGraph()));
            result.put(JSONUtils.data("graph2", model.getColumnChart()));
            result.put(JSONUtils.data("graph3", model.getFittedDataGraph()));
            result.put(JSONUtils.data("graph4", model.getProjectedDataGraph()));
            result.put(JSONUtils.data("graph5", model.getDroughtRecurrenceGraph()));
            
            //Get result files for JSHighCharts
            String graphDataFiles = model.getTimeseriesOutput().getName() + "|" + 
                                    model.getColumnChartOutput().getName() + "|" +
                                    model.getFittedGraphOutput().getName() + "|" +
                                    model.getProjectedGraphOutput().getName() + "|" +
                                    model.getRecurrenceGraphOutput().getName();
            result.put(JSONUtils.data("graph_data_files", graphDataFiles));
            return result;
            
        } else if (model.getAction().equalsIgnoreCase("optimizeModel")) {
            String[] graphs = model.get_optimizeModel_output();
            if (model.getThetaValues().equalsIgnoreCase("")) {
                //The drought model is AR(p) so only 1 graph
                String graph1 = graphs[0];

                JSONArray result = new JSONArray();
                result.put(JSONUtils.data("len", model.getLen()));
                result.put(JSONUtils.data("start", model.getStart()));
                result.put(JSONUtils.data("end", model.getEnd()));
                result.put(JSONUtils.data("data_source", model.getDataSource()));
                result.put(JSONUtils.data("drought_summary", FileUtils.readFileToString(model.getResult())));
                result.put(JSONUtils.data("graph1", graph1));
                return result;
            } else {
                //The drought model used is ARMA(p,q) so only 2 graphs
                String graph1 = graphs[0];
                String graph2 = graphs[1];

                JSONArray result = new JSONArray();
                result.put(JSONUtils.data("len", model.getLen()));
                result.put(JSONUtils.data("start", model.getStart()));
                result.put(JSONUtils.data("end", model.getEnd()));
                result.put(JSONUtils.data("data_source", model.getDataSource()));
                result.put(JSONUtils.data("drought_summary", FileUtils.readFileToString(model.getResult())));
                result.put(JSONUtils.data("graph1", graph1));
                result.put(JSONUtils.data("graph2", graph2));
                return result;
            }
        } else {
            //Return only one graph and updated parameter info
            JSONArray result = new JSONArray();
            result.put(JSONUtils.data("len", model.getLen()));
            result.put(JSONUtils.data("start", model.getStart()));
            result.put(JSONUtils.data("end", model.getEnd()));
            result.put(JSONUtils.data("data_source", model.getDataSource()));
            result.put(JSONUtils.data("drought_summary", FileUtils.readFileToString(model.getResult())));
            result.put(JSONUtils.data("graph1", model.getFittedDataGraph()));
            return result;
        }
    }
}