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
018package org.apache.commons.launcher.types;
019
020import java.io.File;
021
022import org.apache.tools.ant.ProjectHelper;
023import org.apache.tools.ant.types.DataType;
024import org.apache.tools.ant.types.Path;
025
026/**
027 * A class that represents nested <sysproperty> or <env> elements. This class
028 * provides the same functionality as the class that represents these same
029 * elements in a "java" task. In addition, this class supports conditional "if" 
030 * and "unless" attributes.
031 *
032 * @author Patrick Luby
033 */
034public class ConditionalVariable extends DataType {
035
036    //------------------------------------------------------------------ Fields
037
038    /**
039     * Cached "if" condition flag.
040     */
041    private String ifCondition = null;
042
043    /**
044     * Cached key.
045     */
046    private String key = null;
047
048    /**
049     * Cached "unless" condition flag.
050     */
051    private String unlessCondition = null;
052
053    /**
054     * Cached value.
055     */
056    private String value = null;
057
058    //----------------------------------------------------------------- Methods
059
060    /**
061     * Get the "if" condition flag.
062     *
063     * @return the "if" condition flag
064     */
065    public String getIf() {
066
067        return ProjectHelper.replaceProperties(project, ifCondition, project.getProperties());
068
069    }
070
071    /**
072     * Get the key.
073     *
074     * @return the key for this variable
075     */
076    public String getKey() {
077
078        return ProjectHelper.replaceProperties(project, key, project.getProperties());
079
080    }
081
082    /**
083     * Get the "unless" condition flag.
084     *
085     * @return the "unless" condition flag
086     */
087    public String getUnless() {
088 
089        return ProjectHelper.replaceProperties(project, unlessCondition, project.getProperties());
090
091    }
092
093    /**
094     * Get the value.
095     *
096     * @return the value for this variable
097     */
098    public String getValue() {
099
100        return ProjectHelper.replaceProperties(project, value, project.getProperties());
101
102    }
103
104    /**
105     * Set the value to a {@link File}.
106     *
107     * @param file the {@link File} for this variable
108     */
109    public void setFile(File file) {
110
111        this.value = file.getAbsolutePath();
112
113    }
114
115    /**
116     * Set the value to a {@link Path}.
117     *
118     * @param path the {@link Path} for this variable
119     */
120    public void setPath(Path path) {
121
122        this.value = path.toString();
123
124    }
125
126    /**
127     * Set the "if" condition. Tasks that nest this class as an element
128     * should evaluate this flag in their {@link org.apache.tools.ant.Task#execute()} method. If the
129     * following conditions are true, the task should process this element:
130     * <ul>
131     * <ol>The flag is neither null nor a empty string
132     * <ol>The property that the flag resolves to after macro substitution
133     *  is defined
134     * </ul>
135     *
136     * @param property a property name or macro
137     */
138    public void setIf(String property) {
139 
140        this.ifCondition = property;
141
142    }
143
144    /**
145     * Set the key.
146     *
147     * @param key the key for this variable
148     */
149    public void setKey(String key) {
150
151        this.key = key;
152
153    }
154
155    /**
156     * Set the value to a {@link Path}.
157     *
158     * @param path the {@link Path} for this variable
159     */
160    public void setFile(Path path) {
161
162        this.value = path.toString();
163
164    }
165
166    /**
167     * Set the "unless" condition. Tasks that nest this class as an element
168     * should evaluate this flag in their {@link org.apache.tools.ant.Task#execute()} method. If the
169     * following conditions are true, the task should ignore this element:
170     * <ul>
171     * <ol>The flag is neither null nor a empty string
172     * <ol>The property that the flag resolves to after macro substitution
173     *  is defined
174     * </ul>
175     *
176     * @param property a property name or macro
177     */
178    public void setUnless(String property) {
179 
180        this.unlessCondition = property;
181
182    }
183
184    /**
185     * Set the value.
186     *
187     * @param value the value for this variable
188     */
189    public void setValue(String value) {
190
191        this.value = value;
192
193    }
194
195}