KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > ch > paranor > epla > structure > JETCTask


1 package ch.paranor.epla.structure;
2
3 import java.io.BufferedOutputStream JavaDoc;
4 import java.io.File JavaDoc;
5 import java.io.FileNotFoundException JavaDoc;
6 import java.io.FileOutputStream JavaDoc;
7 import java.io.OutputStream JavaDoc;
8 import java.net.MalformedURLException JavaDoc;
9 import java.util.ArrayList JavaDoc;
10 import java.util.HashMap JavaDoc;
11 import java.util.Iterator JavaDoc;
12 import java.util.List JavaDoc;
13
14 import org.apache.tools.ant.BuildException;
15 import org.apache.tools.ant.DirectoryScanner;
16 import org.apache.tools.ant.Project;
17 import org.apache.tools.ant.Task;
18 import org.apache.tools.ant.types.FileSet;
19 import org.eclipse.emf.codegen.jet.JETCompiler;
20 import org.eclipse.emf.codegen.jet.JETException;
21 import org.eclipse.emf.codegen.jet.JETSkeleton;
22
23 /**
24  * This task compiles JET templates into Java source files using the EMF JET framework.
25  */

26 public class JETCTask extends Task {
27
28     private File JavaDoc destDir;
29
30     private List JavaDoc filesets = new ArrayList JavaDoc();
31     private List JavaDoc templateFiles = new ArrayList JavaDoc();
32
33     private File JavaDoc templateFile;
34     private String JavaDoc packageName;
35     private String JavaDoc className;
36
37     public void execute() throws BuildException {
38         preCheck();
39
40         // check that filename ends in 'jet'?
41
if (templateFile != null) {
42             templateFiles.add(templateFile);
43         }
44         for (Iterator JavaDoc i = filesets.iterator(); i.hasNext();) {
45             FileSet fs = (FileSet) i.next();
46             DirectoryScanner ds = fs.getDirectoryScanner(getProject());
47             File JavaDoc fromDir = fs.getDir(getProject());
48
49             String JavaDoc[] includedFiles = ds.getIncludedFiles();
50             for (int j = 0; j < includedFiles.length; j++) {
51                 templateFiles.add(project.resolveFile(includedFiles[j]));
52             }
53         }
54
55         try {
56             compileJETTemplates();
57         } catch (Exception JavaDoc e) {
58             throw new BuildException(e, location);
59         }
60     }
61
62     public void setDestdir(File JavaDoc destDir) {
63         this.destDir = destDir;
64     }
65
66     public void setTemplate(File JavaDoc templateFile) {
67         this.templateFile = templateFile;
68     }
69
70     public void setPackage(String JavaDoc packageName) {
71         this.packageName = packageName;
72     }
73
74     public void setClass(String JavaDoc className) {
75         this.className = className;
76     }
77
78     public void addFileset(FileSet fileset) {
79         filesets.add(fileset);
80     }
81
82     private void preCheck() throws BuildException {
83         assertTrue(destDir != null, "No destination directory specified");
84         assertTrue(
85             destDir.isDirectory(),
86             "Specified destination directory does not exist: " + destDir);
87         assertTrue(
88             templateFile != null || filesets.size() > 0,
89             "No template files specified");
90         if (templateFile != null) {
91             assertTrue(
92                 templateFile.isFile(),
93                 "Specified template does not exist: " + templateFile);
94         } else {
95             assertTrue(
96                 className == null && packageName == null,
97                 "Attributes \"class\" and \"package\" can only be used together with attribute \"template\"");
98         }
99     }
100
101     private void compileJETTemplates()
102         throws MalformedURLException JavaDoc, JETException, FileNotFoundException JavaDoc {
103         log(
104             "Compiling "
105                 + templateFiles.size()
106                 + " JET template(s) to "
107                 + destDir);
108         for (Iterator JavaDoc i = templateFiles.iterator(); i.hasNext();) {
109             File JavaDoc template = (File JavaDoc) i.next();
110             compileJETTemplate(template, destDir);
111         }
112     }
113
114     private File JavaDoc compileJETTemplate(File JavaDoc template, File JavaDoc outputDir)
115         throws JETException, FileNotFoundException JavaDoc, MalformedURLException JavaDoc {
116         String JavaDoc templateURI = template.getAbsoluteFile().toURL().toString();
117         JETCompiler jetCompiler = new JETCompiler(templateURI);
118         log("Parsing template " + template, Project.MSG_VERBOSE);
119         jetCompiler.parse();
120
121         // initialize skeleton
122
JETSkeleton skeleton = jetCompiler.getSkeleton();
123         if (skeleton == null) {
124             log("JET directive missing in " + templateFile, Project.MSG_WARN);
125             jetCompiler.handleDirective("jet", null, null, new HashMap JavaDoc());
126             skeleton = jetCompiler.getSkeleton();
127         }
128         if (className != null) {
129             skeleton.setClassName(className);
130         }
131         if (packageName != null) {
132             skeleton.setPackageName(packageName);
133         }
134
135         File JavaDoc packageDir =
136             new File JavaDoc(outputDir, skeleton.getPackageName().replace('.', '/'));
137         packageDir.mkdirs();
138         File JavaDoc targetFile =
139             new File JavaDoc(packageDir, skeleton.getClassName() + ".java");
140
141         OutputStream JavaDoc output =
142             new BufferedOutputStream JavaDoc(new FileOutputStream JavaDoc(targetFile));
143         log("Generating java source " + targetFile, Project.MSG_VERBOSE);
144         jetCompiler.generate(output);
145         return targetFile;
146     }
147
148     private void assertTrue(boolean expr, String JavaDoc message)
149         throws BuildException {
150         if (!expr) {
151             throw new BuildException(message, location);
152         }
153     }
154
155 }
156
Popular Tags