View Javadoc
1   package org.apache.maven.plugins.site.run;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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   * Render a page as requested.
47   *
48   * @author <a href="mailto:brett@apache.org">Brett Porter</a>
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       * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
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       * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
84       */
85      public void doFilter( ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain )
86          throws IOException, ServletException
87      {
88          HttpServletRequest req = (HttpServletRequest) servletRequest;
89  
90          // ----------------------------------------------------------------------
91          // Handle the servlet path
92          // ----------------------------------------------------------------------
93          String path = req.getServletPath();
94          // welcome file
95          if ( path.endsWith( "/" ) )
96          {
97              path += "index.html";
98          }
99  
100         // Remove the /
101         path = path.substring( 1 );
102 
103         // Handle locale request
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         // Handle report and documents
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      * @see javax.servlet.Filter#destroy()
224      */
225     public void destroy()
226     {
227     }
228 }