1 /* 2 * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/javabean/JavaBeanXPath.java,v 1.3 2005/01/30 03:11:13 elharo Exp $ 3 * $Revision: 1.3 $ 4 * $Date: 2005/01/30 03:11:13 $ 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: JavaBeanXPath.java,v 1.3 2005/01/30 03:11:13 elharo Exp $ 60 */ 61 62 package org.jaxen.javabean; 63 64 import org.jaxen.Context; 65 import org.jaxen.BaseXPath; 66 import org.jaxen.JaxenException; 67 68 import java.util.List; 69 import java.util.ArrayList; 70 import java.util.Collection; 71 import java.util.Iterator; 72 73 /*** An XPath implementation for JavaBeans. 74 * 75 * <p>This is the main entry point for matching an XPath against a JavaBean 76 * tree. You create a compiled XPath object, then match it against 77 * one or more context nodes using the {@link #selectNodes(Object)} 78 * method, as in the following example:</p> 79 * 80 * <pre> 81 * Node node = ...; 82 * XPath path = new JavaBeanXPath("a/b/c"); 83 * List results = path.selectNodes(node); 84 * </pre> 85 * 86 * @see BaseXPath 87 * 88 * @author <a href="mailto:bob@werken.com">bob mcwhirter</a> 89 * 90 * @version $Revision: 1.3 $ 91 */ 92 public class JavaBeanXPath extends BaseXPath 93 { 94 /*** Construct given an XPath expression string. 95 * 96 * @param xpathExpr The XPath expression. 97 * 98 * @throws JaxenException if there is a syntax error while 99 * parsing the expression 100 */ 101 public JavaBeanXPath(String xpathExpr) throws JaxenException 102 { 103 super( xpathExpr, DocumentNavigator.getInstance() ); 104 } 105 106 protected Context getContext(Object node) 107 { 108 if ( node instanceof Context ) 109 { 110 return (Context) node; 111 } 112 113 if ( node instanceof Element ) 114 { 115 return super.getContext( node ); 116 } 117 118 if ( node instanceof List ) 119 { 120 List newList = new ArrayList(); 121 122 for ( Iterator listIter = ((List)node).iterator(); 123 listIter.hasNext(); ) 124 { 125 newList.add( new Element( null, "root", listIter.next() ) ); 126 } 127 128 return super.getContext( newList ); 129 } 130 131 return super.getContext( new Element( null, "root", node ) ); 132 } 133 134 public Object evaluate(Object node) 135 throws JaxenException 136 { 137 Object result = super.evaluate( node ); 138 139 if ( result instanceof Element ) 140 { 141 return ((Element)result).getObject(); 142 } 143 else if ( result instanceof Collection ) 144 { 145 List newList = new ArrayList(); 146 147 for ( Iterator listIter = ((Collection)result).iterator(); 148 listIter.hasNext(); ) 149 { 150 Object member = listIter.next(); 151 152 if ( member instanceof Element ) 153 { 154 newList.add( ((Element)member).getObject() ); 155 } 156 else 157 { 158 newList.add( member ); 159 } 160 } 161 162 return newList; 163 } 164 165 return result; 166 } 167 }