Browse Source

Bugzilla 28773

* added support for nested filesets into DotnetResource
* fixed problem when compiling with several references


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@329234 13f79535-47bb-0310-9956-ffa450edef68
master
Alexey N. Solofnenko 20 years ago
parent
commit
6f8402d926
10 changed files with 223 additions and 69 deletions
  1. +72
    -8
      src/etc/testcases/taskdefs/optional/dotnet.xml
  2. +2
    -1
      src/etc/testcases/taskdefs/optional/dotnet/example.cs
  3. +29
    -0
      src/etc/testcases/taskdefs/optional/dotnet/example3.cs
  4. BIN
      src/etc/testcases/taskdefs/optional/dotnet/res.resources
  5. +2
    -2
      src/main/org/apache/tools/ant/taskdefs/optional/dotnet/CSharp.java
  6. +6
    -23
      src/main/org/apache/tools/ant/taskdefs/optional/dotnet/DotnetCompile.java
  7. +101
    -31
      src/main/org/apache/tools/ant/taskdefs/optional/dotnet/DotnetResource.java
  8. +2
    -2
      src/main/org/apache/tools/ant/taskdefs/optional/dotnet/JSharp.java
  9. +2
    -2
      src/main/org/apache/tools/ant/taskdefs/optional/dotnet/VisualBasicCompile.java
  10. +7
    -0
      src/testcases/org/apache/tools/ant/taskdefs/optional/DotnetTest.java

+ 72
- 8
src/etc/testcases/taskdefs/optional/dotnet.xml View File

@@ -97,15 +97,15 @@
</condition>
<property name="mono.executable" value="mint"/>

<!-- now set a prop of the compiler name to whatever we found -->
<!-- now set a prop of the compiler name to whatever we found -->
<condition property="cs.compiler" value="csc">
<isset property="csc.found"/>
</condition>
</condition>

<condition property="cs.compiler" value="mcs">
<isset property="mcs.found"/>
</condition>
</condition>
</target>

<target name="init" depends="probe_for_apps">
@@ -164,6 +164,56 @@
<delete file="${testCSC.exe}"/>
</target>

<target name="testCSCResources" depends="testCSCResources-Mono,testCSCResources-MS"/>

<target name="testCSCResources-MS" depends="validate_csc" if="csc.found">
<property name="testCSCRes.exe"
location="${build.dir}/ExampleCscRes.exe" />
<csc
destFile="${testCSCRes.exe}"
targetType="exe"
srcDir="${src.dir}"
>
<resource file="${src.dir}/res.resources"/>
</csc>
<available property="app-res.created" file="${testCSCRes.exe}"/>
<fail unless="app-res.created">No app ${testCSC.exe} created</fail>
<exec executable="${testCSCRes.exe}" failonerror="true" />
<delete file="${testCSCRes.exe}"/>
<csc
destFile="${testCSCRes.exe}"
targetType="exe"
srcDir="${src.dir}"
>
<resource namespace="some.namespace" embed="true">
<fileset file="${src.dir}/res.resources"/>
</resource>
</csc>
<available property="app-res-2.created" file="${testCSCRes.exe}"/>
<fail unless="app-res-2.created">No app ${testCSC.exe} created</fail>
<exec executable="${testCSCRes.exe}" failonerror="true" />
<delete file="${testCSCRes.exe}"/>
</target>

<target name="testCSCResources-Mono" depends="validate_csc" if="mcs.found">
<property name="testCSCRes.exe"
location="${build.dir}/ExampleCscRes.exe" />
<csc
destFile="${testCSCRes.exe}"
targetType="exe"
includedefaultreferences="true"
srcDir="${src.dir}"
>
<resource file="${src.dir}/res.resources"/>
</csc>
<available property="app-res.created" file="${testCSCRes.exe}"/>
<fail unless="app-res.created">No app ${testCSC.exe} created</fail>
<exec executable="${mono.executable}" failonerror="true">
<arg value="${testCSCRes.exe}"/>
</exec>
<delete file="${testCSCRes.exe}"/>
</target>

<target name="testCSCintrinsicFileset"
depends="testCSCintrinsicFileset-MS,testCSCintrinsicFileset-Mono"/>

