SiLeBAT/FSK-Lab

View on GitHub
de.bund.bfr.knime.pmm.nodes/src/de/bund/bfr/knime/pmm/modelcatalogreader/ModelCatalogReaderNodeModel.java

Summary

Maintainability
F
4 days
Test Coverage
/*******************************************************************************
 * Copyright (c) 2015 Federal Institute for Risk Assessment (BfR), Germany
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Contributors:
 *     Department Biological Safety - BfR
 *******************************************************************************/
package de.bund.bfr.knime.pmm.modelcatalogreader;

import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;

import org.hsh.bfr.db.DBKernel;
import org.knime.core.data.DataTableSpec;
import org.knime.core.data.def.DefaultRow;
import org.knime.core.node.BufferedDataContainer;
import org.knime.core.node.BufferedDataTable;
import org.knime.core.node.CanceledExecutionException;
import org.knime.core.node.ExecutionContext;
import org.knime.core.node.ExecutionMonitor;
import org.knime.core.node.InvalidSettingsException;
import org.knime.core.node.NodeModel;
import org.knime.core.node.NodeSettingsRO;
import org.knime.core.node.NodeSettingsWO;

import de.bund.bfr.knime.pmm.bfrdbiface.lib.Bfrdb;
import de.bund.bfr.knime.pmm.common.CatalogModelXml;
import de.bund.bfr.knime.pmm.common.DbIo;
import de.bund.bfr.knime.pmm.common.DepXml;
import de.bund.bfr.knime.pmm.common.EstModelXml;
import de.bund.bfr.knime.pmm.common.PmmXmlDoc;
import de.bund.bfr.knime.pmm.common.generictablemodel.KnimeSchema;
import de.bund.bfr.knime.pmm.common.generictablemodel.KnimeTuple;
import de.bund.bfr.knime.pmm.common.pmmtablemodel.Model1Schema;
import de.bund.bfr.knime.pmm.common.pmmtablemodel.Model2Schema;
import de.bund.bfr.knime.pmm.common.ui.ModelReaderUi;

/**
 * This is the model implementation of ModelCatalogReader.
 * 
 * 
 * @author Jorgen Brandt
 */
public class ModelCatalogReaderNodeModel extends NodeModel {

    static final String PARAM_LEVEL = "level";
    static final String PARAM_MODELCLASS = "modelClass";
    static final String PARAM_MODELFILTERENABLED = "modelFilterEnabled";
    static final String PARAM_MODELLISTINT = "modelListInt";
    /*
     * static final String PARAM_FILENAME = "filename"; static final String
     * PARAM_LOGIN = "login"; static final String PARAM_PASSWD = "passwd";
     * static final String PARAM_OVERRIDE = "override";
     */
    /*
     * private String filename; private String login; private String passwd;
     * private boolean override;
     */
    private int level;
    private String modelClass;
    private int[] modelList;
    private boolean modelFilterEnabled;

    private Connection conn = null;

