package com.neverwinterdp.scribengin.nizarS3.sink; import java.io.IOException; import java.util.LinkedHashMap; import com.google.inject.Inject; import com.google.inject.Injector; import com.neverwinterdp.scribengin.storage.StorageDescriptor; import com.neverwinterdp.scribengin.storage.StreamDescriptor; import com.neverwinterdp.scribengin.storage.sink.Sink; import com.neverwinterdp.scribengin.storage.sink.SinkStream; public class S3Sink implements Sink { private StorageDescriptor descriptor; private int idTracker = 0; private LinkedHashMap<Integer, S3SinkStream> streams = new LinkedHashMap<Integer, S3SinkStream>() ; private Injector injector; @Inject public S3Sink(Injector injector, StorageDescriptor descriptor) { this.injector = injector; this.descriptor = descriptor; } public StorageDescriptor getDescriptor() { return this.descriptor; } public SinkStream getStream(StreamDescriptor descriptor) throws Exception { SinkStream stream = streams.get(descriptor.getId()); if(stream == null) { throw new Exception("Cannot find the stream " + descriptor.getId()) ; } return stream ; } synchronized public SinkStream[] getStreams() { SinkStream[] array = new SinkStream[streams.size()] ; streams.values().toArray(array) ; return array; } @Override synchronized public void delete(SinkStream stream) throws Exception { SinkStream foundStream = streams.remove(stream.getDescriptor().getId()) ; if(foundStream == null) { throw new Exception("Cannot find the stream " + stream.getDescriptor().getId()) ; } } @Override synchronized public SinkStream newStream() throws IOException { int id = idTracker++; String location = descriptor.getLocation() + "/stream-" + id; StreamDescriptor streamDescriptor = new StreamDescriptor("S3", id, location) ; streamDescriptor.putAll(descriptor); S3SinkStream stream = new S3SinkStream(injector, streamDescriptor); streams.put(streamDescriptor.getId(), stream) ; return stream; } @Override public void close() throws Exception { } }