001/*
002 * Copyright (c) 2005 Einar Pehrson <einar@pehrson.nu>.
003 *
004 * This file is part of
005 * CleanSheets - a spreadsheet application for the Java platform.
006 *
007 * CleanSheets is free software; you can redistribute it and/or modify
008 * it under the terms of the GNU General Public License as published by
009 * the Free Software Foundation; either version 2 of the License, or
010 * (at your option) any later version.
011 *
012 * CleanSheets is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
015 * GNU General Public License for more details.
016 *
017 * You should have received a copy of the GNU General Public License
018 * along with CleanSheets; if not, write to the Free Software
019 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
020 */
021package csheets.core.formula;
022
023import csheets.core.IllegalValueTypeException;
024import csheets.core.Value;
025import csheets.core.formula.util.ExpressionVisitor;
026
027/**
028 * A binary operation in a formula.
029 * @author Einar Pehrson
030 */
031public class BinaryOperation extends Operation<BinaryOperator> {
032
033        /** The unique version identifier used for serialization */
034        private static final long serialVersionUID = 2326739272985753461L;
035
036        /** The left(first) operand */
037        private Expression leftOperand;
038
039        /** The right(second) operand */
040        private Expression rightOperand;
041
042        /**
043         * Creates a new binary operation.
044         * @param leftOperand the left(first) operand
045         * @param operator the binary operator
046         * @param rightOperand the right(second) operand
047         */
048        public BinaryOperation(Expression leftOperand, BinaryOperator operator, Expression rightOperand) {
049                super(operator);
050                this.leftOperand = leftOperand;
051                this.rightOperand = rightOperand;
052        }
053
054        public Value evaluate() throws IllegalValueTypeException {
055                return operator.applyTo(leftOperand, rightOperand);
056        }
057
058        /** 
059         * Returns the left(first) operand.
060         * @return an expression tree representing the operand
061         */
062        public Expression getLeftOperand() {
063                return leftOperand;
064        }
065
066        /** 
067         * Returns the right(second) operand.
068         * @return an expression tree representing the operand
069         */
070        public Expression getRightOperand() {
071                return rightOperand;
072        }
073
074        public Object accept(ExpressionVisitor visitor) {
075                return visitor.visitBinaryOperation(this);
076        }
077
078        public String toString() {
079                return leftOperand + operator.toString() + rightOperand;
080        }
081}