package eu.dnetlib.miscutils.functional.xml;

import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import eu.dnetlib.miscutils.functional.UnaryFunction;

public class IndentXmlString implements UnaryFunction<String, String> {

	@Override
	public String evaluate(final String unformattedXml) {
		try {
			Source xmlInput = new StreamSource(new StringReader(unformattedXml));
			StringWriter stringWriter = new StringWriter();
			StreamResult xmlOutput = new StreamResult(stringWriter);
			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			// This statement works with JDK 6
			transformerFactory.setAttribute("indent-number", 2);

			Transformer transformer = transformerFactory.newTransformer();
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.transform(xmlInput, xmlOutput);
			return xmlOutput.getWriter().toString();
		} catch (TransformerException e) {
			throw new RuntimeException(e);
		}
	}

	public static String apply(final String xml) {
		return new IndentXmlString().evaluate(xml);
	}

}
