/** * Analytica - beta version - Systems Monitoring Tool * * Copyright (C) 2013, KleeGroup, direction.technique@kleegroup.com (http://www.kleegroup.com) * KleeGroup, Centre d'affaire la Boursidi�re - BP 159 - 92357 Le Plessis Robinson Cedex - France * * 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> * * Linking this library statically or dynamically with other modules is making a combined work based on this library. * Thus, the terms and conditions of the GNU General Public License cover the whole combination. * * As a special exception, the copyright holders of this library give you permission to link this library * with independent modules to produce an executable, regardless of the license terms of these independent modules, * and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, * for each linked independent module, the terms and conditions of the license of that module. * An independent module is a module which is not derived from or based on this library. * If you modify this library, you may extend this exception to your version of the library, * but you are not obliged to do so. * If you do not wish to do so, delete this exception statement from your version. */ package io.analytica.spies.impl; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.net.MalformedURLException; import java.net.URL; import com.google.gson.Gson; /** * Utilitaire de lecture de fichier de conf JSon. * @author npiedeloup */ public final class JsonConfReader { /** * Chargement d'une configuration. * @param confFileUrl URL du fichier de conf * @param confClass Class de l'objet portant la conf * @return Instance de la configuration charg�e � partir du fichier */ public static <D extends Object> D loadJsonConf(final URL confFileUrl, final Class<D> confClass) { try { final String confJson = readConf(confFileUrl); final String escapedConfJson = escapeComments(confJson); final String cleanConfJson = cleanEmptyElement(escapedConfJson); final D conf = new Gson().fromJson(cleanConfJson, confClass); return conf; } catch (final Exception e) { throw new IllegalArgumentException("Impossible de charger le fichier de configuration : " + confFileUrl, e); } } /** * Chargement d'une configuration. * @param configurationFileName Chemin du fichier de conf * @param confClass Class de l'objet portant la conf * @return Instance de la configuration charg�e � partir du fichier */ public static final <D extends Object> D loadJsonConf(final String configurationFileName, final Class<D> confClass) { try { return JsonConfReader.loadJsonConf(new File(configurationFileName).toURI().toURL(), confClass); } catch (final MalformedURLException e) { throw new RuntimeException("Erreur de lecture de la conf", e); } } private static String escapeComments(final String confJson) { String escapedConfJson = confJson.replaceAll("//.*", ""); //comment de type // escapedConfJson = escapedConfJson.replaceAll("/\\*(.|[\\r\\n])*?\\*/", ""); //comment de type /* */ return escapedConfJson; } private static String cleanEmptyElement(final String confJson) { final String escapedConfJson = confJson.replaceAll(",[\\s]*([\\]\\}])", "$1"); //, <spaces> } ou ] return escapedConfJson; } private static String readConf(final URL url) { final StringBuilder sb = new StringBuilder(); try { //on lit le fichier final InputStream in = url.openStream(); try { final Reader isr = new InputStreamReader(in); try { final BufferedReader br = new BufferedReader(isr); try { String currentLine; while ((currentLine = br.readLine()) != null) { sb.append(currentLine).append('\n'); } } finally { br.close(); } } finally { isr.close(); } } finally { in.close(); } } catch (final IOException e) { throw new RuntimeException("Erreur de lecture de la conf", e); } return sb.toString(); } }