V1_0.java [src/java/m/oms/ages] Revision: 1e0cabe499a17d302f600b9a7550e91f078e64b1  Date: Thu Feb 13 12:08:21 MST 2020
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package m.oms.ages;

import csip.Executable;
import csip.ModelDataService;
import csip.ServiceException;
import csip.annotations.*;
import static csip.annotations.ResourceType.*;
import csip.utils.Binaries;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ws.rs.Path;
import static m.oms.ages.V1_0.ID_AGES_JAR;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOCase;
import org.apache.commons.io.filefilter.WildcardFileFilter;
import org.apache.commons.lang.ArrayUtils;

/**
 * Ages service.
 *
 * @author od
 */
@Name("AGES model execution")
@Description("OMS based AGES model service")
@VersionInfo("1.0")
@Path("m/ages/1.0")
@Resource(file = "/bin/ages/ages.jar", type = JAR, id = ID_AGES_JAR)
@Resource(file = "/bin/ages/ages-lib.zip", type = ARCHIVE)
@Resource(file = "/bin/ages/ages-static.zip", type = ARCHIVE)
@Resource(file = "java-*-std*.txt output/csip_run/out/*.csv", type = OUTPUT)
@Resource(file = "${csip.dir}/bin/ages/simulation/ages.sim", type = REFERENCE, id = "ages.sim")
public class V1_0 extends ModelDataService {

  // parameter keys
  static final String KEY_SCRIPT = "ages.sim";
  static final String KEY_LOGLEVEL = "loglevel";
  static final String KEY_OPTIONS = "java.options";

  static final String ID_AGES_JAR = "ages.jar";

  static final String RUN_INC = "run.inc";


  @Override
  public void doProcess() throws Exception {
    String dsl = parameter().getString(KEY_SCRIPT, resources().getFile("ages.sim").toString());
    String loglevel = parameter().getString(KEY_LOGLEVEL, "INFO");
    String options = parameter().getString(KEY_OPTIONS, "");

    Map<String, String> run_param = new HashMap<>();
    run_param.put("startTime", "\"" + parameter().getString("startTime") + "\"");
    run_param.put("endTime", "\"" + parameter().getString("endTime") + "\"");

    createParamInclude(run_param);

    File d = new File(dsl);
    if (!(d.isAbsolute() && d.exists())) {
      d = getWorkspaceFile(dsl);
    }
    runAges(d, loglevel, options);
//    results().put(getWorkspaceFile("output"));
  }


  private void createParamInclude(Map<String, String> p) throws IOException {
    StringBuilder b = new StringBuilder();
    b.append("parameter {\n");
    p.keySet().forEach((name) -> {
      b.append("  ").append(name).append(" ").append(p.get(name)).append("\n");
    });
    b.append("}\n");
    FileUtils.writeStringToFile(getWorkspaceFile(RUN_INC), b.toString());
  }


  private void runAges(File dsl, String loglevel, String options) throws Exception {

    getWorkspaceFile("output").mkdirs();
    getWorkspaceFile("logs").mkdirs();

    // Create/execute a Ages.
    Executable p = createProcess(loglevel, dsl, options);
    int result = p.exec();
    if (result != 0) {
      FilenameFilter ff = new WildcardFileFilter("java*stderr.txt", IOCase.INSENSITIVE);
      File[] f = getWorkspaceDir().listFiles(ff);
      if (f != null && f.length > 0) {
        String err = FileUtils.readFileToString(f[0]);
        LOG.info("Ages execution error. " + f[0] + ":\n" + err);
        throw new ServiceException("Ages execution error. " + f[0] + ":\n" + err);
      }
      throw new ServiceException("Ages execution error." + result);
    }
  }


  private Executable createProcess(String loglevel, File dsl, String options) throws Exception {

    Map<String, String> sysprops = new HashMap();
    sysprops.put("oms_prj", getWorkspaceDir().toString());
    sysprops.put("csip_ages", resources().getFile(ID_AGES_JAR).getParent());

    String[] jvmOptions = Binaries.asSysProps(sysprops);
    if (options != null && !options.isEmpty()) {
      String[] opt = options.split("\\s+");
      jvmOptions = (String[]) ArrayUtils.addAll(jvmOptions, opt);
    }

    List<File> jars = Arrays.asList(resources().getFile(ID_AGES_JAR));
    // java -Doms_prj=. -cp "dist/AgES.jar" oms3.CLI -l OFF -r "projects/sfir30/simulation/sfir30.sim"
    return Binaries.getResourceOMSDSL(dsl,
        jvmOptions, getWorkspaceDir(), jars, loglevel, LOG);
  }
}