diff --git a/proposal/mutant/ant1compat.xml b/proposal/mutant/ant1compat.xml index 5cfd8852e..c367f448c 100644 --- a/proposal/mutant/ant1compat.xml +++ b/proposal/mutant/ant1compat.xml @@ -278,7 +278,7 @@ - + diff --git a/proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ExecutionFrame.java b/proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ExecutionFrame.java index 4be06ddcc..9e8133a03 100755 --- a/proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ExecutionFrame.java +++ b/proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ExecutionFrame.java @@ -72,6 +72,7 @@ import org.apache.ant.common.model.Target; import org.apache.ant.common.service.ComponentService; import org.apache.ant.common.service.DataService; import org.apache.ant.common.service.FileService; +import org.apache.ant.common.service.MagicProperties; import org.apache.ant.common.util.AntException; import org.apache.ant.common.util.ConfigException; import org.apache.ant.common.util.ExecutionException; @@ -88,9 +89,6 @@ import org.apache.ant.init.InitConfig; * @created 14 January 2002 */ public class ExecutionFrame { - /** A magic property which sets the execution base directory */ - public final static String BASEDIR_PROP = "basedir"; - /** The Ant aspect used to identify Ant metadata */ public final static String ANT_ASPECT = "ant"; @@ -206,6 +204,7 @@ public class ExecutionFrame { configureServices(); componentManager.setStandardLibraries(standardLibs); + setMagicProperties(); } /** @@ -248,6 +247,17 @@ public class ExecutionFrame { addProperties(System.getProperties()); } + /** + * Set the values of various magic properties + * + * @exception ExecutionException if the properties cannot be set + */ + protected void setMagicProperties() throws ExecutionException { + // set up various magic properties + setDataValue(MagicProperties.ANT_HOME, + initConfig.getAntHome().toString(), true); + } + /** * Gets the project model this frame is working with * @@ -606,17 +616,17 @@ public class ExecutionFrame { Target target = project.getTarget(targetName); String ifCondition = target.getIfCondition(); String unlessCondition = target.getUnlessCondition(); - + if (ifCondition != null) { ifCondition = dataService.replacePropertyRefs(ifCondition.trim()); if (!isDataValueSet(ifCondition)) { return; } } - + if (unlessCondition != null) { - unlessCondition - = dataService.replacePropertyRefs(unlessCondition.trim()); + unlessCondition + = dataService.replacePropertyRefs(unlessCondition.trim()); if (isDataValueSet(unlessCondition)) { return; } @@ -712,8 +722,9 @@ public class ExecutionFrame { * determined */ private void determineBaseDirs() throws ExecutionException { - if (isDataValueSet(BASEDIR_PROP)) { - baseDir = new File(getDataValue(BASEDIR_PROP).toString()); + if (isDataValueSet(MagicProperties.BASEDIR)) { + baseDir + = new File(getDataValue(MagicProperties.BASEDIR).toString()); } else { URL projectURL = project.getSourceURL(); if (projectURL.getProtocol().equals("file")) { @@ -729,8 +740,8 @@ public class ExecutionFrame { } else { baseDir = new File("."); } - setDataValue(BASEDIR_PROP, baseDir.getPath(), true); } + setDataValue(MagicProperties.BASEDIR, baseDir.getAbsolutePath(), true); for (Iterator i = getReferencedFrames(); i.hasNext(); ) { ExecutionFrame refFrame = (ExecutionFrame)i.next(); @@ -747,7 +758,7 @@ public class ExecutionFrame { fileService = new ExecutionFileService(this); componentManager = new ComponentManager(this, config.isRemoteLibAllowed()); - dataService = new ExecutionDataService(this, + dataService = new ExecutionDataService(this, config.isUnsetPropertiesAllowed()); services.put(FileService.class, fileService); diff --git a/proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Ant1Factory.java b/proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Ant1Factory.java index 8e9b94481..9b5822bfc 100644 --- a/proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Ant1Factory.java +++ b/proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Ant1Factory.java @@ -56,6 +56,7 @@ import org.apache.ant.common.antlib.AntContext; import org.apache.ant.common.antlib.Converter; import org.apache.ant.common.antlib.StandardLibFactory; import org.apache.ant.common.util.ExecutionException; +import org.apache.ant.init.LoaderUtils; /** * The factory object for the Ant1 compatability Ant library @@ -81,10 +82,16 @@ public class Ant1Factory extends StandardLibFactory { */ public void init(AntContext context) throws ExecutionException { this.context = context; + // set the system classpath. In Ant2, the system classpath will not + // in general, have any useful information. For Ant1 compatability + // we set it now to include the Ant1 facade classes + System.setProperty("java.class.path", getAnt1Classpath()); + project = new Project(); project.init(context); } + /** * Create an instance of the requested type class * @@ -196,5 +203,16 @@ public class Ant1Factory extends StandardLibFactory { component.setProject(project); } } + + /** + * Get an Ant1 equivalent classpath + * + * @return an Ant1 suitable classpath + */ + String getAnt1Classpath() { + ClassLoader classLoader = getClass().getClassLoader(); + String path = LoaderUtils.getClasspath(classLoader); + return path; + } } diff --git a/proposal/mutant/src/java/common/org/apache/ant/common/service/MagicProperties.java b/proposal/mutant/src/java/common/org/apache/ant/common/service/MagicProperties.java new file mode 100644 index 000000000..2aa3fba74 --- /dev/null +++ b/proposal/mutant/src/java/common/org/apache/ant/common/service/MagicProperties.java @@ -0,0 +1,72 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.ant.common.service; + +/** + * Ant's magic properties + * + * @author Conor MacNeill + * @created 7 February 2002 + */ +public class MagicProperties { + /** + * This property describes the basedir which is being used for an Ant + * run. + */ + public final static String BASEDIR = "basedir"; + + /** This property provides the location of Ant's home directory */ + public final static String ANT_HOME = "ant.home"; +} + diff --git a/proposal/mutant/src/java/init/org/apache/ant/init/LoaderUtils.java b/proposal/mutant/src/java/init/org/apache/ant/init/LoaderUtils.java index 12b04d4b9..e21e2d726 100755 --- a/proposal/mutant/src/java/init/org/apache/ant/init/LoaderUtils.java +++ b/proposal/mutant/src/java/init/org/apache/ant/init/LoaderUtils.java @@ -147,6 +147,43 @@ public class LoaderUtils { return urls; } + /** + * Get the classpath from a classloader. This can only extract path + * components from the loaders which are instances of URLClassLoaders + * + * @param loader the loader whose path is required + * @return the loader's configuration expressed as a classpath + */ + public static String getClasspath(ClassLoader loader) { + StringBuffer pathBuffer = null; + if (loader instanceof URLClassLoader) { + URLClassLoader urlLoader = (URLClassLoader)loader; + URL[] urls = urlLoader.getURLs(); + for (int i = 0; i < urls.length; ++i) { + if (!urls[i].getProtocol().equals("file")) { + continue; + } + String pathElement = urls[i].getFile(); + if (pathBuffer == null) { + pathBuffer = new StringBuffer(pathElement); + } else { + pathBuffer.append(File.pathSeparatorChar); + pathBuffer.append(pathElement); + } + } + } + String path = pathBuffer == null ? "" : pathBuffer.toString(); + ClassLoader parentLoader = loader.getParent(); + if (parentLoader != null) { + String parentPath = getClasspath(parentLoader); + if (parentPath.length() != 0) { + path = parentPath + File.pathSeparator + path; + } + } + + return path; + } + /** * Debug method to dump a class loader hierarchy to a PrintStream