1 /*
   2  * reserved comment block
   3  * DO NOT REMOVE OR ALTER!
   4  */
   5 /**
   6  * Licensed to the Apache Software Foundation (ASF) under one
   7  * or more contributor license agreements. See the NOTICE file
   8  * distributed with this work for additional information
   9  * regarding copyright ownership. The ASF licenses this file
  10  * to you under the Apache License, Version 2.0 (the
  11  * "License"); you may not use this file except in compliance
  12  * with the License. You may obtain a copy of the License at
  13  *
  14  * http://www.apache.org/licenses/LICENSE-2.0
  15  *
  16  * Unless required by applicable law or agreed to in writing,
  17  * software distributed under the License is distributed on an
  18  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  19  * KIND, either express or implied. See the License for the
  20  * specific language governing permissions and limitations
  21  * under the License.
  22  */
  23 package com.sun.org.apache.xml.internal.security.utils;
  24 
  25 
  26 /**
  27  * A Factory to return an XPathAPI instance. If Xalan is available it returns XalanXPathAPI. If not, then 
  28  * it returns JDKXPathAPI.
  29  */
  30 public abstract class XPathFactory {
  31 
  32     private static boolean xalanInstalled;
  33     
  34     static {
  35         try {
  36             Class<?> funcTableClass = 
  37                 ClassLoaderUtils.loadClass("com.sun.org.apache.xpath.internal.compiler.FunctionTable", XPathFactory.class);
  38             if (funcTableClass != null) {
  39                 xalanInstalled = true;
  40             }
  41         } catch (Exception e) {
  42             //ignore
  43         }
  44     }
  45     
  46     protected synchronized static boolean isXalanInstalled() {
  47         return xalanInstalled;
  48     }
  49     
  50     /**
  51      * Get a new XPathFactory instance
  52      */
  53     public static XPathFactory newInstance() {
  54         if (!isXalanInstalled()) {
  55             return new JDKXPathFactory();
  56         }
  57         // Xalan is available
  58         if (XalanXPathAPI.isInstalled()) {
  59             return new XalanXPathFactory();
  60         }
  61         // Some problem was encountered in fixing up the Xalan FunctionTable so fall back to the 
  62         // JDK implementation
  63         return new JDKXPathFactory();
  64     }
  65 
  66     /**
  67      * Get a new XPathAPI instance
  68      */
  69     public abstract XPathAPI newXPathAPI();
  70 
  71 }