1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  package org.apache.maven.plugins.invoker;
20  
21  import java.util.List;
22  import java.util.Locale;
23  
24  import org.apache.maven.doxia.sink.Sink;
25  import org.apache.maven.plugin.logging.Log;
26  import org.apache.maven.plugins.invoker.model.BuildJob;
27  import org.apache.maven.reporting.AbstractMavenReportRenderer;
28  import org.codehaus.plexus.i18n.I18N;
29  
30  public class InvokerReportRenderer extends AbstractMavenReportRenderer {
31      private final I18N i18n;
32      private final Locale locale;
33      private final Log log;
34      private final List<BuildJob> buildJobs;
35  
36      public InvokerReportRenderer(Sink sink, I18N i18n, Locale locale, Log log, List<BuildJob> buildJobs) {
37          super(sink);
38          this.i18n = i18n;
39          this.locale = locale;
40          this.log = log;
41          this.buildJobs = buildJobs;
42      }
43  
44      @Override
45      public String getTitle() {
46          return getI18nString("title");
47      }
48  
49      
50  
51  
52  
53      private String getI18nString(String key) {
54          return i18n.getString("invoker-report", locale, "report.invoker." + key);
55      }
56  
57      
58  
59  
60  
61  
62      private String formatI18nString(String key, Object... args) {
63          return i18n.format("invoker-report", locale, "report.invoker." + key, args);
64      }
65  
66      @Override
67      protected void renderBody() {
68          startSection(getTitle());
69          paragraph(getI18nString("description"));
70  
71          renderSectionSummary();
72  
73          renderSectionDetails();
74  
75          endSection();
76      }
77  
78      private void renderSectionSummary() {
79          startSection(getI18nString("summary.title"));
80  
81          startTable();
82  
83          tableHeader(new String[] {
84              getI18nString("summary.builds"),
85              getI18nString("summary.success"),
86              getI18nString("summary.failures"),
87              getI18nString("summary.skipped"),
88              getI18nString("summary.successrate"),
89              getI18nString("summary.time")
90          });
91  
92          int totalBuilds = buildJobs.size();
93          int totalSuccess = 0;
94          int totalFailures = 0;
95          int totalSkipped = 0;
96          float totalTime = 0.0f;
97  
98          for (BuildJob buildJob : buildJobs) {
99              switch (buildJob.getResult()) {
100                 case BuildJob.Result.SUCCESS:
101                     totalSuccess++;
102                     break;
103                 case BuildJob.Result.SKIPPED:
104                     totalSkipped++;
105                     break;
106                 default:
107                     totalFailures++;
108             }
109             totalTime += buildJob.getTime();
110         }
111 
112         tableRow(new String[] {
113             Integer.toString(totalBuilds),
114             Integer.toString(totalSuccess),
115             Integer.toString(totalFailures),
116             Integer.toString(totalSkipped),
117             (totalSuccess + totalFailures > 0)
118                     ? formatI18nString("value.successrate", (totalSuccess / (float) (totalSuccess + totalFailures)))
119                     : "",
120             formatI18nString("value.time", totalTime)
121         });
122 
123         endTable();
124 
125         endSection();
126     }
127 
128     private void renderSectionDetails() {
129         startSection(getI18nString("detail.title"));
130 
131         startTable();
132 
133         tableHeader(new String[] {
134             getI18nString("detail.name"),
135             getI18nString("detail.result"),
136             getI18nString("detail.time"),
137             getI18nString("detail.message")
138         });
139 
140         for (BuildJob buildJob : buildJobs) {
141             renderBuildJob(buildJob);
142         }
143 
144         endTable();
145 
146         endSection();
147     }
148 
149     private void renderBuildJob(BuildJob buildJob) {
150         tableRow(new String[] {
151             getBuildJobReportName(buildJob),
152             
153             buildJob.getResult(),
154             formatI18nString("value.time", buildJob.getTime()),
155             buildJob.getFailureMessage()
156         });
157     }
158 
159     private String getBuildJobReportName(BuildJob buildJob) {
160         String buildJobName = buildJob.getName();
161         String buildJobDescription = buildJob.getDescription();
162         boolean emptyJobName = buildJobName == null || buildJobName.isEmpty();
163         boolean emptyJobDescription = buildJobDescription == null || buildJobDescription.isEmpty();
164         boolean isReportJobNameComplete = !emptyJobName && !emptyJobDescription;
165         if (isReportJobNameComplete) {
166             return formatI18nString("text.name_with_description", buildJobName, buildJobDescription);
167         } else {
168             String buildJobProject = buildJob.getProject();
169             if (!emptyJobName) {
170                 log.warn(incompleteNameWarning("description", buildJobProject));
171             } else if (!emptyJobDescription) {
172                 log.warn(incompleteNameWarning("name", buildJobProject));
173             }
174             return buildJobProject;
175         }
176     }
177 
178     private static String incompleteNameWarning(String missing, String pom) {
179         return "Incomplete job name-description: " + missing + " is missing. POM (" + pom
180                 + ") will be used in place of job name!";
181     }
182 }