org.pentaho.platform.repository2.unified.webservices.jaxws.SimpleRepositoryFileDataDto.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.platform.repository2.unified.webservices.jaxws.SimpleRepositoryFileDataDto.java

Source

/*
 * This program is free software; you can redistribute it and/or modify it under the
 * terms of the GNU General Public License, version 2 as published by the Free Software
 * Foundation.
 *
 * You should have received a copy of the GNU General Public License along with this
 * program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.html
 * or from the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * 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.
 *
 *
 * Copyright 2006 - 2013 Pentaho Corporation.  All rights reserved.
 */

package org.pentaho.platform.repository2.unified.webservices.jaxws;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.pentaho.platform.api.repository2.unified.data.simple.SimpleRepositoryFileData;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.xml.bind.annotation.XmlMimeType;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * This class exists for one purpose: to be able to apply the XmlMimeType annotation.
 * 
 * @author mlowery
 */
public class SimpleRepositoryFileDataDto {

    /**
     * There is no getter/setter for dataHandler because JAX-WS will complain about duplicate fields.
     */
    @XmlMimeType("application/octet-stream")
    DataHandler dataHandler;

    String encoding;

    String mimeType;

    /**
     * Converts SimpleRepositoryFileData to SimpleRepositoryFileDataDto. Does not use ByteArrayDataSource since that
     * implementation reads the entire stream into a byte array.
     */
    public static SimpleRepositoryFileDataDto convert(final SimpleRepositoryFileData simpleData) {
        FileOutputStream fout = null;
        boolean foutClosed = false;
        try {
            SimpleRepositoryFileDataDto simpleJaxWsData = new SimpleRepositoryFileDataDto();
            File tmpFile = File.createTempFile("pentaho-ws", null); //$NON-NLS-1$
            // TODO mlowery this might not delete files soon enough
            tmpFile.deleteOnExit();
            fout = FileUtils.openOutputStream(tmpFile);
            IOUtils.copy(simpleData.getStream(), fout);
            fout.close();
            foutClosed = true;
            simpleJaxWsData.dataHandler = new DataHandler(new FileDataSource(tmpFile));
            simpleJaxWsData.encoding = simpleData.getEncoding();
            simpleJaxWsData.mimeType = simpleData.getMimeType();
            return simpleJaxWsData;
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (fout != null && !foutClosed) {
                    fout.close();
                }
            } catch (Exception e) {
                // CHECKSTYLES IGNORE
            }
        }
    }

    /**
     * Converts SimpleRepositoryFileDataDto to SimpleRepositoryFileData.
     */
    public static SimpleRepositoryFileData convert(final SimpleRepositoryFileDataDto simpleJaxWsData) {
        FileOutputStream fout = null;
        InputStream in = null;
        DataHandler dh = null;
        boolean foutClosed = false;
        try {
            File tmpFile = File.createTempFile("pentaho", null); //$NON-NLS-1$
            // TODO mlowery this might not delete files soon enough
            tmpFile.deleteOnExit();
            fout = FileUtils.openOutputStream(tmpFile);
            // used to cast to com.sun.xml.ws.developer.StreamingDataHandler here but that stopped working
            dh = simpleJaxWsData.dataHandler;
            // used to call dh.readOnce() (instead of dh.getInputStream()) here
            in = dh.getInputStream();
            IOUtils.copy(in, fout);
            fout.close();
            foutClosed = true;
            InputStream fin = new BufferedInputStream(FileUtils.openInputStream(tmpFile));
            return new SimpleRepositoryFileData(fin, simpleJaxWsData.encoding, simpleJaxWsData.mimeType);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            try {
                // close the streams
                if (in != null) {
                    in.close();
                }
                // used to have to call dh.close() on the com.sun.xml.ws.developer.StreamingDataHandler here
                if (fout != null && !foutClosed) {
                    fout.close();
                }
            } catch (Exception e) {
                // CHECKSTYLES IGNORE
            }
        }
    }

    @SuppressWarnings("nls")
    @Override
    public String toString() {
        return "SimpleRepositoryFileDataDto [dataHandler=" + dataHandler + ", encoding=" + encoding + ", mimeType="
                + mimeType + "]";
    }

    public String getEncoding() {
        return encoding;
    }

    public void setEncoding(String encoding) {
        this.encoding = encoding;
    }

    public String getMimeType() {
        return mimeType;
    }

    public void setMimeType(String mimeType) {
        this.mimeType = mimeType;
    }

}