in the current project, or any referenced project. * <ant1.ant> now works by executing AntTask. * Fixed minor bug in DefaultClassloaderManager which was causing NPEs in URLClassLoader. * DefaultTaskContext now removes properties when they are set to null. (rather than throwing a NPE inside HashMap). git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272067 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -63,6 +63,8 @@ | |||
| <exclude name="${ant1.package}/ant/Main.class"/> | |||
| <exclude name="${ant1.package}/ant/Task.class"/> | |||
| <exclude name="${ant1.package}/ant/BuildException.class"/> | |||
| <exclude name="${ant1.package}/ant/taskdefs/Ant.class"/> | |||
| <exclude name="${ant1.package}/ant/taskdefs/CallTarget.class"/> | |||
| <exclude name="${ant1.package}/ant/types/Path.class"/> | |||
| </patternset> | |||
| @@ -12,13 +12,15 @@ | |||
| <!-- TaskAdapter tasks --> | |||
| <task name="ant1.condition" | |||
| classname="org.apache.tools.ant.Ant1CompatTaskAdapter" /> | |||
| <!-- Tasks specialised for myrmidon --> | |||
| <task name="ant1.ant" | |||
| classname="org.apache.tools.ant.taskdefs.Ant" /> | |||
| <!-- Tasks not currently supported. | |||
| <task name="ant1.antcall" | |||
| classname="org.apache.tools.ant.taskdefs.CallTarget" /> | |||
| <task name="ant1.ant" | |||
| classname="org.apache.tools.ant.taskdefs.Ant" /> | |||
| --> | |||
| <!-- standard ant tasks --> | |||
| @@ -0,0 +1,300 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2000-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 | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.taskdefs; | |||
| import org.apache.tools.ant.Task; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.util.FileUtils; | |||
| import org.apache.avalon.framework.configuration.DefaultConfiguration; | |||
| import org.apache.avalon.framework.configuration.Configuration; | |||
| import org.apache.myrmidon.interfaces.executor.Executor; | |||
| import org.apache.myrmidon.interfaces.executor.ExecutionFrame; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import java.io.File; | |||
| import java.util.Vector; | |||
| import java.util.Iterator; | |||
| /** | |||
| * Call Ant in a sub-project. | |||
| * | |||
| * <pre> | |||
| * <target name="foo" depends="init"> | |||
| * <ant antfile="build.xml" target="bar" > | |||
| * <property name="property1" value="aaaaa" /> | |||
| * <property name="foo" value="baz" /> | |||
| * </ant></SPAN> | |||
| * </target></SPAN> | |||
| * | |||
| * <target name="bar" depends="init"> | |||
| * <echo message="prop is ${property1} ${foo}" /> | |||
| * </target> | |||
| * </pre> | |||
| * | |||
| * | |||
| * @author costin@dnt.ro | |||
| * @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a> | |||
| */ | |||
| public class Ant extends Task { | |||
| /** the basedir where is executed the build file */ | |||
| private File dir = null; | |||
| /** the build.xml file (can be absolute) in this case dir will be ignored */ | |||
| private String antFile = null; | |||
| /** the target to call if any */ | |||
| private String target = null; | |||
| /** the output */ | |||
| private String output = null; | |||
| /** should we inherit properties from the parent ? */ | |||
| private boolean inheritAll = true; | |||
| /** should we inherit references from the parent ? */ | |||
| private boolean inheritRefs = false; | |||
| /** the properties to pass to the new project */ | |||
| private Vector properties = new Vector(); | |||
| /** the references to pass to the new project */ | |||
| private Vector references = new Vector(); | |||
| /** | |||
| * If true, inherit all properties from parent Project | |||
| * If false, inherit only userProperties and those defined | |||
| * inside the ant call itself | |||
| */ | |||
| public void setInheritAll(boolean value) { | |||
| inheritAll = value; | |||
| } | |||
| /** | |||
| * If true, inherit all references from parent Project | |||
| * If false, inherit only those defined | |||
| * inside the ant call itself | |||
| */ | |||
| public void setInheritRefs(boolean value) { | |||
| inheritRefs = value; | |||
| } | |||
| /** | |||
| * ... | |||
| */ | |||
| public void setDir(File d) { | |||
| this.dir = d; | |||
| } | |||
| /** | |||
| * set the build file, it can be either absolute or relative. | |||
| * If it is absolute, <tt>dir</tt> will be ignored, if it is | |||
| * relative it will be resolved relative to <tt>dir</tt>. | |||
| */ | |||
| public void setAntfile(String s) { | |||
| // @note: it is a string and not a file to handle relative/absolute | |||
| // otherwise a relative file will be resolved based on the current | |||
| // basedir. | |||
| this.antFile = s; | |||
| } | |||
| /** | |||
| * set the target to execute. If none is defined it will | |||
| * execute the default target of the build file | |||
| */ | |||
| public void setTarget(String s) { | |||
| this.target = s; | |||
| } | |||
| public void setOutput(String s) { | |||
| this.output = s; | |||
| } | |||
| /** create a property to pass to the new project as a 'user property' */ | |||
| public Property createProperty() { | |||
| Property p = new Property(true); | |||
| properties.addElement( p ); | |||
| return p; | |||
| } | |||
| /** | |||
| * create a reference element that identifies a data type that | |||
| * should be carried over to the new project. | |||
| */ | |||
| public void addReference(Reference r) { | |||
| references.addElement(r); | |||
| } | |||
| /** | |||
| * Helper class that implements the nested <reference> | |||
| * element of <ant> and <antcall>. | |||
| */ | |||
| public static class Reference | |||
| extends org.apache.tools.ant.types.Reference { | |||
| public Reference() {super();} | |||
| private String targetid=null; | |||
| public void setToRefid(String targetid) { this.targetid=targetid; } | |||
| public String getToRefid() { return targetid; } | |||
| } | |||
| /** | |||
| * Called by the project to let the task do its work. This method may be | |||
| * called more than once, if the task is invoked more than once. | |||
| * For example, | |||
| * if target1 and target2 both depend on target3, then running | |||
| * "ant target1 target2" will run all tasks in target3 twice. | |||
| * | |||
| * @exception BuildException if something goes wrong with the build | |||
| */ | |||
| public void execute() throws BuildException | |||
| { | |||
| Object ant1project = unsetProject(); | |||
| try | |||
| { | |||
| Configuration antConfig = buildAntTaskConfiguration(); | |||
| executeTask( antConfig ); | |||
| } | |||
| finally | |||
| { | |||
| resetProject( ant1project ); | |||
| } | |||
| } | |||
| private void executeTask( Configuration antConfig ) | |||
| { | |||
| try | |||
| { | |||
| Executor executor = (Executor) m_context.getService( Executor.class ); | |||
| ExecutionFrame frame = | |||
| (ExecutionFrame) m_context.getService( ExecutionFrame.class ); | |||
| executor.execute( antConfig, frame ); | |||
| } | |||
| catch( TaskException e ) | |||
| { | |||
| throw new BuildException( e ); | |||
| } | |||
| } | |||
| private Configuration buildAntTaskConfiguration() | |||
| { | |||
| DefaultConfiguration antConfig = new DefaultConfiguration( "ant", "" ); | |||
| antConfig.setAttribute( "inherit-all", String.valueOf( inheritAll ) ); | |||
| // Ignore inheritRefs for now ( inheritAll == inheritRefs ) | |||
| if ( target != null ) | |||
| { | |||
| antConfig.setAttribute( "target", target ); | |||
| } | |||
| // Get the "file" value. | |||
| if (antFile == null) { | |||
| antFile = "build.xml"; | |||
| } | |||
| if ( dir == null ) | |||
| { | |||
| dir = project.getBaseDir(); | |||
| } | |||
| File file = FileUtils.newFileUtils().resolveFile(dir, antFile); | |||
| antFile = file.getAbsolutePath(); | |||
| antConfig.setAttribute( "file", antFile ); | |||
| // Add all of the properties. | |||
| Iterator iter = properties.iterator(); | |||
| while( iter.hasNext() ) | |||
| { | |||
| DefaultConfiguration param = new DefaultConfiguration( "param", "" ); | |||
| Property property = (Property)iter.next(); | |||
| param.setAttribute( "name", property.getName() ); | |||
| param.setAttribute( "value", property.getValue() ); | |||
| antConfig.addChild( param ); | |||
| } | |||
| return antConfig; | |||
| } | |||
| private void resetProject( Object ant1project ) throws BuildException | |||
| { | |||
| try | |||
| { | |||
| m_context.setProperty( "ant1.project", ant1project ); | |||
| } | |||
| catch( TaskException e ) | |||
| { | |||
| throw new BuildException( e ); | |||
| } | |||
| } | |||
| private Object unsetProject() throws BuildException | |||
| { | |||
| Object ant1project = null; | |||
| try | |||
| { | |||
| ant1project = m_context.getProperty( "ant1.project" ); | |||
| m_context.setProperty( "ant1.project", null ); | |||
| } | |||
| catch( TaskException e ) | |||
| { | |||
| throw new BuildException( e ); | |||
| } | |||
| return ant1project; | |||
| } | |||
| } | |||
| @@ -0,0 +1,179 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.interfaces.model.Project; | |||
| import org.apache.myrmidon.interfaces.workspace.Workspace; | |||
| import org.apache.myrmidon.interfaces.embeddor.Embeddor; | |||
| import org.apache.avalon.framework.parameters.Parameters; | |||
| import java.util.Map; | |||
| import java.util.Iterator; | |||
| import java.util.ArrayList; | |||
| /** | |||
| * Abstract base class for Tasks which execute targets. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public abstract class AbstractAntTask extends AbstractTask | |||
| { | |||
| /** | |||
| * If true, inherit all properties from parent Project | |||
| * If false, inherit only userProperties and those defined | |||
| * inside the ant call itself | |||
| */ | |||
| private boolean m_inheritAll; | |||
| /** | |||
| * The target to process in build file. If not specified | |||
| * will use default in specified build file. | |||
| */ | |||
| private String m_target; | |||
| private final ArrayList m_parameters = new ArrayList(); | |||
| /** | |||
| * Specify whether should inherit properties in sub-build. | |||
| * | |||
| * @param inheritAll true to inherit else false | |||
| */ | |||
| public void setInheritAll( final boolean inheritAll ) | |||
| { | |||
| m_inheritAll = inheritAll; | |||
| } | |||
| /** | |||
| * set the target to process. If none is defined it will | |||
| * execute the default target of the build file | |||
| */ | |||
| public void setTarget( final String target ) | |||
| { | |||
| m_target = target; | |||
| } | |||
| /** | |||
| * Add a parameter to processing of build file. | |||
| * | |||
| * @param param the parameter | |||
| */ | |||
| public void addParam( final AntParam param ) | |||
| { | |||
| m_parameters.add( param ); | |||
| } | |||
| /** | |||
| * Execute the specified build, with specified parameters. | |||
| * | |||
| * @throws TaskException if an error occurs. | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| try | |||
| { | |||
| Project project = getProject(); | |||
| Embeddor embeddor = getEmbeddor(); | |||
| final Workspace workspace = | |||
| embeddor.createWorkspace( buildParameters() ); | |||
| workspace.addProjectListener( embeddor.createListener("default")); | |||
| if( null == m_target ) | |||
| { | |||
| m_target = project.getDefaultTargetName(); | |||
| } | |||
| workspace.executeProject( project, m_target ); | |||
| } | |||
| catch( final Exception e ) | |||
| { | |||
| throw new TaskException( e.toString(), e ); | |||
| } | |||
| } | |||
| /** | |||
| * A convenience method for obtaining the Embeddor from the | |||
| * TaskContext. | |||
| * @return The Embeddor contained in the TaskContext | |||
| * @throws TaskException if the Embeddor could not be obtained. | |||
| */ | |||
| protected Embeddor getEmbeddor() throws TaskException | |||
| { | |||
| final Embeddor embeddor = | |||
| (Embeddor)getContext().getService( Embeddor.class ); | |||
| return embeddor; | |||
| } | |||
| /** | |||
| * Get/create/build the project containing the target to be executed. | |||
| * Subclasses will override this method to provide different means | |||
| * of obtaining a project to execute. | |||
| * @return The project containing the target to execute. | |||
| * @throws Exception If a problem occurred building the project. | |||
| */ | |||
| protected abstract Project getProject() throws Exception; | |||
| /** | |||
| * Build the parameters to pass to sub-project. | |||
| * These include the current tasks properties | |||
| * (if inheritall=true) and any supplied by the user. | |||
| * | |||
| * @return the created parameters | |||
| */ | |||
| private Parameters buildParameters() | |||
| throws TaskException | |||
| { | |||
| final Parameters parameters = new Parameters(); | |||
| if( m_inheritAll ) | |||
| { | |||
| final Map properties = getContext().getProperties(); | |||
| final Iterator keys = properties.keySet().iterator(); | |||
| while( keys.hasNext() ) | |||
| { | |||
| final String key = (String)keys.next(); | |||
| final Object value = properties.get( key ); | |||
| setProperty( parameters, key, value ); | |||
| } | |||
| } | |||
| final int size = m_parameters.size(); | |||
| for( int i = 0; i < size; i++ ) | |||
| { | |||
| final AntParam param = (AntParam)m_parameters.get( i ); | |||
| param.validate(); | |||
| final String name = param.getName(); | |||
| final String value = param.getValue().toString(); | |||
| setProperty( parameters, name, value ); | |||
| } | |||
| return parameters; | |||
| } | |||
| /** | |||
| * Utility method to add the property into parameters object. | |||
| * | |||
| * @param parameters where to put property | |||
| * @param name the property | |||
| * @param value the value of property | |||
| * @todo allow non-string params to be passed down | |||
| */ | |||
| private void setProperty( final Parameters parameters, | |||
| final String name, | |||
| final Object value ) | |||
| { | |||
| if( !name.startsWith( "myrmidon." ) ) | |||
| { | |||
| parameters.setParameter( name, value.toString() ); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,68 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.interfaces.model.Project; | |||
| /** | |||
| * A task which executes a target in the current project, | |||
| * or a referenced project. | |||
| * | |||
| * @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a> | |||
| * @version $Revision$ $Date$ | |||
| * @ant.task name="ant-call" | |||
| */ | |||
| public class AntCallTask extends AbstractAntTask | |||
| { | |||
| private final static Resources REZ = | |||
| ResourceManager.getPackageResources( AntCallTask.class ); | |||
| private String m_project; | |||
| /** | |||
| * Specifies the project to execute. If not specified, the current | |||
| * project is used. | |||
| * @param project the name of the Project to execute. | |||
| */ | |||
| public void setProject( String project ) | |||
| { | |||
| m_project = project; | |||
| } | |||
| /** | |||
| * Get/create/build the project which will be executed. | |||
| * Subclasses will override this method to provide different means | |||
| * of obtaining a project to execute. | |||
| * @return The project containing the target to execute. | |||
| * @throws Exception If a problem occurred building the project. | |||
| */ | |||
| protected Project getProject() throws Exception | |||
| { | |||
| Project currentProject = | |||
| (Project)getContext().getService( Project.class ); | |||
| // By default, use the current project. | |||
| Project referencedProject = currentProject; | |||
| if( m_project != null ) | |||
| { | |||
| referencedProject = currentProject.getProject( m_project ); | |||
| if( referencedProject == null ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "antcall.invalid-project.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| return referencedProject; | |||
| } | |||
| } | |||
| @@ -8,66 +8,35 @@ | |||
| package org.apache.antlib.core; | |||
| import java.io.File; | |||
| import java.util.ArrayList; | |||
| import java.util.Iterator; | |||
| import java.util.Map; | |||
| import org.apache.avalon.framework.parameters.Parameters; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.interfaces.embeddor.Embeddor; | |||
| import org.apache.myrmidon.interfaces.model.Project; | |||
| import org.apache.myrmidon.interfaces.workspace.Workspace; | |||
| /** | |||
| * Create a new Workspace and process a build in | |||
| * that new workspace. | |||
| * Executes a target in a named build file. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @ant.task name="ant" | |||
| */ | |||
| public class AntTask | |||
| extends AbstractTask | |||
| extends AbstractAntTask | |||
| { | |||
| /** | |||
| * Default build file. | |||
| */ | |||
| private static final String DEFAULT_BUILD_FILE = "build.ant"; | |||
| /** | |||
| * If true, inherit all properties from parent Project | |||
| * If false, inherit only userProperties and those defined | |||
| * inside the ant call itself | |||
| */ | |||
| private boolean m_inheritAll; | |||
| /** | |||
| * The build file which to execute. If not set defaults to | |||
| * using "build.ant" in the basedir of current project. | |||
| */ | |||
| private File m_file; | |||
| /** | |||
| * The target to process in build file. If not specified | |||
| * will use default in specified build file. | |||
| */ | |||
| private String m_target; | |||
| /** | |||
| * The "type" of the build file. By default this is null which | |||
| * means the type will be determined by the build file extension. | |||
| */ | |||
| private String m_type; | |||
| private final ArrayList m_parameters = new ArrayList(); | |||
| /** | |||
| * Specify whether should inherit properties in sub-build. | |||
| * | |||
| * @param inheritAll true to inherit else false | |||
| */ | |||
| public void setInheritAll( final boolean inheritAll ) | |||
| { | |||
| m_inheritAll = inheritAll; | |||
| } | |||
| /** | |||
| * set the build file to process. | |||
| @@ -90,114 +59,21 @@ public class AntTask | |||
| } | |||
| /** | |||
| * set the target to process. If none is defined it will | |||
| * execute the default target of the build file | |||
| * @return The project containing the target to execute. | |||
| * @throws Exception If a problem occurred building the project. | |||
| */ | |||
| public void setTarget( final String target ) | |||
| { | |||
| m_target = target; | |||
| } | |||
| /** | |||
| * Add a parameter to processing of build file. | |||
| * | |||
| * @param param the parameter | |||
| */ | |||
| public void addParam( final AntParam param ) | |||
| { | |||
| m_parameters.add( param ); | |||
| } | |||
| /** | |||
| * Execute the specified build, with specified parameters. | |||
| * | |||
| * @throws TaskException if an error occurs. | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| protected Project getProject() throws Exception | |||
| { | |||
| if( null == m_file ) | |||
| { | |||
| m_file = getContext().resolveFile( DEFAULT_BUILD_FILE ); | |||
| } | |||
| final Embeddor embeddor = | |||
| (Embeddor)getContext().getService( Embeddor.class ); | |||
| try | |||
| { | |||
| final Project project = | |||
| embeddor.createProject( m_file.toString(), | |||
| m_type, | |||
| new Parameters() ); | |||
| final Workspace workspace = | |||
| embeddor.createWorkspace( buildParameters() ); | |||
| if( null == m_target ) | |||
| { | |||
| m_target = project.getDefaultTargetName(); | |||
| } | |||
| workspace.executeProject( project, m_target ); | |||
| } | |||
| catch( final Exception e ) | |||
| { | |||
| throw new TaskException( e.toString(), e ); | |||
| } | |||
| } | |||
| /** | |||
| * Build the parameters to pass to sub-project. | |||
| * These include the current tasks properties | |||
| * (if inheritall=true) and any supplied by the user. | |||
| * | |||
| * @return the created parameters | |||
| */ | |||
| private Parameters buildParameters() | |||
| throws TaskException | |||
| { | |||
| final Parameters parameters = new Parameters(); | |||
| if( m_inheritAll ) | |||
| { | |||
| final Map properties = getContext().getProperties(); | |||
| final Iterator keys = properties.keySet().iterator(); | |||
| while( keys.hasNext() ) | |||
| { | |||
| final String key = (String)keys.next(); | |||
| final Object value = properties.get( key ); | |||
| setProperty( parameters, key, value ); | |||
| } | |||
| } | |||
| final int size = m_parameters.size(); | |||
| for( int i = 0; i < size; i++ ) | |||
| { | |||
| final AntParam param = (AntParam)m_parameters.get( i ); | |||
| param.validate(); | |||
| final String name = param.getName(); | |||
| final String value = param.getValue().toString(); | |||
| setProperty( parameters, name, value ); | |||
| } | |||
| return parameters; | |||
| final Project project = | |||
| getEmbeddor().createProject( m_file.toString(), | |||
| m_type, | |||
| new Parameters() ); | |||
| return project; | |||
| } | |||
| /** | |||
| * Utility method to add the property into parameters object. | |||
| * | |||
| * @param parameters where to put property | |||
| * @param name the property | |||
| * @param value the value of property | |||
| * @todo allow non-string params to be passed down | |||
| */ | |||
| private void setProperty( final Parameters parameters, | |||
| final String name, | |||
| final Object value ) | |||
| { | |||
| if( !name.startsWith( "myrmidon." ) ) | |||
| { | |||
| parameters.setParameter( name, value.toString() ); | |||
| } | |||
| } | |||
| } | |||
| @@ -34,4 +34,6 @@ filetokenset.not-a-file.error=File {0} does not exist, or is not a file. | |||
| filetokenset.read-tokens.error=Could not read tokens from {0}. | |||
| param.noname.error=Missing name from parameter. | |||
| param.novalue.error=Missing value from parameter "{0}". | |||
| param.novalue.error=Missing value from parameter "{0}". | |||
| antcall.invalid-project.error=Project-reference "{0}" not found. | |||
| @@ -155,7 +155,7 @@ public class DefaultClassLoaderManager | |||
| private URL[] buildClasspath( final ArrayList files ) | |||
| throws MalformedURLException | |||
| { | |||
| final URL[] urls = new URL[ files.size() + 1 ]; | |||
| final URL[] urls = new URL[ files.size() ]; | |||
| final int count = files.size(); | |||
| for( int i = 0; i < count; i++ ) | |||
| { | |||
| @@ -214,7 +214,15 @@ public class DefaultTaskContext | |||
| { | |||
| checkPropertyName( name ); | |||
| checkPropertyValid( name, value ); | |||
| m_contextData.put( name, value ); | |||
| if ( value == null ) | |||
| { | |||
| m_contextData.remove( name ); | |||
| } | |||
| else | |||
| { | |||
| m_contextData.put( name, value ); | |||
| } | |||
| } | |||
| /** | |||
| @@ -279,6 +279,32 @@ Legal: | |||
| <ant/> | |||
| </target> | |||
| <target name="antcall-test"> | |||
| <log message="Testing antcall task..."/> | |||
| <ant-call target="if-test"/> | |||
| <log message="Using params..."/> | |||
| <ant-call target="prop-print"> | |||
| <param name="meep.meep" value="Meep!"/> | |||
| </ant-call> | |||
| <log message="Using params value-ref..."/> | |||
| <pattern id="meep.data" name="*.java" if="..." /> | |||
| <ant-call target="prop-print"> | |||
| <param name="meep.meep" value-ref="meep.data"/> | |||
| </ant-call> | |||
| <log message="Using inheritall..."/> | |||
| <pattern id="meep.meep" name="*.java" if="..." /> | |||
| <ant-call target="prop-print" inherit-all="true"/> | |||
| <log message="Calling referenced project, default target..."/> | |||
| <ant-call project="prim"/> | |||
| <log message="Calling referenced project, named target..."/> | |||
| <ant-call project="prim" target="extensions-test"/> | |||
| </target> | |||
| <target name="prop-print"> | |||
| <log message="Give me a property ... ${meep.meep}"/> | |||
| </target> | |||