/*******************************************************************************
* Copyright (c) 2016 Weasis Team and others.
* 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:
* Nicolas Roduit - initial API and implementation
*******************************************************************************/
package org.weasis.core.api.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class GzipManager {
private static final Logger LOGGER = LoggerFactory.getLogger(GzipManager.class);
private static final String ERROR_CTX = "Cannot gzip uncompress"; //$NON-NLS-1$
private GzipManager() {
}
public static boolean gzipCompress(InputStream in, String gzipFilename) {
try (FileOutputStream out = new FileOutputStream(gzipFilename)) {
return gzipCompress(in, out);
} catch (IOException e) {
LOGGER.error("Cannot gzip compress", e); //$NON-NLS-1$
return false;
} finally {
FileUtil.safeClose(in);
}
}
private static boolean gzipCompress(InputStream in, OutputStream out) throws IOException {
try (GZIPOutputStream gzipOut = new GZIPOutputStream(out)) {
byte[] buf = new byte[1024];
int offset;
while ((offset = in.read(buf)) > 0) {
gzipOut.write(buf, 0, offset);
}
// Finishes writing compressed data
gzipOut.finish();
return true;
} catch (IOException e) {
LOGGER.error("Cannot gzip compress", e); //$NON-NLS-1$
return false;
} finally {
FileUtil.safeClose(in);
}
}
private static boolean gzipUncompress(InputStream inputStream, OutputStream out) throws IOException {
try (GZIPInputStream in = new GZIPInputStream(inputStream)) {
byte[] buf = new byte[1024];
int offset;
while ((offset = in.read(buf)) > 0) {
out.write(buf, 0, offset);
}
return true;
}
}
public static boolean gzipUncompressToFile(File inputFile, File outFilename) {
try (FileInputStream inputStream = new FileInputStream(inputFile);
FileOutputStream outputStream = new FileOutputStream(outFilename)) {
return gzipUncompress(inputStream, outputStream);
} catch (IOException e) {
LOGGER.error(ERROR_CTX, e);
return false;
}
}
public static boolean gzipUncompressToFile(URL url, File outFilename) {
try (InputStream input = url.openStream(); FileOutputStream outputStream = new FileOutputStream(outFilename)) {
return gzipUncompress(input, outputStream);
} catch (IOException e) {
LOGGER.error(ERROR_CTX, e);
return false;
}
}
public static byte[] gzipUncompressToByte(byte[] bytes) throws IOException {
if (isGzip(bytes)) {
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);) {
gzipUncompress(inputStream, outputStream);
return outputStream.toByteArray();
}
} else {
return bytes;
}
}
public static byte[] gzipCompressToByte(byte[] bytes) throws IOException {
return gzipCompressToByte(bytes, 1);
}
/**
* @param bytes
* @param requiredByteNumber
* for applying gzip. On network the safe value is 1400 (as MTU is 1500)
* @return
* @throws IOException
*/
public static byte[] gzipCompressToByte(byte[] bytes, int requiredByteNumber) throws IOException {
if (bytes.length >= requiredByteNumber) {
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);) {
gzipCompress(inputStream, outputStream);
return outputStream.toByteArray();
}
}
return bytes;
}
public static boolean isGzip(byte[] bytes) {
// Check to see if it's gzip-compressed
// GZIP Magic Two-Byte Number: 0x8b1f (35615)
if (bytes != null && bytes.length >= 4) {
int head = (bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00);
if (GZIPInputStream.GZIP_MAGIC == head) {
return true;
}
}
return false;
}
public static boolean gzipUncompressToFile(byte[] bytes, File outFilename) {
try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes)) {
if (isGzip(bytes)) {
try (FileOutputStream outputStream = new FileOutputStream(outFilename)) {
return gzipUncompress(inputStream, outputStream);
}
}
return FileUtil.writeStream(inputStream, outFilename) == -1;
} catch (IOException e) {
LOGGER.error(ERROR_CTX, e);
return false;
}
}
}