bodewig     2003/11/27 06:11:05

  Modified:    proposal/sandbox/dotnet/src/etc/testcases msbuild.xml
                        nant.xml
               
proposal/sandbox/dotnet/src/main/org/apache/tools/ant/taskdefs/optional/dotnet
                        AbstractBuildTask.java MSBuildTask.java
                        NAntTask.java
               
proposal/sandbox/dotnet/src/testcases/org/apache/tools/ant/taskdefs/optional/dotnet
                        MSBuildTaskTest.java NAntTaskTest.java
  Log:
  Add support for nesting buuild file snippets into the task
  
  Revision  Changes    Path
  1.3       +27 -0     ant/proposal/sandbox/dotnet/src/etc/testcases/msbuild.xml
  
  Index: msbuild.xml
  ===================================================================
  RCS file: 
/home/cvs/ant/proposal/sandbox/dotnet/src/etc/testcases/msbuild.xml,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- msbuild.xml       25 Nov 2003 11:57:14 -0000      1.2
  +++ msbuild.xml       27 Nov 2003 14:11:05 -0000      1.3
  @@ -27,4 +27,31 @@
         <property name="foo" value="bar"/>
       </msbuild>
     </target>
  +
  +  <target name="nested-file">
  +    <property name="foo" value="bar"/>
  +    <msbuild 
  +      xmlns="antlib:org.apache.tools.ant.taskdefs.optional.dotnet"
  +      >
  +      <build>
  +        <Project DefaultTargets="echo">
  +          <Target Name="echo">
  +            <Task Name="Echo" Message="foo is ${foo}"/>
  +          </Target>
  +        </Project>
  +      </build>
  +    </msbuild>
  +  </target>
  +
  +  <target name="nested-task">
  +    <property name="foo" value="bar"/>
  +    <msbuild 
  +      xmlns="antlib:org.apache.tools.ant.taskdefs.optional.dotnet"
  +      >
  +      <build>
  +        <Task Name="Echo" Message="foo is ${foo}"/>
  +      </build>
  +    </msbuild>
  +  </target>
  +
   </project>
  
  
  
  1.3       +26 -0     ant/proposal/sandbox/dotnet/src/etc/testcases/nant.xml
  
  Index: nant.xml
  ===================================================================
  RCS file: /home/cvs/ant/proposal/sandbox/dotnet/src/etc/testcases/nant.xml,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- nant.xml  25 Nov 2003 11:57:14 -0000      1.2
  +++ nant.xml  27 Nov 2003 14:11:05 -0000      1.3
  @@ -27,4 +27,30 @@
         <property name="foo" value="bar"/>
       </nant>
     </target>
  +
  +  <target name="nested-file">
  +    <property name="foo" value="bar"/>
  +    <nant
  +      xmlns="antlib:org.apache.tools.ant.taskdefs.optional.dotnet"
  +      >
  +      <build>
  +        <project basedir="." default="echo">
  +          <target name="echo">
  +            <echo message="foo is ${foo}"/>
  +          </target>
  +        </project>
  +      </build>
  +    </nant>
  +  </target>
  +
  +  <target name="nested-task">
  +    <property name="foo" value="bar"/>
  +    <nant
  +      xmlns="antlib:org.apache.tools.ant.taskdefs.optional.dotnet"
  +      >
  +      <build>
  +        <echo message="foo is ${foo}"/>
  +      </build>
  +    </nant>
  +  </target>
   </project>
  
  
  
  1.2       +81 -2     
ant/proposal/sandbox/dotnet/src/main/org/apache/tools/ant/taskdefs/optional/dotnet/AbstractBuildTask.java
  
  Index: AbstractBuildTask.java
  ===================================================================
  RCS file: 