@@ -216,6 +266,18 @@
</csc>
<available property="dll.created" file="${testCSC.dll}"/>
<fail unless="dll.created">No file ${testCSC.dll} created</fail>
<property name="testCSC2.dll"
location="${build.dir}/folder with dir/Example3.dll" />
<mkdir dir="${build.dir}/folder with dir"/>
<csc
destFile="${testCSC2.dll}"
targetType="library"
executable="csc"
>
<src dir="${src.dir}" includes="example3.cs"/>
</csc>
<available property="dll2.created" file="${testCSC2.dll}"/>
<fail unless="dll2.created">No file ${testCSC2.dll} created</fail>
</target>

<target name="testCSCdll-Mono" depends="validate_csc" if="mcs.found">
@@ -245,12 +307,14 @@
>
<src file="${src.dir}/example.cs"/>
<reference file="${testCSC.dll}" />
<reference file="${testCSC2.dll}" />
<define name="RELEASE" />
<define name="DEBUG" if="undefined.property"/>
<define name="def3" unless="undefined.property"/>
</csc>
<available property="refapp.created" file="${testCscReferences.exe}"/>
<fail unless="refapp.created">No app ${testCscReferences.exe} created</fail>
<copy file="${testCSC2.dll}" todir="${build.dir}"/>
<exec executable="${testCscReferences.exe}" failonerror="true" />
</target>

@@ -280,7 +344,7 @@
depends="testILASM-Mono,testILASM-MS"
if="ilasm.found"/>

<target name="ilasm" depends="validate_ilasm"
<target name="ilasm" depends="validate_ilasm"
if="ilasm.found">
<property name="testILASM.exe"
location="${build.dir}/ExampleIlasm.exe" />
@@ -294,13 +358,13 @@
<fail unless="ilasm.created">No app ${testILASM.exe} created</fail>
</target>

<target name="testILASM-MS" depends="ilasm"
<target name="testILASM-MS" depends="ilasm"
if="ilasm.found" unless="mono.ilasm.found">
<exec executable="${testILASM.exe}"
failonerror="true"/>
</target>

<target name="testILASM-Mono" depends="ilasm"
<target name="testILASM-Mono" depends="ilasm"
if="mono.ilasm.found">
<exec executable="${mono.executable}"
failonerror="true">
@@ -371,7 +435,7 @@
<available property="app.created" file="${testCSCresponseFile.exe}"/>
<fail unless="app.created">No app ${testCSCresponseFile.exe} created</fail>
<delete file="${testCSCresponseFile.exe}"/>
</target>
</target>


</project>


+ 2
- 1
src/etc/testcases/taskdefs/optional/dotnet/example.cs View File

@@ -14,12 +14,13 @@
* limitations under the License.
*
*/
using System;

public class Example {

public static void Main(String[] args) {
Example2.echo();
Example3.echo();
}
}

+ 29
- 0
src/etc/testcases/taskdefs/optional/dotnet/example3.cs View File

@@ -0,0 +1,29 @@
/*
* Copyright 2003-2004 The Apache Software Foundation
*
* Licensed 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.
*
*/

using System;

/**
* this is just here to create confusion
*/
public class Example3 {

public static void echo() {
Console.WriteLine("hello, I look like Java, but I'm really .NET");
}

}

BIN
src/etc/testcases/taskdefs/optional/dotnet/res.resources View File


+ 2
- 2
src/main/org/apache/tools/ant/taskdefs/optional/dotnet/CSharp.java View File

