diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/image/Image.java b/src/main/org/apache/tools/ant/taskdefs/optional/image/Image.java
index 85204b083..893d21052 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/image/Image.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/image/Image.java
@@ -57,6 +57,7 @@ import com.sun.media.jai.codec.FileSeekableStream;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.taskdefs.MatchingTask;
+import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.types.optional.image.Draw;
import org.apache.tools.ant.types.optional.image.ImageOperation;
import org.apache.tools.ant.types.optional.image.Rotate;
@@ -69,6 +70,8 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Vector;
+import java.util.ArrayList;
+import java.util.Iterator;
/**
* A MatchingTask which relies on JAI (Java Advanced Imaging)
@@ -81,16 +84,34 @@ import java.util.Vector;
* @see org.apache.tools.ant.types.optional.image.ImageOperation
* @see org.apache.tools.ant.types.DataType
* @author Kevin Z Grey
+ * @author Eric Pugh
*/
public class Image extends MatchingTask {
protected Vector instructions = new Vector();
protected String str_encoding = "JPEG";
protected boolean overwrite = false;
protected boolean garbage_collect = false;
+ private boolean failonerror = true;
+ protected Vector filesets = new Vector();
+
protected File srcDir = null;
protected File destDir = null;
+ /**
+ * Adds a set of files to be deleted.
+ */
+ public void addFileset(FileSet set) {
+ filesets.addElement(set);
+ }
+
+ /**
+ * If false, note errors to the output but keep going.
+ * @param failonerror true or false
+ */
+ public void setFailOnError(boolean failonerror) {
+ this.failonerror = failonerror;
+ }
/**
* Set the source dir to find the image files.
@@ -109,19 +130,15 @@ public class Image extends MatchingTask {
/**
* Sets whether or not to overwrite a file if there is a naming conflict.
*/
- public void setOverwrite(String ovr) {
- if (ovr.toLowerCase().equals("true") || ovr.toLowerCase().equals("yes")) {
- overwrite = true;
- }
+ public void setOverwrite(boolean overwrite) {
+ this.overwrite = overwrite;
}
/**
* Enables Garbage Collection after each image processed. Defaults to false.
*/
- public void setGc(String gc) {
- if (gc.toLowerCase().equals("true") || gc.toLowerCase().equals("yes")) {
- garbage_collect = true;
- }
+ public void setGc(boolean gc) {
+ garbage_collect = gc;
}
@@ -129,7 +146,7 @@ public class Image extends MatchingTask {
* Sets the destination directory for manipulated images.
* @param destination The destination directory
*/
- public void setDest(String destination) {
+ public void setDestDir(String destination) {
destDir = new File(destination);
}
@@ -189,53 +206,121 @@ public class Image extends MatchingTask {
}
}
input.close();
- FileOutputStream stream = new FileOutputStream(file);
+
+
log("Encoding As " + str_encoding);
- String file_ext = str_encoding.toLowerCase();
if (str_encoding.toLowerCase().equals("jpg")) {
str_encoding = "JPEG";
- file_ext = "jpg";
} else if (str_encoding.toLowerCase().equals("tif")) {
str_encoding = "TIFF";
- file_ext = "tif";
}
- JAI.create("encode", image, stream, str_encoding.toUpperCase(), null);
- stream.flush();
- stream.close();
+ if (destDir == null){
+ destDir = srcDir;
+ }
+
+ File new_file = new File(destDir.getAbsolutePath() + File.separator + file.getName());
- String old_name = file.getAbsolutePath();
- int t_loc = old_name.lastIndexOf(".");
- String t_name = old_name.substring(0, t_loc + 1) + file_ext;
- File new_file = new File(t_name);
if ((overwrite && new_file.exists()) && (!new_file.equals(file))) {
new_file.delete();
}
- file.renameTo(new_file);
+ else if (!overwrite && new_file.exists()){
+ return;
+ }
+
+ FileOutputStream stream = new FileOutputStream(new_file);
+
+ JAI.create("encode", image, stream, str_encoding.toUpperCase(), null);
+ stream.flush();
+ stream.close();
+
+
} catch (IOException err) {
- log("Error processing file: " + err);
+ if (!failonerror) {
+ log("Error processing file: " + err);
+ } else {
+ throw new BuildException(err);
+ }
}
+
+ catch (java.lang.RuntimeException rerr) {
+ if (!failonerror) {
+ log("Error processing file: " + rerr);
+ } else {
+ throw new BuildException(rerr);
+ }
+ }
+
}
/**
* Executes the Task
*/
public void execute() {
+
+ validateAttributes();
+
try {
- DirectoryScanner ds = super.getDirectoryScanner(srcDir);
- String[] files = ds.getIncludedFiles();
+ DirectoryScanner ds = null;
+ String [] files =null;
+ ArrayList filesList = new ArrayList();
+
- for (int i = 0; i < files.length; i++) {
- processFile(new File(srcDir.getAbsolutePath() + File.separator + files[i]));
- if (garbage_collect) {
- System.gc();
+ // deal with specified srcDir
+ if (srcDir != null){
+ ds = super.getDirectoryScanner(srcDir);
+
+ files = ds.getIncludedFiles();
+ for (int i = 0; i < files.length; i++){
+ filesList.add(new File(srcDir.getAbsolutePath() + File.separator + files[i]));
+ }
+ }
+ // deal with the filesets
+ for (int i = 0; i < filesets.size(); i++) {
+ FileSet fs = (FileSet) filesets.elementAt(i);
+ ds = fs.getDirectoryScanner(getProject());
+ files =ds.getIncludedFiles();
+ File fromDir = fs.getDir(getProject());
+ for (int j = 0; j < files.length; j++){
+ filesList.add(new File(fromDir.getAbsolutePath() + File.separator + files[j]));
}
}
+ // iterator through all the files and process them.
+ for (Iterator i = filesList.iterator();i.hasNext();){
+ File file = (File)i.next();
+
+ processFile(file);
+ if (garbage_collect) {
+ System.gc();
+ }
+ }
+
+
} catch (Exception err) {
err.printStackTrace();
throw new BuildException(err.getMessage());
}
}
+
+
+ /**
+ * Ensure we have a consistent and legal set of attributes, and set
+ * any internal flags necessary based on different combinations
+ * of attributes.
+ */
+ protected void validateAttributes() throws BuildException {
+ if (srcDir == null && filesets.size() == 0) {
+ throw new BuildException("Specify at least one source "
+ + "- a srcDir or a fileset.");
+ }
+
+ if (srcDir == null && destDir == null) {
+ throw new BuildException("Specify the destDir, or the srcDir.");
+ }
+
+
+ }
+
}
diff --git a/src/main/org/apache/tools/ant/types/optional/image/Scale.java b/src/main/org/apache/tools/ant/types/optional/image/Scale.java
index 579cf524c..91950e9de 100644
--- a/src/main/org/apache/tools/ant/types/optional/image/Scale.java
+++ b/src/main/org/apache/tools/ant/types/optional/image/Scale.java
@@ -65,8 +65,8 @@ import java.awt.image.renderable.ParameterBlock;
* @see org.apache.tools.ant.taskdefs.optional.image.Image
*/
public class Scale extends TransformOperation implements DrawOperation {
- private String width_str = null;
- private String height_str = null;
+ private String width_str = "100%";
+ private String height_str = "100%";
private boolean x_percent = true;
private boolean y_percent = true;
private boolean keep_proportions = false;
@@ -74,11 +74,16 @@ public class Scale extends TransformOperation implements DrawOperation {
public void setKeepproportions(boolean props) {
keep_proportions = props;
}
-
+ /**
+ * Sets the width of the image, either as an integer or a %. Defaults to 100%.
+ */
public void setWidth(String width) {
width_str = width;
}
+ /**
+ * Sets the height of the image, either as an integer or a %. Defaults to 100%.
+ */
public void setHeight(String height) {
height_str = height;
}