View Javadoc

    1   /*
    2    * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/SimpleNamespaceContext.java,v 1.15 2005/06/28 13:44:44 elharo Exp $
    3    * $Revision: 1.15 $
    4    * $Date: 2005/06/28 13:44:44 $
    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: SimpleNamespaceContext.java,v 1.15 2005/06/28 13:44:44 elharo Exp $
    60   */
    61
    62
    63  package org.jaxen;
    64
    65  import java.io.Serializable;
    66  import java.util.HashMap;
    67  import java.util.Iterator;
    68  import java.util.Map;
    69
    70  /***
    71   *  Provides mappings from namespace prefix to namespace URI to the XPath
    72   *  engine.
    73   */
    74  public class SimpleNamespaceContext implements NamespaceContext, Serializable
    75  {
    76
    77      // XXX should this prebind the xml prefix?
    78      private Map namespaces;
    79
    80      /***
    81       * Creates a new empty namespace context.
    82       */
    83      public SimpleNamespaceContext()
    84      {
    85          this.namespaces = new HashMap();
    86      }
    87
    88      /***
    89       * Creates a new namespace context pre-populated with the specified bindings.
    90       *
    91       * @param namespaces the initial namespace bindings in scope. The keys in this
    92       *     must be strings containing the prefixes and the values are strings
    93       *     containing the namespace URIs.
    94       *
    95       * @throws NullPointerException if the argument is null
    96       */
    97      public SimpleNamespaceContext(Map namespaces)
    98      {
    99          // FIXME this is dangerous. We should check that
    100         // the contents are strings.
    101         this.namespaces = new HashMap(namespaces);
    102     }
    103
    104     /***
    105      *  Adds all the namespace declarations that are in scope on the given
    106      *  element. In the case of an XSLT stylesheet, this would be the element
    107      *  that has the XPath expression in one of its attributes; e.g.
    108      *  <code>&lt;xsl:if test="condition/xpath/expression"&gt;</code>.
    109      *
    110      *  @param nav  the navigator for use in conjunction with
    111      *              <code>element</code>
    112      *  @param element the element to copy the namespaces from
    113      *  @throws UnsupportedAxisException if the navigator does not support the
    114      *     namespace axis
    115      */
    116     public void addElementNamespaces( Navigator nav, Object element )
    117         throws UnsupportedAxisException
    118     {
    119         Iterator namespaceAxis = nav.getNamespaceAxisIterator( element );
    120
    121         while ( namespaceAxis.hasNext() ) {
    122             Object namespace = namespaceAxis.next();
    123             String prefix = nav.getNamespacePrefix( namespace );
    124             String uri = nav.getNamespaceStringValue( namespace );
    125             if ( translateNamespacePrefixToUri(prefix) == null ) {
    126                 addNamespace( prefix, uri );
    127             }
    128         }
    129     }
    130
    131     // ???? What if prefix or URI is null, or both?
    132     /***
    133      * Binds a prefix to a URI in this context.
    134      *
    135      * @param prefix the namespace prefix
    136      * @param URI    the namespace URI
    137      */
    138     public void addNamespace(String prefix, String URI)
    139     {
    140         this.namespaces.put( prefix, URI );
    141     }
    142
    143     public String translateNamespacePrefixToUri(String prefix)
    144     {
    145         if ( this.namespaces.containsKey( prefix ) )
    146         {
    147             return (String) this.namespaces.get( prefix );
    148         }
    149
    150         return null;
    151     }
    152 }