/*
* Copyright (c) 2007-2010 Concurrent, Inc. All Rights Reserved.
*
* Project and contact information: http://www.cascading.org/
*
* This file is part of the Cascading project.
*
* Cascading is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Cascading is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Cascading. If not, see <http://www.gnu.org/licenses/>.
*/
package cascading.util;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import cascading.CascadingException;
import org.apache.hadoop.fs.Path;
import org.jets3t.service.S3Service;
import org.jets3t.service.S3ServiceException;
import org.jets3t.service.impl.rest.httpclient.RestS3Service;
import org.jets3t.service.model.S3Bucket;
import org.jets3t.service.model.S3Object;
import org.jets3t.service.security.AWSCredentials;
/** Class S3Util encapsulates calls to the JetS3t API. */
@Deprecated
public class S3Util
{
public static final String MIME_DIRECTORY = "application/x-directory";
public enum Request
{
DETAILS, OBJECT, CREATE_OBJECT, CREATE_DIR
}
/**
* Parses the userinfo username and password out of the given URI, and retuns the embedded, or default, AWS access and secret keys.
* <p/>
* This code will handle underscores in bucket names.
*
* @param uri
* @param defaultAccessKey
* @param defaultSecretAccessKey
* @return a String[] with accessKey and secretKey
*/
@Deprecated
public static String[] parseAWSUri( URI uri, String defaultAccessKey, String defaultSecretAccessKey )
{
String accessKey = null;
String secretAccessKey = null;
String userInfo = uri.getUserInfo();
// special handling for underscores in bucket names
if( userInfo == null )
{
String authority = uri.getAuthority();
String split[] = authority.split( "[:@]" );
if( split.length >= 2 )
userInfo = split[ 0 ] + ":" + split[ 1 ];
}
if( userInfo != null )
{
int index = userInfo.indexOf( ':' );
if( index != -1 )
{
accessKey = userInfo.substring( 0, index );
secretAccessKey = userInfo.substring( index + 1 );
}
else
{
accessKey = userInfo;
}
}
if( accessKey == null )
accessKey = defaultAccessKey;
if( secretAccessKey == null )
secretAccessKey = defaultSecretAccessKey;
if( accessKey == null && secretAccessKey == null )
throw new IllegalArgumentException( "AWS Access Key ID and Secret Access Key must be specified as the username or password in the given URI" );
else if( accessKey == null )
throw new IllegalArgumentException( "AWS Access Key ID must be specified as the username of the given URI" );
else if( secretAccessKey == null )
throw new IllegalArgumentException( "AWS Secret Access Key must be specified as the password of the given URI" );
return new String[]{accessKey, secretAccessKey};
}
@Deprecated
public static RestS3Service getS3Service( URI uri )
{
return getS3Service( uri, null, null );
}
@Deprecated
public static RestS3Service getS3Service( URI uri, String defaultAccessKey, String defaultSecretAccessKey )
{
try
{
String[] aws = parseAWSUri( uri, defaultAccessKey, defaultSecretAccessKey );
return new RestS3Service( new AWSCredentials( aws[ 0 ], aws[ 1 ] ) );
}
catch( S3ServiceException exception )
{
if( exception.getCause() instanceof IOException )
throw new CascadingException( exception.getCause() );
throw new CascadingException( exception );
}
}
@Deprecated
public static S3Bucket getS3Bucket( URI uri )
{
String bucketName = uri.getAuthority();
// handling for underscore in bucket name
if( bucketName.contains( "@" ) )
bucketName = bucketName.split( "@" )[ 1 ];
return new S3Bucket( bucketName );
}
@Deprecated
public static boolean deleteObject( S3Service s3Service, S3Bucket s3Bucket, Path path ) throws IOException
{
S3Object object = getObject( s3Service, s3Bucket, path, Request.DETAILS );
if( object == null )
return true;
try
{
s3Service.deleteObject( s3Bucket, object.getKey() );
}
catch( S3ServiceException exception )
{
return false;
}
return true;
}
/**
* @param s3Service
* @param s3Bucket
* @param path
* @param type
* @return null if the S3 service returns a 404
* @throws IOException thrown if there is an error communicating to S3
*/
@Deprecated
public static S3Object getObject( S3Service s3Service, S3Bucket s3Bucket, Path path, Request type ) throws IOException
{
try
{
String keyName = getKeyFrom( path );
if( type == Request.CREATE_OBJECT )
return makeObject( s3Bucket, keyName, null, null );
else if( type == Request.CREATE_DIR )
return makeObject( s3Bucket, keyName, MIME_DIRECTORY, null );
else if( type == Request.DETAILS )
return s3Service.getObjectDetails( s3Bucket, keyName );
else if( type == Request.OBJECT )
return s3Service.getObject( s3Bucket, keyName );
else
throw new IllegalArgumentException( "unrecognized request type: " + type );
}
catch( S3ServiceException exception )
{
if( exception.getMessage().contains( "404" ) )
return null;
IOException ioException = new IOException( "could not get object: " + path );
ioException.initCause( exception );
throw ioException;
}
}
@Deprecated
public static String getKeyFrom( Path path )
{
return path.toUri().getPath().substring( 1 );
}
@Deprecated
public static S3Object[] listObjects( S3Service s3Service, S3Bucket s3Bucket, Path path ) throws IOException
{
try
{
return s3Service.listObjects( s3Bucket, getKeyFrom( path ), "/" );
}
catch( S3ServiceException exception )
{
IOException ioException = new IOException( "could not get object: " + path );
ioException.initCause( exception );
throw ioException;
}
}
private static S3Object makeObject( S3Bucket bucket, String keyName, String mimeType, String body ) throws IOException
{
S3Object object = null;
try
{
if( body != null )
{
object = new S3Object( bucket, keyName, body );
object.setContentLength( body.getBytes().length );
}
else
{
object = new S3Object( bucket, keyName );
}
}
catch( RuntimeException exception )
{
throw exception;
}
// catch( UnsupportedEncodingException exception ) // for hadoop 0.18
catch( Exception exception )
{
throw new IOException( "could not create object: " + bucket.getName() + "/" + keyName + " " + exception.getMessage() );
}
if( mimeType != null )
object.setContentType( mimeType );
return object;
}
@Deprecated
public static boolean isDirectory( S3Object object )
{
return object.getContentType() != null && object.getContentType().equalsIgnoreCase( MIME_DIRECTORY );
}
@Deprecated
public static void putObject( S3Service s3Service, S3Bucket bucket, S3Object object ) throws IOException
{
try
{
s3Service.putObject( bucket, object );
}
catch( S3ServiceException exception )
{
if( exception.getCause() instanceof IOException )
throw (IOException) exception.getCause();
throw new IOException( "could not store object: " + bucket.getName() + "/" + object.getKey() + " " + exception.getMessage() );
}
}
@Deprecated
public static InputStream getObjectInputStream( S3Object object ) throws IOException
{
try
{
return object.getDataInputStream();
}
catch( S3ServiceException exception )
{
IOException ioException = new IOException( "could get object inputstream: " + object.getKey() );
ioException.initCause( exception );
throw ioException;
}
}
}