package be.xhibit.teletask.server;
import be.xhibit.teletask.TeletaskReceiver;
import be.xhibit.teletask.client.TeletaskClient;
import be.xhibit.teletask.client.builder.ByteUtilities;
import be.xhibit.teletask.client.builder.composer.MessageHandler;
import be.xhibit.teletask.client.builder.message.MessageUtilities;
import be.xhibit.teletask.client.builder.message.messages.MessageSupport;
import be.xhibit.teletask.client.builder.message.messages.impl.EventMessage;
import be.xhibit.teletask.model.spec.ClientConfigSpec;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
public class TeletaskTestServer implements Runnable, TeletaskReceiver {
/**
* Logger responsible for logging and debugging statements.
*/
private static final Logger LOG = LoggerFactory.getLogger(TeletaskTestServer.class);
private final int port;
private final TeletaskClient client;
private ServerSocket server;
private Socket socket;
private InputStream inputStream;
private OutputStream outputStream;
private final Timer timer = new Timer();
public TeletaskTestServer(int port, TeletaskClient client) {
this.port = port;
this.client = client;
}
@Override
public void run() {
try {
this.server = new ServerSocket(this.getPort());
this.socket = this.server.accept();
this.inputStream = this.socket.getInputStream();
this.outputStream = this.socket.getOutputStream();
this.timer.schedule(new TimerTask() {
@Override
public void run() {
try {
List<MessageSupport> messages = MessageUtilities.receive(LOG, TeletaskTestServer.this);
for (MessageSupport message : messages) {
LOG.debug("Processing message: {}", message.toString());
TeletaskTestServer.this.outputStream.write(new byte[]{10});
List<EventMessage> eventMessages = message.respond(TeletaskTestServer.this.getConfig(), TeletaskTestServer.this.getMessageHandler());
if (eventMessages != null) {
for (EventMessage eventMessage : eventMessages) {
LOG.debug("Sending bytes to client: {}", ByteUtilities.bytesToHex(eventMessage.getRawBytes()));
TeletaskTestServer.this.outputStream.write(eventMessage.getRawBytes());
TeletaskTestServer.this.outputStream.flush();
}
}
TeletaskTestServer.this.outputStream.flush();
}
} catch (Exception e) {
LOG.error("Exception ({}) caught in run: {}", e.getClass().getName(), e.getMessage(), e);
}
}
}, 100, 10);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public void stop() {
LOG.debug("Stopping test server...");
try {
this.timer.purge();
this.timer.cancel();
this.inputStream.close();
this.outputStream.close();
this.socket.close();
this.server.close();
} catch (IOException e) {
LOG.error("Exception ({}) caught in stop: {}", e.getClass().getName(), e.getMessage(), e);
}
LOG.debug("Stopped test server.");
}
public int getPort() {
return this.port;
}
public TeletaskClient getClient() {
return this.client;
}
@Override
public InputStream getInputStream() {
return this.inputStream;
}
@Override
public ClientConfigSpec getConfig() {
return this.getClient().getConfig();
}
@Override
public MessageHandler getMessageHandler() {
return this.getClient().getMessageHandler();
}
}