summaryrefslogblamecommitdiffstats
path: root/dozentenmodulserver/src/main/java/fileserv/FileServer.java
blob: 8322e2e9ad1d651e70f8e8ffb4e8d9977aa8fcf3 (plain) (tree)
1
2
3
4
5
6
7
8
9

                 

                                     
                           


                           
                     
                      





                                              




                                                             












                                                                                        








                                                                          

















                                                                                     











































                                                                                                     
 
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<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 TUploadRejectedException, 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 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
	}

}