blob: c357c292277c1512fee5c034a1e77f2899816cfb (
plain) (
tree)
|
|
package org.openslx.bwlp.sat.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.bwlp.sat.util.Constants;
import org.openslx.bwlp.sat.util.Formatter;
import org.openslx.bwlp.thrift.iface.TTransferRejectedException;
import org.openslx.bwlp.thrift.iface.UserInfo;
import org.openslx.filetransfer.Downloader;
import org.openslx.filetransfer.IncomingEvent;
import org.openslx.filetransfer.Listener;
import org.openslx.filetransfer.Uploader;
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<String, ActiveUpload> 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<ByteBuffer> sha1Sums)
throws TTransferRejectedException, FileNotFoundException {
Iterator<ActiveUpload> 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 TTransferRejectedException("Server busy. Too many running uploads.");
File destinationFile = null;
do {
destinationFile = Formatter.getTempImageName();
} while (destinationFile.exists());
// TODO: Pass image
ActiveUpload upload = new ActiveUpload(owner, null, 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
}
}
|