001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the "License");
007 * you may not use this file except in compliance with the License.
008 * You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 /*
019 * $Id: UnaryOperation.java 468655 2006-10-28 07:12:06Z minchau $
020 */
021 package org.apache.xpath.operations;
022
023 import org.apache.xpath.Expression;
024 import org.apache.xpath.ExpressionOwner;
025 import org.apache.xpath.XPathContext;
026 import org.apache.xpath.XPathVisitor;
027 import org.apache.xpath.objects.XObject;
028
029 /**
030 * The unary operation base class.
031 */
032 public abstract class UnaryOperation extends Expression implements ExpressionOwner
033 {
034 static final long serialVersionUID = 6536083808424286166L;
035
036 /** The operand for the operation.
037 * @serial */
038 protected Expression m_right;
039
040 /**
041 * This function is used to fixup variables from QNames to stack frame
042 * indexes at stylesheet build time.
043 * @param vars List of QNames that correspond to variables. This list
044 * should be searched backwards for the first qualified name that
045 * corresponds to the variable reference qname. The position of the
046 * QName in the vector from the start of the vector will be its position
047 * in the stack frame (but variables above the globalsTop value will need
048 * to be offset to the current stack frame).
049 */
050 public void fixupVariables(java.util.Vector vars, int globalsSize)
051 {
052 m_right.fixupVariables(vars, globalsSize);
053 }
054
055 /**
056 * Tell if this expression or it's subexpressions can traverse outside
057 * the current subtree.
058 *
059 * @return true if traversal outside the context node's subtree can occur.
060 */
061 public boolean canTraverseOutsideSubtree()
062 {
063
064 if (null != m_right && m_right.canTraverseOutsideSubtree())
065 return true;
066
067 return false;
068 }
069
070 /**
071 * Set the expression operand for the operation.
072 *
073 *
074 * @param r The expression operand to which the unary operation will be
075 * applied.
076 */
077 public void setRight(Expression r)
078 {
079 m_right = r;
080 r.exprSetParent(this);
081 }
082
083 /**
084 * Execute the operand and apply the unary operation to the result.
085 *
086 *
087 * @param xctxt The runtime execution context.
088 *
089 * @return An XObject that represents the result of applying the unary
090 * operation to the evaluated operand.
091 *
092 * @throws javax.xml.transform.TransformerException
093 */
094 public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
095 {
096
097 return operate(m_right.execute(xctxt));
098 }
099
100 /**
101 * Apply the operation to two operands, and return the result.
102 *
103 *
104 * @param right non-null reference to the evaluated right operand.
105 *
106 * @return non-null reference to the XObject that represents the result of the operation.
107 *
108 * @throws javax.xml.transform.TransformerException
109 */
110 public abstract XObject operate(XObject right)
111 throws javax.xml.transform.TransformerException;
112
113 /** @return the operand of unary operation, as an Expression.
114 */
115 public Expression getOperand(){
116 return m_right;
117 }
118
119 /**
120 * @see org.apache.xpath.XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
121 */
122 public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
123 {
124 if(visitor.visitUnaryOperation(owner, this))
125 {
126 m_right.callVisitors(this, visitor);
127 }
128 }
129
130
131 /**
132 * @see ExpressionOwner#getExpression()
133 */
134 public Expression getExpression()
135 {
136 return m_right;
137 }
138
139 /**
140 * @see ExpressionOwner#setExpression(Expression)
141 */
142 public void setExpression(Expression exp)
143 {
144 exp.exprSetParent(this);
145 m_right = exp;
146 }
147
148 /**
149 * @see Expression#deepEquals(Expression)
150 */
151 public boolean deepEquals(Expression expr)
152 {
153 if(!isSameClass(expr))
154 return false;
155
156 if(!m_right.deepEquals(((UnaryOperation)expr).m_right))
157 return false;
158
159 return true;
160 }
161
162
163 }