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.io.Serializable;
015import java.util.Properties;
016
017import cascading.flow.FlowProcess;
018import cascading.scheme.Scheme;
019import cascading.tuple.Fields;
020
021/**
022 * Class CompressorScheme a sub-class of {@link Scheme} that provides compression support to any sub-classes.
023 * <p>
024 * See {@link Compressors} for pre-configured {@link Compressor} implementations.
025 */
026public abstract class CompressorScheme<SourceContext, SinkContext> extends Scheme<Properties, InputStream, OutputStream, SourceContext, SinkContext>
027  {
028  public static final Compressor NO_COMPRESSOR = new Compressor()
029    {
030    @Override
031    public InputStream inputStream( InputStream inputStream )
032      {
033      return inputStream;
034      }
035
036    @Override
037    public OutputStream outputStream( OutputStream outputStream )
038      {
039      return outputStream;
040      }
041    };
042
043  public interface Compressor extends Serializable
044    {
045    InputStream inputStream( InputStream inputStream ) throws IOException;
046
047    OutputStream outputStream( OutputStream outputStream ) throws IOException;
048    }
049
050  protected Compressor compressor = NO_COMPRESSOR;
051
052  public CompressorScheme()
053    {
054    }
055
056  public CompressorScheme( Fields sourceFields )
057    {
058    super( sourceFields );
059    }
060
061  public CompressorScheme( Fields sourceFields, int numSinkParts )
062    {
063    super( sourceFields, numSinkParts );
064    }
065
066  public CompressorScheme( Fields sourceFields, Fields sinkFields )
067    {
068    super( sourceFields, sinkFields );
069    }
070
071  public CompressorScheme( Fields sourceFields, Fields sinkFields, int numSinkParts )
072    {
073    super( sourceFields, sinkFields, numSinkParts );
074    }
075
076  public CompressorScheme( Compressor compressor )
077    {
078    setCompressor( compressor );
079    }
080
081  public CompressorScheme( Fields sourceFields, Compressor compressor )
082    {
083    super( sourceFields );
084
085    setCompressor( compressor );
086    }
087
088  public CompressorScheme( Fields sourceFields, int numSinkParts, Compressor compressor )
089    {
090    super( sourceFields, numSinkParts );
091
092    setCompressor( compressor );
093    }
094
095  public CompressorScheme( Fields sourceFields, Fields sinkFields, Compressor compressor )
096    {
097    super( sourceFields, sinkFields );
098
099    setCompressor( compressor );
100    }
101
102  public CompressorScheme( Fields sourceFields, Fields sinkFields, int numSinkParts, Compressor compressor )
103    {
104    super( sourceFields, sinkFields, numSinkParts );
105
106    setCompressor( compressor );
107    }
108
109  protected void setCompressor( Compressor compressor )
110    {
111    if( compressor != null )
112      this.compressor = compressor;
113    }
114
115  public InputStream sourceWrap( FlowProcess<? extends Properties> flowProcess, InputStream inputStream ) throws IOException
116    {
117    return compressor.inputStream( inputStream );
118    }
119
120  public OutputStream sinkWrap( FlowProcess<? extends Properties> flowProcess, OutputStream outputStream ) throws IOException
121    {
122    return compressor.outputStream( outputStream );
123    }
124  }