From 51c4c2282c499b0cd2ba4eee88dce948f388e74d Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Thu, 13 Jul 2000 15:23:07 +0000 Subject: [PATCH] Resolve properties loaded from files in a more predictable way. Submitted by: Glenn McAllister git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@267776 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/tools/ant/ProjectHelper.java | 3 +- .../apache/tools/ant/taskdefs/Property.java | 118 +++++++++++++----- 2 files changed, 91 insertions(+), 30 deletions(-) diff --git a/src/main/org/apache/tools/ant/ProjectHelper.java b/src/main/org/apache/tools/ant/ProjectHelper.java index 60dcb8d8d..9730af591 100644 --- a/src/main/org/apache/tools/ant/ProjectHelper.java +++ b/src/main/org/apache/tools/ant/ProjectHelper.java @@ -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; diff --git a/src/main/org/apache/tools/ant/taskdefs/Property.java b/src/main/org/apache/tools/ant/taskdefs/Property.java index 924b49519..872a02887 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Property.java +++ b/src/main/org/apache/tools/ant/taskdefs/Property.java @@ -64,6 +64,7 @@ import java.util.*; * * @author costin@dnt.ro * @author Sam Ruby + * @author Glenn McAllister */ 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); } + }