/*********************************************************************************** * * Copyright (c) 2014 Kamil Baczkowicz * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v1.0 which accompany this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * * The Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * * Kamil Baczkowicz - initial API and implementation and/or initial documentation * */ package pl.baczkowicz.mqttspy.daemon.configuration; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import pl.baczkowicz.mqttspy.common.generated.MqttConnectionDetails; import pl.baczkowicz.mqttspy.common.generated.ProtocolVersionEnum; import pl.baczkowicz.mqttspy.daemon.configuration.generated.MqttSpyDaemonConfiguration; import pl.baczkowicz.mqttspy.utils.MqttConfigurationUtils; import pl.baczkowicz.mqttspy.utils.MqttUtils; import pl.baczkowicz.spy.common.generated.ScriptDetails; import pl.baczkowicz.spy.configuration.PropertyFileLoader; import pl.baczkowicz.spy.exceptions.XMLException; import pl.baczkowicz.spy.files.FileUtils; import pl.baczkowicz.spy.xml.XMLParser; /** * Helper class for loading the daemon's configuration. */ public class MqttSpyDaemonConfigLoader extends PropertyFileLoader { /** Diagnostic logger. */ private final static Logger logger = LoggerFactory.getLogger(MqttSpyDaemonConfigLoader.class); private static String CLIENT_ID_REFIX = "mqttspy"; /** XML config parser. */ private final XMLParser parser; /** Daemon's configuration (once parsed). */ private MqttSpyDaemonConfiguration configuration; /** * Creates the loader. * * @throws XMLException Thrown if cannot read the properties file or instantiate the config parser */ public MqttSpyDaemonConfigLoader() throws XMLException { super(); readFromClassPath(MqttSpyDaemonConstants.DEFAULT_PROPERTIES_FILE_NAME); this.parser = new XMLParser(MqttSpyDaemonConstants.PACKAGE, new String[] { MqttConfigurationUtils.SPY_COMMON_SCHEMA, MqttConfigurationUtils.MQTT_COMMON_SCHEMA, MqttSpyDaemonConstants.SCHEMA}); } /** * Loads configuration from the given file. * * @param file The file to load from * * @return True if all OK */ public boolean loadConfiguration(final File file) { try { configuration = (MqttSpyDaemonConfiguration) parser.loadFromFile(file); populateDefaults(); return true; } catch (XMLException e) { logger.error("Cannot process the configuration file at " + file.getAbsolutePath(), e); } catch (FileNotFoundException e) { logger.error("Cannot read the configuration file from " + file.getAbsolutePath(), e); } return false; } /** * Loads configuration from the file location. * * @param configurationFile The file location to load from * * @return True if all OK */ public boolean loadConfiguration(final String configurationFile) { try { final InputStream is = FileUtils.loadFileByName(configurationFile); configuration = (MqttSpyDaemonConfiguration) parser.loadFromInputStream(is); populateDefaults(); return true; } catch (XMLException e) { logger.error("Cannot process the configuration from input stream", e); } catch (IOException e) { logger.error("Cannot read the configuration from input stream", e); } return false; } /** * Populates the connection configuration with default values. */ private void populateDefaults() { MqttConfigurationUtils.populateMessageLogDefaults(configuration.getConnection().getMessageLog()); populateDaemonDefaults(configuration.getConnection().getBackgroundScript()); generateClientIdIfMissing(configuration.getConnection()); } public static void populateDaemonDefaults(List<ScriptDetails> scripts) { for (final ScriptDetails scriptDetails : scripts) { if (scriptDetails.isRepeat() == null) { scriptDetails.setRepeat(false); } } } public static void generateClientIdIfMissing(final MqttConnectionDetails connection) { if (connection.getClientID().isEmpty() && !ProtocolVersionEnum.MQTT_3_1_1.equals(connection.getProtocol())) { logger.info("Client ID is empty and protocol version is not 3.1.1, so going to generate one..."); connection.setClientID(MqttUtils.generateClientIdWithTimestamp(CLIENT_ID_REFIX, ProtocolVersionEnum.MQTT_3_1)); logger.info("Generated Client ID is " + connection.getClientID()); } } /** * Gets the configuration value. * * @return The daemon's configuration */ public MqttSpyDaemonConfiguration getConfiguration() { return configuration; } /** * Sets the MQTT client ID prefix. * * @param prefix the prefix to set */ public static void setClientIdPrefix(final String prefix) { CLIENT_ID_REFIX = prefix; } }