FileDocCategorySizeDatePackage
Property.javaAPI DocApache Ant 1.7020164Wed Dec 13 06:16:22 GMT 2006org.apache.tools.ant.taskdefs

Property

public class Property extends org.apache.tools.ant.Task
Sets a property by name, or set of properties (from file or resource) in the project.

Properties are immutable: whoever sets a property first freezes it for the rest of the build; they are most definitely not variable.

There are five ways to set properties:

  • By supplying both the name and value attribute.
  • By supplying both the name and refid attribute.
  • By setting the file attribute with the filename of the property file to load. This property file has the format as defined by the file used in the class java.util.Properties.
  • By setting the resource attribute with the resource name of the property file to load. This property file has the format as defined by the file used in the class java.util.Properties.
  • By setting the environment attribute with a prefix to use. Properties will be defined for every environment variable by prefixing the supplied name and a period to the name of the variable.

Although combinations of these ways are possible, only one should be used at a time. Problems might occur with the order in which properties are set, for instance.

The value part of the properties being set, might contain references to other properties. These references are resolved at the time these properties are set. This also holds for properties loaded from a property file.

Properties are case sensitive.
since
Ant 1.1
ant.attribute.group
name="name" description="One of these, when using the name attribute"
ant.attribute.group
name="noname" description="One of these, when not using the name attribute"
ant.task
category="property"

Fields Summary
protected String
name
protected String
value
protected File
file
protected URL
url
protected String
resource
protected org.apache.tools.ant.types.Path
classpath
protected String
env
protected org.apache.tools.ant.types.Reference
ref
protected String
prefix
private org.apache.tools.ant.Project
fallback
protected boolean
userProperty
Constructors Summary
public Property()
Constructor for Property.

        this(false);
    
protected Property(boolean userProperty)
Constructor for Property.

param
userProperty if true this is a user property
since
Ant 1.5

        this(userProperty, null);
    
protected Property(boolean userProperty, org.apache.tools.ant.Project fallback)
Constructor for Property.

param
userProperty if true this is a user property
param
fallback a project to use to look for references if the reference is not in the current project
since
Ant 1.5

        this.userProperty = userProperty;
        this.fallback = fallback;
    
Methods Summary
protected voidaddProperties(java.util.Properties props)
iterate through a set of properties, resolve them then assign them

param
props the properties to iterate over

        resolveAllProperties(props);
        Enumeration e = props.keys();
        while (e.hasMoreElements()) {
            String propertyName = (String) e.nextElement();
            String propertyValue = props.getProperty(propertyName);

            String v = getProject().replaceProperties(propertyValue);

            if (prefix != null) {
                propertyName = prefix + propertyName;
            }

            addProperty(propertyName, v);
        }
    
protected voidaddProperty(java.lang.String n, java.lang.String v)
add a name value pair to the project property set

param
n name of property
param
v value to set

        if (userProperty) {
            if (getProject().getUserProperty(n) == null) {
                getProject().setInheritedProperty(n, v);
            } else {
                log("Override ignored for " + n, Project.MSG_VERBOSE);
            }
        } else {
            getProject().setNewProperty(n, v);
        }
    
public org.apache.tools.ant.types.PathcreateClasspath()
The classpath to use when looking up a resource.

return
a path to be configured

        if (this.classpath == null) {
            this.classpath = new Path(getProject());
        }
        return this.classpath.createPath();
    
public voidexecute()
set the property in the project to the value. if the task was give a file, resource or env attribute here is where it is loaded

throws
BuildException on error

        if (getProject() == null) {
            throw new IllegalStateException("project has not been set");
        }

        if (name != null) {
            if (value == null && ref == null) {
                throw new BuildException("You must specify value, location or "
                                         + "refid with the name attribute",
                                         getLocation());
            }
        } else {
            if (url == null && file == null && resource == null && env == null) {
                throw new BuildException("You must specify url, file, resource or "
                                         + "environment when not using the "
                                         + "name attribute", getLocation());
            }
        }

        if (url == null && file == null && resource == null && prefix != null) {
            throw new BuildException("Prefix is only valid when loading from "
                                     + "a url, file or resource", getLocation());
        }

        if ((name != null) && (value != null)) {
            addProperty(name, value);
        }

        if (file != null) {
            loadFile(file);
        }

        if (url != null) {
            loadUrl(url);
        }

        if (resource != null) {
            loadResource(resource);
        }

        if (env != null) {
            loadEnvironment(env);
        }

        if ((name != null) && (ref != null)) {
            try {
                addProperty(name,
                            ref.getReferencedObject(getProject()).toString());
            } catch (BuildException be) {
                if (fallback != null) {
                    addProperty(name,
                                ref.getReferencedObject(fallback).toString());
                } else {
                    throw be;
                }
            }
        }
    
