1 /* 2 * $Header$ 3 * $Revision$ 4 * $Date$ 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$ 46 */ 47 48 package org.jaxen.pattern; 49 50 import org.jaxen.Context; 51 import org.jaxen.JaxenException; 52 53 /** <p><code>UnionPattern</code> represents a union pattern.</p> 54 * 55 * @author <a href="mailto:jstrachan@apache.org">James Strachan</a> 56 * @version $Revision$ 57 * @deprecated will be removed in Jaxen 2.0 58 */ 59 public class UnionPattern extends Pattern { 60 61 private Pattern lhs; 62 private Pattern rhs; 63 private short nodeType = ANY_NODE; 64 private String matchesNodeName = null; 65 66 67 public UnionPattern() 68 { 69 } 70 71 public UnionPattern(Pattern lhs, Pattern rhs) 72 { 73 this.lhs = lhs; 74 this.rhs = rhs; 75 init(); 76 } 77 78 79 public Pattern getLHS() 80 { 81 return lhs; 82 } 83 84 public void setLHS(Pattern lhs) 85 { 86 this.lhs = lhs; 87 init(); 88 } 89 90 public Pattern getRHS() 91 { 92 return rhs; 93 } 94 95 public void setRHS(Pattern rhs) 96 { 97 this.rhs = rhs; 98 init(); 99 } 100 101 102 // Pattern interface 103 //------------------------------------------------------------------------- 104 105 /** @return true if the pattern matches the given node 106 */ 107 public boolean matches( Object node, Context context ) throws JaxenException 108 { 109 return lhs.matches( node, context ) || rhs.matches( node, context ); 110 } 111 112 public Pattern[] getUnionPatterns() 113 { 114 return new Pattern[] { lhs, rhs }; 115 } 116 117 118 public short getMatchType() 119 { 120 return nodeType; 121 } 122 123 124 public String getMatchesNodeName() 125 { 126 return matchesNodeName; 127 } 128 129 130 public Pattern simplify() 131 { 132 this.lhs = lhs.simplify(); 133 this.rhs = rhs.simplify(); 134 init(); 135 return this; 136 } 137 138 public String getText() 139 { 140 return lhs.getText() + " | " + rhs.getText(); 141 } 142 143 public String toString() 144 { 145 return super.toString() + "[ lhs: " + lhs + " rhs: " + rhs + " ]"; 146 } 147 148 // Implementation methods 149 //------------------------------------------------------------------------- 150 private void init() 151 { 152 short type1 = lhs.getMatchType(); 153 short type2 = rhs.getMatchType(); 154 this.nodeType = ( type1 == type2 ) ? type1 : ANY_NODE; 155 156 String name1 = lhs.getMatchesNodeName(); 157 String name2 = rhs.getMatchesNodeName(); 158 159 this.matchesNodeName = null; 160 if ( name1 != null && name2 != null && name1.equals( name2 ) ) 161 { 162 this.matchesNodeName = name1; 163 } 164 } 165 }