/* * Parsers.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; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import com.google.gson.GsonBuilder; import com.google.gson.TypeAdapter; import com.google.gson.annotations.Since; import com.google.gson.reflect.TypeToken; public class Parsers { private static Parser defaultParser; private static Parser compressingParser; private static GsonBuilder gson = new GsonBuilder(); private static boolean compressByDefault; private static boolean compressWorkerByDefault; private static boolean compressFrontendByDefault; private static boolean compressSandboxByDefault; static { compressByDefault = Boolean.parseBoolean(System.getProperty("turnierserver.serializer.compress")); compressWorkerByDefault = Boolean.parseBoolean(System.getProperty("turnierserver.serializer.compress.worker")); compressFrontendByDefault = Boolean.parseBoolean(System.getProperty("turnierserver.serializer.compress.frontend")); compressSandboxByDefault = Boolean.parseBoolean(System.getProperty("turnierserver.serializer.compress.sandbox")); } /** * Gibt einen Parser zurück * * @param compress True wenn die Nachrichten komprimiert werden sollen * @return Den Parser */ public static Parser getParser(boolean compress) { if(compress) { if(compressingParser == null) { compressingParser = new GsonGzipParser(gson); } return compressingParser; } else { if(defaultParser == null) { defaultParser = new GsonParser(gson); } return defaultParser; } } /** * Gibt einen Parser zurück. Die System-Property "turnierserver.serializer.compress" gibt an, ob der Parser den diese Methode zurückgibt, komprimiert. * * @return Einen Parser */ public static Parser getParser() { return getParser(compressByDefault); } /** * Gibt einen Parser zurück, der für die Kommunikation zu den Workern verwendet werden soll. Die System-Property "turnierserver.serializer.compress.worker" gibt an, ob der Parser den diese Methode zurückgibt, komprimiert. * * @return Einen Parser */ public static Parser getWorker() { return getParser(compressWorkerByDefault); } /** * Gibt einen Parser zurück, der für die Kommunikation zum Frontend verwendet werden soll. Die System-Property "turnierserver.serializer.compress.frontend" gibt an, ob der Parser den diese Methode zurückgibt, komprimiert. * * @return Einen Parser */ public static Parser getFrontend() { return getParser(compressFrontendByDefault); } /** * Gibt einen Parser zurück, der für die Kommunikation zur Sandbox verwendet werden soll. Die System-Property "turnierserver.serializer.compress.sandbox" gibt an, ob der Parser den diese Methode zurückgibt, komprimiert. * * @return Einen Parser */ public static Parser getSandbox() { return getParser(compressSandboxByDefault); } /** * Setzt die Version des GSONS. Dies bedeutet, dass alle Felder, welche mit einer neueren Version annotiert wurden (siehe {@link Since}), nicht serialisiert/deserialisiert werden * * @param version Die Version * @see Since */ public static void setVersion(double version) { gson.setVersion(version); } /** * Fügt einen {@link TypeAdapter} für ein {@link TypeToken} hinzu. * * @param type Das TypeToken * @param typeAdapter Der TypeAdapter * @see TypeToken * @see TypeAdapter */ public static <E> void addTypeAdapter(TypeToken<E> type, TypeAdapter<E> typeAdapter) { gson.registerTypeAdapter(type.getType(), typeAdapter); } public static void escape(byte[] bytes, OutputStream out) { try { for(byte b : bytes) { if(b == (byte) '\\') { out.write('\\'); out.write('\\'); continue; } if(b == (byte) '\n') { out.write('\\'); out.write('n'); continue; } out.write(b); } } catch (IOException e) { Airbrake.log(e).printStackTrace(); } } public static byte[] escape(byte[] in) { ByteArrayOutputStream out = new ByteArrayOutputStream(); for(int i = 0; i < in.length; i++) { if(in[i] == '\\') { if(in[i + 1] == 'n') { out.write('\n'); i++; continue; } if(in[i + 1] == '\\') { out.write('\\'); i++; continue; } } out.write(in[i]); } return out.toByteArray(); } }