1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.plugins.site.render;
20
21 import java.io.File;
22 import java.io.IOException;
23 import java.util.List;
24 import java.util.Locale;
25
26 import org.apache.maven.doxia.module.xdoc.XdocSinkFactory;
27 import org.apache.maven.doxia.sink.Sink;
28 import org.apache.maven.doxia.site.decoration.DecorationModel;
29 import org.apache.maven.doxia.site.decoration.Menu;
30 import org.apache.maven.doxia.site.decoration.MenuItem;
31 import org.codehaus.plexus.i18n.I18N;
32
33
34
35
36
37
38
39
40 public class SiteMap {
41
42 private String encoding;
43 private I18N i18n;
44
45
46
47
48
49
50
51 public SiteMap(String encoding, I18N i18n) {
52 this.encoding = encoding;
53 this.i18n = i18n;
54 }
55
56
57
58
59
60
61 public I18N getI18n() {
62 return i18n;
63 }
64
65
66
67
68
69
70 public void setI18n(I18N i18n) {
71 this.i18n = i18n;
72 }
73
74
75
76
77
78
79 public String getEncoding() {
80 return encoding;
81 }
82
83
84
85
86
87
88 public void setEncoding(String enc) {
89 this.encoding = enc;
90 }
91
92
93
94
95
96
97
98
99
100
101
102
103 public void generate(DecorationModel model, File targetDir, Locale locale) throws IOException {
104 File outputDir = new File(targetDir, "xdoc");
105 Sink sink = new XdocSinkFactory().createSink(outputDir, "sitemap.xml", encoding);
106
107 try {
108 extract(model, sink, locale);
109 } finally {
110 sink.close();
111 }
112 }
113
114 private void extract(DecorationModel decoration, Sink sink, Locale locale) {
115 sink.head();
116 sink.title();
117 sink.text(i18n.getString("site-plugin", locale, "site.sitemap.title"));
118 sink.title_();
119 sink.head_();
120 sink.body();
121
122 sink.section1();
123 sink.sectionTitle1();
124 sink.text(i18n.getString("site-plugin", locale, "site.sitemap.section.title"));
125 sink.sectionTitle1_();
126
127 sink.paragraph();
128 sink.text(i18n.getString("site-plugin", locale, "site.sitemap.description"));
129 sink.paragraph_();
130
131 for (Menu menu : decoration.getMenus()) {
132 sink.section3();
133 sink.sectionTitle3();
134 sink.text(menu.getName());
135 sink.sectionTitle3_();
136 sink.horizontalRule();
137
138 extractItems(menu.getItems(), sink);
139
140 sink.section3_();
141 }
142
143 sink.section1_();
144 sink.body_();
145 }
146
147 private static void extractItems(List<MenuItem> items, Sink sink) {
148 if (items == null || items.isEmpty()) {
149 return;
150 }
151
152 sink.list();
153
154 for (MenuItem item : items) {
155 sink.listItem();
156 if (item.getHref() != null) {
157 sink.link(relativePath(item.getHref()));
158 sink.text(item.getName());
159 sink.link_();
160 }
161
162 extractItems(item.getItems(), sink);
163 sink.listItem_();
164 }
165
166 sink.list_();
167 }
168
169
170 private static String relativePath(String href) {
171 return href.startsWith("/") ? "." + href : href;
172 }
173 }