com.photon.phresco.framework.impl.ConfigurationWriter.java Source code

Java tutorial

Introduction

Here is the source code for com.photon.phresco.framework.impl.ConfigurationWriter.java

Source

/*
 * ###
 * Phresco Framework Implementation
 * 
 * Copyright (C) 1999 - 2012 Photon Infotech Inc.
 * 
 * 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 com.photon.phresco.framework.impl;

import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.apache.commons.collections.CollectionUtils;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import com.photon.phresco.configuration.ConfigWriter;
import com.photon.phresco.configuration.Environment;
import com.photon.phresco.exception.PhrescoException;
import com.photon.phresco.model.PropertyInfo;
import com.photon.phresco.model.SettingsInfo;

public class ConfigurationWriter extends ConfigWriter {

    private ConfigurationReader reader = null;

    /**
     * Constructor of ConfigWriter
     * @param reader
     * @throws Exception 
     */
    public ConfigurationWriter(ConfigurationReader reader, boolean newFile) throws Exception {
        super(reader, newFile);
        this.reader = reader;
    }

    /**
     * creates the environment
     * @param selectedEnvs
     */
    public void createEnvironment(List<Environment> envs) {
        for (Environment env : envs) {
            Element envNode = getDocument().createElement("environment");
            envNode.setAttribute("name", env.getName());
            envNode.setAttribute("desc", env.getDesc());
            envNode.setAttribute("default", Boolean.toString(env.isDefaultEnv()));
            getRootElement().appendChild(envNode);
        }
    }

    /**
     * Delete the environments
     * @param selectedEnvs
     * @throws Exception 
     */
    public void deleteEnvironments(List<String> envNames) throws Exception {
        for (String envName : envNames) {
            String xpath = getXpathEnv(envName).toString();
            Element envNode = (Element) getNode(xpath);
            envNode.getParentNode().removeChild(envNode);
            if (!reader.canDelete(envNode)) {
                throw new Exception(envNode.getAttribute("name") + " can be deleted");
            }
        }
    }

    /**
     * Read the Environments to create the configurations
     * @param selectedEnvStr
     * @throws PhrescoException
     */
    public void createConfiguration(String selectedEnvStr, SettingsInfo settingsInfo) throws PhrescoException {
        String[] envs = selectedEnvStr.split(",");
        for (String envName : envs) {
            Element environment = reader.getEnvironment(envName);
            createConfiguration(settingsInfo, environment, false);
        }
    }

    /**
     * Delete the selected configurations of the given environments 
     * @param configNames
     * @throws XPathExpressionException
     * @throws PhrescoException 
     */
    public void deleteConfigurations(Map<String, List<String>> configurations)
            throws XPathExpressionException, PhrescoException {
        Set<String> keySet = configurations.keySet();
        for (String envName : keySet) {
            List<String> configNames = configurations.get(envName);
            deleteConfiguration(envName, configNames);
        }
    }

    public void updateConfiguration(String envName, String oldConfigName, SettingsInfo settingsInfo)
            throws XPathExpressionException, PhrescoException {
        Node environment = getNode(getXpathEnv(envName).toString());
        if (environment == null) {
            throw new PhrescoException("Environmnet not found to delete the Configuration");
        }
        Node oldConfigNode = getNode(getXpathConfigByEnv(envName, oldConfigName));
        if (oldConfigNode == null) {
            throw new PhrescoException("Configuration not found to delete");
        }

        Element configElement = createConfigElement(settingsInfo);
        environment.replaceChild(configElement, oldConfigNode);
    }

    public void updateTestConfiguration(SettingsInfo settingsInfo, String browser, String resultConfigXml)
            throws PhrescoException {
        try {
            Node configNode = getNode("environment");
            Node node = getNode("environment/" + settingsInfo.getType());
            Node browserNode = getNode("environment/Browser");
            if (node != null) {
                configNode.removeChild(node);
            }

            if (browserNode != null) {
                browserNode.setTextContent(browser);
            } else {
                Element browserEle = getDocument().createElement("Browser");
                browserEle.setTextContent(browser);
                configNode.appendChild(browserEle);
            }
            configNode.appendChild(createConfigElement(settingsInfo));
        } catch (Exception e) {
            throw new PhrescoException("Configuration not found to delete");
        }
    }

    /**
     * Created the configuration xml of selected environment using File object
     * @param configXmlPath
     * @param selectedEnvStr
     * @throws Exception
     */
    public void saveXml(File configXmlPath) throws Exception {
        super.writeXml(new FileOutputStream(configXmlPath));
    }

    private void deleteConfiguration(String envName, List<String> configNames)
            throws XPathExpressionException, PhrescoException {
        Node environment = getNode(getXpathEnv(envName).toString());
        if (environment == null) {
            throw new PhrescoException("Environmnet not found to delete the Configuration");
        }
        for (String configName : configNames) {
            String delete = "/environments/environment[@name='testEnvironment']/*[@name='TestServer']";
            Node configNode = getNode(getXpathConfigByEnv(envName, configName));
            if (configNode == null) {
                throw new PhrescoException("Configuration not found to delete");
            }
            environment.removeChild(configNode);

        }
    }

    private String getXpathConfigByEnv(String envName, String configName) {
        StringBuilder expBuilder = getXpathEnv(envName);
        expBuilder.append("/*[@name='");
        expBuilder.append(configName);
        expBuilder.append("']");
        return expBuilder.toString();
    }

    private StringBuilder getXpathEnv(String envName) {
        StringBuilder expBuilder = new StringBuilder();
        expBuilder.append("/environments/environment[@name='");
        expBuilder.append(envName);
        expBuilder.append("']");
        return expBuilder;
    }

    private Node getNode(String xpath) throws XPathExpressionException {
        XPathExpression xPathExpression = getXPath().compile(xpath);
        return (Node) xPathExpression.evaluate(reader.getDocument(), XPathConstants.NODE);
    }

    private XPath getXPath() {
        XPathFactory xPathFactory = XPathFactory.newInstance();
        return xPathFactory.newXPath();
    }

    /**
     * Create the Configuration element of selected Environments
     * @param configList
     * @param envName
     * @param defaultEnv
     * @throws PhrescoException
     */
    private void createConfiguration(SettingsInfo settingsInfo, Element envNode, boolean defaultEnv)
            throws PhrescoException {
        Element configNode = createConfigElement(settingsInfo);
        envNode.appendChild(configNode);
        getRootElement().appendChild(envNode);
    }

    private Element createConfigElement(SettingsInfo settingsInfo) {
        Element configNode = getDocument().createElement(settingsInfo.getType());
        configNode.setAttribute("name", settingsInfo.getName());
        configNode.setAttribute("desc", settingsInfo.getDescription());
        List<String> appliesTo = settingsInfo.getAppliesTo();
        if (CollectionUtils.isNotEmpty(appliesTo)) {
            String appliesToAsStr = getAppliesToAsStr(appliesTo);
            configNode.setAttribute("appliesTo", appliesToAsStr);
        }
        createProperties(configNode, settingsInfo.getPropertyInfos());
        return configNode;
    }

    private String getAppliesToAsStr(List<String> appliesTo) {
        String appliesToStr = "";
        for (String applies : appliesTo) {
            appliesToStr += applies + ",";
        }
        return appliesToStr.substring(0, appliesToStr.length() - 1);
    }

    /**
     * create the properties to the configuration element
     * @param configNode
     * @param propertyInfos
     */
    private void createProperties(Element configNode, List<PropertyInfo> propertyInfos) {
        for (PropertyInfo propertyInfo : propertyInfos) {
            String key = propertyInfo.getKey();
            String value = propertyInfo.getValue();
            Element propNode = getDocument().createElement(key);
            propNode.setTextContent(value);
            configNode.appendChild(propNode);
        }
    }

}