package earth.krakatao; import earth.krakatao.events.KraSocketClientEventInitiater; import earth.krakatao.protocol.KraSocketClientProtocol; import earth.krakatao.protocol.KraSocketClientProtocolMessage; import earth.krakatao.protocol.KraSocketClientProtocolStatus; import java.net.URI; import java.nio.ByteBuffer; import java.util.List; import java.util.Timer; import java.util.TimerTask; import lombok.Getter; import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; public class SocketClient extends WebSocketClient { private final KraSocketClientEventInitiater kraSocketClientEventInitiater; @Getter private final KraSocketClientProtocol kraProtocol; @Getter private final List webSocketAckTimeouts; private Timer timer; public SocketClient(URI serverUri, KraSocketClientEventInitiater kraSocketClientEventInitiater, KraSocketClientProtocol kraProtocol, List webSocketAckTimeouts) { super(serverUri); this.kraSocketClientEventInitiater = kraSocketClientEventInitiater; this.kraProtocol = kraProtocol; this.webSocketAckTimeouts = webSocketAckTimeouts; } public void SendMessage(KraSocketClientProtocolMessage kraProtocolMessage) { if (isOpen()) { if (kraProtocolMessage.getStatus() == KraSocketClientProtocolStatus.GET.getStatus()) { this.kraProtocol.getSendQueueMessages() .put(kraProtocolMessage.getCmdID(), kraProtocolMessage); } send(this.kraProtocol.EncodeMessage(kraProtocolMessage)); } } public void Reconnect() { KraSocketClient.getLogger().info("Reconnecting..."); reconnect(); } @Override public void onOpen(ServerHandshake serverHandshake) { this.kraSocketClientEventInitiater.callOnOpen(serverHandshake); KraSocketClient.getLogger().info("connection opened"); TimerTask timerTask = new KraSocketClientMessageTimerTask(this); this.timer = new Timer(true); this.timer.scheduleAtFixedRate(timerTask, 0, 3 * 1000); } @Override public void onMessage(String s) { } @Override public void onMessage(ByteBuffer byteBuffer) { KraSocketClientProtocolMessage kraProtocolMessage = new KraSocketClientProtocol().DecodeMessage( byteBuffer.array()); if (kraProtocolMessage.getStatus() == KraSocketClientProtocolStatus.ERROR_NO_PERMS.getStatus() || kraProtocolMessage.getStatus() == KraSocketClientProtocolStatus.ERROR_TRY_AGAIN.getStatus() || kraProtocolMessage.getStatus() == KraSocketClientProtocolStatus.ERROR_ARG_LEN_TOO_BIG.getStatus()) { KraSocketClient.getLogger().warning("error! status: " + kraProtocolMessage.getStatus()); return; } // response to the user that this message cmdID is already in the queue if (kraProtocolMessage.getStatus() == KraSocketClientProtocolStatus.GET.getStatus() && this.kraProtocol.getSendQueueMessages().containsKey(kraProtocolMessage.getCmdID())) { // TODO: uuid kraProtocolMessage = new KraSocketClientProtocolMessage( KraSocketClientProtocolStatus.MESSAGE_ALREADY_IN_QUEUE.getStatus(), kraProtocolMessage.getStatus() == KraSocketClientProtocolStatus.GET.getStatus() ? kraProtocolMessage.getStatus() : 0, 0, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", (short) kraProtocolMessage.getCmdNumber(), "", null); KraSocketClient.getLogger() .info("response MESSAGE_ALREADY_IN_QUEUE " + kraProtocolMessage.getCmdID()); this.SendMessage(kraProtocolMessage); return; } this.kraSocketClientEventInitiater.callOnMessage(kraProtocolMessage); } @Override public void onClose(int code, String reason, boolean remote) { this.kraSocketClientEventInitiater.callOnClose(code, reason, remote); KraSocketClient.logger.warning( "connection closed. Code: " + code + " reason: " + reason + " remote: " + remote); this.timer.cancel(); } @Override public void onError(Exception e) { KraSocketClient.getLogger().warning("Err: " + e); } }