1 package org.apache.maven.plugins.site.render;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.File;
23 import java.io.IOException;
24 import java.util.ArrayList;
25 import java.util.Collections;
26 import java.util.List;
27 import java.util.Locale;
28 import java.util.Map;
29 import java.util.TreeMap;
30
31 import org.apache.maven.doxia.siterenderer.DocumentRenderer;
32 import org.apache.maven.doxia.siterenderer.DoxiaDocumentRenderer;
33 import org.apache.maven.doxia.siterenderer.RendererException;
34 import org.apache.maven.doxia.siterenderer.SiteRenderingContext;
35 import org.apache.maven.execution.MavenSession;
36 import org.apache.maven.plugin.MojoExecutionException;
37 import org.apache.maven.plugin.MojoFailureException;
38 import org.apache.maven.plugins.annotations.Mojo;
39 import org.apache.maven.plugins.annotations.Parameter;
40 import org.apache.maven.plugins.annotations.ResolutionScope;
41 import org.apache.maven.project.MavenProject;
42 import org.apache.maven.reporting.MavenReport;
43 import org.apache.maven.reporting.MavenReportException;
44 import org.apache.maven.reporting.exec.MavenReportExecution;
45 import org.apache.maven.shared.utils.logging.MessageBuilder;
46
47 import static org.apache.maven.shared.utils.logging.MessageUtils.buffer;
48
49
50
51
52
53
54
55
56
57
58
59
60 @Mojo( name = "site", requiresDependencyResolution = ResolutionScope.TEST, requiresReports = true )
61 public class SiteMojo
62 extends AbstractSiteRenderingMojo
63 {
64
65
66
67 @Parameter( property = "siteOutputDirectory", defaultValue = "${project.reporting.outputDirectory}" )
68 protected File outputDirectory;
69
70
71
72
73 @Parameter( property = "generateReports", defaultValue = "true" )
74 private boolean generateReports;
75
76
77
78
79
80
81 @Parameter( property = "generateSitemap", defaultValue = "false" )
82 private boolean generateSitemap;
83
84
85
86
87
88
89
90 @Parameter( property = "validate", defaultValue = "false" )
91 private boolean validate;
92
93
94
95
96 public void execute()
97 throws MojoExecutionException, MojoFailureException
98 {
99 if ( skip )
100 {
101 getLog().info( "maven.site.skip = true: Skipping site generation" );
102 return;
103 }
104
105 if ( getLog().isDebugEnabled() )
106 {
107 getLog().debug( "executing Site Mojo" );
108 }
109
110 checkInputEncoding();
111
112 List<MavenReportExecution> reports;
113 if ( generateReports )
114 {
115 reports = getReports();
116 }
117 else
118 {
119 reports = Collections.emptyList();
120 }
121
122 try
123 {
124 List<Locale> localesList = getLocales();
125
126
127 Locale defaultLocale = localesList.get( 0 );
128 Locale.setDefault( defaultLocale );
129
130 for ( Locale locale : localesList )
131 {
132 if ( locale == defaultLocale )
133 {
134 getLog().info( buffer().strong( "Rendering site with default locale " + locale.getDisplayName()
135 + " (" + locale + ")" ).toString() );
136 }
137 else
138 {
139 getLog().info( "" );
140 getLog().info( buffer().strong( "Rendering localized site for " + locale.getDisplayName() + " ("
141 + locale + ")" ).toString() );
142 }
143 renderLocale( locale, reports );
144 }
145 }
146 catch ( RendererException e )
147 {
148 if ( e.getCause() instanceof MavenReportException )
149 {
150
151 throw new MojoExecutionException( e.getMessage(), e.getCause() );
152 }
153 throw new MojoExecutionException( e.getMessage(), e );
154 }
155 catch ( IOException e )
156 {
157 throw new MojoExecutionException( "Error during site generation", e );
158 }
159 }
160
161 private void renderLocale( Locale locale, List<MavenReportExecution> reports )
162 throws IOException, RendererException, MojoFailureException, MojoExecutionException
163 {
164 SiteRenderingContext context = createSiteRenderingContext( locale );
165
166 context.addSiteDirectory( generatedSiteDirectory );
167
168 context.setInputEncoding( getInputEncoding() );
169 context.setOutputEncoding( getOutputEncoding() );
170 context.setValidate( validate );
171 if ( validate )
172 {
173 getLog().info( "Validation is switched on, xml input documents will be validated!" );
174 }
175
176 File outputDir = getOutputDirectory( locale );
177
178 Map<String, DocumentRenderer> documents = locateDocuments( context, reports, locale );
179
180
181 siteRenderer.copyResources( context, outputDir );
182
183
184 List<DocumentRenderer> reportDocuments = renderDoxiaDocuments( documents, context, outputDir, false );
185
186
187
188 for ( MavenReportExecution mavenReportExecution : reports )
189 {
190 MavenReport report = mavenReportExecution.getMavenReport();
191 report.setReportOutputDirectory( outputDir );
192 }
193
194 siteRenderer.render( reportDocuments, context, outputDir );
195
196 if ( generateSitemap )
197 {
198 getLog().info( "Generating Sitemap." );
199
200 new SiteMap( getOutputEncoding(), i18n ).generate( context.getDecoration(), generatedSiteDirectory,
201 locale );
202 }
203
204
205 context.getSiteDirectories().clear();
206 context.addSiteDirectory( generatedSiteDirectory );
207
208 Map<String, DocumentRenderer> generatedDocuments =
209 siteRenderer.locateDocumentFiles( context, false );
210
211 renderDoxiaDocuments( generatedDocuments, context, outputDir, true );
212
213
214 siteRenderer.copyResources( context, outputDir );
215 }
216
217
218
219
220
221
222
223 private List<DocumentRenderer> renderDoxiaDocuments( Map<String, DocumentRenderer> documents,
224 SiteRenderingContext context, File outputDir,
225 boolean generated )
226 throws RendererException, IOException
227 {
228 Map<String, DocumentRenderer> doxiaDocuments = new TreeMap<>();
229 List<DocumentRenderer> nonDoxiaDocuments = new ArrayList<>();
230
231 Map<String, Integer> counts = new TreeMap<>();
232
233 for ( Map.Entry<String, DocumentRenderer> entry : documents.entrySet() )
234 {
235 DocumentRenderer doc = entry.getValue();
236
237 if ( doc instanceof DoxiaDocumentRenderer )
238 {
239 doxiaDocuments.put( entry.getKey(), doc );
240
241 DoxiaDocumentRenderer doxia = (DoxiaDocumentRenderer) doc;
242
243
244 String parserId = doxia.getRenderingContext().getParserId();
245 Integer count = counts.get( parserId );
246 if ( count == null )
247 {
248 count = 1;
249 }
250 else
251 {
252 count++;
253 }
254 counts.put( parserId, count );
255 }
256 else
257 {
258 nonDoxiaDocuments.add( doc );
259 }
260 }
261
262 if ( doxiaDocuments.size() > 0 )
263 {
264 MessageBuilder mb = buffer();
265 mb.a( "Rendering " );
266 mb.strong( doxiaDocuments.size() + ( generated ? " generated" : "" ) + " Doxia document"
267 + ( doxiaDocuments.size() > 1 ? "s" : "" ) );
268 mb.a( ": " );
269
270 boolean first = true;
271 for ( Map.Entry<String, Integer> entry : counts.entrySet() )
272 {
273 if ( first )
274 {
275 first = false;
276 }
277 else
278 {
279 mb.a( ", " );
280 }
281 mb.strong( entry.getValue() + " " + entry.getKey() );
282 }
283
284 getLog().info( mb.toString() );
285
286 siteRenderer.render( doxiaDocuments.values(), context, outputDir );
287 }
288
289 return nonDoxiaDocuments;
290 }
291
292 private File getOutputDirectory( Locale locale )
293 {
294 File file;
295 if ( locale.getLanguage().equals( Locale.getDefault().getLanguage() ) )
296 {
297 file = outputDirectory;
298 }
299 else
300 {
301 file = new File( outputDirectory, locale.getLanguage() );
302 }
303
304
305 if ( !file.exists() )
306 {
307 file.mkdirs();
308 }
309
310 return file;
311 }
312
313 public MavenProject getProject()
314 {
315 return project;
316 }
317
318 public MavenSession getSession()
319 {
320 return mavenSession;
321 }
322 }