1 package net.sf.jstp;
2
3 import org.apache.tools.ant.Task;
4 import org.apache.tools.ant.Project;
5 import org.apache.tools.ant.BuildException;
6 import org.apache.tools.ant.DirectoryScanner;
7 import org.apache.tools.ant.types.*;
8
9 import java.io.*;
10 import java.util.Vector;
11
12
13 public class JstpAntTask extends Task
14 {
15 Vector filesets = new Vector();
16 File destDir = null;
17 String encoding = null;
18 boolean autopkg = true;
19
20 boolean forceOverwrite = false;
21 int verbosity = Project.MSG_INFO;
22 boolean failonerror = true;
23
24 public void setDestdir(File destDir)
25 {
26 this.destDir = destDir;
27 }
28 public void setOverwrite(boolean overwrite)
29 {
30 this.forceOverwrite = overwrite;
31 }
32 public void setVerbose(boolean verbose)
33 {
34 this.verbosity = verbose? Project.MSG_VERBOSE : Project.MSG_INFO;
35 }
36 public void setFailOnError(boolean failonerror)
37 {
38 this.failonerror = failonerror;
39 }
40 public void addFileset(FileSet set)
41 {
42 filesets.addElement(set);
43 }
44 public void setEncoding(String encoding)
45 {
46 this.encoding = encoding;
47 }
48 public void setAutoPackage(boolean autopkg)
49 {
50 this.autopkg = autopkg;
51 }
52
53 public void execute() throws BuildException
54 {
55
56 if (filesets.size() == 0)
57 throw new BuildException("No source files specified.");
58
59 int total = 0;
60 for (int i = 0; i < filesets.size(); i++)
61 {
62 FileSet fs = (FileSet) filesets.elementAt(i);
63 DirectoryScanner ds = null;
64 try
65 {
66 ds = fs.getDirectoryScanner(getProject());
67 File fromDir = fs.getDir(getProject());
68 String[] srcFiles = ds.getIncludedFiles();
69 for(int x=0; x<srcFiles.length; x++)
70 {
71 total += translate(fromDir, srcFiles[x]);
72 }
73 }
74 catch (Exception e)
75 {
76 if (failonerror)
77 throw (e instanceof BuildException)? ((BuildException)e) : new BuildException(e);
78 else
79 log(e.getMessage());
80 }
81 }
82 if(total>0 && verbosity>=Project.MSG_INFO)
83 log(""+total+" jstp "+(total==1?"file":"files")+" translated.");
84 }
85
86 int translate(File parentDir, String fileRelName) throws Exception
87 {
88 String fileName = fileRelName;
89 String relDir = null;
90
91 int x = fileRelName.lastIndexOf(File.separatorChar);
92 if(x!=-1)
93 {
94 relDir = fileRelName.substring(0, x);
95 fileName = fileRelName.substring(x+1);
96 }
97
98 String className = fileName;
99 int y = className.indexOf('.');
100 if(y!=-1)
101 className = className.substring(0, y);
102
103 String pkgName = null;
104 if(autopkg && relDir!=null)
105 pkgName = relDir.replace(File.separatorChar, '.');
106
107 File srcFile = new File(parentDir, fileRelName);
108
109 File desDir = destDir!=null? destDir : parentDir ;
110 if(relDir!=null)
111 desDir = new File(desDir, relDir);
112 desDir.mkdirs();
113 File desFile = new File(desDir, className+".java");
114
115 if(!forceOverwrite && desFile.exists() &&desFile.lastModified()>srcFile.lastModified())
116 return 0;
117
118 InputStream in = null;
119 OutputStream out = null;
120 try
121 {
122 in = new BufferedInputStream(new FileInputStream(srcFile));
123 out = new BufferedOutputStream(new FileOutputStream(desFile));
124 Reader reader = encoding==null? new InputStreamReader(in) : new InputStreamReader(in, encoding);
125 Writer writer = encoding==null? new OutputStreamWriter(out) : new OutputStreamWriter(out, encoding);
126
127 try
128 {
129 JstpTranslator.translate(pkgName, className, reader, writer);
130 }
131 catch (JstpParserException e)
132 {
133 throw new BuildException("error translating "+srcFile+" ("+e.row+":"+e.col+") "+e, e);
134 }
135
136 writer.flush();
137 if(verbosity>=Project.MSG_VERBOSE)
138 log("generated "+desFile.getPath());
139 return 1;
140 }
141 finally
142 {
143 if(out!=null) out.close();
144 if(in!=null) in.close();
145 }
146 }
147 }