public org.apache.tools.ant.types.PathgetClasspath()
Get the classpath used when looking up a resource.

return
the classpath
since
Ant 1.5

        return classpath;
    
public java.lang.StringgetEnvironment()
Get the environment attribute.

return
the environment attribute
since
Ant 1.5

        return env;
    
public java.io.FilegetFile()
Get the file attribute.

return
the file attribute

        return file;
    
public java.lang.StringgetName()
Get the property name.

return
the property name

        return name;
    
public java.lang.StringgetPrefix()
Get the prefix attribute.

return
the prefix attribute
since
Ant 1.5

        return prefix;
    
public org.apache.tools.ant.types.ReferencegetRefid()
Get the refid attribute.

return
the refid attribute

        return ref;
    
public java.lang.StringgetResource()
Get the resource attribute.

return
the resource attribute

        return resource;
    
public java.net.URLgetUrl()
Get the url attribute.

return
the url attribute

        return url;
    
public java.lang.StringgetValue()
Get the property value.

return
the property value

        return value;
    
protected voidloadEnvironment(java.lang.String prefix)
load the environment values

param
prefix prefix to place before them

        Properties props = new Properties();
        if (!prefix.endsWith(".")) {
            prefix += ".";
        }
        log("Loading Environment " + prefix, Project.MSG_VERBOSE);
        Vector osEnv = Execute.getProcEnvironment();
        for (Enumeration e = osEnv.elements(); e.hasMoreElements();) {
            String entry = (String) e.nextElement();
            int pos = entry.indexOf('=");
            if (pos == -1) {
                log("Ignoring: " + entry, Project.MSG_WARN);
            } else {
                props.put(prefix + entry.substring(0, pos),
                entry.substring(pos + 1));
            }
        }
        addProperties(props);
    
protected voidloadFile(java.io.File file)
load properties from a file

param
file file to load
throws
BuildException on error

        Properties props = new Properties();
        log("Loading " + file.getAbsolutePath(), Project.MSG_VERBOSE);
        try {
            if (file.exists()) {
                FileInputStream fis = new FileInputStream(file);
                try {
                    props.load(fis);
                } finally {
                    if (fis != null) {
                        fis.close();
                    }
                }
                addProperties(props);
            } else {
                log("Unable to find property file: " + file.getAbsolutePath(),
                    Project.MSG_VERBOSE);
            }
        } catch (IOException ex) {
            throw new BuildException(ex, getLocation());
        }
    
protected voidloadResource(java.lang.String name)
load properties from a resource in the current classpath

param
name name of resource to load

        Properties props = new Properties();
        log("Resource Loading " + name, Project.MSG_VERBOSE);
        InputStream is = null;
        try {
            ClassLoader cL = null;

            if (classpath != null) {
                cL = getProject().createClassLoader(classpath);
            } else {
                cL = this.getClass().getClassLoader();
            }

            if (cL == null) {
                is = ClassLoader.getSystemResourceAsStream(name);
            } else {
                is = cL.getResourceAsStream(name);
            }

            if (is != null) {
                props.load(is);
                addProperties(props);
            } else {
                log("Unable to find resource " + name, Project.MSG_WARN);
            }
        } catch (IOException ex) {
            throw new BuildException(ex, getLocation());
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    // ignore
                }
            }
        }

    
protected voidloadUrl(java.net.URL url)
load properties from a url

param
url url to load from
throws
BuildException on error

        Properties props = new Properties();
        log("Loading " + url, Project.MSG_VERBOSE);
        try {
            InputStream is = url.openStream();
            try {
                props.load(is);
            } finally {
                if (is != null) {
                    is.close();
                }
            }
            addProperties(props);
        } catch (IOException ex) {
            throw new BuildException(ex, getLocation());
        }
    
private voidresolve(java.util.Properties props, java.lang.String name, java.util.Stack referencesSeen)
Recursively expand the named property using the project's reference table and the given set of properties - fail if a circular definition is detected.

