001    /*
002    @license.text@
003     */
004    package biz.hammurapi.ant;
005    
006    import java.io.File;
007    import java.io.FileInputStream;
008    import java.io.IOException;
009    import java.util.ArrayList;
010    import java.util.Collection;
011    import java.util.Iterator;
012    
013    import javax.xml.parsers.ParserConfigurationException;
014    import javax.xml.transform.TransformerException;
015    
016    import org.apache.tools.ant.BuildException;
017    import org.apache.tools.ant.DirectoryScanner;
018    import org.apache.tools.ant.Task;
019    import org.apache.tools.ant.types.FileSet;
020    import org.w3c.dom.Document;
021    import org.xml.sax.SAXException;
022    
023    import biz.hammurapi.xml.dom.DOMUtils;
024    import biz.hammurapi.xml.dom.DOMUtils;
025    
026    /**
027     * This task applies a stylesheet to XML files. Output file name is calculated from XPath expression.
028     * @author Pavel Vlasov
029     * @revision $Revision$
030     */
031    public class StyleTask extends Task {
032    
033            private File outputDir;
034            
035            private String fileName;
036            
037            private Collection fileSets = new ArrayList();
038            
039            private File style;
040            
041            /**
042             * Output directory.
043             * @param outputDir
044             */
045            public void setOutputDir(File outputDir) {
046                    this.outputDir = outputDir;
047            }
048            
049            /**
050             * XPath expression for file name. Use / for file separator.
051             * @param fileName
052             */
053            public void setFileName(String fileName) {
054                    this.fileName = fileName;
055            }
056            
057            public void addFileSet(FileSet fileSet) {
058                    fileSets.add(fileSet);
059            }
060            
061            public void setStyle(File style) {
062                    this.style = style;
063            }
064            
065            public void execute() throws BuildException {
066                    try {
067                            Iterator it=fileSets.iterator();
068                            while (it.hasNext()) {
069                                    FileSet fs=(FileSet) it.next();
070                                    DirectoryScanner ds = fs.getDirectoryScanner(getProject());
071                                    String[] files=ds.getIncludedFiles();
072                                    for (int i=0; i<files.length; i++) {
073                                            File in = new File(ds.getBasedir(), files[i]);
074                                            Document doc = DOMUtils.parse(in);
075                                            
076                                            String fn = DOMUtils.eval(doc.getDocumentElement(), fileName).toString().replace('/', File.separatorChar);
077                                            File out = new File(outputDir, fn);
078                                            
079                                            File parentDir = out.getParentFile();
080                                            if (!parentDir.exists()) {
081                                                    if (!parentDir.mkdirs()) {
082                                                            throw new BuildException("Could not create directory: "+parentDir.getAbsolutePath());
083                                                    }
084                                            }
085                                            
086                                            DOMUtils.style(doc, out, new FileInputStream(style), null);
087                                    }
088                            }
089                    } catch (Exception e) {
090                            throw new BuildException(e);
091                    }
092            }
093            
094    }