eu.hydrologis.jgrass.utilitylinkables.OutputTableFileWriter.java Source code

Java tutorial

Introduction

Here is the source code for eu.hydrologis.jgrass.utilitylinkables.OutputTableFileWriter.java

Source

/*
 * JGrass - Free Open Source Java GIS http://www.jgrass.org 
 * (C) HydroloGIS - www.hydrologis.com 
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser 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 Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package eu.hydrologis.jgrass.utilitylinkables;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;

import nl.alterra.openmi.sdk.backbone.ValueSet;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.openmi.standard.IArgument;
import org.openmi.standard.IInputExchangeItem;
import org.openmi.standard.ILink;
import org.openmi.standard.IOutputExchangeItem;
import org.openmi.standard.ITime;
import org.openmi.standard.IValueSet;

import eu.hydrologis.libs.openmi.ModelsBackbone;
import eu.hydrologis.libs.openmi.ModelsConstants;
import eu.hydrologis.libs.utils.FluidUtils;

/**
 * @author Andrea Antonello - www.hydrologis.com
 * @author Erica Ghesla - erica.ghesla@ing.unitn.it
 */
public class OutputTableFileWriter extends ModelsBackbone {

    private ILink inputLink = null;

    private IInputExchangeItem tableFileInputEI = null;

    private static final String modelParameters = "...";

    private String filePath = null;

    private boolean doConsole = false;
    private boolean doUiTable = false;

    private String[] headerSplits;

    private int columns;

    public OutputTableFileWriter() {
        super();
        err = FluidUtils.newPrintStream(null, System.err);
        out = FluidUtils.newPrintStream(null, System.out);
    }

    public OutputTableFileWriter(PrintStream output, PrintStream error) {
        super();
        err = FluidUtils.newPrintStream(error, System.err);
        out = FluidUtils.newPrintStream(output, System.out);
    }

    public void safeInitialize(IArgument[] properties) {

        String grassDb = null;
        String location = null;
        String mapset = null;
        String tableString = null;
        int numCol = 1;
        for (IArgument argument : properties) {
            String key = argument.getKey();
            if (key.equals("otable")) {
                tableString = argument.getValue();
            }
            if (key.compareTo(ModelsConstants.GRASSDB) == 0) {
                grassDb = argument.getValue();
            }
            if (key.compareTo(ModelsConstants.LOCATION) == 0) {
                location = argument.getValue();
            }
            if (key.compareTo(ModelsConstants.MAPSET) == 0) {
                mapset = argument.getValue();
            }
        }
        headerSplits = tableString.split("#"); //$NON-NLS-1$
        if (tableString.matches(".*" + ModelsConstants.CONSOLE + ".*")) {
            doConsole = true;
        } else if (tableString.matches(".*" + ModelsConstants.UITABLE + ".*")) {
            doUiTable = true;
        } else {
            filePath = headerSplits[0];
        }

        componentId = "";
        componentDescr = "";

        tableFileInputEI = ModelsConstants.createDummyInputExchangeItem(this);

    }

