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