Java tutorial
/* * 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; } }