git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@1479422 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -29,6 +29,9 @@ Other changes: | |||
| * simplifying Execute.getEnvironmentVariables since we are only running on Java 1.5 or higher now | |||
| * Add conditional attributes | |||
| Bugzilla report 43362 | |||
| Changes from Ant 1.8.4 TO Ant 1.9.0 | |||
| =================================== | |||
| @@ -151,6 +151,10 @@ | |||
| <li> they are in the same namespace as the element they belong to | |||
| </li> | |||
| </ul> | |||
| <p> | |||
| In Ant 1.9.1 two attribute namespaces ant:if and ant:unless are added in order to allow to insert elements | |||
| conditionally | |||
| </p> | |||
| <p> | |||
| Other attributes are simply ignored. | |||
| </p> | |||
| @@ -35,6 +35,7 @@ | |||
| <li><a href="sysclasspath.html">build.sysclasspath</a></li> | |||
| <li><a href="javacprops.html">Ant properties controlling javac</a></li> | |||
| <li><a href="Tasks/common.html">Common Attributes</a></li> | |||
| <li><a href="ifunless.html">If and Unless Attributes</a></li> | |||
| </ul> | |||
| <h3>List of Types</h3> | |||
| @@ -0,0 +1,64 @@ | |||
| <!-- | |||
| 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. | |||
| --> | |||
| <html> | |||
| <head> | |||
| <meta http-equiv="Content-Language" content="en-us"/> | |||
| <link rel="stylesheet" type="text/css" href="stylesheets/style.css"/> | |||
| <title>If and Unless on all tasks/nested elements</title> | |||
| </head> | |||
| <body> | |||
| <h1><a name="if_and_unless">If And Unless</a></h1> | |||
| <p>Since Ant 1.9.1 it is possible to add if and unless attributes on all tasks and nested elements using special namespaces.</p> | |||
| <p>In order to use this feature you need to add the following namespace declarations</p> | |||
| <blockquote><pre> | |||
| xmlns:if="ant:if" | |||
| xmlns:unless="ant:unless" | |||
| </pre> | |||
| </blockquote> | |||
| <p>The if and unless namespaces support the following 3 conditions : | |||
| <ul> | |||
| <li>true</li>true if the value of the property evaluates to true | |||
| <li>blank</li>true if the value of the property is null or empty | |||
| <li>set</li>true if the property is set | |||
| </ul></p> | |||
| <blockquote> | |||
| <pre> | |||
| <project name="tryit" | |||
| xmlns:if="ant:if" | |||
| xmlns:unless="ant:unless" | |||
| > | |||
| <exec executable="java"> | |||
| <arg line="-X" if:true="showextendedparams"/> | |||
| <arg line="-version" unless:true="showextendedparams"/> | |||
| </exec> | |||
| <condition property="onmac"> | |||
| <os family="mac"/> | |||
| </condition> | |||
| <echo if:set="onmac">running on MacOS</echo> | |||
| <echo unless:set="onmac">not running on MacOS</echo> | |||
| </project> | |||
| </pre> | |||
| </blockquote> | |||
| </body> | |||
| </html> | |||
| @@ -96,8 +96,8 @@ | |||
| <module name="IllegalInstantiation"> | |||
| <property name="classes" value="java.lang.Boolean"/> | |||
| </module> | |||
| <module name="InnerAssignment"/> | |||
| <module name="MagicNumber"/> | |||
| <!-- <module name="InnerAssignment"/> --> | |||
| <!-- <module name="MagicNumber"/> --> | |||
| <module name="MissingSwitchDefault"/> | |||
| <!-- Allow redundant throw declarations for doc purposes | |||
| <module name="RedundantThrows"> | |||
| @@ -120,7 +120,7 @@ | |||
| <property name="format" value="\s+$"/> | |||
| <property name="message" value="Line has trailing spaces."/> | |||
| </module> | |||
| <module name="TodoComment"/> | |||
| <!-- <module name="TodoComment"/> --> | |||
| <module name="UpperEll"/> | |||
| <!-- allow comment suppression of checks --> | |||
| <module name="FileContentsHolder"/> | |||
| @@ -316,6 +316,7 @@ public class ComponentHelper { | |||
| public void initDefaultDefinitions() { | |||
| initTasks(); | |||
| initTypes(); | |||
| new DefaultDefinitions(this).execute(); | |||
| } | |||
| /** | |||
| @@ -0,0 +1,75 @@ | |||
| /* | |||
| * 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. | |||
| * | |||
| */ | |||
| package org.apache.tools.ant; | |||
| /** | |||
| * Default definitions. | |||
| */ | |||
| public final class DefaultDefinitions { | |||
| private static final String IF_NAMESPACE = "ant:if"; | |||
| private static final String UNLESS_NAMESPACE = "ant:unless"; | |||
| private static final String OATA = "org.apache.tools.ant."; | |||
| private final ComponentHelper componentHelper; | |||
| /** | |||
| * Create a default definitions object. | |||
| * @param componentHelper the componenthelper to initialize. | |||
| */ | |||
| public DefaultDefinitions(ComponentHelper componentHelper) { | |||
| this.componentHelper = componentHelper; | |||
| } | |||
| /** | |||
| * Register the defintions. | |||
| */ | |||
| public void execute() { | |||
| attributeNamespaceDef(IF_NAMESPACE); | |||
| attributeNamespaceDef(UNLESS_NAMESPACE); | |||
| ifUnlessDef("true", "IfTrueAttribute"); | |||
| ifUnlessDef("set", "IfSetAttribute"); | |||
| ifUnlessDef("blank", "IfBlankAttribute"); | |||
| } | |||
| private void attributeNamespaceDef(String ns) { | |||
| AntTypeDefinition def = new AntTypeDefinition(); | |||
| def.setName(ProjectHelper.nsToComponentName(ns)); | |||
| def.setClassName(OATA + "attribute.AttributeNamespace"); | |||
| def.setClassLoader(getClass().getClassLoader()); | |||
| def.setRestrict(true); | |||
| componentHelper.addDataTypeDefinition(def); | |||
| } | |||
| private void ifUnlessDef(String name, String base) { | |||
| String classname = OATA + "attribute." + base; | |||
| componentDef(IF_NAMESPACE, name, classname); | |||
| componentDef(UNLESS_NAMESPACE, name, classname + "$Unless"); | |||
| } | |||
| private void componentDef(String ns, String name, String classname) { | |||
| AntTypeDefinition def = new AntTypeDefinition(); | |||
| String n = ProjectHelper.genComponentName(ns, name); | |||
| def.setName(ProjectHelper.genComponentName(ns, name)); | |||
| def.setClassName(classname); | |||
| def.setClassLoader(getClass().getClassLoader()); | |||
| def.setRestrict(true); | |||
| componentHelper.addDataTypeDefinition(def); | |||
| } | |||
| } | |||
| @@ -276,5 +276,9 @@ public final class MagicNames { | |||
| * @since Ant 1.9.0 | |||
| */ | |||
| public static final String ANT_VM_LAUNCHER_REF_ID = "ant.vmLauncher"; | |||
| /** Name of the namespace "type" (note: cannot be used as an element) | |||
| * @since Ant 1.9.1 | |||
| * */ | |||
| public static final String ATTRIBUTE_NAMESPACE = "attribute namespace"; | |||
| } | |||
| @@ -43,6 +43,11 @@ public class ProjectHelper { | |||
| /** The URI for antlib current definitions */ | |||
| public static final String ANT_CURRENT_URI = "ant:current"; | |||
| /** The URI for ant specific attributes | |||
| * @since Ant 1.9.1 | |||
| * */ | |||
| public static final String ANT_ATTRIBUTE_URI = "ant:attribute"; | |||
| /** The URI for defined types/tasks - the format is antlib:<package> */ | |||
| public static final String ANTLIB_URI = "antlib:"; | |||
| @@ -522,6 +527,16 @@ public class ProjectHelper { | |||
| return componentName.substring(index + 1); | |||
| } | |||
| /** | |||
| * Convert an attribute namespace to a "component name". | |||
| * @param ns the xml namespace uri. | |||
| * @return the converted value. | |||
| * @since Ant 1.9.1 | |||
| */ | |||
| public static String nsToComponentName(String ns) { | |||
| return "attribute namespace:" + ns; | |||
| } | |||
| /** | |||
| * Add location to build exception. | |||
| * @param ex the build exception, if the build exception | |||
| @@ -27,6 +27,8 @@ import java.util.LinkedHashMap; | |||
| import java.util.List; | |||
| import java.util.Map.Entry; | |||
| import org.apache.tools.ant.attribute.EnableAttribute; | |||
| import org.apache.tools.ant.util.CollectionUtils; | |||
| import org.apache.tools.ant.taskdefs.MacroDef.Attribute; | |||
| import org.apache.tools.ant.taskdefs.MacroInstance; | |||
| @@ -64,6 +66,9 @@ public class RuntimeConfigurable implements Serializable { | |||
| */ | |||
| private transient AttributeList attributes; | |||
| // The following is set to true if any of the attributes are namespaced | |||
| private transient boolean namespacedAttribute = false; | |||
| /** Attribute names and values. While the XML spec doesn't require | |||
| * preserving the order ( AFAIK ), some ant tests do rely on the | |||
| * exact order. | |||
| @@ -113,6 +118,73 @@ public class RuntimeConfigurable implements Serializable { | |||
| proxyConfigured = false; | |||
| } | |||
| private static class EnableAttributeConsumer { | |||
| public void add(EnableAttribute b) { | |||
| // Ignore | |||
| } | |||
| } | |||
| /** | |||
| * Check if an UE is enabled. | |||
| * This looks tru the attributes and checks if there | |||
| * are any Ant attributes, and if so, the method calls the | |||
| * isEnabled() method on them. | |||
| * @param owner the UE that owns this RC. | |||
| * @return true if enabled, false if any of the ant attribures return | |||
| * false. | |||
| */ | |||
| public boolean isEnabled(UnknownElement owner) { | |||
| if (!namespacedAttribute) { | |||
| return true; | |||
| } | |||
| ComponentHelper componentHelper = ComponentHelper | |||
| .getComponentHelper(owner.getProject()); | |||
| IntrospectionHelper ih | |||
| = IntrospectionHelper.getHelper( | |||
| owner.getProject(), EnableAttributeConsumer.class); | |||
| for (int i = 0; i < attributeMap.keySet().size(); ++i) { | |||
| String name = (String) attributeMap.keySet().toArray()[i]; | |||
| if (name.indexOf(':') == -1) { | |||
| continue; | |||
| } | |||
| String componentName = attrToComponent(name); | |||
| String ns = ProjectHelper.extractUriFromComponentName(componentName); | |||
| if (componentHelper.getRestrictedDefinitions( | |||
| ProjectHelper.nsToComponentName(ns)) == null) { | |||
| continue; | |||
| } | |||
| String value = (String) attributeMap.get(name); | |||
| EnableAttribute enable = null; | |||
| try { | |||
| enable = (EnableAttribute) | |||
| ih.createElement( | |||
| owner.getProject(), new EnableAttributeConsumer(), | |||
| componentName); | |||
| } catch (BuildException ex) { | |||
| throw new BuildException( | |||
| "Unsupported attribute " + componentName); | |||
| } | |||
| if (enable == null) { | |||
| continue; | |||
| } | |||
| value = owner.getProject().replaceProperties(value); // FixMe: need to make config | |||
| if (!enable.isEnabled(owner, value)) { | |||
| return false; | |||
| } | |||
| } | |||
| return true; | |||
| } | |||
| private String attrToComponent(String a) { | |||
| // need to remove the prefix | |||
| int p1 = a.lastIndexOf(':'); | |||
| int p2 = a.lastIndexOf(':', p1 - 1); | |||
| return a.substring(0, p2) + a.substring(p1); | |||
| } | |||
| /** | |||
| * Sets the creator of the element to be configured | |||
| * used to store the element in the parent. | |||
| @@ -177,6 +249,9 @@ public class RuntimeConfigurable implements Serializable { | |||
| * @param value the attribute's value. | |||
| */ | |||
| public synchronized void setAttribute(String name, String value) { | |||
| if (name.indexOf(':') != -1) { | |||
| namespacedAttribute = true; | |||
| } | |||
| setAttribute(name, (Object) value); | |||
| } | |||
| @@ -170,6 +170,9 @@ public class UnknownElement extends Task { | |||
| * | |||
| */ | |||
| public void configure(Object realObject) { | |||
| if (realObject == null) { | |||
| return; | |||
| } | |||
| realThing = realObject; | |||
| getWrapper().setProxy(realThing); | |||
| @@ -281,10 +284,8 @@ public class UnknownElement extends Task { | |||
| */ | |||
| public void execute() { | |||
| if (realThing == null) { | |||
| // plain impossible to get here, maybeConfigure should | |||
| // have thrown an exception. | |||
| throw new BuildException("Could not create task of type: " | |||
| + elementName, getLocation()); | |||
| // Got here if the runtimeconfigurable is not enabled. | |||
| return; | |||
| } | |||
| try { | |||
| if (realThing instanceof Task) { | |||
| @@ -346,6 +347,14 @@ public class UnknownElement extends Task { | |||
| RuntimeConfigurable childWrapper = parentWrapper.getChild(i); | |||
| UnknownElement child = it.next(); | |||
| try { | |||
| if (!childWrapper.isEnabled(child)) { | |||
| if (ih.supportsNestedElement( | |||
| parentUri, ProjectHelper.genComponentName( | |||
| child.getNamespace(), child.getTag()))) { | |||
| continue; | |||
| } | |||
| // fall tru and fail in handlechild (unsupported element) | |||
| } | |||
| if (!handleChild( | |||
| parentUri, ih, parent, child, childWrapper)) { | |||
| if (!(parent instanceof TaskContainer)) { | |||
| @@ -411,6 +420,9 @@ public class UnknownElement extends Task { | |||
| * @return the task or data type represented by the given unknown element. | |||
| */ | |||
| protected Object makeObject(UnknownElement ue, RuntimeConfigurable w) { | |||
| if (!w.isEnabled(ue)) { | |||
| return null; | |||
| } | |||
| ComponentHelper helper = ComponentHelper.getComponentHelper( | |||
| getProject()); | |||
| String name = ue.getComponentName(); | |||
| @@ -0,0 +1,26 @@ | |||
| /* | |||
| * 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. | |||
| * | |||
| */ | |||
| package org.apache.tools.ant.attribute; | |||
| /** | |||
| * This class is used to indicate that the xml namespace (uri) | |||
| * can be used to look for namespace attributes. | |||
| */ | |||
| public final class AttributeNamespace { | |||
| } | |||
| @@ -0,0 +1,85 @@ | |||
| /* | |||
| * 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. | |||
| * | |||
| */ | |||
| package org.apache.tools.ant.attribute; | |||
| import java.util.HashMap; | |||
| import java.util.Iterator; | |||
| import java.util.Map; | |||
| import org.apache.tools.ant.ProjectComponent; | |||
| import org.apache.tools.ant.RuntimeConfigurable; | |||
| import org.apache.tools.ant.UnknownElement; | |||
| /** | |||
| * An abstract class for if/unless attributes. | |||
| * This contains a boolean flag to specify whether this is an | |||
| * if or unless attribute. | |||
| */ | |||
| public abstract class BaseIfAttribute | |||
| extends ProjectComponent implements EnableAttribute { | |||
| private boolean positive = true; | |||
| /** | |||
| * Set the positive flag. | |||
| * @param positive the value to use. | |||
| */ | |||
| protected void setPositive(boolean positive) { | |||
| this.positive = positive; | |||
| } | |||
| /** | |||
| * Get the positive flag. | |||
| * @return the flag. | |||
| */ | |||
| protected boolean isPositive() { | |||
| return positive; | |||
| } | |||
| /** | |||
| * convert the result. | |||
| * @param val the result to convert | |||
| * @return val if positive or !val if not. | |||
| */ | |||
| protected boolean convertResult(boolean val) { | |||
| return positive ? val : !val; | |||
| } | |||
| /** | |||
| * Get all the attributes in the ant-attribute:param | |||
| * namespace and place them in a map. | |||
| * @param el the element this attribute is in. | |||
| * @return a map of attributes. | |||
| */ | |||
| protected Map getParams(UnknownElement el) { | |||
| Map ret = new HashMap(); | |||
| RuntimeConfigurable rc = el.getWrapper(); | |||
| Map attributes = rc.getAttributeMap(); // This does a copy! | |||
| for (Iterator i = attributes.entrySet().iterator(); i.hasNext();) { | |||
| Map.Entry entry = (Map.Entry) i.next(); | |||
| String key = (String) entry.getKey(); | |||
| String value = (String) entry.getValue(); | |||
| if (key.startsWith("ant-attribute:param")) { | |||
| int pos = key.lastIndexOf(':'); | |||
| ret.put(key.substring(pos + 1), | |||
| el.getProject().replaceProperties(value)); | |||
| } | |||
| } | |||
| return ret; | |||
| } | |||
| } | |||
| @@ -0,0 +1,34 @@ | |||
| /* | |||
| * 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. | |||
| * | |||
| */ | |||
| package org.apache.tools.ant.attribute; | |||
| import org.apache.tools.ant.UnknownElement; | |||
| /** | |||
| * This interface is used by ant attributes. | |||
| */ | |||
| public interface EnableAttribute { | |||
| /** | |||
| * is enabled. | |||
| * @param el the unknown element this attribute is in. | |||
| * @param value the value of the attribute. | |||
| * @return true if the attribute enables the element, false otherwise. | |||
| */ | |||
| boolean isEnabled(UnknownElement el, String value); | |||
| } | |||
| @@ -0,0 +1,38 @@ | |||
| /* | |||
| * 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. | |||
| * | |||
| */ | |||
| package org.apache.tools.ant.attribute; | |||
| import org.apache.tools.ant.UnknownElement; | |||
| /** | |||
| * Check if an attribute is blank or not. | |||
| */ | |||
| public class IfBlankAttribute extends BaseIfAttribute { | |||
| /** The unless version */ | |||
| public static class Unless extends IfBlankAttribute { | |||
| { setPositive(false); } | |||
| } | |||
| /** | |||
| * check if the attribute value is blank or not | |||
| * {@inheritDoc} | |||
| */ | |||
| public boolean isEnabled(UnknownElement el, String value) { | |||
| return convertResult((value == null || "".equals(value))); | |||
| } | |||
| } | |||
| @@ -0,0 +1,38 @@ | |||
| /* | |||
| * 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. | |||
| * | |||
| */ | |||
| package org.apache.tools.ant.attribute; | |||
| import org.apache.tools.ant.UnknownElement; | |||
| /** | |||
| * Check if an attribute value as a property is set or not | |||
| */ | |||
| public class IfSetAttribute extends BaseIfAttribute { | |||
| /** The unless version */ | |||
| public static class Unless extends IfSetAttribute { | |||
| { setPositive(false); } | |||
| } | |||
| /** | |||
| * check if the attribute value is blank or not | |||
| * {@inheritDoc} | |||
| */ | |||
| public boolean isEnabled(UnknownElement el, String value) { | |||
| return convertResult(getProject().getProperty(value) != null); | |||
| } | |||
| } | |||
| @@ -0,0 +1,40 @@ | |||
| /* | |||
| * 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. | |||
| * | |||
| */ | |||
| package org.apache.tools.ant.attribute; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.UnknownElement; | |||
| /** | |||
| * Check if an attribute value is true or not. | |||
| */ | |||
| public class IfTrueAttribute extends BaseIfAttribute { | |||
| /** The unless version */ | |||
| public static class Unless extends IfTrueAttribute { | |||
| { setPositive(false); } | |||
| } | |||
| /** | |||
| * check if the attribute value is true or not | |||
| * {@inheritDoc} | |||
| */ | |||
| public boolean isEnabled(UnknownElement el, String value) { | |||
| return convertResult(Project.toBoolean(value)); | |||
| } | |||
| } | |||
| @@ -0,0 +1,51 @@ | |||
| /* | |||
| * 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. | |||
| * | |||
| */ | |||
| package org.apache.tools.ant.taskdefs; | |||
| import org.apache.tools.ant.ProjectHelper; | |||
| import org.apache.tools.ant.ComponentHelper; | |||
| import org.apache.tools.ant.AntTypeDefinition; | |||
| import org.apache.tools.ant.attribute.AttributeNamespace; | |||
| /** | |||
| * Defintion to allow the uri to be considered for | |||
| * ant attributes. | |||
| * | |||
| * @since Ant 1.8.0 | |||
| */ | |||
| public final class AttributeNamespaceDef extends AntlibDefinition { | |||
| /** | |||
| * Run the definition. | |||
| * This registers the xml namespace (uri) as a namepace for | |||
| * attributes. | |||
| */ | |||
| public void execute() { | |||
| String componentName = ProjectHelper.nsToComponentName( | |||
| getURI()); | |||
| AntTypeDefinition def = new AntTypeDefinition(); | |||
| def.setName(componentName); | |||
| def.setClassName(AttributeNamespace.class.getName()); | |||
| def.setClass(AttributeNamespace.class); | |||
| def.setRestrict(true); | |||
| def.setClassLoader(AttributeNamespace.class.getClassLoader()); | |||
| ComponentHelper.getComponentHelper(getProject()) | |||
| .addDataTypeDefinition(def); | |||
| } | |||
| } | |||
| @@ -20,6 +20,7 @@ antstructure=org.apache.tools.ant.taskdefs.AntStructure | |||
| antversion=org.apache.tools.ant.taskdefs.condition.AntVersion | |||
| apply=org.apache.tools.ant.taskdefs.Transform | |||
| apt=org.apache.tools.ant.taskdefs.Apt | |||
| attributenamespacedef=org.apache.tools.ant.taskdefs.AttributeNamespaceDef | |||
| augment=org.apache.tools.ant.taskdefs.AugmentReference | |||
| available=org.apache.tools.ant.taskdefs.Available | |||
| basename=org.apache.tools.ant.taskdefs.Basename | |||
| @@ -0,0 +1,60 @@ | |||
| <?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 name="ant-attribute-test" default="antunit" | |||
| xmlns:au="antlib:org.apache.ant.antunit" | |||
| xmlns:if="ant:if" | |||
| xmlns:unless="ant:unless" | |||
| > | |||
| <import file="../antunit-base.xml" /> | |||
| <target name="test-if-set"> | |||
| <echo message="message1" if:set="not-set"/> | |||
| <au:assertLogDoesntContain text="message1"/> | |||
| </target> | |||
| <target name="test-unless-set"> | |||
| <echo message="message2" unless:set="not-set"/> | |||
| <au:assertLogContains text="message2"/> | |||
| </target> | |||
| <target name="test-if-true"> | |||
| <property name="sample" value="true"/> | |||
| <echo message="message3" if:true="${sample}"/> | |||
| <au:assertLogContains text="message3"/> | |||
| </target> | |||
| <target name="test-if-true-false"> | |||
| <property name="sample-1" value="false"/> | |||
| <echo message="message4" if:true="${sample-1}"/> | |||
| <au:assertLogDoesntContain text="message4"/> | |||
| </target> | |||
| <target name="test-unless-true-false"> | |||
| <property name="sample-1" value="false"/> | |||
| <echo message="message5" unless:true="${sample-1}"/> | |||
| <au:assertLogContains text="message5"/> | |||
| </target> | |||
| <target name="test-if-blank"> | |||
| <property name="sample-1" value=""/> | |||
| <echo message="message6" if:blank="${sample-1}"/> | |||
| <au:assertLogContains text="message6"/> | |||
| </target> | |||
| </project> | |||