package com.coverity.ps.common.config;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/*
* Manages XML configuration data
*/
public class ConfigurationManager {
private static ConfigurationManager instance;
private static final String CONFIGURATION_FILE = "config/coverity-bn-config.xml";
private String address;
private int port;
private String user;
private String password;
private List<ScmConfigData> scmStreamData = new ArrayList<ScmConfigData>();
private List<ScmConfigData> scmProjectData = new ArrayList<ScmConfigData>();
private String scmClass;
private String bugTrackingClass;
private String bugTrackingAddress;
private String bugTrackingUser;
private String bugTrackingPassword;
private Map<String, String> bugProperties;
private ConfigurationManager() {
try {
loadConfigurationFile();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
}
public static ConfigurationManager getInstance() {
if (instance == null) {
instance = new ConfigurationManager();
}
return instance;
}
private void loadConfigurationFile() throws SAXException, IOException,
ParserConfigurationException {
DocumentBuilderFactory documentFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder documentBuilder = documentFactory.newDocumentBuilder();
Document document = documentBuilder.parse(CONFIGURATION_FILE);
// get cim tag
NodeList cimNode = document.getDocumentElement().getElementsByTagName("cim");
if (cimNode.getLength() != 1) {
System.err.println("Invalid or missing cim configuration tag!");
}
Element cimElem = (Element) cimNode.item(0);
NodeList addressNode = cimElem.getElementsByTagName("address");
if (addressNode.getLength() != 1) {
System.err.println("Invalid or missing address configuration tag!");
}
Element addressElem = (Element) addressNode.item(0);
this.address = addressElem.getTextContent();
NodeList portNode = cimElem.getElementsByTagName("port");
if (portNode.getLength() != 1) {
System.err.println("Invalid or missing port configuration tag!");
}
Element portElem = (Element) portNode.item(0);
this.port = Integer.parseInt(portElem.getTextContent());
NodeList userNode = cimElem.getElementsByTagName("user");
if (userNode.getLength() != 1) {
System.err.println("Invalid or missing user configuration tag!");
}
Element userElem = (Element) userNode.item(0);
this.user = userElem.getTextContent();
NodeList passwordNode = cimElem.getElementsByTagName("password");
if (passwordNode.getLength() != 1) {
System.err.println("Invalid or missing password configuration tag!");
}
Element passwordElem = (Element) passwordNode.item(0);
this.password = passwordElem.getTextContent();
// get scm tag
NodeList scmNode = document.getDocumentElement().getElementsByTagName("scm");
if (scmNode.getLength() == 1) {
Element scmElem = (Element) scmNode.item(0);
NodeList systemNode = scmElem.getElementsByTagName("system");
if (systemNode.getLength() != 1) {
System.err.println("Invalid or missing system configuration tag!");
}
Element systemElem = (Element) systemNode.item(0);
this.scmClass = systemElem.getAttribute("class");
Map<String, String> data = new HashMap<String, String>();
// stream data
NodeList streamNodes = systemElem.getElementsByTagName("stream");
for(int i = 0; i < streamNodes.getLength(); i++) {
Element streamElem = (Element) streamNodes.item(i);
String name = streamElem.getAttribute("name");
data.put("name", name);
String cimStripPath = getElement(streamElem, "cim-strip-path", 1);
if (cimStripPath != null)
data.put("cimStripPath", cimStripPath);
String localPrependPath = getElement(streamElem, "local-prepend-path", 1);
if (localPrependPath != null)
data.put("localPrependPath", localPrependPath);
String repository = getElement(streamElem, "repository", 1);
if (repository != null)
data.put("repository", repository);
scmStreamData.add(new ScmConfigData(data));
}
}
// get bug tracking tag
NodeList bugTrackingNode = document.getDocumentElement().getElementsByTagName("bug-tracking");
if (bugTrackingNode.getLength() == 1) {
Element bugTrackingElem = (Element) bugTrackingNode.item(0);
NodeList systemNode = bugTrackingElem.getElementsByTagName("system");
if (systemNode.getLength() != 1) {
System.err.println("Invalid or missing system configuration tag!");
}
Element systemElem = (Element) systemNode.item(0);
this.bugTrackingClass = systemElem.getAttribute("class");
NodeList bugTrackingAddressNode = systemElem.getElementsByTagName("address");
if (bugTrackingAddressNode.getLength() != 1) {
System.err.println("Invalid or missing Address configuration tag!");
}
Element bugTrackingAddressElem = (Element) bugTrackingAddressNode.item(0);
this.bugTrackingAddress = bugTrackingAddressElem.getTextContent();
NodeList bugTrackingUserNode = systemElem.getElementsByTagName("user");
if (bugTrackingUserNode.getLength() != 1) {
System.err.println("Invalid or missing user configuration tag!");
}
Element bugTrackingUserElem = (Element) bugTrackingUserNode.item(0);
this.bugTrackingUser = bugTrackingUserElem.getTextContent();
NodeList bugTrackingPasswordNode = systemElem.getElementsByTagName("password");
if (bugTrackingPasswordNode.getLength() != 1) {
System.err.println("Invalid or missing password configuration tag!");
}
Element bugTrackingPasswordElem = (Element) bugTrackingPasswordNode.item(0);
this.bugTrackingPassword = bugTrackingPasswordElem.getTextContent();
// get properties
this.bugProperties = new HashMap<String, String>();
NodeList bugPropertiesNode = systemElem.getElementsByTagName("property");
for (int i = 0; i < bugPropertiesNode.getLength(); i++) {
Element bugPropertyNode = (Element) bugPropertiesNode.item(i);
bugProperties.put(bugPropertyNode.getAttribute("name"),
bugPropertyNode.getTextContent());
}
}
}
private String getElement(Element systemElem, String name, int nbElements) {
NodeList nl = systemElem.getElementsByTagName(name);
if (nl.getLength() != nbElements) {
System.err.println("Invalid or missing " + name + " configuration tag!");
return null;
}
Element elem = (Element) nl.item(0);
return elem.getTextContent();
}
public String getBugTrackingClass() {
return bugTrackingClass;
}
public String getBugTrackingAddress() {
return bugTrackingAddress;
}
public String getBugTrackingUser() {
return bugTrackingUser;
}
public String getBugTrackingPassword() {
return bugTrackingPassword;
}
public String getScmClass() {
return scmClass;
}
public List<ScmConfigData> getScmStreamData() {
return scmStreamData;
}
public List<ScmConfigData> getScmProjectData() {
return scmProjectData;
}
public String getAddress() {
return address;
}
public int getPort() {
return port;
}
public String getUser() {
return user;
}
public String getPassword() {
return password;
}
public Map<String, String> getBugProperties() {
return bugProperties;
}
}