org.wso2.carbon.mediation.configadmin.ConfigAdmin.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.carbon.mediation.configadmin.ConfigAdmin.java

Source

/*
 *  Copyright (c) 2009, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package org.wso2.carbon.mediation.configadmin;

import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.util.XMLPrettyPrinter;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.SynapseException;
import org.apache.synapse.config.*;
import org.apache.synapse.config.xml.*;
import org.wso2.carbon.base.ServerConfiguration;
import org.wso2.carbon.mediation.initializer.AbstractServiceBusAdmin;
import org.wso2.carbon.mediation.initializer.ServiceBusConstants;
import org.wso2.carbon.mediation.initializer.configurations.*;
import org.wso2.carbon.mediation.initializer.persistence.MediationPersistenceManager;
import org.wso2.carbon.registry.core.session.UserRegistry;

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import java.io.*;
import java.util.*;
import java.util.concurrent.locks.Lock;

/**
 * This is an admin service for managing the SynapseConfiguration of a Carbon server. It can be
 * used to get the current active configuration and make modifications to it on the fly.
 */

@SuppressWarnings({ "UnusedDeclaration" })
public class ConfigAdmin extends AbstractServiceBusAdmin {

    final static String PROP_REPORT_CDATA = "http://java.sun.com/xml/stream/properties/report-cdata-event";
    private static final Log log = LogFactory.getLog(ConfigAdmin.class);

    /**
     * Get the current Synapse configuration serialized as an string
     *
     * @return return XML configuration serialized in to a string
     * @throws org.apache.axis2.AxisFault if an error occurs
     */
    public String getConfiguration() throws AxisFault {
        final Lock lock = getLock();
        try {
            lock.lock();

            // ConfigurationFactoryAndSerializerFinder might not have been initialized
            // and hence we need to call the getInstance to load the factories and serializers
            ConfigurationFactoryAndSerializerFinder.getInstance();

            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            XMLConfigurationSerializer.serializeConfiguration(getSynapseConfiguration(), stream);
            XMLInputFactory factory = XMLInputFactory.newInstance();
            if (factory.isPropertySupported(PROP_REPORT_CDATA)) {
                factory.setProperty(PROP_REPORT_CDATA, Boolean.TRUE);
            }
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(stream.toByteArray());
            org.wso2.carbon.mediation.configadmin.util.XMLPrettyPrinter xmlPrettyPrinter = new org.wso2.carbon.mediation.configadmin.util.XMLPrettyPrinter(
                    byteArrayInputStream);
            return xmlPrettyPrinter.xmlFormatWithComments();

        } catch (XMLStreamException e) {
            handleException("Error serializing the Synapse configuration : Error " + e.getMessage(), e);
        } catch (Exception e) {
            handleException("Error serializing the Synapse configuration : Error " + e.getMessage(), e);
        } finally {
            lock.unlock();
        }
        return "";
    }

    /**
     * Get the list of configurations available
     *
     * @return the list is retrieved from the registry
     * @throws org.apache.axis2.AxisFault if an error occurs
     */
    public ConfigurationInformation[] getConfigurationList() throws AxisFault {
        try {
            List<org.wso2.carbon.mediation.initializer.configurations.ConfigurationInformation> list = getConfigurationManager()
                    .getConfigurationsList();

            List<ConfigurationInformation> configList = new ArrayList<ConfigurationInformation>();
            for (org.wso2.carbon.mediation.initializer.configurations.ConfigurationInformation info : list) {
                ConfigurationInformation configInfo = new ConfigurationInformation();
                configInfo.setActive(info.isActive());
                configInfo.setName(info.getName());
                configInfo.setDescription(info.getDescription());

                configList.add(configInfo);
            }
            return configList.toArray(new ConfigurationInformation[configList.size()]);
        } catch (ConfigurationInitilizerException e) {
            handleException("Failed to get the configurations list", e);
        }
        return null;
    }

    /**
     * Delete a specific configuration identified by the name
     *
     * @param name name of the configuration
     * @return true if the configuration is deleted successfully
     * @throws org.apache.axis2.AxisFault if an error occurs
     */
    public boolean deleteConfiguration(String name) throws AxisFault {
        UserRegistry registry = (UserRegistry) getConfigSystemRegistry();
        try {
            getConfigurationManager().delete(name);
        } catch (ConfigurationInitilizerException e) {
            handleException("Error deleting the configuration: " + name, e);
        }
        return false;
    }

