001/*
002 * Copyright (c) 2007-2018 Concurrent, Inc. All Rights Reserved.
003 *
004 * Project and contact information: http://www.cascading.org/
005 *
006 * This file is part of the Cascading project.
007 */
008
009package cascading.scheme.local;
010
011import java.io.IOException;
012import java.io.InputStream;
013import java.io.OutputStream;
014import java.util.Objects;
015
016import cascading.tap.TapException;
017import org.apache.commons.compress.compressors.CompressorException;
018import org.apache.commons.compress.compressors.CompressorStreamFactory;
019
020/**
021 * A collection of provided {@link cascading.scheme.local.CompressorScheme.Compressor} implementations backed
022 * by <a href="http://commons.apache.org/proper/commons-compress/">Apache Commons Compress</a>.
023 */
024public class Compressors
025  {
026  /**
027   * The {@link CompressorStreamFactory#BROTLI} compressor.
028   */
029  public static final ApacheCompressor BROTLI = new ApacheCompressor( CompressorStreamFactory.BROTLI );
030
031  /**
032   * The {@link CompressorStreamFactory#BZIP2} compressor.
033   */
034  public static final ApacheCompressor BZIP2 = new ApacheCompressor( CompressorStreamFactory.BZIP2 );
035
036  /**
037   * The {@link CompressorStreamFactory#GZIP} compressor.
038   */
039  public static final ApacheCompressor GZIP = new ApacheCompressor( CompressorStreamFactory.GZIP );
040
041  /**
042   * The {@link CompressorStreamFactory#PACK200} compressor.
043   */
044  public static final ApacheCompressor PACK200 = new ApacheCompressor( CompressorStreamFactory.PACK200 );
045
046  /**
047   * The {@link CompressorStreamFactory#XZ} compressor.
048   */
049  public static final ApacheCompressor XZ = new ApacheCompressor( CompressorStreamFactory.XZ );
050
051  /**
052   * The {@link CompressorStreamFactory#LZMA} compressor.
053   */
054  public static final ApacheCompressor LZMA = new ApacheCompressor( CompressorStreamFactory.LZMA );
055
056  /**
057   * The {@link CompressorStreamFactory#SNAPPY_FRAMED} compressor.
058   */
059  public static final ApacheCompressor SNAPPY_FRAMED = new ApacheCompressor( CompressorStreamFactory.SNAPPY_FRAMED );
060
061  /**
062   * The {@link CompressorStreamFactory#SNAPPY_RAW} compressor.
063   */
064  public static final ApacheCompressor SNAPPY_RAW = new ApacheCompressor( CompressorStreamFactory.SNAPPY_RAW );
065
066  /**
067   * The {@link CompressorStreamFactory#Z} compressor.
068   */
069  public static final ApacheCompressor Z = new ApacheCompressor( CompressorStreamFactory.Z );
070
071  /**
072   * The {@link CompressorStreamFactory#DEFLATE} compressor.
073   */
074  public static final ApacheCompressor DEFLATE = new ApacheCompressor( CompressorStreamFactory.DEFLATE );
075
076  /**
077   * The {@link CompressorStreamFactory#LZ4_BLOCK} compressor.
078   */
079  public static final ApacheCompressor LZ4_BLOCK = new ApacheCompressor( CompressorStreamFactory.LZ4_BLOCK );
080
081  /**
082   * The {@link CompressorStreamFactory#LZ4_FRAMED} compressor.
083   */
084  public static final ApacheCompressor LZ4_FRAMED = new ApacheCompressor( CompressorStreamFactory.LZ4_FRAMED );
085
086  private static CompressorStreamFactory factory = new CompressorStreamFactory();
087
088  static class ApacheCompressor implements CompressorScheme.Compressor
089    {
090    String algorithm;
091
092    public ApacheCompressor( String algorithm )
093      {
094      this.algorithm = algorithm;
095      }
096
097    @Override
098    public InputStream inputStream( InputStream inputStream ) throws IOException
099      {
100      try
101        {
102        return factory.createCompressorInputStream( algorithm, inputStream );
103        }
104      catch( CompressorException exception )
105        {
106        throw new TapException( exception );
107        }
108      }
109
110    @Override
111    public OutputStream outputStream( OutputStream outputStream ) throws IOException
112      {
113      try
114        {
115        return factory.createCompressorOutputStream( algorithm, outputStream );
116        }
117      catch( CompressorException exception )
118        {
119        throw new TapException( exception );
120        }
121      }
122
123    @Override
124    public boolean equals( Object object )
125      {
126      if( this == object )
127        return true;
128      if( !( object instanceof ApacheCompressor ) )
129        return false;
130      ApacheCompressor that = (ApacheCompressor) object;
131      return Objects.equals( algorithm, that.algorithm );
132      }
133
134    @Override
135    public int hashCode()
136      {
137      return Objects.hash( algorithm );
138      }
139
140    @Override
141    public String toString()
142      {
143      final StringBuilder sb = new StringBuilder( "Compressor{" );
144      sb.append( "algorithm='" ).append( algorithm ).append( '\'' );
145      sb.append( '}' );
146      return sb.toString();
147      }
148    }
149  }