source: release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/MathTask.java@ 15023

Last change on this file since 15023 was 15023, checked in by oranfry, 16 years ago

did the bulk of the work on wirk3

File size: 6.5 KB
Line 
1/*
2* The Apache Software License, Version 1.1
3*
4* Copyright (c) 2001-2002 The Apache Software Foundation. All rights
5* reserved.
6*
7* Redistribution and use in source and binary forms, with or without
8* modification, are permitted provided that the following conditions
9* are met:
10*
11* 1. Redistributions of source code must retain the above copyright
12* notice, this list of conditions and the following disclaimer.
13*
14* 2. Redistributions in binary form must reproduce the above copyright
15* notice, this list of conditions and the following disclaimer in
16* the documentation and/or other materials provided with the
17* distribution.
18*
19* 3. The end-user documentation included with the redistribution, if
20* any, must include the following acknowlegement:
21* "This product includes software developed by the
22* Apache Software Foundation (http://www.apache.org/)."
23* Alternately, this acknowlegement may appear in the software itself,
24* if and wherever such third-party acknowlegements normally appear.
25*
26* 4. The names "The Jakarta Project", "Ant", and "Apache Software
27* Foundation" must not be used to endorse or promote products derived
28* from this software without prior written permission. For written
29* permission, please contact [email protected].
30*
31* 5. Products derived from this software may not be called "Apache"
32* nor may "Apache" appear in their names without prior written
33* permission of the Apache Group.
34*
35* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
36* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
39* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
42* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46* SUCH DAMAGE.
47* ====================================================================
48*
49* This software consists of voluntary contributions made by many
50* individuals on behalf of the Apache Software Foundation. For more
51* information on the Apache Software Foundation, please see
52* <http://www.apache.org/>.
53*/
54package ise.antelope.tasks;
55
56import org.apache.tools.ant.Task;
57import org.apache.tools.ant.BuildException;
58import java.util.Vector;
59import java.util.Enumeration;
60
61import ise.antelope.tasks.util.math.*;
62
63/**
64 * Provides basic math functions. Simple calculations can be done via attributes
65 * only, more complex formulas can be set up via nested Ops.
66 * @author Dale Anson, [email protected]
67 */
68public class MathTask extends Task {
69
70 // storage for result
71 private String result = null;
72
73 // storage for operation -- only one allowed
74 private Op op = null;
75
76 // storage for operation passed as attribute
77 private String operation = null;
78
79 // storage for an operand passed as an attribute
80 private String operand1 = null;
81
82 // storage for an operand passed as an attribute
83 private String operand2 = null;
84
85 // datatype for the result
86 private String datatype = null;
87
88 // should the StrictMath library be used?
89 private boolean strict = false;
90
91 /**
92 * Sets the name of the property to store the result in. This is stored
93 * in a user property, so is reusable.
94 * @param name the name of a property to set for a result.
95 */
96 public void setResult( String name ) {
97 result = name;
98 }
99
100 /**
101 * Sets the datatype of this calculation. Allowed values are
102 * "int", "long", "float", or "double". Optional, if
103 * used, will be applied to all numbers in this math operation.
104 */
105 public void setDatatype( String type ) {
106 if ( type.equals( "int" ) )
107 datatype = "int";
108 else if ( type.equals( "long" ) )
109 datatype = "long";
110 else if ( type.equals( "float" ) )
111 datatype = "float";
112 else if ( type.equals( "double" ) )
113 datatype = "double";
114 else
115 throw new BuildException( "Invalid datatype: " + type +
116 ". Must be one of int, long, float, or double." );
117 }
118
119 /**
120 * Set an operand as an attribute. This is for convenience, if used,
121 * it overrides any nested Ops. Must parse to a number.
122 */
123 public void setOperand1( String op ) throws BuildException {
124 operand1 = op;
125 }
126
127 /**
128 * Set an operand as an attribute. This is for convenience, if used,
129 * it overrides any nested Ops. Must parse to a number.
130 */
131 public void setOperand2( String op ) throws BuildException {
132 operand2 = op;
133 }
134
135 /**
136 * Set an operation as an attribute. This is for convenience, if used, it
137 * overrides any nested Ops.
138 * @param op any operation allowed by Op.
139 */
140 public void setOperation( String op ) {
141 operation = op;
142 }
143
144 /**
145 * Add a nested operation. Only one operation is allowed at a time.
146 * @param op the operation to add.
147 */
148 public void addConfiguredOp( Op op ) {
149 if ( this.op != null )
150 throw new BuildException( "Only one operation allowed at a time!" );
151 if ( datatype != null )
152 op.setDatatype( datatype );
153 this.op = op;
154 }
155
156 /**
157 * Use the StrictMath library.
158 */
159 public void setStrict( boolean b ) {
160 strict = b;
161 }
162
163 public void execute() {
164 if ( result == null )
165 throw new BuildException( "Property name for result is null." );
166 if ( datatype == null )
167 datatype = "double";
168 if ( operation != null ) {
169 // operation as attribute overrides nested Op
170 op = new Op();
171 if ( datatype == null )
172 datatype = "double";
173 op.setDatatype( datatype );
174 op.setOp( operation );
175 if ( operand1 != null ) {
176 Num num = new Num();
177 num.setValue( operand1 );
178 op.addConfiguredNum( num );
179 }
180 if ( operand2 != null ) {
181 Num num = new Num();
182 num.setValue( operand2 );
183 op.addConfiguredNum( num );
184 }
185 }
186 if ( op == null )
187 throw new BuildException( "Nothing to do!" );
188 op.setDatatype( datatype );
189 op.setStrict( strict );
190 Num num = op.calculate();
191 getProject().setUserProperty( result, num.getValue().toString() );
192 }
193
194}
Note: See TracBrowser for help on using the repository browser.