/* * Copyright (C) 2014 Indeed Inc. * * 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 com.indeed.imhotep.archive.compression; import com.google.common.collect.ImmutableMap; import com.indeed.util.compress.CompressionCodec; import com.indeed.util.compress.CompressionInputStream; import com.indeed.util.compress.CompressionOutputStream; import com.indeed.util.compress.SnappyCodec; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Map; /** * @author jsgroth * * Note: Trying to use LZO compression will throw a NoClassDefFoundError if your downstream project does not have * an explicit dependency on hadoop-lzo and a RuntimeException if the native-lzo library cannot be loaded. */ public enum SquallArchiveCompressor { NONE("none") { @Override public CompressionInputStream newInputStream(InputStream is) throws IOException { return new NoCompressionInputStream(is); } @Override public CompressionOutputStream newOutputStream(OutputStream os) throws IOException { return new NoCompressionOutputStream(os); } }, GZIP("gzip") { @Override public CompressionInputStream newInputStream(InputStream is) throws IOException { return new GzipCompressionInputStream(is); } @Override public CompressionOutputStream newOutputStream(OutputStream os) throws IOException { return new GzipCompressionOutputStream(os); } }, SNAPPY("snappy") { @Override public CompressionInputStream newInputStream(InputStream is) throws IOException { return newSnappyCodec().createInputStream(is); } @Override public CompressionOutputStream newOutputStream(OutputStream os) throws IOException { return newSnappyCodec().createOutputStream(os); } private CompressionCodec newSnappyCodec() { final SnappyCodec codec = new SnappyCodec(); return codec; } }; private static final Map<String, SquallArchiveCompressor> lookup; static { final ImmutableMap.Builder<String, SquallArchiveCompressor> builder = ImmutableMap.builder(); for (final SquallArchiveCompressor compressor : values()) { builder.put(compressor.key, compressor); } lookup = builder.build(); } private final String key; SquallArchiveCompressor(String key) { this.key = key; } public abstract CompressionInputStream newInputStream(InputStream is) throws IOException; public abstract CompressionOutputStream newOutputStream(OutputStream os) throws IOException; public String getKey() { return key; } public static SquallArchiveCompressor fromKey(String key) { if (!lookup.containsKey(key)) { throw new IllegalArgumentException("invalid key: " + key); } return lookup.get(key); } }