blob: b9a3121e8aaa41dcfb6a9b09203365ee50d6d88f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.taglibs.standard.tag.common.xml;
import java.util.HashMap;
import java.util.Map;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.jsp.PageContext;
import javax.xml.transform.TransformerException;
import org.apache.taglibs.standard.resources.Resources;
import org.apache.xml.utils.QName;
import org.apache.xpath.VariableStack;
import org.apache.xpath.XPathContext;
import org.apache.xpath.objects.XObject;
import org.apache.xpath.objects.XObjectFactory;
/**
*/
public class JSTLVariableStack extends VariableStack {
private static enum Scope {
PARAM,
HEADER,
COOKIE,
INITPARAM,
PAGE,
REQUEST,
SESSION,
APPLICATION
}
// Prefixes for JSTL implicit variables
private static final String PARAM_PREFIX = "param";
private static final String HEADER_PREFIX = "header";
private static final String COOKIE_PREFIX = "cookie";
private static final String INITPARAM_PREFIX = "initParam";
private static final String PAGE_PREFIX = "pageScope";
private static final String REQUEST_PREFIX = "requestScope";
private static final String SESSION_PREFIX = "sessionScope";
private static final String APP_PREFIX = "applicationScope";
// map prefixes to scopes
private static final Map<String, Scope> SCOPES;
static {
SCOPES = new HashMap<>(8);
SCOPES.put(PARAM_PREFIX, Scope.PARAM);
SCOPES.put(HEADER_PREFIX, Scope.HEADER);
SCOPES.put(COOKIE_PREFIX, Scope.COOKIE);
SCOPES.put(INITPARAM_PREFIX, Scope.INITPARAM);
SCOPES.put(PAGE_PREFIX, Scope.PAGE);
SCOPES.put(REQUEST_PREFIX, Scope.REQUEST);
SCOPES.put(SESSION_PREFIX, Scope.SESSION);
SCOPES.put(APP_PREFIX, Scope.APPLICATION);
}
private final PageContext pageContext;
public JSTLVariableStack(PageContext pageContext) {
super(2);
this.pageContext = pageContext;
}
@Override
public XObject getVariableOrParam(XPathContext xctxt, QName qname) throws TransformerException {
String prefix = qname.getNamespaceURI();
String name = qname.getLocalPart();
Object value = getValue(prefix, name);
if (value == null) {
StringBuilder var = new StringBuilder();
var.append('$');
if (prefix != null) {
var.append(prefix);
var.append(':');
}
var.append(name);
throw new TransformerException(Resources.getMessage("XPATH_UNABLE_TO_RESOLVE_VARIABLE", var.toString()));
}
return XObjectFactory.create(value, xctxt);
}
private Object getValue(String prefix, String name) {
if (prefix == null) {
return pageContext.findAttribute(name);
}
Scope scope = SCOPES.get(prefix);
switch (scope) {
case PARAM:
return pageContext.getRequest().getParameter(name);
case HEADER:
return ((HttpServletRequest) pageContext.getRequest()).getHeader(name);
case COOKIE:
Cookie[] cookies = ((HttpServletRequest) pageContext.getRequest()).getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals(name)) {
return cookie.getValue();
}
}
}
return null;
case INITPARAM:
return pageContext.getServletContext().getInitParameter(name);
case PAGE:
return pageContext.getAttribute(name, PageContext.PAGE_SCOPE);
case REQUEST:
return pageContext.getAttribute(name, PageContext.REQUEST_SCOPE);
case SESSION:
return pageContext.getAttribute(name, PageContext.SESSION_SCOPE);
case APPLICATION:
return pageContext.getAttribute(name, PageContext.APPLICATION_SCOPE);
default:
throw new AssertionError();
}
}
}