    001    /* $Id: ParserFeatureSetterFactory.java 729082 2008-12-23 20:04:44Z rahul $
    002     *
    003     * Licensed to the Apache Software Foundation (ASF) under one or more
    004     * contributor license agreements.  See the NOTICE file distributed with
    005     * this work for additional information regarding copyright ownership.
    006     * The ASF licenses this file to You under the Apache License, Version 2.0
    007     * (the "License"); you may not use this file except in compliance with
    008     * the License.  You may obtain a copy of the License at
    009     *
    010     *      http://www.apache.org/licenses/LICENSE-2.0
    011     *
    012     * Unless required by applicable law or agreed to in writing, software
    013     * distributed under the License is distributed on an "AS IS" BASIS,
    014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    015     * See the License for the specific language governing permissions and
    016     * limitations under the License.
    017     */
    018
    019
    020    package org.apache.commons.digester;
    021
    022    import java.util.Properties;
    023
    024    import javax.xml.parsers.ParserConfigurationException;
    025    import javax.xml.parsers.SAXParser;
    026    import javax.xml.parsers.SAXParserFactory;
    027    import javax.xml.validation.Schema;
    028
    029    import org.apache.commons.digester.parser.GenericParser;
    030    import org.apache.commons.digester.parser.XercesParser;
    031
    032    import org.xml.sax.SAXException;
    033    import org.xml.sax.SAXNotRecognizedException;
    034    import org.xml.sax.SAXNotSupportedException;
    035
    036    /**
    037     * Creates a <code>SAXParser</code> based on the underlying parser.
    038     * Allows logical properties depending on logical parser versions
    039     * to be set.
    040     *
    041     * @since 1.6
    042     * @deprecated Create an XMLParser instance yourself, configure validation
    043     *             appropriately, and pass it as a parameter to the
    044     *             {@link Digester} constructor, or use
    045     *             {@link Digester#setXMLSchema(Schema)} for validation.
    046     */
    047    public class ParserFeatureSetterFactory {
    048
    049        /**
    050         * <code>true</code> is Xerces is used.
    051         */
    052        private static boolean isXercesUsed;
    053
    054        static {
    055            try{
    056                // Use reflection to avoid a build dependency with Xerces.
    057                //
    058                // Note that this does not detect Sun's repackaging of
    059                // Xerces as com.sun.org.apache.xerces; perhaps it should?
    060                SAXParserFactory factory = SAXParserFactory.newInstance();
    061                if (factory.getClass().getName().startsWith("org.apache.xerces")) {
    062                    isXercesUsed = true;
    063                }
    064            } catch (Exception ex) {
    065                isXercesUsed = false;
    066            }
    067        }
    068
    069        /**
    070         * Create a new <code>SAXParser</code>
    071         * @param properties (logical) properties to be set on parser
    072         * @return a <code>SAXParser</code> configured based on the underlying
    073         * parser implementation.
    074         */
    075        public static SAXParser newSAXParser(Properties properties)
    076                throws ParserConfigurationException,
    077                       SAXException,
    078                       SAXNotRecognizedException,
    079                       SAXNotSupportedException {
    080
    081            if (isXercesUsed){
    082                return XercesParser.newSAXParser(properties);
    083            } else {
    084                return GenericParser.newSAXParser(properties);
    085            }
    086        }
    087
    088    }