View Javadoc

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