V2_0.java [src/java/d/crlmod/residue] Revision:   Date:
/*
 * $Id: 1.0+69 V2_0.java 68122e0cd0dd 2023-02-02 casesp $
 *
 * This file is part of the Cloud Services Integration Platform (CSIP),
 * a Model-as-a-Service framework, API, and application suite.
 *
 * 2012-2024, 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.crlmod.residue;

import crlmod.LMODData;
import crlmod.ServiceResources;
import static crlmod.ServiceResources.*;
import crlmod.nodes.Residue;
import crlmod.utils.Utils;
import csip.ModelDataService;
import csip.api.server.ServiceException;
import csip.annotations.*;
import static csip.annotations.State.RELEASED;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.ws.rs.Path;

/**
 *
 * @author Lucas Yaege
 */
@Name("residue")
@Description("Residue service for the CRLMOD_2018 Database.  Results from this service are returned in the rotation v1 format.")
@VersionInfo("2.0")
@State(RELEASED)
@Path("d/residue/2.0")
@Resource(from = ServiceResources.class)
public class V2_0 extends ModelDataService {
//TODO: Refactor for residues.

  LMODData lmodData = new LMODData();

  private final String OBJECT_PREFIX = "res";
  private final String OBJECT_NAME = "Residue";
  private boolean nativeFormats = false;
  private boolean namesOnly = false;

  @Override
  protected void doProcess() throws Exception {
    //does the user want just names?
    namesOnly = parameter().getBoolean(KEY_NAMESONLY, false);
    //does the user want param_sets, or just base data?
    nativeFormats = parameter().getBoolean(KEY_NATIVEFORMATS, false);
    getResidues();
  }

  @Override
  protected void postProcess() throws Exception {
    if (namesOnly) {
      for (Residue res : lmodData.residues) {
        res.id = null;
      }
    }
    results().put("lmod", lmodData.getJson());
  }

  private void getResidues() throws Exception {
    List<String> params = new ArrayList<>();
    String query = "SELECT res_id, res_name, res_group1, res_group2, res_group3, res_group4, res_group5,"
        + "weps_res_param_set, wepp_res_param_set\n"
        + "FROM residues \n"
        + "     LEFT JOIN weps_residues on (fk_weps_res_id = weps_res_id)\n"
        + "     LEFT JOIN wepp_residues on (fk_wepp_res_id = wepp_res_id)\n";

    query += Utils.createWhere(params, OBJECT_PREFIX, OBJECT_NAME, parameter(), LOG);

    String countQuery = "SELECT Count(*) AS 'Count' \n"
        + "FROM residues \n";
    countQuery += Utils.createWhere(new ArrayList<String>(), OBJECT_PREFIX, OBJECT_NAME, parameter(), LOG);

    try (Connection connection = resources().getJDBC(getJDBCId())) {
      try (Statement statement = connection.createStatement()) {
        try (ResultSet resultSet = statement.executeQuery(countQuery)) {
          resultSet.next();
          lmodData.residueCount = resultSet.getInt("Count");
        }
        query += Utils.createOffsetAndLimits(params, parameter(), LOG, OBJECT_NAME, OBJECT_PREFIX);

        try (ResultSet resultSet = statement.executeQuery(query)) {
          if (!resultSet.next()) {
            String errors = "No residues found with ";
            for (int i = 0; i < params.size(); i++) {
              errors += params.get(i);
              if (i < params.size() - 1) {
                errors += "and ";
              }
            }
            throw new ServiceException(errors);
          }
          do {
            BigDecimal res_id = resultSet.getBigDecimal("res_id");
            String res_name = resultSet.getString("res_name");
            String res_group1 = resultSet.getString("res_group1");
            String res_group2 = resultSet.getString("res_group2");
            String res_group3 = resultSet.getString("res_group3");
            String res_group4 = resultSet.getString("res_group4");
            String res_group5 = resultSet.getString("res_group5");

            String weps_param_set = resultSet.getString("weps_res_param_set");
            String wepp_param_set = resultSet.getString("wepp_res_param_set");

            if (weps_param_set == null)
              weps_param_set = "No Matching WEPS data is available at this time";

            if (wepp_param_set == null)
              wepp_param_set = "No Matching WEPP data is available at this time";

            weps_param_set = filterXML(weps_param_set);
            wepp_param_set = filterXML(wepp_param_set);

            Residue res = new Residue();
            res.id = res_id.toBigInteger();
            res.name = res_name;
            res.resGroup1 = res_group1;
            res.resGroup2 = res_group2;
            res.resGroup3 = res_group3;
            res.resGroup4 = res_group4;
            res.resGroup5 = res_group5;

            if (nativeFormats) {
              res.wepsResParamSet = weps_param_set;
              res.weppResParamSet = wepp_param_set;
            }
            lmodData.addResidue(res);
          } while (resultSet.next());
        }
        statement.clearBatch();
      }
    }
  }

  /**
   * This filter was required in order to attempt to fix non UTF-8 encoded XML
   * data provided by ARS.
   *
   * @param value
   * @return
   */
  protected String filterXML(String value) {
    return value.replaceAll("\n", "").replaceAll("\t", "");
  }

  protected String getJDBCId() {
    return CR_LMOD_2018_ID;
  }

  @Override
  protected Map<String, Object> getConfigInfo() {
    return new LinkedHashMap<String, Object>() {
      {
        put(getJDBCId(), resources().getResolved(getJDBCId()));
      }
    };
  }
}