git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@708948 13f79535-47bb-0310-9956-ffa450edef68master
@@ -282,6 +282,10 @@ Fixed bugs: | |||||
original error is now logged to System.err. | original error is now logged to System.err. | ||||
Bugzilla Report 25086. | Bugzilla Report 25086. | ||||
* <copy> failed with a NullPointerException when copying a resource | |||||
without a name. It will now fail with a meaningful error message. | |||||
Bugzilla Report 39960. | |||||
Other changes: | Other changes: | ||||
-------------- | -------------- | ||||
@@ -757,6 +757,13 @@ public class Copy extends Task { | |||||
} | } | ||||
for (int i = 0; i < toCopy.length; i++) { | for (int i = 0; i < toCopy.length; i++) { | ||||
String[] mappedFiles = mapper.mapFileName(toCopy[i].getName()); | String[] mappedFiles = mapper.mapFileName(toCopy[i].getName()); | ||||
for (int j = 0; j < mappedFiles.length; j++) { | |||||
if (mappedFiles[j] == null) { | |||||
throw new BuildException("Can't copy a resource without a" | |||||
+ " name if the mapper doesn't" | |||||
+ " provide one."); | |||||
} | |||||
} | |||||
if (!enableMultipleMappings) { | if (!enableMultipleMappings) { | ||||
map.put(toCopy[i], | map.put(toCopy[i], | ||||
@@ -155,6 +155,11 @@ public class ResourceUtils { | |||||
Project.MSG_VERBOSE); | Project.MSG_VERBOSE); | ||||
continue; | continue; | ||||
} | } | ||||
for (int i = 0; i < targetnames.length; i++) { | |||||
if (targetnames[i] == null) { | |||||
targetnames[i] = "(no name)"; | |||||
} | |||||
} | |||||
Union targetColl = new Union(); | Union targetColl = new Union(); | ||||
for (int i = 0; i < targetnames.length; i++) { | for (int i = 0; i < targetnames.length; i++) { | ||||
targetColl.add(targets.getResource( | targetColl.add(targets.getResource( | ||||
@@ -42,4 +42,62 @@ | |||||
<au:assertFileExists file="${output}/file.txt"/> | <au:assertFileExists file="${output}/file.txt"/> | ||||
</target> | </target> | ||||
<target name="-setupNullByteStreamResource"> | |||||
<mkdir dir="${input}"/> | |||||
<echo file="${input}/NullByteStreamResource.java"><![CDATA[ | |||||
import org.apache.tools.ant.types.Resource; | |||||
import java.io.*; | |||||
public class NullByteStreamResource extends Resource { | |||||
private long length = 1024; | |||||
public boolean isExists() { | |||||
return true; | |||||
} | |||||
public long getLastModified() { | |||||
return UNKNOWN_DATETIME; | |||||
} | |||||
public void setLength(long length) { | |||||
this.length = length; | |||||
} | |||||
public InputStream getInputStream() { | |||||
return new InputStream() { | |||||
int readSoFar = 0; | |||||
public int read() { | |||||
return readSoFar++ > length ? -1 : 0; | |||||
} | |||||
}; | |||||
} | |||||
} | |||||
]]></echo> | |||||
<mkdir dir="${output}"/> | |||||
<javac srcdir="${input}" destdir="${output}"/> | |||||
<typedef name="nullstream" classname="NullByteStreamResource"> | |||||
<classpath> | |||||
<pathelement location="${output}"/> | |||||
</classpath> | |||||
</typedef> | |||||
</target> | |||||
<target name="testResourceWithoutName" | |||||
depends="-setupNullByteStreamResource"> | |||||
<au:expectfailure> | |||||
<copy todir="${output}"> | |||||
<nullstream/> | |||||
</copy> | |||||
</au:expectfailure> | |||||
</target> | |||||
<target name="testResourceWithoutNameWithMergeMapper" | |||||
depends="-setupNullByteStreamResource"> | |||||
<copy todir="${output}"> | |||||
<nullstream/> | |||||
<mergemapper to="foo"/> | |||||
</copy> | |||||
<au:assertFileExists file="${output}/foo"/> | |||||
</target> | |||||
</project> | </project> |