View Javadoc

    1   /*
    2    * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/saxpath/helpers/XPathReaderFactory.java,v 1.7 2005/06/28 13:44:46 elharo Exp $
    3    * $Revision: 1.7 $
    4    * $Date: 2005/06/28 13:44:46 $
    5    *
    6    * ====================================================================
    7    *
    8    * Copyright (C) 2000-2002 bob mcwhirter & James Strachan.
    9    * All rights reserved.
    10   *
    11   * Redistribution and use in source and binary forms, with or without
    12   * modification, are permitted provided that the following conditions
    13   * are met:
    14   *
    15   * 1. Redistributions of source code must retain the above copyright
    16   *    notice, this list of conditions, and the following disclaimer.
    17   *
    18   * 2. Redistributions in binary form must reproduce the above copyright
    19   *    notice, this list of conditions, and the disclaimer that follows
    20   *    these conditions in the documentation and/or other materials
    21   *    provided with the distribution.
    22   *
    23   * 3. The name "Jaxen" must not be used to endorse or promote products
    24   *    derived from this software without prior written permission.  For
    25   *    written permission, please contact license@jaxen.org.
    26   *
    27   * 4. Products derived from this software may not be called "Jaxen", nor
    28   *    may "Jaxen" appear in their name, without prior written permission
    29   *    from the Jaxen Project Management (pm@jaxen.org).
    30   *
    31   * In addition, we request (but do not require) that you include in the
    32   * end-user documentation provided with the redistribution and/or in the
    33   * software itself an acknowledgement equivalent to the following:
    34   *     "This product includes software developed by the
    35   *      Jaxen Project <http://www.jaxen.org/>."
    36   * Alternatively, the acknowledgment may be graphical using the logos
    37   * available at http://www.jaxen.org/
    38   *
    39   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
    40   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
    41   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    42   * DISCLAIMED.  IN NO EVENT SHALL THE Jaxen AUTHORS OR THE PROJECT
    43   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    44   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    45   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
    46   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    47   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    48   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
    49   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    50   * SUCH DAMAGE.
    51   *
    52   * ====================================================================
    53   * This software consists of voluntary contributions made by many
    54   * individuals on behalf of the Jaxen Project and was originally
    55   * created by bob mcwhirter <bob@werken.com> and
    56   * James Strachan <jstrachan@apache.org>.  For more information on the
    57   * Jaxen Project, please see <http://www.jaxen.org/>.
    58   *
    59   * $Id: XPathReaderFactory.java,v 1.7 2005/06/28 13:44:46 elharo Exp $
    60   */
    61
    62
    63
    64
    65  package org.jaxen.saxpath.helpers;
    66
    67  import org.jaxen.saxpath.SAXPathException;
    68  import org.jaxen.saxpath.XPathReader;
    69
    70  /*** Create an {@link org.jaxen.saxpath.XPathReader} from
    71   *  either a system property, or a named class.
    72   *
    73   *  <p>
    74   *  Similar to the SAX API, the <code>XPathReaderFactory</code>
    75   *  can create an <code>XPathReader</code> from a name of a
    76   *  class passed in directly, or by inspecting the system
    77   *  property <code>org.saxpath.driver</code>.
    78   *
    79   *  @author bob mcwhirter (bob@werken.com)
    80   */
    81  public class XPathReaderFactory
    82  {
    83      /*** The <code>org.saxpath.driver</code> property name. */
    84      public static final String DRIVER_PROPERTY = "org.saxpath.driver";
    85
    86      /*** The default driver to use if none is configured. */
    87      protected static final String DEFAULT_DRIVER = "org.jaxen.saxpath.base.XPathReader";
    88
    89      private XPathReaderFactory() {}
    90
    91
    92      /*** Create an <code>XPathReader</code> using the value of
    93       *  the <code>org.saxpath.driver</code> system property.
    94       *
    95       *  @return an instance of the <code>XPathReader</code> specified
    96       *          by the <code>org.saxpath.driver</code> property
    97       *
    98       *  @throws SAXPathException if the property is  not set, or if
    99       *          the class can not be instantiated for some reason,
    100      *          or if the class doesn't implement the <code>XPathReader</code>
    101      *          interface
    102      */
    103     public static XPathReader createReader() throws SAXPathException
    104     {
    105         String className = null;
    106
    107         try
    108         {
    109             className = System.getProperty( DRIVER_PROPERTY );
    110         }
    111         catch (SecurityException e)
    112         {
    113             // we'll use the default
    114         }
    115
    116         if ( className == null
    117              ||
    118              className.length() == 0 )
    119         {
    120             className = DEFAULT_DRIVER;
    121         }
    122
    123         return createReader( className );
    124     }
    125
    126     /*** Create an <code>XPathReader</code> using the passed
    127      *  in class name.
    128      *
    129      *  @param className the name of the class that implements
    130      *         the <code>XPathReader</code> interface.
    131      *
    132      *  @return an XPathReader
    133      *
    134      *  @throws SAXPathException if the class cannot be
    135      *          instantiated for some reason, or if the
    136      *          class doesn't implement the <code>XPathReader</code>
    137      *          interface
    138      */
    139     public static XPathReader createReader(String className) throws SAXPathException
    140     {
    141         Class readerClass  = null;
    142         XPathReader reader = null;
    143
    144         try
    145         {
    146             // Use the full version of Class.forName(), so as to
    147             // work better in sandboxed environments, such as
    148             // servlet containers and applets.
    149
    150             readerClass = Class.forName( className,
    151                                          true,
    152                                          XPathReaderFactory.class.getClassLoader() );
    153
    154             // Double-check that it's actually the right kind of class
    155             // before attempting instantiation.
    156
    157             if ( ! XPathReader.class.isAssignableFrom( readerClass ) )
    158             {
    159                 throw new SAXPathException( "Class [" + className
    160                   + "] does not implement the org.jaxen.saxpath.XPathReader interface." );
    161             }
    162         }
    163         catch (ClassNotFoundException e)
    164         {
    165             throw new SAXPathException( e );
    166         }
    167
    168         try
    169         {
    170             reader = (XPathReader) readerClass.newInstance();
    171         }
    172         catch (IllegalAccessException e)
    173         {
    174             throw new SAXPathException( e );
    175         }
    176         catch (InstantiationException e)
    177         {
    178             throw new SAXPathException( e );
    179         }
    180
    181         if ( reader == null )
    182         {
    183             throw new SAXPathException( "Unable to create XPathReader" );
    184         }
    185
    186         return reader;
    187     }
    188 }