1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package net.sf.oqt.maven;
17
18 import java.io.File;
19 import java.io.IOException;
20 import java.util.Collection;
21 import java.util.Locale;
22 import java.util.TreeSet;
23
24 import net.sf.oqt.core.Serializer;
25 import net.sf.oqt.model.EntityVO;
26 import net.sf.oqt.model.PackageVO;
27 import net.sf.oqt.model.QueryVO;
28 import net.sf.oqt.model.ResultVO;
29
30 import org.apache.maven.doxia.sink.Sink;
31 import org.apache.maven.doxia.sink.SinkEventAttributeSet;
32 import org.apache.maven.doxia.sink.SinkEventAttributes;
33 import org.apache.maven.doxia.siterenderer.Renderer;
34 import org.apache.maven.project.MavenProject;
35 import org.apache.maven.reporting.AbstractMavenReport;
36 import org.apache.maven.reporting.MavenReportException;
37
38
39
40
41
42
43
44
45
46
47 public class QueryTranslatorReportingMojo extends AbstractMavenReport {
48
49
50
51
52
53
54 protected MavenProject project;
55
56
57
58 private Renderer siteRenderer;
59
60
61
62
63
64 private File outputDirectory;
65
66
67
68
69 @Override
70 public String getDescription(final Locale arg0) {
71 return "The openJPA JPQL to SQL query translator report";
72 }
73
74
75
76
77 @Override
78 public String getName(final Locale arg0) {
79 return "Query Translator";
80 }
81
82
83
84
85 @Override
86 public String getOutputName() {
87 return "querytranslator";
88 }
89
90 void printOutputToDebug(final ResultVO result) {
91 if (getLog().isDebugEnabled()) {
92 final Collection<PackageVO> packages = result.getPackages();
93 for (final PackageVO packageVO : packages) {
94 getLog().debug("Package: " + packageVO.getName());
95 final Collection<EntityVO> entities = packageVO.getEntities();
96 for (final EntityVO entityVO : entities) {
97 getLog().debug(">Entity: " + entityVO.getName());
98 final Collection<QueryVO> queries = entityVO.getQueries();
99 for (final QueryVO queryVO : queries) {
100 getLog().debug(">>NamedQuery: " + queryVO.getName());
101 getLog().debug(">>> Number of SQL queries: " + queryVO.getSQLQuery().size());
102 }
103 }
104 }
105 }
106 }
107
108 private void addTitleLink(final String title, final Sink sink) {
109 final SinkEventAttributes attributes = new SinkEventAttributeSet();
110 attributes.addAttribute(SinkEventAttributes.HREF, "#" + title.replace(" ", "_"));
111 sink.link("#" + title.replace(" ", "_"), attributes);
112 sink.text(title);
113 sink.link_();
114 sink.lineBreak();
115 }
116
117
118
119
120 @Override
121 protected void executeReport(final Locale arg0) throws MavenReportException {
122 getLog().debug("Starting QueryTranslatorReportingMojo");
123 try {
124 final String titleEntitiesPerPackage = "Entities per packages";
125 final String titleNamesPerEntity = "List of NamedQueries per entity";
126 final String titleJPQLQueries = "List of JPQL queries";
127 final String titleSQLQueries = "List of SQL Queries";
128 final String titleFaults = "List of Faulty Queries";
129
130 final Serializer s = new Serializer(project);
131 final ResultVO result = s.deserialize();
132 if (result == null) {
133 getLog().warn("No result found on the output, make sure the translate goal was ran before the report goal");
134 return;
135 }
136 if (result.getPackages().isEmpty()) {
137 getLog().warn("No packages found in resulting output. Was the plugin correctly configured ? ");
138 }
139
140 final Collection<EntityVO> aggregatedEntities = new TreeSet<EntityVO>();
141 final Collection<QueryVO> aggregatedQueries = new TreeSet<QueryVO>();
142 printOutputToDebug(result);
143
144 getLog().info("Starting creation of report");
145 final Sink sink = getSink();
146 sink.head();
147 sink.title();
148 sink.text(getName(null));
149 sink.title_();
150 sink.head_();
151
152 sink.body();
153 sink.section1();
154 sink.sectionTitle1();
155 sink.text("Report");
156 sink.sectionTitle1_();
157
158 sink.paragraph();
159 addTitleLink(titleEntitiesPerPackage, sink);
160 addTitleLink(titleNamesPerEntity, sink);
161 addTitleLink(titleJPQLQueries, sink);
162 addTitleLink(titleSQLQueries, sink);
163 addTitleLink(titleFaults, sink);
164 sink.paragraph_();
165
166 sink.section2();
167 sink.sectionTitle2();
168 sink.text("Entities per packages");
169 sink.sectionTitle2_();
170 sink.table();
171 sink.tableRow();
172 sink.tableHeaderCell();
173 sink.text("Package");
174 sink.tableHeaderCell_();
175 sink.tableHeaderCell();
176 sink.text("Entities");
177 sink.tableHeaderCell_();
178 sink.tableRow_();
179 for (final PackageVO packge : result.getPackages()) {
180 sink.tableRow();
181 sink.tableCell();
182 sink.text(packge.getName());
183 sink.tableCell_();
184 sink.tableCell();
185 sink.list();
186 for (final EntityVO e : packge.getEntities()) {
187 aggregatedEntities.add(e);
188 sink.listItem();
189 sink.text(e.getName());
190 sink.listItem_();
191 }
192 sink.list_();
193 sink.tableCell_();
194 sink.tableRow_();
195 }
196
197 sink.table_();
198 sink.section2_();
199
200 sink.section2();
201 sink.sectionTitle2();
202 sink.text("List of NamedQueries per entity");
203 sink.sectionTitle2_();
204 sink.table();
205 sink.tableRow();
206 sink.tableHeaderCell();
207 sink.text("Entity");
208 sink.tableHeaderCell_();
209 sink.tableHeaderCell();
210 sink.text("Named Query");
211 sink.tableHeaderCell_();
212 sink.tableRow_();
213 for (final EntityVO entity : aggregatedEntities) {
214 sink.tableRow();
215 sink.tableCell();
216 sink.text(entity.getName());
217 sink.tableCell_();
218 sink.tableCell();
219 sink.list();
220 for (final QueryVO query : entity.getQueries()) {
221 aggregatedQueries.add(query);
222 sink.listItem();
223 sink.text(query.getName());
224 sink.listItem_();
225 }
226 sink.list_();
227 sink.tableCell_();
228 sink.tableRow_();
229 }
230
231 sink.table_();
232 sink.section2_();
233
234 sink.section2();
235 sink.sectionTitle2();
236 sink.text("List of JPQL queries");
237 sink.sectionTitle2_();
238 sink.table();
239 sink.tableRow();
240 sink.tableHeaderCell();
241 sink.text("Name");
242 sink.tableHeaderCell_();
243 sink.tableHeaderCell();
244 sink.text("JPQL Query");
245 sink.tableHeaderCell_();
246 sink.tableRow_();
247 for (final QueryVO query : aggregatedQueries) {
248 sink.tableRow();
249 sink.tableCell();
250 sink.text(query.getName());
251 sink.tableCell_();
252 sink.tableCell();
253 sink.text(query.getJPQLQuery());
254 sink.tableCell_();
255 sink.tableRow_();
256 }
257
258 sink.table_();
259 sink.section2_();
260
261 sink.section2();
262 sink.sectionTitle2();
263 sink.text("List of SQL Queries");
264 sink.sectionTitle2_();
265 sink.table();
266 sink.tableRow();
267 sink.tableHeaderCell();
268 sink.text("Name");
269 sink.tableHeaderCell_();
270 sink.tableHeaderCell();
271 sink.text("SQL Query");
272 sink.tableHeaderCell_();
273 sink.tableRow_();
274 for (final QueryVO query : aggregatedQueries) {
275 if (query.isValid()) {
276 sink.tableRow();
277 sink.tableCell();
278 sink.text(query.getName());
279 sink.tableCell_();
280 sink.tableCell();
281 sink.list();
282 for (final String sql : query.getSQLQuery()) {
283 sink.listItem();
284 sink.text(sql);
285 sink.listItem_();
286 }
287 sink.list_();
288 sink.tableCell_();
289 sink.tableRow_();
290 }
291 }
292
293 sink.table_();
294 sink.section2_();
295
296 sink.section2();
297 sink.sectionTitle2();
298 sink.text("List of Faulty Queries");
299 sink.sectionTitle2_();
300 sink.table();
301 sink.tableRow();
302 sink.tableHeaderCell();
303 sink.text("Name");
304 sink.tableHeaderCell_();
305 sink.tableHeaderCell();
306 sink.text("SQL Query");
307 sink.tableHeaderCell_();
308 sink.tableRow_();
309 for (final QueryVO query : aggregatedQueries) {
310 if (!query.isValid()) {
311 sink.tableRow();
312 sink.tableCell();
313 sink.text(query.getName());
314 sink.tableCell_();
315 sink.tableCell();
316 sink.text(query.getError());
317 sink.tableCell_();
318 sink.tableRow_();
319 }
320 }
321
322 sink.table_();
323 sink.section2_();
324
325 sink.section1_();
326
327 sink.body_();
328 sink.flush();
329 sink.close();
330 } catch (ClassNotFoundException e) {
331 getLog().error(e);
332 throw new MavenReportException(e.getMessage());
333 } catch (IOException e) {
334 getLog().error(e);
335 throw new MavenReportException(e.getMessage());
336 }
337 }
338
339
340
341
342 @Override
343 protected MavenProject getProject() {
344 return project;
345 }
346
347
348
349
350 @Override
351 protected Renderer getSiteRenderer() {
352 return siteRenderer;
353 }
354
355
356
357
358 @Override
359 protected String getOutputDirectory() {
360 return outputDirectory.getAbsolutePath();
361 }
362
363 }