param
props properties object to resolve
param
name of the property to resolve
param
referencesSeen stack of all property names that have been tried to expand before coming here.

        if (referencesSeen.contains(name)) {
            throw new BuildException("Property " + name + " was circularly "
                                     + "defined.");
        }

        String propertyValue = props.getProperty(name);
        Vector fragments = new Vector();
        Vector propertyRefs = new Vector();
        PropertyHelper.getPropertyHelper(
            this.getProject()).parsePropertyString(
                propertyValue, fragments, propertyRefs);

        if (propertyRefs.size() != 0) {
            referencesSeen.push(name);
            StringBuffer sb = new StringBuffer();
            Enumeration i = fragments.elements();
            Enumeration j = propertyRefs.elements();
            while (i.hasMoreElements()) {
                String fragment = (String) i.nextElement();
                if (fragment == null) {
                    String propertyName = (String) j.nextElement();
                    fragment = getProject().getProperty(propertyName);
                    if (fragment == null) {
                        if (props.containsKey(propertyName)) {
                            resolve(props, propertyName, referencesSeen);
                            fragment = props.getProperty(propertyName);
                        } else {
                            fragment = "${" + propertyName + "}";
                        }
                    }
                }
                sb.append(fragment);
            }
            propertyValue = sb.toString();
            props.put(name, propertyValue);
            referencesSeen.pop();
        }
    
private voidresolveAllProperties(java.util.Properties props)
resolve properties inside a properties hashtable

param
props properties object to resolve

        for (Enumeration e = props.keys(); e.hasMoreElements();) {
            String propertyName = (String) e.nextElement();
            Stack referencesSeen = new Stack();
            resolve(props, propertyName, referencesSeen);
        }
    
public voidsetClasspath(org.apache.tools.ant.types.Path classpath)
The classpath to use when looking up a resource.

param
classpath to add to any existing classpath

        if (this.classpath == null) {
            this.classpath = classpath;
        } else {
            this.classpath.append(classpath);
        }
    
public voidsetClasspathRef(org.apache.tools.ant.types.Reference r)
the classpath to use when looking up a resource, given as reference to a <path> defined elsewhere

param
r a reference to a classpath

        createClasspath().setRefid(r);
    
public voidsetEnvironment(java.lang.String env)
Prefix to use when retrieving environment variables. Thus if you specify environment="myenv" you will be able to access OS-specific environment variables via property names "myenv.PATH" or "myenv.TERM".

Note that if you supply a property name with a final "." it will not be doubled. ie environment="myenv." will still allow access of environment variables through "myenv.PATH" and "myenv.TERM". This functionality is currently only implemented on select platforms. Feel free to send patches to increase the number of platforms this functionality is supported on ;).
Note also that properties are case sensitive, even if the environment variables on your operating system are not, e.g. it will be ${env.Path} not ${env.PATH} on Windows 2000.

param
env prefix
ant.attribute
group="noname"

        this.env = env;
    
public voidsetFile(java.io.File file)
Filename of a property file to load.

param
file filename
ant.attribute
group="noname"

        this.file = file;
    
public voidsetLocation(java.io.File location)
Sets the property to the absolute filename of the given file. If the value of this attribute is an absolute path, it is left unchanged (with / and \ characters converted to the current platforms conventions). Otherwise it is taken as a path relative to the project's basedir and expanded.

param
location path to set
ant.attribute
group="name"

        setValue(location.getAbsolutePath());
    
public voidsetName(java.lang.String name)
The name of the property to set.

param
name property name

        this.name = name;
    
public voidsetPrefix(java.lang.String prefix)
Prefix to apply to properties loaded using file or resource. A "." is appended to the prefix if not specified.

param
prefix prefix string
since
Ant 1.5

        this.prefix = prefix;
        if (!prefix.endsWith(".")) {
            this.prefix += ".";
        }
    
public voidsetRefid(org.apache.tools.ant.types.Reference ref)
Sets a reference to an Ant datatype declared elsewhere. Only yields reasonable results for references PATH like structures or properties.

param
ref reference
ant.attribute
group="name"

        this.ref = ref;
    
public voidsetResource(java.lang.String resource)
The resource name of a property file to load

param
resource resource on classpath
ant.attribute
group="noname"

        this.resource = resource;
    
public voidsetUrl(java.net.URL url)
The url from which to load properties.

param
url url string
ant.attribute
group="noname"

        this.url = url;
    
public voidsetUserProperty(boolean userProperty)

param
userProperty ignored
deprecated
since 1.5.x. This was never a supported feature and has been deprecated without replacement.
ant.attribute
ignore="true"

        log("DEPRECATED: Ignoring request to set user property in Property"
            + " task.", Project.MSG_WARN);
    
public voidsetValue(java.lang.String value)
The value of the property.

param
value value to assign
ant.attribute
group="name"

        this.value = value;
    
public java.lang.StringtoString()
get the value of this property

return
the current value or the empty string

        return value == null ? "" : value;