/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.tomcat.util.descriptor.web;

import java.io.IOException;
import java.net.URL;

import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.util.descriptor.DigesterFactory;
import org.apache.tomcat.util.descriptor.InputSourceUtil;
import org.apache.tomcat.util.descriptor.XmlErrorHandler;
import org.apache.tomcat.util.digester.Digester;
import org.apache.tomcat.util.res.StringManager;
import org.xml.sax.InputSource;
import org.xml.sax.SAXParseException;

public class WebXmlParser {

    private final Log log = LogFactory.getLog(WebXmlParser.class); // must not be static

    
The string resources for this package.
/** * The string resources for this package. */
private static final StringManager sm = StringManager.getManager(Constants.PACKAGE_NAME);
The Digester we will use to process web application deployment descriptor files.
/** * The <code>Digester</code> we will use to process web application * deployment descriptor files. */
private final Digester webDigester; private final WebRuleSet webRuleSet;
The Digester we will use to process web fragment deployment descriptor files.
/** * The <code>Digester</code> we will use to process web fragment * deployment descriptor files. */
private final Digester webFragmentDigester; private final WebRuleSet webFragmentRuleSet; public WebXmlParser(boolean namespaceAware, boolean validation, boolean blockExternal) { webRuleSet = new WebRuleSet(false); webDigester = DigesterFactory.newDigester(validation, namespaceAware, webRuleSet, blockExternal); webDigester.getParser(); webFragmentRuleSet = new WebRuleSet(true); webFragmentDigester = DigesterFactory.newDigester(validation, namespaceAware, webFragmentRuleSet, blockExternal); webFragmentDigester.getParser(); }
Parse a web descriptor at a location.
Params:
  • url – the location; if null no load will be attempted
  • dest – the instance to be populated by the parse operation
  • fragment – indicate if the descriptor is a web-app or web-fragment
Throws:
  • IOException – if there was a problem reading from the URL
Returns:true if the descriptor was successfully parsed
/** * Parse a web descriptor at a location. * * @param url the location; if null no load will be attempted * @param dest the instance to be populated by the parse operation * @param fragment indicate if the descriptor is a web-app or web-fragment * @return true if the descriptor was successfully parsed * @throws IOException if there was a problem reading from the URL */
public boolean parseWebXml(URL url, WebXml dest, boolean fragment) throws IOException { if (url == null) { return true; } InputSource source = new InputSource(url.toExternalForm()); source.setByteStream(url.openStream()); return parseWebXml(source, dest, fragment); } public boolean parseWebXml(InputSource source, WebXml dest, boolean fragment) { boolean ok = true; if (source == null) { return ok; } XmlErrorHandler handler = new XmlErrorHandler(); Digester digester; WebRuleSet ruleSet; if (fragment) { digester = webFragmentDigester; ruleSet = webFragmentRuleSet; } else { digester = webDigester; ruleSet = webRuleSet; } digester.push(dest); digester.setErrorHandler(handler); if(log.isDebugEnabled()) { log.debug(sm.getString("webXmlParser.applicationStart", source.getSystemId())); } try { digester.parse(source); if (handler.getWarnings().size() > 0 || handler.getErrors().size() > 0) { ok = false; handler.logFindings(log, source.getSystemId()); } } catch (SAXParseException e) { log.error(sm.getString("webXmlParser.applicationParse", source.getSystemId()), e); log.error(sm.getString("webXmlParser.applicationPosition", "" + e.getLineNumber(), "" + e.getColumnNumber())); ok = false; } catch (Exception e) { log.error(sm.getString("webXmlParser.applicationParse", source.getSystemId()), e); ok = false; } finally { InputSourceUtil.close(source); digester.reset(); ruleSet.recycle(); } return ok; }
Sets the ClassLoader to be used for creating descriptor objects.
Params:
  • classLoader – the ClassLoader to be used for creating descriptor objects
/** * Sets the ClassLoader to be used for creating descriptor objects. * @param classLoader the ClassLoader to be used for creating descriptor objects */
public void setClassLoader(ClassLoader classLoader) { webDigester.setClassLoader(classLoader); webFragmentDigester.setClassLoader(classLoader); } }