All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.agiletec.aps.util.ApsPropertiesDOM Maven / Gradle / Ivy

Go to download

Entando Engine: an agile, modern and user-centric open source Portal platform.

There is a newer version: 6.2.27
Show newest version
/*
 * 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 è: 
 * 


	Valore 1
	Valore 2
	....

 * @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 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 elements = this._rootElement.getChildren(TAB_ELEMENT);
		Iterator 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";
	
}