1 package org.apache.maven.plugins.site.run;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.doxia.siterenderer.DocumentRenderer;
23 import org.apache.maven.doxia.siterenderer.DoxiaDocumentRenderer;
24 import org.apache.maven.doxia.siterenderer.Renderer;
25 import org.apache.maven.doxia.siterenderer.RendererException;
26 import org.apache.maven.doxia.siterenderer.SiteRenderingContext;
27 import org.apache.maven.plugins.site.render.ReportDocumentRenderer;
28
29 import static org.apache.maven.shared.utils.logging.MessageUtils.buffer;
30
31 import javax.servlet.Filter;
32 import javax.servlet.FilterChain;
33 import javax.servlet.FilterConfig;
34 import javax.servlet.ServletContext;
35 import javax.servlet.ServletException;
36 import javax.servlet.ServletRequest;
37 import javax.servlet.ServletResponse;
38 import javax.servlet.http.HttpServletRequest;
39
40 import java.io.IOException;
41 import java.util.List;
42 import java.util.Locale;
43 import java.util.Map;
44
45
46
47
48
49
50 public class DoxiaFilter
51 implements Filter
52 {
53 public static final String SITE_RENDERER_KEY = "siteRenderer";
54
55 public static final String I18N_DOXIA_CONTEXTS_KEY = "i18nDoxiaContexts";
56
57 public static final String LOCALES_LIST_KEY = "localesList";
58
59 private ServletContext servletContext;
60
61 private Renderer siteRenderer;
62
63 private Map<String, DoxiaBean> i18nDoxiaContexts;
64
65 private List<Locale> localesList;
66
67
68
69
70 public void init( FilterConfig filterConfig )
71 throws ServletException
72 {
73 servletContext = filterConfig.getServletContext();
74
75 siteRenderer = (Renderer) servletContext.getAttribute( SITE_RENDERER_KEY );
76
77 i18nDoxiaContexts = (Map<String, DoxiaBean>) servletContext.getAttribute( I18N_DOXIA_CONTEXTS_KEY );
78
79 localesList = (List<Locale>) servletContext.getAttribute( LOCALES_LIST_KEY );
80 }
81
82
83
84
85 public void doFilter( ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain )
86 throws IOException, ServletException
87 {
88 HttpServletRequest req = (HttpServletRequest) servletRequest;
89
90
91
92
93 String path = req.getServletPath();
94
95 if ( path.endsWith( "/" ) )
96 {
97 path += "index.html";
98 }
99
100
101 path = path.substring( 1 );
102
103
104 SiteRenderingContext context;
105 Map<String, DocumentRenderer> documents;
106 SiteRenderingContext generatedSiteContext;
107
108 String languageWanted = null;
109 for ( Locale locale : localesList )
110 {
111 if ( path.startsWith( locale.getLanguage() + "/" ) )
112 {
113 languageWanted = locale.getLanguage();
114 path = path.substring( languageWanted.length() + 1 );
115 }
116 }
117
118 if ( languageWanted == null )
119 {
120 DoxiaBean defaultDoxiaBean = i18nDoxiaContexts.get( "default" );
121 if ( defaultDoxiaBean == null )
122 {
123 throw new ServletException( "No doxia bean found for the default locale" );
124 }
125 context = defaultDoxiaBean.getContext();
126 documents = defaultDoxiaBean.getDocuments();
127 generatedSiteContext = defaultDoxiaBean.getGeneratedSiteContext();
128 }
129 else
130 {
131 DoxiaBean i18nDoxiaBean = i18nDoxiaContexts.get( languageWanted );
132 if ( i18nDoxiaBean == null )
133 {
134 throw new ServletException( "No doxia bean found for the language " + languageWanted );
135 }
136 context = i18nDoxiaBean.getContext();
137 documents = i18nDoxiaBean.getDocuments();
138 generatedSiteContext = i18nDoxiaBean.getGeneratedSiteContext();
139 }
140
141
142
143
144 if ( documents.containsKey( path ) )
145 {
146 try
147 {
148 DocumentRenderer renderer = documents.get( path );
149 logDocumentRenderer( path, renderer );
150 renderer.renderDocument( servletResponse.getWriter(), siteRenderer, context );
151
152 if ( renderer instanceof ReportDocumentRenderer )
153 {
154 ReportDocumentRenderer reportDocumentRenderer = (ReportDocumentRenderer) renderer;
155 if ( reportDocumentRenderer.isExternalReport() )
156 {
157 try
158 {
159 filterChain.doFilter( servletRequest, servletResponse );
160 }
161 catch ( Exception e )
162 {
163 throw new ServletException( e );
164 }
165 }
166 }
167
168 return;
169 }
170 catch ( RendererException e )
171 {
172 throw new ServletException( e );
173 }
174 }
175 else if ( generatedSiteContext != null )
176 {
177 try
178 {
179 Map<String, DocumentRenderer> locateDocuments =
180 siteRenderer.locateDocumentFiles( generatedSiteContext, false );
181
182 if ( locateDocuments.containsKey( path ) )
183 {
184 DocumentRenderer renderer = locateDocuments.get( path );
185 logDocumentRenderer( path, renderer );
186 renderer.renderDocument( servletResponse.getWriter(), siteRenderer, generatedSiteContext );
187
188 return;
189 }
190 }
191 catch ( RendererException e )
192 {
193 throw new ServletException( e );
194 }
195 }
196
197 filterChain.doFilter( servletRequest, servletResponse );
198
199 servletContext.log( path );
200 }
201
202 private void logDocumentRenderer( String path, DocumentRenderer renderer )
203 {
204 String source;
205 if ( renderer instanceof DoxiaDocumentRenderer )
206 {
207 DoxiaDocumentRenderer doxiaDocumentRenderer = (DoxiaDocumentRenderer) renderer;
208 source = doxiaDocumentRenderer.getRenderingContext().getInputName();
209 }
210 else if ( renderer instanceof ReportDocumentRenderer )
211 {
212 ReportDocumentRenderer reportDocumentRenderer = (ReportDocumentRenderer) renderer;
213 source = reportDocumentRenderer.getReportMojoInfo();
214 }
215 else
216 {
217 source = renderer.getClass().getName();
218 }
219 servletContext.log( path + " -> " + buffer().strong( source ) );
220 }
221
222
223
224
225 public void destroy()
226 {
227 }
228 }