V1_0.java [src/java/m/ann/normalize] Revision: default  Date:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package m.ann.normalize;

import csip.Config;
import utils.MongoAccess;
import csip.ModelDataService;
import csip.ModelDataServiceCall;
import csip.ServiceException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.ws.rs.Path;
import oms3.annotations.Description;
import oms3.annotations.Name;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.hyperledger.fabric.gateway.ContractException;
import utils.blockchain.application.java.FeNS_blockchain;

/**
 * Normalize
 *
 * @author od, sidereus
 */
@Name("Normalize the raw data")
@Description("Normalize all raw data.")
@Path("m/normalize/1.0")
public class V1_0 extends ModelDataService {

  protected Map<String, JSONObject> payload;
  protected String ann;
  protected Boolean blockchain;


  @Override
  public void preProcess() throws ServiceException, JSONException, ContractException {
    if (parameter().getNames().contains("normalize")) {
      JSONArray train = parameter().getJSONArray("normalize");
      payload = new LinkedHashMap();
      for (int i = 0; i < train.length(); i++) {
        JSONObject obj = train.getJSONObject(i);
        String name = obj.getString("name");
        payload.put(name, obj);
      }
      ann = payload.get("annName").getString("value");
      blockchain = payload.get("blockchain").getBoolean("value");
    } else {
      ann = parameter().getString("annName");
      blockchain = parameter().getBoolean("blockchain", false);
    }

    if (blockchain) {
      FeNS_blockchain.getAssets();
    }
  }


  /**
   * Normalize data collected in raw collection of input database
   *
   * @throws ServiceException
   */
  @Override
  public void doProcess() throws ServiceException, ContractException {
    MongoAccess.normalize(ann);
    if (blockchain) {
      FeNS_blockchain.submit("FeNS_normalize", MongoAccess.getCollectionHash(ann, "normalized"));
      FeNS_blockchain.getAssets();
    }
    results().put("status", "ok");
  }


  @Override
  public void postProcess() throws ServiceException, JSONException, Exception {
    if (parameter().getNames().contains("normalize")) {
      ModelDataServiceCall mdsc = new ModelDataServiceCall()
          .put("train", getCollection("train"))
          .put("select", getCollection("select"))
          .url(Config.getString("ann.train_ensemble.url",
              request().getCodebase() + "m/train_ensemble/1.0"))
          .call();

      if (!mdsc.serviceFinished()) {
        throw new ServiceException("FeNS-trainEnsemble service error: " + mdsc.getError());
      }

    }
  }


  private Collection getCollection(String subPayload) throws ServiceException, JSONException {
    JSONArray n = parameter().getJSONArray(subPayload);
    List<JSONObject> nl = new ArrayList<>();
    for (int i = 0; i < n.length(); i++) {
      nl.add(n.getJSONObject(i));
    }
    return nl;
  }


  // make sure the db connection is closed at the end.
  public static void onContextDestroy() {
    MongoAccess.closeMongo();
    System.out.println("Closed ANN Mongo.");
  }

}