/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2004-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho and others // All Rights Reserved. */ package mondrian.test.comp; import mondrian.olap.Util; import org.apache.xml.serialize.OutputFormat; import org.apache.xml.serialize.XMLSerializer; import org.eigenbase.xom.XOMUtil; import org.eigenbase.xom.wrappers.W3CDOMWrapper; import org.w3c.dom.*; import org.xml.sax.*; import java.io.*; import java.util.regex.Pattern; import javax.xml.parsers.*; /** * XML utility methods. */ class XmlUtility { static final Pattern WhitespacePattern = Pattern.compile("\\s*"); public static DocumentBuilder createDomParser( boolean validate, boolean ignoreIgnorableWhitespace, boolean usingSchema, ErrorHandler handler) { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { factory.setNamespaceAware(true); factory.setIgnoringElementContentWhitespace( ignoreIgnorableWhitespace); factory.setValidating(validate); // if this is true we are using XML Schema validation and not a DTD if (usingSchema) { factory.setAttribute( "http://xml.org/sax/features/validation", Boolean.TRUE); factory.setAttribute( "http://apache.org/xml/features/validation/schema", Boolean.TRUE); factory.setAttribute( "http://apache.org/xml/features/validation/schema-full-checking", Boolean.TRUE); factory.setAttribute( "http://apache.org/xml/features/validation/dynamic", Boolean.TRUE); } DocumentBuilder documentBuilder = factory.newDocumentBuilder(); if (handler != null) { documentBuilder.setErrorHandler(handler); } return documentBuilder; } catch (ParserConfigurationException e) { return null; } } public static Document getDocument(File file) throws IOException, SAXException { DocumentBuilder builder = createDomParser( true, true, true, new UtilityErrorHandler()); Document result = builder.parse(file); return result; } public static void save(Writer writer, Document document) throws IOException { OutputFormat outputFormat = new OutputFormat(document); outputFormat.setIndenting(true); outputFormat.setLineWidth(Integer.MAX_VALUE); outputFormat.setLineSeparator(Util.nl); try { XMLSerializer serializer = new XMLSerializer(writer, outputFormat); serializer.serialize(document); } finally { if (writer != null) { writer.close(); } } } public static String decodeEncodedString(String enc) { if (enc.indexOf('&') == -1) { return enc; } int len = enc.length(); StringBuilder result = new StringBuilder(len); for (int idx = 0; idx < len; idx++) { char ch = enc.charAt(idx); if (ch == '&' && enc.charAt(idx + 1) == 'l' && enc.charAt(idx + 2) == 't' && enc.charAt(idx + 3) == ';') { result.append('<'); idx += 3; } else if (ch == '&' && enc.charAt(idx + 1) == 'g' && enc.charAt(idx + 2) == 't' && enc.charAt(idx + 3) == ';') { result.append('>'); idx += 3; } else { result.append(ch); } } return result.toString(); } public static void stripWhitespace(Element element) { final NodeList childNodeList = element.getChildNodes(); for (int i = 0; i < childNodeList.getLength(); i++) { Node node = childNodeList.item(i); switch (node.getNodeType()) { case Node.TEXT_NODE: case Node.CDATA_SECTION_NODE: final String text = ((CharacterData) node).getData(); if (WhitespacePattern.matcher(text).matches()) { element.removeChild(node); --i; } break; case Node.ELEMENT_NODE: stripWhitespace((Element) node); break; } } } public static String toString(Element xmlRoot) { stripWhitespace(xmlRoot); return XOMUtil.wrapperToXml(new W3CDOMWrapper(xmlRoot, null), false); } public static class UtilityErrorHandler implements ErrorHandler { public void error(SAXParseException exc) { System.err.println("Error parsing file: " + exc); //exc.printStackTrace(System.err); } public void fatalError(SAXParseException exc) { System.err.println("Fatal error parsing file: " + exc); // exc.printStackTrace(System.err); } public void warning(SAXParseException exc) { System.err.println("SAX parsing exception: " + exc); // exc.printStackTrace(System.err); } } } // End XmlUtility.java