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 | * 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 | 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> they are in the same namespace as the element they belong to | ||||
| </li> | </li> | ||||
| </ul> | </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> | <p> | ||||
| Other attributes are simply ignored. | Other attributes are simply ignored. | ||||
| </p> | </p> | ||||
| @@ -35,6 +35,7 @@ | |||||
| <li><a href="sysclasspath.html">build.sysclasspath</a></li> | <li><a href="sysclasspath.html">build.sysclasspath</a></li> | ||||
| <li><a href="javacprops.html">Ant properties controlling javac</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="Tasks/common.html">Common Attributes</a></li> | ||||
| <li><a href="ifunless.html">If and Unless Attributes</a></li> | |||||
| </ul> | </ul> | ||||
| <h3>List of Types</h3> | <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"> | <module name="IllegalInstantiation"> | ||||
| <property name="classes" value="java.lang.Boolean"/> | <property name="classes" value="java.lang.Boolean"/> | ||||
| </module> | </module> | ||||
| <module name="InnerAssignment"/> | |||||
| <module name="MagicNumber"/> | |||||
| <!-- <module name="InnerAssignment"/> --> | |||||
| <!-- <module name="MagicNumber"/> --> | |||||
| <module name="MissingSwitchDefault"/> | <module name="MissingSwitchDefault"/> | ||||
| <!-- Allow redundant throw declarations for doc purposes | <!-- Allow redundant throw declarations for doc purposes | ||||
| <module name="RedundantThrows"> | <module name="RedundantThrows"> | ||||
| @@ -120,7 +120,7 @@ | |||||
| <property name="format" value="\s+$"/> | <property name="format" value="\s+$"/> | ||||
| <property name="message" value="Line has trailing spaces."/> | <property name="message" value="Line has trailing spaces."/> | ||||
| </module> | </module> | ||||
| <module name="TodoComment"/> | |||||
| <!-- <module name="TodoComment"/> --> | |||||
| <module name="UpperEll"/> | <module name="UpperEll"/> | ||||
| <!-- allow comment suppression of checks --> | <!-- allow comment suppression of checks --> | ||||
| <module name="FileContentsHolder"/> | <module name="FileContentsHolder"/> | ||||
| @@ -316,6 +316,7 @@ public class ComponentHelper { | |||||
| public void initDefaultDefinitions() { | public void initDefaultDefinitions() { | ||||
| initTasks(); | initTasks(); | ||||
| initTypes(); | 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 | * @since Ant 1.9.0 | ||||
| */ | */ | ||||
| public static final String ANT_VM_LAUNCHER_REF_ID = "ant.vmLauncher"; | 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 */ | /** The URI for antlib current definitions */ | ||||
| public static final String ANT_CURRENT_URI = "ant:current"; | 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> */ | /** The URI for defined types/tasks - the format is antlib:<package> */ | ||||
| public static final String ANTLIB_URI = "antlib:"; | public static final String ANTLIB_URI = "antlib:"; | ||||
| @@ -522,6 +527,16 @@ public class ProjectHelper { | |||||
| return componentName.substring(index + 1); | 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. | * Add location to build exception. | ||||
| * @param ex the build exception, if the 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.List; | ||||
| import java.util.Map.Entry; | import java.util.Map.Entry; | ||||
| import org.apache.tools.ant.attribute.EnableAttribute; | |||||
| import org.apache.tools.ant.util.CollectionUtils; | import org.apache.tools.ant.util.CollectionUtils; | ||||
| import org.apache.tools.ant.taskdefs.MacroDef.Attribute; | import org.apache.tools.ant.taskdefs.MacroDef.Attribute; | ||||
| import org.apache.tools.ant.taskdefs.MacroInstance; | import org.apache.tools.ant.taskdefs.MacroInstance; | ||||
| @@ -64,6 +66,9 @@ public class RuntimeConfigurable implements Serializable { | |||||
| */ | */ | ||||
| private transient AttributeList attributes; | 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 | /** Attribute names and values. While the XML spec doesn't require | ||||
| * preserving the order ( AFAIK ), some ant tests do rely on the | * preserving the order ( AFAIK ), some ant tests do rely on the | ||||
| * exact order. | * exact order. | ||||
| @@ -113,6 +118,73 @@ public class RuntimeConfigurable implements Serializable { | |||||
| proxyConfigured = false; | 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 | * Sets the creator of the element to be configured | ||||
| * used to store the element in the parent. | * used to store the element in the parent. | ||||
| @@ -177,6 +249,9 @@ public class RuntimeConfigurable implements Serializable { | |||||
| * @param value the attribute's value. | * @param value the attribute's value. | ||||
| */ | */ | ||||
| public synchronized void setAttribute(String name, String value) { | public synchronized void setAttribute(String name, String value) { | ||||
| if (name.indexOf(':') != -1) { | |||||
| namespacedAttribute = true; | |||||
| } | |||||
| setAttribute(name, (Object) value); | setAttribute(name, (Object) value); | ||||
| } | } | ||||
| @@ -170,6 +170,9 @@ public class UnknownElement extends Task { | |||||
| * | * | ||||
| */ | */ | ||||
| public void configure(Object realObject) { | public void configure(Object realObject) { | ||||
| if (realObject == null) { | |||||
| return; | |||||
| } | |||||
| realThing = realObject; | realThing = realObject; | ||||
| getWrapper().setProxy(realThing); | getWrapper().setProxy(realThing); | ||||
| @@ -281,10 +284,8 @@ public class UnknownElement extends Task { | |||||
| */ | */ | ||||
| public void execute() { | public void execute() { | ||||
| if (realThing == null) { | 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 { | try { | ||||
| if (realThing instanceof Task) { | if (realThing instanceof Task) { | ||||
| @@ -346,6 +347,14 @@ public class UnknownElement extends Task { | |||||
| RuntimeConfigurable childWrapper = parentWrapper.getChild(i); | RuntimeConfigurable childWrapper = parentWrapper.getChild(i); | ||||
| UnknownElement child = it.next(); | UnknownElement child = it.next(); | ||||
| try { | 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( | if (!handleChild( | ||||
| parentUri, ih, parent, child, childWrapper)) { | parentUri, ih, parent, child, childWrapper)) { | ||||
| if (!(parent instanceof TaskContainer)) { | 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. | * @return the task or data type represented by the given unknown element. | ||||
| */ | */ | ||||
| protected Object makeObject(UnknownElement ue, RuntimeConfigurable w) { | protected Object makeObject(UnknownElement ue, RuntimeConfigurable w) { | ||||
| if (!w.isEnabled(ue)) { | |||||
| return null; | |||||
| } | |||||
| ComponentHelper helper = ComponentHelper.getComponentHelper( | ComponentHelper helper = ComponentHelper.getComponentHelper( | ||||
| getProject()); | getProject()); | ||||
| String name = ue.getComponentName(); | 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 | antversion=org.apache.tools.ant.taskdefs.condition.AntVersion | ||||
| apply=org.apache.tools.ant.taskdefs.Transform | apply=org.apache.tools.ant.taskdefs.Transform | ||||
| apt=org.apache.tools.ant.taskdefs.Apt | apt=org.apache.tools.ant.taskdefs.Apt | ||||
| attributenamespacedef=org.apache.tools.ant.taskdefs.AttributeNamespaceDef | |||||
| augment=org.apache.tools.ant.taskdefs.AugmentReference | augment=org.apache.tools.ant.taskdefs.AugmentReference | ||||
| available=org.apache.tools.ant.taskdefs.Available | available=org.apache.tools.ant.taskdefs.Available | ||||
| basename=org.apache.tools.ant.taskdefs.Basename | 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> | |||||