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