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