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