/home/cvs/ant/proposal/sandbox/dotnet/src/main/org/apache/tools/ant/taskdefs/optional/dotnet/AbstractBuildTask.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- AbstractBuildTask.java    21 Nov 2003 13:53:57 -0000      1.1
  +++ AbstractBuildTask.java    27 Nov 2003 14:11:05 -0000      1.2
  @@ -54,9 +54,18 @@
   
   package org.apache.tools.ant.taskdefs.optional.dotnet;
   
  +import org.apache.tools.ant.BuildException;
   import org.apache.tools.ant.Task;
  +import org.apache.tools.ant.util.DOMElementWriter;
  +import org.apache.tools.ant.util.FileUtils;
  +import org.apache.tools.ant.util.XMLFragment;
  +
  +import org.w3c.dom.DocumentFragment;
  +import org.w3c.dom.Element;
   
   import java.io.File;
  +import java.io.FileOutputStream;
  +import java.io.IOException;
   import java.util.ArrayList;
   import java.util.List;
   
  @@ -81,6 +90,11 @@
       private List properties = new ArrayList(1);
   
       /**
  +     * Nested build file fragment.
  +     */
  +    private XMLFragment buildSnippet;
  +
  +    /**
        * Empty constructor.
        */
       protected AbstractBuildTask() {
  @@ -94,6 +108,18 @@
       }
   
       /**
  +     * Adds a build file fragment.
  +     */
  +    public void addBuild(XMLFragment f) {
  +        if (buildSnippet == null) {
  +            buildSnippet = f;
  +        } else {
  +            throw new BuildException("You must not specify more than one "
  +                                     + "build element");
  +        }
  +    }
  +
  +    /**
        * A target.
        */
       public static class Target {
  @@ -181,9 +207,24 @@
       protected abstract String[] getPropertyArguments(List properties);
   
       /**
  +     * Turn the DoucmentFragment into a DOM tree suitable as a build
  +     * file when serialized.
  +     *
  +     * <p>Must throw a BuildException if the snippet can not be turned
  +     * into a build file.</p>
  +     */
  +    protected abstract Element makeTree(DocumentFragment f);
  +
  +    /**
        * Perform the build.
        */
       public void execute() {
  +        if (buildFile != null && buildSnippet != null) {
  +            throw new BuildException("You must not specify the build file"
  +                                     + " attribute and a nested build at the"
  +                                     + " same time");
  +        }
  +
           DotNetExecTask exec = new DotNetExecTask();
           exec.setProject(getProject());
           exec.setExecutable(getExecutable());
  @@ -196,10 +237,48 @@
           for (int i = 0; i < args.length; i++) {
               exec.createArg().setValue(args[i]);
           }
  -        args = getBuildfileArguments(buildFile);
  +
  +        File generatedFile = null;
  +        if (buildSnippet != null) {
  +            try {
  +                generatedFile = getBuildFile();
  +            } catch (IOException e) {
  +                throw new BuildException(e);
  +            }
  +            args = getBuildfileArguments(generatedFile);
  +        } else {
  +            args = getBuildfileArguments(buildFile);
  +        }        
  +
           for (int i = 0; i < args.length; i++) {
               exec.createArg().setValue(args[i]);
           }
  -        exec.execute();
  +
  +        try {
  +            exec.execute();
  +        } finally {
  +            if (generatedFile != null) {
  +                generatedFile.delete();
  +            }
  +        }
  +    }
  +
  +    private File getBuildFile() throws IOException {
  +        File f = null;
  +        if (buildSnippet != null) {
  +            Element e = makeTree(buildSnippet.getFragment());
  +            f = FileUtils.newFileUtils().createTempFile("build", ".xml", 
null);
  +            f.deleteOnExit();
  +            FileOutputStream out = null;
  +            try {
  +                out = new FileOutputStream(f);
  +                (new DOMElementWriter()).write(e, out);
  +            } finally {
  +                if (out != null) {
  +                    out.close();
  +                }
  +            }
  +        }
  +        return f;
       }
   }
  
  
  
  1.2       +35 -0     
ant/proposal/sandbox/dotnet/src/main/org/apache/tools/ant/taskdefs/optional/dotnet/MSBuildTask.java
  
  Index: MSBuildTask.java
  ===================================================================
  RCS file: 
/home/cvs/ant/proposal/sandbox/dotnet/src/main/org/apache/tools/ant/taskdefs/optional/dotnet/MSBuildTask.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- MSBuildTask.java  21 Nov 2003 13:53:57 -0000      1.1
  +++ MSBuildTask.java  27 Nov 2003 14:11:05 -0000      1.2
  @@ -59,11 +59,18 @@
   import java.util.ArrayList;
   import java.util.List;
   
  +import org.w3c.dom.DocumentFragment;
  +import org.w3c.dom.Element;
  +import org.w3c.dom.Node;
  +import org.w3c.dom.NodeList;
  +
   /**
    * Runs a MSBuild build process.
    */
   public class MSBuildTask extends AbstractBuildTask {
   
  +    private static final String TARGET = "generated-by-ant";
  +
       public MSBuildTask() {
           super();
       }
  @@ -117,6 +124,34 @@
               return new String[]{sb.toString()};
           } else {
               return new String[0];
  +        }
  +    }
  +
  +    /**
  +     * Turn the DocumentFragment into a DOM tree suitable as a build
  +     * file when serialized.
  +     *
  +     * <p>If we have exactly one <Project> child, return that.
  +     * Otherwise if we have only <Task> children, wrap them into a
  +     * <Target> which in turn gets wrapped into a <Project>.
  +     * Otherwise, fail.</p>
  +     */
  +    protected Element makeTree(DocumentFragment f) {
  +        NodeList nl = f.getChildNodes();
  +        if (nl.getLength() == 1 
  +            && nl.item(0).getNodeType() == Node.ELEMENT_NODE
  +            && nl.item(0).getNodeName().equals("Project")) {
  +            return (Element) nl.item(0);
  +        } else {
  +            Element p = f.getOwnerDocument().createElement("Project");
  +            p.setAttribute("DefaultTargets", TARGET);
  +
  +            Element t = f.getOwnerDocument().createElement("Target");
  +            t.setAttribute("Name", TARGET);
  +
  +            p.appendChild(t);
  +            t.appendChild(f);
  +            return p;
           }
       }
   }
  
  
  
  1.2       +26 -0     
