View Javadoc
1   /*******************************************************************************
2    * Copyright 2012 pw999
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *   http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
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   * The QueryTranslatorReportingMojo creates the report from the output generated
41   * by the {@link QueryTranslatorReportingMojo}
42   * 
43   * @goal report
44   * @execute goal="translate"
45   * @phase site
46   */
47  public class QueryTranslatorReportingMojo extends AbstractMavenReport {
48  
49      /**
50       * @parameter expression="${project}"
51       * @required
52       * @readonly
53       */
54      protected MavenProject project;
55      /**
56       * @component
57       */
58      private Renderer siteRenderer;
59      
60      /**
61       * The output directory of the report.
62       * @parameter default-value="${project.reporting.outputDirectory}/"
63       */
64      private File outputDirectory;
65  
66      /**
67       * {@inheritDoc}
68       */
69      @Override
70      public String getDescription(final Locale arg0) {
71          return "The openJPA JPQL to SQL query translator report";
72      }
73  
74      /**
75       * {@inheritDoc}
76       */
77      @Override
78      public String getName(final Locale arg0) {
79          return "Query Translator";
80      }
81  
82      /**
83       * {@inheritDoc}
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      * Generates the report based on the output of the translat mojo.
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      * {@inheritDoc}
341      */
342     @Override
343     protected MavenProject getProject() {
344         return project;
345     }
346 
347     /**
348      * {@inheritDoc}
349      */
350     @Override
351     protected Renderer getSiteRenderer() {
352         return siteRenderer;
353     }
354 
355     /**
356      * {@inheritDoc}
357      */
358     @Override
359     protected String getOutputDirectory() {
360         return outputDirectory.getAbsolutePath();
361     }
362 
363 }