V1_0.java [src/java/m/wqm/wqm19_pestpractscores] Revision:   Date:
package m.wqm.wqm19_pestpractscores;

/*
 * 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.
 */
import csip.ModelDataService;
import csip.api.server.ServiceException;
import csip.annotations.Resource;
import csip.utils.JSONUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Map;
import javax.ws.rs.Path;
import csip.annotations.Description;
import csip.annotations.Name;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import wqm.utils.DBQueries;
import wqm.utils.DBResources;
import static wqm.utils.DBResources.WQM_ID;

/**
 * WQM-19: Pesticide Mitigation Practice Scores
 *
 * @author dhawal
 * @author Shaun Case
 * @author anvesh
 *
 * @version 1.0
 */
@Name("WQM-19: Pesticide Mitigation Practice Scores (PestPractScores)")
@Description("This service computes scores for conservation practices applied "
        + "to mitigate pesticide leaching, solution runoff, adsorbed runoff, and drift.")
@Path("m/pesticide_practice_score/1.0")
@Resource(from = DBResources.class)

public class V1_0 extends ModelDataService {

    private int aoaId;
    private ArrayList<IPM> ipmList = new ArrayList<>();
    private int pleach_practice_score, psolsurf_practice_score, padsurf_practice_score, pdrift_practice_score;

    @Override
    protected void preProcess() throws ServiceException, JSONException {
        aoaId = parameter().getInt("AoAId");
        JSONArray pestComponents = parameter().getJSONArray("pestcomponents");
        for (int i = 0; i < pestComponents.length(); i++) {
            Map<String, JSONObject> pestComponent = JSONUtils.preprocess(pestComponents.getJSONArray(i));
            int plan_ipm_practice = JSONUtils.getIntParam(pestComponent, "plan_ipm_practice", -1);
            String plan_pract_variant = JSONUtils.getStringParam(pestComponent, "plan_pract_variant", null);

            if (plan_pract_variant.isEmpty()) {
                plan_pract_variant = null;
            }

            ipmList.add(new IPM(plan_ipm_practice, plan_pract_variant));
        }
    }

    @Override
    protected void doProcess() throws SQLException, ServiceException {
        try (Connection connection = resources().getJDBC(WQM_ID)) {
            compute(connection);
        }
    }

    @Override
    protected void postProcess() {
        results().put("AoAId", aoaId, "Area of Analysis Identifier");
        results().put("pleach_practice_score", pleach_practice_score, "Conservation Practice Mitigation Score for Pesticide Leaching");
        results().put("psolsurf_practice_score", psolsurf_practice_score, "Conservation Practice Mitigation Score for Pesticide Solution Runoff");
        results().put("padsurf_practice_score", padsurf_practice_score, "Conservation Practice Mitigation Score for Pesticide Adsorbed Runoff");
        results().put("pdrift_practice_score", pdrift_practice_score, "Conservation Practice Mitigation Score for Pesticide Drift");
    }

    private void compute(Connection connection) throws SQLException {
        if (ipmList != null) {
            for (IPM ipm : ipmList) {
                pleach_practice_score += computeScore(connection, ipm, "Pesticide Leaching");
                psolsurf_practice_score += computeScore(connection, ipm, "Pesticide Solution Runoff");
                padsurf_practice_score += computeScore(connection, ipm, "Pesticide Adsorbed Runoff");
                pdrift_practice_score += computeScore(connection, ipm, "Pesticide Drift");
            }
        }
    }

    private int computeScore(Connection connection, IPM ipm, String concern) throws SQLException {
        int score = 0;
        try (Statement statement = connection.createStatement();
                ResultSet resultSet = statement.executeQuery(DBQueries.WQM19Query1(ipm.plan_ipm_practice, ipm.plan_pract_variant, concern));) {
            while (resultSet.next()) {
                score = resultSet.getInt("ipm_practice_score");
            }
        }
        return score;
    }

    static class IPM {

        int plan_ipm_practice;
        String plan_pract_variant;

        public IPM(int plan_ipm_practice, String plan_pract_variant) {
            this.plan_ipm_practice = plan_ipm_practice;
            this.plan_pract_variant = plan_pract_variant;
        }
    }
}