package com.skcraft.playblock.queue;
import java.io.IOException;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture;
import com.skcraft.playblock.media.InvalidLengthException;
import com.skcraft.playblock.media.Media;
import com.skcraft.playblock.media.MediaResolver;
public class SimpleQueueSupervisor implements QueueSupervisor {
private final Executor executor = Executors.newCachedThreadPool();
private final MediaResolver resolver;
public SimpleQueueSupervisor(MediaResolver resolver) {
this.resolver = resolver;
}
@Override
public ListenableFuture<Media> submit(MediaQueue queue, String uri) {
SettableFuture<Media> future = SettableFuture.create();
QueueSubmitter submitter = new QueueSubmitter(future, queue, uri);
executor.execute(submitter);
return future;
}
private class QueueSubmitter implements Runnable {
private final SettableFuture<Media> future;
private final MediaQueue queue;
private final String uri;
private QueueSubmitter(SettableFuture<Media> future, MediaQueue queue, String uri) {
this.future = future;
this.queue = queue;
this.uri = uri;
}
@Override
public void run() {
try {
Media media = resolver.lookup(uri);
if (media.getLength() == null || media.getLength() <= 0) {
throw new InvalidLengthException();
}
queue.add(media);
future.set(media);
} catch (QueueException t) {
future.setException(t);
} catch (IOException t) {
future.setException(t);
}
}
}
}