Browse Source

Resolve properties loaded from files in a more predictable way.

Submitted by:	Glenn McAllister <glennm@ca.ibm.com>


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@267776 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 25 years ago
parent
commit
51c4c2282c
2 changed files with 91 additions and 30 deletions
  1. +2
    -1
      src/main/org/apache/tools/ant/ProjectHelper.java
  2. +89
    -29
      src/main/org/apache/tools/ant/taskdefs/Property.java

+ 2
- 1
src/main/org/apache/tools/ant/ProjectHelper.java View File

@@ -480,7 +480,8 @@ public class ProjectHelper {
value );
}
String n=value.substring( pos+2, endName );
String v=(String) keys.get( n );
String v= (keys.containsKey(n)) ? (String) keys.get( n )
: "${"+n+"}";
//System.out.println("N: " + n + " " + " V:" + v);
sb.append( v );
prev=endName+1;


+ 89
- 29
src/main/org/apache/tools/ant/taskdefs/Property.java View File

@@ -64,6 +64,7 @@ import java.util.*;
*
* @author costin@dnt.ro
* @author Sam Ruby <rubys@us.ibm.com>
* @author Glenn McAllister <glennm@ca.ibm.com>
*/
public class Property extends Task {

@@ -101,20 +102,7 @@ public class Property extends Task {
public void init() throws BuildException {
try {
if ((name != null) && (value != null)) {
if( userProperty )
if (project.getUserProperty(name) == null) {
project.setUserProperty(name, value);
} else {
log("Override ignored for " + name,
Project.MSG_VERBOSE);
}
else
if (project.getProperty(name) == null) {
project.setProperty(name, value);
} else {
log("Override ignored for " + name,
Project.MSG_VERBOSE);
}
addProperty(name, value);
}

if (file != null) loadFile(file);
@@ -126,16 +114,18 @@ public class Property extends Task {
}
}

private void loadFile (String name) {
private void loadFile (String name) throws BuildException {
Properties props = new Properties();
log("Loading " + name, Project.MSG_VERBOSE);
try {
if (new File(name).exists()) {
props.load(new FileInputStream(name));
addProperties(props);
} else {
log("Unable to find " + name, Project.MSG_VERBOSE);
}
} catch(Exception ex) {
ex.printStackTrace();
throw new BuildException(ex.getMessage(), ex, location);
}
}

@@ -154,29 +144,99 @@ public class Property extends Task {
}

private void addProperties(Properties props) {
resolveAllProperties(props);
Enumeration e = props.keys();
while (e.hasMoreElements()) {
String name = (String) e.nextElement();
String value = (String) props.getProperty(name);
String v = ProjectHelper.replaceProperties(value, project.getProperties());
if( userProperty )
if (project.getUserProperty(name) == null) {
project.setUserProperty(name, v);
} else {
log("Override ignored for " + name,
Project.MSG_VERBOSE);
addProperty(name, value);
}
}

public void setUserProperty( boolean userP ) {
userProperty=userP;
}

private void addProperty(String n, String v) {
if( userProperty ) {
if (project.getUserProperty(n) == null) {
project.setUserProperty(n, v);
} else {
log("Override ignored for " + name, Project.MSG_VERBOSE);
}
} else {
if (project.getProperty(n) == null) {
project.setProperty(n, v);
} else {
log("Override ignored for " + name, Project.MSG_VERBOSE);
}
}
}

private void resolveAllProperties(Hashtable props) {
Hashtable toResolve = new Hashtable();
Enumeration e = props.keys();
boolean more = true;
while (more) {
while (e.hasMoreElements()) {
Vector propsInValue = new Vector();
String name = (String) e.nextElement();
String value = (String) props.get(name);

if (extractProperties(value, propsInValue)) {
for (int i=0; i < propsInValue.size(); i++) {
String elem = (String) propsInValue.elementAt(i);
if (project.getProperties().containsKey(elem) ||
props.containsKey(elem)) {
toResolve.put(name, value);
break;
}
}
}
else
if (project.getProperty(name) == null) {
project.setProperty(name, v);

if (toResolve.size() > 0) {
Enumeration tre = toResolve.keys();
while (tre.hasMoreElements()) {
String name2 = (String) tre.nextElement();
String value2 = (String) toResolve.get(name2);
String v = ProjectHelper.replaceProperties(value2,
project.getProperties());
v = ProjectHelper.replaceProperties(v, props);
props.put(name, v);
}

toResolve.clear();
e = props.keys();
} else {
log("Override ignored for " + name,
Project.MSG_VERBOSE);
more = false;
}
}
}
}

public void setUserProperty( boolean userP ) {
userProperty=userP;
private boolean extractProperties(String source, Vector properties) {
// This is an abreviated version of
// ProjectHelper.replaceProperties method
int i=0;
int prev=0;
int pos;

while( (pos=source.indexOf( "$", prev )) >= 0 ) {
if( pos == (source.length() - 1)) {
prev = pos + 1;
} else if (source.charAt( pos + 1 ) != '{' ) {
prev=pos+2;
} else {
int endName=source.indexOf( '}', pos );
String n=source.substring( pos+2, endName );
properties.addElement(n);
prev=endName+1;
}
}
return (properties.size() > 0);
}
}

Loading…
Cancel
Save