View Javadoc
1   package org.apache.turbine.modules.layouts;
2   
3   
4   import javax.servlet.http.HttpServletResponse;
5   
6   import org.apache.logging.log4j.LogManager;
7   
8   /*
9    * Licensed to the Apache Software Foundation (ASF) under one
10   * or more contributor license agreements.  See the NOTICE file
11   * distributed with this work for additional information
12   * regarding copyright ownership.  The ASF licenses this file
13   * to you under the Apache License, Version 2.0 (the
14   * "License"); you may not use this file except in compliance
15   * with the License.  You may obtain a copy of the License at
16   *
17   *   http://www.apache.org/licenses/LICENSE-2.0
18   *
19   * Unless required by applicable law or agreed to in writing,
20   * software distributed under the License is distributed on an
21   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
22   * KIND, either express or implied.  See the License for the
23   * specific language governing permissions and limitations
24   * under the License.
25   */
26  
27  
28  import org.apache.logging.log4j.Logger;
29  import org.apache.turbine.Turbine;
30  import org.apache.turbine.annotation.TurbineService;
31  import org.apache.turbine.modules.Layout;
32  import org.apache.turbine.pipeline.PipelineData;
33  import org.apache.turbine.services.velocity.VelocityService;
34  import org.apache.turbine.util.RunData;
35  import org.apache.velocity.context.Context;
36  
37  /**
38   * This Layout module allows Velocity templates
39   * to be used as layouts.
40   *
41   * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
42   */
43  public abstract class VelocityLayout implements Layout
44  {
45      /** Logging */
46      protected final Logger log = LogManager.getLogger(this.getClass());
47  
48      /** The prefix for lookup up layout pages */
49      protected static final String prefix = PREFIX + "/";
50  
51      /** Injected service instance */
52      @TurbineService
53      protected VelocityService velocityService;
54  
55      /**
56       * Method called by LayoutLoader.
57       *
58       *
59       * @param pipelineData PipelineData
60       * @throws Exception generic exception
61       */
62      @Override
63      public void doBuild(PipelineData pipelineData)
64          throws Exception
65      {
66          RunData data = pipelineData.getRunData();
67          // Get the context needed by Velocity.
68          Context context = velocityService.getContext(pipelineData);
69  
70          // Provide objects to Velocity context
71          populateContext(pipelineData, context);
72  
73          // Grab the layout template set in the VelocityPage.
74          // If null, then use the default layout template
75          // (done by the TemplateInfo object)
76          String templateName = data.getTemplateInfo().getLayoutTemplate();
77  
78          // Set the locale and content type
79          data.getResponse().setLocale(data.getLocale());
80          data.getResponse().setContentType(data.getContentType());
81  
82          log.debug("Now trying to render layout {}", templateName);
83  
84          // Finally, generate the layout template and send it to the browser
85          render(pipelineData, context, templateName);
86      }
87  
88      /**
89       * Populate Velocity context
90       *
91       * @param pipelineData PipelineData
92       * @param context the Velocity context
93       *
94       * @throws Exception if evaluation fails
95       */
96      protected abstract void populateContext(PipelineData pipelineData, Context context)
97          throws Exception;
98  
99      /**
100      * Render layout
101      *
102      * @param pipelineData PipelineData
103      * @param context the Velocity context
104      * @param templateName relative path to Velocity template
105      *
106      * @throws Exception if rendering fails
107      */
108     protected void render(PipelineData pipelineData, Context context, String templateName)
109         throws Exception
110     {
111         velocityService.handleRequest(context,
112                 prefix + templateName,
113                 pipelineData.get(Turbine.class, HttpServletResponse.class)
114                     .getOutputStream());
115     }
116 }