/* * WBI Indicator Explorer * * Copyright 2015 Sebastian Nogara <snogaraleal@gmail.com> * * This file is part of WBI. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package client; import java.util.HashMap; import java.util.Map; import com.google.gwt.dom.client.Document; import rpc.client.Client; import rpc.client.data.JSONSerializer; import rpc.shared.data.Serializer; import rpc.shared.data.SerializerException; import rpc.shared.data.Type; /** * Global configuration provider. */ public class ClientConf { /** * Setting specified by the server. */ public static enum Setting { /** * Application start page. */ INDEX_URL, /** * Static assets URL. */ ASSETS_URL, /** * RPC HTTP dispatcher URL. */ RPC_SERVICE_HTTP_URL, /** * RPC WebSocket dispatcher URL. */ RPC_SERVICE_WS_URL; } /** * Group of settings. */ public static class Configuration { private Map<Setting, Object> data; /** * Initialize {@code Configuration}. */ public Configuration() { this.data = new HashMap<Setting, Object>(); } /** * Initialize {@code Configuration} with initial data. * * @param data Initial data. */ private Configuration(Map<Setting, Object> data) { this.data = data; } /** * Set setting value. * * @param setting Setting to set value to. * @param value Setting value. */ public void set(Setting setting, Object value) { data.put(setting, value); } /** * Get setting value. * * @param setting Setting to get value from. * @return Setting value. */ public Object get(Setting setting) { return data.get(setting); } /** * Serialize configuration. * * @param serializer {@code Serializer} used to deserialize. * @return Serialized configuration. * @throws SerializerException */ public String serialize(Serializer serializer) throws SerializerException { return serializer.serialize(data); } /** * Deserialize configuration. * * @param serializer {@code Serializer} used to serialize. * @param payload Serialized payload. * @return Deserialized {@code Configuration}. */ @SuppressWarnings("unchecked") public static Configuration deserialize( Serializer serializer, String payload) throws SerializerException { Type type = Type.get( HashMap.class, Type.get(Setting.class), Type.get(Object.class)); Map<Setting, Object> data = (HashMap<Setting, Object>) defaultSerializer.deserialize(payload, type); return new Configuration(data); } } /** * Global RPC serializer. */ public static Serializer defaultSerializer = new JSONSerializer(GlobalSerializableFactoryProvider.get()); /** * Attribute in {@code <head>} containing serialized configuration. */ public static String HEAD_ATTR = "data-conf"; /** * Load client configuration from {@code <head>}. * * @return Deserialized settings. */ private static Configuration loadConfiguration() { Configuration configuration; String payload = Document.get().getHead().getAttribute(HEAD_ATTR); try { configuration = Configuration.deserialize( defaultSerializer, payload); } catch (SerializerException e) { configuration = new Configuration(); } return configuration; } /* * Configuration lazy loading. */ private static Configuration configuration; private static Configuration getConfiguration() { if (configuration == null) { configuration = loadConfiguration(); } return configuration; } private static Object getSetting(Setting setting) { return getConfiguration().get(setting); } /** * Get {@code String} setting. * * @param setting {@link Setting} to get. * @return Setting value. */ public static String getString(Setting setting) { return (String) getSetting(setting); } /** * Get {@code Boolean} setting. * * @param setting {@link Setting} to get. * @return Setting value. */ public static boolean getBoolean(Setting setting) { return (Boolean) getSetting(setting); } /** * Get {@code Integer} setting. * * @param setting {@link Setting} to get. * @return Setting value. */ public static int getInteger(Setting setting) { return (Integer) getSetting(setting); } /** * Get {@code Float} setting. * * @param setting {@link Setting} to get. * @return Setting value. */ public static double getFloat(Setting setting) { return (Float) getSetting(setting); } /** * Get {@code Double} setting. * * @param setting {@link Setting} to get. * @return Setting value. */ public static double getDouble(Setting setting) { return (Double) getSetting(setting); } /** * Get full asset URL. * * @param path Asset path. * @return Full asset URL. */ public static String asset(String path) { return getString(Setting.ASSETS_URL) + path; } /** * Configure RPC {@link Client}. */ public static void configureRPC() { Client.setConfiguration( new Client.Configuration( defaultSerializer, getString(Setting.RPC_SERVICE_HTTP_URL), getString(Setting.RPC_SERVICE_WS_URL))); } }