1 /* 2 * $Id$ 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 package org.apache.struts.faces.application; 23 24 25 import java.io.IOException; 26 import java.util.Locale; 27 28 import org.apache.struts.Globals; 29 import org.slf4j.Logger; 30 import org.slf4j.LoggerFactory; 31 32 import jakarta.faces.FacesException; 33 import jakarta.faces.application.ViewHandler; 34 import jakarta.faces.application.ViewHandlerWrapper; 35 import jakarta.faces.component.UIViewRoot; 36 import jakarta.faces.context.ExternalContext; 37 import jakarta.faces.context.FacesContext; 38 39 40 /** 41 * Custom {@code ViewHandler} implementation that adds features 42 * specific to the Struts-Faces Integration Library. It leverages the 43 * "decorator pattern" customization strategy that JSF supports, by 44 * delegating most processing to the {@code ViewHandler} instance 45 * handed to our constructor. 46 */ 47 public class ViewHandlerImpl extends ViewHandlerWrapper { 48 49 50 // -------------------------------------------------------- Static Variables 51 52 53 /** 54 * The {@code Log} instance for this class. 55 */ 56 private final Logger log = 57 LoggerFactory.getLogger(ViewHandlerImpl.class); 58 59 60 // ------------------------------------------------------------ Constructors 61 62 63 /** 64 * Construct a {@code ViewHandlerImpl} decorating the 65 * specified {@code ViewHandler} instance. 66 * 67 * @param oldViewHandler {@code ViewHandler} to be decorated 68 */ 69 public ViewHandlerImpl(ViewHandler oldViewHandler) { 70 super(oldViewHandler); 71 log.debug("Creating ViewHandler instance, wrapping handler {}", 72 oldViewHandler); 73 } 74 75 76 // ----------------------------------------------------- Specialized Methods 77 78 79 /** 80 * If the Struts application has set a {@code Locale}, pass it 81 * on to JSF prior to delegating the actual rendering. 82 * 83 * @param context {@code FacesContext} for the current request 84 * @param viewToRender {@code UIViewRoot} to be rendered 85 */ 86 @Override 87 public void renderView(FacesContext context, UIViewRoot viewToRender) 88 throws IOException, FacesException { 89 90 log.debug("renderView({})", viewToRender.getViewId()); 91 ExternalContext econtext = context.getExternalContext(); 92 if (econtext.getSession(false) != null) { 93 Locale locale = (Locale) 94 econtext.getSessionMap().get(Globals.LOCALE_KEY); 95 if (locale != null) { 96 log.trace("Setting view locale to {}", locale); 97 viewToRender.setLocale(locale); 98 } 99 } 100 super.renderView(context, viewToRender); 101 } 102 }