1 package org.apache.torque.mojo;
2
3 /*
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
19 * under the License.
20 */
21
22 import java.io.File;
23
24 import org.apache.maven.plugin.MojoExecutionException;
25 import org.apache.tools.ant.DirectoryScanner;
26 import org.apache.tools.ant.types.FileSet;
27 import org.apache.torque.task.TorqueDataModelTask;
28
29 /**
30 * The base class for all mojos wrapping DataModelTasks.
31 *
32 * @author Raphael Pieroni (rafale_at_codehaus.org)
33 * @author <a href="fischer@seitenbau.de">Thomas Fischer</a>
34 */
35 public abstract class DataModelTaskMojo
36 extends TexenTaskMojo
37 {
38 /**
39 * The context property for the database.
40 */
41 public static final String TARGET_DATABASE_CONTEXT_PROPERTY
42 = "targetDatabase";
43
44 /**
45 * The path to the directory where the schema files are located in.
46 *
47 * @parameter expression="${basedir}/src/main/torque/schema"
48 * @required
49 */
50 private String schemaDir;
51
52 /**
53 * The schema files which should be included in generation
54 * (in ant-style notation).
55 *
56 * @parameter expression="*schema.xml"
57 * @required
58 */
59 private String schemaIncludes;
60
61 /**
62 * The schema files which should be excluded in generation
63 * (in ant-style notation).
64 */
65 private String schemaExcludes;
66
67 /**
68 * The database type (e.g. mysql, oracle, ...) for the generated persistence
69 * classes,
70 *
71 * @parameter
72 * @required
73 */
74 private String targetDatabase;
75
76 /**
77 * The target package for the generated classes.
78 *
79 * @parameter expression="torque.generated"
80 */
81 private String targetPackage;
82
83 /**
84 * The file containing the generation report, relative to
85 * <code>outputDir</code>.
86 *
87 * @required
88 */
89 private String reportFile;
90
91 /**
92 * Determines if this task should run only if the schema has changed.
93 *
94 * @parameter expression="true"
95 */
96 private boolean runOnlyOnSchemaChange;
97
98 /**
99 * The path to the properties file containing the mapping
100 * sql file -> target database.
101 *
102 * @parameter expression="${project.build.directory}/torque/sqldbmap.properties"
103 */
104 private String sqlDbMap;
105
106 /**
107 * Creates a new TorqueOMMojo object.
108 */
109 DataModelTaskMojo()
110 {
111 super(new TorqueDataModelTask());
112 }
113
114 /**
115 * Creates a new TorqueOMMojo object wrapping the passed
116 * TorqueDataModelTask.
117 *
118 * @param torqueDataModelTask the DataModelTask to be wrapped by this Mojo.
119 */
120 DataModelTaskMojo(TorqueDataModelTask torqueDataModelTask)
121 {
122 super(torqueDataModelTask);
123 }
124
125 /**
126 * Configures the Texen task which is wrapped by this mojo.
127 * In this implementation, the context properties, useClasspath,
128 * the output directory, the control template, the schema Fileset,
129 * the target package and the target database are set.
130 *
131 * @throws MojoExecutionException if an error occurs when setting the Tasks
132 * properties.
133 *
134 * @see TexenTaskMojo#configureTask()
135 */
136 protected void configureTask() throws MojoExecutionException
137 {
138 super.configureTask();
139
140 TorqueDataModelTask task
141 = (TorqueDataModelTask) super.getGeneratorTask();
142
143 task.setControlTemplate(getControlTemplate());
144
145 task.setOutputFile(reportFile);
146
147 task.setTargetDatabase(targetDatabase);
148
149 task.setTargetPackage(getTargetPackage());
150
151 if (sqlDbMap != null)
152 {
153 task.setSqlDbMap(sqlDbMap);
154 }
155
156 {
157 FileSet fileSet = new FileSet();
158 fileSet.setDir(new File(schemaDir));
159 fileSet.setIncludes(schemaIncludes);
160 fileSet.setExcludes(schemaExcludes);
161
162 task.addFileset(fileSet);
163 }
164 }
165
166 /**
167 * Returns whether the schema has changed. This is done by comparing
168 * the modification date of all schema files to the modification date
169 * of the report file.
170 *
171 * @return whether the schema has changed.
172 */
173 protected boolean schemaChanged()
174 {
175 boolean schemaChanged = true;
176 File report = new File(super.getOutputDir(), this.reportFile);
177 if (report.exists())
178 {
179 FileSet fileSet = new FileSet();
180 fileSet.setDir(new File(schemaDir));
181 fileSet.setIncludes(schemaIncludes);
182 fileSet.setExcludes(schemaExcludes);
183
184 DirectoryScanner directoryScanner
185 = fileSet.getDirectoryScanner(getAntProject());
186
187 String[] fileNames = directoryScanner.getIncludedFiles();
188
189 /* File schemaDirectory = new File(schemaDir);
190 FileFilter schemaFileFilter = new FileFilter() {
191 public boolean accept(File toCheck)
192 {
193 String path = toCheck.getAbsolutePath();
194 if (schemaExcludes != null
195 && !schemaExcludes.trim().equals("")
196 && Pattern.matches(schemaExcludes, path))
197 {
198 return false;
199 }
200 return Pattern.matches(schemaIncludes, path);
201 }
202 };
203 File[] schemaFiles = schemaDirectory.listFiles(schemaFileFilter);*/
204
205 // schema has changed if one of the schema files has a modification
206 // Date larger than the report.
207 schemaChanged = false;
208 for (int i = 0; i < fileNames.length; ++i)
209 {
210 File file = new File(fileNames[i]);
211 if (file.lastModified() > report.lastModified())
212 {
213 schemaChanged = true;
214 break;
215 }
216 }
217 }
218
219 return schemaChanged;
220 }
221
222 /**
223 * Returns the directory where the schema files are located.
224 *
225 * @return the the directory where the schema files are located.
226 */
227 public String getSchemaDir()
228 {
229 return schemaDir;
230 }
231
232 /**
233 * Sets the the directory where the schema files are located.
234 *
235 * @param schemaDir the directory where the schema files are located.
236 */
237 public void setSchemaDir(String schemaDir)
238 {
239 this.schemaDir = schemaDir;
240 }
241
242 /**
243 * Returns the target database (e.g. mysql, oracle, ... )
244 * for the generated files.
245 *
246 * @return the target database for the generated files.
247 */
248 public String getTargetDatabase()
249 {
250 return targetDatabase;
251 }
252
253 /**
254 * Sets the target database (e.g. mysql, oracle, ... )
255 * for the generated files.
256 *
257 * @param targetDatabase the target database for the generated files.
258 */
259 public void setTargetDatabase(String targetDatabase)
260 {
261 this.targetDatabase = targetDatabase;
262 }
263
264 /**
265 * Returns the target package for the generated classes.
266 *
267 * @return the target package for the generated classes.
268 */
269 public String getTargetPackage()
270 {
271 return targetPackage;
272 }
273
274 /**
275 * Sets the target package for the generated classes.
276 *
277 * param targetPackage the target package for the generated classes.
278 */
279 public void setTargetPackage(String targetPackage)
280 {
281 this.targetPackage = targetPackage;
282 }
283
284 /**
285 * Gets the path to the report file. The path is relative to
286 * <code>outputDir</code>.
287 *
288 * @return the path to the report file.
289 */
290 public String getReportFile()
291 {
292 return reportFile;
293 }
294
295 /**
296 * Sets the path to the report file. The path is relative to
297 * <code>outputDir</code>.
298 *
299 * @param reportFile the path to the report file.
300 */
301 public void setReportFile(String reportFile)
302 {
303 this.reportFile = reportFile;
304 }
305
306 /**
307 * Returns whether this mojo should be executed only if the schema has
308 * changed.
309 *
310 * @return true if the mojo only runs if the schema has changed,
311 * false otherwise.
312 */
313 public boolean isRunOnlyOnSchemaChange()
314 {
315 return runOnlyOnSchemaChange;
316 }
317
318 /**
319 * Sets whether this mojo should be executed only if the schema has
320 * changed.
321 *
322 * @param runOnlyOnSchemaChange whether the mojo only should run
323 * if the schema has changed.
324 */
325 public void setRunOnlyOnSchemaChange(boolean runOnlyOnSchemaChange)
326 {
327 this.runOnlyOnSchemaChange = runOnlyOnSchemaChange;
328 }
329
330 /**
331 * Runs the generation for the database layout defined in the schema.xml
332 * files.
333 *
334 * @throws MojoExecutionException If an error occurs during generation.
335 *
336 * @see TexenTaskMojo#execute()
337 * @see org.apache.maven.plugin.Mojo#execute()
338 */
339 public void execute() throws MojoExecutionException
340 {
341 if (!schemaChanged() && isRunOnlyOnSchemaChange())
342 {
343 getLog().info("Schema has not changed; skipping generation");
344 return;
345 }
346
347 super.execute();
348 }
349
350 /**
351 * Returns the schema files which are excluded from generation.
352 *
353 * @return the pattern for the excluded files.
354 */
355 public String getSchemaExcludes()
356 {
357 return schemaExcludes;
358 }
359
360 /**
361 * Sets the schema files which are excluded from generation.
362 *
363 * @param schemaExcludes the pattern for the excluded files.
364 */
365 public void setSchemaExcludes(String schemaExcludes)
366 {
367 this.schemaExcludes = schemaExcludes;
368 }
369
370 /**
371 * Returns the schema files which are included in generation.
372 *
373 * @return the pattern for the included files.
374 */
375 public String getSchemaIncludes()
376 {
377 return schemaIncludes;
378 }
379
380 /**
381 * Sets the schema files which are included in generation.
382 *
383 * @param schemaIncludes the pattern for the included files.
384 */
385 public void setSchemaIncludes(String schemaIncludes)
386 {
387 this.schemaIncludes = schemaIncludes;
388 }
389
390 /**
391 * Returns the path to the mapping SQL Files -> database.
392 *
393 * @return the path to the mapping SQL Files -> database.
394 */
395 public String getSqlDbMap()
396 {
397 return sqlDbMap;
398 }
399
400 /**
401 * Sets the path to the mapping SQL Files -> database.
402 *
403 * @param sqlDbMap the absolute path to the mapping SQL Files -> database.
404 */
405 public void setSqlDbMap(String sqlDbMap)
406 {
407 this.sqlDbMap = sqlDbMap;
408 }
409
410 /**
411 * Returns the path to the control template.
412 *
413 * @return the path to the control template.
414 */
415 protected abstract String getControlTemplate();
416 }