@@ -386,8 +386,8 @@ public class CSharp extends DotnetCompile {
* @return a string containing the resource param, or a null string
* to conditionally exclude a resource.
*/
protected String createResourceParameter(DotnetResource resource) {
return resource.getCSharpStyleParameter();
protected void createResourceParameter(NetCommand command, DotnetResource resource) {
resource.getParameters(getProject(), command, true);
}

}


+ 6
- 23
src/main/org/apache/tools/ant/taskdefs/optional/dotnet/DotnetCompile.java View File

@@ -220,7 +220,7 @@ public abstract class DotnetCompile
//bail on no references
if (notEmpty(references)) {
if (isWindows) {
return REFERENCE_OPTION + '\"' + references + '\"';
return '\"' + REFERENCE_OPTION + references + '\"';
} else {
return REFERENCE_OPTION + references;
}
@@ -871,7 +871,7 @@ public abstract class DotnetCompile
Enumeration e = resources.elements();
while (e.hasMoreElements()) {
DotnetResource resource = (DotnetResource) e.nextElement();
command.addArgument(createResourceParameter(resource));
createResourceParameter(command, resource);
}
}

@@ -881,7 +881,7 @@ public abstract class DotnetCompile
* @return a string containing the resource param, or a null string
* to conditionally exclude a resource.
*/
protected abstract String createResourceParameter(DotnetResource resource);
protected abstract void createResourceParameter(NetCommand command, DotnetResource resource);


/**
@@ -904,37 +904,20 @@ public abstract class DotnetCompile
if (filesToBuild.size() == 0) {
return 0;
}
StringBuffer referenceList = new StringBuffer(REFERENCE_OPTION);
//now scan the hashtable and add the files
Enumeration files = filesToBuild.elements();
boolean firstEntry = true;
while (files.hasMoreElements()) {
File file = (File) files.nextElement();
if (isFileManagedBinary(file)) {
if (!firstEntry) {
referenceList.append(getReferenceDelimiter());
} else if (isWindows) {
referenceList.append('\"');
}
referenceList.append(file.toString());
firstEntry = false;
if (isWindows) command.addArgument('"'+REFERENCE_OPTION+file.toString()+'"');
else command.addArgument(REFERENCE_OPTION+file.toString());
} else {
log("ignoring " + file + " as it is not a managed executable",
Project.MSG_VERBOSE);
}

}
// hack: This means we've added at least one reference that's
// a managed binary
if (!firstEntry) {
//add it all to an argument
if (isWindows) {
command.addArgument(referenceList.toString() + '\"');
} else {
command.addArgument(referenceList.toString());
}
}

return filesOutOfDate;
}



+ 101
- 31
src/main/org/apache/tools/ant/taskdefs/optional/dotnet/DotnetResource.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 2000-2004 The Apache Software Foundation
* Copyright 2000-2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,6 +19,10 @@ package org.apache.tools.ant.taskdefs.optional.dotnet;
import org.apache.tools.ant.BuildException;

import java.io.File;
import java.util.ArrayList;
import org.apache.tools.ant.types.FileSet;
import java.util.Iterator;
import org.apache.tools.ant.*;

/**
* class used by DotnetCompile to name resources, could be upgraded to a datatype
@@ -48,6 +52,16 @@ public class DotnetResource {
*/
private String name = null;

/**
* A list of filesets with resources.
*/
private ArrayList fileSets=new ArrayList();

/**
* a namespace to be used with <filesets>
*/
private String namespace = null;

public boolean isEmbed() {
return embed;
}
@@ -96,48 +110,104 @@ public class DotnetResource {
this.name = name;
}

/**
* Filesets root namespace. The value always ends with '.' .
* @return String namespace name
*/
public String getNamespace() {
return namespace;
}

/**
* Sets filesets root namespace.
* @param namespace String root namespace
*/
public void setNamespace(String namespace) {
if (namespace==null) this.namespace=null;
else this.namespace=(namespace.length()==0 || namespace.endsWith(".") ? namespace : namespace+'.');
}

private void checkParameters() {
if (hasFilesets()) {
if (getName()!=null) throw new BuildException(
"Cannot use <resource name=\"...\"> attribute with filesets");
if (getFile()!=null) throw new BuildException(
"Cannot use <resource file=\"...\"> attribute with filesets");
}
else {
if (getNamespace()!=null) throw new BuildException(
"Cannot use <resource namespace=\"...\"> attribute without filesets");
}
}
/**
* build the C# style parameter (which has no public/private option)
* @return the built C# style parameter
*/
public String getCSharpStyleParameter() {
StringBuffer buffer = new StringBuffer();
buffer.append(isEmbed() ? "/resource" : "/linkresource");
buffer.append(':');
buffer.append(getFile().toString());
if (getName() != null) {
buffer.append(',');
buffer.append(getName());
public void getParameters(Project p, NetCommand command, boolean csharpStyle) {
checkParameters();
if (hasFilesets()) {
for (Iterator listIter=fileSets.iterator(); listIter.hasNext();) {
FileSet fs=(FileSet)listIter.next();;
String baseDirectory=fs.getDir(p).toString();
String namespace=getNamespace(); // ends with '.' or null
DirectoryScanner ds = fs.getDirectoryScanner(p);
String[] files = ds.getIncludedFiles();
for (int i=0; i<files.length; i++) {
String file=files[i];
command.addArgument(getParameter(baseDirectory+File.separatorChar+file, (namespace==null ? null : namespace+file.replace(File.separatorChar, '.')), csharpStyle));
}
}
}
if (getPublic() != null) {
throw new BuildException("This compiler does not support the "
+ "public/private option.");
else {
command.addArgument(getParameter(getFile().toString(), getName(),
csharpStyle));
}
return buffer.toString();
}

/**
* This method gets the style of param used by VB and javascript
* @return The style VB parameter being used.
*/
public String getVbStyleParameter() {
StringBuffer buffer = new StringBuffer();
buffer.append(isEmbed() ? "/resource" : "/linkresource");
private String getParameter(String fileName, String name, boolean csharpStyle) {
StringBuffer buffer=new StringBuffer();
buffer.append(isEmbed()?"/resource":"/linkresource");
buffer.append(':');
buffer.append(getFile().toString());
if (getName() != null) {
buffer.append(fileName);
if (name!=null) {
buffer.append(',');
buffer.append(getName());
if (getPublic() != null) {
buffer.append(',');
buffer.append(getPublic().booleanValue()
? "public" : "private");

buffer.append(name);
if (csharpStyle) {
if (getPublic()!=null) {
throw new BuildException(
"This compiler does not support the "
+"public/private option.");
}
else {
if (getPublic()!=null) {
buffer.append(',');
buffer.append(getPublic().booleanValue()
?"public":"private");

}
}
}
else if (getPublic()!=null) {
throw new BuildException("You cannot have a public or private "
+"option without naming the resource");
}
} else if (getPublic() != null) {
throw new BuildException("You cannot have a public or private "
+ "option without naming the resource");
}
return buffer.toString();
}

/**
* Adds a resource file set.
* @param fileset FileSet
*/
public void addFileset(FileSet fileset) {
fileSets.add(fileset);
}

/**
* Checks that <resource> node has embedded <filesets>
* @return boolean
*/
public boolean hasFilesets() {
return fileSets.size()>0;
}
}

+ 2
- 2
src/main/org/apache/tools/ant/taskdefs/optional/dotnet/JSharp.java View File

@@ -119,8 +119,8 @@ public class JSharp extends DotnetCompile {
* @return a string containing the resource param, or a null string
* to conditionally exclude a resource.
*/
protected String createResourceParameter(DotnetResource resource) {
return resource.getCSharpStyleParameter();
protected void createResourceParameter(NetCommand command, DotnetResource resource) {
resource.getParameters(getProject(), command, true);
}

/**


+ 2
- 2
src/main/org/apache/tools/ant/taskdefs/optional/dotnet/VisualBasicCompile.java View File

@@ -352,8 +352,8 @@ public class VisualBasicCompile extends DotnetCompile {
* @return a string containing the resource param, or a null string
* to conditionally exclude a resource.
*/
protected String createResourceParameter(DotnetResource resource) {
return resource.getVbStyleParameter();
protected void createResourceParameter(NetCommand command, DotnetResource resource) {
resource.getParameters(getProject(), command, false);
}

/**


+ 7
- 0
src/testcases/org/apache/tools/ant/taskdefs/optional/DotnetTest.java View File

@@ -90,6 +90,13 @@ public class DotnetTest extends BuildFileTest {
executeTarget("testCscReferences");
}

/**
* A unit test for JUnit
*/
public void testCscResources() throws Exception {
executeTarget("testCSCResources");
}

/**
* test we can assemble
*/


Loading…
Cancel
Save