1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.plugins.pdf;
20
21 import java.io.IOException;
22 import java.util.ArrayList;
23 import java.util.Date;
24 import java.util.List;
25
26 import org.apache.commons.io.input.XmlStreamReader;
27 import org.apache.maven.doxia.document.DocumentAuthor;
28 import org.apache.maven.doxia.document.DocumentCover;
29 import org.apache.maven.doxia.document.DocumentMeta;
30 import org.apache.maven.doxia.document.DocumentModel;
31 import org.apache.maven.doxia.document.DocumentTOC;
32 import org.apache.maven.doxia.document.DocumentTOCItem;
33 import org.apache.maven.doxia.site.decoration.DecorationModel;
34 import org.apache.maven.doxia.site.decoration.Menu;
35 import org.apache.maven.doxia.site.decoration.MenuItem;
36 import org.apache.maven.model.Developer;
37 import org.apache.maven.project.MavenProject;
38 import org.codehaus.plexus.util.StringUtils;
39
40
41
42
43
44
45 public class DocumentModelBuilder {
46
47 private final MavenProject project;
48
49
50 private final DecorationModel decorationModel;
51
52
53
54
55
56
57 public DocumentModelBuilder(MavenProject project) {
58 this(project, null);
59 }
60
61
62
63
64
65
66
67 public DocumentModelBuilder(MavenProject project, DecorationModel decorationModel) {
68 this.project = project;
69 this.decorationModel = decorationModel;
70 }
71
72
73
74
75
76
77 public DocumentModel getDocumentModel() {
78 return getDocumentModel(project, decorationModel, null);
79 }
80
81
82
83
84
85
86
87 public DocumentModel getDocumentModel(Date date) {
88 return getDocumentModel(project, decorationModel, date);
89 }
90
91
92
93
94
95
96
97
98
99
100 private static DocumentModel getDocumentModel(MavenProject project, DecorationModel decorationModel, Date date) {
101 final Date now = date == null ? new Date() : date;
102
103 final DocumentModel docModel = new DocumentModel();
104
105 docModel.setModelEncoding(getProjectModelEncoding(project));
106 docModel.setOutputName(
107 project == null || project.getArtifactId() == null ? "unnamed" : project.getArtifactId());
108 docModel.setMeta(getDocumentMeta(project, now));
109 docModel.setCover(getDocumentCover(project, now));
110 docModel.setToc(getDocumentTOC(decorationModel));
111
112 return docModel;
113 }
114
115
116
117
118
119
120
121 private static DocumentTOC getDocumentTOC(DecorationModel decorationModel) {
122 final DocumentTOC toc = new DocumentTOC();
123
124 if (decorationModel != null && decorationModel.getMenus() != null) {
125 for (final Menu menu : decorationModel.getMenus()) {
126 for (final MenuItem item : menu.getItems()) {
127 final DocumentTOCItem documentTOCItem = new DocumentTOCItem();
128 documentTOCItem.setName(item.getName());
129 documentTOCItem.setRef(item.getHref());
130 toc.addItem(documentTOCItem);
131 }
132 }
133 }
134
135 return toc;
136 }
137
138
139
140
141
142
143
144
145
146 private static DocumentMeta getDocumentMeta(MavenProject project, Date date) {
147 final DocumentMeta meta = new DocumentMeta();
148
149 meta.setAuthors(getAuthors(project));
150 meta.setCreationDate(date);
151 meta.setCreator(System.getProperty("user.name"));
152 meta.setDate(date);
153 meta.setDescription(project == null ? null : project.getDescription());
154
155 meta.setInitialCreator(System.getProperty("user.name"));
156
157
158 meta.setSubject(getProjectName(project));
159 meta.setTitle(getProjectName(project));
160
161 return meta;
162 }
163
164
165
166
167
168
169
170
171
172 private static DocumentCover getDocumentCover(MavenProject project, Date date) {
173 final DocumentCover cover = new DocumentCover();
174
175 cover.setAuthors(getAuthors(project));
176
177 cover.setCompanyName(getProjectOrganizationName(project));
178 cover.setCoverDate(date);
179 cover.setCoverSubTitle(project == null ? null : "v. " + project.getVersion());
180 cover.setCoverTitle(getProjectName(project));
181
182 cover.setCoverVersion(project == null ? null : project.getVersion());
183
184 cover.setProjectName(getProjectName(project));
185
186 return cover;
187 }
188
189
190
191
192
193
194
195
196 private static List<DocumentAuthor> getAuthors(MavenProject project) {
197 if (project == null || project.getDevelopers() == null) {
198 return null;
199 }
200
201 final List<DocumentAuthor> ret = new ArrayList<>(4);
202
203 for (Developer developer : project.getDevelopers()) {
204 final DocumentAuthor author = new DocumentAuthor();
205 author.setName(developer.getName());
206 author.setEmail(developer.getEmail());
207 author.setCompanyName(developer.getOrganization());
208 StringBuilder roles = null;
209
210 for (final String role : developer.getRoles()) {
211 if (roles == null) {
212 roles = new StringBuilder(32);
213 } else {
214 roles.append(',').append(' ');
215 }
216 roles.append(role);
217 }
218 if (roles != null) {
219 author.setPosition(roles.toString());
220 }
221
222 ret.add(author);
223 }
224
225 return ret;
226 }
227
228
229
230
231
232 private static String getProjectOrganizationName(MavenProject project) {
233 if (project != null
234 && project.getOrganization() != null
235 && StringUtils.isNotEmpty(project.getOrganization().getName())) {
236 return project.getOrganization().getName();
237 }
238
239 return System.getProperty("user.name");
240 }
241
242
243
244
245
246
247
248
249 private static String getProjectName(MavenProject project) {
250 if (project == null) {
251 return null;
252 }
253
254 if (StringUtils.isEmpty(project.getName())) {
255 return project.getGroupId() + ":" + project.getArtifactId();
256 }
257
258 return project.getName();
259 }
260
261
262
263
264
265
266
267 private static String getProjectModelEncoding(MavenProject project) {
268 if (project == null) {
269 return null;
270 }
271
272 String encoding = project.getModel().getModelEncoding();
273
274
275 try (XmlStreamReader reader = new XmlStreamReader(project.getFile())) {
276 encoding = reader.getEncoding();
277 } catch (IOException e) {
278
279 }
280
281 if (encoding == null || encoding.isEmpty()) {
282 return "UTF-8";
283 }
284
285 return encoding;
286 }
287 }