PayloadResultsImpl.java [src/csip] Revision:   Date:
/*
 * $Id$
 *
 * This file is part of the Cloud Services Integration Platform (CSIP),
 * a Model-as-a-Service framework, API and application suite.
 *
 * 2012-2022, Olaf David and others, 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 csip;

import csip.api.server.PayloadResults;
import static csip.Config.LOG;
import csip.utils.JSONUtils;
import csip.utils.ZipFiles;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONObject;

/**
 * Access to return payload results (and report data, same API).
 *
 * @author od
 */
class PayloadResultsImpl implements PayloadResults {

  /**
   * Functional Interface for Result and Report Data
   *
   * @param <T> The data structure to manage
   */
  @FunctionalInterface
  interface Redata<T> {

    T fetch();
  }

  Redata<Map<String, JSONObject>> rdata;
  Redata<Map<String, Map<String, Object>>> rmeta;
  Redata<List<File>> fresults;
  Redata<Map<File, String>> fdesc;


  PayloadResultsImpl(Redata<Map<String, JSONObject>> rd,
      Redata<Map<String, Map<String, Object>>> rm,
      Redata<List<File>> fres, Redata<Map<File, String>> fd) {
    this.rdata = rd;
    this.rmeta = rm;
    this.fresults = fres;
    this.fdesc = fd;
  }


  @Override
  public PayloadResultsImpl putMetaInfo(String name, String metaKey, Object metaValue) {
    Map<String, Object> meta = rmeta.fetch().get(name);
    if (meta == null) {
      meta = new LinkedHashMap<>();
      rmeta.fetch().put(name, meta);
    }
    meta.put(metaKey, metaValue);
    return this;
  }


  public PayloadResultsImpl put(String name, String val, String descr, String unit) {
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, val, unit, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, String val, String descr) {
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, val, null, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, String val) {
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, val, null, null));
    return this;
  }


  public PayloadResultsImpl put(String name, int val, String descr, String unit) {
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, val, unit, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, int val, String descr) {
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, val, null, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, int val) {
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, val, null, null));
    return this;
  }


  public PayloadResultsImpl put(String name, double val, String descr, String unit) {
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, val, unit, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, double val, String descr) {
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, val, null, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, double val) {
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, val, null, null));
    return this;
  }


  public PayloadResultsImpl put(String name, boolean val, String descr, String unit) {
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, val, unit, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, boolean val, String descr) {
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, val, null, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, boolean val) {
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, val, null, null));
    return this;
  }


  public PayloadResultsImpl put(String name, Object val, String descr, String unit) {
    if (val instanceof Collection<?>) {
      val = JSONUtils.toArray((Collection<?>) val);
    }
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, val, unit, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, Object val, String descr) {
    if (val instanceof Collection<?>) {
      val = JSONUtils.toArray((Collection<?>) val);
    }
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, val, null, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, Object val) {
    if (val instanceof Collection<?>) {
      val = JSONUtils.toArray((Collection<?>) val);
    }
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, val, null, null));
    return this;
  }


  public PayloadResultsImpl put(String name, boolean[] val, String descr, String unit) {
    JSONArray v = JSONUtils.toArray(val);
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, v, unit, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, boolean[] val, String descr) {
    JSONArray v = JSONUtils.toArray(val);
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, v, null, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, boolean[] val) {
    JSONArray v = JSONUtils.toArray(val);
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, v, null, null));
    return this;
  }


  public PayloadResultsImpl put(String name, double[] val, String descr, String unit) {
    JSONArray v = JSONUtils.toArray(val);
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, v, unit, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, double[] val, String descr) {
    JSONArray v = JSONUtils.toArray(val);
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, v, null, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, double[] val) {
    JSONArray v = JSONUtils.toArray(val);
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, v, null, null));
    return this;
  }


  public PayloadResultsImpl put(String name, int[] val, String descr, String unit) {
    JSONArray v = JSONUtils.toArray(val);
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, v, unit, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, int[] val, String descr) {
    JSONArray v = JSONUtils.toArray(val);
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, v, null, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, int[] val) {
    JSONArray v = JSONUtils.toArray(val);
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, v, null, null));
    return this;
  }


  public PayloadResultsImpl put(String name, long[] val, String descr, String unit) {
    JSONArray v = JSONUtils.toArray(val);
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, v, unit, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, long[] val, String descr) {
    JSONArray v = JSONUtils.toArray(val);
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, v, null, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, long[] val) {
    JSONArray v = JSONUtils.toArray(val);
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, v, null, null));
    return this;
  }


  public PayloadResultsImpl put(String name, String[] val, String descr, String unit) {
    JSONArray v = JSONUtils.toArray(val);
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, v, unit, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, String[] val, String descr) {
    JSONArray v = JSONUtils.toArray(val);
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, v, null, descr));
    return this;
  }


  public PayloadResultsImpl put(String name, String[] val) {
    JSONArray v = JSONUtils.toArray(val);
    rdata.fetch().put(name, JSONUtils.dataUnitDesc(name, v, null, null));
    return this;
  }


  public PayloadResultsImpl put(File file) {
    if (file == null || !file.exists() || !file.canRead()) {
      throw new IllegalArgumentException("Cannot acces File/Folder: " + file);
    }
    if (file.isDirectory()) {
      try {
        // can only add zipped folder as output.
        file = ZipFiles.zip(file);
      } catch (IOException ex) {
        LOG.log(Level.SEVERE, null, ex);
        return this;
      }
    }
    fresults.fetch().add(file);
    return this;
  }


  public PayloadResultsImpl put(File file, String descr) {
    put(file);
    fdesc.fetch().put(file, descr);
    return this;
  }


  public PayloadResultsImpl put(File... files) {
    for (File file : files) {
      put(file);
    }
    return this;
  }

}