net.openchrom.msd.converter.supplier.excel.io.ChromatogramWriter.java Source code

Java tutorial

Introduction

Here is the source code for net.openchrom.msd.converter.supplier.excel.io.ChromatogramWriter.java

Source

/*******************************************************************************
 * Copyright (c) 2011, 2015 Philip (eselmeister) Wenig.
 * 
 * All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 * Philip (eselmeister) Wenig - initial API and implementation
 *******************************************************************************/
package net.openchrom.msd.converter.supplier.excel.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.eclipse.chemclipse.converter.exceptions.FileIsNotWriteableException;
import org.eclipse.chemclipse.converter.io.AbstractChromatogramWriter;
import org.eclipse.chemclipse.logging.core.Logger;
import org.eclipse.chemclipse.model.exceptions.ChromatogramIsNullException;
import org.eclipse.chemclipse.msd.converter.io.IChromatogramMSDWriter;
import org.eclipse.chemclipse.msd.model.core.IChromatogramMSD;
import org.eclipse.chemclipse.msd.model.xic.ExtractedIonSignalExtractor;
import org.eclipse.chemclipse.msd.model.xic.IExtractedIonSignal;
import org.eclipse.chemclipse.msd.model.xic.IExtractedIonSignalExtractor;
import org.eclipse.chemclipse.msd.model.xic.IExtractedIonSignals;
import org.eclipse.core.runtime.IProgressMonitor;

import net.openchrom.msd.converter.supplier.excel.internal.io.SpreadsheetWriter;
import net.openchrom.msd.converter.supplier.excel.internal.support.PathHelper;

public class ChromatogramWriter extends AbstractChromatogramWriter implements IChromatogramMSDWriter {

    private static final Logger logger = Logger.getLogger(ChromatogramWriter.class);
    public static final String RT_MILLISECONDS_COLUMN = "RT(milliseconds)";
    public static final String RT_MINUTES_COLUMN = "RT(minutes)";
    public static final String RI_COLUMN = "RI";
    private static final String XML_ENCODING = "UTF-8";
    private static final String ABUNDANCE_STYLE = "abundance";

    public ChromatogramWriter() {

    }

    @Override
    public void writeChromatogram(File file, IChromatogramMSD chromatogram, IProgressMonitor monitor)
            throws FileNotFoundException, FileIsNotWriteableException, IOException {

        XSSFWorkbook excelWorkbook = new XSSFWorkbook();
        XSSFSheet excelSheet = excelWorkbook.createSheet(chromatogram.getName());
        Map<String, XSSFCellStyle> styles = createStyles(excelWorkbook);
        String excelSheetReferenceName = excelSheet.getPackagePart().getPartName().getName();
        /*
         * Excel Template
         */
        File excelTemplate = new File(PathHelper.getStoragePath() + File.separator + "exceltemplace.xlsx");
        FileOutputStream outputStream = new FileOutputStream(excelTemplate);
        excelWorkbook.write(outputStream);
        outputStream.close();
        /*
         * Temporary XML file
         */
        File xmlDataFile = new File(PathHelper.getStoragePath() + File.separator + "datafile.xml");
        Writer writer = new OutputStreamWriter(new FileOutputStream(xmlDataFile), XML_ENCODING);
        try {
            writeChromatogram(writer, styles, chromatogram, monitor);
        } catch (Exception e) {
            throw new IOException("There has something gone wrong writing the temporary data file.");
        }
        writer.close();
        /*
         * Merge the template and the data file.
         */
        FileOutputStream resultOutputStream = new FileOutputStream(file);
        mergeTemplateAndData(excelTemplate, xmlDataFile, excelSheetReferenceName.substring(1), resultOutputStream);
        resultOutputStream.close();
        /*
         * Delete the temporary files.
         */
        excelTemplate.delete();
        xmlDataFile.delete();
    }

    private Map<String, XSSFCellStyle> createStyles(XSSFWorkbook excelWorkbook) {

        Map<String, XSSFCellStyle> styles = new HashMap<String, XSSFCellStyle>();
        XSSFDataFormat dataFormat = excelWorkbook.createDataFormat();
        /*
         * Abundance values
         */
        XSSFCellStyle style1 = excelWorkbook.createCellStyle();
        style1.setAlignment(XSSFCellStyle.ALIGN_CENTER);
        style1.setDataFormat(dataFormat.getFormat("0.000"));
        styles.put(ABUNDANCE_STYLE, style1);
        /*
         * Styles to use.
         */
        return styles;
    }

