/******************************************************************************* * Copyright (c) 2010 Robert "Unlogic" Olofsson (unlogic@unlogic.se). * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl-3.0-standalone.html ******************************************************************************/ package se.unlogic.standardutils.settings; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import se.unlogic.standardutils.numbers.NumberUtils; import se.unlogic.standardutils.xml.XMLUtils; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class XMLSettingNode implements SettingNode { private final Element element; private final XPath xpath; public XMLSettingNode(String path) throws SAXException, IOException, ParserConfigurationException { Document doc = XMLUtils.parseXmlFile(path, false,false); this.element = doc.getDocumentElement(); this.xpath = XPathFactory.newInstance().newXPath(); } public XMLSettingNode(Document doc) { this.element = doc.getDocumentElement(); this.xpath = XPathFactory.newInstance().newXPath(); } public XMLSettingNode(Element element) { this.element = element; this.xpath = XPathFactory.newInstance().newXPath(); } public XMLSettingNode(File configurationFile) throws SAXException, IOException, ParserConfigurationException { Document doc = XMLUtils.parseXmlFile(configurationFile, false); this.element = doc.getDocumentElement(); this.xpath = XPathFactory.newInstance().newXPath(); } public Boolean getBoolean(String expression) { return Boolean.valueOf(this.getString(expression)); } public boolean getPrimitiveBoolean(String expression) { return Boolean.parseBoolean(this.getString(expression)); } public Double getDouble(String expression) { String value = this.getString(expression); if(value != null){ return NumberUtils.toDouble(value); } return null; } public List<Double> getDoubles(String expression) { NodeList nodes = this.getNodeList(expression); List<Double> doubles = new ArrayList<Double>(); for (int i = 0; i < nodes.getLength(); i++) { String value = nodes.item(i).getTextContent(); if(value != null){ Double numberValue = NumberUtils.toDouble(value); if(numberValue != null){ doubles.add(numberValue); } } } return doubles; } public int getInt(String expression) { String value = this.getString(expression); if(value != null && NumberUtils.isInt(value)){ return NumberUtils.toInt(value); } return 0; } public Integer getInteger(String expression) { String value = this.getString(expression); if(value != null){ return NumberUtils.toInt(value); } return null; } public List<Integer> getIntegers(String expression) { NodeList nodes = this.getNodeList(expression); List<Integer> integers = new ArrayList<Integer>(); for (int i = 0; i < nodes.getLength(); i++) { String value = nodes.item(i).getTextContent(); if(value != null){ Integer numberValue = NumberUtils.toInt(value); if(numberValue != null){ integers.add(numberValue); } } } return integers; } public Long getLong(String expression) { String value = this.getString(expression); if(value != null){ return NumberUtils.toLong(value); } return null; } public List<Long> getLongs(String expression) { NodeList nodes = this.getNodeList(expression); List<Long> longs = new ArrayList<Long>(); for (int i = 0; i < nodes.getLength(); i++) { String value = nodes.item(i).getTextContent(); if(value != null){ Long numberValue = NumberUtils.toLong(value); if(numberValue != null){ longs.add(numberValue); } } } return longs; } public XMLSettingNode getSetting(String expression) { Element element = this.getElement(expression); if(element == null){ return null; } return new XMLSettingNode(element); } public List<XMLSettingNode> getSettings(String expression) { NodeList nodes = this.getNodeList(expression); List<XMLSettingNode> settingNodes = new ArrayList<XMLSettingNode>(); for(int i = 0; i < nodes.getLength(); i++){ settingNodes.add(new XMLSettingNode((Element)nodes.item(i))); } return settingNodes; } public String getString(String expression) { try { return this.xpath.evaluate(expression, this.element); } catch (XPathExpressionException e) { return null; } } public List<String> getStrings(String expression) { NodeList nodes = this.getNodeList(expression); if(nodes != null && nodes.getLength() > 0){ List<String> strings = new ArrayList<String>(); for (int i = 0; i < nodes.getLength(); i++) { strings.add(nodes.item(i).getTextContent()); } return strings; } return null; } private NodeList getNodeList(String expression){ try { return (NodeList) this.xpath.evaluate(expression, this.element, XPathConstants.NODESET); } catch(XPathExpressionException e) { return null; } } private Element getElement(String expression){ try { return (Element) this.xpath.evaluate(expression, this.element, XPathConstants.NODE); } catch(XPathExpressionException e) { return null; } } public String getElementName(){ return element.getTagName(); } }