/*
* Copyright (c) 2001-2004 Ant-Contrib project. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.sf.antcontrib.math;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DynamicConfigurator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;
/**
* Class to represent a mathematical operation.
*
* @author inger
*/
public class Operation
implements Evaluateable, DynamicConfigurator {
private String operation = "add";
private Vector operands = new Vector();
private String datatype = "double";
private boolean strict = false;
private boolean hasLocalOperands = false;
private Numeric localOperands[] = new Numeric[5];
public void setDynamicAttribute(String s, String s1)
throws BuildException {
throw new BuildException("no dynamic attributes for this element");
}
public Object createDynamicElement(String name)
throws BuildException {
Operation op = new Operation();
op.setOperation(name);
operands.add(op);
return op;
}
private void setLocalOperand(String value, int index) {
hasLocalOperands = true;
localOperands[index - 1] = new Numeric();
localOperands[index - 1].setValue(value);
}
public void setArg1(String value) {
setLocalOperand(value, 1);
}
public void setArg2(String value) {
setLocalOperand(value, 2);
}
public void setArg3(String value) {
setLocalOperand(value, 3);
}
public void setArg4(String value) {
setLocalOperand(value, 4);
}
public void setArg5(String value) {
setLocalOperand(value, 5);
}
public void addConfiguredNumeric(Numeric numeric) {
if (hasLocalOperands)
throw new BuildException("Cannot combine operand attributes with subelements");
operands.add(numeric);
}
public void addConfiguredOperation(Operation operation) {
if (hasLocalOperands)
throw new BuildException("Cannot combine operand attributes with subelements");
operands.add(operation);
}
public void addConfiguredNum(Numeric numeric) {
if (hasLocalOperands)
throw new BuildException("Cannot combine operand attributes with subelements");
operands.add(numeric);
}
public void addConfiguredOp(Operation operation) {
if (hasLocalOperands)
throw new BuildException("Cannot combine operand attributes with subelements");
operands.add(operation);
}
public void setOp(String operation) {
setOperation(operation);
}
public void setOperation(String operation) {
if (operation.equals("+"))
this.operation = "add";
else if (operation.equals("-"))
this.operation = "subtract";
else if (operation.equals("*"))
this.operation = "multiply";
else if (operation.equals("/"))
this.operation = "divide";
else if (operation.equals("%"))
this.operation = "mod";
else
this.operation = operation;
}
public void setDatatype(String datatype) {
this.datatype = datatype;
}
public void setStrict(boolean strict) {
this.strict = strict;
}
public Number evaluate() {
Evaluateable ops[] = null;
if (hasLocalOperands) {
List localOps = new ArrayList();
for (int i = 0; i < localOperands.length; i++) {
if (localOperands[i] != null)
localOps.add(localOperands[i]);
}
ops = (Evaluateable[]) localOps.toArray(new Evaluateable[localOps.size()]);
}
else {
ops = (Evaluateable[]) operands.toArray(new Evaluateable[operands.size()]);
}
return Math.evaluate(operation,
datatype,
strict,
ops);
}
public String toString() {
return "Operation[operation=" + operation
+ ";datatype=" + datatype
+ ";strict=" + strict
+ ";localoperands=" + Arrays.asList(localOperands)
+ ";operands=" + operands
+ "]";
}
}