/*
* 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:mattinger@yahoo.com">Matthew Inger</a>
* @author <a href="mailto:stefan.bodewig@freenet.de">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;
}
}