View Javadoc

    1   /*
    2    * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/expr/DefaultLocationPath.java,v 1.27 2005/06/28 13:44:44 elharo Exp $
    3    * $Revision: 1.27 $
    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: DefaultLocationPath.java,v 1.27 2005/06/28 13:44:44 elharo Exp $
    60   */
    61  package org.jaxen.expr;
    62
    63  import java.util.ArrayList;
    64  import java.util.Collections;
    65  import java.util.Iterator;
    66  import java.util.LinkedList;
    67  import java.util.List;
    68
    69  import org.jaxen.Context;
    70  import org.jaxen.ContextSupport;
    71  import org.jaxen.JaxenException;
    72
    73  abstract class DefaultLocationPath extends DefaultExpr implements LocationPath
    74  {
    75      private List steps;
    76
    77      /***
    78       * Create a new empty location path.
    79       */
    80      DefaultLocationPath()
    81      {
    82          this.steps = new LinkedList();
    83      }
    84
    85      public void addStep(Step step)
    86      {
    87          getSteps().add(step);
    88      }
    89
    90      public List getSteps()
    91      {
    92          return this.steps;
    93      }
    94
    95      public Expr simplify()
    96      {
    97          Iterator stepIter = getSteps().iterator();
    98          Step eachStep = null;
    99          while (stepIter.hasNext())
    100         {
    101             eachStep = (Step) stepIter.next();
    102             eachStep.simplify();
    103         }
    104         return this;
    105     }
    106
    107     public String getText()
    108     {
    109         StringBuffer buf = new StringBuffer();
    110         Iterator stepIter = getSteps().iterator();
    111         while (stepIter.hasNext())
    112         {
    113             buf.append(((Step) stepIter.next()).getText());
    114             if (stepIter.hasNext())
    115             {
    116                 buf.append("/");
    117             }
    118         }
    119         return buf.toString();
    120     }
    121
    122     public String toString()
    123     {
    124         StringBuffer buf = new StringBuffer();
    125         Iterator stepIter = getSteps().iterator();
    126         while (stepIter.hasNext())
    127         {
    128             buf.append(stepIter.next().toString());
    129             if (stepIter.hasNext())
    130             {
    131                 buf.append("/");
    132             }
    133         }
    134         return buf.toString();
    135     }
    136
    137     public boolean isAbsolute()
    138     {
    139         return false;
    140     }
    141
    142     public Object evaluate(Context context) throws JaxenException
    143     {
    144         List nodeSet = context.getNodeSet();
    145         List contextNodeSet = new ArrayList(nodeSet.size());
    146         contextNodeSet.addAll(nodeSet);
    147         ContextSupport support = context.getContextSupport();
    148         Context stepContext = new Context(support);
    149         Iterator stepIter = getSteps().iterator();
    150         while ( stepIter.hasNext() )
    151         {
    152             Step eachStep = (Step) stepIter.next();
    153             stepContext.setNodeSet(contextNodeSet);
    154             contextNodeSet = eachStep.evaluate(stepContext);
    155             // now we need to reverse the list if this is a reverse axis
    156             if (isReverseAxis(eachStep)) {
    157                 Collections.reverse(contextNodeSet);
    158             }
    159         }
    160
    161         if (getSteps().size() > 1) {
    162             Collections.sort(contextNodeSet, new NodeComparator(support.getNavigator()));
    163         }
    164
    165         return contextNodeSet;
    166     }
    167
    168     private boolean isReverseAxis(Step step) {
    169
    170         int axis = step.getAxis();
    171         return axis == org.jaxen.saxpath.Axis.PRECEDING
    172           || axis == org.jaxen.saxpath.Axis.PRECEDING_SIBLING
    173           || axis == org.jaxen.saxpath.Axis.ANCESTOR
    174           || axis == org.jaxen.saxpath.Axis.ANCESTOR_OR_SELF;
    175     }
    176
    177 }
    178