diff --git a/src/main/org/apache/tools/ant/taskdefs/SQLExec.java b/src/main/org/apache/tools/ant/taskdefs/SQLExec.java index 5bc4c5047..a33d2e1ea 100644 --- a/src/main/org/apache/tools/ant/taskdefs/SQLExec.java +++ b/src/main/org/apache/tools/ant/taskdefs/SQLExec.java @@ -25,6 +25,7 @@ import org.apache.tools.ant.types.EnumeratedAttribute; import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.types.Resource; import org.apache.tools.ant.types.ResourceCollection; +import org.apache.tools.ant.types.resources.Appendable; import org.apache.tools.ant.types.resources.FileProvider; import org.apache.tools.ant.types.resources.FileResource; import org.apache.tools.ant.types.resources.Union; @@ -569,16 +570,26 @@ public class SQLExec extends JDBCTask { try { if (output != null) { log("Opening PrintStream to output Resource " + output, Project.MSG_VERBOSE); - OutputStream os; + OutputStream os = null; FileProvider fp = (FileProvider) output.as(FileProvider.class); if (fp != null) { os = new FileOutputStream(fp.getFile(), append); } else { - // TODO use Appendable - os = output.getOutputStream(); if (append) { - log("Ignoring append=true for non-file resource " + output, Project.MSG_WARN); + Appendable a = + (Appendable) output.as(Appendable.class); + if (a != null) { + os = a.getAppendOutputStream(); + } + } + if (os == null) { + os = output.getOutputStream(); + if (append) { + log("Ignoring append=true for non-appendable" + + " resource " + output, + Project.MSG_WARN); + } } } out = new PrintStream(new BufferedOutputStream(os)); diff --git a/src/main/org/apache/tools/ant/types/resources/ContentTransformingResource.java b/src/main/org/apache/tools/ant/types/resources/ContentTransformingResource.java index 61591df28..001ac7c8c 100644 --- a/src/main/org/apache/tools/ant/types/resources/ContentTransformingResource.java +++ b/src/main/org/apache/tools/ant/types/resources/ContentTransformingResource.java @@ -251,6 +251,32 @@ public abstract class ContentTransformingResource extends Resource { super.setRefid(r); } + /** + * Suppress FileProvider, re-implement Appendable + */ + public Object as(Class clazz) { + if (Appendable.class.isAssignableFrom(clazz)) { + final Appendable a = + (Appendable) getResource().as(Appendable.class); + if (a != null) { + return new Appendable() { + public OutputStream getAppendOutputStream() + throws IOException { + OutputStream out = a.getAppendOutputStream(); + if (out != null) { + out = wrapStream(out); + } + return out; + } + }; + } + return null; + } + + return FileProvider.class.isAssignableFrom(clazz) + ? null : getResource().as(clazz); + } + /** * Is supposed to wrap the stream. * diff --git a/src/main/org/apache/tools/ant/types/resources/MappedResource.java b/src/main/org/apache/tools/ant/types/resources/MappedResource.java index b153e2b23..9bf2d1e69 100644 --- a/src/main/org/apache/tools/ant/types/resources/MappedResource.java +++ b/src/main/org/apache/tools/ant/types/resources/MappedResource.java @@ -159,6 +159,9 @@ public class MappedResource extends Resource { throw new UnsupportedOperationException(); } + /** + * Suppress FileProvider + */ public Object as(Class clazz) { return FileProvider.class.isAssignableFrom(clazz) ? null : wrapped.as(clazz);