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.File;
38 import java.io.IOException;
39 import java.util.ArrayList;
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<String, DoxiaBean> i18nDoxiaContexts;
61
62 private List<Locale> 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<String, DoxiaBean>) servletContext.getAttribute( I18N_DOXIA_CONTEXTS_KEY );
75
76 localesList = (List<Locale>) 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<String, DocumentRenderer> documents;
103 File generatedSiteDirectory;
104
105 String localeWanted = null;
106 for ( Locale locale : localesList )
107 {
108 if ( path.startsWith( locale.getLanguage() + "/" ) )
109 {
110 localeWanted = locale.toString();
111 path = path.substring( locale.getLanguage().length() + 1 );
112 }
113 }
114
115 if ( localeWanted == null )
116 {
117 DoxiaBean defaultDoxiaBean = i18nDoxiaContexts.get( "default" );
118 if ( defaultDoxiaBean == null )
119 {
120 throw new ServletException( "No doxia bean found for the default locale" );
121 }
122 context = defaultDoxiaBean.getContext();
123 documents = defaultDoxiaBean.getDocuments();
124 generatedSiteDirectory = defaultDoxiaBean.getGeneratedSiteDirectory();
125 }
126 else
127 {
128 DoxiaBean i18nDoxiaBean = i18nDoxiaContexts.get( localeWanted );
129 if ( i18nDoxiaBean == null )
130 {
131 throw new ServletException( "No doxia bean found for the locale " + localeWanted );
132 }
133 context = i18nDoxiaBean.getContext();
134 documents = i18nDoxiaBean.getDocuments();
135 generatedSiteDirectory = i18nDoxiaBean.getGeneratedSiteDirectory();
136 }
137
138
139
140
141 if ( documents.containsKey( path ) )
142 {
143 try
144 {
145 DocumentRenderer renderer = documents.get( path );
146 renderer.renderDocument( servletResponse.getWriter(), siteRenderer, context );
147
148 if ( renderer instanceof ReportDocumentRenderer )
149 {
150 ReportDocumentRenderer reportDocumentRenderer = (ReportDocumentRenderer) renderer;
151 if ( reportDocumentRenderer.isExternalReport() )
152 {
153 try
154 {
155 filterChain.doFilter( servletRequest, servletResponse );
156 }
157 catch ( Exception e )
158 {
159 throw new ServletException( e );
160 }
161 }
162 }
163 }
164 catch ( RendererException e )
165 {
166 throw new ServletException( e );
167 }
168 }
169 else if ( generatedSiteDirectory != null && generatedSiteDirectory.exists() )
170 {
171 context.getSiteDirectories().clear();
172 context.addSiteDirectory( generatedSiteDirectory );
173 try
174 {
175 Map<String, DocumentRenderer> locateDocuments = siteRenderer.locateDocumentFiles( context );
176
177 if ( locateDocuments.containsKey( path ) )
178 {
179 DocumentRenderer renderer = locateDocuments.get( path );
180 renderer.renderDocument( servletResponse.getWriter(), siteRenderer, context );
181 }
182 }
183 catch ( RendererException e )
184 {
185 throw new ServletException( e );
186 }
187
188 List<File> originalSiteDirectories = new ArrayList<File>( context.getSiteDirectories() );
189 for ( File dir : originalSiteDirectories )
190 {
191 context.addSiteDirectory( dir );
192 }
193 }
194 else
195 {
196 filterChain.doFilter( servletRequest, servletResponse );
197 }
198 }
199
200
201
202
203 public void destroy()
204 {
205 }
206 }