org.apache.jasper.xmlparser.ParserUtils Maven / Gradle / Ivy
The newest version!
/* * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved. * Copyright 2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jasper.xmlparser; import java.io.*; import java.net.URI; import java.net.URLEncoder; import java.util.HashMap; import java.util.StringTokenizer; import java.util.logging.Logger; import java.util.logging.Level; import java.security.AccessController; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.XMLConstants; import org.apache.jasper.Constants; import org.apache.jasper.JasperException; import org.apache.jasper.security.PrivilegedGetTccl; import org.apache.jasper.security.PrivilegedSetTccl; import org.apache.jasper.compiler.Localizer; import org.w3c.dom.Comment; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import org.w3c.dom.ls.LSResourceResolver; import org.w3c.dom.ls.LSInput; import org.xml.sax.EntityResolver; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; /** * XML parsing utilities for processing web application deployment * descriptor and tag library descriptor files. FIXME - make these * use a separate class loader for the parser to be used. * * @author Craig R. McClanahan * @version $Revision: 1.11 $ $Date: 2007/05/05 05:32:59 $ */ public class ParserUtils { // Logger static Logger log = Logger.getLogger(ParserUtils.class.getName()); /** * An error handler for use when parsing XML documents. */ private static ErrorHandler errorHandler = new MyErrorHandler(); /** * An entity resolver for use when parsing XML documents. */ static EntityResolver entityResolver; static String schemaResourcePrefix; static String dtdResourcePrefix; static boolean isDtdResourcePrefixFileUrl = false; static boolean isSchemaResourcePrefixFileUrl = false; private static final String SCHEMA_LOCATION_ATTR = "schemaLocation"; private static HashMap
* that corresponds to the root node of the document tree. * * @param uri URI of the XML document being parsed * @param is Input source containing the deployment descriptor * * @exception JasperException if an I/O or parsing error has occurred */ public TreeNode parseXMLDocument(String uri, InputSource is) throws JasperException { return parseXMLDocument(uri, is, false); } /** * Parse the specified XML document, and return aschemaCache = new HashMap (); /** * List of the Public IDs that we cache, and their * associated location. This is used by * an EntityResolver to return the location of the * cached copy of a DTD. */ static final String[] CACHED_DTD_PUBLIC_IDS = { Constants.TAGLIB_DTD_PUBLIC_ID_11, Constants.TAGLIB_DTD_PUBLIC_ID_12, Constants.WEBAPP_DTD_PUBLIC_ID_22, Constants.WEBAPP_DTD_PUBLIC_ID_23, }; // START PWC 6386258 private static final String[] DEFAULT_DTD_RESOURCE_PATHS = { Constants.TAGLIB_DTD_RESOURCE_PATH_11, Constants.TAGLIB_DTD_RESOURCE_PATH_12, Constants.WEBAPP_DTD_RESOURCE_PATH_22, Constants.WEBAPP_DTD_RESOURCE_PATH_23, }; static final String[] CACHED_DTD_RESOURCE_PATHS = (String[])DEFAULT_DTD_RESOURCE_PATHS; private static final String[] DEFAULT_SCHEMA_RESOURCE_PATHS = { Constants.TAGLIB_SCHEMA_RESOURCE_PATH_20, Constants.TAGLIB_SCHEMA_RESOURCE_PATH_21, Constants.WEBAPP_SCHEMA_RESOURCE_PATH_24, Constants.WEBAPP_SCHEMA_RESOURCE_PATH_25, }; static final String[] CACHED_SCHEMA_RESOURCE_PATHS = (String[])DEFAULT_SCHEMA_RESOURCE_PATHS; // END PWC 6386258 // --------------------------------------------------------- Constructors public ParserUtils() { this(false); } public ParserUtils(boolean blockExternal) { if (entityResolver == null) { entityResolver = new MyEntityResolver(blockExternal); } } // --------------------------------------------------------- Static Methods public static void setEntityResolver(EntityResolver er) { entityResolver = er; } // START PWC 6386258 /** * Sets the path prefix URL for .xsd resources */ public static void setSchemaResourcePrefix(String prefix) { if (prefix != null && prefix.startsWith("file:")) { schemaResourcePrefix = uencode(prefix); isSchemaResourcePrefixFileUrl = true; } else { schemaResourcePrefix = prefix; isSchemaResourcePrefixFileUrl = false; } for (int i=0; i TreeNode TreeNode
* that corresponds to the root node of the document tree. * * @param uri URI of the XML document being parsed * @param is Input source containing the deployment descriptor * @param validate true if the XML document needs to be validated against * its DTD or schema, false otherwise * * @exception JasperException if an I/O or parsing error has occurred */ public TreeNode parseXMLDocument(String uri, InputSource is, boolean validate) throws JasperException { Document document = null; // Perform an XML parse of this document, via JAXP // START 6412405 ClassLoader currentLoader; if (Constants.IS_SECURITY_ENABLED) { PrivilegedGetTccl pa = new PrivilegedGetTccl(); currentLoader = AccessController.doPrivileged(pa); } else { currentLoader = Thread.currentThread().getContextClassLoader(); } try { if (Constants.IS_SECURITY_ENABLED) { PrivilegedSetTccl pa = new PrivilegedSetTccl(getClass().getClassLoader()); AccessController.doPrivileged(pa); } else { Thread.currentThread().setContextClassLoader( getClass().getClassLoader()); } // END 6412405 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); /* See CR 6399139 factory.setFeature( "http://apache.org/xml/features/validation/dynamic", true); */ DocumentBuilder builder = factory.newDocumentBuilder(); builder.setEntityResolver(entityResolver); builder.setErrorHandler(errorHandler); document = builder.parse(is); document.setDocumentURI(uri); if (validate) { Schema schema = getSchema(document); if (schema != null) { // Validate TLD against specified schema schema.newValidator().validate(new DOMSource(document)); } /* See CR 6399139 else { log.warning(Localizer.getMessage( "jsp.warning.dtdValidationNotSupported")); } */ } } catch (ParserConfigurationException ex) { throw new JasperException (Localizer.getMessage("jsp.error.parse.xml", uri), ex); } catch (SAXParseException ex) { throw new JasperException (Localizer.getMessage("jsp.error.parse.xml.line", uri, Integer.toString(ex.getLineNumber()), Integer.toString(ex.getColumnNumber())), ex); } catch (SAXException sx) { throw new JasperException (Localizer.getMessage("jsp.error.parse.xml", uri), sx); } catch (IOException io) { throw new JasperException (Localizer.getMessage("jsp.error.parse.xml", uri), io); // START 6412405 } finally { if (Constants.IS_SECURITY_ENABLED) { PrivilegedSetTccl pa = new PrivilegedSetTccl(currentLoader); AccessController.doPrivileged(pa); } else { Thread.currentThread().setContextClassLoader(currentLoader); } } // END 6412405 // Convert the resulting document to a graph of TreeNodes return (convert(null, document.getDocumentElement())); } /** * Parse the specified XML document, and return aTreeNode
* that corresponds to the root node of the document tree. * * @param uri URI of the XML document being parsed * @param is Input stream containing the deployment descriptor * * @exception JasperException if an I/O or parsing error has occurred */ public TreeNode parseXMLDocument(String uri, InputStream is) throws JasperException { return parseXMLDocument(uri, new InputSource(is), false); } /** * Parse the specified XML document, and return aTreeNode
* that corresponds to the root node of the document tree. * * @param uri URI of the XML document being parsed * @param is Input stream containing the deployment descriptor * @param validate true if the XML document needs to be validated against * its DTD or schema, false otherwise * * @exception JasperException if an I/O or parsing error has occurred */ public TreeNode parseXMLDocument(String uri, InputStream is, boolean validate) throws JasperException { return parseXMLDocument(uri, new InputSource(is), validate); } // ------------------------------------------------------ Protected Methods /** * Create and return a TreeNode that corresponds to the specified Node, * including processing all of the attributes and children nodes. * * @param parent The parent TreeNode (if any) for the new TreeNode * @param node The XML document Node to be converted */ protected TreeNode convert(TreeNode parent, Node node) { // Construct a new TreeNode for this node TreeNode treeNode = new TreeNode(node.getNodeName(), parent); // Convert all attributes of this node NamedNodeMap attributes = node.getAttributes(); if (attributes != null) { int n = attributes.getLength(); for (int i = 0; i < n; i++) { Node attribute = attributes.item(i); treeNode.addAttribute(attribute.getNodeName(), attribute.getNodeValue()); } } // Create and attach all children of this node NodeList children = node.getChildNodes(); if (children != null) { int n = children.getLength(); for (int i = 0; i < n; i++) { Node child = children.item(i); if (child instanceof Comment) continue; if (child instanceof Text) { String body = ((Text) child).getData(); if (body != null) { body = body.trim(); if (body.length() > 0) treeNode.setBody(body); } } else { TreeNode treeChild = convert(treeNode, child); } } } // Return the completed TreeNode graph return (treeNode); } // -------------------------------------------------------- Private Methods /* * Gets the compiled schema referenced by the given XML document. * * @param document The XML document to validate * * @return The schema against which to validate */ private static Schema getSchema(Document document) throws SAXException, JasperException { Schema schema = null; Element root = document.getDocumentElement(); NamedNodeMap map = root.getAttributes(); for (int i=0; map!=null && i
© 2015 - 2024 Weber Informatics LLC | Privacy Policy