jakarta.servlet.jsp.el.ImplicitObjectELResolver Maven / Gradle / Ivy
/*
* Copyright (c) 1997, 2020 Oracle and/or its affiliates and others.
* All rights reserved.
* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jakarta.servlet.jsp.el;
import java.beans.FeatureDescriptor;
import java.util.Iterator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import jakarta.servlet.ServletContext;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.jsp.PageContext;
import jakarta.servlet.jsp.JspContext;
import jakarta.el.PropertyNotWritableException;
import jakarta.el.ELContext;
import jakarta.el.ELResolver;
/**
* Defines variable resolution behavior for the EL implicit objects defined in the JSP specification.
*
*
* The following variables are resolved by this ELResolver
, as per the JSP specification:
*
*
* pageContext
- the PageContext
object.
* pageScope
- a Map
that maps page-scoped attribute names to their values.
* requestScope
- a Map
that maps request-scoped attribute names to their values.
* sessionScope
- a Map
that maps session-scoped attribute names to their values.
* applicationScope
- a Map
that maps application-scoped attribute names to their
* values.
* param
- a Map
that maps parameter names to a single String parameter value (obtained by
* calling ServletRequest.getParameter(String name)
).
* paramValues
- a Map
that maps parameter names to a String[]
of all
* values for that parameter (obtained by calling ServletRequest.getParameterValues(String name))
.
* header
- a Map
that maps header names to a single String header value (obtained by
* calling HttpServletRequest.getHeader(String name))
.
* headerValues
- a Map
that maps header names to a String[]
of all values
* for that header (obtained by calling HttpServletRequest.getHeaders(String))
.
* cookie
- a Map
that maps cookie names to a single Cookie
object. Cookies
* are retrieved according to the semantics of HttpServletRequest.getCookies()
. If the same name is shared
* by multiple cookies, an implementation must use the first one encountered in the array of Cookie
objects
* returned by the getCookies()
method. However, users of the cookie implicit object must be aware that the
* ordering of cookies is currently unspecified in the servlet specification.
* initParam
- a Map
that maps context initialization parameter names to their String
* parameter value (obtained by calling ServletContext.getInitParameter(String name))
.
*
*
* @see jakarta.el.ELResolver
* @since JSP 2.1
*/
public class ImplicitObjectELResolver extends ELResolver {
/**
* If the base object is null
, and the property matches the name of a JSP implicit object, returns the
* implicit object.
*
*
* The propertyResolved
property of the ELContext
object must be set to true
* by this resolver before returning if an implicit object is matched. If this property is not true
* after this method is called, the caller should ignore the return value.
*
*
* @param context The context of this evaluation.
* @param base Only null
is handled by this resolver. Other values will result in an immediate
* return.
* @param property The name of the implicit object to resolve.
* @return If the propertyResolved
property of ELContext
was set to true
,
* then the implicit object; otherwise undefined.
* @throws NullPointerException if context is null
*/
@Override
public Object getValue(ELContext context, Object base, Object property) {
if (context == null) {
throw new NullPointerException();
}
if (base != null) {
return null;
}
PageContext ctxt = (PageContext) context.getContext(JspContext.class);
if ("pageContext".equals(property)) {
context.setPropertyResolved(true);
return ctxt;
}
ImplicitObjects implicitObjects = ImplicitObjects.getImplicitObjects(ctxt);
if ("pageScope".equals(property)) {
context.setPropertyResolved(true);
return implicitObjects.getPageScopeMap();
}
if ("requestScope".equals(property)) {
context.setPropertyResolved(true);
return implicitObjects.getRequestScopeMap();
}
if ("sessionScope".equals(property)) {
context.setPropertyResolved(true);
return implicitObjects.getSessionScopeMap();
}
if ("applicationScope".equals(property)) {
context.setPropertyResolved(true);
return implicitObjects.getApplicationScopeMap();
}
if ("param".equals(property)) {
context.setPropertyResolved(true);
return implicitObjects.getParamMap();
}
if ("paramValues".equals(property)) {
context.setPropertyResolved(true);
return implicitObjects.getParamsMap();
}
if ("header".equals(property)) {
context.setPropertyResolved(true);
return implicitObjects.getHeaderMap();
}
if ("headerValues".equals(property)) {
context.setPropertyResolved(true);
return implicitObjects.getHeadersMap();
}
if ("initParam".equals(property)) {
context.setPropertyResolved(true);
return implicitObjects.getInitParamMap();
}
if ("cookie".equals(property)) {
context.setPropertyResolved(true);
return implicitObjects.getCookieMap();
}
return null;
}
/**
* If the base object is null
, and the property matches the name of a JSP implicit object, returns
* null
to indicate that no types are ever accepted to setValue()
.
*
*
* The propertyResolved
property of the ELContext
object must be set to true
* by this resolver before returning if an implicit object is matched. If this property is not true
* after this method is called, the caller should ignore the return value.
*
*
* @param context The context of this evaluation.
* @param base Only null
is handled by this resolver. Other values will result in an immediate
* return.
* @param property The name of the implicit object to resolve.
* @return If the propertyResolved
property of ELContext
was set to true
,
* then null
; otherwise undefined.
* @throws NullPointerException if context is null
*/
@Override
public Class> getType(ELContext context, Object base, Object property) {
if (context == null) {
throw new NullPointerException();
}
if ((base == null) && ("pageContext".equals(property) || "pageScope".equals(property))
|| "requestScope".equals(property) || "sessionScope".equals(property)
|| "applicationScope".equals(property) || "param".equals(property) || "paramValues".equals(property)
|| "header".equals(property) || "headerValues".equals(property) || "initParam".equals(property)
|| "cookie".equals(property)) {
context.setPropertyResolved(true);
}
return null;
}
/**
* If the base object is null
, and the property matches the name of a JSP implicit object, throws
* PropertyNotWritableException
to indicate that implicit objects cannot be overwritten.
*
*
* The propertyResolved
property of the ELContext
object must be set to true
* by this resolver before returning if an implicit object is matched. If this property is not true
* after this method is called, the caller should ignore the return value.
*
*
* @param context The context of this evaluation.
* @param base Only null
is handled by this resolver. Other values will result in an immediate
* return.
* @param property The name of the implicit object.
* @param val The value to be associated with the implicit object.
* @throws NullPointerException if context is null
.
* @throws PropertyNotWritableException always thrown, if the implicit object name is recognized by this resolver.
*/
@Override
public void setValue(ELContext context, Object base, Object property, Object val) {
if (context == null) {
throw new NullPointerException();
}
if ((base == null) && ("pageContext".equals(property) || "pageScope".equals(property))
|| "requestScope".equals(property) || "sessionScope".equals(property)
|| "applicationScope".equals(property) || "param".equals(property) || "paramValues".equals(property)
|| "header".equals(property) || "headerValues".equals(property) || "initParam".equals(property)
|| "cookie".equals(property)) {
throw new PropertyNotWritableException();
}
}
/**
* If the base object is null
, and the property matches the name of a JSP implicit object, returns
* true
to indicate that implicit objects cannot be overwritten.
*
*
* The propertyResolved
property of the ELContext
object must be set to true
* by this resolver before returning if an implicit object is matched. If this property is not true
* after this method is called, the caller should ignore the return value.
*
*
* @param context The context of this evaluation.
* @param base Only null
is handled by this resolver. Other values will result in an immediate
* return.
* @param property The name of the implicit object.
* @return If the propertyResolved
property of ELContext
was set to true
,
* then true
; otherwise undefined.
* @throws NullPointerException if context is null
.
*/
@Override
public boolean isReadOnly(ELContext context, Object base, Object property) {
if (context == null) {
throw new NullPointerException();
}
if ((base == null) && ("pageContext".equals(property) || "pageScope".equals(property))
|| "requestScope".equals(property) || "sessionScope".equals(property)
|| "applicationScope".equals(property) || "param".equals(property) || "paramValues".equals(property)
|| "header".equals(property) || "headerValues".equals(property) || "initParam".equals(property)
|| "cookie".equals(property)) {
context.setPropertyResolved(true);
return true;
}
return false; // Doesn't matter
}
/**
* If the base object is null
, and the property matches the name of a JSP implicit object, returns an
* Iterator
containing FeatureDescriptor
objects with information about each JSP implicit
* object resolved by this resolver. Otherwise, returns null
.
*
*
* The Iterator
returned must contain one instance of {@link java.beans.FeatureDescriptor} for each of
* the EL implicit objects defined by the JSP spec. Each info object contains information about a single implicit
* object, and is initialized as follows:
*
*
* - displayName
- - The name of the implicit object.
* - name
- - Same as displayName property.
* - shortDescription
- - A suitable description for the implicit object. Will vary by implementation.
* - expert
- -
false
* - hidden
- -
false
* - preferred
- -
true
*
* In addition, the following named attributes must be set in the returned FeatureDescriptor
s:
*
* - {@link ELResolver#TYPE}
- - The runtime type of the implicit object.
* - {@link ELResolver#RESOLVABLE_AT_DESIGN_TIME}
- -
true
.
*
*
* @param context The context of this evaluation.
* @param base Only null
is handled by this resolver. Other values will result in a
* null
return value.
* @return An Iterator
containing one FeatureDescriptor
object for each implicit object,
* or null
if base
is not null
.
*/
@Override
public Iterator getFeatureDescriptors(ELContext context, Object base) {
ArrayList list = new ArrayList<>(11);
// pageContext
FeatureDescriptor descriptor = new FeatureDescriptor();
descriptor.setName("pageContext");
descriptor.setDisplayName("pageContext");
// descriptor.setShortDescription("");
descriptor.setExpert(false);
descriptor.setHidden(false);
descriptor.setPreferred(true);
descriptor.setValue("type", PageContext.class);
descriptor.setValue("resolvableAtDesignTime", Boolean.TRUE);
list.add(descriptor);
// pageScope
descriptor = new FeatureDescriptor();
descriptor.setName("pageScope");
descriptor.setDisplayName("pageScope");
// descriptor.setShortDescription("");
descriptor.setExpert(false);
descriptor.setHidden(false);
descriptor.setPreferred(true);
descriptor.setValue("type", Map.class);
descriptor.setValue("resolvableAtDesignTime", Boolean.TRUE);
list.add(descriptor);
// requestScope
descriptor = new FeatureDescriptor();
descriptor.setName("requestScope");
descriptor.setDisplayName("requestScope");
// descriptor.setShortDescription("");
descriptor.setExpert(false);
descriptor.setHidden(false);
descriptor.setPreferred(true);
descriptor.setValue("type", Map.class);
descriptor.setValue("resolvableAtDesignTime", Boolean.TRUE);
list.add(descriptor);
// sessionScope
descriptor = new FeatureDescriptor();
descriptor.setName("sessionScope");
descriptor.setDisplayName("sessionScope");
// descriptor.setShortDescription("");
descriptor.setExpert(false);
descriptor.setHidden(false);
descriptor.setPreferred(true);
descriptor.setValue("type", Map.class);
descriptor.setValue("resolvableAtDesignTime", Boolean.TRUE);
list.add(descriptor);
// applicationScope
descriptor = new FeatureDescriptor();
descriptor.setName("applicationScope");
descriptor.setDisplayName("applicationScope");
// descriptor.setShortDescription("");
descriptor.setExpert(false);
descriptor.setHidden(false);
descriptor.setPreferred(true);
descriptor.setValue("type", Map.class);
descriptor.setValue("resolvableAtDesignTime", Boolean.TRUE);
list.add(descriptor);
// param
descriptor = new FeatureDescriptor();
descriptor.setName("param");
descriptor.setDisplayName("param");
// descriptor.setShortDescription("");
descriptor.setExpert(false);
descriptor.setHidden(false);
descriptor.setPreferred(true);
descriptor.setValue("type", Map.class);
descriptor.setValue("resolvableAtDesignTime", Boolean.TRUE);
list.add(descriptor);
// paramValues
descriptor = new FeatureDescriptor();
descriptor.setName("paramValues");
descriptor.setDisplayName("paramValues");
// descriptor.setShortDescription("");
descriptor.setExpert(false);
descriptor.setHidden(false);
descriptor.setPreferred(true);
descriptor.setValue("type", Map.class);
descriptor.setValue("resolvableAtDesignTime", Boolean.TRUE);
list.add(descriptor);
// header
descriptor = new FeatureDescriptor();
descriptor.setName("header");
descriptor.setDisplayName("header");
// descriptor.setShortDescription("");
descriptor.setExpert(false);
descriptor.setHidden(false);
descriptor.setPreferred(true);
descriptor.setValue("type", Map.class);
descriptor.setValue("resolvableAtDesignTime", Boolean.TRUE);
list.add(descriptor);
// headerValues
descriptor = new FeatureDescriptor();
descriptor.setName("headerValues");
descriptor.setDisplayName("headerValues");
// descriptor.setShortDescription("");
descriptor.setExpert(false);
descriptor.setHidden(false);
descriptor.setPreferred(true);
descriptor.setValue("type", Map.class);
descriptor.setValue("resolvableAtDesignTime", Boolean.TRUE);
list.add(descriptor);
// cookie
descriptor = new FeatureDescriptor();
descriptor.setName("cookie");
descriptor.setDisplayName("cookie");
// descriptor.setShortDescription("");
descriptor.setExpert(false);
descriptor.setHidden(false);
descriptor.setPreferred(true);
descriptor.setValue("type", Map.class);
descriptor.setValue("resolvableAtDesignTime", Boolean.TRUE);
list.add(descriptor);
// initParam
descriptor = new FeatureDescriptor();
descriptor.setName("initParam");
descriptor.setDisplayName("initParam");
// descriptor.setShortDescription("");
descriptor.setExpert(false);
descriptor.setHidden(false);
descriptor.setPreferred(true);
descriptor.setValue("type", Map.class);
descriptor.setValue("resolvableAtDesignTime", Boolean.TRUE);
list.add(descriptor);
return list.iterator();
}
/**
* If the base object is null
, returns String.class
. Otherwise, returns null
.
*
* @param context The context of this evaluation.
* @param base Only null
is handled by this resolver. Other values will result in a
* null
return value.
* @return null
if base is not null
; otherwise String.class
.
*/
@Override
public Class getCommonPropertyType(ELContext context, Object base) {
if (base == null) {
return String.class;
}
return null;
}
// XXX - I moved this class from commons-el to an inner class here
// so that we do not have a dependency from the JSP APIs into commons-el.
// There might be a better way to do this.
/**
*
* This class is used to generate the implicit Map and List objects that wrap various elements of the PageContext.
* It also returns the correct implicit object for a given implicit object name.
*
* @author Nathan Abramson - Art Technology Group
*/
private static class ImplicitObjects {
// -------------------------------------
// Constants
// -------------------------------------
// XXX - This probably needs to change, now that this is in a
// standard pkg.
static final String sAttributeName = "org.apache.taglibs.standard.ImplicitObjects";
// -------------------------------------
// Member variables
// -------------------------------------
PageContext mContext;
Map mPage;
Map mRequest;
Map mSession;
Map mApplication;
Map mParam;
Map mParams;
Map mHeader;
Map mHeaders;
Map mInitParam;
Map mCookie;
/**
*
* Constructor
*
* @param pContext The PageContext for which this instance is to be constructed
*/
public ImplicitObjects(PageContext pContext) {
mContext = pContext;
}
/**
*
* @param pContext The PageContext for which the ImplicitObjects instance is required
* @return the ImplicitObjects associated with the PageContext, creating it if it doesn't yet exist.
*/
public static ImplicitObjects getImplicitObjects(PageContext pContext) {
ImplicitObjects objs = (ImplicitObjects) pContext.getAttribute(sAttributeName, PageContext.PAGE_SCOPE);
if (objs == null) {
objs = new ImplicitObjects(pContext);
pContext.setAttribute(sAttributeName, objs, PageContext.PAGE_SCOPE);
}
return objs;
}
/**
*
* @return the Map that "wraps" page-scoped attributes
*/
public Map getPageScopeMap() {
if (mPage == null) {
mPage = createPageScopeMap(mContext);
}
return mPage;
}
/**
*
* @return the Map that "wraps" request-scoped attributes
*/
public Map getRequestScopeMap() {
if (mRequest == null) {
mRequest = createRequestScopeMap(mContext);
}
return mRequest;
}
/**
*
* @return the Map that "wraps" session-scoped attributes
*/
public Map getSessionScopeMap() {
if (mSession == null) {
mSession = createSessionScopeMap(mContext);
}
return mSession;
}
/**
*
* @return the Map that "wraps" application-scoped attributes
*/
public Map getApplicationScopeMap() {
if (mApplication == null) {
mApplication = createApplicationScopeMap(mContext);
}
return mApplication;
}
/**
*
* @return the Map that maps parameter name to a single parameter values.
*/
public Map getParamMap() {
if (mParam == null) {
mParam = createParamMap(mContext);
}
return mParam;
}
/**
*
* @return the Map that maps parameter name to an array of parameter values.
*/
public Map getParamsMap() {
if (mParams == null) {
mParams = createParamsMap(mContext);
}
return mParams;
}
/**
*
* @return the Map that maps header name to a single header values.
*/
public Map getHeaderMap() {
if (mHeader == null) {
mHeader = createHeaderMap(mContext);
}
return mHeader;
}
/**
*
* @return the Map that maps header name to an array of header values.
*/
public Map getHeadersMap() {
if (mHeaders == null) {
mHeaders = createHeadersMap(mContext);
}
return mHeaders;
}
/**
*
* @return the Map that maps init parameter name to a single init parameter values.
*/
public Map getInitParamMap() {
if (mInitParam == null) {
mInitParam = createInitParamMap(mContext);
}
return mInitParam;
}
/**
*
* @return the Map that maps cookie name to the first matching Cookie in request.getCookies().
*/
public Map getCookieMap() {
if (mCookie == null) {
mCookie = createCookieMap(mContext);
}
return mCookie;
}
// -------------------------------------
// Methods for generating wrapper maps
// -------------------------------------
/**
*
* Creates the Map that "wraps" page-scoped attributes
*
* @param pContext The PageContext for which the Map should be produced
*
* @return the Map that "wraps" page-scoped attributes
*/
public static Map createPageScopeMap(PageContext pContext) {
final PageContext context = pContext;
return new EnumeratedMap() {
@Override
public Enumeration enumerateKeys() {
return context.getAttributeNamesInScope(PageContext.PAGE_SCOPE);
}
@Override
public Object getValue(Object pKey) {
if (pKey instanceof String) {
return context.getAttribute((String) pKey, PageContext.PAGE_SCOPE);
} else {
return null;
}
}
@Override
public boolean isMutable() {
return true;
}
};
}
/**
*
* Creates the Map that "wraps" request-scoped attributes
*
* @param pContext The PageContext for which the Map should be produced
*
* @return the Map that "wraps" request-scoped attributes
*/
public static Map createRequestScopeMap(PageContext pContext) {
final PageContext context = pContext;
return new EnumeratedMap() {
@Override
public Enumeration enumerateKeys() {
return context.getAttributeNamesInScope(PageContext.REQUEST_SCOPE);
}
@Override
public Object getValue(Object pKey) {
if (pKey instanceof String) {
return context.getAttribute((String) pKey, PageContext.REQUEST_SCOPE);
} else {
return null;
}
}
@Override
public boolean isMutable() {
return true;
}
};
}
/**
*
* Creates the Map that "wraps" session-scoped attributes
*
* @param pContext The PageContext for which the Map should be produced
*
* @return the Map that "wraps" session-scoped attributes
*/
public static Map createSessionScopeMap(PageContext pContext) {
final PageContext context = pContext;
return new EnumeratedMap() {
@Override
public Enumeration enumerateKeys() {
return context.getAttributeNamesInScope(PageContext.SESSION_SCOPE);
}
@Override
public Object getValue(Object pKey) {
if (pKey instanceof String) {
return context.getAttribute((String) pKey, PageContext.SESSION_SCOPE);
} else {
return null;
}
}
@Override
public boolean isMutable() {
return true;
}
};
}
/**
*
* Creates the Map that "wraps" application-scoped attributes
*
* @param pContext The PageContext for which the Map should be produced
*
* @return the Map that "wraps" application-scoped attributes
*/
public static Map createApplicationScopeMap(PageContext pContext) {
final PageContext context = pContext;
return new EnumeratedMap() {
@Override
public Enumeration enumerateKeys() {
return context.getAttributeNamesInScope(PageContext.APPLICATION_SCOPE);
}
@Override
public Object getValue(Object pKey) {
if (pKey instanceof String) {
return context.getAttribute((String) pKey, PageContext.APPLICATION_SCOPE);
} else {
return null;
}
}
@Override
public boolean isMutable() {
return true;
}
};
}
/**
*
* Creates the Map that maps parameter name to single parameter value.
*
* @param pContext The PageContext for which the Map should be produced
*
* @return the Map that maps parameter name to single parameter value
*/
public static Map createParamMap(PageContext pContext) {
final HttpServletRequest request = (HttpServletRequest) pContext.getRequest();
return new EnumeratedMap() {
@Override
public Enumeration enumerateKeys() {
return request.getParameterNames();
}
@Override
public String getValue(Object pKey) {
if (pKey instanceof String) {
return request.getParameter((String) pKey);
} else {
return null;
}
}
@Override
public boolean isMutable() {
return false;
}
};
}
/**
*
* Creates the Map that maps parameter name to an array of parameter values.
*
* @param pContext The PageContext for which the Map should be produced
*
* @return the Map that maps parameter name to an array of parameter values.
*/
public static Map createParamsMap(PageContext pContext) {
final HttpServletRequest request = (HttpServletRequest) pContext.getRequest();
return new EnumeratedMap() {
@Override
public Enumeration enumerateKeys() {
return request.getParameterNames();
}
@Override
public String[] getValue(Object pKey) {
if (pKey instanceof String) {
return request.getParameterValues((String) pKey);
} else {
return null;
}
}
@Override
public boolean isMutable() {
return false;
}
};
}
/**
*
* Creates the Map that maps header name to single header value.
*
* @param pContext The PageContext for which the Map should be produced
*
* @return the Map that maps header name to single header value
*/
public static Map createHeaderMap(PageContext pContext) {
final HttpServletRequest request = (HttpServletRequest) pContext.getRequest();
return new EnumeratedMap() {
@Override
public Enumeration enumerateKeys() {
return request.getHeaderNames();
}
@Override
public String getValue(Object pKey) {
if (pKey instanceof String) {
return request.getHeader((String) pKey);
} else {
return null;
}
}
@Override
public boolean isMutable() {
return false;
}
};
}
/**
*
* Creates the Map that maps header name to an array of header values.
*
* @param pContext The PageContext for which the Map should be produced
*
* @return the Map that maps header name to an array of header values
*/
public static Map createHeadersMap(PageContext pContext) {
final HttpServletRequest request = (HttpServletRequest) pContext.getRequest();
return new EnumeratedMap() {
@Override
public Enumeration enumerateKeys() {
return request.getHeaderNames();
}
@Override
public String[] getValue(Object pKey) {
if (pKey instanceof String) {
// Drain the header enumeration
List l = new ArrayList<>();
Enumeration e = request.getHeaders((String) pKey);
if (e != null) {
while (e.hasMoreElements()) {
l.add(e.nextElement());
}
}
return l.toArray(new String[l.size()]);
} else {
return null;
}
}
@Override
public boolean isMutable() {
return false;
}
};
}
/**
*
* Creates the Map that maps init parameter name to single init parameter value.
*
* @param pContext The PageContext for which the Map should be produced
*
* @return the Map that maps init parameter name to single init parameter value.
*/
public static Map createInitParamMap(PageContext pContext) {
final ServletContext context = pContext.getServletContext();
return new EnumeratedMap() {
@Override
public Enumeration enumerateKeys() {
return context.getInitParameterNames();
}
@Override
public String getValue(Object pKey) {
if (pKey instanceof String) {
return context.getInitParameter((String) pKey);
} else {
return null;
}
}
@Override
public boolean isMutable() {
return false;
}
};
}
/**
*
* Creates the Map that maps cookie name to the first matching Cookie in request.getCookies().
*
* @param pContext The PageContext for which the Map should be produced
*
* @return the Map that maps cookie name to the first matching Cookie in request.getCookies().
*/
public static Map createCookieMap(PageContext pContext) {
// Read all the cookies and construct the entire map
HttpServletRequest request = (HttpServletRequest) pContext.getRequest();
Cookie[] cookies = request.getCookies();
Map ret = new HashMap<>();
for (int i = 0; cookies != null && i < cookies.length; i++) {
Cookie cookie = cookies[i];
if (cookie != null) {
String name = cookie.getName();
if (!ret.containsKey(name)) {
ret.put(name, cookie);
}
}
}
return ret;
}
}
// XXX - I moved this class from commons-el to an inner class here
// so that we do not have a dependency from the JSP APIs into commons-el.
// There might be a better way to do this.
/**
*
* This is a Map implementation driven by a data source that only provides an enumeration of keys and a
* getValue(key) method. This class must be subclassed to implement those methods.
*
*
* Some of the methods may incur a performance penalty that involves enumerating the entire data source. In these
* cases, the Map will try to save the results of that enumeration, but only if the underlying data source is
* immutable.
*
* @author Nathan Abramson - Art Technology Group
*/
private static abstract class EnumeratedMap implements Map {
// -------------------------------------
// Member variables
// -------------------------------------
Map mMap;
@Override
public void clear() {
throw new UnsupportedOperationException();
}
@Override
public boolean containsKey(Object pKey) {
return getValue(pKey) != null;
}
@Override
public boolean containsValue(Object pValue) {
return getAsMap().containsValue(pValue);
}
@Override
public Set> entrySet() {
return getAsMap().entrySet();
}
@Override
public V get(Object pKey) {
return getValue(pKey);
}
@Override
public boolean isEmpty() {
return !enumerateKeys().hasMoreElements();
}
@Override
public Set keySet() {
return getAsMap().keySet();
}
@Override
public V put(K pKey, V pValue) {
throw new UnsupportedOperationException();
}
@Override
public void putAll(Map extends K, ? extends V> pMap) {
throw new UnsupportedOperationException();
}
@Override
public V remove(Object pKey) {
throw new UnsupportedOperationException();
}
@Override
public int size() {
return getAsMap().size();
}
@Override
public Collection values() {
return getAsMap().values();
}
// -------------------------------------
// Abstract methods
// -------------------------------------
/**
*
* @return an enumeration of the keys
*/
public abstract Enumeration enumerateKeys();
/**
*
* @return true if it is possible for this data source to change
*/
public abstract boolean isMutable();
/**
*
* @param pKey The key for which the value should be obtained
* @return the value associated with the given key, or null if not found.
*/
public abstract V getValue(Object pKey);
/**
*
* Converts the MapSource to a Map. If the map is not mutable, this is cached
*
* @return A Map created from the source Enumeration
*/
public Map getAsMap() {
if (mMap != null) {
return mMap;
} else {
Map m = convertToMap();
if (!isMutable()) {
mMap = m;
}
return m;
}
}
/**
*
* Converts to a Map
*/
Map convertToMap() {
Map ret = new HashMap<>();
for (Enumeration e = enumerateKeys(); e.hasMoreElements();) {
K key = e.nextElement();
V value = getValue(key);
ret.put(key, value);
}
return ret;
}
}
}