001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019 package org.apache.commons.compress.compressors;
020
021 import java.io.IOException;
022 import java.io.InputStream;
023 import java.io.OutputStream;
024
025 import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
026 import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;
027 import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
028 import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
029
030 /**
031 * <p>Factory to create Compressor[In|Out]putStreams from names. To add other
032 * implementations you should extend CompressorStreamFactory and override the
033 * appropriate methods (and call their implementation from super of course).</p>
034 *
035 * Example (Compressing a file):
036 *
037 * <pre>
038 * final OutputStream out = new FileOutputStream(output);
039 * CompressorOutputStream cos =
040 * new CompressorStreamFactory().createCompressorOutputStream("bzip2", out);
041 * IOUtils.copy(new FileInputStream(input), cos);
042 * cos.close();
043 * </pre>
044 *
045 * Example (Compressing a file):
046 * <pre>
047 * final InputStream is = new FileInputStream(input);
048 * CompressorInputStream in =
049 * new CompressorStreamFactory().createCompressorInputStream("bzip2", is);
050 * IOUtils.copy(in, new FileOutputStream(output));
051 * in.close();
052 * </pre>
053 *
054 * @Immutable
055 */
056 public class CompressorStreamFactory {
057
058 /**
059 * Create a compressor input stream from a compressor name and an input stream.
060 *
061 * @param name of the compressor, i.e. "gz" or "bzip2"
062 * @param in the input stream
063 * @return compressor input stream
064 * @throws CompressorException if the compressor name is not known
065 * @throws IllegalArgumentException if the name or input stream is null
066 */
067 public CompressorInputStream createCompressorInputStream(final String name,
068 final InputStream in) throws CompressorException {
069 if (name == null || in == null) {
070 throw new IllegalArgumentException(
071 "Compressor name and stream must not be null.");
072 }
073
074 try {
075 if ("gz".equalsIgnoreCase(name)) {
076 return new GzipCompressorInputStream(in);
077 } else if ("bzip2".equalsIgnoreCase(name)) {
078 return new BZip2CompressorInputStream(in);
079 }
080 } catch (IOException e) {
081 throw new CompressorException(
082 "Could not create CompressorInputStream", e);
083 }
084 throw new CompressorException("Compressor: " + name + " not found.");
085 }
086
087 /**
088 * Create an compressor output stream from an compressor name and an input stream.
089 *
090 * @param name the compressor name, i.e. "gz" or "bzip2"
091 * @param out the output stream
092 * @return the compressor output stream
093 * @throws CompressorException if the archiver name is not known
094 * @throws IllegalArgumentException if the archiver name or stream is null
095 */
096 public CompressorOutputStream createCompressorOutputStream(
097 final String name, final OutputStream out)
098 throws CompressorException {
099 if (name == null || out == null) {
100 throw new IllegalArgumentException(
101 "Compressor name and stream must not be null.");
102 }
103
104 try {
105 if ("gz".equalsIgnoreCase(name)) {
106 return new GzipCompressorOutputStream(out);
107 } else if ("bzip2".equalsIgnoreCase(name)) {
108 return new BZip2CompressorOutputStream(out);
109 }
110 } catch (IOException e) {
111 throw new CompressorException(
112 "Could not create CompressorOutputStream", e);
113 }
114 throw new CompressorException("Compressor: " + name + " not found.");
115 }
116 }