package edu.ucsb.jpregel.clouds; import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.google.inject.Module; import com.google.inject.name.Named; import com.google.inject.name.Names; import edu.ucsb.jpregel.system.FileSystem; import java.io.*; import org.jclouds.ContextBuilder; import org.jclouds.apis.ApiMetadata; import org.jclouds.blobstore.BlobStoreContext; import org.jclouds.blobstore.InputStreamMap; public class CloudFileSystem extends FileSystem { private final BlobStoreContext context; private final InputStreamMap storage; @Inject public CloudFileSystem( @Named("jobDirectoryName") String jobDirectoryName, @Named("storage") ApiMetadata apiMetadata, @Named("sAccess") String access, @Named("sModify") String modify) { super(jobDirectoryName); this.context = new ContextBuilder(apiMetadata).credentials(access, modify).build(BlobStoreContext.class); this.storage = context.createInputStreamMap(jobDirectoryName); new File("in/").mkdirs(); new File("out/").mkdirs(); } @Override public BufferedReader getFileInputStream() throws FileNotFoundException { return new BufferedReader(new InputStreamReader(storage.get("input"))); } @Override public BufferedWriter getFileOutputStream() { try { return new S3Writer("output"); } catch (FileNotFoundException ex) { return null; } } @Override public BufferedReader getWorkerInputFileInputStream(int workerNum) throws FileNotFoundException { return new BufferedReader(new InputStreamReader(storage.get("in/" + workerNum))); } @Override public BufferedWriter getWorkerInputFileOutputStream(int WorkerNum) { try { return new S3Writer("in/" + WorkerNum); } catch (FileNotFoundException ex) { return null; } } @Override public BufferedReader getWorkerOutputFileInputStream(int workerNum) throws FileNotFoundException { return new BufferedReader(new InputStreamReader(storage.get("out/" + workerNum))); } @Override public BufferedWriter getWorkerOutputFileOutputStream(int WorkerNum) { try { return new S3Writer("out/" + WorkerNum); } catch (FileNotFoundException ex) { return null; } } private class S3Writer extends BufferedWriter { private final String path; S3Writer(String path) throws FileNotFoundException { super(new OutputStreamWriter(new FileOutputStream(new File(path)))); this.path = path; } @Override public void close() throws IOException { super.close(); storage.putFile(path, new File(path)); } } public static Module getModule(final String jobDirectoryName) { return new AbstractModule() { @Override protected void configure() { bindConstant().annotatedWith(Names.named("jobDirectoryName")).to(jobDirectoryName); bind(FileSystem.class).to(CloudFileSystem.class); } }; } }