    /**
     * Constructor for the node model.
     */
    protected ModelCatalogReaderNodeModel() {
        super(0, 1);
        /*
         * filename = ""; login = ""; passwd = ""; override = false;
         */
        level = 1;
        modelList = null;
        modelFilterEnabled = false;

    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected BufferedDataTable[] execute(final BufferedDataTable[] inData, final ExecutionContext exec) throws Exception {

        ResultSet result;
        Bfrdb db;
        BufferedDataContainer buf;
        KnimeSchema schema;
        KnimeTuple tuple;
        String formula;
        String dbuuid;

        // fetch time series

        // fetch database connection
        db = null;
        try {
            db = new Bfrdb(DBKernel.getLocalConn(true));
        } catch (Exception e1) {
        }
        /*
         * if( override ) { db = new Bfrdb( filename, login, passwd ); conn =
         * db.getConnection(); } else { db = new
         * Bfrdb(DBKernel.getLocalConn(true)); conn = null; }
         */
        dbuuid = db.getDBUUID();

        String message = "";

        if (level == 1) {

            result = db.selectModel(1);

            schema = new Model1Schema();

            buf = exec.createDataContainer(schema.createSpec());

            int i = 0;
            while (result.next()) {
                int modelID = result.getInt(Bfrdb.ATT_MODELID);
                boolean takeIt = false;
                Object visible = DBKernel.getValue(db.getConnection(), "Modellkatalog", "ID", ""+modelID, "visible");
                if (visible == null || (visible instanceof Boolean && (Boolean) visible)) {
                    takeIt = modelClass == null || modelClass.equals("All");
                    if (!takeIt) {
                        Object cls = DBKernel.getValue(conn, "Modellkatalog", "ID", modelID + "", "Klasse");
                        String mcls = DBKernel.myDBi.getHashMap("ModelType").get(cls);
                        //takeIt = (modelClass.indexOf(mcls) >= 0);
                        takeIt = (mcls != null && mcls.indexOf(modelClass) >= 0);
                    }                    
                }
                if (takeIt) {
                    String addWarningMsg = "";
                    // initialize row
                    tuple = new KnimeTuple(schema);

                    // fill row
                    formula = result.getString("Formel");
                    if (formula != null) {
                        formula = formula.replaceAll("~", "=").replaceAll("\\s", "");
                    }

                    PmmXmlDoc cmDoc = new PmmXmlDoc();
                    CatalogModelXml cmx = new CatalogModelXml(result.getInt(Bfrdb.ATT_MODELID), result.getString(Bfrdb.ATT_NAME), formula, null, dbuuid);
                    cmx.modelClass = result.getInt("Klasse");
                    cmDoc.add(cmx);
                    tuple.setValue(Model1Schema.ATT_MODELCATALOG, cmDoc);

                    PmmXmlDoc depDoc = new PmmXmlDoc();
                    DepXml dx = new DepXml(result.getString(Bfrdb.ATT_DEP), result.getString("DepCategory"), result.getString("DepUnit"));
                    dx.description = result.getString("DepDescription");
                    depDoc.add(dx);
                    tuple.setValue(Model1Schema.ATT_DEPENDENT, depDoc);
                    if (dx.unit == null || dx.unit.isEmpty()) addWarningMsg += "\nUnit not defined for dependant variable '" + dx.name + "' in model with ID "
                            + cmx.id + "!";

                    PmmXmlDoc ixml = DbIo.convertArrays2IndepXmlDoc(null, result.getArray(Bfrdb.ATT_INDEP), null, null, result.getArray("IndepCategory"),
                            result.getArray("IndepUnit"), result.getArray("IndepDescription"), true);
                    tuple.setValue(Model1Schema.ATT_INDEPENDENT, ixml);
                    if (!ixml.getWarning().isEmpty()) addWarningMsg += "\n" + ixml.getWarning() + "in model with ID " + cmx.id + "!";

                    tuple.setValue(Model1Schema.ATT_PARAMETER, DbIo.convertArrays2ParamXmlDoc(null, result.getArray(Bfrdb.ATT_PARAMNAME), null, null,
                            result.getArray("ParCategory"), result.getArray("ParUnit"), null, result.getArray(Bfrdb.ATT_MINVALUE), result.getArray(Bfrdb.ATT_MAXVALUE),
                            result.getArray("ParamDescription"), result.getArray(Bfrdb.ATT_PARAMTYPE), null, null, null, null));

                    if (result.getString("DepUnit") == null || result.getString("DepUnit").isEmpty() || result.getString("IndepUnit") == null
                            || result.getString("IndepUnit").isEmpty()) {
                        message = "Unit assignment missing for one or more formula(s)";
                    }

                    //int ri = MathUtilities.getRandomNegativeInt();
                    PmmXmlDoc emDoc = new PmmXmlDoc();
                    EstModelXml emx = new EstModelXml(null, null, null, null, null, null, null, null);
                    emDoc.add(emx);
                    tuple.setValue(Model1Schema.ATT_ESTMODEL, emDoc);

                    String s = result.getString("LitMID");
                    if (s != null) {
                        tuple.setValue(Model1Schema.ATT_MLIT, db.getLiteratureXml(s, dbuuid));
                    }

                    tuple.setValue(Model1Schema.ATT_DATABASEWRITABLE, Model1Schema.WRITABLE);
                    tuple.setValue(Model1Schema.ATT_DBUUID, dbuuid);

                    // add row to data buffer
                    if (!modelFilterEnabled || ModelReaderUi.passesFilter(modelList, tuple, level)) {
                        buf.addRowToTable(new DefaultRow(String.valueOf(i++), tuple));
                        if (!addWarningMsg.isEmpty()) this.setWarningMessage(this.getWarningMessage() + addWarningMsg);
                    }
                }
            }
        } else {
            result = db.selectModel(2);

            schema = new Model2Schema();

            buf = exec.createDataContainer(schema.createSpec());

            int i = 0;
            while (result.next()) {
                int modelID = result.getInt(Bfrdb.ATT_MODELID);
                boolean takeIt = false;
                Object visible = DBKernel.getValue(db.getConnection(), "Modellkatalog", "ID", ""+modelID, "visible");
                if (visible == null || (visible instanceof Boolean && (Boolean) visible)) {
                    takeIt = modelClass == null || modelClass.equals("All");
                    if (!takeIt) {
                        Object cls = DBKernel.getValue(conn, "Modellkatalog", "ID", modelID + "", "Klasse");
                        String mcls = DBKernel.myDBi.getHashMap("ModelType").get(cls);
                        //takeIt = (modelClass.indexOf(mcls) >= 0);
                        takeIt = (mcls != null && mcls.indexOf(modelClass) >= 0);
                    }                    
                }
                if (takeIt) {
                    String addWarningMsg = "";
                    // initialize row
                    tuple = new KnimeTuple(schema);

                    // fill row
                    formula = result.getString("Formel");
                    if (formula != null) {
                        formula = formula.replaceAll("~", "=").replaceAll("\\s", "");
                    }

                    PmmXmlDoc cmDoc = new PmmXmlDoc();
                    CatalogModelXml cmx = new CatalogModelXml(result.getInt(Bfrdb.ATT_MODELID), result.getString(Bfrdb.ATT_NAME), formula, null, dbuuid);
                    cmx.modelClass = result.getInt("Klasse");
                    cmDoc.add(cmx);
                    tuple.setValue(Model2Schema.ATT_MODELCATALOG, cmDoc);

                    //tuple.setValue( Model2Schema.ATT_FORMULA, formula );
                    //tuple.setValue( Model2Schema.ATT_PARAMNAME, DbIo.convertArray2String(result.getArray( Bfrdb.ATT_PARAMNAME ) ));
                    //tuple.setValue( Model2Schema.ATT_DEPVAR, result.getString( Bfrdb.ATT_DEP ) );
                    PmmXmlDoc depDoc = new PmmXmlDoc();
                    DepXml dx = new DepXml(result.getString(Bfrdb.ATT_DEP), result.getString("DepCategory"), result.getString("DepUnit"));
                    dx.description = result.getString("DepDescription");
                    depDoc.add(dx);
                    tuple.setValue(Model2Schema.ATT_DEPENDENT, depDoc);
                    if (dx.unit == null || dx.unit.isEmpty()) addWarningMsg += "\nUnit not defined for dependant variable '" + dx.name + "' in model with ID "
                            + cmx.id + "!";
                    //tuple.setValue( Model2Schema.ATT_INDEPVAR, DbIo.convertArray2String(result.getArray( Bfrdb.ATT_INDEP ) ));
                    //tuple.setValue( Model2Schema.ATT_MODELNAME, result.getString( Bfrdb.ATT_NAME ) );
                    //tuple.setValue( Model2Schema.ATT_MODELID, result.getInt( Bfrdb.ATT_MODELID ) );
                    //tuple.setValue( Model2Schema.ATT_MINVALUE, DbIo.convertArray2String(result.getArray( Bfrdb.ATT_MINVALUE ) ));
                    //tuple.setValue( Model2Schema.ATT_MAXVALUE, DbIo.convertArray2String(result.getArray( Bfrdb.ATT_MAXVALUE ) ));
                    PmmXmlDoc ixml = DbIo.convertArrays2IndepXmlDoc(null, result.getArray(Bfrdb.ATT_INDEP), null, null, result.getArray("IndepCategory"),
                            result.getArray("IndepUnit"), result.getArray("IndepDescription"), false);
                    tuple.setValue(Model2Schema.ATT_INDEPENDENT, ixml);
                    if (!ixml.getWarning().isEmpty()) addWarningMsg += "\n" + ixml.getWarning() + "in model with ID " + cmx.id + "!";

                    tuple.setValue(Model2Schema.ATT_PARAMETER, DbIo.convertArrays2ParamXmlDoc(null, result.getArray(Bfrdb.ATT_PARAMNAME), null, null,
                            result.getArray("ParCategory"), result.getArray("ParUnit"), null, result.getArray(Bfrdb.ATT_MINVALUE), result.getArray(Bfrdb.ATT_MAXVALUE),
                            result.getArray("ParamDescription"), result.getArray(Bfrdb.ATT_PARAMTYPE), null, null, null, null));

                    //int ri = MathUtilities.getRandomNegativeInt();
                    PmmXmlDoc emDoc = new PmmXmlDoc();
                    EstModelXml emx = new EstModelXml(null, null, null, null, null, null, null, null);
                    emDoc.add(emx);
                    tuple.setValue(Model2Schema.ATT_ESTMODEL, emDoc);

                    tuple.setValue(Model2Schema.ATT_GLOBAL_MODEL_ID, null);

                    String s = result.getString("LitMID");
                    if (s != null) {
                        tuple.setValue(Model2Schema.ATT_MLIT, db.getLiteratureXml(s, dbuuid));
                    }

                    tuple.setValue(Model2Schema.ATT_DATABASEWRITABLE, Model1Schema.WRITABLE);
                    tuple.setValue(Model2Schema.ATT_DBUUID, dbuuid);

                    // add row to data buffer
                    if (!modelFilterEnabled || ModelReaderUi.passesFilter(modelList, tuple, level)) {
                        buf.addRowToTable(new DefaultRow(String.valueOf(i++), tuple));
                        if (!addWarningMsg.isEmpty()) this.setWarningMessage(this.getWarningMessage() + addWarningMsg);
                    }
                }

            }
        }

        // close data buffer
        buf.close();
        db.close();

        if (!message.isEmpty()) exec.setMessage(message);
        return new BufferedDataTable[] { buf.getTable() };
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected void reset() {
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected DataTableSpec[] configure(final DataTableSpec[] inSpecs) throws InvalidSettingsException {

        if (level == 1) {
            return new DataTableSpec[] { new Model1Schema().createSpec() };
        } else {
            return new DataTableSpec[] { new Model2Schema().createSpec() };
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected void saveSettingsTo(final NodeSettingsWO settings) {
        /*
         * settings.addString( PARAM_FILENAME, filename ); settings.addString(
         * PARAM_LOGIN, login ); settings.addString( PARAM_PASSWD, passwd );
         * settings.addBoolean( PARAM_OVERRIDE, override );
         */
        settings.addInt(PARAM_LEVEL, level);
        settings.addString(PARAM_MODELCLASS, modelClass);
        settings.addIntArray(PARAM_MODELLISTINT, modelList);
        settings.addBoolean(PARAM_MODELFILTERENABLED, modelFilterEnabled);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected void loadValidatedSettingsFrom(final NodeSettingsRO settings) throws InvalidSettingsException {
        /*
         * filename = settings.getString( PARAM_FILENAME ); login =
         * settings.getString( PARAM_LOGIN ); passwd = settings.getString(
         * PARAM_PASSWD ); override = settings.getBoolean( PARAM_OVERRIDE );
         */
        level = settings.getInt(PARAM_LEVEL);
        modelClass = settings.getString(PARAM_MODELCLASS);
        if (settings.containsKey(PARAM_MODELLISTINT)) modelList = settings.getIntArray(PARAM_MODELLISTINT);
        else if (settings.containsKey("modelList")) {
            String ids = settings.getString("modelList");
            if (ids != null && ids.length() > 0) {
                String[] token = ids.split(",");
                int[] idis = new int[token.length];
                int i=0;
                for (String s : token)  {
                    idis[i] = Integer.parseInt(s);
                    i++;
                }
                modelList = idis;
            }
        }
        modelFilterEnabled = settings.getBoolean(PARAM_MODELFILTERENABLED);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected void validateSettings(final NodeSettingsRO settings) throws InvalidSettingsException {

        int s;

        s = settings.getInt(PARAM_LEVEL);
        if (!(s == 1 || s == 2)) {
            throw new InvalidSettingsException("Parameter level must be " + "in {1,2}");
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected void loadInternals(final File internDir, final ExecutionMonitor exec) throws IOException, CanceledExecutionException {
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected void saveInternals(final File internDir, final ExecutionMonitor exec) throws IOException, CanceledExecutionException {
    }

}