    public IValueSet safeGetValues(ITime time, String linkID) {
        /*
         * trigger the linked model
         */
        IValueSet valueSet = inputLink.getSourceComponent().getValues(time, inputLink.getID());

        if (valueSet instanceof ValueSet) {

            ValueSet values = (ValueSet) valueSet;

            Object numObject = values.get(0);
            if (numObject instanceof Number) {
                Number number = (Number) numObject;
                columns = number.intValue();
            } else {
                columns = (int) Double.parseDouble((String) numObject);
            }

            int l = 1;
            final Object[][] dataToWrite = new Object[(values.getCount() - 1) / columns][columns];
            for (int i = 0; i < dataToWrite.length; i++) {
                for (int j = 0; j < dataToWrite[0].length; j++) {
                    dataToWrite[i][j] = values.get(l);
                    l++;
                }
            }

            try {
                if (doConsole) {
                    for (int i = 0; i < columns; i++) {
                        out.print(headerSplits[i] + " \t "); //$NON-NLS-1$
                    }
                    out.println();
                    for (int i = 0; i < dataToWrite.length; i++) {
                        for (int j = 0; j < dataToWrite[0].length; j++) {
                            out.print(String.valueOf(dataToWrite[i][j]) + "\t"); //$NON-NLS-1$
                        }
                        out.println();
                    }
                } else if (doUiTable) {

                    Display.getDefault().asyncExec(new Runnable() {
                        public void run() {
                            Shell shell2 = new Shell(Display.getDefault(), SWT.DIALOG_TRIM | SWT.RESIZE);
                            shell2.setSize(800, 600);
                            shell2.setLayout(new GridLayout(1, false));
                            final TableViewer v = new TableViewer(shell2);
                            v.setLabelProvider(new TableLabelProvider());
                            v.setContentProvider(new ArrayContentProvider());

                            Table table = v.getTable();
                            table.setLayoutData(new GridData(GridData.FILL_BOTH));
                            table.setHeaderVisible(true);
                            table.setLinesVisible(true);
                            TableLayout layout = new TableLayout();
                            for (int i = 0; i < columns; i++) {
                                layout.addColumnData(new ColumnWeightData(100 / columns, true));
                                TableColumn tmpHead = new TableColumn(table, SWT.LEFT);
                                tmpHead.setWidth(shell2.getSize().x / columns);
                                tmpHead.setText(headerSplits[i + 1]);
                            }
                            table.setLayout(layout);

                            v.setInput(dataToWrite);
                            v.getTable().setLinesVisible(true);
                            shell2.open();
                        }
                    });
                } else {
                    File f = new File(filePath);
                    if (f.getParentFile() == null || !f.getParentFile().exists()) {
                        throw new RuntimeException("The path to the output file doesn't exist: " + f.getParent());
                    }
                    BufferedWriter bW = new BufferedWriter(new FileWriter(filePath));
                    for (int i = 0; i < columns; i++) {
                        bW.write(headerSplits[i + 1] + " \t "); //$NON-NLS-1$
                    }
                    bW.write("\n"); //$NON-NLS-1$
                    for (int i = 0; i < dataToWrite.length; i++) {
                        for (int j = 0; j < dataToWrite[0].length; j++) {
                            bW.write(String.valueOf(dataToWrite[i][j]) + "\t"); //$NON-NLS-1$
                        }
                        bW.write("\n"); //$NON-NLS-1$
                    }
                    bW.close();
                }
            } catch (IOException e) {
                throw new RuntimeException("An error occurred in writing the output data.");
            }
        }
        return null;
    }

    public void addLink(ILink link) {
        inputLink = link;
    }

    public void finish() {
    }

    public IInputExchangeItem getInputExchangeItem(int inputExchangeItemIndex) {
        return tableFileInputEI;
    }

    public int getInputExchangeItemCount() {
        return 1;
    }

    public String getModelDescription() {
        return modelParameters;
    }

    public IOutputExchangeItem getOutputExchangeItem(int outputExchangeItemIndex) {
        return null;
    }

    public int getOutputExchangeItemCount() {
        return 0;
    }

    public void removeLink(String linkID) {

    }

    private class MyContentProvider implements IStructuredContentProvider {

        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
         */
        public Object[] getElements(Object inputElement) {
            return new Object[] { inputElement };
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
         */
        public void dispose() {

        }

        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
         *      java.lang.Object, java.lang.Object)
         */
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {

        }

    }

    private class TableLabelProvider implements ITableLabelProvider {

        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }

        public String getColumnText(Object element, int columnIndex) {
            Object[] e = (Object[]) element;
            return String.valueOf(e[columnIndex]);
        }

        public void addListener(ILabelProviderListener listener) {
        }

        public void dispose() {
        }

        public boolean isLabelProperty(Object element, String property) {
            return false;
        }

        public void removeListener(ILabelProviderListener listener) {
        }

    }
}