/*
* ###
* 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);
}
}
}