You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by hi...@apache.org on 2012/08/29 15:22:43 UTC

svn commit: r1378533 [1/3] - in /ant/sandbox/antdsl/branches/import-experiment: ./ ant/ org.apache.ant.antdsl/ org.apache.ant.antdsl/.settings/ org.apache.ant.antdsl/META-INF/services/ org.apache.ant.antdsl/src/org/apache/ant/antdsl/ org.apache.ant.ant...

Author: hibou
Date: Wed Aug 29 13:22:42 2012
New Revision: 1378533

URL: http://svn.apache.org/viewvc?rev=1378533&view=rev
Log:
Add the possibility to make 'path' of build module and ant task being computed by Ivy

Added:
    ant/sandbox/antdsl/branches/import-experiment/ant/   (with props)
    ant/sandbox/antdsl/branches/import-experiment/argument-processor.patch
    ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/META-INF/services/org.apache.tools.ant.ArgumentProcessor
    ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/AntDSLArgProcessor.java   (with props)
    ant/sandbox/antdsl/branches/import-experiment/test/ant/   (with props)
    ant/sandbox/antdsl/branches/import-experiment/test/ant/ivy-fixed.xml   (with props)
    ant/sandbox/antdsl/branches/import-experiment/test/ant/ivy.xml   (with props)
    ant/sandbox/antdsl/branches/import-experiment/test/ant/ivysettings.xml   (with props)
Modified:
    ant/sandbox/antdsl/branches/import-experiment/   (props changed)
    ant/sandbox/antdsl/branches/import-experiment/build.xml
    ant/sandbox/antdsl/branches/import-experiment/ivy-fixed.xml
    ant/sandbox/antdsl/branches/import-experiment/ivy.xml
    ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/.classpath
    ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/.settings/org.eclipse.jdt.core.prefs
    ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/META-INF/services/org.apache.tools.ant.ProjectHelper
    ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/AbstractAntDslProjectHelper.java
    ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/OSGiFrameworkManager.java
    ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/expr/AntExpressionCondition.java
    ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDslXTextProjectHelper.java
    ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/ParserCreator.java
    ant/sandbox/antdsl/branches/import-experiment/test/   (props changed)
    ant/sandbox/antdsl/branches/import-experiment/test/build.ant
    ant/sandbox/antdsl/branches/import-experiment/test/build.xml
    ant/sandbox/antdsl/branches/import-experiment/test/test-module.bnd

Propchange: ant/sandbox/antdsl/branches/import-experiment/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Wed Aug 29 13:22:42 2012
@@ -2,4 +2,3 @@ build
 lib
 build-deps
 *.classpath
-.ant

Propchange: ant/sandbox/antdsl/branches/import-experiment/ant/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed Aug 29 13:22:42 2012
@@ -0,0 +1,2 @@
+felix-cache
+ant.path

