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