001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019 020 package org.apache.myfaces.tobago.context; 021 022 /* 023 * Created: 23.07.2002 14:21:58 024 * $Id: ClientProperties.java 1368577 2012-08-02 16:20:31Z lofwyr $ 025 */ 026 027 028 import org.apache.commons.logging.Log; 029 import org.apache.commons.logging.LogFactory; 030 import static org.apache.myfaces.tobago.TobagoConstants.ATTR_CLIENT_PROPERTIES; 031 import org.apache.myfaces.tobago.config.TobagoConfig; 032 033 import javax.faces.component.UIViewRoot; 034 import javax.faces.context.ExternalContext; 035 import javax.faces.context.FacesContext; 036 import java.io.Serializable; 037 import java.util.ArrayList; 038 import java.util.List; 039 import java.util.Locale; 040 041 public class ClientProperties implements Serializable { 042 private static final long serialVersionUID = -6719319982485268698L; 043 private static final String CLIENT_PROPERTIES_IN_SESSION = ClientProperties.class.getName(); 044 045 private static final Log LOG = LogFactory.getLog(ClientProperties.class); 046 047 private String contentType = "html"; 048 // TODO transient 049 private Theme theme; 050 private UserAgent userAgent = UserAgent.DEFAULT; 051 private boolean debugMode; 052 053 private String id; 054 055 private ClientProperties(TobagoConfig tobagoConfig) { 056 theme = tobagoConfig.getDefaultTheme(); 057 updateId(); 058 } 059 060 private ClientProperties(FacesContext facesContext) { 061 062 ExternalContext externalContext = facesContext.getExternalContext(); 063 064 // content type 065 String accept = (String) externalContext.getRequestHeaderMap().get("Accept"); 066 if (accept != null) { 067 if (accept.indexOf("text/vnd.wap.wml") > -1) { 068 contentType = "wml"; 069 } 070 } 071 if (LOG.isInfoEnabled()) { 072 LOG.info("contentType='" + contentType + "' from header " 073 + "Accept='" + accept + "'"); 074 } 075 076 // user agent 077 String requestUserAgent 078 = (String) externalContext.getRequestHeaderMap().get("User-Agent"); 079 this.userAgent = UserAgent.getInstance(requestUserAgent); 080 if (LOG.isInfoEnabled()) { 081 LOG.info("userAgent='" + this.userAgent + "' from header " 082 + "'User-Agent: " + requestUserAgent + "'"); 083 } 084 // debug mode 085 // to enable the debug mode for a user, put a 086 // "to-ba-go" custom locale to your browser 087 String acceptLanguage 088 = (String) externalContext.getRequestHeaderMap().get("Accept-Language"); 089 if (acceptLanguage != null) { 090 this.debugMode = acceptLanguage.indexOf("to-ba-go") > -1; 091 } 092 if (LOG.isInfoEnabled()) { 093 LOG.info("debug-mode=" + debugMode); 094 } 095 // theme 096 String requestTheme 097 = (String) externalContext.getRequestParameterMap().get("tobago.theme"); 098 TobagoConfig config = TobagoConfig.getInstance(facesContext); 099 this.theme = config.getTheme(requestTheme); 100 if (LOG.isInfoEnabled()) { 101 LOG.info("theme='" + theme.getName() + "' from requestParameter " 102 + "tobago.theme='" + requestTheme + "'"); 103 } 104 updateId(); 105 } 106 107 private void updateId() { 108 109 StringBuilder buffer = new StringBuilder(); 110 buffer.append(getContentType()); 111 buffer.append('/'); 112 buffer.append(getTheme().getName()); 113 buffer.append('/'); 114 buffer.append(getUserAgent()); 115 id = buffer.toString(); 116 UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot(); 117 if (viewRoot instanceof org.apache.myfaces.tobago.component.UIViewRoot) { 118 ((org.apache.myfaces.tobago.component.UIViewRoot) viewRoot).updateRendererCachePrefix(); 119 } 120 } 121 122 public static ClientProperties getDefaultInstance(FacesContext facesContext) { 123 return new ClientProperties(TobagoConfig.getInstance(facesContext)); 124 } 125 126 public static ClientProperties getInstance(UIViewRoot viewRoot) { 127 128 ClientProperties instance = (ClientProperties) 129 viewRoot.getAttributes().get(ATTR_CLIENT_PROPERTIES); 130 if (instance == null) { 131 LOG.error("No ClientProperties instance found creating new one"); 132 return getInstance(FacesContext.getCurrentInstance()); 133 } 134 return instance; 135 } 136 137 public static ClientProperties getInstance(FacesContext facesContext) { 138 139 ExternalContext context = facesContext.getExternalContext(); 140 141 boolean hasSession = context.getSession(false) != null; 142 143 ClientProperties client = null; 144 145 if (hasSession) { 146 client = (ClientProperties) context.getSessionMap().get( 147 CLIENT_PROPERTIES_IN_SESSION); 148 } 149 if (client == null) { 150 client = new ClientProperties(facesContext); 151 if (hasSession) { 152 context.getSessionMap().put(CLIENT_PROPERTIES_IN_SESSION, client); 153 } 154 } 155 return client; 156 } 157 158 public static List<String> getLocaleList( 159 Locale locale, boolean propertyPathMode) { 160 161 String string = locale.toString(); 162 String prefix = propertyPathMode ? "" : "_"; 163 List<String> locales = new ArrayList<String>(4); 164 locales.add(prefix + string); 165 int underscore; 166 while ((underscore = string.lastIndexOf('_')) > 0) { 167 string = string.substring(0, underscore); 168 locales.add(prefix + string); 169 } 170 171 locales.add(propertyPathMode ? "default" : ""); // default suffix 172 173 return locales; 174 } 175 176 public String getId() { 177 return id; 178 } 179 180 public String getContentType() { 181 return contentType; 182 } 183 184 public void setContentType(String contentType) { 185 this.contentType = contentType; 186 updateId(); 187 } 188 189 public Theme getTheme() { 190 return theme; 191 } 192 193 public void setTheme(Theme theme) { 194 this.theme = theme; 195 updateId(); 196 } 197 198 public UserAgent getUserAgent() { 199 return userAgent; 200 } 201 202 public void setUserAgent(UserAgent userAgent) { 203 this.userAgent = userAgent; 204 updateId(); 205 } 206 207 public boolean isDebugMode() { 208 return debugMode; 209 } 210 211 public void setDebugMode(boolean debugMode) { 212 this.debugMode = debugMode; 213 } 214 215 }