V2_1.java [src/java/d/soils/rse02_wepot] 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 d.soils.rse02_wepot;

import adb.DBResources;
import static adb.DBResources.EROSION_SQLSVR;
import static adb.DBResources.R2GIS_SQLSVR;
import csip.Config;
import csip.ModelDataService;
import csip.annotations.Description;
import csip.annotations.Name;
import csip.annotations.Resource;
import static csip.annotations.ResourceType.FILE;
import csip.api.server.PayloadParameter;
import d.util.WindWaterErosion;
import static d.util.WindWaterErosion.WWE_TIFF_FILE;
import java.sql.Connection;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.ws.rs.Path;
import static soils.db.DBResources.SDM;
import soils.db.SOILS_DATA;
import soils.db.SOILS_DB_Factory;

/**
 *
 * @author <a href="mailto:shaun.case@colostate.edu">Shaun Case</a>
 */
@Name("wepot")
@Description("This service computes water and wind erodibility potentials for"
    + " an area of analysis (AoA).  The service clips SSURGO soil mapunits "
    + "with AoA geometry, determines the dominant soil component in the AoA, "
    + "gets parameters from the SSURGO component table, including a climate "
    + "factor from the C Factor layer, and computes the following equations:  "
    + "Wind Erosion Potential = C*I/T ;  Water Erosion Potential = K*(LS)/T")
@Path("d/wepot/2.1")

//@Resource(file = "/data/us_cvalues.zip", type = ARCHIVE)
@Resource(file = "/data/us_cvalues_topo2ras_masked.tif", type = FILE, id = WWE_TIFF_FILE)
@Resource(file = "/data/us_cvalues_topo2ras_masked.tfw", type = FILE, id = "tfw_file")
@Resource(file = "/data/us_cvalues_topo2ras_masked.tif.aux.xml", type = FILE, id = "tifxml_file")

@Resource(from = soils.db.DBResources.class)
@Resource(from = DBResources.class)
public class V2_1 extends ModelDataService {

  private final static String USE_IRRIGATION_ADJUSTMENT = "has_irrigation";

  @Override
  protected Map<String, Object> getConfigInfo() {
    return new LinkedHashMap<String, Object>() {
      {
        put("soils.gis.database.source", resources().getResolved("soils.gis.database.source"));
        put(SDM, resources().getResolved(SDM));
        put(R2GIS_SQLSVR, resources().getResolved(R2GIS_SQLSVR));
        put("cfactor_gis_raster_file", resources().getResolved(WWE_TIFF_FILE));
        put("fpp.version", "wepot 2.1");
      }
    };
  }

  @Override
  protected void doProcess() throws Exception {
    PayloadParameter params = parameter();

    try (SOILS_DATA soilsDb = SOILS_DB_Factory.createEngine(getClass(), LOG, Config.getString("soils.gis.database.source")); Connection gisDb = resources().getJDBC(EROSION_SQLSVR);) {
      soils.AoA.setMapUnitsRequired(false);
      WindWaterErosion.loadGisRaster(() -> resources().getFile(WWE_TIFF_FILE));

      WindWaterErosion aoaErosion = new WindWaterErosion(soilsDb, gisDb, getParamMap(), LOG);

      aoaErosion.getErosion(() -> resources().getJDBC(R2GIS_SQLSVR), params.getBoolean(USE_IRRIGATION_ADJUSTMENT, false)); //Will throw exception on failure

      aoaErosion.toJSON((String name, Object val, String descr, String unit) -> results().put(name, val, descr, unit));
    }
  }
}