package org.smartly.commons.network.socket.server;
import org.smartly.commons.logging.Level;
import org.smartly.commons.logging.Logger;
import org.smartly.commons.logging.util.LoggingUtils;
import org.smartly.commons.network.socket.messages.AbstractMessage;
import org.smartly.commons.network.socket.messages.MessageResponse;
import org.smartly.commons.network.socket.server.handlers.ISocketFilter;
import org.smartly.commons.network.socket.server.handlers.ISocketHandler;
import org.smartly.commons.network.socket.server.handlers.SocketRequest;
import org.smartly.commons.network.socket.server.handlers.SocketResponse;
import org.smartly.commons.network.socket.server.handlers.pool.SocketFilterPoolIterator;
import org.smartly.commons.network.socket.server.handlers.pool.SocketHandlerPool;
import java.io.*;
import java.net.Socket;
public class ServerWorker extends Thread {
private final Server _server;
private final Socket _client;
private final SocketHandlerPool _pool;
public ServerWorker(final Server server, final Socket client) {
_server = server;
_client = client;
_pool = _server.getHandlers();
}
@Override
public void run() {
try {
// out and in
final ObjectOutputStream out = new ObjectOutputStream(_client.getOutputStream());
final ObjectInputStream in = new ObjectInputStream(_client.getInputStream());
// read
final Object input = in.readObject();
if (null != input) {
final SocketRequest request = new SocketRequest(new SocketRequestServer(_server), input);
final SocketResponse response = new SocketResponse();
//-- handle request and write response --//
final MessageResponse output = this.handle(request, response);
// write
if (!output.isNull()) {
out.writeObject(output);
out.flush();
}
}
out.close();
in.close();
} catch (EOFException ignored) {
} catch (StreamCorruptedException ignored) {
} catch (Throwable t) {
this.onError(null, t);
} finally {
try {
_client.close();
} catch (Throwable ignored) {
}
}
}
// --------------------------------------------------------------------
// p r i v a t e
// --------------------------------------------------------------------
private Logger getLogger() {
return LoggingUtils.getLogger(this);
}
private void onError(final String message, final Throwable t) {
try {
_server.onError(message, t);
} catch (Throwable ignored) {
this.getLogger().log(Level.SEVERE, null, t);
}
}
private MessageResponse handle(final SocketRequest request, final SocketResponse response) {
// response
final MessageResponse output = new MessageResponse();
// filters
final SocketFilterPoolIterator iterator = _pool.getFiltersIterator();
while (iterator.hasNext()) {
final ISocketFilter handler = iterator.next();
if (handler.handle(request, response)) {
break;
}
}
if (response.canHandle() && _pool.hasHandler(request.getType())) {
final ISocketHandler handler = _pool.getHandler(request.getType());
if (null != handler) {
handler.handle(request, response);
}
}
if(request.read() instanceof AbstractMessage){
output.setUserToken(((AbstractMessage)request.read()).getUserToken());
}
output.setData(response.read());
return output;
}
private Object read(final InputStream is) {
Object result = null;
try {
final ObjectInputStream in = new ObjectInputStream(is);
result = in.readObject();
} catch (Throwable ignored) {
// unable to read stream
}
return result;
}
}