ant/proposal/sandbox/dotnet/src/main/org/apache/tools/ant/taskdefs/optional/dotnet/NAntTask.java
  
  Index: NAntTask.java
  ===================================================================
  RCS file: 
/home/cvs/ant/proposal/sandbox/dotnet/src/main/org/apache/tools/ant/taskdefs/optional/dotnet/NAntTask.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- NAntTask.java     21 Nov 2003 13:53:57 -0000      1.1
  +++ NAntTask.java     27 Nov 2003 14:11:05 -0000      1.2
  @@ -59,6 +59,11 @@
   import java.util.ArrayList;
   import java.util.List;
   
  +import org.w3c.dom.DocumentFragment;
  +import org.w3c.dom.Element;
  +import org.w3c.dom.Node;
  +import org.w3c.dom.NodeList;
  +
   /**
    * Runs a NAnt build process.
    */
  @@ -101,5 +106,26 @@
               al.add("-D:" + p.getName() + "=" + p.getValue());
           }
           return (String[]) al.toArray(new String[al.size()]);
  +    }
  +
  +    /**
  +     * Turn the DocumentFragment into a DOM tree suitable as a build
  +     * file when serialized.
  +     *
  +     * <p>If we have exactly one <project> child, return that.
  +     * Otherwise assume that this is a valid build file snippet that
  +     * just needs an empty project wrapped around it.</p>
  +     */
  +    protected Element makeTree(DocumentFragment f) {
  +        NodeList nl = f.getChildNodes();
  +        if (nl.getLength() == 1 
  +            && nl.item(0).getNodeType() == Node.ELEMENT_NODE
  +            && nl.item(0).getNodeName().equals("project")) {
  +            return (Element) nl.item(0);
  +        } else {
  +            Element e = f.getOwnerDocument().createElement("project");
  +            e.appendChild(f);
  +            return e;
  +        }
       }
   }
  
  
  
  1.2       +12 -0     
ant/proposal/sandbox/dotnet/src/testcases/org/apache/tools/ant/taskdefs/optional/dotnet/MSBuildTaskTest.java
  
  Index: MSBuildTaskTest.java
  ===================================================================
  RCS file: 
/home/cvs/ant/proposal/sandbox/dotnet/src/testcases/org/apache/tools/ant/taskdefs/optional/dotnet/MSBuildTaskTest.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- MSBuildTaskTest.java      25 Nov 2003 11:57:14 -0000      1.1
  +++ MSBuildTaskTest.java      27 Nov 2003 14:11:05 -0000      1.2
  @@ -86,4 +86,16 @@
               expectLogContaining("echo", "foo is bar");
           }
       }
  +
  +    public void testNestedFile() throws Exception {
  +        if (getProject().getProperty("msbuild.found") != null) {
  +            expectLogContaining("nested-file", "foo is bar");
  +        }
  +    }
  +
  +    public void testNestedTask() throws Exception {
  +        if (getProject().getProperty("msbuild.found") != null) {
  +            expectLogContaining("nested-task", "foo is bar");
  +        }
  +    }
   }
  
  
  
  1.2       +12 -0     
ant/proposal/sandbox/dotnet/src/testcases/org/apache/tools/ant/taskdefs/optional/dotnet/NAntTaskTest.java
  
  Index: NAntTaskTest.java
  ===================================================================
  RCS file: 
/home/cvs/ant/proposal/sandbox/dotnet/src/testcases/org/apache/tools/ant/taskdefs/optional/dotnet/NAntTaskTest.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- NAntTaskTest.java 25 Nov 2003 11:57:14 -0000      1.1
  +++ NAntTaskTest.java 27 Nov 2003 14:11:05 -0000      1.2
  @@ -86,4 +86,16 @@
               expectLogContaining("echo", "foo is bar");
           }
       }
  +
  +    public void testNestedFile() throws Exception {
  +        if (getProject().getProperty("nant.found") != null) {
  +            expectLogContaining("nested-file", "foo is bar");
  +        }
  +    }
  +
  +    public void testNestedTask() throws Exception {
  +        if (getProject().getProperty("nant.found") != null) {
  +            expectLogContaining("nested-task", "foo is bar");
  +        }
  +    }
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to