Coverage Report - org.jaxen.expr.DefaultRelationalExpr
 
Classes in this File Line Coverage Branch Coverage Complexity
DefaultRelationalExpr
81%
25/31
100%
10/10
3.667
 
 1  
 /*
 2  
  * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/expr/DefaultRelationalExpr.java,v 1.14 2006/02/05 21:47:40 elharo Exp $
 3  
  * $Revision: 1.14 $
 4  
  * $Date: 2006/02/05 21:47:40 $
 5  
  *
 6  
  * ====================================================================
 7  
  *
 8  
  * Copyright 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 are
 13  
  * met:
 14  
  * 
 15  
  *   * Redistributions of source code must retain the above copyright
 16  
  *     notice, this list of conditions and the following disclaimer.
 17  
  * 
 18  
  *   * Redistributions in binary form must reproduce the above copyright
 19  
  *     notice, this list of conditions and the following disclaimer in the
 20  
  *     documentation and/or other materials provided with the distribution.
 21  
  * 
 22  
  *   * Neither the name of the Jaxen Project nor the names of its
 23  
  *     contributors may be used to endorse or promote products derived 
 24  
  *     from this software without specific prior written permission.
 25  
  * 
 26  
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 27  
  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 28  
  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 29  
  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
 30  
  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 31  
  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 32  
  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 33  
  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 34  
  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 35  
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 36  
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 37  
  *
 38  
  * ====================================================================
 39  
  * This software consists of voluntary contributions made by many 
 40  
  * individuals on behalf of the Jaxen Project and was originally 
 41  
  * created by bob mcwhirter <bob@werken.com> and 
 42  
  * James Strachan <jstrachan@apache.org>.  For more information on the 
 43  
  * Jaxen Project, please see <http://www.jaxen.org/>.
 44  
  * 
 45  
  * $Id: DefaultRelationalExpr.java,v 1.14 2006/02/05 21:47:40 elharo Exp $
 46  
  */
 47  
 
 48  
 
 49  
 
 50  
 package org.jaxen.expr;
 51  
 
 52  
 import java.util.Iterator;
 53  
 import java.util.List;
 54  
 import org.jaxen.Context;
 55  
 import org.jaxen.JaxenException;
 56  
 import org.jaxen.Navigator;
 57  
 import org.jaxen.function.NumberFunction;
 58  
 
 59  
 abstract class DefaultRelationalExpr extends DefaultTruthExpr implements RelationalExpr 
 60  
   {
 61  
   DefaultRelationalExpr( Expr lhs, Expr rhs )
 62  
     {
 63  458
     super( lhs, rhs );
 64  458
     }
 65  
   
 66  
   public String toString()
 67  
     {
 68  0
     return "[(DefaultRelationalExpr): " + getLHS() + ", " + getRHS() + "]";
 69  
     }
 70  
 
 71  
   public Object evaluate( Context context ) throws JaxenException
 72  
     {
 73  468
     Object lhsValue = getLHS().evaluate( context );
 74  468
     Object rhsValue = getRHS().evaluate( context );
 75  468
     Navigator nav = context.getNavigator();
 76  
 
 77  468
     if( bothAreSets( lhsValue, rhsValue ) )
 78  
       {
 79  0
       return evaluateSetSet( (List) lhsValue, (List) rhsValue, nav );
 80  
       }
 81  
 
 82  468
     if( eitherIsSet( lhsValue, rhsValue ) )
 83  
       {
 84  48
       if( isSet( lhsValue ) )
 85  
         {        
 86  0
         return evaluateSetSet( (List) lhsValue, convertToList( rhsValue ), nav );              
 87  
         }
 88  
       else
 89  
         {
 90  48
         return evaluateSetSet( convertToList( lhsValue ), (List) rhsValue, nav );              
 91  
         }
 92  
       }
 93  
     
 94  420
     return evaluateObjectObject( lhsValue, rhsValue, nav ) ? Boolean.TRUE : Boolean.FALSE;
 95  
     }
 96  
 
 97  
   private Object evaluateSetSet( List lhsSet, List rhsSet, Navigator nav )
 98  
     {
 99  48
     if( setIsEmpty( lhsSet ) || setIsEmpty( rhsSet ) ) // return false if either is null or empty
 100  
       {
 101  0
       return Boolean.FALSE;
 102  
       }    
 103  
     
 104  48
     for( Iterator lhsIterator = lhsSet.iterator(); lhsIterator.hasNext(); )
 105  
       {
 106  48
       Object lhs = lhsIterator.next();        
 107  
       
 108  48
       for( Iterator rhsIterator = rhsSet.iterator(); rhsIterator.hasNext(); )
 109  
         {
 110  240
         Object rhs = rhsIterator.next();
 111  
         
 112  240
         if( evaluateObjectObject( lhs, rhs, nav ) )
 113  
           {
 114  32
           return Boolean.TRUE;
 115  
           }
 116  208
         }
 117  16
       }      
 118  
     
 119  16
     return Boolean.FALSE;
 120  
     }
 121  
   
 122  
   private boolean evaluateObjectObject( Object lhs, Object rhs, Navigator nav )
 123  
     {
 124  660
     if( lhs == null || rhs == null )
 125  
       {
 126  0
       return false;
 127  
       }
 128  
     
 129  660
     Double lhsNum = NumberFunction.evaluate( lhs, nav );
 130  660
     Double rhsNum = NumberFunction.evaluate( rhs, nav );      
 131  
     
 132  660
     if( NumberFunction.isNaN( lhsNum ) || NumberFunction.isNaN( rhsNum ) )
 133  
       {
 134  0
       return false;
 135  
       }
 136  
     
 137  660
     return evaluateDoubleDouble( lhsNum, rhsNum );
 138  
     }
 139  
   
 140  
   protected abstract boolean evaluateDoubleDouble( Double lhs, Double rhs );    
 141  
   }
 142