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.run;
20
21 import javax.servlet.Filter;
22 import javax.servlet.FilterChain;
23 import javax.servlet.FilterConfig;
24 import javax.servlet.ServletContext;
25 import javax.servlet.ServletException;
26 import javax.servlet.ServletRequest;
27 import javax.servlet.ServletResponse;
28 import javax.servlet.http.HttpServletRequest;
29
30 import java.io.File;
31 import java.io.IOException;
32 import java.nio.file.Files;
33 import java.nio.file.Path;
34 import java.util.List;
35 import java.util.Locale;
36 import java.util.Map;
37
38 import org.apache.maven.doxia.siterenderer.DocumentRenderer;
39 import org.apache.maven.doxia.siterenderer.DoxiaDocumentRenderer;
40 import org.apache.maven.doxia.siterenderer.RendererException;
41 import org.apache.maven.doxia.siterenderer.SiteRenderer;
42 import org.apache.maven.doxia.siterenderer.SiteRenderingContext;
43 import org.apache.maven.doxia.tools.SiteTool;
44 import org.apache.maven.plugins.site.render.ReportDocumentRenderer;
45 import org.apache.maven.plugins.site.render.SitePluginReportDocumentRenderer;
46 import org.eclipse.jetty.http.MimeTypes;
47
48 import static org.apache.maven.shared.utils.logging.MessageUtils.buffer;
49
50
51
52
53
54
55 public class DoxiaFilter implements Filter {
56 public static final String OUTPUT_DIRECTORY_KEY = "outputDirectory";
57
58 public static final String SITE_RENDERER_KEY = "siteRenderer";
59
60 public static final String I18N_DOXIA_CONTEXTS_KEY = "i18nDoxiaContexts";
61
62 public static final String LOCALES_LIST_KEY = "localesList";
63
64 private ServletContext servletContext;
65
66 private File outputDirectory;
67
68 private SiteRenderer siteRenderer;
69
70 private Map<String, DoxiaBean> i18nDoxiaContexts;
71
72 private List<Locale> localesList;
73
74
75
76
77 public void init(FilterConfig filterConfig) throws ServletException {
78 servletContext = filterConfig.getServletContext();
79
80 outputDirectory = (File) servletContext.getAttribute(OUTPUT_DIRECTORY_KEY);
81
82 siteRenderer = (SiteRenderer) servletContext.getAttribute(SITE_RENDERER_KEY);
83
84 i18nDoxiaContexts = (Map<String, DoxiaBean>) servletContext.getAttribute(I18N_DOXIA_CONTEXTS_KEY);
85
86 localesList = (List<Locale>) servletContext.getAttribute(LOCALES_LIST_KEY);
87 }
88
89
90
91
92 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
93 throws IOException, ServletException {
94 HttpServletRequest req = (HttpServletRequest) servletRequest;
95
96
97
98
99 String path = req.getServletPath();
100
101 if (path.endsWith("/")) {
102 path += "index.html";
103 }
104
105
106 path = path.substring(1);
107
108
109 SiteRenderingContext context;
110 Map<String, DocumentRenderer> documents;
111
112 String localeWanted = "";
113 for (Locale locale : localesList) {
114 if (path.startsWith(locale + "/")) {
115 localeWanted = locale.toString();
116 path = path.substring(localeWanted.length() + 1);
117 }
118 }
119
120 DoxiaBean doxiaBean;
121 if (!localeWanted.equals(SiteTool.DEFAULT_LOCALE.toString())) {
122 doxiaBean = i18nDoxiaContexts.get(localeWanted);
123 if (doxiaBean == null) {
124 throw new ServletException("No Doxia bean found for locale '" + localeWanted + "'");
125 }
126 } else {
127 doxiaBean = i18nDoxiaContexts.get("default");
128 if (doxiaBean == null) {
129 throw new ServletException("No Doxia bean found for the default locale");
130 }
131 }
132 context = doxiaBean.getContext();
133 documents = doxiaBean.getDocuments();
134
135
136
137
138 if (documents.containsKey(path)) {
139 try {
140 DocumentRenderer docRenderer = documents.get(path);
141 logDocumentRenderer(path, localeWanted, docRenderer);
142 String outputName = docRenderer.getOutputName();
143 String contentType = MimeTypes.getDefaultMimeByExtension(outputName);
144 if (contentType != null) {
145 servletResponse.setContentType(contentType);
146 }
147 docRenderer.renderDocument(servletResponse.getWriter(), siteRenderer, context);
148
149 if (docRenderer instanceof ReportDocumentRenderer) {
150 ReportDocumentRenderer reportDocumentRenderer = (ReportDocumentRenderer) docRenderer;
151 if (reportDocumentRenderer.isExternalReport()) {
152 Path externalReportFile = outputDirectory.toPath().resolve(outputName);
153 servletResponse.reset();
154 if (contentType != null) {
155 servletResponse.setContentType(contentType);
156 }
157 Files.copy(externalReportFile, servletResponse.getOutputStream());
158 }
159 }
160
161 return;
162 } catch (RendererException e) {
163 throw new ServletException(e);
164 }
165 }
166
167 filterChain.doFilter(servletRequest, servletResponse);
168 }
169
170 private void logDocumentRenderer(String path, String locale, DocumentRenderer docRenderer) {
171 String source;
172 if (docRenderer instanceof DoxiaDocumentRenderer) {
173 source = docRenderer.getRenderingContext().getDoxiaSourcePath();
174 } else if (docRenderer instanceof ReportDocumentRenderer) {
175 source = ((ReportDocumentRenderer) docRenderer).getReportMojoInfo();
176 if (source == null) {
177 source = "(unknown)";
178 }
179 } else if (docRenderer instanceof SitePluginReportDocumentRenderer) {
180 source = ((SitePluginReportDocumentRenderer) docRenderer).getReportMojoInfo();
181 } else {
182 source = docRenderer.getRenderingContext().getGenerator() != null
183 ? docRenderer.getRenderingContext().getGenerator()
184 : docRenderer.getClass().getName();
185 }
186 String localizedPath = !locale.equals(SiteTool.DEFAULT_LOCALE.toString()) ? locale + "/" + path : path;
187 String localizedSource = source
188 + (!locale.equals(SiteTool.DEFAULT_LOCALE.toString())
189 ? " (locale '" + locale + "')"
190 : " (default locale)");
191 servletContext.log(localizedPath + " -> " + buffer().strong(localizedSource));
192 }
193
194
195
196
197 public void destroy() {}
198 }