1
2
3
4
5
6
7 package org.asyrinx.joey.gen.task;
8
9 import java.io.BufferedReader;
10 import java.io.File;
11 import java.io.FileInputStream;
12 import java.io.FileNotFoundException;
13 import java.io.FileOutputStream;
14 import java.io.FileReader;
15 import java.io.IOException;
16 import java.io.InputStream;
17 import java.util.ArrayList;
18 import java.util.Iterator;
19 import java.util.List;
20 import java.util.Map;
21 import java.util.Properties;
22
23 import ognl.OgnlRuntime;
24
25 import org.apache.commons.io.CopyUtils;
26 import org.apache.commons.io.FileUtils;
27 import org.apache.tools.ant.BuildException;
28 import org.apache.tools.ant.DirectoryScanner;
29 import org.apache.tools.ant.Project;
30 import org.apache.tools.ant.types.FileSet;
31 import org.apache.velocity.VelocityContext;
32 import org.apache.velocity.context.Context;
33 import org.apache.velocity.texen.Generator;
34 import org.asyrinx.brownie.core.lang.StringUtils;
35 import org.asyrinx.joey.gen.hibernate.HibernateUtils;
36 import org.asyrinx.joey.gen.model.java.AppDomain;
37 import org.asyrinx.joey.gen.model.rdb.Databases;
38 import org.asyrinx.joey.gen.task.impl.S2ContainerLoader;
39 import org.seasar.framework.container.S2Container;
40 import org.xml.sax.SAXException;
41
42 /***
43 * @author takeshi
44 */
45 public class JoeyGenerateTask extends MultiTargetTexenTask {
46
47 private S2Container container = S2ContainerLoader.getContainer();
48
49 public Context initControlContext() {
50 if (filesets.isEmpty())
51 throw new BuildException("There's no schema file. You must specify fileset of schema files!");
52 try {
53 return loadModels();
54 } catch (Exception e) {
55 throw new BuildException(e);
56 }
57 }
58
59 private Generator generator = null;
60
61 protected Generator initGenerator() {
62 if (this.generator == null) {
63 final Object gen = container.getComponent(JoeyVelocityGenerator.class);
64 if (gen instanceof Generator)
65 this.generator = (Generator) gen;
66 else
67 throw new BuildException("JoeyVelocityGenerator object must extends " + Generator.class.getName());
68 }
69 return this.generator;
70 }
71
72 private SchemaBackup schemaBackup = new SchemaBackup();
73
74
75
76 private Context loadModels() throws IOException, SAXException {
77 final ModelLoader modelLoader = (ModelLoader) container.getComponent(ModelLoader.class);
78 final Databases databases = modelLoader.loadDatabaseModels(filesets, this.project);
79 final AppDomain domain = modelLoader.loadAppDomainModel(databases, this.project);
80 final Map rdb2Java = modelLoader.getRdb2Java();
81
82 schemaBackup.execute(this.project, filesets, lastSchemaDir);
83
84 final Context context = new VelocityContext();
85 context.put("databases", databases);
86 context.put("domain", domain);
87 context.put("rdb2java", rdb2Java);
88 context.put("helper", new VelocityHelper(context));
89 context.put("ognl", new VelocityOgnlHelper(context));
90 context.put("stringUtils", new org.asyrinx.brownie.core.lang.StringUtils());
91 context.put("hibernateUtils", new HibernateUtils());
92 OgnlRuntime.setPropertyAccessor(Map.class, new VelocityOgnlAccessor(context));
93 return context;
94 }
95
96 private List loadTargetFile() {
97 final List result = new ArrayList();
98 try {
99 final BufferedReader reader = new BufferedReader(new FileReader(getTargetTextFile()));
100 for (String line = reader.readLine(); line != null; line = reader.readLine()) {
101 line = line.trim();
102 if (StringUtils.isEmpty(line))
103 continue;
104 if (line.startsWith("#"))
105 continue;
106 if (result.contains(line))
107 continue;
108 log.debug(getTargetTextFile() + " target: " + line);
109 result.add(line);
110 }
111 } catch (IOException e) {
112 throw new BuildException(e);
113 }
114 return result;
115 }
116
117 protected List initTargets() {
118 final Properties properties = getDefaultProperties();
119 final List source = loadTargetFile();
120 final List result = new ArrayList();
121 for (Iterator i = source.iterator(); i.hasNext();) {
122 final String line = (String) i.next();
123 final String controlKey = "joey-gen.template.control." + line;
124 final String destKey = "joey-gen.template.dest." + line;
125 final String controlTemplate = String.valueOf(properties.getProperty(controlKey));
126 final String targetStr = String.valueOf(properties.getProperty(destKey));
127 final String destDir = getDestDir(targetStr);
128 final JoeyGenerateTarget target = new JoeyGenerateTarget(line, destDir, controlTemplate);
129 result.add(target);
130 }
131 return result;
132 }
133
134 private Properties getDefaultProperties() {
135 final Properties properties = new Properties();
136 final InputStream stream = this.getClass().getResourceAsStream("default.properties");
137 try {
138 properties.load(stream);
139 } catch (IOException e) {
140 throw new BuildException(e);
141 }
142 return properties;
143 }
144
145 private String getDestDir(String targetStr) {
146 if (targetStr == null)
147 return getJavaSrcDir();
148 if ("javasrc".equals(targetStr))
149 return getJavaSrcDir();
150 if ("testsrc".equals(targetStr))
151 return getTestSrcDir();
152 if ("proj".equals(targetStr))
153 return getProjDir();
154 if ("webapp".equals(targetStr))
155 return getWebappDir();
156 throw new BuildException("Illegal targetStr '" + targetStr + "'");
157 }
158
159 protected List filesets = new ArrayList();
160
161 public void addFileset(FileSet set) {
162 filesets.add(set);
163 }
164
165 public void setContextProperties(String file) {
166 super.setContextProperties(file);
167 final Map env = super.getProject().getProperties();
168 for (Iterator i = env.keySet().iterator(); i.hasNext();) {
169 final String key = (String) i.next();
170 if (key.startsWith("joey-gen.")) {
171 String newKey = toVelocityKey(key.substring("joey-gen.".length()));
172 contextProperties.setProperty(newKey, env.get(key));
173 log.debug("joey-gen property available: " + newKey + ":" + env.get(key));
174 }
175 }
176 for (Iterator i = env.keySet().iterator(); i.hasNext();) {
177 final String key = (String) i.next();
178 if (key.startsWith("proj.")) {
179 String newKey = toVelocityKey(key);
180 contextProperties.setProperty(newKey, env.get(key));
181 log.debug("project property available: " + newKey + ":" + env.get(key));
182 }
183 }
184 }
185
186 private String toVelocityKey(String newKey) {
187 int j = newKey.indexOf(".");
188 while (j != -1) {
189 newKey = newKey.substring(0, j) + StringUtils.capitalize(newKey.substring(j + 1));
190 j = newKey.indexOf(".");
191 }
192 return newKey;
193 }
194
195 private String targetTextFile = null;
196
197 public String getTargetTextFile() {
198 return targetTextFile;
199 }
200
201 public void setTargetTextFile(File targetTextFile) {
202 try {
203 this.targetTextFile = targetTextFile.getCanonicalPath();
204 } catch (IOException e) {
205 throw new BuildException(e);
206 }
207 }
208
209 private String projDir = null;
210
211 private String javaSrcDir = null;
212
213 private String testSrcDir = null;
214
215 private String webappDir = null;
216
217 public String getJavaSrcDir() {
218 return javaSrcDir;
219 }
220
221 public String getProjDir() {
222 return projDir;
223 }
224
225 public String getTestSrcDir() {
226 return testSrcDir;
227 }
228
229 public String getWebappDir() {
230 return webappDir;
231 }
232
233 public void setJavaSrcDir(File javaSrcDir) {
234 try {
235 this.javaSrcDir = javaSrcDir.getCanonicalPath();
236 } catch (IOException e) {
237 throw new BuildException(e);
238 }
239 }
240
241 public void setProjDir(File projDir) {
242 try {
243 this.projDir = projDir.getCanonicalPath();
244 } catch (IOException e) {
245 throw new BuildException(e);
246 }
247 }
248
249 public void setTestSrcDir(File testSrcDir) {
250 try {
251 this.testSrcDir = testSrcDir.getCanonicalPath();
252 } catch (IOException e) {
253 throw new BuildException(e);
254 }
255 }
256
257 public void setWebappDir(File webappDir) {
258 try {
259 this.webappDir = webappDir.getCanonicalPath();
260 } catch (IOException e) {
261 throw new BuildException(e);
262 }
263 }
264
265 private File lastSchemaDir = null;
266
267 public File getLastSchemaDir() {
268 return lastSchemaDir;
269 }
270
271 public void setLastSchemaDir(File lastSchemaDir) {
272 this.lastSchemaDir = lastSchemaDir;
273 }
274 }
275
276 class SchemaBackup {
277
278 public void execute(Project project, List sourceFileSets, File destDir) throws IOException {
279 if (destDir.exists()) {
280 FileUtils.cleanDirectory(destDir);
281 } else {
282 destDir.mkdirs();
283 }
284 copySchemaFiles(project, sourceFileSets, destDir);
285 }
286
287 /***
288 * @param project
289 * @param sourceFileSets
290 * @param destDir
291 * @throws IOException
292 * @throws FileNotFoundException
293 */
294 private void copySchemaFiles(Project project, List sourceFileSets, File destDir) throws IOException,
295 FileNotFoundException {
296 for (int i = 0; i < sourceFileSets.size(); i++) {
297 final FileSet fs = (FileSet) sourceFileSets.get(i);
298 final File dir = fs.getDir(project);
299 final DirectoryScanner ds = fs.getDirectoryScanner(project);
300 final String[] filenNmes = ds.getIncludedFiles();
301 for (int j = 0; j < filenNmes.length; j++) {
302 final File src = new File(dir, filenNmes[j]);
303 final File dest = new File(destDir, filenNmes[j]);
304 CopyUtils.copy(new FileInputStream(src), new FileOutputStream(dest));
305 }
306 }
307 }
308
309 }