package fileserv; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.ByteBuffer; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import org.openslx.filetransfer.Downloader; import org.openslx.filetransfer.IncomingEvent; import org.openslx.filetransfer.Listener; import org.openslx.filetransfer.Uploader; import org.openslx.imagemaster.thrift.iface.UserInfo; import org.openslx.sat.thrift.iface.TUploadRejectedException; import util.Constants; import util.Formatter; public class FileServer implements IncomingEvent { /** * Listener for incoming unencrypted connections */ private Listener plainListener = new Listener(this, null, 9092); // TODO: Config /** * All currently running uploads, indexed by token */ private Map uploads = new ConcurrentHashMap<>(); private static final FileServer globalInstance = new FileServer(); private FileServer() { } public static FileServer instance() { return globalInstance; } public boolean start() { boolean ret = plainListener.start(); // TODO: Start SSL listener too return ret; } @Override public void incomingDownloadRequest(Uploader uploader) throws IOException { // TODO Auto-generated method stub } @Override public void incomingUploadRequest(Downloader downloader) throws IOException { // TODO Auto-generated method stub } /** * Get an upload instance by given token. * * @param uploadToken * @return */ public ActiveUpload getUploadByToken(String uploadToken) { return uploads.get(uploadToken); } public String createNewUserUpload(UserInfo owner, long fileSize, List sha1Sums) throws TUploadRejectedException, FileNotFoundException { Iterator it = uploads.values().iterator(); int activeUploads = 0; while (it.hasNext()) { ActiveUpload upload = it.next(); if (upload.isComplete()) { // TODO: Check age (short timeout) and remove continue; } else { // Check age (long timeout) and remove } activeUploads++; } if (activeUploads > Constants.MAX_UPLOADS) throw new TUploadRejectedException("Server busy. Too many running uploads."); File destinationFile = null; do { destinationFile = Formatter.getTempImageName(); } while (destinationFile.exists()); ActiveUpload upload = new ActiveUpload(owner, destinationFile, fileSize, sha1Sums); String key = UUID.randomUUID().toString(); uploads.put(key, upload); return key; } public int getPlainPort() { return plainListener.getPort(); } public int getSslPort() { return 0; // TODO } }