001/* $Id: ParserFeatureSetterFactory.java 476205 2006-11-17 16:43:10Z dennisl $
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
020package org.apache.commons.digester;
021
022import java.util.Properties;
023
024import javax.xml.parsers.ParserConfigurationException;
025import javax.xml.parsers.SAXParser;
026import javax.xml.parsers.SAXParserFactory;
027
028import org.apache.commons.digester.parser.GenericParser;
029import org.apache.commons.digester.parser.XercesParser;
030
031import org.xml.sax.SAXException;
032import org.xml.sax.SAXNotRecognizedException;
033import org.xml.sax.SAXNotSupportedException;
034
035/**
036 * Creates a <code>SAXParser</code> based on the underlying parser.
037 * Allows logical properties depending on logical parser versions
038 * to be set.
039 *
040 * @since 1.6
041 */
042public class ParserFeatureSetterFactory {
043
044    /**
045     * <code>true</code> is Xerces is used.
046     */
047    private static boolean isXercesUsed; 
048
049    static {
050        try{
051            // Use reflection to avoid a build dependency with Xerces.
052            //
053            // Note that this does not detect Sun's repackaging of 
054            // Xerces as com.sun.org.apache.xerces; perhaps it should?
055            SAXParserFactory factory = SAXParserFactory.newInstance();
056            if (factory.getClass().getName().startsWith("org.apache.xerces")) {
057                isXercesUsed = true;
058            }
059        } catch (Exception ex) {
060            isXercesUsed = false;
061        }
062    }
063
064    /**
065     * Create a new <code>SAXParser</code>
066     * @param properties (logical) properties to be set on parser
067     * @return a <code>SAXParser</code> configured based on the underlying
068     * parser implementation.
069     */
070    public static SAXParser newSAXParser(Properties properties)
071            throws ParserConfigurationException, 
072                   SAXException,
073                   SAXNotRecognizedException, 
074                   SAXNotSupportedException {
075
076        if (isXercesUsed){
077            return XercesParser.newSAXParser(properties);
078        } else {
079            return GenericParser.newSAXParser(properties);
080        }
081    }
082
083}