package water.api;
import java.io.File;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import water.persist.PersistHdfs;
import water.persist.PersistS3;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.Bucket;
import com.google.common.base.Strings;
import dontweave.gson.JsonArray;
import dontweave.gson.JsonPrimitive;
public class TypeaheadFileRequest extends TypeaheadRequest {
public TypeaheadFileRequest() {
super("Provides a simple JSON array of filtered local files.","");
}
protected JsonArray serveFile(String filter, int limit){
File base = null;
String filterPrefix = "";
if( !filter.isEmpty() ) {
File file = new File(filter);
if( file.isDirectory() ) {
base = file;
} else {
base = file.getParentFile();
filterPrefix = file.getName().toLowerCase();
}
}
if( base == null ) base = new File(".");
JsonArray array = new JsonArray();
File[] files = base.listFiles();
if( files == null ) return array;
for( File file : files ) {
if( file.isHidden() ) continue;
if( file.getName().toLowerCase().startsWith(filterPrefix) )
array.add(new JsonPrimitive(file.getPath()));
if( array.size() == limit) break;
}
return array;
}
protected JsonArray serveHdfs(String filter, int limit){
JsonArray array = new JsonArray();
Configuration conf = PersistHdfs.CONF;
if( conf == null ) return array;
try {
Path p = new Path(filter);
Path expand = p;
if( !filter.endsWith("/") ) expand = p.getParent();
FileSystem fs = FileSystem.get(p.toUri(), conf);
for( FileStatus file : fs.listStatus(expand) ) {
Path fp = file.getPath();
if( fp.toString().startsWith(p.toString()) ) {
array.add(new JsonPrimitive(fp.toString()));
}
if( array.size() == limit) break;
}
} catch( Throwable xe ) { }
return array;
}
protected JsonArray serveS3(String filter, int limit){
JsonArray array = new JsonArray();
try {
AmazonS3 s3 = PersistS3.getClient();
filter = Strings.nullToEmpty(filter);
for( Bucket b : s3.listBuckets() ) {
if( b.getName().startsWith(filter) )
array.add(new JsonPrimitive(b.getName()));
if( array.size() == limit) break;
}
} catch( IllegalArgumentException xe ) { }
return array;
}
@Override final protected JsonArray serve(String filter, int limit) {
final String lcaseFilter = filter.toLowerCase();
if(lcaseFilter.startsWith("hdfs://") || lcaseFilter.startsWith("s3n://"))return serveHdfs(filter, limit);
if(lcaseFilter.startsWith("s3://")) return serveS3(filter.substring(5), limit);
return serveFile(filter,limit);
}
}