package org.wikipedia.miner.web.util; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Set; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.log4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class HubConfiguration { private enum ParamName{proxy, wikipedia, unknown} ; private String proxyHost ; private String proxyPort ; private String proxyUser ; private String proxyPassword ; private String defaultWikipedia = null; private HashMap<String,String> wikiDescriptions ; private HashMap<String,String> wikiConfigs ; public String getProxyHost() { return proxyHost; } public String getProxyPort() { return proxyPort; } public String getProxyUser() { return proxyUser; } public String getProxyPassword() { return proxyPassword; } public String getDefaultWikipediaName() { return defaultWikipedia; } public String[] getWikipediaNames() { Set<String> wikipediaNames = wikiConfigs.keySet() ; return wikipediaNames.toArray(new String[wikipediaNames.size()]) ; } public String getWikipediaConfig(String wikiName) { return wikiConfigs.get(wikiName) ; } public String getWikipediaDescription(String wikiName) { return wikiDescriptions.get(wikiName) ; } public HubConfiguration(File configFile) throws ParserConfigurationException, IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, SAXException { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(configFile); doc.getDocumentElement().normalize(); initFromXml(doc.getDocumentElement()) ; } private void initFromXml(Element xml) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException { wikiDescriptions = new HashMap<String,String>() ; wikiConfigs = new HashMap<String,String>() ; String firstWikipedia = null ; NodeList children = xml.getChildNodes() ; for (int i=0 ; i<children.getLength() ; i++) { Node xmlChild = children.item(i) ; if (xmlChild.getNodeType() == Node.ELEMENT_NODE) { Element xmlParam = (Element)xmlChild ; String paramName = xmlParam.getNodeName() ; String paramValue = getParamValue(xmlParam) ; switch(resolveParamName(xmlParam.getNodeName())) { case proxy: proxyHost = xmlParam.getAttribute("host") ; proxyPort = xmlParam.getAttribute("port") ; proxyUser = xmlParam.getAttribute("user") ; proxyPassword = xmlParam.getAttribute("password") ; break ; case wikipedia: String wikiName = xmlParam.getAttribute("name") ; String description = xmlParam.getAttribute("description") ; boolean isDefault = false ; if (xmlParam.hasAttribute("default")) isDefault = Boolean.parseBoolean(xmlParam.getAttribute("default")) ; if (firstWikipedia == null) firstWikipedia = wikiName ; if (isDefault) defaultWikipedia = wikiName ; wikiDescriptions.put(wikiName, description) ; wikiConfigs.put(wikiName, paramValue) ; break ; default: Logger.getLogger(HubConfiguration.class).warn("Ignoring unknown parameter: '" + paramName + "'") ; } ; } if (defaultWikipedia == null) defaultWikipedia = firstWikipedia ; //TODO: throw fit if mandatory params (at least one wikipedia) are missing. } } private String getParamValue(Element xmlParam) { Node nodeContent = xmlParam.getChildNodes().item(0) ; if (nodeContent == null) return null ; if (nodeContent.getNodeType() != Node.TEXT_NODE) return null ; String content = nodeContent.getTextContent().trim() ; if (content.length() == 0) return null ; return content ; } private ParamName resolveParamName(String name) { try { return ParamName.valueOf(name.trim()) ; } catch (Exception e) { return ParamName.unknown ; } } }