View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.myfaces.taglib.core;
20  
21  import java.io.IOException;
22  import java.util.Locale;
23  import java.util.logging.Level;
24  import java.util.logging.Logger;
25  
26  import javax.el.ELContext;
27  import javax.el.MethodExpression;
28  import javax.el.ValueExpression;
29  import javax.faces.FacesException;
30  import javax.faces.component.UIComponent;
31  import javax.faces.component.UIViewRoot;
32  import javax.faces.context.FacesContext;
33  import javax.faces.render.RenderKitFactory;
34  import javax.faces.webapp.UIComponentELTag;
35  import javax.servlet.jsp.JspException;
36  import javax.servlet.jsp.jstl.core.Config;
37  
38  import org.apache.myfaces.application.jsp.ServletViewResponseWrapper;
39  import org.apache.myfaces.shared.util.LocaleUtils;
40  
41  /**
42   * @author Manfred Geiler (latest modification by $Author$)
43   * @author Bruno Aranda (JSR-252)
44   * @version $Revision$ $Date$
45   */
46  public class ViewTag extends UIComponentELTag
47  {
48      //private static final Log log = LogFactory.getLog(ViewTag.class);
49      private static final Logger log = Logger.getLogger(ViewTag.class.getName());
50  
51      @Override
52      public String getComponentType()
53      {
54          return UIViewRoot.COMPONENT_TYPE;
55      }
56  
57      @Override
58      public String getRendererType()
59      {
60          return null;
61      }
62  
63      private ValueExpression _locale;
64      private ValueExpression _renderKitId;
65  
66      private MethodExpression _beforePhase;
67      private MethodExpression _afterPhase;
68  
69      public void setLocale(ValueExpression locale)
70      {
71          _locale = locale;
72      }
73  
74      public void setRenderKitId(ValueExpression renderKitId)
75      {
76          _renderKitId = renderKitId;
77      }
78  
79      public void setBeforePhase(MethodExpression beforePhase)
80      {
81          _beforePhase = beforePhase;
82      }
83  
84      public void setAfterPhase(MethodExpression afterPhase)
85      {
86          _afterPhase = afterPhase;
87      }
88  
89      @Override
90      public int doStartTag() throws JspException
91      {
92          if (log.isLoggable(Level.FINEST))
93          {
94              log.finest("entering ViewTag.doStartTag");
95          }
96  
97          FacesContext facesContext = FacesContext.getCurrentInstance();
98          Object response = facesContext.getExternalContext().getResponse();
99          if (response instanceof ServletViewResponseWrapper)
100         {
101             try
102             {
103                 pageContext.getOut().flush();
104                 ((ServletViewResponseWrapper)response).flushToWrappedResponse();
105             }
106             catch (IOException e)
107             {
108                 throw new JspException("Can't write content above <f:view> tag" + " " + e.getMessage());
109             }
110         }
111 
112         int retVal = super.doStartTag();
113 
114         Config.set(pageContext.getRequest(), Config.FMT_LOCALE, facesContext.getViewRoot().getLocale());
115 
116         if (log.isLoggable(Level.FINEST))
117         {
118             log.finest("leaving ViewTag.doStartTag");
119         }
120         return retVal;
121     }
122 
123     @Override
124     public int doEndTag() throws JspException
125     {
126         if (log.isLoggable(Level.FINEST))
127         {
128             log.finest("entering ViewTag.doEndTag");
129         }
130         int retVal = super.doEndTag();
131 
132         if (log.isLoggable(Level.FINEST))
133         {
134             log.finest("leaving ViewTag.doEndTag");
135         }
136         return retVal;
137     }
138 
139     @Override
140     public int doAfterBody() throws JspException
141     {
142         if (log.isLoggable(Level.FINEST))
143         {
144             log.finest("entering ViewTag.doAfterBody");
145         }
146 
147         UIComponent verbatimComp = createVerbatimComponentFromBodyContent();
148 
149         if (verbatimComp != null)
150         {
151             FacesContext.getCurrentInstance().getViewRoot().getChildren().add(verbatimComp);
152         }
153 
154         if (log.isLoggable(Level.FINEST))
155         {
156             log.finest("leaving ViewTag.doAfterBody");
157         }
158         return EVAL_PAGE;
159     }
160 
161     @Override
162     protected void setProperties(UIComponent component)
163     {
164         super.setProperties(component);
165 
166         FacesContext facesContext = FacesContext.getCurrentInstance();
167         ELContext elContext = facesContext.getELContext();
168 
169         UIViewRoot viewRoot = (UIViewRoot)component;
170 
171         // locale
172         if (_locale != null)
173         {
174             Locale locale;
175             if (_locale.isLiteralText())
176             {
177                 locale = LocaleUtils.toLocale(_locale.getValue(elContext).toString());
178             }
179             else
180             {
181                 component.setValueExpression("locale", _locale);
182 
183                 Object localeValue = _locale.getValue(elContext);
184 
185                 if (localeValue instanceof Locale)
186                 {
187                     locale = (Locale)localeValue;
188                 }
189                 else if (localeValue instanceof String)
190                 {
191                     locale = LocaleUtils.toLocale((String)localeValue);
192                 }
193                 else
194                 {
195                     if (localeValue != null)
196                     {
197                         throw new IllegalArgumentException("Locale or String class expected. Expression: " + _locale
198                                 + ". Return class: " + localeValue.getClass().getName());
199                     }
200 
201                     throw new IllegalArgumentException("Locale or String class expected. Expression: " + _locale
202                             + ". Return value null");
203                 }
204             }
205             viewRoot.setLocale(locale);
206             Config.set(pageContext.getRequest(), Config.FMT_LOCALE, locale);
207         }
208 
209         // renderkitId
210         if (_renderKitId != null)
211         {
212             if (_renderKitId.isLiteralText())
213             {
214                 viewRoot.setRenderKitId(_renderKitId.getValue(elContext).toString());
215             }
216             else
217             {
218                 viewRoot.setValueExpression("renderKitId", _renderKitId);
219                 viewRoot.setRenderKitId(null);
220             }
221         }
222         else if (viewRoot.getRenderKitId() == null)
223         {
224             String defaultRenderKitId = facesContext.getApplication().getDefaultRenderKitId();
225 
226             if (defaultRenderKitId != null)
227             {
228                 viewRoot.setRenderKitId(defaultRenderKitId);
229             }
230             else
231             {
232                 viewRoot.setRenderKitId(RenderKitFactory.HTML_BASIC_RENDER_KIT);
233             }
234         }
235 
236         // beforePhase
237         if (_beforePhase != null)
238         {
239             if (_beforePhase.isLiteralText())
240             {
241                 throw new FacesException("Invalid method expression for attribute 'beforePhase' in the view tag: "
242                         + _beforePhase.getExpressionString());
243             }
244 
245             viewRoot.setBeforePhaseListener(_beforePhase);
246 
247         }
248 
249         // afterPhase
250         if (_afterPhase != null)
251         {
252             if (_afterPhase.isLiteralText())
253             {
254                 throw new FacesException("Invalid method expression for attribute 'beforePhase' in the view tag: "
255                         + _afterPhase.getExpressionString());
256             }
257 
258             viewRoot.setAfterPhaseListener(_afterPhase);
259 
260         }
261     }
262 }