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