View Javadoc

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