1 package org.apache.maven.report.projectinfo;
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.net.MalformedURLException;
24 import java.util.List;
25 import java.util.Locale;
26
27 import org.apache.maven.artifact.repository.ArtifactRepository;
28 import org.apache.maven.doxia.sink.Sink;
29 import org.apache.maven.doxia.tools.SiteTool;
30 import org.apache.maven.model.DistributionManagement;
31 import org.apache.maven.model.Model;
32 import org.apache.maven.model.Site;
33 import org.apache.maven.plugins.annotations.Mojo;
34 import org.apache.maven.project.MavenProject;
35 import org.apache.maven.project.MavenProjectBuilder;
36 import org.apache.maven.project.ProjectBuildingException;
37 import org.codehaus.plexus.i18n.I18N;
38
39
40
41
42
43
44
45
46 @Mojo( name = "modules" )
47 public class ModulesReport
48 extends AbstractProjectInfoReport
49 {
50
51
52
53
54 @Override
55 public boolean canGenerateReport()
56 {
57 boolean result = super.canGenerateReport();
58 if ( result && skipEmptyReport )
59 {
60 result = !isEmpty( getProject().getModel().getModules() ) ;
61 }
62
63 return result;
64 }
65
66 @Override
67 public void executeReport( Locale locale )
68 {
69 new ModulesRenderer( getSink(), getProject(), mavenProjectBuilder, localRepository,
70 getI18N( locale ), locale, siteTool ).render();
71 }
72
73
74 public String getOutputName()
75 {
76 return "modules";
77 }
78
79 @Override
80 protected String getI18Nsection()
81 {
82 return "modules";
83 }
84
85
86
87
88
89
90
91
92 static class ModulesRenderer
93 extends AbstractProjectInfoRenderer
94 {
95 protected MavenProject project;
96
97 protected MavenProjectBuilder mavenProjectBuilder;
98
99 protected ArtifactRepository localRepository;
100
101 protected SiteTool siteTool;
102
103 ModulesRenderer( Sink sink, MavenProject project, MavenProjectBuilder mavenProjectBuilder,
104 ArtifactRepository localRepository, I18N i18n, Locale locale,
105 SiteTool siteTool )
106 {
107 super( sink, i18n, locale );
108
109 this.project = project;
110 this.mavenProjectBuilder = mavenProjectBuilder;
111 this.localRepository = localRepository;
112 this.siteTool = siteTool;
113 }
114
115 @Override
116 protected String getI18Nsection()
117 {
118 return "modules";
119 }
120
121 @Override
122 public void renderBody()
123 {
124 List<String> modules = project.getModel().getModules();
125
126 if ( modules == null || modules.isEmpty() )
127 {
128 startSection( getTitle() );
129
130 paragraph( getI18nString( "nolist" ) );
131
132 endSection();
133
134 return;
135 }
136
137 startSection( getTitle() );
138
139 paragraph( getI18nString( "intro" ) );
140
141 startTable();
142
143 String name = getI18nString( "header.name" );
144 String description = getI18nString( "header.description" );
145 tableHeader( new String[] { name, description } );
146
147 final String baseUrl = getDistMgmntSiteUrl( project );
148
149 for ( String module : modules )
150 {
151 Model moduleModel;
152 File f = new File( project.getBasedir(), module + "/pom.xml" );
153 if ( f.exists() )
154 {
155 try
156 {
157 moduleModel = mavenProjectBuilder.build( f, localRepository, null ).getModel();
158 }
159 catch ( ProjectBuildingException e )
160 {
161 throw new IllegalStateException( "Unable to read local module POM", e );
162 }
163 }
164 else
165 {
166 moduleModel = new Model();
167 moduleModel.setName( module );
168 setDistMgmntSiteUrl( moduleModel, module );
169 }
170
171 final String moduleName =
172 ( moduleModel.getName() == null ) ? moduleModel.getArtifactId() : moduleModel.getName();
173 final String moduleHref = getRelativeLink( baseUrl, getDistMgmntSiteUrl( moduleModel ),
174 moduleModel.getArtifactId() );
175
176 tableRow( new String[] { linkedName( moduleName, moduleHref ), moduleModel.getDescription() } );
177 }
178
179 endTable();
180
181 endSection();
182 }
183
184 private static void setDistMgmntSiteUrl( Model model, String url )
185 {
186 if ( model.getDistributionManagement() == null )
187 {
188 model.setDistributionManagement( new DistributionManagement() );
189 }
190
191 if ( model.getDistributionManagement().getSite() == null )
192 {
193 model.getDistributionManagement().setSite( new Site() );
194 }
195
196 model.getDistributionManagement().getSite().setUrl( url );
197 }
198
199
200
201
202
203
204
205 private static String getDistMgmntSiteUrl( MavenProject project )
206 {
207 return getDistMgmntSiteUrl( project.getDistributionManagement() );
208 }
209
210
211
212
213
214
215
216 private static String getDistMgmntSiteUrl( Model model )
217 {
218 return getDistMgmntSiteUrl( model.getDistributionManagement() );
219 }
220
221 private static String getDistMgmntSiteUrl( DistributionManagement distMgmnt )
222 {
223 if ( distMgmnt != null && distMgmnt.getSite() != null && distMgmnt.getSite().getUrl() != null )
224 {
225 return urlEncode( distMgmnt.getSite().getUrl() );
226 }
227
228 return null;
229 }
230
231 private static String urlEncode( final String url )
232 {
233 if ( url == null )
234 {
235 return null;
236 }
237
238 try
239 {
240 return new File( url ).toURI().toURL().toExternalForm();
241 }
242 catch ( MalformedURLException ex )
243 {
244 return url;
245 }
246 }
247
248
249 private String getRelativeLink( String baseUrl, String href, String defaultHref )
250 {
251 String selectedHref = href;
252
253 if ( selectedHref == null )
254 {
255 selectedHref = defaultHref;
256 }
257
258 if ( baseUrl != null )
259 {
260 selectedHref = siteTool.getRelativePath( selectedHref, baseUrl );
261 }
262
263 if ( selectedHref.endsWith( "/" ) )
264 {
265 selectedHref = selectedHref.concat( "index.html" );
266 }
267 else
268 {
269 selectedHref = selectedHref.concat( "/index.html" );
270 }
271
272 return selectedHref;
273 }
274
275 private String linkedName( String name, String link )
276 {
277 return "{" + name + ", ./" + link + "}";
278 }
279 }
280 }