/*
* This file is part of JGrasstools (http://www.jgrasstools.org)
* (C) HydroloGIS - www.hydrologis.com
*
* JGrasstools 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/>.
*/
package org.jgrasstools.gears.io.timedependent;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSTIMESERIESITERATORWRITER_AUTHORCONTACTS;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSTIMESERIESITERATORWRITER_AUTHORNAMES;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSTIMESERIESITERATORWRITER_DESCRIPTION;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSTIMESERIESITERATORWRITER_KEYWORDS;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSTIMESERIESITERATORWRITER_LABEL;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSTIMESERIESITERATORWRITER_LICENSE;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSTIMESERIESITERATORWRITER_NAME;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSTIMESERIESITERATORWRITER_STATUS;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSTIMESERIESITERATORWRITER_FILE_NOVALUE_DESCRIPTION;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSTIMESERIESITERATORWRITER_FILE_DESCRIPTION;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSTIMESERIESITERATORWRITER_IN_DATA_DESCRIPTION;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSTIMESERIESITERATORWRITER_IN_TABLENAME_DESCRIPTION;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSTIMESERIESITERATORWRITER_T_START_DESCRIPTION;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSTIMESERIESITERATORWRITER_T_TIMESTEP_DESCRIPTION;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import oms3.annotations.Author;
import oms3.annotations.Description;
import oms3.annotations.Execute;
import oms3.annotations.Finalize;
import oms3.annotations.In;
import oms3.annotations.Keywords;
import oms3.annotations.Label;
import oms3.annotations.License;
import oms3.annotations.Name;
import oms3.annotations.Status;
import oms3.annotations.UI;
import oms3.io.DataIO;
import oms3.io.MemoryTable;
import org.jgrasstools.gears.libs.modules.JGTConstants;
import org.jgrasstools.gears.libs.modules.JGTModel;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormatter;
@Description(OMSTIMESERIESITERATORWRITER_DESCRIPTION)
@Author(name = OMSTIMESERIESITERATORWRITER_AUTHORNAMES, contact = OMSTIMESERIESITERATORWRITER_AUTHORCONTACTS)
@Keywords(OMSTIMESERIESITERATORWRITER_KEYWORDS)
@Label(OMSTIMESERIESITERATORWRITER_LABEL)
@Name(OMSTIMESERIESITERATORWRITER_NAME)
@Status(OMSTIMESERIESITERATORWRITER_STATUS)
@License(OMSTIMESERIESITERATORWRITER_LICENSE)
public class OmsTimeSeriesIteratorWriter extends JGTModel {
@Description(OMSTIMESERIESITERATORWRITER_FILE_DESCRIPTION)
@UI(JGTConstants.FILEOUT_UI_HINT)
@In
public String file = null;
@Description(OMSTIMESERIESITERATORWRITER_IN_TABLENAME_DESCRIPTION)
@In
public String inTablename = "table";
@Description(OMSTIMESERIESITERATORWRITER_IN_DATA_DESCRIPTION)
@In
public HashMap<Integer, double[]> inData;
@Description(OMSTIMESERIESITERATORWRITER_T_START_DESCRIPTION)
@In
public String tStart;
@Description(OMSTIMESERIESITERATORWRITER_T_TIMESTEP_DESCRIPTION)
@In
public int tTimestep = -1;
@Description(OMSTIMESERIESITERATORWRITER_FILE_NOVALUE_DESCRIPTION)
@In
public String fileNovalue = "-9999.0";
private MemoryTable memoryTable;
private DateTimeFormatter formatter = JGTConstants.utcDateFormatterYYYYMMDDHHMM;
private String formatterPattern = JGTConstants.utcDateFormatterYYYYMMDDHHMM_string;
private DateTime runningDateTime;
private boolean columnNamesAreSet = false;
private void ensureOpen() throws IOException {
if (memoryTable == null) {
memoryTable = new MemoryTable();
memoryTable.setName(inTablename);
memoryTable.getInfo().put("Created", new DateTime().toString(formatter));
memoryTable.getInfo().put("Author", "HortonMachine library");
if (tStart != null && tTimestep != -1) {
// add time column
runningDateTime = formatter.parseDateTime(tStart);
}
}
}
@Execute
public void writeNextLine() throws IOException {
ensureOpen();
List<Integer> idsList = new ArrayList<Integer>();
List<String> columnNamesList = new ArrayList<String>();
List<Integer> uniqueIdsList = new ArrayList<Integer>();
if (!columnNamesAreSet) {
Set<Entry<Integer, double[]>> inDataSet = inData.entrySet();
for( Entry<Integer, double[]> inDataEntry : inDataSet ) {
Integer id = inDataEntry.getKey();
double[] values = inDataEntry.getValue();
if (values.length == 1) {
StringBuilder sb = new StringBuilder();
sb.append("value_");
sb.append(id);
columnNamesList.add(sb.toString());
idsList.add(id);
} else {
for( int i = 0; i < values.length; i++ ) {
StringBuilder sb = new StringBuilder();
sb.append("value_");
sb.append(id);
sb.append("_");
sb.append(i);
columnNamesList.add(sb.toString());
idsList.add(id);
}
}
}
for( Integer tmpId : idsList ) {
if (!uniqueIdsList.contains(tmpId)) {
uniqueIdsList.add(tmpId);
}
}
// column names
int index = 0;
if (runningDateTime != null) {
columnNamesList.add(0, "timestamp");
index = 1;
}
String[] columnNames = columnNamesList.toArray(new String[0]);
memoryTable.setColumns(columnNames);
// ids
index = 0;
if (runningDateTime != null) {
memoryTable.getColumnInfo(1).put("ID", "");
index = 1;
}
int k = 0;
for( Integer id : idsList ) {
memoryTable.getColumnInfo(k + 1 + index).put("ID", String.valueOf(id));
k++;
}
// data types
index = 0;
if (runningDateTime != null) {
memoryTable.getColumnInfo(1).put("Type", "Date");
index = 1;
}
for( int j = 0; j < idsList.size(); j++ ) {
memoryTable.getColumnInfo(j + 1 + index).put("Type", "Double");
}
// data formats
index = 0;
if (runningDateTime != null) {
memoryTable.getColumnInfo(1).put("Format", formatterPattern);
index = 1;
}
for( int j = 0; j < idsList.size(); j++ ) {
memoryTable.getColumnInfo(j + 1 + index).put("Format", "");
}
}
Object[] valuesRow = null;
int index = 0;
if (runningDateTime != null) {
valuesRow = new Object[columnNamesList.size()];
valuesRow[0] = runningDateTime.toString(formatter);
index = 1;
} else {
valuesRow = new Object[columnNamesList.size() - 1];
}
for( Integer id : uniqueIdsList ) {
double[] dataArray = inData.get(id);
for( double value : dataArray ) {
if (JGTConstants.isNovalue(value)) {
valuesRow[index++] = fileNovalue;
} else {
valuesRow[index++] = String.valueOf(value);
}
}
}
memoryTable.addRow(valuesRow);
if (runningDateTime != null) {
runningDateTime = runningDateTime.plusMinutes(tTimestep);
}
}
@Finalize
public void close() throws IOException {
DataIO.print(memoryTable, new PrintWriter(new File(file)));
}
}