org.mobicents.media.server.bootstrap.configuration.XmlConfigurationLoader.java Source code

Java tutorial

Introduction

Here is the source code for org.mobicents.media.server.bootstrap.configuration.XmlConfigurationLoader.java

Source

/*
 * TeleStax, Open Source Cloud Communications
 * Copyright 2011-2016, Telestax Inc and individual contributors
 * by the @authors tag. 
 *
 * This 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.1 of
 * the License, or (at your option) any later version.
 *
 * This software 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */

package org.mobicents.media.server.bootstrap.configuration;

import java.util.List;

import org.apache.commons.configuration2.HierarchicalConfiguration;
import org.apache.commons.configuration2.XMLConfiguration;
import org.apache.commons.configuration2.builder.fluent.Configurations;
import org.apache.commons.configuration2.ex.ConfigurationException;
import org.apache.commons.configuration2.tree.ImmutableNode;
import org.apache.log4j.Logger;
import org.mobicents.media.core.configuration.MediaConfiguration;
import org.mobicents.media.core.configuration.MediaServerConfiguration;
import org.mobicents.media.core.configuration.MgcpControllerConfiguration;
import org.mobicents.media.core.configuration.MgcpEndpointConfiguration;
import org.mobicents.media.core.configuration.NetworkConfiguration;
import org.mobicents.media.core.configuration.ResourcesConfiguration;

/**
 * Loads Media Server configurations from an XML file.
 * 
 * @author Henrique Rosa (henrique.rosa@telestax.com)
 *
 */
public class XmlConfigurationLoader implements ConfigurationLoader {

    private static final Logger log = Logger.getLogger(XmlConfigurationLoader.class);

    private final Configurations configurations;

    public XmlConfigurationLoader() {
        this.configurations = new Configurations();
    }

    @Override
    public MediaServerConfiguration load(String filepath) {
        // Default configuration
        MediaServerConfiguration configuration = new MediaServerConfiguration();

        // Read configuration from file
        XMLConfiguration xml;
        try {
            xml = this.configurations.xml(filepath);

            // Overwrite default configurations
            configureNetwork(xml.configurationAt("network"), configuration.getNetworkConfiguration());
            configureController(xml.configurationAt("controller"), configuration.getControllerConfiguration());
            configureMedia(xml.configurationAt("media"), configuration.getMediaConfiguration());
            configureResource(xml.configurationAt("resources"), configuration.getResourcesConfiguration());
        } catch (ConfigurationException | IllegalArgumentException e) {
            log.error("Could not load configuration from " + filepath + ". Using default values.");
        }
        return configuration;
    }

    private static void configureNetwork(HierarchicalConfiguration<ImmutableNode> src, NetworkConfiguration dst) {
        dst.setBindAddress(src.getString("bindAddress", NetworkConfiguration.BIND_ADDRESS));
        dst.setExternalAddress(src.getString("externalAddress", NetworkConfiguration.EXTERNAL_ADDRESS));
        dst.setNetwork(src.getString("network", NetworkConfiguration.NETWORK));
        dst.setSubnet(src.getString("subnet", NetworkConfiguration.SUBNET));
        dst.setSbc(src.getBoolean("sbc", NetworkConfiguration.SBC));
    }

    private static void configureController(HierarchicalConfiguration<ImmutableNode> src,
            MgcpControllerConfiguration dst) {
        // Basic Controller configuration
        dst.setAddress(src.getString("address", MgcpControllerConfiguration.ADDRESS));
        dst.setPort(src.getInt("port", MgcpControllerConfiguration.PORT));
        dst.setPoolSize(src.getInt("poolSize", MgcpControllerConfiguration.POOL_SIZE));
        dst.setConfiguration(src.getString("configuration", MgcpControllerConfiguration.CONFIGURATION));

        // Iterate over endpoint configuration
        List<HierarchicalConfiguration<ImmutableNode>> endpoints = src.childConfigurationsAt("endpoints");
        for (HierarchicalConfiguration<ImmutableNode> endpoint : endpoints) {
            MgcpEndpointConfiguration endpointConfig = new MgcpEndpointConfiguration();
            endpointConfig.setName(endpoint.getString("[@name]"));
            endpointConfig.setClassName(endpoint.getString("[@class]"));
            endpointConfig.setPoolSize(endpoint.getInt("[@poolSize]", MgcpEndpointConfiguration.POOL_SIZE));
            dst.addEndpoint(endpointConfig);
        }
    }

    private static void configureMedia(HierarchicalConfiguration<ImmutableNode> src, MediaConfiguration dst) {
        // Basic Media configuration
        dst.setTimeout(src.getInt("timeout", MediaConfiguration.TIMEOUT));
        dst.setLowPort(src.getInt("lowPort", MediaConfiguration.LOW_PORT));
        dst.setHighPort(src.getInt("highPort", MediaConfiguration.HIGH_PORT));
        dst.setJitterBufferSize(src.getInt("jitterBuffer[@size]", MediaConfiguration.JITTER_BUFFER_SIZE));

        // Iterate over codec configuration
        List<HierarchicalConfiguration<ImmutableNode>> codecs = src.childConfigurationsAt("codecs");
        for (HierarchicalConfiguration<ImmutableNode> codec : codecs) {
            dst.addCodec(codec.getString("[@name]"));
        }
    }

    private static void configureResource(HierarchicalConfiguration<ImmutableNode> src,
            ResourcesConfiguration dst) {
        dst.setLocalConnectionCount(
                src.getInt("localConnection[@poolSize]", ResourcesConfiguration.LOCAL_CONNECTION_COUNT));
        dst.setRemoteConnectionCount(
                src.getInt("remoteConnection[@poolSize]", ResourcesConfiguration.REMOTE_CONNECTION_COUNT));
        dst.setPlayerCount(src.getInt("player[@poolSize]", ResourcesConfiguration.PLAYER_COUNT));
        dst.setRecorderCount(src.getInt("recorder[@poolSize]", ResourcesConfiguration.RECORDER_COUNT));
        dst.setDtmfDetectorCount(src.getInt("dtmfDetector[@poolSize]", ResourcesConfiguration.DTMF_DETECTOR_COUNT));
        dst.setDtmfDetectorDbi(src.getInt("dtmfDetector[@dbi]", ResourcesConfiguration.DTMF_DETECTOR_DBI));
        dst.setDtmfGeneratorCount(
                src.getInt("dtmfGenerator[@poolSize]", ResourcesConfiguration.DTMF_GENERATOR_COUNT));
        dst.setDtmfGeneratorToneVolume(
                src.getInt("dtmfGenerator[@toneVolume]", ResourcesConfiguration.DTMF_GENERATOR_TONE_VOLUME));
        dst.setDtmfGeneratorToneDuration(
                src.getInt("dtmfGenerator[@toneDuration]", ResourcesConfiguration.DTMF_GENERATOR_TONE_DURATION));
        dst.setSignalDetectorCount(
                src.getInt("signalDetector[@poolSize]", ResourcesConfiguration.SIGNAL_DETECTOR_COUNT));
        dst.setSignalGeneratorCount(
                src.getInt("signalGenerator[@poolSize]", ResourcesConfiguration.SIGNAL_GENERATOR_COUNT));
    }

}