All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.openstreetmap.osmosis.xml.common.CompressionActivator Maven / Gradle / Ivy

// This software is released into the Public Domain.  See copying.txt for details.
package org.openstreetmap.osmosis.xml.common;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.GZIPOutputStream;

import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;

import org.openstreetmap.osmosis.core.OsmosisRuntimeException;
import org.openstreetmap.osmosis.core.util.MultiMemberGZIPInputStream;


/**
 * A utility class for layering compression streams on top of underlying byte
 * streams based upon a specified compression algorithm.
 * 
 * @author Brett Henderson
 */
public class CompressionActivator {
	
	private CompressionMethod compressionMethod;
	
	
	/**
	 * Creates a new instance.
	 * 
	 * @param compressionMethod
	 *            The compression method to employ.
	 */
	public CompressionActivator(CompressionMethod compressionMethod) {
		this.compressionMethod = compressionMethod;
	}
	
	
	/**
	 * Wraps a compression stream around the destination stream based upon the
	 * requested compression method. If this method returns successfully, the
	 * input destination stream does not require closing after use because it
	 * will be closed when the returned output stream is closed.
	 * 
	 * @param destinationStream
	 *            The destination stream for receiving compressed data.
	 * @return A stream for writing compressed data to the destination stream.
	 */
	public OutputStream createCompressionOutputStream(OutputStream destinationStream) {
		try {
			if (CompressionMethod.None.equals(compressionMethod)) {
				return destinationStream;
			}
			
			if (CompressionMethod.GZip.equals(compressionMethod)) {
				return new GZIPOutputStream(destinationStream);
			}
			
			if (CompressionMethod.BZip2.equals(compressionMethod)) {
				return new BZip2CompressorOutputStream(destinationStream);
			}
			
			throw new OsmosisRuntimeException("Compression method " + compressionMethod + " is not recognized.");
			
		} catch (IOException e) {
			throw new OsmosisRuntimeException(
					"Unable to instantiate a " + compressionMethod + " compression stream.", e);
		}
	}
	
	
	/**
	 * Wraps a compression stream around the source stream based upon the
	 * requested compression method. If this method returns successfully, the
	 * input source stream does not require closing after use because it will be
	 * closed when the returned input stream is closed.
	 * 
	 * @param sourceStream
	 *            The source stream for providing compressed data.
	 * @return A stream for writing compressed data to the destination stream.
	 */
	public InputStream createCompressionInputStream(InputStream sourceStream) {
		try {
			if (CompressionMethod.None.equals(compressionMethod)) {
				return sourceStream;
			}
			
			if (CompressionMethod.GZip.equals(compressionMethod)) {
				return new MultiMemberGZIPInputStream(sourceStream);
			}
			
			if (CompressionMethod.BZip2.equals(compressionMethod)) {
				return new BZip2CompressorInputStream(sourceStream);
			}
			
			throw new OsmosisRuntimeException("Compression method " + compressionMethod + " is not recognized.");
			
		} catch (IOException e) {
			throw new OsmosisRuntimeException(
					"Unable to instantiate a " + compressionMethod + " compression stream.", e);
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy