diff options
author | mattinger <[email protected]> | 2006-07-06 21:53:00 +0000 |
---|---|---|
committer | mattinger <[email protected]> | 2006-07-06 21:53:00 +0000 |
commit | 1159111b7a71b72eb04326df33211e1733f7e742 (patch) | |
tree | f0a80c384f633e521649654ab78e6239cf5e0d6f /src/java/net/sf/antcontrib/logic/Switch.java |
Initial addition into subversion with build script changes
git-svn-id: file:///home/sven/projects/JOGL/temp/ant-contrib/svn/ant-contrib-code/trunk/ant-contrib@5 32d7a393-a5a9-423c-abd3-5d954feb1f2f
Diffstat (limited to 'src/java/net/sf/antcontrib/logic/Switch.java')
-rw-r--r-- | src/java/net/sf/antcontrib/logic/Switch.java | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/src/java/net/sf/antcontrib/logic/Switch.java b/src/java/net/sf/antcontrib/logic/Switch.java new file mode 100644 index 0000000..14f31ec --- /dev/null +++ b/src/java/net/sf/antcontrib/logic/Switch.java @@ -0,0 +1,207 @@ +/* + * 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.logic; + +import java.util.Vector; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.taskdefs.Sequential; + +/*** + * Task definition for the ANT task to switch on a particular value. + * + * <pre> + * + * Usage: + * + * Task declaration in the project: + * <code> + * <taskdef name="switch" classname="net.sf.antcontrib.logic.Switch" /> + * </code> + * + * Task calling syntax: + * <code> + * <switch value="value" [caseinsensitive="true|false"] > + * <case value="val"> + * <property name="propname" value="propvalue" /> | + * <antcall target="targetname" /> | + * any other tasks + * </case> + * [ + * <default> + * <property name="propname" value="propvalue" /> | + * <antcall target="targetname" /> | + * any other tasks + * </default> + * ] + * </switch> + * </code> + * + * + * Attributes: + * value -> The value to switch on + * caseinsensitive -> Should we do case insensitive comparisons? + * (default is false) + * + * Subitems: + * case --> An individual case to consider, if the value that + * is being switched on matches to value attribute of + * the case, then the nested tasks will be executed. + * default --> The default case for when no match is found. + * + * + * Crude Example: + * + * <code> + * <switch value="${foo}"> + * <case value="bar"> + * <echo message="The value of property foo is bar" /> + * </case> + * <case value="baz"> + * <echo message="The value of property foo is baz" /> + * </case> + * <default> + * <echo message="The value of property foo is not sensible" /> + * </default> + * </switch> + * </code> + * + * </pre> + * + * @author <a href="mailto:[email protected]">Matthew Inger</a> + * @author <a href="mailto:[email protected]">Stefan Bodewig</a> + */ +public class Switch extends Task +{ + private String value; + private Vector cases; + private Sequential defaultCase; + private boolean caseInsensitive; + + /*** + * Default Constructor + */ + public Switch() + { + cases = new Vector(); + } + + public void execute() + throws BuildException + { + if (value == null) + throw new BuildException("Value is missing"); + if (cases.size() == 0 && defaultCase == null) + throw new BuildException("No cases supplied"); + + Sequential selectedCase = defaultCase; + + int sz = cases.size(); + for (int i=0;i<sz;i++) + { + Case c = (Case)(cases.elementAt(i)); + + String cvalue = c.value; + if (cvalue == null) { + throw new BuildException("Value is required for case."); + } + String mvalue = value; + + if (caseInsensitive) + { + cvalue = cvalue.toUpperCase(); + mvalue = mvalue.toUpperCase(); + } + + if (cvalue.equals(mvalue) && c != defaultCase) + selectedCase = c; + } + + if (selectedCase == null) { + throw new BuildException("No case matched the value " + value + + " and no default has been specified."); + } + selectedCase.perform(); + } + + /*** + * Sets the value being switched on + */ + public void setValue(String value) + { + this.value = value; + } + + public void setCaseInsensitive(boolean c) + { + caseInsensitive = c; + } + + public final class Case extends Sequential + { + private String value; + + public Case() + { + super(); + } + + public void setValue(String value) + { + this.value = value; + } + + public void execute() + throws BuildException + { + super.execute(); + } + + public boolean equals(Object o) + { + boolean res = false; + Case c = (Case)o; + if (c.value.equals(value)) + res = true; + return res; + } + } + + /*** + * Creates the <case> tag + */ + public Switch.Case createCase() + throws BuildException + { + Switch.Case res = new Switch.Case(); + cases.addElement(res); + return res; + } + + /*** + * Creates the <default> tag + */ + public void addDefault(Sequential res) + throws BuildException + { + if (defaultCase != null) + throw new BuildException("Cannot specify multiple default cases"); + + defaultCase = res; + } + +} |