Author: markt Date: Fri Feb 9 12:27:53 2018 New Revision: 1823647 URL: http://svn.apache.org/viewvc?rev=1823647&view=rev Log: Refactor error page related code into a separate class so it can be re-used in the ErrorReportValve. Deprecate a couple of unused methods.
Added: tomcat/trunk/java/org/apache/catalina/util/ErrorPageSupport.java (with props) Modified: tomcat/trunk/java/org/apache/catalina/Context.java tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Modified: tomcat/trunk/java/org/apache/catalina/Context.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/Context.java?rev=1823647&r1=1823646&r2=1823647&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/Context.java (original) +++ tomcat/trunk/java/org/apache/catalina/Context.java Fri Feb 9 12:27:53 2018 @@ -1087,7 +1087,11 @@ public interface Context extends Contain * HTTP status code, if any; otherwise return <code>null</code>. * * @param status HTTP status code to look up + * + * @deprecated Unused. Will be removed in Tomcat 10. + * Use {@link #findErrorPage(int)} instead. */ + @Deprecated public String findStatusPage(int status); @@ -1095,7 +1099,11 @@ public interface Context extends Contain * @return the set of HTTP status codes for which error pages have * been specified. If none are specified, a zero-length array * is returned. + * + * @deprecated Unused. Will be removed in Tomcat 10. + * Use {@link #findErrorPages()} instead. */ + @Deprecated public int[] findStatusPages(); Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1823647&r1=1823646&r2=1823647&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Fri Feb 9 12:27:53 2018 @@ -31,7 +31,6 @@ import java.util.Enumeration; import java.util.EventListener; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; @@ -104,6 +103,7 @@ import org.apache.catalina.loader.Webapp import org.apache.catalina.session.StandardManager; import org.apache.catalina.util.CharsetMapper; import org.apache.catalina.util.ContextName; +import org.apache.catalina.util.ErrorPageSupport; import org.apache.catalina.util.ExtensionValidator; import org.apache.catalina.util.URLEncoder; import org.apache.catalina.webresources.StandardRoot; @@ -366,12 +366,7 @@ public class StandardContext extends Con private String docBase = null; - /** - * The exception pages for this web application, keyed by fully qualified - * class name of the Java exception. - */ - private Map<String, ErrorPage> exceptionPages = new HashMap<>(); - + private final ErrorPageSupport errorPageSupport = new ErrorPageSupport(); /** * The set of filter configurations (and associated filter instances) we @@ -546,13 +541,6 @@ public class StandardContext extends Con */ private AtomicLong sequenceNumber = new AtomicLong(0); - /** - * The status code error pages for this web application, keyed by - * HTTP status code (as an Integer). Note status code zero is used for the - * default error page. - */ - private Map<Integer, ErrorPage> statusPages = new HashMap<>(); - /** * Set flag to true to cause the system.out and system.err to be redirected @@ -2850,20 +2838,8 @@ public class StandardContext extends Con } } - // Add the specified error page to our internal collections - String exceptionType = errorPage.getExceptionType(); - if (exceptionType != null) { - synchronized (exceptionPages) { - exceptionPages.put(exceptionType, errorPage); - } - } else { - synchronized (statusPages) { - statusPages.put(Integer.valueOf(errorPage.getErrorCode()), - errorPage); - } - } + errorPageSupport.add(errorPage); fireContainerEvent("addErrorPage", errorPage); - } @@ -3298,7 +3274,7 @@ public class StandardContext extends Con */ @Override public ErrorPage findErrorPage(int errorCode) { - return statusPages.get(Integer.valueOf(errorCode)); + return errorPageSupport.find(errorCode); } @@ -3310,9 +3286,7 @@ public class StandardContext extends Con */ @Override public ErrorPage findErrorPage(String exceptionType) { - synchronized (exceptionPages) { - return exceptionPages.get(exceptionType); - } + return errorPageSupport.find(exceptionType); } @@ -3322,23 +3296,7 @@ public class StandardContext extends Con */ @Override public ErrorPage[] findErrorPages() { - - synchronized(exceptionPages) { - synchronized(statusPages) { - ErrorPage results1[] = new ErrorPage[exceptionPages.size()]; - results1 = exceptionPages.values().toArray(results1); - ErrorPage results2[] = new ErrorPage[statusPages.size()]; - results2 = statusPages.values().toArray(results2); - ErrorPage results[] = - new ErrorPage[results1.length + results2.length]; - for (int i = 0; i < results1.length; i++) - results[i] = results1[i]; - for (int i = results1.length; i < results.length; i++) - results[i] = results2[i - results1.length]; - return results; - } - } - + return errorPageSupport.findAll(); } @@ -3555,39 +3513,33 @@ public class StandardContext extends Con } - /** - * @return the context-relative URI of the error page for the specified - * HTTP status code, if any; otherwise return <code>null</code>. - * - * @param status HTTP status code to look up - */ @Override + @Deprecated public String findStatusPage(int status) { - ErrorPage errorPage = statusPages.get(Integer.valueOf(status)); - if (errorPage!=null) { + ErrorPage errorPage = findErrorPage(status); + if (errorPage != null) { return errorPage.getLocation(); } return null; - } - /** - * @return the set of HTTP status codes for which error pages have - * been specified. If none are specified, a zero-length array - * is returned. - */ @Override + @Deprecated public int[] findStatusPages() { - synchronized (statusPages) { - int results[] = new int[statusPages.size()]; - Iterator<Integer> elements = statusPages.keySet().iterator(); - int i = 0; - while (elements.hasNext()) - results[i++] = elements.next().intValue(); - return results; + ErrorPage[] errorPages = findErrorPages(); + int size = errorPages.length; + int temp[] = new int[size]; + int count = 0; + for (int i = 0; i < size; i++) { + if (errorPages[i].getExceptionType() == null) { + temp[count++] = errorPages[i].getErrorCode(); + } } + int result[] = new int[count]; + System.arraycopy(temp, 0, result, 0, count); + return result; } @@ -3861,19 +3813,8 @@ public class StandardContext extends Con */ @Override public void removeErrorPage(ErrorPage errorPage) { - - String exceptionType = errorPage.getExceptionType(); - if (exceptionType != null) { - synchronized (exceptionPages) { - exceptionPages.remove(exceptionType); - } - } else { - synchronized (statusPages) { - statusPages.remove(Integer.valueOf(errorPage.getErrorCode())); - } - } + errorPageSupport.remove(errorPage); fireContainerEvent("removeErrorPage", errorPage); - } Added: tomcat/trunk/java/org/apache/catalina/util/ErrorPageSupport.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/util/ErrorPageSupport.java?rev=1823647&view=auto ============================================================================== --- tomcat/trunk/java/org/apache/catalina/util/ErrorPageSupport.java (added) +++ tomcat/trunk/java/org/apache/catalina/util/ErrorPageSupport.java Fri Feb 9 12:27:53 2018 @@ -0,0 +1,75 @@ +/* + * 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.catalina.util; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.tomcat.util.descriptor.web.ErrorPage; + +/** + * Provides support for tracking per exception type and per HTTP status code + * error pages. + */ +public class ErrorPageSupport { + + // Fully qualified class name to error page + private Map<String, ErrorPage> exceptionPages = new ConcurrentHashMap<>(); + + // HTTP status code to error page + private Map<Integer, ErrorPage> statusPages = new ConcurrentHashMap<>(); + + + public void add(ErrorPage errorPage) { + String exceptionType = errorPage.getExceptionType(); + if (exceptionType == null) { + statusPages.put(Integer.valueOf(errorPage.getErrorCode()), errorPage); + } else { + exceptionPages.put(exceptionType, errorPage); + } + } + + + public void remove(ErrorPage errorPage) { + String exceptionType = errorPage.getExceptionType(); + if (exceptionType == null) { + statusPages.remove(Integer.valueOf(errorPage.getErrorCode()), errorPage); + } else { + exceptionPages.remove(exceptionType, errorPage); + } + } + + + public ErrorPage find(int statusCode) { + return statusPages.get(Integer.valueOf(statusCode)); + } + + + public ErrorPage find(String exceptionType) { + return exceptionPages.get(exceptionType); + } + + + public ErrorPage[] findAll() { + Set<ErrorPage> errorPages = new HashSet<>(); + errorPages.addAll(exceptionPages.values()); + errorPages.addAll(statusPages.values()); + return errorPages.toArray(new ErrorPage[errorPages.size()]); + } +} Propchange: tomcat/trunk/java/org/apache/catalina/util/ErrorPageSupport.java ------------------------------------------------------------------------------ svn:eol-style = native --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org