V1_0.java [src/java/m/crp/wepsmetadata] 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-2019, 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 m.crp.wepsmetadata;

import data.archives.MongoArchive;
import data.archives.ServiceArchive;
import csip.Config;
import csip.ModelDataService;
import csip.PayloadParameter;
import csip.PayloadResults;
import csip.ServiceException;
import java.util.ArrayList;
import java.util.logging.Level;
import javax.ws.rs.Path;
import data.models.ModelArchive;
import data.models.WEPSMetaData;
import data.models.WEPSModelArchive;
import csip.annotations.Description;
import csip.annotations.Name;

/**
 *
 * @author <a href="mailto:shaun.case@colostate.edu">Shaun Case</a>
 */
@Name("WEPSMetaData")
@Description("Extracts Metadata from WEPS model runs into sets of meta-model parameters")
@Path("m/wepsmetadata/1.0")
public class V1_0 extends ModelDataService {

    protected static String dbLocation = Config.getString("weps.archive.mongodb.uri", "mongodb://csip.engr.colostate.edu:8095/8083_iet_csip-weps");
    protected String suid = "";
    protected ServiceArchive mongoArchive;
    protected ModelArchive model;

    @Override
    public void preProcess() throws Exception {
        PayloadParameter params = this.parameter();
        ArrayList<ModelArchive> results = null;

        if (params.has("suid")) {
            suid = params.getString("suid");
        } else {
            throw new ServiceException("Service requires an input suid value");
        }
        if ( params.has("weps_archive_mongodb")){
          dbLocation = params.getString("weps_archive_mongodb");
        }

        if (dbLocation.contains("mongodb://")) {
            mongoArchive = new MongoArchive(dbLocation);
        } else {
            throw new ServiceException("No valid mongodb archive location was specified.  The location, " + dbLocation + ", specified, was not amongodb location.");// mongoArchive = new FileArchive(dbLocation);
        }

        ArrayList<ModelArchive> tArchive = mongoArchive.getArchivesByFilter("_id", suid, 1);

        if (tArchive.isEmpty()) {
            throw new ServiceException("Could not find a WEPS model in the archive for that suid and mongodb location.");
        }

        model = tArchive.get(0);

        if (((WEPSModelArchive)model).badModelRun()) {
            throw new ServiceException("Found a WEPS model in the archive, however the model was invalid: " + ((WEPSModelArchive)model).badModelMessage());
        }
    }

    @Override
    public void doProcess() throws ServiceException {
        ((WEPSModelArchive)model).calcWEPSMetaData();

        try {
            mongoArchive.shutdown();
        } catch (Exception ex) {
            LOG.log(Level.SEVERE, "Could not shutdown mongo archive at: " + dbLocation, ex);
        }
    }

    @Override
    public void postProcess() throws Exception {
        PayloadResults results = results();
        WEPSMetaData wepsMetaData = ((WEPSModelArchive)model).getWEPSMetaData();
        if (null != wepsMetaData) {
          results.put("meta_model_data", wepsMetaData.toJSON());
        }else{
          throw new ServiceException("No meta data was returned from the WEPSMetaData() function.");
        }
        
    }
}