1 package org.apache.maven.plugin.changes;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.commons.io.IOUtils;
23 import org.apache.maven.artifact.Artifact;
24 import org.apache.maven.artifact.factory.ArtifactFactory;
25 import org.apache.maven.artifact.repository.ArtifactRepository;
26 import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
27 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
28 import org.apache.maven.artifact.resolver.ArtifactResolver;
29 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
30 import org.apache.maven.artifact.versioning.VersionRange;
31 import org.apache.maven.doxia.sink.render.RenderingContext;
32 import org.apache.maven.doxia.site.decoration.Body;
33 import org.apache.maven.doxia.site.decoration.DecorationModel;
34 import org.apache.maven.doxia.site.decoration.Skin;
35 import org.apache.maven.doxia.siterenderer.Renderer;
36 import org.apache.maven.doxia.siterenderer.RendererException;
37 import org.apache.maven.doxia.siterenderer.SiteRenderingContext;
38 import org.apache.maven.doxia.siterenderer.sink.SiteRendererSink;
39 import org.apache.maven.execution.MavenSession;
40 import org.apache.maven.plugin.MojoExecutionException;
41 import org.apache.maven.plugins.annotations.Component;
42 import org.apache.maven.plugins.annotations.Parameter;
43 import org.apache.maven.project.MavenProject;
44 import org.apache.maven.reporting.AbstractMavenReport;
45 import org.apache.maven.reporting.MavenReportException;
46 import org.codehaus.plexus.i18n.I18N;
47 import org.codehaus.plexus.util.ReaderFactory;
48
49 import java.io.File;
50 import java.io.FileOutputStream;
51 import java.io.OutputStreamWriter;
52 import java.io.IOException;
53 import java.io.Writer;
54 import java.util.HashMap;
55 import java.util.Locale;
56 import java.util.Map;
57
58
59
60
61
62
63
64 public abstract class AbstractChangesReport
65 extends AbstractMavenReport
66 {
67
68
69
70
71
72 @Parameter( property = "basedir", required = true )
73 protected String basedir;
74
75
76
77
78
79
80 @Parameter( defaultValue = "${project.reporting.outputDirectory}" )
81 private File outputDirectory;
82
83
84
85
86
87
88
89
90 @Parameter( property = "outputEncoding", defaultValue = "${project.reporting.outputEncoding}" )
91 private String outputEncoding;
92
93
94
95
96
97
98
99 @Parameter( property = "changes.runOnlyAtExecutionRoot", defaultValue = "false" )
100 protected boolean runOnlyAtExecutionRoot;
101
102
103
104
105
106
107 @Parameter( defaultValue = "${session}", readonly = true, required = true )
108 protected MavenSession mavenSession;
109
110
111
112
113 @Component
114 protected Renderer siteRenderer;
115
116
117
118
119 @Parameter( defaultValue = "${project}", readonly = true, required = true )
120 protected MavenProject project;
121
122
123
124
125 @Parameter( property = "localRepository", required = true, readonly = true )
126 protected ArtifactRepository localRepository;
127
128
129
130 @Component
131 protected ArtifactResolver resolver;
132
133
134
135 @Component
136 protected ArtifactFactory factory;
137
138
139
140
141 @Component
142 protected I18N i18n;
143
144 private File getSkinArtifactFile()
145 throws MojoExecutionException
146 {
147 Skin skin = Skin.getDefaultSkin();
148
149 String version = skin.getVersion();
150 Artifact artifact;
151 try
152 {
153 if ( version == null )
154 {
155 version = Artifact.RELEASE_VERSION;
156 }
157 VersionRange versionSpec = VersionRange.createFromVersionSpec( version );
158 artifact = factory.createDependencyArtifact( skin.getGroupId(), skin.getArtifactId(), versionSpec, "jar",
159 null, null );
160
161 resolver.resolve( artifact, project.getRemoteArtifactRepositories(), localRepository );
162 }
163 catch ( InvalidVersionSpecificationException e )
164 {
165 throw new MojoExecutionException( "The skin version '" + version + "' is not valid: " + e.getMessage() );
166 }
167 catch ( ArtifactResolutionException e )
168 {
169 throw new MojoExecutionException( "Unable to find skin", e );
170 }
171 catch ( ArtifactNotFoundException e )
172 {
173 throw new MojoExecutionException( "The skin does not exist: " + e.getMessage() );
174 }
175
176 return artifact.getFile();
177 }
178
179 public void execute()
180 throws MojoExecutionException
181 {
182 if ( !canGenerateReport() )
183 {
184 return;
185 }
186
187
188 Writer writer = null;
189 try
190 {
191 DecorationModel model = new DecorationModel();
192 model.setBody( new Body() );
193 Map<String, String> attributes = new HashMap<String, String>();
194 attributes.put( "outputEncoding", getOutputEncoding() );
195 Locale locale = Locale.getDefault();
196 SiteRenderingContext siteContext = siteRenderer.createContextForSkin( getSkinArtifactFile(), attributes,
197 model, getName( locale ), locale );
198 siteContext.setOutputEncoding( getOutputEncoding() );
199
200 RenderingContext context = new RenderingContext( outputDirectory, getOutputName() + ".html" );
201
202 SiteRendererSink sink = new SiteRendererSink( context );
203 generate( sink, locale );
204
205 outputDirectory.mkdirs();
206
207 File file = new File( outputDirectory, getOutputName() + ".html" );
208 writer = new OutputStreamWriter( new FileOutputStream( file ), getOutputEncoding() );
209
210 siteRenderer.generateDocument( writer, sink, siteContext );
211
212 writer.close();
213 writer = null;
214
215 siteRenderer.copyResources( siteContext, new File( project.getBasedir(), "src/site/resources" ),
216 outputDirectory );
217 }
218 catch ( RendererException e )
219 {
220 throw new MojoExecutionException( "An error has occurred in " + getName( Locale.ENGLISH )
221 + " report generation.", e );
222 }
223 catch ( IOException e )
224 {
225 throw new MojoExecutionException( "An error has occurred in " + getName( Locale.ENGLISH )
226 + " report generation.", e );
227 }
228 catch ( MavenReportException e )
229 {
230 throw new MojoExecutionException( "An error has occurred in " + getName( Locale.ENGLISH )
231 + " report generation.", e );
232 }
233 finally
234 {
235 IOUtils.closeQuietly( writer );
236 }
237 }
238
239
240
241
242 protected String getOutputDirectory()
243 {
244 return outputDirectory.getAbsolutePath();
245 }
246
247
248
249
250
251
252
253 protected String getOutputEncoding()
254 {
255 return ( outputEncoding != null ) ? outputEncoding : ReaderFactory.UTF_8;
256 }
257
258
259
260
261 protected MavenProject getProject()
262 {
263 return project;
264 }
265
266
267
268
269 protected Renderer getSiteRenderer()
270 {
271 return siteRenderer;
272 }
273
274
275
276
277
278
279
280 protected boolean isThisTheExecutionRoot()
281 {
282 getLog().debug( "Root Folder:" + mavenSession.getExecutionRootDirectory() );
283 getLog().debug( "Current Folder:" + basedir );
284 boolean result = mavenSession.getExecutionRootDirectory().equalsIgnoreCase( basedir );
285 if ( result )
286 {
287 getLog().debug( "This is the execution root." );
288 }
289 else
290 {
291 getLog().debug( "This is NOT the execution root." );
292 }
293 return result;
294 }
295 }