Displaying differences for changeset
 
display as  

src/java/m/wqm/nutappmgtscores/V1_0.java

@@ -3,7 +3,10 @@
 /**
  *
  * @author RUMPAL SIDHU
+ * @author Shaun Case
+ * 
  */
+ 
 import csip.ModelDataService;
 import csip.utils.JSONUtils;
 import csip.utils.Dates;
@@ -43,325 +46,143 @@
     private ArrayList<Input> input;
     //Response
     private ArrayList<Result> result;
-
+    
+    //private class variables for this service
+    private int AoAId = 0;
+    private String p_soil_test_result = "err";
+    private ArrayList<Crop> cropList;   
+    private String error_msg = "";
+    private Connection conn = null;
+    private Statement statement = null;    
+    
     @Override
     protected void preProcess() throws Exception {
-        input = new ArrayList<>();
-        int AoAId = getIntParam("aoa_id", 0);
-        String p_soil_test_result = getStringParam("p_soil_test_result", "err");
-        ArrayList<Crop> cropList = new ArrayList<>();
-        JSONArray cropIds = getJSONArrayParam("cropIds");
-        for (int i = 0; i < cropIds.length(); i++) {
-            Map<String, JSONObject> mgtCropId = JSONUtils.preprocess(cropIds.getJSONArray(i));
+        try{
+            Class.forName(CLASS_NAME);            
+            conn = DriverManager.getConnection(CONNECTION, USER, PASS);
+            statement = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
+        }
+        catch(ClassNotFoundException | SQLException ex) {
+            if (ex instanceof SQLException) {
+                LOG.info("Did not open database for WQM-16!");
+                LOG.info(ex.getMessage());      
+                error_msg = "Could not open database for WQM-16!  " + ex.getMessage();
+            }
+            else{
+                error_msg = "Could not instantiate postgres database object: " + ex.getMessage();
+            }                                            
+        }
 
-            int cropId = JSONUtils.getIntParam(mgtCropId, "mgt_crop_id", 0);
-            String cropPlantDate = JSONUtils.getStringParam(mgtCropId, "crop_plant_date", "err");
-            double cropYield = JSONUtils.getDoubleParam(mgtCropId, "crop_yield", 0);
-            String cropYieldUnits = JSONUtils.getStringParam(mgtCropId, "crop_yield_units", "err");
-            ArrayList<Nutrient> nutrientApplicationList = new ArrayList<>();
-            JSONArray applicationList = JSONUtils.getJSONArrayParam(mgtCropId, "applicationList");
-            for (int j = 0; j < applicationList.length(); j++) {
-                Map<String, JSONObject> application = JSONUtils.preprocess(applicationList.getJSONArray(j));
-                String nutrient_application_date = JSONUtils.getStringParam(application, "nutrient_application_date", "err");
-                boolean incorporated = JSONUtils.getBooleanParam(application, "incorporated", false);
-                ArrayList<NutrientApplied> nutrientAppliedList = new ArrayList<>();
-                JSONArray applicate = JSONUtils.getJSONArrayParam(application, "application");
-                for (int k = 0; k < applicate.length(); k++) {
-                    Map<String, JSONObject> a = JSONUtils.preprocess(applicate.getJSONArray(k));
-                    String nutrient_applied = JSONUtils.getStringParam(a, "nutrient_applied", "err");
-                    double application_rate = JSONUtils.getDoubleParam(a, "application_rate", 0);
-                    nutrientAppliedList.add(new NutrientApplied(nutrient_applied, application_rate));
-                }
-                nutrientApplicationList.add(new Nutrient(nutrient_application_date, incorporated, nutrientAppliedList));
-            }
-            cropList.add(new Crop(cropId, cropPlantDate, cropYield, cropYieldUnits, nutrientApplicationList));
+        if (error_msg.isEmpty()){
+            AoAId = getIntParam("aoa_id", 0);
+            p_soil_test_result = getStringParam("p_soil_test_result", "err");
+            cropList = new ArrayList<>();
+
+            JSONArray cropIds = getJSONArrayParam("cropIds");
+            for (int i = 0; i < cropIds.length(); i++) {
+                Map<String, JSONObject> mgtCropId = JSONUtils.preprocess(cropIds.getJSONArray(i));
+                cropList.add( new Crop(JSONUtils.getIntParam(mgtCropId, "mgt_crop_id", 0), JSONUtils.getStringParam(mgtCropId, "crop_plant_date", "err"), 
+                            JSONUtils.getDoubleParam(mgtCropId, "crop_yield", 0), JSONUtils.getStringParam(mgtCropId, "crop_yield_units", "err"), 
+                            JSONUtils.getJSONArrayParam(mgtCropId, "applicationList"), p_soil_test_result, statement));
+            }            
+            
+            ValidateInput();
         }
-        input.add(new m.wqm.nutappmgtscores.Input(AoAId, cropList, p_soil_test_result));
     }
 
     @Override
-    protected String process() throws Exception {
-        result = new ArrayList<>();
-        Connection conn = null;
-        Statement statement = null;
+    protected String process() throws Exception {        
+        String ret_val = EXEC_OK;
+        int n_app_timing_score = 100;
+        int p_app_timing_score = 100;
+        int app_method_score = -1;
+        int n_app_rate_score = 0;
+        int p_app_rate_score = 0;
+        int this_crop_id = 0;
         String query;
         ResultSet resultSet;
+        
+        if ( !error_msg.isEmpty()){
+            ret_val = error_msg;
+        }
+        else{
+            result = new ArrayList<>();
 
-        try {
-            Class.forName(CLASS_NAME);
-            conn = DriverManager.getConnection(CONNECTION, USER, PASS);
-            conn.setAutoCommit(false);
-            statement = conn.createStatement();
-            for (Input ip : input) {
-                int n_app_timing_score = 100;
-                int p_app_timing_score = 100;
-                int app_method_score = 0;
-                int n_app_rate_score = 0;
-                int p_app_rate_score = 0;
-                int this_crop_id = 0;
-                ArrayList<Crop> cropList = ip.getCropList();
+            try {
                 for (Crop crop : cropList) {
-                    ArrayList<Nutrient> nutrientApplicationList = crop.getNutrientApplicationList();
-                    this_crop_id = crop.getMgtCropId();
+                    
+                    String crop_type = crop.getCropType();
+//////TODO:  Remember to check for errors from the classes....   ///////                    
+                    if ( !crop_type.isEmpty() ){                                               
+                         //#Update N and P application management rate scores for each crop
+                        int[] app_rate_scores = crop.getNutrientApplicationRateScores();
+                        if ( !(error_msg = crop.getErrorMsg()).isEmpty() )
+                            break;
+                        
+                        //Cummulative sum of N and P application management scores over all crops for the AoA
+                        n_app_rate_score += app_rate_scores[Crop.N_APP_RATE_SCORE];
+                        p_app_rate_score += app_rate_scores[Crop.P_APP_RATE_SCORE];
+                                                
+                        
+                        //#Compute N and P application timing scores for the crop and update timing scores for the AoA
+                        int [] app_time_scores = crop.getNutrientApplicationTimingScores();
+                        if ( !(error_msg = crop.getErrorMsg()).isEmpty() )
+                            break;                        
 
-                    //#Determine crop type of the crop
-                    query = "SELECT wqm_crop_type FROM wqm_crops WHERE wqm_crop_id=" + this_crop_id + ";";
-                    resultSet = statement.executeQuery(query);
-                    String crop_type = "err";
-                    while (resultSet.next()) {
-                        crop_type = resultSet.getString("wqm_crop_type");
+                        //  There is a problem with the logic of the specification here...It does not take into account the actual timing of applications when
+                        //  there are mulitple crops and multiple years invovled....these final values are probably not correct.  The "-1" below is placed here
+                        //  in an attempt to fix the missing database values problem that also exists with this logic at the nutrient level.
+                        if (( app_time_scores[Crop.N_APP_TIMING_SCORE] < n_app_timing_score ) || (n_app_timing_score == -1))
+                            n_app_timing_score = app_time_scores[Crop.N_APP_TIMING_SCORE];
+                        
+                        if (( app_time_scores[Crop.P_APP_TIMING_SCORE] < p_app_timing_score ) || (p_app_timing_score == -1))
+                            p_app_timing_score = app_time_scores[Crop.P_APP_TIMING_SCORE];
+                        
+                        //#If any nutrient application for any crop is not incorporated, the method score for the AoA is zero
+                        if ( !crop.allNutrientsIncorporated() ){
+                            app_method_score = 0;
+                        }                          
+                        if ( !(error_msg = crop.getErrorMsg()).isEmpty() )
+                            break;                        
                     }
-
-                    //#Determine whether split nutrient applications or not
-                    int app_count = 0;
-                    String app_type;
-                    //For each nutrient_application_date in the crop period
-                    //for (Nutrient i : nutrientApplication) {
-                    //    app_count = app_count + 1;
-                    //}
-                    app_count = nutrientApplicationList.size();
-                    if (app_count == 1) {
-                        app_type = "nosplit";
-                    } else {
-                        app_type = "split";
-                    }
-                    //If no nutrient_application_date (no nutrient applications for the crop)
-                    int ncrop_app_rate_score = 0;
-                    int pcrop_app_rate_score = 0;
-                    if (nutrientApplicationList.isEmpty()) {
-                        //#Compute score for not fertilizing.
-                        query = "SELECT app_mgt_score FROM wqm_nutrient_application_mgt_scores WHERE nutrient='" + "Nitrogen" + "' AND app_mgt_kind='" + "Rate" + "' AND app_mgt_factor='" + "None" + "';";
-                        resultSet = statement.executeQuery(query);
-                        while (resultSet.next()) {
-                            n_app_rate_score = resultSet.getInt("app_mgt_score");
-                        }
-                        switch (ip.getPSoilTestResult()) {
-                            case "High": {
-                                query = "SELECT app_mgt_score FROM wqm_nutrient_application_mgt_scores WHERE nutrient='" + "Phosphorus" + "' AND app_mgt_kind='" + "Rate" + "' AND app_mgt_factor='" + "None" + "' AND soil_test_result='" + "High" + "';";
-                                resultSet = statement.executeQuery(query);
-                                while (resultSet.next()) {
-                                    p_app_rate_score = resultSet.getInt("app_mgt_score");
-                                }
-                                break;
-                            }
-                            case "Medium": {
-                                query = "SELECT app_mgt_score FROM wqm_nutrient_application_mgt_scores WHERE nutrient='" + "Phosphorus" + "' AND app_mgt_kind='" + "Rate" + "' AND app_mgt_factor='" + "None" + "' AND soil_test_result='" + "Medium" + "';";
-                                resultSet = statement.executeQuery(query);
-                                while (resultSet.next()) {
-                                    p_app_rate_score = resultSet.getInt("app_mgt_score");
-                                }
-                                break;
-                            }
-                            case "None": {
-                                query = "SELECT app_mgt_score FROM wqm_nutrient_application_mgt_scores WHERE nutrient='" + "Phosphorus" + "' AND app_mgt_kind='" + "Rate" + "' AND app_mgt_factor='" + "None" + "' AND soil_test_result='" + "None" + "';";
-                                resultSet = statement.executeQuery(query);
-                                while (resultSet.next()) {
-                                    p_app_rate_score = resultSet.getInt("app_mgt_score");
-                                }
-                            }
-                        }
-                    } else { //Else #Compute N and P removal ratios
-                        double nrate = 0.0;
-                        double prate = 0.0;
-                        for (Nutrient nutrient : nutrientApplicationList) {
-                            ArrayList<NutrientApplied> nutrientAppliedList = nutrient.getNutrientAppliedList();
-                            for (NutrientApplied nApplied : nutrientAppliedList) {
-                                if (nApplied.getNutrientApplied().equals("Nitrogen")) {
-                                    nrate = nrate + nApplied.getApplicationRate();
-                                } else {
-                                    prate = prate + nApplied.getApplicationRate();
-                                }
-                            }
-                        }
-                        double wqm_crop_pct_dmat = 0.0;
-                        double wqm_pct_nitrogen = 0.0;
-                        double wqm_pct_phosphorus = 0.0;
-                        query = "SELECT wqm_crop_pct_dmat, wqm_pct_nitrogen, wqm_pct_phosphorus FROM wqm_crops WHERE wqm_crop_id=" + this_crop_id + ";";
-                        resultSet = statement.executeQuery(query);
-                        while (resultSet.next()) {
-                            wqm_crop_pct_dmat = resultSet.getDouble("wqm_crop_pct_dmat");
-                            wqm_pct_nitrogen = resultSet.getDouble("wqm_pct_nitrogen");
-                            wqm_pct_phosphorus = resultSet.getDouble("wqm_pct_phosphorus");
-                        }
-
-                        double n_growout = crop.getCropYield() * wqm_crop_pct_dmat * wqm_pct_nitrogen;
-                        double p_growout = crop.getCropYield() * wqm_crop_pct_dmat * wqm_pct_phosphorus;
-
-                        double n_remove_ratio = nrate / n_growout;
-                        double p_remove_ratio = prate / p_growout;
-
-                        //#Compute N application management rate score based on removal ratio and whether small grain or not
-                        if (crop_type.equals("small grain")) {
-                            query = "SELECT app_mgt_score FROM wqm_nutrient_application_mgt_scores WHERE nutrient='" + "Nitrogen" + "' AND app_mgt_kind='" + "Rate" + "' AND app_mgt_factor='" + "small grain" + "' AND remove_ratio_1 <= " + n_remove_ratio + "AND remove_ratio_2 > " + n_remove_ratio + ";";
-                            resultSet = statement.executeQuery(query);
-                            while (resultSet.next()) {
-                                ncrop_app_rate_score = resultSet.getInt("app_mgt_score");
-                            }
-                        } else {
-                            query = "SELECT app_mgt_score FROM wqm_nutrient_application_mgt_scores WHERE nutrient='" + "Nitrogen" + "' AND app_mgt_kind='" + "Rate" + "' AND app_mgt_factor='" + "other" + "' AND remove_ratio_1 <= " + n_remove_ratio + "AND remove_ratio_2 > " + n_remove_ratio + ";";
-                            resultSet = statement.executeQuery(query);
-                            while (resultSet.next()) {
-                                ncrop_app_rate_score = resultSet.getInt("app_mgt_score");
-                            }
-                        }
-
-                        //#Compute P application management rate scores based on removal ratio and soil test result
-                        switch (ip.getPSoilTestResult()) {
-                            case "High": {
-                                if (p_remove_ratio >= 1.2) {
-                                    pcrop_app_rate_score = 0;
-                                } else {
-                                    query = "SELECT app_mgt_score FROM wqm_nutrient_application_mgt_scores WHERE nutrient='" + "Phosphorus" + "' AND app_mgt_kind='" + "Rate" + "' AND app_mgt_factor='" + "app" + "' AND soil_test_result'=" + "High" + "'AND remove_ratio_1 <= " + p_remove_ratio + "AND remove_ratio_2 > " + p_remove_ratio + ";";
-                                    resultSet = statement.executeQuery(query);
-                                    while (resultSet.next()) {
-                                        pcrop_app_rate_score = resultSet.getInt("app_mgt_score");
-                                    }
-                                }
-                                break;
-                            }
-                            case "Medium": {
-                                if (p_remove_ratio >= 1.6) {
-                                    pcrop_app_rate_score = 0;
-                                } else {
-                                    query = "SELECT app_mgt_score FROM wqm_nutrient_application_mgt_scores WHERE nutrient='" + "Phosphorus" + "' AND app_mgt_kind='" + "Rate" + "' AND app_mgt_factor='" + "app" + "' AND soil_test_result'=" + "Medium" + "'AND remove_ratio_1 <= " + p_remove_ratio + "AND remove_ratio_2 > " + p_remove_ratio + ";";
-                                    resultSet = statement.executeQuery(query);
-                                    while (resultSet.next()) {
-                                        pcrop_app_rate_score = resultSet.getInt("app_mgt_score");
-                                    }
-                                }
-                                break;
-                            }
-                            case "Low": {
-                                if (p_remove_ratio >= 1.6) {
-                                    pcrop_app_rate_score = 0;
-                                } else {
-                                    query = "SELECT app_mgt_score FROM wqm_nutrient_application_mgt_scores WHERE nutrient='" + "Phosphorus" + "' AND app_mgt_kind='" + "Rate" + "' AND app_mgt_factor='" + "app" + "' AND soil_test_result'=" + "Low" + "'AND remove_ratio_1 <= " + p_remove_ratio + "AND remove_ratio_2 > " + p_remove_ratio + ";";
-                                    resultSet = statement.executeQuery(query);
-                                    while (resultSet.next()) {
-                                        pcrop_app_rate_score = resultSet.getInt("app_mgt_score");
-                                    }
-                                }
-                                break;
-                            }
-                            case "None": {
-                                if (p_remove_ratio >= 1.2) {
-                                    pcrop_app_rate_score = 0;
-                                } else {
-                                    query = "SELECT app_mgt_score FROM wqm_nutrient_application_mgt_scores WHERE nutrient='" + "Phosphorus" + "' AND app_mgt_kind='" + "Rate" + "' AND app_mgt_factor='" + "app" + "' AND soil_test_result'=" + "None" + "'AND remove_ratio_1 <= " + p_remove_ratio + "AND remove_ratio_2 > " + p_remove_ratio + ";";
-                                    resultSet = statement.executeQuery(query);
-                                    while (resultSet.next()) {
-                                        pcrop_app_rate_score = resultSet.getInt("app_mgt_score");
-                                    }
-                                }
-                                break;
-                            }
-                        }
-                        //#Update N and P application management rate scores for the AoA
-                        n_app_rate_score = n_app_rate_score + ncrop_app_rate_score;
-                        p_app_rate_score = p_app_rate_score + pcrop_app_rate_score;
-                    }
-                    //#Compute N and P application timing scores for the crop and update timin scores for the AoA
-                    int ncrop_app_timing_score = 0;
-                    int pcrop_app_timing_score = 0;
-                    for (Nutrient nutrient : nutrientApplicationList) {
-                        long app_day_diff = Dates.diffInMillis(crop.getCropPlantDate(), nutrient.getApplicationDate());
-                        app_day_diff = TimeUnit.MICROSECONDS.convert(app_day_diff, TimeUnit.DAYS);
-                        ArrayList<NutrientApplied> nutrientAppliedList = nutrient.getNutrientAppliedList();
-                        for (NutrientApplied nApplied : nutrientAppliedList) {
-                            switch (nApplied.getNutrientApplied()) {
-                                case "Nitrogen": {
-                                    if (app_type.equals("split")) {
-                                        query = "SELECT app_mgt_score FROM wqm_nutrient_application_mgt_scores WHERE nutrient='" + "Nitrogen" + "' AND app_mgt_kind='" + "Timing" + "' AND app_mgt_factor='" + "split" + "'AND days_fr_plant_1 <= " + app_day_diff + "AND days_fr_plant_2 > " + app_day_diff + ";";
-                                        resultSet = statement.executeQuery(query);
-                                        while (resultSet.next()) {
-                                            ncrop_app_timing_score = resultSet.getInt("app_mgt_score");
-                                            //Doubt
-                                            if (resultSet.wasNull()) {
-                                                n_app_timing_score = 0;
-                                            } else if (ncrop_app_timing_score < n_app_timing_score) {
-                                                n_app_timing_score = ncrop_app_timing_score;
-                                            }
-                                        }
-
-                                    } else {
-                                        query = "SELECT app_mgt_score FROM wqm_nutrient_application_mgt_scores WHERE nutrient='" + "Nitrogen" + "' AND app_mgt_kind='" + "Timing" + "' AND app_mgt_factor='" + "nosplit" + "'AND days_fr_plant_1 <= " + app_day_diff + "AND days_fr_plant_2 > " + app_day_diff + ";";
-                                        resultSet = statement.executeQuery(query);
-                                        while (resultSet.next()) {
-                                            ncrop_app_timing_score = resultSet.getInt("app_mgt_score");
-                                            //Doubt
-                                            if (resultSet.wasNull()) {
-                                                n_app_timing_score = 0;
-                                            } else if (ncrop_app_timing_score < n_app_timing_score) {
-                                                n_app_timing_score = ncrop_app_timing_score;
-                                            }
-                                        }
-                                    }
-                                    break;
-                                }
-                                case "Phosphorus": {
-                                    if (app_type.equals("split")) {
-                                        query = "SELECT app_mgt_score FROM wqm_nutrient_application_mgt_scores WHERE nutrient='" + "Phosphorus" + "' AND app_mgt_kind='" + "Timing" + "' AND app_mgt_factor='" + "split" + "'AND days_fr_plant_1 <= " + app_day_diff + "AND days_fr_plant_2 > " + app_day_diff + ";";
-                                        resultSet = statement.executeQuery(query);
-                                        while (resultSet.next()) {
-                                            pcrop_app_timing_score = resultSet.getInt("app_mgt_score");
-                                            //Doubt
-                                            if (resultSet.wasNull()) {
-                                                p_app_timing_score = 0;
-                                            } else if (pcrop_app_timing_score < p_app_timing_score) {
-                                                p_app_timing_score = ncrop_app_timing_score;
-                                            }
-                                        }
-                                    } else {
-                                        query = "SELECT app_mgt_score FROM wqm_nutrient_application_mgt_scores WHERE nutrient='" + "Phosphorus" + "' AND app_mgt_kind='" + "Timing" + "' AND app_mgt_factor='" + "nosplit" + "'AND days_fr_plant_1 <= " + app_day_diff + "AND days_fr_plant_2 > " + app_day_diff + ";";
-                                        resultSet = statement.executeQuery(query);
-                                        while (resultSet.next()) {
-                                            pcrop_app_timing_score = resultSet.getInt("app_mgt_score");
-                                            //Doubt
-                                            if (resultSet.wasNull()) {
-                                                p_app_timing_score = 0;
-                                            } else if (pcrop_app_timing_score < p_app_timing_score) {
-                                                p_app_timing_score = pcrop_app_timing_score;
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                    for (Nutrient nutrient : nutrientApplicationList) {
-                        //#If any nutrient application for any crop is not incorporated, the method score for the AoA is zero
-                        if (!nutrient.isIncorporated()) {
-                            app_method_score = 0;
-                            break;
-                        } else if (nutrient.isIncorporated()) { //#If all nutrient applications for all crops are incorporated, the method score for incorporation applies to the AoA
-                            query = "SELECT app_mgt_score FROM wqm_nutrient_application_mgt_scores WHERE app_mgt_kind='" + "Method" + "' AND app_mgt_factor='" + "incorporate" + "';";
-                            resultSet = statement.executeQuery(query);
-                            while (resultSet.next()) {
-                                app_method_score = resultSet.getInt("app_mgt_score");
-                            }
-                        }
+                    else{
+                        ret_val = error_msg = "Cannot get crop_type. " + crop.getErrorMsg();
                     }
                 }
+                
+                //  If all crops' nutrients were incorporated this value will still be -1
+                if ( app_method_score == -1 ){
+                    query = "SELECT app_mgt_score from wqm_nutrient_application_mgt_scores WHERE app_mgt_kind='Method' AND app_mgt_factor='incorporate';";
+                    resultSet = statement.executeQuery(query);
+                    if ( resultSet.first() ){
+                        app_method_score = resultSet.getInt("app_mgt_score");
+                    }                                                                
+                }
+                
                 //#Compute application management scores for nitrogen in groundwater, nitrogen in surface water, and phosphorus in surface water
                 int nleach_app_mgt_score = n_app_rate_score + n_app_timing_score + app_method_score;
                 int nsurf_app_mgt_score = n_app_rate_score + n_app_timing_score + app_method_score;
                 int psurf_app_mgt_score = p_app_rate_score + p_app_timing_score + app_method_score;
-                m.wqm.nutappmgtscores.Result result1 = new m.wqm.nutappmgtscores.Result(ip.getAoAId(), nleach_app_mgt_score, nsurf_app_mgt_score, psurf_app_mgt_score, n_app_rate_score, n_app_timing_score, p_app_rate_score, p_app_timing_score, app_method_score);
-                result.add(result1);
+                m.wqm.nutappmgtscores.Result result1 = new m.wqm.nutappmgtscores.Result(AoAId, nleach_app_mgt_score, nsurf_app_mgt_score, psurf_app_mgt_score, n_app_rate_score, n_app_timing_score, p_app_rate_score, p_app_timing_score, app_method_score);
+                result.add(result1);                    
+                
+                conn.close();
+            } catch (SQLException se) {
+                    LOG.info("Did not open database for WQM-16!");
+                    LOG.info(se.getMessage());
+                    ret_val += se.getMessage();                    
+                }catch (Exception ex ){
+                    ret_val += ex.getMessage();
+            } finally {
+                if (statement != null) {
+                    statement.close();
+                }
+                if (conn != null) {
+                    conn.close();
+                }
             }
-            conn.close();
-        } catch (SQLException se) {
-            LOG.info("Did not open database for WQM-16!");
-            LOG.info(se.getMessage());
-        } finally {
-            if (statement != null) {
-                statement.close();
-            }
-            if (conn != null) {
-                conn.close();
-            }
-        }
-        return EXEC_OK;
+        }       
+        return (error_msg.isEmpty()? EXEC_OK:error_msg);
     }
 
     @Override
@@ -383,4 +204,12 @@
         }
         putResult("Result", resultArr);
     }
+    
+    private boolean ValidateInput(){
+        for( Crop tCrop : cropList )
+            if ( !tCrop.validate() )
+                error_msg += "; " + tCrop.getErrorMsg();
+      
+      return (error_msg.isEmpty());    
+    }
 }