/*
* WorkerClient.java
*
* Copyright (C) 2015 Pixelgaffer
*
* This work is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation; either version 2 of the License, or any later
* version.
*
* This work is distributed in the hope that it will be useful, but without
* any warranty; without even the implied warranty of merchantability or
* fitness for a particular purpose. See version 2 and version 3 of the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.pixelgaffer.turnierserver.backend.workerclient;
import static java.nio.charset.StandardCharsets.UTF_8;
import java.io.IOException;
import lombok.Getter;
import naga.NIOSocket;
import naga.SocketObserver;
import org.pixelgaffer.turnierserver.Parsers;
import org.pixelgaffer.turnierserver.backend.BackendMain;
import org.pixelgaffer.turnierserver.backend.Games;
import org.pixelgaffer.turnierserver.networking.NetworkService;
import org.pixelgaffer.turnierserver.networking.messages.MessageForward;
import org.pixelgaffer.turnierserver.networking.messages.WorkerInfo;
import org.pixelgaffer.turnierserver.networking.util.DataBuffer;
/**
* Diese Klasse dient zur Verbindung mit einem Worker.
*/
public class WorkerClient implements SocketObserver
{
/** Der Client zum Worker. */
private NIOSocket client;
@Getter
private boolean connected;
private DataBuffer buffer = new DataBuffer();
/**
* Öffnet den Client zum Worker mit der IP addr und dem Port aus info.
*/
public WorkerClient (String addr, WorkerInfo info) throws IOException
{
client = NetworkService.getService().openSocket(addr, info.getPort());
client.listen(this);
}
/**
* Sendet den MessageForward an den Worker.
*/
public void sendMessage (MessageForward mf) throws IOException
{
// BackendMain.getLogger().debug("Sende " + mf);
client.write(Parsers.getWorker().parse(mf, true));
}
/**
* Schließt die Verbindung.
*/
public void disconnect ()
{
client.close();
connected = false;
}
@Override
public void connectionOpened (NIOSocket socket)
{
BackendMain.getLogger().info("Established connection to " + socket.getIp());
connected = true;
socket.write("B\n".getBytes(UTF_8));
}
@Override
public void connectionBroken (NIOSocket socket, Exception exception)
{
connected = false;
BackendMain.getLogger().warning("Connection closed"
+ (exception == null ? "" : ": " + exception));
}
@Override
public void packetReceived (NIOSocket socket, byte[] packet)
{
buffer.add(packet);
byte line[];
while ((line = buffer.readLine()) != null)
{
byte _line[] = line;
new Thread( () -> {
try
{
MessageForward mf = Parsers.getWorker().parse(_line, MessageForward.class);
// BackendMain.getLogger().debug("Habe MessageForward von " + mf.getAi() + " erhalten: " + new String(mf.getMessage()));
Games.receiveMessage(mf);
}
catch (IOException e)
{
BackendMain.getLogger().critical("Failed to parse line: " + e);
}
}).start();
}
}
@Override
public void packetSent (NIOSocket socket, Object tag)
{
}
}