/*******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2013 by Pentaho : http://www.pentaho.com
*
*******************************************************************************
*
* 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 org.pentaho.di.core.compress.hadoopsnappy;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Method;
import org.pentaho.di.core.compress.CompressionProvider;
public class HadoopSnappyCompressionProvider implements CompressionProvider {
public static final int IO_COMPRESSION_CODEC_SNAPPY_DEFAULT_BUFFERSIZE = 256 * 1024;
private static final String HADOOP_CONFIG_UTIL_CLASS_PROPERTY = "hadoop.config.util.class";
private static final String[] HADOOP_CONFIG_UTIL_CLASS = { "org.apache.hadoop.hive.jdbc.HadoopConfigurationUtil",
"org.pentaho.hadoop.hive.jdbc.HadoopConfigurationUtil", };
private static final String GET_ACTIVE_CONFIGURATION_METHOD = "getActiveConfiguration";
private static final String GET_SNAPPY_SHIM = "getSnappyShim";
/**
* Locate the Snappy Shim for the active Hadoop Configuration via the Hadoop Configuration Util
*
* @return A {@link org.pentaho.hadoop.shim.spi.SnappyShim} to interact with Snappy
* @throws Exception
* Error locating a valid Snappy shim:
* <p>
* <ul>
* <li>{@link org.pentaho.hadoop.hive.jdbc.HadoopConfigurationUtil} could not be located</li>
* <li>No active Hadoop configuration</li>
* <li>Active Hadoop configuration doesn't support Snappy</li>
* </ul>
* </p>
*/
public static Object getActiveSnappyShim() throws Exception {
Class<?> hadoopConfigUtilClass = null;
String hadoopConfigUtilClassName = System.getProperty( HADOOP_CONFIG_UTIL_CLASS_PROPERTY );
if ( hadoopConfigUtilClassName != null ) {
hadoopConfigUtilClass = Class.forName( hadoopConfigUtilClassName );
} else {
for ( int i = 0; hadoopConfigUtilClass == null && i < HADOOP_CONFIG_UTIL_CLASS.length; i++ ) {
try {
hadoopConfigUtilClass = Class.forName( HADOOP_CONFIG_UTIL_CLASS[i] );
} catch ( ClassNotFoundException cnfe ) {
// Nothing to do here but try again
}
}
if ( hadoopConfigUtilClass == null ) {
throw new Exception( "No Hadoop Configuration Utilities class found, unable to get active Snappy shim" );
}
}
Method getActiveConfiguration = hadoopConfigUtilClass.getMethod( GET_ACTIVE_CONFIGURATION_METHOD );
Object hadoopConfiguration = getActiveConfiguration.invoke( hadoopConfigUtilClass.newInstance() );
Method getSnappyShim = hadoopConfiguration.getClass().getMethod( GET_SNAPPY_SHIM );
return getSnappyShim.invoke( hadoopConfiguration );
}
/**
* Tests whether hadoop-snappy (not to be confused with other java-based snappy implementations such as jsnappy or
* snappy-java) plus the native snappy libraries are available.
*
* @return true if hadoop-snappy is available on the classpath
*/
public static boolean isHadoopSnappyAvailable() {
try {
Object snappyShim = getActiveSnappyShim();
Method m = snappyShim.getClass().getMethod( "isHadoopSnappyAvailable" );
return ( (Boolean) m.invoke( snappyShim ) ).booleanValue();
} catch ( Exception ex ) {
return false;
}
}
@Override
public HadoopSnappyCompressionInputStream createInputStream( InputStream in ) throws IOException {
return new HadoopSnappyCompressionInputStream( in, this );
}
@Override
public boolean supportsInput() {
return true;
}
@Override
public HadoopSnappyCompressionOutputStream createOutputStream( OutputStream out ) throws IOException {
return new HadoopSnappyCompressionOutputStream( out, this );
}
@Override
public boolean supportsOutput() {
return true;
}
@Override
public String getDescription() {
return "Hadoop Snappy compression";
}
@Override
public String getName() {
return "Hadoop-snappy";
}
@Override
public String getDefaultExtension() {
return null;
}
}