1 package org.apache.maven.plugin.changes;
2
3 /*
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
19 * under the License.
20 */
21
22 import java.io.File;
23 import java.io.IOException;
24 import java.net.URL;
25 import java.util.Locale;
26 import java.util.Map;
27 import java.util.ResourceBundle;
28
29 import org.apache.maven.reporting.MavenReportException;
30 import org.codehaus.plexus.util.FileUtils;
31
32 /**
33 * Goal which creates a nicely formatted Changes Report in html format from a changes.xml file.
34 *
35 * @goal changes-report
36 * @author <a href="mailto:jruiz@exist.com">Johnny R. Ruiz III</a>
37 * @version $Id: ChangesMojo.html 816588 2012-05-08 12:37:27Z hboutemy $
38 */
39 public class ChangesMojo
40 extends AbstractChangesReport
41 {
42 /**
43 * The path of the <code>changes.xml</code> file that will be converted into an HTML report.
44 *
45 * @parameter expression="${changes.xmlPath}" default-value="src/changes/changes.xml"
46 */
47 private File xmlPath;
48
49 /**
50 * Template string that is used to discover the URL to use to display an issue report.
51 * There are 2 template tokens you can use. <code>%URL%</code>: this is computed by getting the
52 * <code><issueManagement>/<url></code> value from the POM, and removing the last '/'
53 * and everything that comes after it. <code>%ISSUE%</code>: this is the issue number.
54 * <p>
55 * <strong>Note:</strong> In versions of this plugin prior to 2.0-beta-2 this parameter was called
56 * <code>link_template</code>.
57 * </p>
58 *
59 * @parameter expression="${changes.issueLinkTemplate}" default-value="%URL%/ViewIssue.jspa?key=%ISSUE%"
60 * @since 2.0-beta-2
61 * @deprecated As of 2.1 use issueLinkTemplatePerSystem : this one will be with system default
62 */
63 private String issueLinkTemplate;
64
65 /**
66 * Template strings per system that is used to discover the URL to use to display an issue report. Each key in this
67 * map denotes the (case-sensitive) identifier of the issue tracking system and its value gives the URL template.
68 * <p>
69 * There are 2 template tokens you can use. <code>%URL%</code>: this is computed by getting the
70 * <code><issueManagement>/<url></code> value from the POM, and removing the last '/'
71 * and everything that comes after it. <code>%ISSUE%</code>: this is the issue number.
72 * </p>
73 * <p>
74 * <strong>Note:</strong> The deprecated issueLinkTemplate will be used for a system called "default".
75 * </p>
76 *
77 * @parameter
78 * @since 2.1
79 */
80 private Map issueLinkTemplatePerSystem;
81
82 /**
83 * @parameter default-value="${project.issueManagement.url}"
84 * @readonly
85 */
86 private String url;
87
88 /**
89 * A flag whether the report should also include the dates of individual actions. If set to <code>false</code>, only
90 * the dates of releases will be written to the report.
91 *
92 * @parameter expression="${changes.addActionDate}" default-value="false"
93 * @since 2.1
94 */
95 private boolean addActionDate;
96
97 public boolean canGenerateReport()
98 {
99 return xmlPath.isFile();
100 }
101
102 private void copyStaticResources()
103 throws MavenReportException
104 {
105 final String pluginResourcesBase = "org/apache/maven/plugin/changes";
106 String resourceNames[] = {
107 "images/add.gif",
108 "images/fix.gif",
109 "images/icon_help_sml.gif",
110 "images/remove.gif",
111 "images/rss.png",
112 "images/update.gif" };
113 try
114 {
115 getLog().debug( "Copying static resources." );
116 for ( int i = 0; i < resourceNames.length; i++ )
117 {
118 URL url = this.getClass().getClassLoader().getResource( pluginResourcesBase + "/" + resourceNames[i] );
119 FileUtils.copyURLToFile( url, new File( getReportOutputDirectory(), resourceNames[i] ) );
120 }
121 }
122 catch ( IOException e )
123 {
124 throw new MavenReportException( "Unable to copy static resources." );
125 }
126 }
127
128 public void executeReport( Locale locale )
129 throws MavenReportException
130 {
131
132 if ( !xmlPath.exists() )
133 {
134 getLog().warn( "changes.xml file " + xmlPath.getAbsolutePath() + " does not exist." );
135 return;
136 }
137
138 ChangesReportGenerator report = new ChangesReportGenerator( xmlPath, getLog() );
139
140 report.setIssueLinksPerSystem( issueLinkTemplatePerSystem );
141 report.setIssueLink( issueLinkTemplate );
142
143 report.setUrl( url );
144
145 report.setAddActionDate( addActionDate );
146
147 if ( !report.canGenerateIssueLinks() )
148 {
149 getLog().warn( "No issue management URL defined in POM. Links to your issues will not work correctly." );
150 }
151
152 report.doGenerateReport( getBundle( locale ), getSink() );
153
154 // Copy the images
155 copyStaticResources();
156 }
157
158 public String getName( Locale locale )
159 {
160 return getBundle( locale ).getString( "report.changes.name" );
161 }
162
163 public String getDescription( Locale locale )
164 {
165 return getBundle( locale ).getString( "report.changes.description" );
166 }
167
168 public String getOutputName()
169 {
170 return "changes-report";
171 }
172
173 private ResourceBundle getBundle( Locale locale )
174 {
175 return ResourceBundle.getBundle( "changes-report", locale, this.getClass().getClassLoader() );
176 }
177 }