/**
* Logback-beagle: The logback Console Plugin for Eclipse
* Copyright (C) 2006-2012, QOS.ch. All rights reserved.
*
* This program and the accompanying materials are licensed under
* either the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation.
*/
package ch.qos.logback.beagle.net;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import ch.qos.logback.beagle.Activator;
import ch.qos.logback.beagle.visual.ITableItemStubBuffer;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.ILoggingEvent;
/**
*
* @author Ceki Gülcü
* @author Sébastien Pennec
* @author Christian Trutz
*/
public class LoggingEventSocketServer implements Runnable, Listener {
private ServerSocket serverSocket = null;
private int port = 4321;
private boolean stop = false;
final ITableItemStubBuffer<ILoggingEvent> iTableItemStubBuffer;
List<LoggingEventSocketReader> socketReaderList = new ArrayList<LoggingEventSocketReader>();
final LoggerContext loggerContext;
public LoggingEventSocketServer(LoggerContext loggerContext,
ITableItemStubBuffer<ILoggingEvent> classicTISBuffer) {
this.loggerContext = loggerContext;
this.iTableItemStubBuffer = classicTISBuffer;
}
/**
*
*/
@Override
public void run() {
startAndLoop();
}
/*
*
*/
private void startAndLoop() {
try {
stop = false;
serverSocket = new ServerSocket(port);
while (!stop) {
Socket socket = serverSocket.accept();
EventConsumerThread eventConsumerThread = new EventConsumerThread(iTableItemStubBuffer);
eventConsumerThread.start();
LoggingEventSocketReader lesr = new LoggingEventSocketReader(socket,
eventConsumerThread.getBlockingQueue());
socketReaderList.add(lesr);
new Thread(lesr).start();
}
serverSocket.close();
} catch (BindException bindException) {
Activator.INSTANCE.logException(bindException, "The port " + port
+ " is already in use.");
} catch (Exception exception) {
Activator.INSTANCE.logException(exception, exception.getMessage());
}
}
/**
*
*/
public void restart() {
stop();
startAndLoop();
}
/**
* Stop this thread as well as any child threads.
*/
public void stop() {
try {
if (serverSocket != null)
serverSocket.close();
for (LoggingEventSocketReader lesr : socketReaderList) {
lesr.stop();
}
stop = true;
} catch (IOException e) {
}
}
@Override
public void handleEvent(Event event) {
// System.out
// .println("LoggingEventSocketServer dispose event occured. Stopping");
stop();
}
/**
*
* @param port
*/
public void setPort(int port) {
this.port = port;
}
}