de.bund.bfr.knime.pmm.common.PmmTimeSeries.java Source code

Java tutorial

Introduction

Here is the source code for de.bund.bfr.knime.pmm.common.PmmTimeSeries.java

Source

/*******************************************************************************
 * 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.common;

import java.util.List;

import org.jdom2.Element;

import de.bund.bfr.knime.pmm.common.generictablemodel.KnimeTuple;
import de.bund.bfr.knime.pmm.common.math.MathUtilities;
import de.bund.bfr.knime.pmm.common.pmmtablemodel.AttributeUtilities;
import de.bund.bfr.knime.pmm.common.pmmtablemodel.TimeSeriesSchema;

public class PmmTimeSeries extends KnimeTuple implements PmmXmlElementConvertable {

    public static final String ELEMENT_TIMESERIES = "TimeSeries";
    //private static final String ELEMENT_TSTUPLE = "TimeSeriesTuple";
    private static final String ELEMENT_TSXML = "TimeSeriesXml";
    private static final String ELEMENT_MDINFO = "MdInfoXml";
    private static final String ELEMENT_LITMD = "LiteraturMD";
    private String warningMsg = null;
    private double mr;

    public PmmTimeSeries() throws PmmException {
        super(new TimeSeriesSchema());
        PmmXmlDoc mdInfo = new PmmXmlDoc();
        mdInfo.add(new MdInfoXml(null, null, null, null, null));

        setCondId(MathUtilities.getRandomNegativeInt());
        setMatrixId(MathUtilities.getRandomNegativeInt());
        setAgentId(MathUtilities.getRandomNegativeInt());
        setMdInfo(mdInfo);
    }

    public PmmTimeSeries(final int condId) throws PmmException {
        this();
        setCondId(condId);
    }

    public PmmTimeSeries(String combaseId) throws PmmException {
        this();
        setCombaseId(combaseId);
    }

    public PmmTimeSeries(int condId, String combaseId) throws PmmException {
        this(condId);
        setCombaseId(combaseId);
    }

    public PmmTimeSeries(KnimeTuple tuple) throws PmmException {
        super(tuple.getSchema());
        for (int i = 0; i < size(); i++) {
            setCell(i, tuple.getCell(i));
        }
    }

    public PmmTimeSeries(Element xmlElement) {
        super(new TimeSeriesSchema());
        try {
            if (xmlElement.getAttributeValue(TimeSeriesSchema.ATT_CONDID) != null)
                setCondId(Integer.parseInt(xmlElement.getAttributeValue(TimeSeriesSchema.ATT_CONDID)));
            if (xmlElement.getAttributeValue(TimeSeriesSchema.ATT_COMBASEID) != null)
                setCombaseId(xmlElement.getAttributeValue(TimeSeriesSchema.ATT_COMBASEID));
            if (xmlElement.getAttributeValue(TimeSeriesSchema.ATT_MATRIX) != null)
                setValue(TimeSeriesSchema.ATT_MATRIX,
                        new PmmXmlDoc(xmlElement.getAttributeValue(TimeSeriesSchema.ATT_MATRIX)));
            if (xmlElement.getAttributeValue(TimeSeriesSchema.ATT_AGENT) != null)
                setValue(TimeSeriesSchema.ATT_AGENT,
                        new PmmXmlDoc(xmlElement.getAttributeValue(TimeSeriesSchema.ATT_AGENT)));
            if (xmlElement.getAttributeValue(TimeSeriesSchema.ATT_MISC) != null)
                setValue(TimeSeriesSchema.ATT_MISC,
                        new PmmXmlDoc(xmlElement.getAttributeValue(TimeSeriesSchema.ATT_MISC)));
            for (Element el : xmlElement.getChildren()) {
                if (el.getName().equals(ELEMENT_TSXML)) {
                    if (el.getText() != null) {
                        PmmXmlDoc timeSeriesXmlDoc = new PmmXmlDoc(el.getText());
                        this.setValue(TimeSeriesSchema.ATT_TIMESERIES, timeSeriesXmlDoc);
                    }
                } else if (el.getName().equals(ELEMENT_MDINFO)) {
                    if (el.getText() != null) {
                        PmmXmlDoc mdInfoXmlDoc = new PmmXmlDoc(el.getText());
                        this.setValue(TimeSeriesSchema.ATT_MDINFO, mdInfoXmlDoc);
                    }
                } else if (el.getName().equals(ELEMENT_LITMD)) {
                    if (el.getText() != null) {
                        PmmXmlDoc litMdDoc = new PmmXmlDoc(el.getText());
                        this.setValue(TimeSeriesSchema.ATT_LITMD, litMdDoc);
                    }
                }
            }
            if (xmlElement.getAttributeValue(TimeSeriesSchema.ATT_DBUUID) != null)
                setValue(TimeSeriesSchema.ATT_DBUUID, xmlElement.getAttributeValue(TimeSeriesSchema.ATT_DBUUID));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public Element toXmlElement() {
        Element ret = new Element(ELEMENT_TIMESERIES);
        try {
            if (getCondId() != null) {
                ret.setAttribute(TimeSeriesSchema.ATT_CONDID, getCondId() + "");
            }
            if (getCombaseId() != null) {
                if (!getCombaseId().isEmpty()) {
                    ret.setAttribute(TimeSeriesSchema.ATT_COMBASEID, getCombaseId());
                }
            }
            if (hasMatrix()) {
                ret.setAttribute(TimeSeriesSchema.ATT_MATRIX, getMatrix().toXmlString());
            }
            if (hasAgent()) {
                ret.setAttribute(TimeSeriesSchema.ATT_AGENT, getAgent().toXmlString());
            }
            if (hasMisc()) {
                ret.setAttribute(TimeSeriesSchema.ATT_MISC, getMisc().toXmlString());
            }
            Element element = new Element(ELEMENT_TSXML);
            PmmXmlDoc timeSeriesXmlDoc = this.getPmmXml(TimeSeriesSchema.ATT_TIMESERIES);
            element.addContent(timeSeriesXmlDoc.toXmlString());
            ret.addContent(element);
            element = new Element(ELEMENT_MDINFO);
            PmmXmlDoc mdInfoXmlDoc = this.getPmmXml(TimeSeriesSchema.ATT_MDINFO);
            element.addContent(mdInfoXmlDoc.toXmlString());
            ret.addContent(element);
            element = new Element(ELEMENT_LITMD);
            PmmXmlDoc litMdDoc = this.getPmmXml(TimeSeriesSchema.ATT_LITMD);
            element.addContent(litMdDoc.toXmlString());
            ret.addContent(element);
            ret.setAttribute(TimeSeriesSchema.ATT_DBUUID,
                    XmlHelper.getNonNull(getString(TimeSeriesSchema.ATT_DBUUID)));
        } catch (PmmException ex) {
            ex.printStackTrace();
        }
        return ret;
    }

    public void add(String name, Double t, String tUnit, Double n, String nUnit) throws PmmException {
        TimeSeriesXml tsx = new TimeSeriesXml(name, t, tUnit, n, nUnit, null, null);
        PmmXmlDoc timeSeriesXmlDoc = this.getPmmXml(TimeSeriesSchema.ATT_TIMESERIES);
        timeSeriesXmlDoc.add(tsx);
        this.setValue(TimeSeriesSchema.ATT_TIMESERIES, timeSeriesXmlDoc);
        setValue(TimeSeriesSchema.ATT_TIMESERIES, timeSeriesXmlDoc);
    }

    public void add(Double t, String tUnit, Double n, String nUnit) throws PmmException {
        add("t" + System.currentTimeMillis(), t, tUnit, n, nUnit);
    }

    public void add(String t, String tUnit, String n, String nUnit) {
        try {
            add(Double.valueOf(t), tUnit, Double.valueOf(n), nUnit);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void setLiterature(PmmXmlDoc li) throws PmmException {
        setValue(TimeSeriesSchema.ATT_LITMD, li);
    }

    public void setMisc(PmmXmlDoc misc) throws PmmException {
        setValue(TimeSeriesSchema.ATT_MISC, misc);
    }

    public boolean isEmpty() throws PmmException {
        return isNull(TimeSeriesSchema.ATT_TIMESERIES); // TimeSeriesSchema.ATT_TIME
    }

    public String getDbuuid() throws PmmException {
        return getString(TimeSeriesSchema.ATT_DBUUID);
    }

    public Integer getCondId() throws PmmException {
        return getInt(TimeSeriesSchema.ATT_CONDID);
    }

    public String getCombaseId() throws PmmException {
        return getString(TimeSeriesSchema.ATT_COMBASEID);
    }

    public String getAgentName() throws PmmException {
        return (String) getAgentAttribute(false, true, false);
    }

    public String getMatrixName() throws PmmException {
        return (String) getMatrixAttribute(false, true, false);
    }

    private Object getMatrixAttribute(boolean id, boolean name, boolean detail) throws PmmException {
        PmmXmlDoc matrixXmlDoc = getMatrix();
        if (matrixXmlDoc == null)
            matrixXmlDoc = new PmmXmlDoc();
        MatrixXml mx = null;
        for (PmmXmlElementConvertable el : matrixXmlDoc.getElementSet()) {
            if (el instanceof MatrixXml) {
                mx = (MatrixXml) el;
                if (id)
                    return mx.getId();
                if (name)
                    return mx.getName();
                if (detail)
                    return mx.getDetail();
                break;
            }
        }
        return null;
    }

    private Object getAgentAttribute(boolean id, boolean name, boolean detail) throws PmmException {
        PmmXmlDoc agentXmlDoc = getAgent();
        if (agentXmlDoc == null)
            agentXmlDoc = new PmmXmlDoc();
        AgentXml ax = null;
        for (PmmXmlElementConvertable el : agentXmlDoc.getElementSet()) {
            if (el instanceof AgentXml) {
                ax = (AgentXml) el;
                if (id)
                    return ax.getId();
                if (name)
                    return ax.getName();
                if (detail)
                    return ax.getDetail();
                break;
            }
        }
        return null;
    }

    public Double getMiscValue(String attribute, Double defaultValue) throws PmmException {
        PmmXmlDoc miscXmlDoc = getMisc();
        if (miscXmlDoc != null) {
            MiscXml mx = null;
            for (PmmXmlElementConvertable el : miscXmlDoc.getElementSet()) {
                if (el instanceof MiscXml) {
                    mx = (MiscXml) el;
                    if (mx.getName().equalsIgnoreCase(attribute)) {
                        return mx.getValue();
                    }
                }
            }
        }
        return defaultValue;
    }

    private String getMiscUnit(String attribute, String defaultValue) throws PmmException {
        PmmXmlDoc miscXmlDoc = getMisc();
        if (miscXmlDoc != null) {
            MiscXml mx = null;
            for (PmmXmlElementConvertable el : miscXmlDoc.getElementSet()) {
                if (el instanceof MiscXml) {
                    mx = (MiscXml) el;
                    if (mx.getName().equalsIgnoreCase(attribute)) {
                        return mx.getUnit();
                    }
                }
            }
        }
        return defaultValue;
    }

    public Double getTemperature() throws PmmException {
        return getMiscValue(AttributeUtilities.ATT_TEMPERATURE, Double.NaN); // return Double.NaN; // getDouble( TimeSeriesSchema.ATT_TEMPERATURE )
    }

    public String getTemperatureUnit() throws PmmException {
        return getMiscUnit(AttributeUtilities.ATT_TEMPERATURE, "C"); // return Double.NaN; // getDouble( TimeSeriesSchema.ATT_TEMPERATURE )
    }

    public Double getPh() throws PmmException {
        return getMiscValue(AttributeUtilities.ATT_PH, Double.NaN);// return Double.NaN; // getDouble( TimeSeriesSchema.ATT_PH )
    }

    public Double getWaterActivity() throws PmmException {
        return getMiscValue(AttributeUtilities.ATT_AW, Double.NaN);// return Double.NaN; getDouble( TimeSeriesSchema.ATT_WATERACTIVITY )
    }

    public PmmXmlDoc getMisc() throws PmmException {
        return getPmmXml(TimeSeriesSchema.ATT_MISC);
    }

    public PmmXmlDoc getMatrix() throws PmmException {
        return getPmmXml(TimeSeriesSchema.ATT_MATRIX);
    }

    public PmmXmlDoc getAgent() throws PmmException {
        return getPmmXml(TimeSeriesSchema.ATT_AGENT);
    }

    public PmmXmlDoc getLiterature() throws PmmException {
        return getPmmXml(TimeSeriesSchema.ATT_LITMD);
    }

    public PmmXmlDoc getMdInfo() {
        PmmXmlDoc mdInfoXmlDoc = null;
        try {
            mdInfoXmlDoc = this.getPmmXml(TimeSeriesSchema.ATT_MDINFO);
        } catch (PmmException e) {
            e.printStackTrace();
        }
        return mdInfoXmlDoc;
    }

    public PmmXmlDoc getTimeSeries() {
        PmmXmlDoc timeSeriesXmlDoc = null;
        try {
            timeSeriesXmlDoc = this.getPmmXml(TimeSeriesSchema.ATT_TIMESERIES);
        } catch (PmmException e) {
            e.printStackTrace();
        }
        return timeSeriesXmlDoc;
    }

    public Integer getAgentId() throws PmmException {
        return (Integer) getAgentAttribute(true, false, false);
    }

    public Integer getMatrixId() throws PmmException {
        return (Integer) getMatrixAttribute(true, false, false);
    }

    public String getAgentDetail() throws PmmException {
        return (String) getAgentAttribute(false, false, true);
    }

    public String getMatrixDetail() throws PmmException {
        return (String) getMatrixAttribute(false, false, true);
    }

    public String getComment() throws PmmException {
        PmmXmlDoc mdInfoXmlDoc = getMdInfo();
        if (mdInfoXmlDoc != null) {
            MdInfoXml mdix = null;
            for (PmmXmlElementConvertable el : mdInfoXmlDoc.getElementSet()) {
                if (el instanceof MdInfoXml) {
                    mdix = (MdInfoXml) el;
                    return mdix.getComment();
                }
            }
        }
        return null;//getString( TimeSeriesSchema.ATT_COMMENT );
    }

    public Integer getQualityScore() throws PmmException {
        PmmXmlDoc mdInfoXmlDoc = getMdInfo();
        if (mdInfoXmlDoc != null) {
            MdInfoXml mdix = null;
            for (PmmXmlElementConvertable el : mdInfoXmlDoc.getElementSet()) {
                if (el instanceof MdInfoXml) {
                    mdix = (MdInfoXml) el;
                    return mdix.getQualityScore();
                }
            }
        }
        return null;//getString( TimeSeriesSchema.ATT_COMMENT );
    }

    public Boolean getChecked() throws PmmException {
        PmmXmlDoc mdInfoXmlDoc = getMdInfo();
        if (mdInfoXmlDoc != null) {
            MdInfoXml mdix = null;
            for (PmmXmlElementConvertable el : mdInfoXmlDoc.getElementSet()) {
                if (el instanceof MdInfoXml) {
                    mdix = (MdInfoXml) el;
                    return mdix.getChecked();
                }
            }
        }
        return null;//getString( TimeSeriesSchema.ATT_COMMENT );
    }

    public String getWarning() {
        return warningMsg;
    }

    public void setWarning(String warningMsg) {
        this.warningMsg = warningMsg;
    }

    public Double getMaximumRate() {
        return mr;
    }

    public boolean hasCombaseId() throws PmmException {
        return !isNull(TimeSeriesSchema.ATT_COMBASEID);
    }

    public boolean hasValue(String attribute, boolean defaultValue) throws PmmException {
        PmmXmlDoc miscXmlDoc = getMisc();
        if (miscXmlDoc != null) {
            MiscXml mx = null;
            for (PmmXmlElementConvertable el : miscXmlDoc.getElementSet()) {
                if (el instanceof MiscXml) {
                    mx = (MiscXml) el;
                    if (mx.getName().equalsIgnoreCase(attribute)) {
                        return true;
                    }
                }
            }
        }
        return defaultValue;
    }

    public boolean hasTemperature() throws PmmException {
        return hasValue(AttributeUtilities.ATT_TEMPERATURE, false); // !isNull( TimeSeriesSchema.ATT_TEMPERATURE )
    }

    public boolean hasPh() throws PmmException {
        return hasValue(AttributeUtilities.ATT_PH, false); // !isNull( TimeSeriesSchema.ATT_PH )
    }

    public boolean hasWaterActivity() throws PmmException {
        return hasValue(AttributeUtilities.ATT_AW, false); // !isNull( TimeSeriesSchema.ATT_WATERACTIVITY )
    }

    public boolean hasMisc() throws PmmException {
        return !isNull(TimeSeriesSchema.ATT_MISC);
    }

    public boolean hasMatrix() throws PmmException {
        return !isNull(TimeSeriesSchema.ATT_MATRIX);
    }

    public boolean hasAgent() throws PmmException {
        return !isNull(TimeSeriesSchema.ATT_AGENT);
    }

    /*
    public void setCondId( final Integer condId ) throws PmmException { 
       if (condId != null) {
     PmmXmlDoc mdInfoXmlDoc = getMdInfo();
     if (mdInfoXmlDoc == null) mdInfoXmlDoc = new PmmXmlDoc();
     MdInfoXml mdix = null;
      for (PmmXmlElementConvertable el : mdInfoXmlDoc.getElementSet()) {
         if (el instanceof MdInfoXml) {
            mdix = (MdInfoXml) el;
            mdix.setID(condId);
            break;
         }
      }
      if (mdix != null) {
         mdInfoXmlDoc = new PmmXmlDoc();
         mdInfoXmlDoc.add(mdix);          
         setValue(TimeSeriesSchema.ATT_MDINFO, mdInfoXmlDoc);                   
      }
       }
    }
    public Integer getCondId() throws PmmException {
       PmmXmlDoc mdInfoXmlDoc = getMdInfo();
       if (mdInfoXmlDoc != null) {
     MdInfoXml mdix = null;
      for (PmmXmlElementConvertable el : mdInfoXmlDoc.getElementSet()) {
         if (el instanceof MdInfoXml) {
            mdix = (MdInfoXml) el;
            return mdix.getID();
         }
      }
       }
       return null;//getString( TimeSeriesSchema.ATT_COMMENT );
    }
    */
    public void setCondId(final int condId) throws PmmException {
        setValue(TimeSeriesSchema.ATT_CONDID, condId);
    }

    public void setCombaseId(final String combaseId) throws PmmException {
        setValue(TimeSeriesSchema.ATT_COMBASEID, combaseId);
    }

    private void setAgentAttribute(Integer id, String name, String detail, String dbuuid) throws PmmException {
        PmmXmlDoc agentXmlDoc = getAgent();
        if (agentXmlDoc == null)
            agentXmlDoc = new PmmXmlDoc();
        AgentXml ax = null;
        for (PmmXmlElementConvertable el : agentXmlDoc.getElementSet()) {
            if (el instanceof AgentXml) {
                ax = (AgentXml) el;
                if (id != null)
                    ax.setId(id);
                if (name != null)
                    ax.setName(name);
                if (detail != null)
                    ax.setDetail(detail);
                if (dbuuid != null)
                    ax.setDbuuid(dbuuid);
                break;
            }
        }
        if (ax == null)
            ax = new AgentXml(id, name, detail);
        agentXmlDoc = new PmmXmlDoc();
        agentXmlDoc.add(ax);
        setValue(TimeSeriesSchema.ATT_AGENT, agentXmlDoc);
    }

    private void setMatrixAttribute(Integer id, String name, String detail, String dbuuid) throws PmmException {
        PmmXmlDoc matrixXmlDoc = getMatrix();
        if (matrixXmlDoc == null)
            matrixXmlDoc = new PmmXmlDoc();
        MatrixXml mx = null;
        for (PmmXmlElementConvertable el : matrixXmlDoc.getElementSet()) {
            if (el instanceof MatrixXml) {
                mx = (MatrixXml) el;
                if (id != null)
                    mx.setId(id);
                if (name != null)
                    mx.setName(name);
                if (detail != null)
                    mx.setDetail(detail);
                if (dbuuid != null)
                    mx.setDbuuid(dbuuid);
                break;
            }
        }
        if (mx == null)
            mx = new MatrixXml(id, name, detail);
        matrixXmlDoc = new PmmXmlDoc();
        matrixXmlDoc.add(mx);
        setValue(TimeSeriesSchema.ATT_MATRIX, matrixXmlDoc);
    }

    public void setAgentName(final String agentName) throws PmmException {
        setAgentAttribute(null, agentName, null, null);
    }

    public void setMatrixName(final String matrixName) throws PmmException {
        setMatrixAttribute(null, matrixName, null, null);
    }

    public void setAgentDetail(final String agentDetail) throws PmmException {
        setAgentAttribute(null, null, agentDetail, null);
    }

    public void setMatrixDetail(final String matrixDetail) throws PmmException {
        setMatrixAttribute(null, null, matrixDetail, null);
    }

    public void setAgentId(final Integer agentId) throws PmmException {
        setAgentAttribute(agentId, null, null, null);
    }

    public void setMatrixId(final Integer matrixId) throws PmmException {
        setMatrixAttribute(matrixId, null, null, null);
    }

    public void setMatrix(final int matrixId, final String matrixName, final String matrixDetail, String dbuuid)
            throws PmmException {
        setMatrixAttribute(matrixId, matrixName, matrixDetail, dbuuid);
    }

    public void setAgent(final int agentId, final String agentName, final String agentDetail, String dbuuid)
            throws PmmException {
        setAgentAttribute(agentId, agentName, agentDetail, dbuuid);
    }

    public void addMisc(int attrID, String attribute, String description, Double value, List<String> categories,
            String unit) throws PmmException {
        PmmXmlDoc miscXmlDoc = getMisc();
        if (miscXmlDoc == null)
            miscXmlDoc = new PmmXmlDoc();
        MiscXml mx = null;
        boolean paramFound = false;
        for (PmmXmlElementConvertable el : miscXmlDoc.getElementSet()) {
            if (el instanceof MiscXml) {
                mx = (MiscXml) el;
                if (mx.getName().equalsIgnoreCase(attribute)) {
                    paramFound = true;
                    break;
                }
            }
        }
        if (paramFound)
            miscXmlDoc.remove(mx);
        if (value != null && !value.isInfinite() && !value.isNaN()) {
            mx = new MiscXml(attrID, attribute, description, value, categories, unit);
            miscXmlDoc.add(mx);
        }
        setValue(TimeSeriesSchema.ATT_MISC, miscXmlDoc);
    }

    public void addMiscs(final PmmXmlDoc misc) throws PmmException {
        PmmXmlDoc miscXmlDoc = getMisc();
        if (miscXmlDoc == null) {
            setValue(TimeSeriesSchema.ATT_MISC, misc);
        } else {
            MiscXml mx = null;
            for (PmmXmlElementConvertable add1 : misc.getElementSet()) {
                if (add1 instanceof MiscXml) {
                    MiscXml mx2Add = (MiscXml) add1;
                    boolean paramFound = false;
                    for (PmmXmlElementConvertable el : miscXmlDoc.getElementSet()) {
                        if (el instanceof MiscXml) {
                            mx = (MiscXml) el;
                            if (mx.getName().equalsIgnoreCase(mx2Add.getName())) {
                                paramFound = true;
                                break;
                            }
                        }
                    }
                    if (paramFound)
                        miscXmlDoc.remove(mx);
                    miscXmlDoc.add(add1);
                }
            }
            setValue(TimeSeriesSchema.ATT_MISC, miscXmlDoc);
        }
    }

    public void setMdInfo(final PmmXmlDoc MdInfo) throws PmmException {
        setValue(TimeSeriesSchema.ATT_MDINFO, MdInfo);
    }

    public void setMdData(final PmmXmlDoc MdData) throws PmmException {
        setValue(TimeSeriesSchema.ATT_TIMESERIES, MdData);
    }

    public void setMaximumRate(final double mr) {
        this.mr = mr;
    }
}