/*
* Copyright 2015-Present Entando Inc. (http://www.entando.com) All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.agiletec.aps.util;
import java.io.IOException;
import java.io.StringReader;
import java.util.Iterator;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Classe per la lettura e scrittura delle Properties da xml.
* Il formato dell'xml รจ:
*
<?xml version="1.0" encoding="UTF-8"?>
<properties>
<property key="Chiave1">Valore 1</property>
<property key="Chiave2">Valore 2</property>
....
</properties>
* @author E.Santoboni
*/
public class ApsPropertiesDOM {
private static final Logger _logger = LoggerFactory.getLogger(ApsPropertiesDOM.class);
/**
* Costruisce il Jdom Document in base alle properties inserite.
* @param prop le properties da cui ricavare il Documento Jdom
*/
public void buildJDOM(ApsProperties prop) {
this._doc = new Document();
this._rootElement = new Element(ROOT);
Iterator<Object> titlesIter = prop.keySet().iterator();
while (titlesIter.hasNext()) {
String attributeValue = (String) titlesIter.next();
String value = (String) prop.get(attributeValue);
if (null != value && value.trim().length() > 0) {
Element tag = new Element(TAB_ELEMENT);
tag.setAttribute(ATTRIBUTE_KEY, attributeValue);
tag.setText(value);
this._rootElement.addContent(tag);
}
}
this._doc.setRootElement(this._rootElement);
}
/**
* Restituisce il formato xml delle Properties.
* @return String Formato xml delle Properties.
*/
public String getXMLDocument(){
XMLOutputter out = new XMLOutputter();
Format format = Format.getPrettyFormat();
format.setIndent("");
out.setFormat(format);
return out.outputString(_doc);
}
public Element getRootElement() {
return (Element) this._doc.getRootElement().clone();
}
private void decodeDOM(String xmlText) {
SAXBuilder builder = new SAXBuilder();
builder.setValidation(false);
StringReader reader = new StringReader(xmlText);
try {
_doc = builder.build(reader);
_rootElement = _doc.getRootElement();
} catch (Throwable t) {
_logger.error("Parsing error. xml: {}", xmlText, t);
throw new RuntimeException("Error detected while parsing the XML", t);
}
}
private ApsProperties extractProperties() {
ApsProperties prop = new ApsProperties();
List<Element> elements = this._rootElement.getChildren(TAB_ELEMENT);
Iterator<Element> elementsIter = elements.iterator();
while (elementsIter.hasNext()) {
Element currentElement = (Element) elementsIter.next();
String key = currentElement.getAttributeValue(ATTRIBUTE_KEY);
String value = currentElement.getText();
prop.put(key, value);
}
return prop;
}
/**
* Estrae le Properies dal testo xml immesso.
* @param xml L'xml da cui estrarre le properties.
* @return Le properties cercate.
* @throws IOException
*/
public ApsProperties extractProperties(String xml) throws IOException {
ApsProperties prop = null;
this.decodeDOM(xml);
prop = this.extractProperties();
return prop;
}
private Document _doc;
private Element _rootElement;
private final String ROOT = "properties";
private final String TAB_ELEMENT = "property";
private final String ATTRIBUTE_KEY = "key";
}