Author: maartenc Date: Wed Jan 9 13:02:58 2008 New Revision: 610562 URL: http://svn.apache.org/viewvc?rev=610562&view=rev Log: NEW: Add support for importing environment variables (IVY-608)
Modified: ant/ivy/core/trunk/CHANGES.txt ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyAntVariableContainer.java ant/ivy/core/trunk/src/java/org/apache/ivy/core/IvyPatternHelper.java ant/ivy/core/trunk/src/java/org/apache/ivy/core/retrieve/RetrieveEngineSettings.java ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvySettings.java ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvyVariableContainer.java ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvyVariableContainerImpl.java ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/XmlSettingsParser.java ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyConfigureTest.java ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyTaskTest.java Modified: ant/ivy/core/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/CHANGES.txt?rev=610562&r1=610561&r2=610562&view=diff ============================================================================== --- ant/ivy/core/trunk/CHANGES.txt (original) +++ ant/ivy/core/trunk/CHANGES.txt Wed Jan 9 13:02:58 2008 @@ -59,6 +59,7 @@ version in SVN ===================================== - NEW: Introduce RepositoryManagementEngine (IVY-665 - not completed yet) +- NEW: Add support for importing environment variables (IVY-608) - IMPROVEMENT: Make IBiblio resolver compatible with maven proxy (IVY-466) - IMPROVEMENT: Use namespace aware validation (IVY-553) Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyAntVariableContainer.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyAntVariableContainer.java?rev=610562&r1=610561&r2=610562&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyAntVariableContainer.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyAntVariableContainer.java Wed Jan 9 13:02:58 2008 @@ -26,6 +26,7 @@ import org.apache.ivy.core.settings.IvyVariableContainerImpl; import org.apache.ivy.util.Message; import org.apache.tools.ant.Project; +import org.apache.tools.ant.taskdefs.Property; class IvyAntVariableContainer extends IvyVariableContainerImpl implements IvyVariableContainer { @@ -48,13 +49,6 @@ return r; } - public Map getVariables() { - Map r = new HashMap(super.getVariables()); - r.putAll(project.getProperties()); - r.putAll(overwrittenProperties); - return r; - } - public void setVariable(String varName, String value, boolean overwrite) { if (overwrite) { Message.debug("setting '" + varName + "' to '" + value + "'"); @@ -88,6 +82,14 @@ if (id != null) { setPropertyIfNotSet((String) entry.getKey() + "." + id, (String) entry.getValue()); } + } + + if (getEnvironmentPrefix() != null) { + Property propTask = new Property(); + propTask.setProject(project); + propTask.setEnvironment(getEnvironmentPrefix()); + propTask.init(); + propTask.execute(); } } Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/IvyPatternHelper.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/IvyPatternHelper.java?rev=610562&r1=610561&r2=610562&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/IvyPatternHelper.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/IvyPatternHelper.java Wed Jan 9 13:02:58 2008 @@ -31,7 +31,8 @@ import org.apache.ivy.core.module.descriptor.Artifact; import org.apache.ivy.core.module.descriptor.DefaultArtifact; import org.apache.ivy.core.module.id.ModuleRevisionId; -import org.apache.ivy.plugins.resolver.DependencyResolver; +import org.apache.ivy.core.settings.IvyVariableContainer; +import org.apache.ivy.core.settings.IvyVariableContainerImpl; import org.apache.ivy.util.Message; /** @@ -151,15 +152,15 @@ return substituteTokens(pattern, tokens); } - public static String substitute(String pattern, Map variables, Map tokens) { - return substituteTokens(substituteVariables(pattern, variables), tokens); + public static String substituteVariables(String pattern, Map variables) { + return substituteVariables(pattern, new IvyVariableContainerImpl(variables), new Stack()); } - public static String substituteVariables(String pattern, Map variables) { + public static String substituteVariables(String pattern, IvyVariableContainer variables) { return substituteVariables(pattern, variables, new Stack()); } - private static String substituteVariables(String pattern, Map variables, Stack substituting) { + private static String substituteVariables(String pattern, IvyVariableContainer variables, Stack substituting) { // if you supply null, null is what you get if (pattern == null) { return null; @@ -170,7 +171,7 @@ StringBuffer sb = new StringBuffer(); while (m.find()) { String var = m.group(1); - String val = (String) variables.get(var); + String val = (String) variables.getVariable(var); if (val != null) { int index = substituting.indexOf(var); if (index != -1) { @@ -325,10 +326,10 @@ } public static String substituteParams(String pattern, Map params) { - return substituteParams(pattern, params, new Stack()); + return substituteParams(pattern, new IvyVariableContainerImpl(params), new Stack()); } - private static String substituteParams(String pattern, Map params, Stack substituting) { + private static String substituteParams(String pattern, IvyVariableContainer params, Stack substituting) { // TODO : refactor this with substituteVariables // if you supply null, null is what you get if (pattern == null) { @@ -340,7 +341,7 @@ StringBuffer sb = new StringBuffer(); while (m.find()) { String var = m.group(1); - String val = (String) params.get(var); + String val = (String) params.getVariable(var); if (val != null) { int index = substituting.indexOf(var); if (index != -1) { @@ -361,21 +362,6 @@ m.appendTail(sb); return sb.toString(); - } - - public static void main(String[] args) { - String pattern = "[organisation]/[module]/build/archives/[type]s/" - + "[artifact]-[revision].[ext]"; - System.out.println("pattern= " + pattern); - System.out.println("resolved= " - + substitute(pattern, "apache", "Test", "1.0", "test", "jar", "jar")); - - Map variables = new HashMap(); - variables.put("test", "mytest"); - variables.put("test2", "${test}2"); - pattern = "${test} ${test2} ${nothing}"; - System.out.println("pattern= " + pattern); - System.out.println("resolved= " + substituteVariables(pattern, variables)); } /** Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/retrieve/RetrieveEngineSettings.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/retrieve/RetrieveEngineSettings.java?rev=610562&r1=610561&r2=610562&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/retrieve/RetrieveEngineSettings.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/retrieve/RetrieveEngineSettings.java Wed Jan 9 13:02:58 2008 @@ -17,14 +17,13 @@ */ package org.apache.ivy.core.retrieve; -import java.util.Map; - +import org.apache.ivy.core.settings.IvyVariableContainer; import org.apache.ivy.plugins.parser.ParserSettings; public interface RetrieveEngineSettings extends ParserSettings { boolean isCheckUpToDate(); - Map getVariables(); + IvyVariableContainer getVariables(); } Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvySettings.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvySettings.java?rev=610562&r1=610561&r2=610562&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvySettings.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvySettings.java Wed Jan 9 13:02:58 2008 @@ -574,7 +574,7 @@ * @return the string where all current ivy variables have been substituted by their value */ public String substitute(String str) { - return IvyPatternHelper.substituteVariables(str, getVariables()); + return IvyPatternHelper.substituteVariables(str, variableContainer); } /** @@ -583,8 +583,8 @@ * * @return */ - public Map getVariables() { - return variableContainer.getVariables(); + public IvyVariableContainer getVariables() { + return variableContainer; } public Class typeDef(String name, String className) { Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvyVariableContainer.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvyVariableContainer.java?rev=610562&r1=610561&r2=610562&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvyVariableContainer.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvyVariableContainer.java Wed Jan 9 13:02:58 2008 @@ -17,7 +17,6 @@ */ package org.apache.ivy.core.settings; -import java.util.Map; /** * Store and provide access to the ivy variables. @@ -26,11 +25,18 @@ */ public interface IvyVariableContainer extends Cloneable { - public abstract void setVariable(String varName, String value, boolean overwrite); + public void setVariable(String varName, String value, boolean overwrite); - public abstract Map getVariables(); - - public abstract String getVariable(String name); + public String getVariable(String name); + /** + * Specifies the prefix used to indicate a variable is an environment + * variable. If the prefix doesn't end with a '.', it will be added + * automatically. + * + * @param prefix the prefix to use for the environment variables + */ + public void setEnvironmentPrefix(String prefix); + public Object clone(); } Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvyVariableContainerImpl.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvyVariableContainerImpl.java?rev=610562&r1=610561&r2=610562&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvyVariableContainerImpl.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/IvyVariableContainerImpl.java Wed Jan 9 13:02:58 2008 @@ -25,8 +25,17 @@ public class IvyVariableContainerImpl implements IvyVariableContainer { - private HashMap variables = new HashMap(); + private Map variables; + private String envPrefix; + public IvyVariableContainerImpl() { + this.variables = new HashMap(); + } + + public IvyVariableContainerImpl(Map variables) { + this.variables = variables; + } + /* * (non-Javadoc) * @@ -40,21 +49,27 @@ } else { Message.debug("'" + varName + "' already set: discarding '" + value + "'"); } - + } + + public void setEnvironmentPrefix(String prefix) { + if ((prefix != null) && !prefix.endsWith(".")) { + this.envPrefix = prefix + "."; + } else { + this.envPrefix = prefix; + } } private String substitute(String value) { - return IvyPatternHelper.substituteVariables(value, getVariables()); + return IvyPatternHelper.substituteVariables(value, this); } - /* - * (non-Javadoc) - * - * @see org.apache.ivy.core.settings.IvyVariableContainer#getVariables() - */ - public Map getVariables() { + protected Map getVariables() { return variables; } + + protected String getEnvironmentPrefix() { + return envPrefix; + } /* * (non-Javadoc) @@ -62,8 +77,14 @@ * @see org.apache.ivy.core.settings.IvyVariableContainer#getVariable(java.lang.String) */ public String getVariable(String name) { - String val = (String) variables.get(name); - return val == null ? val : substitute(val); + String val = null; + if ((envPrefix != null) && name.startsWith(envPrefix)) { + val = System.getenv(name.substring(envPrefix.length())); + } else { + val = (String) variables.get(name); + } + + return val; } public Object clone() { @@ -73,7 +94,7 @@ } catch (CloneNotSupportedException e) { throw new RuntimeException("unable to clone a " + this.getClass()); } - clone.variables = (HashMap) variables.clone(); + clone.variables = new HashMap(this.variables); return clone; } } Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/XmlSettingsParser.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/XmlSettingsParser.java?rev=610562&r1=610561&r2=610562&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/XmlSettingsParser.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/XmlSettingsParser.java Wed Jan 9 13:02:58 2008 @@ -221,24 +221,32 @@ .booleanValue()); } else if ("properties".equals(qName)) { String propFilePath = (String) attributes.get("file"); - String override = (String) attributes.get("override"); - try { - Message.verbose("loading properties: " + propFilePath); - ivy.loadProperties(new File(propFilePath), override == null ? true : Boolean - .valueOf(override).booleanValue()); - } catch (Exception fileEx) { - Message.verbose("failed to load properties as file: trying as url: " - + propFilePath); + String environmentPrefix = (String) attributes.get("environment"); + if (propFilePath != null) { + String override = (String) attributes.get("override"); try { - ivy.loadProperties(new URL(propFilePath), override == null ? true : Boolean + Message.verbose("loading properties: " + propFilePath); + ivy.loadProperties(new File(propFilePath), override == null ? true : Boolean .valueOf(override).booleanValue()); - } catch (Exception urlEx) { - throw new IllegalArgumentException( - "unable to load properties from " - + propFilePath - + ". Tried both as an url and a file, with no success. File exception: " - + fileEx + ". URL exception: " + urlEx); + } catch (Exception fileEx) { + Message.verbose("failed to load properties as file: trying as url: " + + propFilePath); + try { + ivy.loadProperties(new URL(propFilePath), override == null ? true : Boolean + .valueOf(override).booleanValue()); + } catch (Exception urlEx) { + throw new IllegalArgumentException( + "unable to load properties from " + + propFilePath + + ". Tried both as an url and a file, with no success. File exception: " + + fileEx + ". URL exception: " + urlEx); + } } + } else if (environmentPrefix != null) { + ivy.getVariableContainer().setEnvironmentPrefix(environmentPrefix); + } else { + throw new IllegalArgumentException("Didn't find a 'file' or 'environment' attribute " + + "on the 'properties' element"); } } else if ("include".equals(qName)) { IvyVariableContainer variables = (IvyVariableContainer) ivy.getVariableContainer() Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyConfigureTest.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyConfigureTest.java?rev=610562&r1=610561&r2=610562&view=diff ============================================================================== --- ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyConfigureTest.java (original) +++ ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyConfigureTest.java Wed Jan 9 13:02:58 2008 @@ -92,12 +92,12 @@ assertEquals(new File("build/cache"), settings.getDefaultCache()); assertEquals(new File("test/repositories/ivysettings.xml").getAbsolutePath(), settings - .getVariables().get("ivy.settings.file")); + .getVariables().getVariable("ivy.settings.file")); assertEquals(new File("test/repositories/ivysettings.xml").toURL().toExternalForm(), - settings.getVariables().get("ivy.settings.url")); - assertEquals(new File("test/repositories").getAbsolutePath(), settings.getVariables().get( + settings.getVariables().getVariable("ivy.settings.url")); + assertEquals(new File("test/repositories").getAbsolutePath(), settings.getVariables().getVariable( "ivy.settings.dir")); - assertEquals("myvalue", settings.getVariables().get("myproperty")); + assertEquals("myvalue", settings.getVariables().getVariable("myproperty")); } /[EMAIL PROTECTED]/ @@ -114,9 +114,9 @@ IvySettings settings = configure.getIvyInstance().getSettings(); assertEquals(new File("build/cache"), settings.getDefaultCache()); - assertEquals(confUrl, settings.getVariables().get("ivy.settings.url")); - assertEquals(confDirUrl, settings.getVariables().get("ivy.settings.dir")); - assertEquals("myvalue", settings.getVariables().get("myproperty")); + assertEquals(confUrl, settings.getVariables().getVariable("ivy.settings.url")); + assertEquals(confDirUrl, settings.getVariables().getVariable("ivy.settings.dir")); + assertEquals("myvalue", settings.getVariables().getVariable("myproperty")); } public void testAntProperties() throws Exception { @@ -129,7 +129,7 @@ IvySettings settings = configure.getIvyInstance().getSettings(); assertNotNull(settings); - assertEquals("myvalue", settings.getVariables().get("myproperty")); + assertEquals("myvalue", settings.getVariables().getVariable("myproperty")); assertEquals("myvalue", settings.getDefaultCache().getName()); } @@ -160,7 +160,7 @@ assertNotNull(settings); assertEquals("lib/test/[artifact]-[revision].[ext]", - settings.getVariables().get("ivy.retrieve.pattern")); + settings.getVariables().getVariable("ivy.retrieve.pattern")); } } Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyTaskTest.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyTaskTest.java?rev=610562&r1=610561&r2=610562&view=diff ============================================================================== --- ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyTaskTest.java (original) +++ ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyTaskTest.java Wed Jan 9 13:02:58 2008 @@ -49,14 +49,14 @@ assertEquals(new File("build/cache"), settings.getDefaultCache()); // The next test doesn't always works on windows (mix C: and c: drive) assertEquals(new File("test/repositories/ivysettings.xml").getAbsolutePath().toUpperCase(), - new File((String) settings.getVariables().get("ivy.settings.file")).getAbsolutePath() + new File((String) settings.getVariables().getVariable("ivy.settings.file")).getAbsolutePath() .toUpperCase()); assertEquals(new File("test/repositories/ivysettings.xml").toURL().toExternalForm() - .toUpperCase(), ((String) settings.getVariables().get("ivy.settings.url")) + .toUpperCase(), ((String) settings.getVariables().getVariable("ivy.settings.url")) .toUpperCase()); assertEquals(new File("test/repositories").getAbsolutePath().toUpperCase(), - ((String) settings.getVariables().get("ivy.settings.dir")).toUpperCase()); - assertEquals("myvalue", settings.getVariables().get("myproperty")); + ((String) settings.getVariables().getVariable("ivy.settings.dir")).toUpperCase()); + assertEquals("myvalue", settings.getVariables().getVariable("myproperty")); } public void testReferencedSettings() throws MalformedURLException { @@ -84,12 +84,12 @@ assertEquals(new File("build/cache"), settings.getDefaultCache()); assertEquals(new File("test/repositories/ivysettings.xml").getAbsolutePath(), settings - .getVariables().get("ivy.settings.file")); + .getVariables().getVariable("ivy.settings.file")); assertEquals(new File("test/repositories/ivysettings.xml").toURL().toExternalForm(), - settings.getVariables().get("ivy.settings.url")); - assertEquals(new File("test/repositories").getAbsolutePath(), settings.getVariables().get( + settings.getVariables().getVariable("ivy.settings.url")); + assertEquals(new File("test/repositories").getAbsolutePath(), settings.getVariables().getVariable( "ivy.settings.dir")); - assertEquals("myvalue", settings.getVariables().get("myproperty")); + assertEquals("myvalue", settings.getVariables().getVariable("myproperty")); }