    private void writeChromatogram(Writer writer, Map<String, XSSFCellStyle> styles, IChromatogramMSD chromatogram,
            IProgressMonitor monitor) throws IOException {

        SpreadsheetWriter spreadsheetWriter = new SpreadsheetWriter(writer, XML_ENCODING);
        spreadsheetWriter.beginSheet();
        /*
         * Chromatographic data.
         */
        try {
            IExtractedIonSignalExtractor extractedIonSignalExtractor = new ExtractedIonSignalExtractor(
                    chromatogram);
            IExtractedIonSignals extractedIonSignals = extractedIonSignalExtractor.getExtractedIonSignals();
            int startIon = extractedIonSignals.getStartIon();
            int stopIon = extractedIonSignals.getStopIon();
            /*
             * Header and Scans
             */
            int rownumber = writeHeader(spreadsheetWriter, 0, startIon, stopIon, monitor);
            writeScans(extractedIonSignals, spreadsheetWriter, styles, rownumber, startIon, stopIon, monitor);
        } catch (ChromatogramIsNullException e) {
            logger.warn(e);
        }
        /*
         * End of sheet.
         */
        spreadsheetWriter.endSheet();
    }

    private int writeHeader(SpreadsheetWriter spreadsheetWriter, int rowNumber, int startIon, int stopIon,
            IProgressMonitor monitor) throws IOException {

        monitor.subTask("Write Header");
        int columnNumber = 0;
        spreadsheetWriter.insertRow(rowNumber++);
        spreadsheetWriter.createCell(columnNumber++, RT_MILLISECONDS_COLUMN);
        spreadsheetWriter.createCell(columnNumber++, RT_MINUTES_COLUMN);
        spreadsheetWriter.createCell(columnNumber++, RI_COLUMN);
        for (int ion = startIon; ion <= stopIon; ion++) {
            spreadsheetWriter.createCell(columnNumber++, ion);
        }
        spreadsheetWriter.endRow();
        return rowNumber;
    }

    private void writeScans(IExtractedIonSignals extractedIonSignals, SpreadsheetWriter spreadsheetWriter,
            Map<String, XSSFCellStyle> styles, int rowNumber, int startIon, int stopIon, IProgressMonitor monitor)
            throws IOException {

        int styleAbundance = styles.get(ABUNDANCE_STYLE).getIndex();
        /*
         * Scans
         */
        for (IExtractedIonSignal extractedIonSignal : extractedIonSignals.getExtractedIonSignals()) {
            /*
             * RT (milliseconds)
             * RT (minutes)
             * RI
             */
            monitor.subTask("Write Scan " + rowNumber);
            int columnNumber = 0;
            spreadsheetWriter.insertRow(rowNumber++);
            int milliseconds = extractedIonSignal.getRetentionTime();
            spreadsheetWriter.createCell(columnNumber++, milliseconds);
            spreadsheetWriter.createCell(columnNumber++, milliseconds / IChromatogramMSD.MINUTE_CORRELATION_FACTOR);
            spreadsheetWriter.createCell(columnNumber++, extractedIonSignal.getRetentionIndex());
            /*
             * ion data
             */
            for (int ion = startIon; ion <= stopIon; ion++) {
                spreadsheetWriter.createCell(columnNumber++, extractedIonSignal.getAbundance(ion), styleAbundance);
            }
            spreadsheetWriter.endRow();
        }
    }

    private void mergeTemplateAndData(File excelTemplate, File xmlDataFile, String excelSheetReferenceName,
            OutputStream outputStream) throws IOException {

        InputStream inputStream;
        ZipFile zipFile = new ZipFile(excelTemplate);
        ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);
        @SuppressWarnings("unchecked")
        Enumeration<ZipEntry> zipEntries = (Enumeration<ZipEntry>) zipFile.entries();
        /*
         * Copy all non data file elements to the output stream.
         */
        while (zipEntries.hasMoreElements()) {
            ZipEntry zipEntry = zipEntries.nextElement();
            if (!zipEntry.getName().equals(excelSheetReferenceName)) {
                zipOutputStream.putNextEntry(new ZipEntry(zipEntry.getName()));
                inputStream = zipFile.getInputStream(zipEntry);
                copyDataStream(inputStream, zipOutputStream);
                inputStream.close();
            }
        }
        /*
         * Copy the data file to the output stream.
         */
        zipOutputStream.putNextEntry(new ZipEntry(excelSheetReferenceName));
        inputStream = new FileInputStream(xmlDataFile);
        copyDataStream(inputStream, zipOutputStream);
        inputStream.close();
        zipOutputStream.close();
        zipFile.close();
    }

    private void copyDataStream(InputStream inputStream, OutputStream outputStream) throws IOException {

        byte[] chunk = new byte[1024];
        int count;
        while ((count = inputStream.read(chunk)) >= 0) {
            outputStream.write(chunk, 0, count);
        }
    }
}