/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.filter;
/**
* Holds a mathematical relationship between two expressions. Note that the sub
* expressions must be math expressions. In other words, they must be a math
* literal, another math expression, or a feature attribute with a declared
* math type. You may create math expressions of arbitrary complexity by
* nesting other math expressions as sub expressions in one or more math
* expressions. This filter defines left and right values to clarify the sub
* expression precedence for non-associative operations, such as subtraction
* and division. For example, the left value is the numerator and the right is
* the denominator in an ExpressionMath division operation.
*
* @author Rob Hranac, Vision for New York
* @source $URL$
* @version $Id$
*/
public abstract class MathExpressionImpl extends DefaultExpression
implements MathExpression {
/** Holds the 'left' value of this math expression. */
private org.opengis.filter.expression.Expression leftValue = null;
/** Holds the 'right' value of this math expression. */
private org.opengis.filter.expression.Expression rightValue = null;
/**
* No argument constructor.
*/
protected MathExpressionImpl() {
}
protected MathExpressionImpl(org.opengis.filter.expression.Expression e1,org.opengis.filter.expression.Expression e2) {
this.leftValue = e1;
this.rightValue = e2;
}
/**
* Adds the 'left' value to this expression.
*
* @param leftValue Expression to add to this expression.
*
* @throws IllegalFilterException Attempting to add non-math expression.
*
* @deprecated use {@link #setExpression1(org.opengis.filter.expression.Expression)}
*/
public final void addLeftValue(Expression leftValue)
throws IllegalFilterException {
setExpression1(leftValue);
}
/**
* Adds the 'right' value to this expression.
*
* @param rightValue Expression to add to this expression.
*
* @throws IllegalFilterException Attempting to add non-math expression.
*
* @deprecated use {@link #setExpression2(org.opengis.filter.expression.Expression)}
*/
public final void addRightValue(Expression rightValue)
throws IllegalFilterException {
setExpression2(rightValue);
}
/**
* Gets the left or first expression.
*
* @deprecated use {@link #getExpression1()}.
*/
public final Expression getLeftValue() {
return (Expression)getExpression1();
}
/**
*
* Gets the left or first expression.
*
* @return the expression on the first side of the comparison.
*/
public org.opengis.filter.expression.Expression getExpression1() {
return leftValue;
}
/**
*
* Gets the left or first expression.
*
* @throws IllegalFilterException
*/
public void setExpression1(org.opengis.filter.expression.Expression expression) {
Expression leftValue = (Expression)expression;
if (isGeometryExpression(leftValue.getType()) ) {
throw new IllegalFilterException(
"Attempted to add Geometry expression to math expression.");
}
this.leftValue = leftValue;
}
/**
* Gets the right expression.
*
* @return the expression on the right of the comparison.
*
* @deprecated use {@link #getExpression2()}.
*/
public final Expression getRightValue() {
return (Expression) getExpression2();
}
/**
* Gets the second expression.
*
* @return the expression on the second side of the comparison.
*/
public org.opengis.filter.expression.Expression getExpression2() {
return rightValue;
}
/**
* Gets the second expression.
*
* @throws IllegalFilterException
*/
public void setExpression2(org.opengis.filter.expression.Expression expression) {
Expression rightValue = (Expression)expression;
//Check to see if this is a valid math expression before adding.
if (isGeometryExpression(rightValue.getType()) ) {
throw new IllegalFilterException(
"Attempted to add Geometry expression to math expression.");
}
this.rightValue = rightValue;
}
/**
* Gets the type of this expression.
*
* @return Expression type.
*/
public short getType() {
return expressionType;
}
/**
* Convenience method which ensures that both expressions have been
* set. If any of operands not set an exception is thrown.
*/
protected void ensureOperandsSet() throws IllegalArgumentException {
// Checks to make sure both sub expressions exist.
if ((leftValue == null) || (rightValue == null)) {
throw new IllegalArgumentException(
"Attempted read math expression with missing sub expressions.");
}
}
protected Object number( double number ){
//return Filters.puts( number ); // non strongly typed
return new Double( number ); // Getools 2.1 style
}
}