1 /* 2 * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/expr/DefaultFilterExpr.java,v 1.14 2005/03/21 22:39:16 elharo Exp $ 3 * $Revision: 1.14 $ 4 * $Date: 2005/03/21 22:39:16 $ 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: DefaultFilterExpr.java,v 1.14 2005/03/21 22:39:16 elharo Exp $ 60 */ 61 62 63 64 package org.jaxen.expr; 65 66 import java.util.ArrayList; 67 import java.util.List; 68 import org.jaxen.Context; 69 import org.jaxen.JaxenException; 70 71 public class DefaultFilterExpr extends DefaultExpr implements FilterExpr, Predicated 72 { 73 private Expr expr; 74 private PredicateSet predicates; 75 76 public DefaultFilterExpr(PredicateSet predicateSet) 77 { 78 this.predicates = predicateSet; 79 } 80 81 public DefaultFilterExpr(Expr expr, PredicateSet predicateSet) 82 { 83 this.expr = expr; 84 this.predicates = predicateSet; 85 } 86 87 public void addPredicate(Predicate predicate) 88 { 89 this.predicates.addPredicate( predicate ); 90 } 91 92 public List getPredicates() 93 { 94 return this.predicates.getPredicates(); 95 } 96 97 public PredicateSet getPredicateSet() 98 { 99 return this.predicates; 100 } 101 102 public Expr getExpr() 103 { 104 return this.expr; 105 } 106 107 public String toString() 108 { 109 return "[(DefaultFilterExpr): expr: " + expr + " predicates: " + predicates + " ]"; 110 } 111 112 public String getText() 113 { 114 String text = ""; 115 if ( this.expr != null ) 116 { 117 text = this.expr.getText(); 118 } 119 text += predicates.getText(); 120 return text; 121 } 122 123 public Expr simplify() 124 { 125 this.predicates.simplify(); 126 127 if ( this.expr != null ) 128 { 129 this.expr = this.expr.simplify(); 130 } 131 132 if ( this.predicates.getPredicates().size() == 0 ) 133 { 134 return getExpr(); 135 } 136 137 return this; 138 } 139 140 /*** Returns true if the current filter matches at least one of the context nodes 141 */ 142 public boolean asBoolean(Context context) throws JaxenException 143 { 144 Object results = null; 145 if ( expr != null ) 146 { 147 results = expr.evaluate( context ); 148 } 149 else 150 { 151 List nodeSet = context.getNodeSet(); 152 ArrayList list = new ArrayList(nodeSet.size()); 153 list.addAll( nodeSet ); 154 results = list; 155 } 156 157 if ( results instanceof Boolean ) 158 { 159 Boolean b = (Boolean) results; 160 return b.booleanValue(); 161 } 162 if ( results instanceof List ) 163 { 164 return getPredicateSet().evaluateAsBoolean( 165 (List) results, context.getContextSupport() 166 ); 167 } 168 169 return false; 170 } 171 172 public Object evaluate(Context context) throws JaxenException 173 { 174 Object results = getExpr().evaluate( context ); 175 176 if ( results instanceof List ) 177 { 178 List newresults = getPredicateSet().evaluatePredicates( (List) results, 179 context.getContextSupport() ); 180 results = newresults; 181 } 182 183 return results; 184 } 185 public void accept(Visitor visitor) 186 { 187 visitor.visit(this); 188 } 189 }