Added: ant/sandbox/antdsl/branches/import-experiment/argument-processor.patch
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/branches/import-experiment/argument-processor.patch?rev=1378533&view=auto
==============================================================================
--- ant/sandbox/antdsl/branches/import-experiment/argument-processor.patch (added)
+++ ant/sandbox/antdsl/branches/import-experiment/argument-processor.patch Wed Aug 29 13:22:42 2012
@@ -0,0 +1,433 @@
+Index: src/main/org/apache/tools/ant/ArgumentProcessor.java
+===================================================================
+--- src/main/org/apache/tools/ant/ArgumentProcessor.java	(revision 0)
++++ src/main/org/apache/tools/ant/ArgumentProcessor.java	(working copy)
+@@ -0,0 +1,80 @@
++/*
++ *  Licensed to the Apache Software Foundation (ASF) under one or more
++ *  contributor license agreements.  See the NOTICE file distributed with
++ *  this work for additional information regarding copyright ownership.
++ *  The ASF licenses this file to You under the Apache License, Version 2.0
++ *  (the "License"); you may not use this file except in compliance with
++ *  the License.  You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ *  Unless required by applicable law or agreed to in writing, software
++ *  distributed under the License is distributed on an "AS IS" BASIS,
++ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ *  See the License for the specific language governing permissions and
++ *  limitations under the License.
++ *
++ */
++package org.apache.tools.ant;
++
++import java.util.List;
++
++/**
++ * Processor of arguments of the command line.
++ * <p>
++ * Arguments supported by third party code should not conflict with Ant core
++ * ones. It is then recommended to chose specific 'enough' argument name,
++ * avoiding for instance one letter arguments. By the way, if there any
++ * conflict, Ant will take precedence.
++ * 
++ * @since 1.9
++ */
++public interface ArgumentProcessor {
++
++    /**
++     * Check that the specified argument is handled. It returns 0 if not
++     * supported. Else it returns the number of expected arguments to read after
++     * the current one.
++     */
++    int readArgument(String arg);
++
++    /**
++     * If some arguments matched, this method is called after all arguments were
++     * parsed. Returns <code>true</code> if Ant should stop there, ie the build
++     * file not parsed and the project should not be executed.
++     * <p>
++     * NB: the size of the argument list might not be the expected one if the
++     * end user doesn't have provided enough ones.
++     */
++    boolean handleArg(List<String> args);
++
++    /**
++     * If some arguments matched, this method is called just before the project
++     * being configured
++     * <p>
++     * NB: the size of the argument list might not be the expected one if the
++     * end user doesn't have provided enough ones.
++     */
++    void prepareConfigure(Project project, List<String> args);
++
++    /**
++     * Handle the arguments, just after the project being configured. Returns
++     * <code>true</code> if Ant should stop there, ie the build file not parsed
++     * and the project should not be executed.
++     * <p>
++     * NB: the size of the argument list might not be the expected one if the
++     * end user doesn't have provided enough ones.
++     */
++    boolean handleArg(Project project, List<String> arg);
++
++    /**
++     * Print the usage of the supported arguments
++     * 
++     * @param buffer the buffer to populate
++     * @param lSep the line separator to use
++     * 
++     * @see org.apache.tools.ant.Main.printUsage()
++     */
++    void printUsage(StringBuffer buffer, String lSep);
++
++}
+
+Property changes on: src/main/org/apache/tools/ant/ArgumentProcessor.java
+___________________________________________________________________
+Added: svn:mime-type
+## -0,0 +1 ##
++text/plain
+\ No newline at end of property
+Added: svn:keywords
+## -0,0 +1 ##
++Date Revision Author HeadURL Id
+\ No newline at end of property
+Added: svn:eol-style
+## -0,0 +1 ##
++native
+\ No newline at end of property
+Index: src/main/org/apache/tools/ant/Main.java
+===================================================================
+--- src/main/org/apache/tools/ant/Main.java	(revision 1376402)
++++ src/main/org/apache/tools/ant/Main.java	(working copy)
+@@ -24,12 +24,14 @@
+ import java.io.IOException;
+ import java.io.InputStream;
+ import java.io.PrintStream;
++import java.util.ArrayList;
+ import java.util.Arrays;
+ import java.util.Collections;
+ import java.util.Enumeration;
+ import java.util.HashMap;
+ import java.util.HashSet;
+ import java.util.Iterator;
++import java.util.List;
+ import java.util.Map;
+ import java.util.Map.Entry;
+ import java.util.Properties;
+@@ -152,6 +154,7 @@
+      */
+     private boolean proxy = false;
+ 
++    private Map<Class<?>, List<String>> extraArguments = new HashMap<Class<?>, List<String>>();
+ 
+     private static final GetProperty NOPROPERTIES = new GetProperty(){
+         public Object getProperty(String aName) {
+@@ -324,6 +327,8 @@
+         boolean justPrintVersion = false;
+         boolean justPrintDiagnostics = false;
+ 
++        ArgumentProcessorRegistry processorRegistry = ArgumentProcessorRegistry.getInstance();
++        
+         for (int i = 0; i < args.length; i++) {
+             String arg = args[i];
+ 
+@@ -399,11 +404,27 @@
+             } else if (arg.equals("-autoproxy")) {
+                 proxy = true;
+             } else if (arg.startsWith("-")) {
+-                // we don't have any more args to recognize!
+-                String msg = "Unknown argument: " + arg;
+-                System.err.println(msg);
+-                printUsage();
+-                throw new BuildException("");
++                boolean processed = false;
++                for (ArgumentProcessor processor : processorRegistry.getProcessors()) {
++                    int n = processor.readArgument(arg);
++                    if (n > 0) {
++                        List<String> extraArgs = new ArrayList<String>();
++                        extraArgs.add(arg);
++                        for (int j = 1; j < n && i < args.length - 1; j++) {
++                            extraArgs.add(args[++i]);
++                        }
++                        extraArguments.put(processor.getClass(), extraArgs);
++                        processed = true;
++                        break;
++                    }
++                }
++                if (!processed) {
++                    // we don't have any more args to recognize!
++                    String msg = "Unknown argument: " + arg;
++                    System.err.println(msg);
++                    printUsage();
++                    throw new BuildException("");
++                }
+             } else {
+                 // if it's no other arg, it may be the target
+                 targets.addElement(arg);
+@@ -726,6 +747,17 @@
+             return;
+         }
+ 
++        ArgumentProcessorRegistry processorRegistry = ArgumentProcessorRegistry.getInstance();
++
++        for (ArgumentProcessor processor : processorRegistry.getProcessors()) {
++            List<String> extraArgs = extraArguments.get(processor.getClass());
++            if (extraArgs != null) {
++                if (processor.handleArg(extraArgs)) {
++                    return;
++                }
++            }
++        }
++
+         final Project project = new Project();
+         project.setCoreLoader(coreLoader);
+ 
+@@ -781,8 +813,24 @@
+                     proxySetup.enableProxies();
+                 }
+ 
++                for (ArgumentProcessor processor : processorRegistry.getProcessors()) {
++                    List<String> extraArgs = extraArguments.get(processor.getClass());
++                    if (extraArgs != null) {
++                        processor.prepareConfigure(project, extraArgs);
++                    }
++                }
++
+                 ProjectHelper.configureProject(project, buildFile);
+ 
++                for (ArgumentProcessor processor : processorRegistry.getProcessors()) {
++                    List<String> extraArgs = extraArguments.get(processor.getClass());
++                    if (extraArgs != null) {
++                        if (processor.handleArg(project, extraArgs)) {
++                            return;
++                        }
++                    }
++                }
++
+                 if (projectHelp) {
+                     printDescription(project);
+                     printTargets(project, msgOutputLevel > Project.MSG_INFO,
+@@ -996,7 +1044,10 @@
+         msg.append("  -noclasspath           Run ant without using CLASSPATH" + lSep);
+         msg.append("  -autoproxy             Java1.5+: use the OS proxy settings"
+                 + lSep);
+-        msg.append("  -main <class>          override Ant's normal entry point");
++        msg.append("  -main <class>          override Ant's normal entry point" + lSep);
++        for (ArgumentProcessor processor : ArgumentProcessorRegistry.getInstance().getProcessors()) {
++            processor.printUsage(msg, lSep);
++        }
+         System.out.println(msg.toString());
+     }
+ 
+Index: src/main/org/apache/tools/ant/ArgumentProcessorRegistry.java
+===================================================================
+--- src/main/org/apache/tools/ant/ArgumentProcessorRegistry.java	(revision 0)
++++ src/main/org/apache/tools/ant/ArgumentProcessorRegistry.java	(working copy)
+@@ -0,0 +1,189 @@
++/*
++ *  Licensed to the Apache Software Foundation (ASF) under one or more
++ *  contributor license agreements.  See the NOTICE file distributed with
++ *  this work for additional information regarding copyright ownership.
++ *  The ASF licenses this file to You under the Apache License, Version 2.0
++ *  (the "License"); you may not use this file except in compliance with
++ *  the License.  You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ *  Unless required by applicable law or agreed to in writing, software
++ *  distributed under the License is distributed on an "AS IS" BASIS,
++ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ *  See the License for the specific language governing permissions and
++ *  limitations under the License.
++ *
++ */
++package org.apache.tools.ant;
++
++import java.io.BufferedReader;
++import java.io.IOException;
++import java.io.InputStream;
++import java.io.InputStreamReader;
++import java.net.URL;
++import java.util.ArrayList;
++import java.util.Enumeration;
++import java.util.List;
++
++import org.apache.tools.ant.util.LoaderUtils;
++
++/**
++ * The global registry for {@link ArgumentProcessor}s.
++ * <p>
++ * An {@link ArgumentProcessor} implementation can be registered via the system
++ * property <code>org.apache.tools.ant.ArgumentProcessor</code>, or via a JDK1.3
++ * 'service', by putting the fully qualified name of the implementation into the
++ * file <code>META-INF/services/org.apache.tools.ant.ArgumentProcessor</code>
++ * <p>
++ * Use the system property <code>ant.argument-processor.debug</code> to enable
++ * the print of debug log.
++ * 
++ * @since 1.9
++ */
++public class ArgumentProcessorRegistry {
++
++    private static final String SYSTEM_PROPERTY = "org.apache.tools.ant.ArgumentProcessor";
++
++    private static final String DEBUG_ARGUMENT_PROCESSOR_REPOSITORY = "ant.argument-processor.debug";
++
++    // The message log level is not accessible here because everything
++    // is instanciated statically
++    private static final boolean DEBUG = "true".equals(System.getProperty(DEBUG_ARGUMENT_PROCESSOR_REPOSITORY));
++
++    private static final String SERVICE_ID = "META-INF/services/org.apache.tools.ant.ArgumentProcessor";
++
++    private static ArgumentProcessorRegistry instance = new ArgumentProcessorRegistry();
++
++    private List<ArgumentProcessor> processors = new ArrayList<ArgumentProcessor>();
++
++    public static ArgumentProcessorRegistry getInstance() {
++        return instance;
++    }
++
++    private ArgumentProcessorRegistry() {
++        collectArgumentProcessors();
++    }
++
++    public List<ArgumentProcessor> getProcessors() {
++        return processors;
++    }
++
++    private void collectArgumentProcessors() {
++        ArgumentProcessor processor = getArgumentProcessorBySystemProperty();
++        registerArgumentProcessor(processor);
++        try {
++            ClassLoader classLoader = LoaderUtils.getContextClassLoader();
++            if (classLoader != null) {
++                Enumeration<URL> resources = classLoader.getResources(SERVICE_ID);
++                while (resources.hasMoreElements()) {
++                    URL resource = resources.nextElement();
++                    processor = getProcessorByService(resource.openStream());
++                    registerArgumentProcessor(processor);
++                }
++            }
++
++            InputStream systemResource = ClassLoader.getSystemResourceAsStream(SERVICE_ID);
++            if (systemResource != null) {
++                processor = getProcessorByService(systemResource);
++                registerArgumentProcessor(processor);
++            }
++        } catch (Exception e) {
++            System.err.println("Unable to load ArgumentProcessor from service "
++                    + SERVICE_ID + " (" + e.getClass().getName() + ": "
++                    + e.getMessage() + ")");
++            if (DEBUG) {
++                e.printStackTrace(System.err);
++            }
++        }
++    }
++
++    public void registerArgumentProcessor(String helperClassName)
++            throws BuildException {
++        registerArgumentProcessor(getProcessor(helperClassName));
++    }
++
++    public void registerArgumentProcessor(
++            Class< ? extends ArgumentProcessor> helperClass)
++            throws BuildException {
++        registerArgumentProcessor(getProcessor(helperClass));
++    }
++
++    private ArgumentProcessor getProcessor(String helperClassName) {
++        try {
++            @SuppressWarnings("unchecked")
++            Class< ? extends ArgumentProcessor> cl = (Class< ? extends ArgumentProcessor>) Class.forName(helperClassName);
++            return getProcessor(cl);
++        } catch (ClassNotFoundException e) {
++            throw new BuildException("Argument processor class "
++                    + helperClassName + " was not found", e);
++        }
++    }
++
++    private ArgumentProcessor getProcessor(
++            Class< ? extends ArgumentProcessor> processorClass) {
++        ArgumentProcessor processor;
++        try {
++            processor = processorClass.getConstructor().newInstance();
++        } catch (Exception e) {
++            throw new BuildException("The argument processor class"
++                    + processorClass.getClass().getName()
++                    + " could not be instanciated with a default constructor",
++                    e);
++        }
++        return processor;
++    }
++
++    public void registerArgumentProcessor(ArgumentProcessor processor) {
++        if (processor == null) {
++            return;
++        }
++        processors.add(processor);
++        if (DEBUG) {
++            System.out.println("Argument processor "
++                    + processor.getClass().getName() + " registered.");
++        }
++    }
++
++    private ArgumentProcessor getArgumentProcessorBySystemProperty() {
++        String processorClass = System.getProperty(SYSTEM_PROPERTY);
++        try {
++            if (processorClass != null) {
++                return getProcessor(processorClass);
++            }
++        } catch (Exception e) {
++            System.err.println("Unable to load ArgumentProcessor class \""
++                    + processorClass + " specified in system property "
++                    + SYSTEM_PROPERTY + " (" + e.getMessage() + ")");
++            if (DEBUG) {
++                e.printStackTrace(System.err);
++            }
++        }
++        return null;
++    }
++
++    private ArgumentProcessor getProcessorByService(InputStream is)
++            throws IOException {
++        InputStreamReader isr = null;
++        try {
++            try {
++                isr = new InputStreamReader(is, "UTF-8");
++            } catch (java.io.UnsupportedEncodingException e) {
++                isr = new InputStreamReader(is);
++            }
++            BufferedReader rd = new BufferedReader(isr);
++            String processorClassName = rd.readLine();
++            if (processorClassName != null && !"".equals(processorClassName)) {
++                return getProcessor(processorClassName);
++            }
++        } finally {
++            try {
++                isr.close();
++            } catch (IOException e) {
++                // ignore
++            }
++        }
++        return null;
++    }
++
++}
+
+Property changes on: src/main/org/apache/tools/ant/ArgumentProcessorRegistry.java
+___________________________________________________________________
+Added: svn:mime-type
+## -0,0 +1 ##
++text/plain
+\ No newline at end of property
+Added: svn:keywords
+## -0,0 +1 ##
++Date Revision Author HeadURL Id
+\ No newline at end of property
+Added: svn:eol-style
+## -0,0 +1 ##
++native
+\ No newline at end of property

Modified: ant/sandbox/antdsl/branches/import-experiment/build.xml
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/branches/import-experiment/build.xml?rev=1378533&r1=1378532&r2=1378533&view=diff
==============================================================================
--- ant/sandbox/antdsl/branches/import-experiment/build.xml (original)
+++ ant/sandbox/antdsl/branches/import-experiment/build.xml Wed Aug 29 13:22:42 2012
@@ -1,13 +1,12 @@
 <project name="ant-dsl" xmlns:ivy="antlib:org.apache.ivy.ant">
 
-    <property name="ivy.version" value="2.4.0-alpha" />
-
     <target name="-check-build-deps">
         <condition property="build-deps.exist">
             <and>
                 <available file="${basedir}/build-deps/antlr-3.4-complete.jar" />
                 <available file="${basedir}/build-deps/antlr3-task/ant-antlr3.jar" />
-                <available file="${basedir}/build-deps/ivy-${ivy.version}.jar" />
+                <available file="${basedir}/build-deps/ivy-2.4.0-alpha.jar" />
+                <available file="${basedir}/build-deps/ivy-2.4.0-alpha-sources.jar" />
                 <available file="${basedir}/build-deps/apache-ant-1.9.0alpha-bin.zip" />
                 <available file="${basedir}/build-deps/apache-ant-1.9.0alpha-src.zip" />
             </and>
@@ -17,7 +16,8 @@
 
     <target name="-download-build-deps" depends="-check-build-deps" unless="build-deps.exist">
         <mkdir dir="${basedir}/build-deps" />
-        <get src="https://builds.apache.org/pview/job/Ivy/lastSuccessfulBuild/artifact/trunk/build/artifact/jars/ivy.jar" dest="${basedir}/build-deps/ivy-${ivy.version}.jar" usetimestamp="true" />
+        <get src="https://builds.apache.org/pview/job/Ivy/lastSuccessfulBuild/artifact/trunk/build/artifact/jars/ivy.jar" dest="${basedir}/build-deps/ivy-2.4.0-alpha.jar" usetimestamp="true" />
+        <get src="https://builds.apache.org/pview/job/Ivy/lastSuccessfulBuild/artifact/trunk/build/artifact/sources/ivy.jar" dest="${basedir}/build-deps/ivy-2.4.0-alpha-sources.jar" usetimestamp="true" />
         <get src="http://antlr.org/download/antlr-3.4-complete.jar" dest="${basedir}/build-deps/antlr-3.4-complete.jar" usetimestamp="true" />
         <get src="http://www.antlr.org/share/1169924912745/antlr3-task.zip" dest="${basedir}/build-deps/antlr3-task.zip" usetimestamp="true" />
         <unzip src="${basedir}/build-deps/antlr3-task.zip" dest="${basedir}/build-deps/" />
@@ -34,7 +34,7 @@
                 <pathelement path="${basedir}/build-deps/antlr3-task/ant-antlr3.jar" />
             </classpath>
         </taskdef>
-        <taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpath="${basedir}/build-deps/ivy-${ivy.version}.jar" />
+        <taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpath="${basedir}/build-deps/ivy-2.4.0-alpha.jar" />
     </target>
 
     <target name="ivy:configure" depends="init">
@@ -44,22 +44,31 @@
     <target name="get-deps" depends="init,ivy:configure" description="Download dependencies" >
         <ivy:resolve file="ivy-fixed.xml" conf="*" uncompress="true" />
         <!--ivy:retrieve conf="*" pattern="${basedir}/lib/[type]s/[artifact]_[revision](.[ext])" sync="true" uncompress="true" /-->
+        <ivy:cachepath pathid="compile.classpath.ivy" conf="compile" type="jar,bundle" uncompress="true" osgi="true" />
         <ivy:cachepath pathid="antruntime.classpath.ivy" conf="antruntime" type="jar,bundle" uncompress="true" osgi="true" />
         <ivy:cachepath pathid="generate.classpath.ivy" conf="generate" type="jar,bundle" uncompress="true" osgi="true" />
         <!-- Now we need to hack since we the ant trunk to build -->
-        <path id="antruntime.classpath">
+        <path id="compile.classpath">
             <fileset dir="build-deps/apache-ant-1.9.0alpha/lib" includes="*.jar" />
+            <file file="${basedir}/build-deps/ivy-2.4.0-alpha.jar" />
+            <path refid="compile.classpath.ivy" />
+        </path>
+        <path id="antruntime.classpath">
+            <file file="${basedir}/build-deps/ivy-2.4.0-alpha.jar" />
+            <file file="${basedir}/build/antdsl.jar" />
             <path refid="antruntime.classpath.ivy" />
         </path>
         <path id="generate.classpath">
-            <fileset dir="build-deps/apache-ant-1.9.0alpha/lib" includes="*.jar" />
             <path refid="generate.classpath.ivy" />
         </path>
+        <echo message="${toString:compile.classpath}" file=".compile.classpath" />
         <echo message="${toString:antruntime.classpath}" file=".antruntime.classpath" />
         <echo message="${toString:generate.classpath}" file=".generate.classpath" />
         <ivy:retrieve conf="osgi" pattern="${basedir}/org.apache.ant.antdsl/lib/[type]s/[artifact]-[revision](.[ext])" sync="true" />
         <copy file="${basedir}/build-deps/apache-ant-1.9.0alpha/lib/ant.jar" tofile="${basedir}/org.apache.ant.antdsl/lib/jars/ant-1.9.0alpha.jar" />
         <jar destfile="${basedir}/org.apache.ant.antdsl/lib/sources/ant-1.9.0alpha.jar" basedir="${basedir}/build-deps/apache-ant-1.9.0alpha/src/main" />
+        <copy file="${basedir}/build-deps/ivy-2.4.0-alpha.jar" tofile="${basedir}/org.apache.ant.antdsl/lib/jars/ivy-2.4.0-alpha.jar" />
+        <copy file="${basedir}/build-deps/ivy-2.4.0-alpha-sources.jar" tofile="${basedir}/org.apache.ant.antdsl/lib/sources/ivy-2.4.0-alpha.jar" />
     </target>
 
     <target name="-do-update-deps" depends="init,ivy:configure">
@@ -99,9 +108,9 @@
     </target>
 
     <target name="build" description="Full build of a antdsl jar">
-        <loadpath pathid="antruntime.classpath" file=".antruntime.classpath" />
+        <loadpath pathid="compile.classpath" file=".compile.classpath" />
         <mkdir dir="${basedir}/build/classes" />
-        <javac srcdir="${basedir}/org.apache.ant.antdsl/src/:${basedir}/org.apache.ant.antdsl/src-gen/:${basedir}/org.apache.ant.antdsl/xtend-gen" destdir="${basedir}/build/classes" debug="on" includeantruntime="false" source="1.6" target="1.6" classpathref="antruntime.classpath" />
+        <javac srcdir="${basedir}/org.apache.ant.antdsl/src/:${basedir}/org.apache.ant.antdsl/src-gen/:${basedir}/org.apache.ant.antdsl/xtend-gen" destdir="${basedir}/build/classes" debug="on" includeantruntime="false" source="1.6" target="1.6" classpathref="compile.classpath" />
         <copy todir="${basedir}/build/classes">
             <fileset dir="${basedir}/org.apache.ant.antdsl/src">
                 <exclude name="*.java" />
@@ -145,6 +154,15 @@
         <ant antfile="test/build.ant" target="build" />
     </target>
 
+    <target name="test-update-build" description="Test the run of an antdsl file with Xtext-generated parser">
+        <loadfile property="antruntime.classpath" srcFile=".antruntime.classpath"/>
+        <exec executable="ant" dir="test">
+            <arg line="-lib" />
+            <arg line="${antruntime.classpath}" />
+            <arg line="-update-build" />
+        </exec>
+    </target>
+
     <macrodef name="loadpath">
         <attribute name="pathid" />
         <attribute name="file" />