diff options
Diffstat (limited to 'web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/CommonXML.java')
-rw-r--r-- | web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/CommonXML.java | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/CommonXML.java b/web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/CommonXML.java new file mode 100644 index 0000000000..8d685f3900 --- /dev/null +++ b/web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/CommonXML.java @@ -0,0 +1,112 @@ +/******************************************************************************* + * Copyright (c) 2004, 2017 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jst.jsp.core.internal.util; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.OutputStream; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.TransformerFactoryConfigurationError; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.eclipse.jst.jsp.core.internal.Logger; +import org.w3c.dom.Document; +import org.xml.sax.EntityResolver; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +public class CommonXML { + + public synchronized static DocumentBuilder getDocumentBuilder() { + DocumentBuilder result = null; + try { + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + documentBuilderFactory.setExpandEntityReferences(false); + + result = documentBuilderFactory.newDocumentBuilder(); + result.setEntityResolver(getEntityResolver()); + } + catch (ParserConfigurationException e) { + Logger.logException(e); + } + return result; + } + + public synchronized static DocumentBuilder getDocumentBuilder(boolean validating) { + DocumentBuilder result = null; + try { + DocumentBuilderFactory instance = DocumentBuilderFactory.newInstance(); + + instance.setValidating(validating); + instance.setExpandEntityReferences(false); + instance.setCoalescing(true); + result = instance.newDocumentBuilder(); + if (!validating) { + result.setEntityResolver(getEntityResolver()); + } + } + catch (ParserConfigurationException e) { + Logger.logException(e); + } + return result; + } + + public static void serialize(Document document, OutputStream ostream) throws IOException { + Source domSource = new DOMSource(document); + try { + Transformer serializer = TransformerFactory.newInstance().newTransformer(); + try { + serializer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$ + serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); //$NON-NLS-1$ //$NON-NLS-2$ + serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-16"); //$NON-NLS-1$ + } + catch (IllegalArgumentException e) { + // unsupported properties + } + serializer.transform(domSource, new StreamResult(ostream)); + } + catch (TransformerConfigurationException e) { + throw new IOException(e.getMessage()); + } + catch (TransformerFactoryConfigurationError e) { + throw new IOException(e.getMessage()); + } + catch (TransformerException e) { + throw new IOException(e.getMessage()); + } + } + + /** + * Returns an EntityResolver that won't try to load and resolve ANY + * entities + */ + private static EntityResolver getEntityResolver() { + EntityResolver resolver = new EntityResolver() { + public InputSource resolveEntity(String publicID, String systemID) throws SAXException, IOException { + InputSource result = new InputSource(new ByteArrayInputStream(new byte[0])); + result.setPublicId(publicID); + result.setSystemId(systemID != null ? systemID : "/_" + getClass().getName()); //$NON-NLS-1$ + return result; + } + }; + return resolver; + } +} |