001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.commons.chain.web.javax.faces; 018 019import java.util.Collections; 020import java.util.HashMap; 021import java.util.Map; 022 023import javax.faces.context.FacesContext; 024import javax.servlet.http.Cookie; 025 026import org.apache.commons.chain.web.javax.WebContext; 027 028/** 029 * Concrete implementation of {@link WebContext} suitable for use in 030 * JavaServer Faces apps. The abstract methods are mapped to the appropriate 031 * collections of the underlying {@code FacesContext} instance 032 * that is passed to the constructor (or the initialize method). 033 * 034 * @author Craig R. McClanahan 035 * @version $Revision$ $Date$ 036 */ 037public class FacesWebContext extends WebContext { 038 private static final long serialVersionUID = -1429681424077509130L; 039 040 // ------------------------------------------------------ Instance Variables 041 042 /** 043 * The {@code FacesContext} instance for the request represented 044 * by this {@link WebContext}. 045 */ 046 private transient FacesContext context = null; 047 048 /** 049 * The lazily instantiated {@code Map} of cookies. 050 */ 051 private transient Map<String, Cookie> cookieValues = null; 052 053 // ------------------------------------------------------------ Constructors 054 055 /** 056 * Construct an uninitialized {@link FacesWebContext} instance. 057 */ 058 public FacesWebContext() { 059 } 060 061 /** 062 * Construct a {@link FacesWebContext} instance that is initialized 063 * with the specified JavaServer Faces API objects. 064 * 065 * @param context The {@code FacesContext} for this request 066 */ 067 public FacesWebContext(FacesContext context) { 068 initialize(context); 069 } 070 // ---------------------------------------------------------- Public Methods 071 072 /** 073 * Return the {@code FacesContext} instance for the request 074 * associated with this {@link FacesWebContext}. 075 * 076 * @return The {@code FacesContext} for this request 077 */ 078 public FacesContext getContext() { 079 return this.context; 080 } 081 082 /** 083 * Initialize (or reinitialize) this {@link FacesWebContext} instance 084 * for the specified JavaServer Faces API objects. 085 * 086 * @param context The {@code FacesContext} for this request 087 */ 088 public void initialize(FacesContext context) { 089 this.context = context; 090 } 091 092 /** 093 * Release references to allocated resources acquired in 094 * {@code initialize()} of via subsequent processing. After this 095 * method is called, subsequent calls to any other method than 096 * {@code initialize()} will return undefined results. 097 */ 098 public void release() { 099 context = null; 100 cookieValues = null; 101 } 102 103 // ------------------------------------------------------ WebContext Methods 104 105 /** 106 * See the {@link WebContext}'s Javadoc. 107 * 108 * @return Application scope Map. 109 */ 110 @Override 111 public Map<String, Object> getApplicationScope() { 112 return context.getExternalContext().getApplicationMap(); 113 } 114 115 /** 116 * See the {@link WebContext}'s Javadoc. 117 * 118 * @return Header values Map. 119 */ 120 @Override 121 public Map<String, String> getHeader() { 122 return context.getExternalContext().getRequestHeaderMap(); 123 } 124 125 /** 126 * See the {@link WebContext}'s Javadoc. 127 * 128 * @return Header values Map. 129 */ 130 @Override 131 public Map<String, String[]> getHeaderValues() { 132 return context.getExternalContext().getRequestHeaderValuesMap(); 133 } 134 135 /** 136 * See the {@link WebContext}'s Javadoc. 137 * 138 * @return Initialization parameter Map. 139 */ 140 @Override 141 public Map<String, String> getInitParam() { 142 return context.getExternalContext().getInitParameterMap(); 143 } 144 145 /** 146 * See the {@link WebContext}'s Javadoc. 147 * 148 * @return Request parameter Map. 149 */ 150 @Override 151 public Map<String, String> getParam() { 152 return context.getExternalContext().getRequestParameterMap(); 153 } 154 155 /** 156 * See the {@link WebContext}'s Javadoc. 157 * 158 * @return Request parameter Map. 159 */ 160 @Override 161 public Map<String, String[]> getParamValues() { 162 return context.getExternalContext().getRequestParameterValuesMap(); 163 } 164 165 /** 166 * See the {@link WebContext}'s Javadoc. 167 * 168 * @return Map of Cookies. 169 * @since Chain 1.1 170 */ 171 @Override 172 public Map<String, Cookie> getCookies() { 173 if (cookieValues == null) { 174 final Map<String, Object> cookiesSrc = context.getExternalContext().getRequestCookieMap(); 175 final Map<String, Cookie> cookiesDest = new HashMap<>(cookiesSrc.size()); 176 177 cookiesSrc.forEach((k, v) -> cookiesDest.put(k, (Cookie) v)); 178 179 cookieValues = Collections.unmodifiableMap(cookiesDest); 180 } 181 182 return cookieValues; 183 } 184 185 /** 186 * See the {@link WebContext}'s Javadoc. 187 * 188 * @return Request scope Map. 189 */ 190 @Override 191 public Map<String, Object> getRequestScope() { 192 return context.getExternalContext().getRequestMap(); 193 } 194 195 /** 196 * See the {@link WebContext}'s Javadoc. 197 * 198 * @return Session scope Map. 199 */ 200 @Override 201 public Map<String, Object> getSessionScope() { 202 return context.getExternalContext().getSessionMap(); 203 } 204}