001: /*
002: * $Header: /export/home/cvsroot/MyPersonalizerRepository/MyPersonalizer/Subsystems/Kernel/Sources/es/udc/mypersonalizer/kernel/model/query/ast/expr/EqualityExpression.java,v 1.1.1.1 2004/03/25 12:08:37 fbellas Exp $
003: * $Revision: 1.1.1.1 $
004: * $Date: 2004/03/25 12:08:37 $
005: *
006: * =============================================================================
007: *
008: * Copyright (c) 2003, The MyPersonalizer Development Group
009: * (http://www.tic.udc.es/~fbellas/mypersonalizer/index.html) at
010: * University Of A Coruņa
011: * All rights reserved.
012: *
013: * Redistribution and use in source and binary forms, with or without
014: * modification, are permitted provided that the following conditions are met:
015: *
016: * - Redistributions of source code must retain the above copyright notice,
017: * this list of conditions and the following disclaimer.
018: *
019: * - Redistributions in binary form must reproduce the above copyright notice,
020: * this list of conditions and the following disclaimer in the documentation
021: * and/or other materials provided with the distribution.
022: *
023: * - Neither the name of the University Of A Coruņa nor the names of its
024: * contributors may be used to endorse or promote products derived from
025: * this software without specific prior written permission.
026: *
027: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
028: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
029: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
030: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
031: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
032: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
033: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
034: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
035: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
036: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
037: * POSSIBILITY OF SUCH DAMAGE.
038: *
039: */
040: package es.udc.mypersonalizer.kernel.model.query.ast.expr;
041:
042: /**
043: * A binary expression which evaluates to a boolean value and whose arguments
044: * evaluate both to the same type.
045: * <p>
046: * If you plon to reuse or otherwise change the LHS and RHS to a different
047: * type, you should set them to <code>null</code> beforehand. Otherwise an
048: * <code>IllegalArgumentException</code> will be thrown becouse of
049: * type incompatibily.
050: *
051: * @author Abel Muinho
052: * @since 1.0
053: */
054: public abstract class EqualityExpression implements BooleanExpression,
055: BinaryExpression {
056:
057: private Expression lhs = null;
058: private Expression rhs = null;
059:
060: public Expression getLHS() {
061: return lhs;
062: }
063:
064: public void setLHS(Expression e) {
065: if (isCompatibleAssignment(e, rhs)) {
066: lhs = e;
067: } else {
068: throw new IllegalArgumentException(
069: "LHS expression "
070: + e.getClass().getName()
071: + " is not compatible with already assigned RHS expression "
072: + rhs.getClass().getName());
073: }
074: }
075:
076: public Expression getRHS() {
077: return rhs;
078: }
079:
080: public void setRHS(Expression e) {
081: if (isCompatibleAssignment(lhs, e)) {
082: rhs = e;
083: } else {
084: throw new IllegalArgumentException(
085: "RHS expression "
086: + e.getClass().getName()
087: + " is not compatible with already assigned LHS expression "
088: + e.getClass().getName());
089: }
090: }
091:
092: /**
093: * Determines if the provided LHS and RHS assignment is valid.
094: * @param lhs the LHS to check with.
095: * @param rhs the RHS to check with.
096: * @return <code>true</code> if LHS and RHS are expressions of the same
097: * type, or any of them is null. <code>false</code> otherwise.
098: */
099: private boolean isCompatibleAssignment(Expression lhs,
100: Expression rhs) {
101: return rhs == null
102: || lhs == null
103: || lhs instanceof StepExpression
104: || (rhs instanceof BooleanExpression && lhs instanceof BooleanExpression)
105: || (rhs instanceof NumericExpression && lhs instanceof NumericExpression)
106: || (rhs instanceof StringExpression && lhs instanceof StringExpression);
107: }
108:
109: }
|