/**
* Logback: the reliable, generic, fast and flexible logging framework.
* Copyright (C) 1999-2015, QOS.ch. All rights reserved.
*
* This program and the accompanying materials are dual-licensed under
* either the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation
*
* or (per the licensee's choosing)
*
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
package ch.qos.logback.core.net.server;
import java.io.IOException;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import ch.qos.logback.core.net.server.Client;
import ch.qos.logback.core.net.server.ServerListener;
/**
* A mock {@link ServerListener} that has a blocking queue to pass a client
* to a {@link #acceptClient()} caller. If the {@link #close()} method is
* called while a caller is blocked waiting to take from the queue, the
* caller's thread is interrupted.
*
* @author Carl Harris
*/
public class MockServerListener<T extends Client> implements ServerListener<T> {
private final BlockingQueue<T> queue = new LinkedBlockingQueue<T>();
private boolean closed;
private Thread waiter;
public synchronized Thread getWaiter() {
return waiter;
}
public synchronized void setWaiter(Thread waiter) {
this.waiter = waiter;
}
public synchronized boolean isClosed() {
return closed;
}
public synchronized void setClosed(boolean closed) {
this.closed = closed;
}
public T acceptClient() throws IOException, InterruptedException {
if (isClosed()) {
throw new IOException("closed");
}
setWaiter(Thread.currentThread());
try {
return queue.take();
} finally {
setWaiter(null);
}
}
public void addClient(T client) {
queue.offer(client);
}
public synchronized void close() {
setClosed(true);
Thread waiter = getWaiter();
if (waiter != null) {
waiter.interrupt();
}
}
}