001    package org.shiftone.jrat.inject.ant;
002    
003    
004    import org.apache.tools.ant.BuildException;
005    import org.apache.tools.ant.DirectoryScanner;
006    import org.apache.tools.ant.Task;
007    import org.apache.tools.ant.types.FileSet;
008    
009    import java.io.File;
010    import java.util.Iterator;
011    import java.util.Set;
012    import java.util.TreeSet;
013    import java.util.Vector;
014    
015    
016    /**
017     * @author jeff@shiftone.org (Jeff Drost)
018     */
019    public abstract class AbstractFileTask extends Task {
020    
021        protected Vector filesets = new Vector();
022        protected File file = null;
023    
024        /**
025         * called by Ant
026         */
027        public void addFileset(FileSet set) {
028            filesets.addElement(set);
029        }
030    
031    
032        /**
033         * called by Ant
034         */
035        public void setFile(File file) {
036            this.file = file;
037        }
038    
039    
040        protected abstract void validateFile(File file) throws BuildException;
041    
042    
043        protected abstract void processFile(File file) throws BuildException;
044    
045    
046        private void processFiles(Set fileNames) throws BuildException {
047    
048            Iterator iterator = fileNames.iterator();
049    
050            while (iterator.hasNext()) {
051                processFile((File) iterator.next());
052            }
053        }
054    
055    
056        /**
057         * called by Ant
058         */
059        public void execute() throws BuildException {
060    
061            Set files = new TreeSet();
062            String fileName = null;
063            File fileToAdd = null;
064    
065            try {
066    
067                // single file
068                if (this.file != null) {
069                    validateFile(this.file);
070                    files.add(this.file);
071                }
072    
073                // FileSet(s)
074                for (int i = 0; i < filesets.size(); i++) {
075                    FileSet fs = (FileSet) filesets.elementAt(i);
076                    DirectoryScanner ds = fs.getDirectoryScanner(getProject());
077                    File fromDir = fs.getDir(getProject());
078                    String[] srcFiles = ds.getIncludedFiles();
079    
080                    for (int x = 0; x < srcFiles.length; x++) {
081                        fileName = fromDir + File.separator + srcFiles[x];
082                        fileToAdd = new File(fileName);
083    
084                        validateFile(fileToAdd);
085                        files.add(fileToAdd);
086                    }
087                }
088    
089                processFiles(files);
090            }
091            catch (Throwable e) {
092                e.printStackTrace();
093    
094                throw new BuildException("file task failed", e);
095            }
096        }
097    }