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