MMSParameterAdapter.java [src/java/ngmf/ui/mms] Revision:   Date:
/*
 * $Id$
 * 
 * This file is part of the Object Modeling System (OMS),
 * 2007-2012, Olaf David and others, Colorado State University.
 *
 * OMS is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, version 2.1.
 *
 * OMS is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with OMS.  If not, see <http://www.gnu.org/licenses/lgpl.txt>.
 */
package ngmf.ui.mms;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.TreeMap;

/**
 * MMS parameter adapter.
 */
public class MMSParameterAdapter {

  /**
   * Creates a new instance of MMSParameterAdapter
   */
  public MMSParameterAdapter() {
  }

  public static class MmsParamInfo {

    String description;
    String version;
    Properties omsParams;
    Properties meta = new Properties();


    public void store(OutputStream out) throws IOException {
      PrintStream p = new PrintStream(out);
      TreeMap tm = new TreeMap(omsParams);

      int maxlen = -1;
      for (Iterator it = tm.keySet().iterator(); it.hasNext();) {
        String elem = (String) it.next();
        maxlen = Math.max(elem.length(), maxlen);
      }
      p.println("@S, Parameter");
      p.println(" Descr, \"" + description + "\"");
      p.println(" Version, \"" + version + "\"");
      p.println(" CreatedAt, \"" + new Date() + "\"");
      for (Iterator it = tm.keySet().iterator(); it.hasNext();) {
        String elem = (String) it.next();
        p.println("@P, " + format(elem, maxlen) + "\"" + tm.get(elem) + "\"");
        p.println(meta.get(elem) == null ? "" : meta.get(elem));
      }
      p.close();
    }


    private String format(String inp, int fillLength) {
      StringBuilder b = new StringBuilder();
      for (int i = 0; i < fillLength - inp.length(); i++) {
        b.append(' ');
      }
      return inp + "," + b.toString();
    }
  }


  public static MmsParamInfo map(File mmsParamFile) throws IOException {
    MmsParamInfo info = new MmsParamInfo();
    info.omsParams = new Properties();

    MmsParamsReader mmsReader = new MmsParamsReader(mmsParamFile.toString());
    ParameterSet ps = mmsReader.read();

    info.description = ps.getDescription();
    info.version = ps.getVersion();

    Map m = ps.getDims();
    for (Iterator i = m.values().iterator(); i.hasNext();) {
      Dimension param = (Dimension) i.next();
      info.omsParams.put(param.getName(), Integer.toString(param.getSize()));
      info.meta.put(param.getName(), " role, dimension");
    }

    m = ps.getParams();
    for (Iterator i = m.values().iterator(); i.hasNext();) {
      Parameter param = (Parameter) i.next();
      Object val = param.getVals();
      StringBuilder b = new StringBuilder();
      if (!param.getDimension(0).getName().equals("one")) {
        b.append("{");
      }
      if (val.getClass() == int[].class) {
        int v[] = (int[]) val;
        if (param.getNumDim() == 2) {
          Dimension d1 = param.getDimension(0);
          Dimension d2 = param.getDimension(1);
          info.meta.put(param.getName(), " bound, \"" + d2.getName() + ", " + d1.getName() + "\"");

          int idx = 0;
          if (d1.getSize() * d2.getSize() == 0) {
            b.append("{ }");
          } else {
            for (int j = 0; j < d2.getSize(); j++) {
              b.append("{");
              for (int j1 = 0; j1 < d1.getSize(); j1++) {
                b.append(v[idx++] + (j1 < d1.getSize() - 1 ? ", " : ""));
              }
              b.append("}" + (j < d2.getSize() - 1 ? ", " : ""));
            }
          }
        } else {
          if (!param.getDimension(0).getName().equals("one")) {
            for (int j = 0; j < v.length; j++) {
              b.append(v[j] + (j < v.length - 1 ? ", " : ""));
            }
            info.meta.put(param.getName(), " bound, " + param.getDimension(0).getName());
          } else {
            b.append(v[0]);
          }
        }
      } else if (val.getClass() == double[].class) {
        double v[] = (double[]) val;
        if (param.getNumDim() == 2) {
//                    System.out.println(param.getName() + " " + param.getSize() + " " + param.getWidth() + " " + param.getNumDim() + " "
//                            + param.getType() + " " + param.getDimension(0) + " " + param.getDimension(1));
          Dimension d1 = param.getDimension(0);
          Dimension d2 = param.getDimension(1);
          info.meta.put(param.getName(), " bound, \"" + d2.getName() + ", " + d1.getName() + "\"");
//                    System.out.println("    d1: " + d1.getSize());
//                    System.out.println("    d2: " + d2.getSize());
          int idx = 0;
          if (d1.getSize() * d2.getSize() == 0) {
            b.append("{ }");
          } else {
            for (int j = 0; j < d2.getSize(); j++) {
              b.append("{");
              for (int j1 = 0; j1 < d1.getSize(); j1++) {
                b.append(v[idx++] + (j1 < d1.getSize() - 1 ? ", " : ""));
              }
              b.append("}" + (j < d2.getSize() - 1 ? ", " : ""));
            }
          }
        } else {
          if (!param.getDimension(0).getName().equals("one")) {
            for (int j = 0; j < v.length; j++) {
              b.append(v[j] + (j < v.length - 1 ? ", " : ""));
            }
            info.meta.put(param.getName(), " bound, " + param.getDimension(0).getName());
          } else {
            b.append(v[0]);
          }
        }
      }
      if (!param.getDimension(0).getName().equals("one")) {
        b.append("}");
      }
//            System.out.println(param.getName() + " " + param.getNumDim() + " " + param.getSize());
      String result;

      // HACK, snarea_curve is a 1D array in MMS but a 2D array in OMS.
      // it is being used as 2D array in both systems.
      if (param.getName().equals("snarea_curve")) {
//        result = "{" + b.toString() + "}";
        result = b.toString();
      } else {
        result = b.toString();
      }

      info.omsParams.put(param.getName(), result);
    }
    return info;
  }


  public static void main(String args[]) throws Exception {
    MmsParamInfo info = map(new File("c:/omswork/prms/data/efcarson.params"));
    info.omsParams.store(new FileOutputStream(new File("c:/omswork/prms/data/efcarson1.pps")),
        info.description + " (" + info.version + ")");
  }
}