1 package com.wakaleo.schemaspy;
2
3 import net.sourceforge.schemaspy.Config;
4 import net.sourceforge.schemaspy.SchemaAnalyzer;
5 import org.apache.maven.doxia.siterenderer.Renderer;
6 import org.apache.maven.plugins.annotations.Component;
7 import org.apache.maven.plugins.annotations.LifecyclePhase;
8 import org.apache.maven.plugins.annotations.Mojo;
9 import org.apache.maven.plugins.annotations.Parameter;
10 import org.apache.maven.project.MavenProject;
11 import org.apache.maven.reporting.AbstractMavenReport;
12 import org.apache.maven.reporting.MavenReportException;
13
14 import java.io.File;
15 import java.util.ArrayList;
16 import java.util.List;
17 import java.util.Locale;
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 @Mojo(name = "schemaspy", defaultPhase = LifecyclePhase.SITE)
38 public class SchemaSpyReport extends AbstractMavenReport {
39
40
41
42
43
44 @Parameter(property = "targetDirectory", defaultValue = "${project.build.directory}")
45 private File targetDirectory;
46
47
48
49
50
51
52
53
54 @Parameter(property = "outputDirectory", defaultValue = "${project.build.directory}/site")
55 private String outputDirectory;
56
57
58
59
60 @Component
61 private Renderer siteRenderer;
62
63
64
65
66 @Parameter(defaultValue = "${project}", readonly = true, required = true)
67 private MavenProject project;
68
69
70
71
72
73 @Parameter (property = "database", required = true)
74 private String database;
75
76
77
78
79 @Parameter(property = "host")
80 private String host;
81
82
83
84
85 @Parameter(property = "port")
86 private String port;
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106 @Parameter (property = "databaseType")
107 private String databaseType;
108
109
110
111
112 @Parameter(property = "user")
113 private String user;
114
115
116
117
118 @Parameter(property = "schema")
119 private String schema;
120
121
122
123
124 @Parameter(property = "password")
125 private String password;
126
127
128
129
130
131
132 @Parameter(property = "pathToDrivers")
133 private String pathToDrivers;
134
135
136
137
138
139
140
141 @Parameter(property = "schemaDescription")
142 private String schemaDescription;
143
144
145
146
147
148
149
150
151 @Parameter(property = "includeTableNamesRegex")
152 private String includeTableNamesRegex;
153
154
155
156
157
158
159
160
161
162 @Parameter(property = "excludeColumnNamesRegex")
163 private String excludeColumnNamesRegex;
164
165
166
167
168
169
170 @Parameter(property = "allowHtmlInComments")
171 private Boolean allowHtmlInComments;
172
173
174
175
176
177
178
179 @Deprecated
180 @Parameter(property = "commentsInitiallyDisplayed")
181 private Boolean commentsInitiallyDisplayed;
182
183
184
185
186
187 @Parameter(property = "noImplied")
188 private Boolean noImplied;
189
190
191
192
193
194 @Parameter(property = "noHtml")
195 private Boolean noHtml;
196
197
198
199
200 @Parameter(property = "logLevel")
201 private String logLevel;
202
203
204
205
206
207
208
209
210
211
212 @Parameter(property = "useDriverManager")
213 private Boolean useDriverManager;
214
215
216
217
218
219 @Parameter(property = "cssStylesheet")
220 private String cssStylesheet;
221
222
223
224
225
226 @Parameter(property = "singleSignOn")
227 private Boolean singleSignOn;
228
229
230
231
232
233
234
235 @Parameter(property = "lowQuality")
236 private Boolean lowQuality;
237
238
239
240
241
242
243
244 @Parameter(property = "highQuality")
245 private Boolean highQuality;
246
247
248
249
250
251
252 @Parameter(property = "showAllSchemas")
253 private Boolean showAllSchemas;
254
255
256
257
258
259
260
261 @Parameter(property = "schemas")
262 private String schemas;
263
264
265
266
267 @Parameter(property = "noSchema")
268 private Boolean noSchema;
269
270
271
272
273 @Parameter(property = "noRows")
274 private Boolean noRows;
275
276
277
278
279 @Parameter(property = "noViews")
280 private Boolean noViews;
281
282
283
284
285
286
287
288
289 @Parameter(property = "connprops")
290 private String connprops;
291
292
293
294
295
296
297 @Deprecated
298 @Parameter(property = "noAds", defaultValue = "true")
299 private Boolean noAds;
300
301
302
303
304
305
306 @Deprecated
307 @Parameter(property = "noLogo", defaultValue = "true")
308 private Boolean noLogo;
309
310
311
312
313
314
315 @Parameter(property = "runOnExecutionRoot", defaultValue = "false")
316 protected boolean runOnExecutionRoot = false;
317
318
319
320
321
322 SchemaAnalyzer analyzer = new SchemaAnalyzer();
323
324 protected void setSchemaAnalyzer(final SchemaAnalyzer analyzer) {
325 this.analyzer = analyzer;
326 }
327
328
329
330
331
332
333
334
335 private void addToArguments(
336 final List<String> argList, final String parameter, final Boolean value) {
337 if (value != null && value) {
338 argList.add(parameter + "=" + value);
339 }
340 }
341
342
343
344
345
346
347
348
349 private void addFlagToArguments(
350 final List<String> argList, final String parameter, final Boolean value) {
351 if (value != null && value) {
352 argList.add(parameter);
353 }
354 }
355
356
357
358
359
360
361
362
363
364
365
366 private void addToArguments(final List<String> argList,
367 final String parameter, final String value) {
368 if (value != null) {
369 argList.add(parameter + "=" + value);
370 }
371 }
372
373
374
375
376
377
378
379
380
381 @Override
382 protected void executeReport(final Locale locale) throws MavenReportException {
383
384
385
386
387
388 if (targetDirectory == null) {
389 targetDirectory = new File("target");
390 }
391
392 targetDirectory.mkdirs();
393 File siteDir = new File(targetDirectory, "site");
394 siteDir.mkdirs();
395 File outputDir = null;
396 if (outputDirectory == null) {
397 outputDir = new File(siteDir, "schemaspy");
398 outputDir.mkdirs();
399 outputDirectory = outputDir.getAbsolutePath();
400 } else {
401 outputDir = new File(new File(outputDirectory), "schemaspy");
402 outputDir.mkdirs();
403 }
404 String schemaSpyDirectory = outputDir.getAbsolutePath();
405 List<String> argList = new ArrayList<>();
406
407
408
409
410 addToArguments(argList, "-dp", pathToDrivers);
411 addToArguments(argList, "-db", database);
412 addToArguments(argList, "-host", host);
413 addToArguments(argList, "-port", port);
414 addToArguments(argList, "-t", databaseType);
415 addToArguments(argList, "-u", user);
416 addToArguments(argList, "-p", password);
417 addToArguments(argList, "-s", schema);
418 addToArguments(argList, "-o", schemaSpyDirectory);
419 addToArguments(argList, "-desc", schemaDescription);
420 addToArguments(argList, "-i", includeTableNamesRegex);
421 addToArguments(argList, "-x", excludeColumnNamesRegex);
422 addFlagToArguments(argList, "-ahic", allowHtmlInComments);
423 addFlagToArguments(argList, "-noimplied", noImplied);
424 addFlagToArguments(argList, "-nohtml", noHtml);
425 addToArguments(argList, "-loglevel", logLevel);
426 addFlagToArguments(argList, "-norows", noRows);
427 addFlagToArguments(argList, "-noviews", noViews);
428 addFlagToArguments(argList, "-noschema", noSchema);
429 addFlagToArguments(argList, "-all", showAllSchemas);
430 addToArguments(argList, "-schemas", schemas);
431
432 addToArguments(argList, "-useDriverManager", useDriverManager);
433 addToArguments(argList, "-css", cssStylesheet);
434 addFlagToArguments(argList, "-sso", singleSignOn);
435 addFlagToArguments(argList, "-lq", lowQuality);
436 addFlagToArguments(argList, "-hq", highQuality);
437 addToArguments(argList, "-connprops", connprops);
438 addFlagToArguments(argList, "-cid", commentsInitiallyDisplayed);
439 addFlagToArguments(argList, "-noads", noAds);
440 addFlagToArguments(argList, "-nologo", noLogo);
441
442
443 String[] args = argList.toArray(new String[0]);
444 getLog().info("Generating SchemaSpy report with parameters:");
445 for (String arg : args) {
446 getLog().info(arg);
447 }
448 try {
449 analyzer.analyze(new Config(args));
450 } catch (Exception e) {
451 throw new MavenReportException(e.getMessage(), e);
452 }
453 }
454
455 @Override
456 public boolean canGenerateReport() {
457 return !runOnExecutionRoot || project.isExecutionRoot();
458 }
459
460 @Override
461 protected String getOutputDirectory() {
462 return outputDirectory;
463 }
464
465 @Override
466 protected MavenProject getProject() {
467 return project;
468 }
469
470 @Override
471 protected Renderer getSiteRenderer() {
472 return siteRenderer;
473 }
474
475 @Override
476 public String getDescription(final Locale locale) {
477 return "SchemaSpy database documentation";
478 }
479
480 @Override
481 public String getName(final Locale locale) {
482 return "SchemaSpy";
483 }
484
485 @Override
486 public String getOutputName() {
487 return "schemaspy/index";
488 }
489
490
491
492
493
494
495
496 @Override
497 public boolean isExternalReport() {
498 return true;
499 }
500 }