/* * ProtocolLine.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.networking.bwprotocol; import java.io.IOException; import java.util.Arrays; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.ToString; import org.pixelgaffer.turnierserver.Parsers; import org.pixelgaffer.turnierserver.networking.messages.SandboxMessage; import org.pixelgaffer.turnierserver.networking.messages.WorkerInfo; @AllArgsConstructor @ToString public class ProtocolLine { /** Enthält ein {@link WorkerCommandAnswer}-Objekt. */ public static final byte ANSWER = 'A'; /** Enthält ein {@link WorkerInfo}-Objekt. */ public static final byte INFO = 'I'; /** Enthält ein {@link AiConnected}-Objekt. */ public static final byte AICONNECTED = 'C'; /** Enthält ein {@link SandboxMessage}-Objekt. */ public static final byte SANDBOX_MESSAGE = 'M'; /** Der Inhalt der Zeile. */ @Getter private byte mode; /** Das Objekt dieser Zeile. */ @Getter private Object object; @SuppressWarnings("unchecked") public <T> T getObject (Class<T> clazz) { return (T)getObject(); } /** * Parst die Zeile. */ public ProtocolLine (byte line[]) throws IOException { mode = line[0]; line = Arrays.copyOfRange(line, 1, line.length); switch (mode) { case ANSWER: object = Parsers.getWorker().parse(line, WorkerCommandAnswer.class); break; case INFO: object = Parsers.getWorker().parse(line, WorkerInfo.class); break; case AICONNECTED: object = Parsers.getWorker().parse(line, AiConnected.class); break; case SANDBOX_MESSAGE: object = Parsers.getWorker().parse(line, SandboxMessage.class); break; default: System.err.println("ProtocolLine: Fehler: Unbekannter mode: " + ((char)mode)); } } /** * Serialisiert dieses Objekt. */ public byte[] serialize (boolean newline) throws IOException { byte obj[] = Parsers.getWorker().parse(getObject(), newline); byte data[] = new byte[obj.length + 1]; data[0] = getMode(); System.arraycopy(obj, 0, data, 1, obj.length); return data; } }