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