1 /*
2 * $Header$
3 * $Revision: 1261 $
4 * $Date: 2006-11-30 10:49:27 -0800 (Thu, 30 Nov 2006) $
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: DefaultUnionExpr.java 1261 2006-11-30 18:49:27Z elharo $
46 */
47
48
49
50 package org.jaxen.expr;
51
52 import java.util.ArrayList;
53 import java.util.Collections;
54 import java.util.HashSet;
55 import java.util.Iterator;
56 import java.util.List;
57 import java.util.Set;
58 import org.jaxen.Context;
59 import org.jaxen.JaxenException;
60 import org.jaxen.XPathSyntaxException;
61
62 /**
63 * @deprecated this class will become non-public in the future;
64 * use the interface instead
65 */
66 public class DefaultUnionExpr extends DefaultBinaryExpr implements UnionExpr
67 {
68 /**
69 *
70 */
71 private static final long serialVersionUID = 7629142718276852707L;
72
73 public DefaultUnionExpr(Expr lhs,
74 Expr rhs)
75 {
76 super( lhs,
77 rhs );
78 }
79
80 public String getOperator()
81 {
82 return "|";
83 }
84
85 public String toString()
86 {
87 return "[(DefaultUnionExpr): " + getLHS() + ", " + getRHS() + "]";
88 }
89
90 public Object evaluate(Context context) throws JaxenException
91 {
92 List results = new ArrayList();
93
94 try {
95 List lhsResults = (List) getLHS().evaluate( context );
96 List rhsResults = (List) getRHS().evaluate( context );
97
98 Set unique = new HashSet();
99
100 results.addAll( lhsResults );
101 unique.addAll( lhsResults );
102
103 Iterator rhsIter = rhsResults.iterator();
104
105 while ( rhsIter.hasNext() )
106 {
107 Object each = rhsIter.next();
108
109 if ( ! unique.contains( each ) )
110 {
111 results.add( each );
112 unique.add( each );
113 }
114 }
115
116 Collections.sort(results, new NodeComparator(context.getNavigator()));
117
118 return results;
119 }
120 catch (ClassCastException e) {
121 throw new XPathSyntaxException(this.getText(), context.getPosition(), "Unions are only allowed over node-sets");
122 }
123 }
124
125 }
126