Author: kkolinko Date: Tue Nov 16 13:08:15 2010 New Revision: 1035628 URL: http://svn.apache.org/viewvc?rev=1035628&view=rev Log: tabs -> 4 spaces This is to simplify backporting BZ 50228 patch (r1032232) from trunk. CTR
Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/PageContextImpl.java Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/PageContextImpl.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/PageContextImpl.java?rev=1035628&r1=1035627&r2=1035628&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/PageContextImpl.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/PageContextImpl.java Tue Nov 16 13:08:15 2010 @@ -70,882 +70,882 @@ import org.apache.jasper.util.Enumerator */ public class PageContextImpl extends PageContext { - private static final JspFactory jspf = JspFactory.getDefaultFactory(); + private static final JspFactory jspf = JspFactory.getDefaultFactory(); - private BodyContentImpl[] outs; + private BodyContentImpl[] outs; - private int depth; + private int depth; - // per-servlet state - private Servlet servlet; + // per-servlet state + private Servlet servlet; - private ServletConfig config; - - private ServletContext context; - - private JspApplicationContextImpl applicationContext; - - private String errorPageURL; - - // page-scope attributes - private transient HashMap<String, Object> attributes; - - // per-request state - private transient ServletRequest request; - - private transient ServletResponse response; - - private transient HttpSession session; - - private transient ELContextImpl elContext; - - private boolean isIncluded; - - - // initial output stream - private transient JspWriter out; - - private transient JspWriterImpl baseOut; - - /* - * Constructor. - */ - PageContextImpl() { - this.outs = new BodyContentImpl[0]; - this.attributes = new HashMap<String, Object>(16); - this.depth = -1; - } - - public void initialize(Servlet servlet, ServletRequest request, - ServletResponse response, String errorPageURL, - boolean needsSession, int bufferSize, boolean autoFlush) - throws IOException { - - _initialize(servlet, request, response, errorPageURL, needsSession, - bufferSize, autoFlush); - } - - private void _initialize(Servlet servlet, ServletRequest request, - ServletResponse response, String errorPageURL, - boolean needsSession, int bufferSize, boolean autoFlush) - throws IOException { - - // initialize state - this.servlet = servlet; - this.config = servlet.getServletConfig(); - this.context = config.getServletContext(); - this.errorPageURL = errorPageURL; - this.request = request; - this.response = response; - - // initialize application context - this.applicationContext = JspApplicationContextImpl.getInstance(context); - - // Setup session (if required) - if (request instanceof HttpServletRequest && needsSession) - this.session = ((HttpServletRequest) request).getSession(); - if (needsSession && session == null) - throw new IllegalStateException( - "Page needs a session and none is available"); - - // initialize the initial out ... - depth = -1; - if (this.baseOut == null) { - this.baseOut = new JspWriterImpl(response, bufferSize, autoFlush); - } else { - this.baseOut.init(response, bufferSize, autoFlush); - } - this.out = baseOut; - - // register names/values as per spec - setAttribute(OUT, this.out); - setAttribute(REQUEST, request); - setAttribute(RESPONSE, response); - - if (session != null) - setAttribute(SESSION, session); - - setAttribute(PAGE, servlet); - setAttribute(CONFIG, config); - setAttribute(PAGECONTEXT, this); - setAttribute(APPLICATION, context); - - isIncluded = request.getAttribute("javax.servlet.include.servlet_path") != null; - } - - public void release() { - out = baseOut; - try { - if (isIncluded) { - ((JspWriterImpl) out).flushBuffer(); - // push it into the including jspWriter - } else { - // Old code: - // out.flush(); - // Do not flush the buffer even if we're not included (i.e. - // we are the main page. The servlet will flush it and close - // the stream. - ((JspWriterImpl) out).flushBuffer(); - } - } catch (IOException ex) { + private ServletConfig config; + + private ServletContext context; + + private JspApplicationContextImpl applicationContext; + + private String errorPageURL; + + // page-scope attributes + private transient HashMap<String, Object> attributes; + + // per-request state + private transient ServletRequest request; + + private transient ServletResponse response; + + private transient HttpSession session; + + private transient ELContextImpl elContext; + + private boolean isIncluded; + + + // initial output stream + private transient JspWriter out; + + private transient JspWriterImpl baseOut; + + /* + * Constructor. + */ + PageContextImpl() { + this.outs = new BodyContentImpl[0]; + this.attributes = new HashMap<String, Object>(16); + this.depth = -1; + } + + public void initialize(Servlet servlet, ServletRequest request, + ServletResponse response, String errorPageURL, + boolean needsSession, int bufferSize, boolean autoFlush) + throws IOException { + + _initialize(servlet, request, response, errorPageURL, needsSession, + bufferSize, autoFlush); + } + + private void _initialize(Servlet servlet, ServletRequest request, + ServletResponse response, String errorPageURL, + boolean needsSession, int bufferSize, boolean autoFlush) + throws IOException { + + // initialize state + this.servlet = servlet; + this.config = servlet.getServletConfig(); + this.context = config.getServletContext(); + this.errorPageURL = errorPageURL; + this.request = request; + this.response = response; + + // initialize application context + this.applicationContext = JspApplicationContextImpl.getInstance(context); + + // Setup session (if required) + if (request instanceof HttpServletRequest && needsSession) + this.session = ((HttpServletRequest) request).getSession(); + if (needsSession && session == null) + throw new IllegalStateException( + "Page needs a session and none is available"); + + // initialize the initial out ... + depth = -1; + if (this.baseOut == null) { + this.baseOut = new JspWriterImpl(response, bufferSize, autoFlush); + } else { + this.baseOut.init(response, bufferSize, autoFlush); + } + this.out = baseOut; + + // register names/values as per spec + setAttribute(OUT, this.out); + setAttribute(REQUEST, request); + setAttribute(RESPONSE, response); + + if (session != null) + setAttribute(SESSION, session); + + setAttribute(PAGE, servlet); + setAttribute(CONFIG, config); + setAttribute(PAGECONTEXT, this); + setAttribute(APPLICATION, context); + + isIncluded = request.getAttribute("javax.servlet.include.servlet_path") != null; + } + + public void release() { + out = baseOut; + try { + if (isIncluded) { + ((JspWriterImpl) out).flushBuffer(); + // push it into the including jspWriter + } else { + // Old code: + // out.flush(); + // Do not flush the buffer even if we're not included (i.e. + // we are the main page. The servlet will flush it and close + // the stream. + ((JspWriterImpl) out).flushBuffer(); + } + } catch (IOException ex) { IllegalStateException ise = new IllegalStateException(Localizer.getMessage("jsp.error.flush"), ex); throw ise; - } finally { - servlet = null; - config = null; - context = null; - applicationContext = null; - elContext = null; - errorPageURL = null; - request = null; - response = null; - depth = -1; - baseOut.recycle(); - session = null; - attributes.clear(); - } - } - - public Object getAttribute(final String name) { - - if (name == null) { - throw new NullPointerException(Localizer - .getMessage("jsp.error.attribute.null_name")); - } - - if (SecurityUtil.isPackageProtectionEnabled()) { - return AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - return doGetAttribute(name); - } - }); - } else { - return doGetAttribute(name); - } - - } - - private Object doGetAttribute(String name) { - return attributes.get(name); - } - - public Object getAttribute(final String name, final int scope) { - - if (name == null) { - throw new NullPointerException(Localizer - .getMessage("jsp.error.attribute.null_name")); - } - - if (SecurityUtil.isPackageProtectionEnabled()) { - return AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - return doGetAttribute(name, scope); - } - }); - } else { - return doGetAttribute(name, scope); - } - - } - - private Object doGetAttribute(String name, int scope) { - switch (scope) { - case PAGE_SCOPE: - return attributes.get(name); - - case REQUEST_SCOPE: - return request.getAttribute(name); - - case SESSION_SCOPE: - if (session == null) { - throw new IllegalStateException(Localizer - .getMessage("jsp.error.page.noSession")); - } - return session.getAttribute(name); - - case APPLICATION_SCOPE: - return context.getAttribute(name); - - default: - throw new IllegalArgumentException("Invalid scope"); - } - } - - public void setAttribute(final String name, final Object attribute) { - - if (name == null) { - throw new NullPointerException(Localizer - .getMessage("jsp.error.attribute.null_name")); - } - - if (SecurityUtil.isPackageProtectionEnabled()) { - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - doSetAttribute(name, attribute); - return null; - } - }); - } else { - doSetAttribute(name, attribute); - } - } - - private void doSetAttribute(String name, Object attribute) { - if (attribute != null) { - attributes.put(name, attribute); - } else { - removeAttribute(name, PAGE_SCOPE); - } - } - - public void setAttribute(final String name, final Object o, final int scope) { - - if (name == null) { - throw new NullPointerException(Localizer - .getMessage("jsp.error.attribute.null_name")); - } - - if (SecurityUtil.isPackageProtectionEnabled()) { - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - doSetAttribute(name, o, scope); - return null; - } - }); - } else { - doSetAttribute(name, o, scope); - } - - } - - private void doSetAttribute(String name, Object o, int scope) { - if (o != null) { - switch (scope) { - case PAGE_SCOPE: - attributes.put(name, o); - break; - - case REQUEST_SCOPE: - request.setAttribute(name, o); - break; - - case SESSION_SCOPE: - if (session == null) { - throw new IllegalStateException(Localizer - .getMessage("jsp.error.page.noSession")); - } - session.setAttribute(name, o); - break; - - case APPLICATION_SCOPE: - context.setAttribute(name, o); - break; - - default: - throw new IllegalArgumentException("Invalid scope"); - } - } else { - removeAttribute(name, scope); - } - } - - public void removeAttribute(final String name, final int scope) { - - if (name == null) { - throw new NullPointerException(Localizer - .getMessage("jsp.error.attribute.null_name")); - } - if (SecurityUtil.isPackageProtectionEnabled()) { - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - doRemoveAttribute(name, scope); - return null; - } - }); - } else { - doRemoveAttribute(name, scope); - } - } - - private void doRemoveAttribute(String name, int scope) { - switch (scope) { - case PAGE_SCOPE: - attributes.remove(name); - break; - - case REQUEST_SCOPE: - request.removeAttribute(name); - break; - - case SESSION_SCOPE: - if (session == null) { - throw new IllegalStateException(Localizer - .getMessage("jsp.error.page.noSession")); - } - session.removeAttribute(name); - break; - - case APPLICATION_SCOPE: - context.removeAttribute(name); - break; - - default: - throw new IllegalArgumentException("Invalid scope"); - } - } - - public int getAttributesScope(final String name) { - - if (name == null) { - throw new NullPointerException(Localizer - .getMessage("jsp.error.attribute.null_name")); - } - - if (SecurityUtil.isPackageProtectionEnabled()) { - return ((Integer) AccessController - .doPrivileged(new PrivilegedAction() { - public Object run() { - return new Integer(doGetAttributeScope(name)); - } - })).intValue(); - } else { - return doGetAttributeScope(name); - } - } - - private int doGetAttributeScope(String name) { - if (attributes.get(name) != null) - return PAGE_SCOPE; - - if (request.getAttribute(name) != null) - return REQUEST_SCOPE; - - if (session != null) { - try { - if (session.getAttribute(name) != null) - return SESSION_SCOPE; - } catch(IllegalStateException ise) { - // Session has been invalidated. - // Ignore and fall through to application scope. - } - } - - if (context.getAttribute(name) != null) - return APPLICATION_SCOPE; - - return 0; - } - - public Object findAttribute(final String name) { - if (SecurityUtil.isPackageProtectionEnabled()) { - return AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - if (name == null) { - throw new NullPointerException(Localizer - .getMessage("jsp.error.attribute.null_name")); - } - - return doFindAttribute(name); - } - }); - } else { - if (name == null) { - throw new NullPointerException(Localizer - .getMessage("jsp.error.attribute.null_name")); - } - - return doFindAttribute(name); - } - } - - private Object doFindAttribute(String name) { - - Object o = attributes.get(name); - if (o != null) - return o; - - o = request.getAttribute(name); - if (o != null) - return o; - - if (session != null) { - try { - o = session.getAttribute(name); - } catch(IllegalStateException ise) { - // Session has been invalidated. - // Ignore and fall through to application scope. - } - if (o != null) - return o; - } - - return context.getAttribute(name); - } - - public Enumeration<String> getAttributeNamesInScope(final int scope) { - if (SecurityUtil.isPackageProtectionEnabled()) { - return (Enumeration) AccessController - .doPrivileged(new PrivilegedAction() { - public Object run() { - return doGetAttributeNamesInScope(scope); - } - }); - } else { - return doGetAttributeNamesInScope(scope); - } - } - - private Enumeration doGetAttributeNamesInScope(int scope) { - switch (scope) { - case PAGE_SCOPE: - return new Enumerator(attributes.keySet().iterator()); - - case REQUEST_SCOPE: - return request.getAttributeNames(); - - case SESSION_SCOPE: - if (session == null) { - throw new IllegalStateException(Localizer - .getMessage("jsp.error.page.noSession")); - } - return session.getAttributeNames(); - - case APPLICATION_SCOPE: - return context.getAttributeNames(); - - default: - throw new IllegalArgumentException("Invalid scope"); - } - } - - public void removeAttribute(final String name) { - - if (name == null) { - throw new NullPointerException(Localizer - .getMessage("jsp.error.attribute.null_name")); - } - - if (SecurityUtil.isPackageProtectionEnabled()) { - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - doRemoveAttribute(name); - return null; - } - }); - } else { - doRemoveAttribute(name); - } - } - - private void doRemoveAttribute(String name) { - removeAttribute(name, PAGE_SCOPE); - removeAttribute(name, REQUEST_SCOPE); - if( session != null ) { - try { - removeAttribute(name, SESSION_SCOPE); - } catch(IllegalStateException ise) { - // Session has been invalidated. - // Ignore and fall throw to application scope. - } - } - removeAttribute(name, APPLICATION_SCOPE); - } - - public JspWriter getOut() { - return out; - } - - public HttpSession getSession() { - return session; - } - - public Servlet getServlet() { - return servlet; - } - - public ServletConfig getServletConfig() { - return config; - } - - public ServletContext getServletContext() { - return config.getServletContext(); - } - - public ServletRequest getRequest() { - return request; - } - - public ServletResponse getResponse() { - return response; - } - - /** - * Returns the exception associated with this page context, if any. <p/> - * Added wrapping for Throwables to avoid ClassCastException: see Bugzilla - * 31171 for details. - * - * @return The Exception associated with this page context, if any. - */ - public Exception getException() { - Throwable t = JspRuntimeLibrary.getThrowable(request); - - // Only wrap if needed - if ((t != null) && (!(t instanceof Exception))) { - t = new JspException(t); - } - - return (Exception) t; - } - - public Object getPage() { - return servlet; - } - - private final String getAbsolutePathRelativeToContext(String relativeUrlPath) { - String path = relativeUrlPath; - - if (!path.startsWith("/")) { - String uri = (String) request - .getAttribute("javax.servlet.include.servlet_path"); - if (uri == null) - uri = ((HttpServletRequest) request).getServletPath(); - String baseURI = uri.substring(0, uri.lastIndexOf('/')); - path = baseURI + '/' + path; - } - - return path; - } - - public void include(String relativeUrlPath) throws ServletException, - IOException { - JspRuntimeLibrary - .include(request, response, relativeUrlPath, out, true); - } - - public void include(final String relativeUrlPath, final boolean flush) - throws ServletException, IOException { - if (SecurityUtil.isPackageProtectionEnabled()) { - try { - AccessController.doPrivileged(new PrivilegedExceptionAction() { - public Object run() throws Exception { - doInclude(relativeUrlPath, flush); - return null; - } - }); - } catch (PrivilegedActionException e) { - Exception ex = e.getException(); - if (ex instanceof IOException) { - throw (IOException) ex; - } else { - throw (ServletException) ex; - } - } - } else { - doInclude(relativeUrlPath, flush); - } - } - - private void doInclude(String relativeUrlPath, boolean flush) - throws ServletException, IOException { - JspRuntimeLibrary.include(request, response, relativeUrlPath, out, - flush); - } - - public VariableResolver getVariableResolver() { - return new VariableResolverImpl(this.getELContext()); - } - - public void forward(final String relativeUrlPath) throws ServletException, - IOException { - if (SecurityUtil.isPackageProtectionEnabled()) { - try { - AccessController.doPrivileged(new PrivilegedExceptionAction() { - public Object run() throws Exception { - doForward(relativeUrlPath); - return null; - } - }); - } catch (PrivilegedActionException e) { - Exception ex = e.getException(); - if (ex instanceof IOException) { - throw (IOException) ex; - } else { - throw (ServletException) ex; - } - } - } else { - doForward(relativeUrlPath); - } - } - - private void doForward(String relativeUrlPath) throws ServletException, - IOException { - - // JSP.4.5 If the buffer was flushed, throw IllegalStateException - try { - out.clear(); - } catch (IOException ex) { - IllegalStateException ise = new IllegalStateException(Localizer - .getMessage("jsp.error.attempt_to_clear_flushed_buffer")); - ise.initCause(ex); - throw ise; - } - - // Make sure that the response object is not the wrapper for include - while (response instanceof ServletResponseWrapperInclude) { - response = ((ServletResponseWrapperInclude) response).getResponse(); - } - - final String path = getAbsolutePathRelativeToContext(relativeUrlPath); - String includeUri = (String) request - .getAttribute(Constants.INC_SERVLET_PATH); - - if (includeUri != null) - request.removeAttribute(Constants.INC_SERVLET_PATH); - try { - context.getRequestDispatcher(path).forward(request, response); - } finally { - if (includeUri != null) - request.setAttribute(Constants.INC_SERVLET_PATH, includeUri); - } - } - - public BodyContent pushBody() { - return (BodyContent) pushBody(null); - } - - public JspWriter pushBody(Writer writer) { - depth++; - if (depth >= outs.length) { - BodyContentImpl[] newOuts = new BodyContentImpl[depth + 1]; - for (int i = 0; i < outs.length; i++) { - newOuts[i] = outs[i]; - } - newOuts[depth] = new BodyContentImpl(out); - outs = newOuts; - } - - outs[depth].setWriter(writer); - out = outs[depth]; - - // Update the value of the "out" attribute in the page scope - // attribute namespace of this PageContext - setAttribute(OUT, out); - - return outs[depth]; - } - - public JspWriter popBody() { - depth--; - if (depth >= 0) { - out = outs[depth]; - } else { - out = baseOut; - } - - // Update the value of the "out" attribute in the page scope - // attribute namespace of this PageContext - setAttribute(OUT, out); - - return out; - } - - /** - * Provides programmatic access to the ExpressionEvaluator. The JSP - * Container must return a valid instance of an ExpressionEvaluator that can - * parse EL expressions. - */ - public ExpressionEvaluator getExpressionEvaluator() { - return new ExpressionEvaluatorImpl(this.applicationContext.getExpressionFactory()); - } - - public void handlePageException(Exception ex) throws IOException, - ServletException { - // Should never be called since handleException() called with a - // Throwable in the generated servlet. - handlePageException((Throwable) ex); - } - - public void handlePageException(final Throwable t) throws IOException, - ServletException { - if (t == null) - throw new NullPointerException("null Throwable"); - - if (SecurityUtil.isPackageProtectionEnabled()) { - try { - AccessController.doPrivileged(new PrivilegedExceptionAction() { - public Object run() throws Exception { - doHandlePageException(t); - return null; - } - }); - } catch (PrivilegedActionException e) { - Exception ex = e.getException(); - if (ex instanceof IOException) { - throw (IOException) ex; - } else { - throw (ServletException) ex; - } - } - } else { - doHandlePageException(t); - } - - } - - private void doHandlePageException(Throwable t) throws IOException, - ServletException { - - if (errorPageURL != null && !errorPageURL.equals("")) { - - /* - * Set request attributes. Do not set the - * javax.servlet.error.exception attribute here (instead, set in the - * generated servlet code for the error page) in order to prevent - * the ErrorReportValve, which is invoked as part of forwarding the - * request to the error page, from throwing it if the response has - * not been committed (the response will have been committed if the - * error page is a JSP page). - */ - request.setAttribute("javax.servlet.jsp.jspException", t); - request.setAttribute("javax.servlet.error.status_code", - new Integer(HttpServletResponse.SC_INTERNAL_SERVER_ERROR)); - request.setAttribute("javax.servlet.error.request_uri", - ((HttpServletRequest) request).getRequestURI()); - request.setAttribute("javax.servlet.error.servlet_name", config - .getServletName()); - try { - forward(errorPageURL); - } catch (IllegalStateException ise) { - include(errorPageURL); - } - - // The error page could be inside an include. - - Object newException = request - .getAttribute("javax.servlet.error.exception"); - - // t==null means the attribute was not set. - if ((newException != null) && (newException == t)) { - request.removeAttribute("javax.servlet.error.exception"); - } - - // now clear the error code - to prevent double handling. - request.removeAttribute("javax.servlet.error.status_code"); - request.removeAttribute("javax.servlet.error.request_uri"); - request.removeAttribute("javax.servlet.error.status_code"); - request.removeAttribute("javax.servlet.jsp.jspException"); - - } else { - // Otherwise throw the exception wrapped inside a ServletException. - // Set the exception as the root cause in the ServletException - // to get a stack trace for the real problem - if (t instanceof IOException) - throw (IOException) t; - if (t instanceof ServletException) - throw (ServletException) t; - if (t instanceof RuntimeException) - throw (RuntimeException) t; - - Throwable rootCause = null; - if (t instanceof JspException) { - rootCause = ((JspException) t).getRootCause(); - } else if (t instanceof ELException) { - rootCause = ((ELException) t).getRootCause(); - } - - if (rootCause != null) { - throw new ServletException(t.getClass().getName() + ": " - + t.getMessage(), rootCause); - } - - throw new ServletException(t); - } - } - - private static String XmlEscape(String s) { - if (s == null) - return null; - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < s.length(); i++) { - char c = s.charAt(i); - if (c == '<') { - sb.append("<"); - } else if (c == '>') { - sb.append(">"); - } else if (c == '\'') { - sb.append("'"); // ' - } else if (c == '&') { - sb.append("&"); - } else if (c == '"') { - sb.append("""); // " - } else { - sb.append(c); - } - } - return sb.toString(); - } - - /** - * Proprietary method to evaluate EL expressions. XXX - This method should - * go away once the EL interpreter moves out of JSTL and into its own - * project. For now, this is necessary because the standard machinery is too - * slow. - * - * @param expression - * The expression to be evaluated - * @param expectedType - * The expected resulting type - * @param pageContext - * The page context - * @param functionMap - * Maps prefix and name to Method - * @return The result of the evaluation - */ - public static Object proprietaryEvaluate(final String expression, - final Class expectedType, final PageContext pageContext, - final ProtectedFunctionMapper functionMap, final boolean escape) - throws ELException { - Object retValue; + } finally { + servlet = null; + config = null; + context = null; + applicationContext = null; + elContext = null; + errorPageURL = null; + request = null; + response = null; + depth = -1; + baseOut.recycle(); + session = null; + attributes.clear(); + } + } + + public Object getAttribute(final String name) { + + if (name == null) { + throw new NullPointerException(Localizer + .getMessage("jsp.error.attribute.null_name")); + } + + if (SecurityUtil.isPackageProtectionEnabled()) { + return AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + return doGetAttribute(name); + } + }); + } else { + return doGetAttribute(name); + } + + } + + private Object doGetAttribute(String name) { + return attributes.get(name); + } + + public Object getAttribute(final String name, final int scope) { + + if (name == null) { + throw new NullPointerException(Localizer + .getMessage("jsp.error.attribute.null_name")); + } + + if (SecurityUtil.isPackageProtectionEnabled()) { + return AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + return doGetAttribute(name, scope); + } + }); + } else { + return doGetAttribute(name, scope); + } + + } + + private Object doGetAttribute(String name, int scope) { + switch (scope) { + case PAGE_SCOPE: + return attributes.get(name); + + case REQUEST_SCOPE: + return request.getAttribute(name); + + case SESSION_SCOPE: + if (session == null) { + throw new IllegalStateException(Localizer + .getMessage("jsp.error.page.noSession")); + } + return session.getAttribute(name); + + case APPLICATION_SCOPE: + return context.getAttribute(name); + + default: + throw new IllegalArgumentException("Invalid scope"); + } + } + + public void setAttribute(final String name, final Object attribute) { + + if (name == null) { + throw new NullPointerException(Localizer + .getMessage("jsp.error.attribute.null_name")); + } + + if (SecurityUtil.isPackageProtectionEnabled()) { + AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + doSetAttribute(name, attribute); + return null; + } + }); + } else { + doSetAttribute(name, attribute); + } + } + + private void doSetAttribute(String name, Object attribute) { + if (attribute != null) { + attributes.put(name, attribute); + } else { + removeAttribute(name, PAGE_SCOPE); + } + } + + public void setAttribute(final String name, final Object o, final int scope) { + + if (name == null) { + throw new NullPointerException(Localizer + .getMessage("jsp.error.attribute.null_name")); + } + + if (SecurityUtil.isPackageProtectionEnabled()) { + AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + doSetAttribute(name, o, scope); + return null; + } + }); + } else { + doSetAttribute(name, o, scope); + } + + } + + private void doSetAttribute(String name, Object o, int scope) { + if (o != null) { + switch (scope) { + case PAGE_SCOPE: + attributes.put(name, o); + break; + + case REQUEST_SCOPE: + request.setAttribute(name, o); + break; + + case SESSION_SCOPE: + if (session == null) { + throw new IllegalStateException(Localizer + .getMessage("jsp.error.page.noSession")); + } + session.setAttribute(name, o); + break; + + case APPLICATION_SCOPE: + context.setAttribute(name, o); + break; + + default: + throw new IllegalArgumentException("Invalid scope"); + } + } else { + removeAttribute(name, scope); + } + } + + public void removeAttribute(final String name, final int scope) { + + if (name == null) { + throw new NullPointerException(Localizer + .getMessage("jsp.error.attribute.null_name")); + } + if (SecurityUtil.isPackageProtectionEnabled()) { + AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + doRemoveAttribute(name, scope); + return null; + } + }); + } else { + doRemoveAttribute(name, scope); + } + } + + private void doRemoveAttribute(String name, int scope) { + switch (scope) { + case PAGE_SCOPE: + attributes.remove(name); + break; + + case REQUEST_SCOPE: + request.removeAttribute(name); + break; + + case SESSION_SCOPE: + if (session == null) { + throw new IllegalStateException(Localizer + .getMessage("jsp.error.page.noSession")); + } + session.removeAttribute(name); + break; + + case APPLICATION_SCOPE: + context.removeAttribute(name); + break; + + default: + throw new IllegalArgumentException("Invalid scope"); + } + } + + public int getAttributesScope(final String name) { + + if (name == null) { + throw new NullPointerException(Localizer + .getMessage("jsp.error.attribute.null_name")); + } + + if (SecurityUtil.isPackageProtectionEnabled()) { + return ((Integer) AccessController + .doPrivileged(new PrivilegedAction() { + public Object run() { + return new Integer(doGetAttributeScope(name)); + } + })).intValue(); + } else { + return doGetAttributeScope(name); + } + } + + private int doGetAttributeScope(String name) { + if (attributes.get(name) != null) + return PAGE_SCOPE; + + if (request.getAttribute(name) != null) + return REQUEST_SCOPE; + + if (session != null) { + try { + if (session.getAttribute(name) != null) + return SESSION_SCOPE; + } catch(IllegalStateException ise) { + // Session has been invalidated. + // Ignore and fall through to application scope. + } + } + + if (context.getAttribute(name) != null) + return APPLICATION_SCOPE; + + return 0; + } + + public Object findAttribute(final String name) { + if (SecurityUtil.isPackageProtectionEnabled()) { + return AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + if (name == null) { + throw new NullPointerException(Localizer + .getMessage("jsp.error.attribute.null_name")); + } + + return doFindAttribute(name); + } + }); + } else { + if (name == null) { + throw new NullPointerException(Localizer + .getMessage("jsp.error.attribute.null_name")); + } + + return doFindAttribute(name); + } + } + + private Object doFindAttribute(String name) { + + Object o = attributes.get(name); + if (o != null) + return o; + + o = request.getAttribute(name); + if (o != null) + return o; + + if (session != null) { + try { + o = session.getAttribute(name); + } catch(IllegalStateException ise) { + // Session has been invalidated. + // Ignore and fall through to application scope. + } + if (o != null) + return o; + } + + return context.getAttribute(name); + } + + public Enumeration<String> getAttributeNamesInScope(final int scope) { + if (SecurityUtil.isPackageProtectionEnabled()) { + return (Enumeration) AccessController + .doPrivileged(new PrivilegedAction() { + public Object run() { + return doGetAttributeNamesInScope(scope); + } + }); + } else { + return doGetAttributeNamesInScope(scope); + } + } + + private Enumeration doGetAttributeNamesInScope(int scope) { + switch (scope) { + case PAGE_SCOPE: + return new Enumerator(attributes.keySet().iterator()); + + case REQUEST_SCOPE: + return request.getAttributeNames(); + + case SESSION_SCOPE: + if (session == null) { + throw new IllegalStateException(Localizer + .getMessage("jsp.error.page.noSession")); + } + return session.getAttributeNames(); + + case APPLICATION_SCOPE: + return context.getAttributeNames(); + + default: + throw new IllegalArgumentException("Invalid scope"); + } + } + + public void removeAttribute(final String name) { + + if (name == null) { + throw new NullPointerException(Localizer + .getMessage("jsp.error.attribute.null_name")); + } + + if (SecurityUtil.isPackageProtectionEnabled()) { + AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + doRemoveAttribute(name); + return null; + } + }); + } else { + doRemoveAttribute(name); + } + } + + private void doRemoveAttribute(String name) { + removeAttribute(name, PAGE_SCOPE); + removeAttribute(name, REQUEST_SCOPE); + if( session != null ) { + try { + removeAttribute(name, SESSION_SCOPE); + } catch(IllegalStateException ise) { + // Session has been invalidated. + // Ignore and fall throw to application scope. + } + } + removeAttribute(name, APPLICATION_SCOPE); + } + + public JspWriter getOut() { + return out; + } + + public HttpSession getSession() { + return session; + } + + public Servlet getServlet() { + return servlet; + } + + public ServletConfig getServletConfig() { + return config; + } + + public ServletContext getServletContext() { + return config.getServletContext(); + } + + public ServletRequest getRequest() { + return request; + } + + public ServletResponse getResponse() { + return response; + } + + /** + * Returns the exception associated with this page context, if any. <p/> + * Added wrapping for Throwables to avoid ClassCastException: see Bugzilla + * 31171 for details. + * + * @return The Exception associated with this page context, if any. + */ + public Exception getException() { + Throwable t = JspRuntimeLibrary.getThrowable(request); + + // Only wrap if needed + if ((t != null) && (!(t instanceof Exception))) { + t = new JspException(t); + } + + return (Exception) t; + } + + public Object getPage() { + return servlet; + } + + private final String getAbsolutePathRelativeToContext(String relativeUrlPath) { + String path = relativeUrlPath; + + if (!path.startsWith("/")) { + String uri = (String) request + .getAttribute("javax.servlet.include.servlet_path"); + if (uri == null) + uri = ((HttpServletRequest) request).getServletPath(); + String baseURI = uri.substring(0, uri.lastIndexOf('/')); + path = baseURI + '/' + path; + } + + return path; + } + + public void include(String relativeUrlPath) throws ServletException, + IOException { + JspRuntimeLibrary + .include(request, response, relativeUrlPath, out, true); + } + + public void include(final String relativeUrlPath, final boolean flush) + throws ServletException, IOException { + if (SecurityUtil.isPackageProtectionEnabled()) { + try { + AccessController.doPrivileged(new PrivilegedExceptionAction() { + public Object run() throws Exception { + doInclude(relativeUrlPath, flush); + return null; + } + }); + } catch (PrivilegedActionException e) { + Exception ex = e.getException(); + if (ex instanceof IOException) { + throw (IOException) ex; + } else { + throw (ServletException) ex; + } + } + } else { + doInclude(relativeUrlPath, flush); + } + } + + private void doInclude(String relativeUrlPath, boolean flush) + throws ServletException, IOException { + JspRuntimeLibrary.include(request, response, relativeUrlPath, out, + flush); + } + + public VariableResolver getVariableResolver() { + return new VariableResolverImpl(this.getELContext()); + } + + public void forward(final String relativeUrlPath) throws ServletException, + IOException { + if (SecurityUtil.isPackageProtectionEnabled()) { + try { + AccessController.doPrivileged(new PrivilegedExceptionAction() { + public Object run() throws Exception { + doForward(relativeUrlPath); + return null; + } + }); + } catch (PrivilegedActionException e) { + Exception ex = e.getException(); + if (ex instanceof IOException) { + throw (IOException) ex; + } else { + throw (ServletException) ex; + } + } + } else { + doForward(relativeUrlPath); + } + } + + private void doForward(String relativeUrlPath) throws ServletException, + IOException { + + // JSP.4.5 If the buffer was flushed, throw IllegalStateException + try { + out.clear(); + } catch (IOException ex) { + IllegalStateException ise = new IllegalStateException(Localizer + .getMessage("jsp.error.attempt_to_clear_flushed_buffer")); + ise.initCause(ex); + throw ise; + } + + // Make sure that the response object is not the wrapper for include + while (response instanceof ServletResponseWrapperInclude) { + response = ((ServletResponseWrapperInclude) response).getResponse(); + } + + final String path = getAbsolutePathRelativeToContext(relativeUrlPath); + String includeUri = (String) request + .getAttribute(Constants.INC_SERVLET_PATH); + + if (includeUri != null) + request.removeAttribute(Constants.INC_SERVLET_PATH); + try { + context.getRequestDispatcher(path).forward(request, response); + } finally { + if (includeUri != null) + request.setAttribute(Constants.INC_SERVLET_PATH, includeUri); + } + } + + public BodyContent pushBody() { + return (BodyContent) pushBody(null); + } + + public JspWriter pushBody(Writer writer) { + depth++; + if (depth >= outs.length) { + BodyContentImpl[] newOuts = new BodyContentImpl[depth + 1]; + for (int i = 0; i < outs.length; i++) { + newOuts[i] = outs[i]; + } + newOuts[depth] = new BodyContentImpl(out); + outs = newOuts; + } + + outs[depth].setWriter(writer); + out = outs[depth]; + + // Update the value of the "out" attribute in the page scope + // attribute namespace of this PageContext + setAttribute(OUT, out); + + return outs[depth]; + } + + public JspWriter popBody() { + depth--; + if (depth >= 0) { + out = outs[depth]; + } else { + out = baseOut; + } + + // Update the value of the "out" attribute in the page scope + // attribute namespace of this PageContext + setAttribute(OUT, out); + + return out; + } + + /** + * Provides programmatic access to the ExpressionEvaluator. The JSP + * Container must return a valid instance of an ExpressionEvaluator that can + * parse EL expressions. + */ + public ExpressionEvaluator getExpressionEvaluator() { + return new ExpressionEvaluatorImpl(this.applicationContext.getExpressionFactory()); + } + + public void handlePageException(Exception ex) throws IOException, + ServletException { + // Should never be called since handleException() called with a + // Throwable in the generated servlet. + handlePageException((Throwable) ex); + } + + public void handlePageException(final Throwable t) throws IOException, + ServletException { + if (t == null) + throw new NullPointerException("null Throwable"); + + if (SecurityUtil.isPackageProtectionEnabled()) { + try { + AccessController.doPrivileged(new PrivilegedExceptionAction() { + public Object run() throws Exception { + doHandlePageException(t); + return null; + } + }); + } catch (PrivilegedActionException e) { + Exception ex = e.getException(); + if (ex instanceof IOException) { + throw (IOException) ex; + } else { + throw (ServletException) ex; + } + } + } else { + doHandlePageException(t); + } + + } + + private void doHandlePageException(Throwable t) throws IOException, + ServletException { + + if (errorPageURL != null && !errorPageURL.equals("")) { + + /* + * Set request attributes. Do not set the + * javax.servlet.error.exception attribute here (instead, set in the + * generated servlet code for the error page) in order to prevent + * the ErrorReportValve, which is invoked as part of forwarding the + * request to the error page, from throwing it if the response has + * not been committed (the response will have been committed if the + * error page is a JSP page). + */ + request.setAttribute("javax.servlet.jsp.jspException", t); + request.setAttribute("javax.servlet.error.status_code", + new Integer(HttpServletResponse.SC_INTERNAL_SERVER_ERROR)); + request.setAttribute("javax.servlet.error.request_uri", + ((HttpServletRequest) request).getRequestURI()); + request.setAttribute("javax.servlet.error.servlet_name", config + .getServletName()); + try { + forward(errorPageURL); + } catch (IllegalStateException ise) { + include(errorPageURL); + } + + // The error page could be inside an include. + + Object newException = request + .getAttribute("javax.servlet.error.exception"); + + // t==null means the attribute was not set. + if ((newException != null) && (newException == t)) { + request.removeAttribute("javax.servlet.error.exception"); + } + + // now clear the error code - to prevent double handling. + request.removeAttribute("javax.servlet.error.status_code"); + request.removeAttribute("javax.servlet.error.request_uri"); + request.removeAttribute("javax.servlet.error.status_code"); + request.removeAttribute("javax.servlet.jsp.jspException"); + + } else { + // Otherwise throw the exception wrapped inside a ServletException. + // Set the exception as the root cause in the ServletException + // to get a stack trace for the real problem + if (t instanceof IOException) + throw (IOException) t; + if (t instanceof ServletException) + throw (ServletException) t; + if (t instanceof RuntimeException) + throw (RuntimeException) t; + + Throwable rootCause = null; + if (t instanceof JspException) { + rootCause = ((JspException) t).getRootCause(); + } else if (t instanceof ELException) { + rootCause = ((ELException) t).getRootCause(); + } + + if (rootCause != null) { + throw new ServletException(t.getClass().getName() + ": " + + t.getMessage(), rootCause); + } + + throw new ServletException(t); + } + } + + private static String XmlEscape(String s) { + if (s == null) + return null; + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (c == '<') { + sb.append("<"); + } else if (c == '>') { + sb.append(">"); + } else if (c == '\'') { + sb.append("'"); // ' + } else if (c == '&') { + sb.append("&"); + } else if (c == '"') { + sb.append("""); // " + } else { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * Proprietary method to evaluate EL expressions. XXX - This method should + * go away once the EL interpreter moves out of JSTL and into its own + * project. For now, this is necessary because the standard machinery is too + * slow. + * + * @param expression + * The expression to be evaluated + * @param expectedType + * The expected resulting type + * @param pageContext + * The page context + * @param functionMap + * Maps prefix and name to Method + * @return The result of the evaluation + */ + public static Object proprietaryEvaluate(final String expression, + final Class expectedType, final PageContext pageContext, + final ProtectedFunctionMapper functionMap, final boolean escape) + throws ELException { + Object retValue; final ExpressionFactory exprFactory = jspf.getJspApplicationContext(pageContext.getServletContext()).getExpressionFactory(); - if (SecurityUtil.isPackageProtectionEnabled()) { - try { - retValue = AccessController - .doPrivileged(new PrivilegedExceptionAction() { + if (SecurityUtil.isPackageProtectionEnabled()) { + try { + retValue = AccessController + .doPrivileged(new PrivilegedExceptionAction() { - public Object run() throws Exception { + public Object run() throws Exception { ELContextImpl ctx = (ELContextImpl) pageContext.getELContext(); ctx.setFunctionMapper(new FunctionMapperImpl(functionMap)); - ValueExpression ve = exprFactory.createValueExpression(ctx, expression, expectedType); + ValueExpression ve = exprFactory.createValueExpression(ctx, expression, expectedType); return ve.getValue(ctx); - } - }); - } catch (PrivilegedActionException ex) { - Exception realEx = ex.getException(); - if (realEx instanceof ELException) { - throw (ELException) realEx; - } else { - throw new ELException(realEx); - } - } - } else { + } + }); + } catch (PrivilegedActionException ex) { + Exception realEx = ex.getException(); + if (realEx instanceof ELException) { + throw (ELException) realEx; + } else { + throw new ELException(realEx); + } + } + } else { ELContextImpl ctx = (ELContextImpl) pageContext.getELContext(); ctx.setFunctionMapper(new FunctionMapperImpl(functionMap)); ValueExpression ve = exprFactory.createValueExpression(ctx, expression, expectedType); retValue = ve.getValue(ctx); - } - if (escape && retValue != null) { - retValue = XmlEscape(retValue.toString()); - } - - return retValue; - } - - public ELContext getELContext() { - if (this.elContext == null) { - this.elContext = this.applicationContext.createELContext(this); - } - return this.elContext; - } + } + if (escape && retValue != null) { + retValue = XmlEscape(retValue.toString()); + } + + return retValue; + } + + public ELContext getELContext() { + if (this.elContext == null) { + this.elContext = this.applicationContext.createELContext(this); + } + return this.elContext; + } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org