package com.traxel.lumbermill.event;
import com.traxel.lumbermill.log.Log;
import org.apache.log4j.Logger;
import org.openide.util.Exceptions;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
private static final transient Logger LOG = Logger.getLogger(
EventListenerServer.class);
private final ServerSocket serverSocket;
private final int port;
private int clientCount;
private boolean stopRequest;
super(sink);
this.port = port;
stopRequest = false;
serverSocket = openServerSocket(port);
start();
}
ServerSocket socket = null;
try {
socket = new ServerSocket(port);
socket.setSoTimeout(1000);
} catch (final IOException e) {
LOG.error("could not create server socket", e);
Exceptions.printStackTrace(e);
if (socket != null) {
try {
socket.close();
} catch (final IOException e2) {
if (LOG.isInfoEnabled()) {
LOG.info("could not close socket", e2);
}
throw e;
}
}
throw e;
}
return socket;
}
@Override
public void finalize()
throws Throwable {
close();
super.finalize();
}
@Override
while (!stopRequest) {
try {
listen(serverSocket.accept());
} catch (final SocketTimeoutException e) {
} catch (final SocketException e) {
LOG.error("error during listening", e);
pleaseStop();
} catch (final IOException e) {
LOG.error("error during listening", e);
pleaseStop();
}
}
}
@Override
pleaseStop();
if (serverSocket != null) {
try {
synchronized (this) {
this.wait(1000);
}
} catch (final Exception e) {
if (LOG.isDebugEnabled()) {
LOG.debug("could not wait for one second", e);
}
}
try {
serverSocket.close();
} catch (IOException e) {
LOG.warn("could not close server socket", e);
}
}
firePropertyChange(STATUS_PROPERTY, null, getStatus());
}
@Override
return String.valueOf(port);
}
@Override
return "localhost";
}
@Override
return "Server";
}
@Override
if (serverSocket.isBound()) {
return (clientCount + " Clients");
} else {
return ("Closed");
}
}
stopRequest = true;
}
private void listen(
final Socket source) {
new SocketListener(source).start();
}
clientCount += amount;
firePropertyChange(STATUS_PROPERTY, null, getStatus());
}
private final Socket socket;
private final ObjectInputStream stream;
private boolean stopRequest = false;
ObjectInputStream ois = null;
this.socket = socket;
try {
ois = new ObjectInputStream(socket.getInputStream());
} catch (final IOException e) {
LOG.warn("could not open ObjectInputStream from socket: "
+ socket, e);
}
stream = ois;
}
@Override
adjustClientCount(1);
if (stream != null) {
while (!stopRequest) {
final Event event = Event.create(readObject());
if (event != null) {
add(event);
}
}
}
adjustClientCount(-1);
}
@Override
public void finalize()
throws Throwable {
try {
socket.close();
} catch (final Exception e) {
LOG.warn("could not close socket: " + socket, e);
}
try {
stream.close();
} catch (final Exception e) {
LOG.warn("could not close stream: " + stream, e);
}
super.finalize();
}
try {
return stream.readObject();
} catch (final EOFException e) {
stopRequest = true;
} catch (final Exception e) {
if (LOG.isDebugEnabled()) {
LOG.debug("received Exception", e);
}
stopRequest = true;
}
return null;
}
}
}