package org.tldgen.writers; import java.io.File; import java.io.IOException; import java.io.StringReader; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.sax.SAXSource; import javax.xml.transform.stream.StreamResult; import net.sf.saxon.TransformerFactoryImpl; import net.sf.saxon.event.SaxonOutputKeys; import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xml.sax.InputSource; /** * Parent class of any library writer * @author icoloma * */ public abstract class AbstractWriter { /** TLD File ident */ private String indentSpaces = "4"; /** true to prettify output */ private boolean formatOutput = true; private static Logger log = LoggerFactory.getLogger(AbstractWriter.class); static { // set saxon as the default XSLT engine System.setProperty("javax.xml.transform.TransformerFactory", TransformerFactoryImpl.class.getName()); } /** * Prettyprints the XML contents to the specified file */ protected void formatAndWriteXml(String xml, String filename) { try { log.info("Formatting XML and writing to file " + filename); if (formatOutput) { Transformer transformer = TransformerFactory.newInstance().newTransformer(); //transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", tabSpaces); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.METHOD, "html"); transformer.setOutputProperty(SaxonOutputKeys.INDENT_SPACES /*"{http://saxon.sf.net/}indent-spaces" */, indentSpaces); InputSource input = new InputSource(new StringReader(xml)); transformer.transform(new SAXSource(input), new StreamResult(new File(filename))); return; } } catch (TransformerException e) { log.warn("Error indenting output for '" + filename + "'. Either set formatOutput=false or check that javadoc contains only well-formed XML. The file will be saved as-is (" + e.getMessageAndLocation() + ")"); log.debug(e.getMessageAndLocation() + "\n" + xml); } try { FileUtils.writeStringToFile(new File(filename), xml); } catch (IOException e) { throw new RuntimeException(e); } return; } /* protected void formatAndWriteXml(String xml, String filename) throws XMLStreamException { Tidy tidy = new Tidy(); tidy.setXHTML(true); tidy.setQuiet(true); tidy.setSmartIndent(true); tidy.setSpaces(2); tidy.setTabsize(1); tidy.setDropEmptyParas(true); tidy.setWraplen(200); tidy.setOnlyErrors(true); FileOutputStream out = null; try { out = new FileOutputStream(filename); tidy.parse(new ByteArrayInputStream(xml.getBytes()), out); } catch (IOException e) { throw new RuntimeException(e); } finally { IOUtils.closeQuietly(out); } }*/ public void setIndentSpaces(String tabSpaces) { this.indentSpaces = tabSpaces; } public void setFormatOutput(boolean prettyPrint) { this.formatOutput = prettyPrint; } }