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.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   * Render a page as requested.
46   *
47   * @author <a href="mailto:brett@apache.org">Brett Porter</a>
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       * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
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       * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
81       */
82      public void doFilter( ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain )
83          throws IOException, ServletException
84      {
85          HttpServletRequest req = (HttpServletRequest) servletRequest;
86  
87          // ----------------------------------------------------------------------
88          // Handle the servlet path
89          // ----------------------------------------------------------------------
90          String path = req.getServletPath();
91          // welcome file
92          if ( path.endsWith( "/" ) )
93          {
94              path += "index.html";
95          }
96  
97          // Remove the /
98          path = path.substring( 1 );
99  
100         // Handle locale request
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         // Handle report and documents
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      * @see javax.servlet.Filter#destroy()
202      */
203     public void destroy()
204     {
205     }
206 }