blob: 40f2fa913b9f67c1ee0dcadcb6ddb2cefb1e9038 [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.sling.scripting.jsp;
import java.io.IOException;
import java.io.Writer;
import java.util.Enumeration;
import javax.el.ELContext;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.ErrorData;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.el.ExpressionEvaluator;
import javax.servlet.jsp.el.VariableResolver;
import javax.servlet.jsp.tagext.BodyContent;
import org.apache.sling.api.scripting.SlingBindings;
import org.apache.sling.scripting.jsp.jasper.compiler.JspRuntimeContext;
/**
* <p>
* The {@code SlingJspPageContext} wraps the default Jasper {@link org.apache.sling.scripting.jsp.jasper.runtime.PageContextImpl} when
* the {@link SlingBindings} are available in the request's attributes. The purpose of this slightly customised {@link PageContext}
* implementation is to enhance the default {@code pageContext} with the {@link SlingBindings} map's values, as long as the default {@code
* pageContext} doesn't already contain identically named attributes.
* </p>
* <br/>
* <p>For more details check
* {@link JspRuntimeContext.JspFactoryHandler#getPageContext(javax.servlet.Servlet, javax.servlet.ServletRequest, javax.servlet.ServletResponse, java.lang.String, boolean, int, boolean)}.</p>
*/
public class SlingJspPageContext extends PageContext {
private final PageContext wrapped;
private final SlingBindings slingBindings;
private final ELContext elContext;
public SlingJspPageContext(PageContext wrapped, SlingBindings slingBindings) {
this.wrapped = wrapped;
this.slingBindings = slingBindings;
elContext = wrapped.getELContext();
elContext.putContext(JspContext.class, this);
}
@Override
public void initialize(Servlet servlet, ServletRequest servletRequest, ServletResponse servletResponse, String s, boolean b, int i,
boolean b1) throws IOException, IllegalStateException, IllegalArgumentException {
wrapped.initialize(servlet, servletRequest, servletResponse, s, b, i, b1);
}
@Override
public void release() {
wrapped.release();
}
@Override
public HttpSession getSession() {
return wrapped.getSession();
}
@Override
public Object getPage() {
return wrapped.getPage();
}
@Override
public ServletRequest getRequest() {
return wrapped.getRequest();
}
@Override
public ServletResponse getResponse() {
return wrapped.getResponse();
}
@Override
public Exception getException() {
return wrapped.getException();
}
@Override
public ServletConfig getServletConfig() {
return wrapped.getServletConfig();
}
@Override
public ServletContext getServletContext() {
return wrapped.getServletContext();
}
@Override
public void forward(String s) throws ServletException, IOException {
wrapped.forward(s);
}
@Override
public void include(String s) throws ServletException, IOException {
wrapped.include(s);
}
@Override
public void include(String s, boolean b) throws ServletException, IOException {
wrapped.include(s, b);
}
@Override
public void handlePageException(Exception e) throws ServletException, IOException {
wrapped.handlePageException(e);
}
@Override
public void handlePageException(Throwable throwable) throws ServletException, IOException {
wrapped.handlePageException(throwable);
}
@Override
public void setAttribute(String s, Object o) {
wrapped.setAttribute(s, o);
}
@Override
public void setAttribute(String s, Object o, int i) {
wrapped.setAttribute(s, o, i);
}
@Override
public Object getAttribute(String s) {
Object attribute = wrapped.getAttribute(s);
if (attribute == null) {
attribute = slingBindings.get(s);
}
return attribute;
}
@Override
public Object getAttribute(String s, int i) {
return wrapped.getAttribute(s, i);
}
@Override
public Object findAttribute(String s) {
Object attribute = wrapped.findAttribute(s);
if (attribute == null) {
attribute = slingBindings.get(s);
}
return attribute;
}
@Override
public void removeAttribute(String s) {
wrapped.removeAttribute(s);
}
@Override
public void removeAttribute(String s, int i) {
wrapped.removeAttribute(s, i);
}
@Override
public int getAttributesScope(String s) {
return wrapped.getAttributesScope(s);
}
@Override
public Enumeration<String> getAttributeNamesInScope(int i) {
return wrapped.getAttributeNamesInScope(i);
}
@Override
public JspWriter getOut() {
return wrapped.getOut();
}
@Override
public ExpressionEvaluator getExpressionEvaluator() {
return wrapped.getExpressionEvaluator();
}
@Override
public ELContext getELContext() {
return elContext;
}
@Override
public VariableResolver getVariableResolver() {
return wrapped.getVariableResolver();
}
@Override
public BodyContent pushBody() {
return wrapped.pushBody();
}
@Override
public ErrorData getErrorData() {
return wrapped.getErrorData();
}
@Override
public JspWriter pushBody(Writer writer) {
return wrapped.pushBody(writer);
}
@Override
public JspWriter popBody() {
return wrapped.popBody();
}
}