ToPRMS_V1.java [src/java/m/prms/conv] Revision: 165da58a8724d08c41749b1fe4b7229568dbefc5  Date: Wed Jun 19 17:13:49 MDT 2019
package m.prms.conv;

import csip.ModelDataService;
import csip.ServiceException;
import csip.annotations.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.util.List;
import javax.ws.rs.Path;
import oms3.Conversions;
import oms3.io.CSProperties;
import oms3.io.CSTable;
import oms3.io.DataIO;

/**
 * PRMS/OMS Resource conversion.
 *
 * @author od
 */
@Name("PRMS")
@Description("Parameter Converter OMS -> MMS")
@State(State.UNSTABLE)
@Author(org = "USGS")
@Author(org = "CSU")
@Category("Hydrology")
@Path("m/oms_to_mms/params/convert/1.0")
public class ToPRMS_V1 extends ModelDataService {

  static final String FILE = "file";


  @Override
  protected void doProcess() throws Exception {
    File f = formdata().getFile(FILE);
    String name = f.getName();
    if (name.endsWith(".csv")) {
      File result = new File(f.getParentFile(), name.substring(0, name.indexOf('.')) + ".param");
      CSProperties p = readParameter(f);
      writeParamFile(p, result);
      results().put(result);
    } else {
      throw new ServiceException("Error: cannot convert: " + f);
    }
  }


  static String getParameterType(String p) {
    try {
      Integer.parseInt(p);
      return "1";
    } catch (NumberFormatException E) {
      try {
        Double.parseDouble(p);
        return "2";
      } catch (NumberFormatException E1) {
        return "4";
      }
    }
  }


  static void writeParamFile(CSProperties p, File result) throws FileNotFoundException, ParseException {
    PrintWriter w = new PrintWriter(result);
    List<String> keys1D = DataIO.keysByMeta(p, "role", "dimension");
    w.println("Generated by csip-prms");
    w.println("Version: 1.7");
    // write dimensions
    w.println("** Dimensions **");
    for (String k : keys1D) {
      w.println("####");
      w.println(k);
      w.println(p.get(k));
    }
    // write parameter
    w.println("** Parameter **");

    // scalars
    List<String> scalars = DataIO.keysByNotMeta(p, "bound");
    for (String s : scalars) {
      w.println("####");
      w.println(s);
      w.println("1");
      w.println("one");
      w.println("1");
      String o = p.get(s).toString();
      w.println(getParameterType(o));
      w.println(o);
    }

    // 1D parameter
    for (String s : p.keySet()) {
      if (DataIO.isBound(p, s, 1)) {
        w.println("####");
        String[] d = s.split("\\$");
        w.println(d[1]);
        w.println("1");
        w.println(d[0]);
        w.println(p.get(d[0]));
        System.out.println("1dim : " + s + " " + d[0] + "'" + d[1]);
        System.out.println("  " + p.get(s));

        String[] d1 = Conversions.convert(p.get(s), String[].class);

        w.println(getParameterType(d1[0]));

        for (String elem : d1) {
          w.println(elem.trim());
        }
        System.out.println(d1);
      }
    }

    // 2D parameter
    for (String s : p.keySet()) {
      if (DataIO.isBound(p, s, 2)) {
        String m = p.getInfo(s).get("bound");
        w.println("####");
        w.println(s);
        w.println("2");
        String[] dims = m.split(",");

        final int rows = DataIO.getInt(p, dims[0].trim());
        final int cols = DataIO.getInt(p, dims[1].trim());

        w.println(dims[0].trim());
        w.println(dims[1].trim());
        w.println(rows * cols);

        String[][] d = Conversions.convert(p.get(s), String[][].class);
        w.println(getParameterType(d[0][0]));
        for (String[] row : d) {
          for (String col : row) {
            w.println(col.trim());
          }
        }

        System.out.println("2dim : " + s);
      }
    }
    w.close();
  }


  static CSProperties readParameter(File file) throws IOException {
    CSProperties p = DataIO.properties();
    if (DataIO.propertyExists("Parameter", file)) {
      // original properties.                    
      p.putAll(DataIO.properties(new FileReader(file), "Parameter"));
    }
    // check for tables in the file.
    List<String> tables = DataIO.tables(file);
    if (!tables.isEmpty()) {
      for (String name : tables) {
        CSTable t = DataIO.table(file, name);
        // convert them to Properties.
        CSProperties prop = DataIO.toProperties(t);
        //prop.().put("file", f);
        p.putAll(prop);
      }
    }
    return p;
  }


  public static void main(String[] args) throws IOException, ParseException {

    String b = "/od/oms/oms_examples/oms3.prj.prms/data/mixed_params.csv";
    String b1 = "/tmp/mixed_params.param";

    CSProperties p = readParameter(new File(b));
    writeParamFile(p, new File(b1));
  }

}