/*
* Copyright 2012
* Ubiquitous Knowledge Processing (UKP) Lab
* Technische Universität Darmstadt
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.tudarmstadt.ukp.dkpro.core.api.resources;
import static org.apache.commons.io.FileUtils.forceMkdir;
import static de.tudarmstadt.ukp.dkpro.core.api.resources.CompressionMethod.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;
import org.apache.commons.compress.compressors.xz.XZCompressorInputStream;
import org.apache.commons.compress.compressors.xz.XZCompressorOutputStream;
/**
* Utility methods for dealing with compressed data.
*
*/
public class CompressionUtils
{
public static String stripCompressionExtension(String aLocation)
{
String lcLocation = aLocation.toLowerCase();
if (lcLocation.endsWith(GZIP.getExtension())) {
return aLocation.substring(0, GZIP.getExtension().length());
}
else if (lcLocation.endsWith(BZIP2.getExtension()) || lcLocation.endsWith(".bzip2")) {
return aLocation.substring(0, BZIP2.getExtension().length());
}
else if (lcLocation.endsWith(".bzip2")) {
return aLocation.substring(0, ".bzip2".length());
}
else if (lcLocation.endsWith(XZ.getExtension())) {
return aLocation.substring(0, XZ.getExtension().length());
}
else {
return aLocation;
}
}
/**
* Get an uncompressed input stream for a given input stream created for a particular location.
*
* @param aLocation
* a resource location (e.g. a path, URL, etc.)
* @param aStream
* a raw stream of potentially compressed data.
* @return stream wrapped with a decompressing stream.
* @throws IOException if an I/O error has occurred,
*/
public static InputStream getInputStream(String aLocation, InputStream aStream)
throws IOException
{
String lcLocation = aLocation.toLowerCase();
if (lcLocation.endsWith(GZIP.getExtension())) {
return new GZIPInputStream(aStream);
}
else if (lcLocation.endsWith(BZIP2.getExtension()) || lcLocation.endsWith(".bzip2")) {
return new BZip2CompressorInputStream(aStream);
}
else if (lcLocation.endsWith(XZ.getExtension())) {
return new XZCompressorInputStream(aStream);
}
else {
return aStream;
}
}
/**
* Make sure the target directory exists and get a stream writing to the specified file within.
* If the file name ends with a typical extension for compressed files, the stream will be
* compressed.
*
* @param aFile
* the target file.
* @return a stream to write to.
* @throws IOException if an I/O error has occurred,
* @see CompressionMethod
*/
public static OutputStream getOutputStream(File aFile)
throws IOException
{
// Create parent folders for output file and set up stream
if (aFile.getParentFile() != null) {
forceMkdir(aFile.getParentFile());
}
String lcFilename = aFile.getName().toLowerCase();
OutputStream os = new FileOutputStream(aFile);
if (lcFilename.endsWith(GZIP.getExtension())) {
os = new GZIPOutputStream(os);
}
else if (lcFilename.endsWith(BZIP2.getExtension()) || lcFilename.endsWith(".bzip2")) {
os = new BZip2CompressorOutputStream(os);
}
else if (lcFilename.endsWith(XZ.getExtension())) {
os = new XZCompressorOutputStream(os);
}
return os;
}
}