package org.nextprot.api.commons.utils;
import com.google.common.base.Preconditions;
import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.StringReader;
import java.io.StringWriter;
public class XMLPrettyPrinter {
private static final TransformerFactory TRANSFORMER_FACTORY;
private static final String INDENTATION = " ";
private final Transformer transformer;
static {
TRANSFORMER_FACTORY = TransformerFactory.newInstance();
TRANSFORMER_FACTORY.setAttribute("indent-number", INDENTATION.length());
}
public XMLPrettyPrinter() throws TransformerConfigurationException {
transformer = TRANSFORMER_FACTORY.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
}
public String prettify(String xmlStr) throws TransformerException {
return prettify(xmlStr, 0);
}
public String prettify(String xmlStr, int level) throws TransformerException {
StreamResult result = new StreamResult(new StringWriter());
StreamSource source = new StreamSource(new StringReader(removeInitialIndentation(xmlStr)));
transformer.transform(source, result);
return indent(result.getWriter().toString(), level);
}
private static String removeInitialIndentation(String input) {
StringBuilder sb = new StringBuilder();
String[] lines = input.split("\n");
for (String line : lines) {
sb.append(line.trim());
}
return sb.toString();
}
private static String indent(String input, int level) {
StringBuilder sb = new StringBuilder();
String[] lines = input.split("\n");
String indentation = newIndentation(level);
for (String line : lines) {
sb.append(indentation);
sb.append(line);
sb.append("\n");
}
return sb.toString();
}
private static String newIndentation(int level) {
Preconditions.checkArgument(level>=0);
StringBuilder sb = new StringBuilder();
for(int i=0 ; i<level ;i++) {
sb.append(INDENTATION);
}
return sb.toString();
}
}