Coverage Report - org.jaxen.Context
 
Classes in this File Line Coverage Branch Coverage Complexity
Context
94%
30/32
100%
2/2
1.143
 
 1  
 package org.jaxen;
 2  
 
 3  
 /*
 4  
  $Id: Context.java,v 1.20 2006/10/15 21:08:16 elharo Exp $
 5  
 
 6  
  Copyright 2003 The Werken Company. All Rights Reserved.
 7  
  
 8  
 Redistribution and use in source and binary forms, with or without
 9  
 modification, are permitted provided that the following conditions are
 10  
 met:
 11  
 
 12  
   * Redistributions of source code must retain the above copyright
 13  
     notice, this list of conditions and the following disclaimer.
 14  
 
 15  
   * Redistributions in binary form must reproduce the above copyright
 16  
     notice, this list of conditions and the following disclaimer in the
 17  
     documentation and/or other materials provided with the distribution.
 18  
 
 19  
   * Neither the name of the Jaxen Project nor the names of its
 20  
     contributors may be used to endorse or promote products derived 
 21  
     from this software without specific prior written permission.
 22  
 
 23  
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 24  
 IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 25  
 TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 26  
 PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
 27  
 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 28  
 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 29  
 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 30  
 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 31  
 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 32  
 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 33  
 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 34  
 
 35  
  */
 36  
 
 37  
 import java.io.Serializable;
 38  
 import java.util.ArrayList;
 39  
 import java.util.Collections;
 40  
 import java.util.List;
 41  
 
 42  
 /** Wrapper around implementation-specific objects used
 43  
  *  as the context of an expression evaluation.
 44  
  *
 45  
  *  <p>
 46  
  *  <strong>NOTE:</strong> This class is not typically used directly,
 47  
  *  but is exposed for writers of implementation-specific
 48  
  *  XPath packages.
 49  
  *  </p>
 50  
  *
 51  
  *  <p>
 52  
  *  The <code>Context</code> bundles utilities together
 53  
  *  for evaluation of the expression.  It wraps the provided
 54  
  *  objects for ease-of-passage through the expression 
 55  
  *  <acronym title="Abstract Syntax Tree">AST</acronym>.
 56  
  *  </p>
 57  
  *
 58  
  *  @see ContextSupport
 59  
  *  @see BaseXPath
 60  
  *  @see org.jaxen.dom4j.Dom4jXPath XPath for dom4j
 61  
  *  @see org.jaxen.jdom.JDOMXPath  XPath for JDOM
 62  
  *  @see org.jaxen.dom.DOMXPath   XPath for W3C DOM
 63  
  *
 64  
  *  @author <a href="mailto:bob@werken.com">bob mcwhirter</a>
 65  
  */
 66  
 public class Context implements Serializable {
 67  
     
 68  
     /**
 69  
      * 
 70  
      */
 71  
     private static final long serialVersionUID = 2315979994685591055L;
 72  
 
 73  
     // ----------------------------------------------------------------------
 74  
     //     Instance members
 75  
     // ----------------------------------------------------------------------
 76  
 
 77  
     /** Context-support */
 78  
     private ContextSupport contextSupport;
 79  
 
 80  
     /** Context node-set */
 81  
     private List nodeSet;
 82  
 
 83  
     /** Current context size */
 84  
     private int size;
 85  
 
 86  
     /** Current context position */
 87  
     private int position;
 88  
 
 89  
     // ----------------------------------------------------------------------
 90  
     //     Constructors
 91  
     // ----------------------------------------------------------------------
 92  
 
 93  
     /** Create a new context.
 94  
      *
 95  
      *  @param contextSupport the context-support
 96  
      */
 97  
     public Context(ContextSupport contextSupport)
 98  18674
     {
 99  18674
         this.contextSupport = contextSupport;
 100  18674
         this.nodeSet        = Collections.EMPTY_LIST;
 101  18674
         this.size           = 0;
 102  18674
         this.position       = 0;
 103  18674
     }
 104  
     
 105  
     // ----------------------------------------------------------------------
 106  
     //     Instance methods
 107  
     // ----------------------------------------------------------------------
 108  
 
 109  
     /** 
 110  
      * <p>
 111  
      * Set the context node-set, and sets the current context size to the size 
 112  
      * of this node-set. </p>
 113  
      * 
 114  
      * <p>The actual list is stored in this object. A copy
 115  
      * is not made. This list should not be modified in other code after
 116  
      * calling this method.</p>
 117  
      *  
 118  
      * <p>
 119  
      * After invoking this method, the client should immediately call 
 120  
      * {@link #setSize(int) setSize} and {@link #setPosition(int) setPosition}.
 121  
      *</p>
 122  
      *
 123  
      *  @param nodeSet the context node-set
 124  
      */
 125  
     public void setNodeSet(List nodeSet)
 126  
     {
 127  28934
         this.nodeSet = nodeSet;
 128  28934
         this.size    = nodeSet.size();
 129  28934
         if (position >= size) this.position = 0;
 130  28934
     }
 131  
 
 132  
     /** Retrieve the context node-set.
 133  
      *  This is a live list. It is not a copy.
 134  
      *  Do not modify it.
 135  
      *
 136  
      *  @return the context node-set
 137  
      */
 138  
     public List getNodeSet()
 139  
     {
 140  21786
         return this.nodeSet;
 141  
     }
 142  
 
 143  
     /** Set the <code>ContextSupport</code>.
 144  
      *
 145  
      *  @param contextSupport the context-support
 146  
      */
 147  
     public void setContextSupport(ContextSupport contextSupport)
 148  
     {
 149  0
         this.contextSupport = contextSupport;
 150  0
     }
 151  
 
 152  
     /** Retrieve the <code>ContextSupport</code>.
 153  
      *
 154  
      *  @return the context-support
 155  
      */
 156  
     public ContextSupport getContextSupport()
 157  
     {
 158  45840
         return this.contextSupport;
 159  
     }
 160  
 
 161  
     /** Retrieve the current <code>Navigator</code>.
 162  
      *
 163  
      *  @return the navigator
 164  
      */
 165  
     public Navigator getNavigator()
 166  
     {
 167  17966
         return getContextSupport().getNavigator();
 168  
     }
 169  
 
 170  
     /** Translate a namespace prefix to its URI.
 171  
      *
 172  
      *  @param prefix the prefix
 173  
      *
 174  
      *  @return the namespace URI mapped to the prefix
 175  
      */
 176  
     public String translateNamespacePrefixToUri(String prefix)
 177  
     {
 178  4268
         return getContextSupport().translateNamespacePrefixToUri( prefix );
 179  
     }
 180  
 
 181  
     /** Retrieve a variable value.
 182  
      *
 183  
      *  @param namespaceURI the function namespace URI
 184  
      *  @param prefix the function prefix
 185  
      *  @param localName the function name
 186  
      *
 187  
      *  @return the variable value
 188  
      *
 189  
      *  @throws UnresolvableException if unable to locate a bound variable
 190  
      */
 191  
     public Object getVariableValue(String namespaceURI,
 192  
                                    String prefix,
 193  
                                    String localName)
 194  
         throws UnresolvableException
 195  
     {
 196  28
         return getContextSupport().getVariableValue( namespaceURI,
 197  
                                                      prefix,
 198  
                                                      localName );
 199  
     }
 200  
 
 201  
     /** Retrieve a <code>Function</code>.
 202  
      *
 203  
      *  @param namespaceURI the function namespace URI
 204  
      *  @param prefix the function prefix
 205  
      *  @param localName the function name
 206  
      *
 207  
      *  @return the function object
 208  
      *
 209  
      *  @throws UnresolvableException if unable to locate a bound function
 210  
      */
 211  
     public Function getFunction(String namespaceURI,
 212  
                                 String prefix,
 213  
                                 String localName)
 214  
         throws UnresolvableException
 215  
     {
 216  4240
         return getContextSupport().getFunction( namespaceURI,
 217  
                                                 prefix,
 218  
                                                 localName );
 219  
     }
 220  
 
 221  
     // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 222  
     //     Properties
 223  
     // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 224  
 
 225  
     /** Set the current size in the context node-set.
 226  
      *
 227  
      *  @param size the size
 228  
      */
 229  
     public void setSize(int size)
 230  
     {
 231  7886
         this.size = size;
 232  7886
     }
 233  
 
 234  
     /** Retrieve the size of the current context node-set.
 235  
      *
 236  
      *  @return the size
 237  
      */
 238  
     public int getSize()
 239  
     {
 240  32
         return this.size;
 241  
     }
 242  
 
 243  
     /** Set the current position in the context node-set.
 244  
      *
 245  
      *  @param position the position
 246  
      */
 247  
     public void setPosition(int position)
 248  
     {
 249  7946
         this.position = position;
 250  7946
     }
 251  
 
 252  
     /** Retrieve current position in the context node-set.
 253  
      *
 254  
      *  @return the current position
 255  
      */
 256  
     public int getPosition()
 257  
     {
 258  248
         return this.position;
 259  
     }
 260  
 
 261  
     // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 262  
     //     Helpers
 263  
     // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 264  
 
 265  
     /** Create a type-safe shallow copy.
 266  
      *
 267  
      *  @return the duplicate
 268  
      */
 269  
     public Context duplicate()
 270  
     {
 271  58
         Context dupe = new Context( getContextSupport() );
 272  
 
 273  58
         List thisNodeSet = getNodeSet();
 274  
 
 275  58
         if ( thisNodeSet != null )
 276  
         {
 277  58
             List dupeNodeSet = new ArrayList( thisNodeSet.size() );
 278  58
             dupeNodeSet.addAll( thisNodeSet );
 279  58
             dupe.setNodeSet( dupeNodeSet );
 280  58
             dupe.setPosition(this.position);
 281  
         }
 282  
 
 283  58
         return dupe;
 284  
     }
 285  
 }