    /**
     * Update the active configuration with the new configuration
     *
     * @param configElement a SOAPElement for the configuration
     * @return true if the update is successful
     * @throws org.apache.axis2.AxisFault if an error occurs
     */
    public boolean updateConfiguration(OMElement configElement) throws AxisFault {
        Exception error = null;
        final Lock lock = getLock();
        try {
            lock.lock();
            ConfigurationUpdater updater = new ConfigurationUpdater(getServerContextInformation(),
                    getConfigContext(), getMediationPersistenceManager(), (UserRegistry) getConfigSystemRegistry());
            updater.update(configElement);

            MediationPersistenceManager pm = getMediationPersistenceManager();
            if (pm != null) {
                pm.saveItem(null, ServiceBusConstants.ITEM_TYPE_FULL_CONFIG);
            }

        } catch (Exception e) {
            handleException("Error while updating the Synapse configuration", e);
        } finally {
            lock.unlock();
        }

        return true;
    }

    public ValidationError[] validateConfiguration(OMElement configElement) {
        MediationPersistenceManager pm = getMediationPersistenceManager();
        if (pm != null) {
            String path = getSynapseConfiguration().getPathToConfigFile();
            MultiXMLConfigurationSerializer serializer = new MultiXMLConfigurationSerializer(path);
            if (!serializer.isWritable()) {
                return new ValidationError[] {
                        new ValidationError("Configuration Directory", "Locked by another process") };
            }
        }

        ConfigurationValidator validator = new ConfigurationValidator();
        ValidationError[] errors = validator.validate(configElement);
        if (errors != null && errors.length > 0) {
            return errors;
        }
        return null;
    }

    /**
     * Create a new synapse configuration in the specified path. Save the current
     * configuration and destroy it.
     *
     * @param name name of the configuration to be removed
     * @param description description for the configuration
     * @return true if the new configuration creation is successful
     * @throws org.apache.axis2.AxisFault if an error occurs
     */
    public boolean create(String name, String description) throws AxisFault {
        try {
            getConfigurationManager().create(name, description);
            return true;
        } catch (ConfigurationInitilizerException e) {
            handleException("Couldn't initialize the new configuration", e);
        }
        return false;
    }

    /**
     * Add an existing configuration to the ESB configuration management system
     * @param name name of the configuration
     *
     * @return true if the configuration is added successfully
     * @throws org.apache.axis2.AxisFault if an error occurs
     */
    public boolean addExistingConfiguration(String name) throws AxisFault {
        try {
            getConfigurationManager().addExistingConfiguration(name);
            return true;
        } catch (ConfigurationInitilizerException e) {
            handleException("Failed to add the existing configuration: " + name, e);
        }
        return false;
    }

    /**
     * Load the configuration from the given file
     *
     * @param name name of configuration
     * @throws org.apache.axis2.AxisFault if an error occurs
     * @return true if the new configuration is successful created
     */
    public boolean activate(String name) throws AxisFault {
        final Lock lock = getLock();
        try {
            lock.lock();
            getConfigurationManager().activate(name);
        } catch (Exception e) {
            handleException("Error creating a new Synapse configuration", e);
        } finally {
            lock.unlock();
        }

        return false;
    }

    public boolean saveConfigurationToDisk() throws AxisFault {
        if (log.isTraceEnabled()) {
            log.trace("Saving configuration..");
        }

        final Lock lock = getLock();
        try {
            lock.lock();
            SynapseConfiguration config = getSynapseConfiguration();
            FileOutputStream fos = new FileOutputStream(config.getPathToConfigFile());
            XMLConfigurationSerializer.serializeConfiguration(config, fos);
            try {
                fos.close();
                XMLPrettyPrinter.prettify(new File(config.getPathToConfigFile()));
            } catch (IOException e) {
                // ignore prettify errors
            }
            if (log.isTraceEnabled()) {
                log.trace("Configuration saved to disk");
            }
            return true;
        } catch (XMLStreamException e) {
            handleException("Could not save changes to disk." + e.getMessage() + " Check log for more details", e);
        } catch (FileNotFoundException e) {
            handleException("Could not locate the Synapse configuration file to save changes", e);
        } catch (SynapseException se) {
            handleException(
                    "Unable to update the Synapse configuration." + se.getMessage() + " Check log for more details",
                    se);
        } catch (Exception e) {
            handleException(
                    "Unable to update the Synapse configuration." + e.getMessage() + " Check log for more details",
                    e);
        } finally {
            lock.unlock();
        }
        return false;
    }

    private ConfigurationManager getConfigurationManager() {
        return (ConfigurationManager) getConfigContext().getProperty(ConfigurationManager.CONFIGURATION_MANAGER);
    }

    private String getParameter(String name) {
        String value = System.getProperty(name);
        if (value != null) {
            return value;
        }

        ServerConfiguration serverConfig = ServerConfiguration.getInstance();
        return serverConfig.getFirstProperty(name);
    }

    private void handleException(String msg, Exception e) throws AxisFault {
        log.error(msg, e);
        throw new AxisFault(msg, e);
    }
}