001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018:
019: package org.apache.tools.ant.taskdefs;
020:
021: import org.apache.tools.ant.BuildException;
022: import org.apache.tools.ant.Project;
023: import org.apache.tools.ant.taskdefs.condition.Condition;
024: import org.apache.tools.ant.taskdefs.condition.ConditionBase;
025:
026: /**
027: * Task to set a property conditionally using <uptodate>, <available>,
028: * and many other supported conditions.
029: *
030: * <p>This task supports boolean logic as well as pluggable conditions
031: * to decide, whether a property should be set.</p>
032: *
033: * <p>This task does not extend Task to take advantage of
034: * ConditionBase.</p>
035: *
036: * @since Ant 1.4
037: *
038: * @ant.task category="control"
039: */
040: public class ConditionTask extends ConditionBase {
041:
042: private String property = null;
043: private String value = "true";
044: private String alternative = null;
045:
046: /**
047: * Constructor, names this task "condition".
048: */
049: public ConditionTask() {
050: super ("condition");
051: }
052:
053: /**
054: * The name of the property to set. Required.
055: * @param p the name of the property
056: * @since Ant 1.4
057: */
058: public void setProperty(String p) {
059: property = p;
060: }
061:
062: /**
063: * The value for the property to set, if condition evaluates to true.
064: * Defaults to "true".
065: * @param v the value of the property
066: * @since Ant 1.4
067: */
068: public void setValue(String v) {
069: value = v;
070: }
071:
072: /**
073: * The value for the property to set, if condition evaluates to false.
074: * If this attribute is not specified, the property will not be set.
075: * @param e the alternate value of the property.
076: * @since Ant 1.6.3
077: */
078: public void setElse(String e) {
079: alternative = e;
080: }
081:
082: /**
083: * See whether our nested condition holds and set the property.
084: *
085: * @since Ant 1.4
086: * @exception BuildException if an error occurs
087: */
088: public void execute() throws BuildException {
089: if (countConditions() > 1) {
090: throw new BuildException("You must not nest more than one "
091: + "condition into <" + getTaskName() + ">");
092: }
093: if (countConditions() < 1) {
094: throw new BuildException("You must nest a condition into <"
095: + getTaskName() + ">");
096: }
097: if (property == null) {
098: throw new BuildException(
099: "The property attribute is required.");
100: }
101: Condition c = (Condition) getConditions().nextElement();
102: if (c.eval()) {
103: log("Condition true; setting " + property + " to " + value,
104: Project.MSG_DEBUG);
105: getProject().setNewProperty(property, value);
106: } else if (alternative != null) {
107: log("Condition false; setting " + property + " to "
108: + alternative, Project.MSG_DEBUG);
109: getProject().setNewProperty(property, alternative);
110: } else {
111: log("Condition false; not setting " + property,
112: Project.MSG_DEBUG);
113: }
114: }
115: }
|