git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@821847 13f79535-47bb-0310-9956-ffa450edef68master
@@ -26,6 +26,7 @@ import java.util.StringTokenizer; | |||
import java.util.Vector; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.Project; | |||
import org.apache.tools.ant.PropertyHelper; | |||
import org.apache.tools.ant.util.FileUtils; | |||
/** | |||
@@ -44,12 +45,13 @@ public class PatternSet extends DataType implements Cloneable { | |||
/** | |||
* inner class to hold a name on list. "If" and "Unless" attributes | |||
* may be used to invalidate the entry based on the existence of a | |||
* property (typically set thru the use of the Available task). | |||
* property (typically set thru the use of the Available task) | |||
* or value of an expression. | |||
*/ | |||
public class NameEntry { | |||
private String name; | |||
private String ifCond; | |||
private String unlessCond; | |||
private Object ifCond; | |||
private Object unlessCond; | |||
/** | |||
* Sets the name pattern. | |||
@@ -62,28 +64,63 @@ public class PatternSet extends DataType implements Cloneable { | |||
/** | |||
* Sets the if attribute. This attribute and the "unless" | |||
* attribute are used to validate the name, based in the | |||
* existence of the property. | |||
* attribute are used to validate the name, based on the | |||
* existence of the property or the value of the evaluated | |||
* property expression. | |||
* | |||
* @param cond A property name. If this property is not | |||
* present, the name is invalid. | |||
* @param cond A property name or expression. If the | |||
* expression evaluates to false or no property of | |||
* its value is present, the name is invalid. | |||
* @since Ant 1.8.0 | |||
*/ | |||
public void setIf(String cond) { | |||
public void setIf(Object cond) { | |||
ifCond = cond; | |||
} | |||
/** | |||
* Sets the if attribute. This attribute and the "unless" | |||
* attribute are used to validate the name, based on the | |||
* existence of the property or the value of the evaluated | |||
* property expression. | |||
* | |||
* @param cond A property name or expression. If the | |||
* expression evaluates to false or no property of | |||
* its value is present, the name is invalid. | |||
*/ | |||
public void setIf(String cond) { | |||
setIf((Object) cond); | |||
} | |||
/** | |||
* Sets the unless attribute. This attribute and the "if" | |||
* attribute are used to validate the name, based in the | |||
* existence of the property. | |||
* attribute are used to validate the name, based on the | |||
* existence of the property or the value of the evaluated | |||
* property expression. | |||
* | |||
* @param cond A property name. If this property is | |||
* present, the name is invalid. | |||
* @param cond A property name or expression. If the | |||
* expression evaluates to true or a property of | |||
* its value is present, the name is invalid. | |||
* @param cond A property name or expression. | |||
* @since Ant 1.8.0 | |||
*/ | |||
public void setUnless(String cond) { | |||
public void setUnless(Object cond) { | |||
unlessCond = cond; | |||
} | |||
/** | |||
* Sets the unless attribute. This attribute and the "if" | |||
* attribute are used to validate the name, based on the | |||
* existence of the property or the value of the evaluated | |||
* property expression. | |||
* | |||
* @param cond A property name or expression. If the | |||
* expression evaluates to true or a property of | |||
* its value is present, the name is invalid. | |||
*/ | |||
public void setUnless(String cond) { | |||
setUnless((Object) cond); | |||
} | |||
/** | |||
* @return the name attribute. | |||
*/ | |||
@@ -105,13 +142,9 @@ public class PatternSet extends DataType implements Cloneable { | |||
} | |||
private boolean valid(Project p) { | |||
if (ifCond != null && p.getProperty(ifCond) == null) { | |||
return false; | |||
} | |||
if (unlessCond != null && p.getProperty(unlessCond) != null) { | |||
return false; | |||
} | |||
return true; | |||
PropertyHelper ph = PropertyHelper.getPropertyHelper(p); | |||
return ph.testIfCondition(ifCond) | |||
&& ph.testUnlessCondition(unlessCond); | |||
} | |||
/** | |||
@@ -22,6 +22,7 @@ import java.util.Enumeration; | |||
import java.io.File; | |||
import org.apache.tools.ant.Project; | |||
import org.apache.tools.ant.PropertyHelper; | |||
/** | |||
* This selector just holds one other selector and forwards all | |||
@@ -35,8 +36,8 @@ import org.apache.tools.ant.Project; | |||
*/ | |||
public class SelectSelector extends BaseSelectorContainer { | |||
private String ifProperty; | |||
private String unlessProperty; | |||
private Object ifCondition; | |||
private Object unlessCondition; | |||
/** | |||
* Default constructor. | |||
@@ -51,13 +52,13 @@ public class SelectSelector extends BaseSelectorContainer { | |||
StringBuffer buf = new StringBuffer(); | |||
if (hasSelectors()) { | |||
buf.append("{select"); | |||
if (ifProperty != null) { | |||
if (ifCondition != null) { | |||
buf.append(" if: "); | |||
buf.append(ifProperty); | |||
buf.append(ifCondition); | |||
} | |||
if (unlessProperty != null) { | |||
if (unlessCondition != null) { | |||
buf.append(" unless: "); | |||
buf.append(unlessProperty); | |||
buf.append(unlessCondition); | |||
} | |||
buf.append(" "); | |||
buf.append(super.toString()); | |||
@@ -151,32 +152,51 @@ public class SelectSelector extends BaseSelectorContainer { | |||
* @return true if conditions are passed | |||
*/ | |||
public boolean passesConditions() { | |||
if (ifProperty != null | |||
&& getProject().getProperty(ifProperty) == null) { | |||
return false; | |||
} else if (unlessProperty != null | |||
&& getProject().getProperty(unlessProperty) != null) { | |||
return false; | |||
} | |||
return true; | |||
PropertyHelper ph = PropertyHelper.getPropertyHelper(getProject()); | |||
return ph.testIfCondition(ifCondition) | |||
&& ph.testUnlessCondition(unlessCondition); | |||
} | |||
/** | |||
* Sets the if attribute to a property which must exist for the | |||
* Sets the if attribute to an expression which must evaluate to | |||
* true or the name of an existing property for the | |||
* selector to select any files. | |||
* @param ifProperty the property to check | |||
* @param ifProperty the expression to check | |||
* @since Ant 1.8.0 | |||
*/ | |||
public void setIf(Object ifProperty) { | |||
this.ifCondition = ifProperty; | |||
} | |||
/** | |||
* Sets the if attribute to an expression which must evaluate to | |||
* true or the name of an existing property for the | |||
* selector to select any files. | |||
* @param ifProperty the expression to check | |||
*/ | |||
public void setIf(String ifProperty) { | |||
this.ifProperty = ifProperty; | |||
setIf((Object) ifProperty); | |||
} | |||
/** | |||
* Sets the unless attribute to an expression which must evaluate to | |||
* false or the name of a property which cannot exist for the | |||
* selector to select any files. | |||
* @param unlessProperty the expression to check | |||
* @since Ant 1.8.0 | |||
*/ | |||
public void setUnless(Object unlessProperty) { | |||
this.unlessCondition = unlessProperty; | |||
} | |||
/** | |||
* Sets the unless attribute to a property which cannot exist for the | |||
* Sets the unless attribute to an expression which must evaluate to | |||
* false or the name of a property which cannot exist for the | |||
* selector to select any files. | |||
* @param unlessProperty the property to check | |||
* @param unlessProperty the expression to check | |||
*/ | |||
public void setUnless(String unlessProperty) { | |||
this.unlessProperty = unlessProperty; | |||
setUnless((Object) unlessProperty); | |||
} | |||
/** | |||
@@ -0,0 +1,78 @@ | |||
<?xml version="1.0"?> | |||
<!-- | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You 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. | |||
--> | |||
<project xmlns:au="antlib:org.apache.ant.antunit" default="antunit"> | |||
<import file="../antunit-base.xml" /> | |||
<target name="setUp"> | |||
<mkdir dir="${input}"/> | |||
<touch file="${input}/A"/> | |||
<touch file="${input}/B"/> | |||
<touch file="${input}/C"/> | |||
<touch file="${input}/D"/> | |||
<mkdir dir="${output}"/> | |||
<macrodef name="cp"> | |||
<sequential> | |||
<copy todir="${output}"> | |||
<fileset dir="${input}"> | |||
<include name="A" if="${if}"/> | |||
<include name="B" unless="${if}"/> | |||
<include name="C" if="if"/> | |||
<include name="D" unless="if"/> | |||
</fileset> | |||
</copy> | |||
</sequential> | |||
</macrodef> | |||
</target> | |||
<target name="testIfNotSet" depends="setUp"> | |||
<cp/> | |||
<au:assertFileDoesntExist file="${output}/A"/> | |||
<au:assertFileExists file="${output}/B"/> | |||
<au:assertFileDoesntExist file="${output}/C"/> | |||
<au:assertFileExists file="${output}/D"/> | |||
</target> | |||
<target name="testIfSet" depends="setUp"> | |||
<property name="if" value="whatever"/> | |||
<cp/> | |||
<au:assertFileDoesntExist file="${output}/A"/> | |||
<au:assertFileExists file="${output}/B"/> | |||
<au:assertFileExists file="${output}/C"/> | |||
<au:assertFileDoesntExist file="${output}/D"/> | |||
</target> | |||
<target name="testIfTrue" depends="setUp"> | |||
<property name="if" value="true"/> | |||
<cp/> | |||
<au:assertFileExists file="${output}/A"/> | |||
<au:assertFileDoesntExist file="${output}/B"/> | |||
<au:assertFileExists file="${output}/C"/> | |||
<au:assertFileDoesntExist file="${output}/D"/> | |||
</target> | |||
<target name="testIfFalse" depends="setUp"> | |||
<property name="if" value="false"/> | |||
<cp/> | |||
<au:assertFileDoesntExist file="${output}/A"/> | |||
<au:assertFileExists file="${output}/B"/> | |||
<au:assertFileExists file="${output}/C"/> | |||
<au:assertFileDoesntExist file="${output}/D"/> | |||
</target> | |||
</project> |
@@ -0,0 +1,88 @@ | |||
<?xml version="1.0"?> | |||
<!-- | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You 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. | |||
--> | |||
<project xmlns:au="antlib:org.apache.ant.antunit" default="antunit"> | |||
<import file="../../antunit-base.xml" /> | |||
<target name="setUp"> | |||
<mkdir dir="${input}"/> | |||
<touch file="${input}/A"/> | |||
<touch file="${input}/B"/> | |||
<touch file="${input}/C"/> | |||
<touch file="${input}/D"/> | |||
<mkdir dir="${output}"/> | |||
<macrodef name="cp"> | |||
<sequential> | |||
<copy todir="${output}"> | |||
<fileset dir="${input}"> | |||
<or> | |||
<selector if="${if}"> | |||
<filename name="A"/> | |||
</selector> | |||
<selector unless="${if}"> | |||
<filename name="B"/> | |||
</selector> | |||
<selector if="if"> | |||
<filename name="C"/> | |||
</selector> | |||
<selector unless="if"> | |||
<filename name="D"/> | |||
</selector> | |||
</or> | |||
</fileset> | |||
</copy> | |||
</sequential> | |||
</macrodef> | |||
</target> | |||
<target name="testIfNotSet" depends="setUp"> | |||
<cp/> | |||
<au:assertFileDoesntExist file="${output}/C"/> | |||
<au:assertFileExists file="${output}/D"/> | |||
<au:assertFileDoesntExist file="${output}/A"/> | |||
<au:assertFileExists file="${output}/B"/> | |||
</target> | |||
<target name="testIfSet" depends="setUp"> | |||
<property name="if" value="whatever"/> | |||
<cp/> | |||
<au:assertFileDoesntExist file="${output}/A"/> | |||
<au:assertFileExists file="${output}/B"/> | |||
<au:assertFileExists file="${output}/C"/> | |||
<au:assertFileDoesntExist file="${output}/D"/> | |||
</target> | |||
<target name="testIfTrue" depends="setUp"> | |||
<property name="if" value="true"/> | |||
<cp/> | |||
<au:assertFileExists file="${output}/A"/> | |||
<au:assertFileDoesntExist file="${output}/B"/> | |||
<au:assertFileExists file="${output}/C"/> | |||
<au:assertFileDoesntExist file="${output}/D"/> | |||
</target> | |||
<target name="testIfFalse" depends="setUp"> | |||
<property name="if" value="false"/> | |||
<cp/> | |||
<au:assertFileDoesntExist file="${output}/A"/> | |||
<au:assertFileExists file="${output}/B"/> | |||
<au:assertFileExists file="${output}/C"/> | |||
<au:assertFileDoesntExist file="${output}/D"/> | |||
</target> | |||
</project> |