From: markt Date: Tue, 29 Dec 2009 12:50:54 +0000 (+0000) Subject: Add configuration option that allows the effective web.xml to be logged on context... X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=403b90967611a4b548ffa168527bc6b516611c15;p=tomcat7.0 Add configuration option that allows the effective web.xml to be logged on context start. Expose the effective web.xml through a context attribute so other components (eg Jasper) can use it. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@894372 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/catalina/Context.java b/java/org/apache/catalina/Context.java index 84047da80..cc7d9648c 100644 --- a/java/org/apache/catalina/Context.java +++ b/java/org/apache/catalina/Context.java @@ -1101,5 +1101,16 @@ public interface Context extends Container { * null if none is used. */ public Authenticator getAuthenticator(); + + /** + * Set whether or not the effective web.xml for this context should be + * logged on context start. + */ + public void setLogEffectiveWebXml(boolean logEffectiveWebXml); + + /** + * Should the effective web.xml for this context be logged on context start? + */ + public boolean getLogEffectiveWebXml(); } diff --git a/java/org/apache/catalina/core/StandardContext.java b/java/org/apache/catalina/core/StandardContext.java index a3136298c..e0ef78e64 100644 --- a/java/org/apache/catalina/core/StandardContext.java +++ b/java/org/apache/catalina/core/StandardContext.java @@ -758,8 +758,20 @@ public class StandardContext */ private boolean clearReferencesStopThreads = false; + /** + * Should the effective web.xml be logged when the context starts? + */ + private boolean logEffectiveWebXml = false; + // ----------------------------------------------------- Context Properties + public void setLogEffectiveWebXml(boolean logEffectiveWebXml) { + this.logEffectiveWebXml = logEffectiveWebXml; + } + + public boolean getLogEffectiveWebXml() { + return logEffectiveWebXml; + } public Authenticator getAuthenticator() { if (this instanceof Authenticator) diff --git a/java/org/apache/catalina/startup/ContextConfig.java b/java/org/apache/catalina/startup/ContextConfig.java index b9953ea08..17edb9c27 100644 --- a/java/org/apache/catalina/startup/ContextConfig.java +++ b/java/org/apache/catalina/startup/ContextConfig.java @@ -32,7 +32,6 @@ import java.net.URLConnection; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Properties; import java.util.Set; @@ -1224,6 +1223,15 @@ public class ContextConfig // Apply merged web.xml to Context webXml.configureContext(context); } + // Make the merged web.xml available to other components, specifically + // Jasper, to save those components from having to re-generate it. + String mergedWebXml = webXml.toXml(); + context.getServletContext().setAttribute( + org.apache.tomcat.util.scan.Constants.MERGED_WEB_XML, + mergedWebXml); + if (context.getLogEffectiveWebXml()) { + log.info("web.xml:\n" + mergedWebXml); + } } diff --git a/java/org/apache/catalina/startup/WebXml.java b/java/org/apache/catalina/startup/WebXml.java index f258459e5..65b4f297a 100644 --- a/java/org/apache/catalina/startup/WebXml.java +++ b/java/org/apache/catalina/startup/WebXml.java @@ -21,6 +21,7 @@ package org.apache.catalina.startup; import java.net.URL; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.LinkedList; @@ -34,6 +35,7 @@ import org.apache.catalina.Context; import org.apache.catalina.Wrapper; import org.apache.catalina.deploy.ContextEjb; import org.apache.catalina.deploy.ContextEnvironment; +import org.apache.catalina.deploy.ContextHandler; import org.apache.catalina.deploy.ContextLocalEjb; import org.apache.catalina.deploy.ContextResource; import org.apache.catalina.deploy.ContextResourceEnvRef; @@ -41,12 +43,14 @@ import org.apache.catalina.deploy.ContextService; import org.apache.catalina.deploy.ErrorPage; import org.apache.catalina.deploy.FilterDef; import org.apache.catalina.deploy.FilterMap; +import org.apache.catalina.deploy.InjectionTarget; import org.apache.catalina.deploy.JspPropertyGroup; import org.apache.catalina.deploy.LoginConfig; import org.apache.catalina.deploy.MessageDestination; import org.apache.catalina.deploy.MessageDestinationRef; import org.apache.catalina.deploy.MultipartDef; import org.apache.catalina.deploy.ResourceBase; +import org.apache.catalina.deploy.SecurityCollection; import org.apache.catalina.deploy.SecurityConstraint; import org.apache.catalina.deploy.SecurityRoleRef; import org.apache.catalina.deploy.ServletDef; @@ -65,7 +69,7 @@ public class WebXml { protected static final String ORDER_OTHERS = "org.apache.catalina.order.others"; - protected static final StringManager sm = + private static final StringManager sm = StringManager.getManager(Constants.Package); private static final org.apache.juli.logging.Log log= @@ -461,8 +465,563 @@ public class WebXml { return buf.toString(); } + private static final String INDENT2 = " "; + private static final String INDENT4 = " "; + private static final String INDENT6 = " "; /** + * Generate a web.xml in String form that matches the representation stored + * in this object. + * + * @return The complete contents of web.xml as a String + */ + public String toXml() { + StringBuilder sb = new StringBuilder(2048); + + // TODO - Various, icon, description etc elements are skipped - mainly + // because they are ignored when web.xml is parsed - see above + + // Declaration + sb.append("\n"); + + // Root element + sb.append("\n\n"); + + appendElement(sb, INDENT2, "display-name", displayName); + + if (isDistributable()) { + sb.append(" \n\n"); + } + + for (Map.Entry entry : contextParams.entrySet()) { + sb.append(" \n"); + appendElement(sb, INDENT4, "param-name", entry.getKey()); + appendElement(sb, INDENT4, "param-valuee", entry.getValue()); + sb.append(" \n"); + } + sb.append('\n'); + + for (Map.Entry entry : filters.entrySet()) { + FilterDef filterDef = entry.getValue(); + sb.append(" \n"); + appendElement(sb, INDENT4, "description", + filterDef.getDescription()); + appendElement(sb, INDENT4, "display-name", + filterDef.getDisplayName()); + appendElement(sb, INDENT4, "filter-name", + filterDef.getFilterName()); + appendElement(sb, INDENT4, "filter-class", + filterDef.getFilterClass()); + appendElement(sb, INDENT4, "async-supported", + filterDef.getAsyncSupported()); + for (Map.Entry param : + filterDef.getParameterMap().entrySet()) { + sb.append(" \n"); + appendElement(sb, INDENT6, "param-name", param.getKey()); + appendElement(sb, INDENT6, "param-value", param.getValue()); + sb.append(" \n"); + } + sb.append(" \n"); + } + sb.append('\n'); + + for (FilterMap filterMap : filterMaps) { + sb.append(" \n"); + appendElement(sb, INDENT4, "filter-name", + filterMap.getFilterName()); + if (filterMap.getMatchAllServletNames()) { + sb.append(" *\n"); + } else { + for (String servletName : filterMap.getServletNames()) { + appendElement(sb, INDENT4, "servlet-name", servletName); + } + } + if (filterMap.getMatchAllUrlPatterns()) { + sb.append(" *\n"); + } else { + for (String urlPattern : filterMap.getURLPatterns()) { + appendElement(sb, INDENT4, "url-pattern", urlPattern); + } + } + for (String dispatcher : filterMap.getDispatcherNames()) { + appendElement(sb, INDENT4, "dispatcher", dispatcher); + } + sb.append(" \n"); + } + sb.append('\n'); + + for (String listener : listeners) { + sb.append(" \n"); + appendElement(sb, INDENT4, "listener-class", listener); + sb.append(" \n"); + } + sb.append('\n'); + + for (Map.Entry entry : servlets.entrySet()) { + ServletDef servletDef = entry.getValue(); + sb.append(" \n"); + appendElement(sb, INDENT4, "description", + servletDef.getDescription()); + appendElement(sb, INDENT4, "display-name", + servletDef.getDisplayName()); + appendElement(sb, INDENT4, "servlet-name", entry.getKey()); + appendElement(sb, INDENT4, "servlet-class", + servletDef.getServletClass()); + appendElement(sb, INDENT4, "jsp-file", servletDef.getJspFile()); + for (Map.Entry param : + servletDef.getParameterMap().entrySet()) { + sb.append(" \n"); + appendElement(sb, INDENT6, "param-name", param.getKey()); + appendElement(sb, INDENT6, "param-value", param.getValue()); + sb.append(" \n"); + } + appendElement(sb, INDENT4, "load-on-startup", + servletDef.getLoadOnStartup()); + // TODO enabled + appendElement(sb, INDENT4, "async-supported", + servletDef.getAsyncSupported()); + sb.append(" \n"); + appendElement(sb, INDENT6, "role-name", servletDef.getRunAs()); + sb.append(" \n"); + for (SecurityRoleRef roleRef : servletDef.getSecurityRoleRefs()) { + sb.append(" \n"); + appendElement(sb, INDENT6, "role-name", roleRef.getName()); + appendElement(sb, INDENT6, "role-link", roleRef.getLink()); + sb.append(" \n"); + } + MultipartDef multipartDef = servletDef.getMultipartDef(); + if (multipartDef != null) { + sb.append(" \n"); + appendElement(sb, INDENT6, "location", + multipartDef.getLocation()); + appendElement(sb, INDENT6, "max-file-size", + multipartDef.getMaxFileSize()); + appendElement(sb, INDENT6, "max-request-size", + multipartDef.getMaxRequestSize()); + appendElement(sb, INDENT6, "file-size-threshold", + multipartDef.getFileSizeThreshold()); + sb.append(" \n"); + } + sb.append(" \n"); + } + sb.append('\n'); + + for (Map.Entry entry : servletMappings.entrySet()) { + sb.append(" \n"); + appendElement(sb, INDENT4, "servlet-name", entry.getValue()); + appendElement(sb, INDENT4, "url-pattern", entry.getKey()); + sb.append(" \n"); + } + sb.append('\n'); + + if (sessionTimeout != null) { + sb.append(" \n"); + appendElement(sb, INDENT4, "session-timeout", + sessionTimeout.toString()); + // TODO cookie-config + // TODO tracking-mode + sb.append(" \n\n"); + } + + for (Map.Entry entry : mimeMappings.entrySet()) { + sb.append(" \n"); + appendElement(sb, INDENT4, "extension", entry.getKey()); + appendElement(sb, INDENT4, "mime-type", entry.getValue()); + sb.append(" \n"); + } + sb.append('\n'); + + if (welcomeFiles.size() > 0) { + sb.append(" \n"); + for (String welcomeFile : welcomeFiles) { + appendElement(sb, INDENT4, "welcome-file", welcomeFile); + } + sb.append(" \n\n"); + } + + for (ErrorPage errorPage : errorPages.values()) { + sb.append(" \n"); + if (errorPage.getExceptionType() == null) { + appendElement(sb, INDENT4, "error-code", + Integer.toString(errorPage.getErrorCode())); + } else { + appendElement(sb, INDENT4, "exception-type", + errorPage.getExceptionType()); + } + appendElement(sb, INDENT4, "location", errorPage.getLocation()); + sb.append(" \n"); + } + sb.append('\n'); + + if (taglibs.size() > 0 || jspPropertyGroups.size() > 0) { + sb.append(" \n"); + for (Map.Entry entry : taglibs.entrySet()) { + sb.append(" \n"); + appendElement(sb, INDENT6, "taglib-uri", entry.getKey()); + appendElement(sb, INDENT6, "taglib-location", entry.getValue()); + sb.append(" \n"); + } + for (JspPropertyGroup jpg : jspPropertyGroups) { + sb.append(" \n"); + appendElement(sb, INDENT6, "url-pattern", jpg.getUrlPattern()); + appendElement(sb, INDENT6, "el-ignored", jpg.getElIgnored()); + appendElement(sb, INDENT6, "scripting-invalid", + jpg.getScriptingInvalid()); + appendElement(sb, INDENT6, "page-encoding", + jpg.getPageEncoding()); + for (String prelude : jpg.getIncludePreludes()) { + appendElement(sb, INDENT6, "include-prelude", prelude); + } + for (String coda : jpg.getIncludeCodas()) { + appendElement(sb, INDENT6, "include-coda", coda); + } + appendElement(sb, INDENT6, "is-xml", jpg.getIsXml()); + appendElement(sb, INDENT6, "deferred-syntax-allowed-as-literal", + jpg.getDeferredSyntax()); + appendElement(sb, INDENT6, "trim-directive-whitespaces", + jpg.getTrimWhitespace()); + appendElement(sb, INDENT6, "default-content-type", + jpg.getDefaultContentType()); + appendElement(sb, INDENT6, "buffer", jpg.getBuffer()); + appendElement(sb, INDENT6, "error-on-undeclared-namespace", + jpg.getErrorOnUndeclaredNamespace()); + sb.append(" \n"); + } + sb.append(" \n\n"); + } + + for (SecurityConstraint constraint : securityConstraints) { + sb.append(" \n"); + appendElement(sb, INDENT4, "display-name", + constraint.getDisplayName()); + for (SecurityCollection collection : constraint.findCollections()) { + sb.append(" \n"); + appendElement(sb, INDENT6, "web-resource-name", + collection.getName()); + appendElement(sb, INDENT6, "description", + collection.getDescription()); + for (String urlPattern : collection.findPatterns()) { + appendElement(sb, INDENT6, "url-pattern", urlPattern); + } + for (String method : collection.findMethods()) { + appendElement(sb, INDENT6, "http-method", method); + } + sb.append(" \n"); + } + if (constraint.findAuthRoles().length > 0) { + sb.append(" \n"); + for (String role : constraint.findAuthRoles()) { + appendElement(sb, INDENT6, "role-name", role); + } + sb.append(" \n"); + } + if (constraint.getUserConstraint() != null) { + sb.append(" \n"); + appendElement(sb, INDENT6, "transport-guarantee", + constraint.getUserConstraint()); + sb.append(" \n"); + } + sb.append(" \n"); + } + sb.append('\n'); + + if (loginConfig != null) { + sb.append(" \n"); + appendElement(sb, INDENT4, "auth-method", + loginConfig.getAuthMethod()); + appendElement(sb,INDENT4, "realm-name", + loginConfig.getRealmName()); + if (loginConfig.getErrorPage() != null || + loginConfig.getLoginPage() != null) { + sb.append(" \n"); + appendElement(sb, INDENT6, "form-login-page", + loginConfig.getLoginPage()); + appendElement(sb, INDENT6, "form-error-page", + loginConfig.getErrorPage()); + sb.append(" \n"); + } + sb.append(" \n\n"); + } + + for (String roleName : securityRoles) { + sb.append(" \n"); + appendElement(sb, INDENT4, "role-name", roleName); + sb.append(" \n"); + } + + for (ContextEnvironment envEntry : envEntries.values()) { + sb.append(" \n"); + appendElement(sb, INDENT4, "description", + envEntry.getDescription()); + appendElement(sb, INDENT4, "env-entry-name", envEntry.getName()); + appendElement(sb, INDENT4, "env-entry-type", envEntry.getType()); + appendElement(sb, INDENT4, "env-entry-value", envEntry.getValue()); + // TODO mapped-name + for (InjectionTarget target : envEntry.getInjectionTargets()) { + sb.append(" \n"); + appendElement(sb, INDENT6, "injection-target-class", + target.getTargetClass()); + appendElement(sb, INDENT6, "injection-target-name", + target.getTargetName()); + sb.append(" \n"); + } + // TODO lookup-name + sb.append(" \n"); + } + sb.append('\n'); + + for (ContextEjb ejbRef : ejbRefs.values()) { + sb.append(" \n"); + appendElement(sb, INDENT4, "description", ejbRef.getDescription()); + appendElement(sb, INDENT4, "ejb-ref-name", ejbRef.getName()); + appendElement(sb, INDENT4, "ejb-ref-type", ejbRef.getType()); + appendElement(sb, INDENT4, "home", ejbRef.getHome()); + appendElement(sb, INDENT4, "remote", ejbRef.getRemote()); + appendElement(sb, INDENT4, "ejb-link", ejbRef.getLink()); + // TODO mapped-name + for (InjectionTarget target : ejbRef.getInjectionTargets()) { + sb.append(" \n"); + appendElement(sb, INDENT6, "injection-target-class", + target.getTargetClass()); + appendElement(sb, INDENT6, "injection-target-name", + target.getTargetName()); + sb.append(" \n"); + } + // TODO lookup-name + sb.append(" \n"); + } + sb.append('\n'); + + for (ContextLocalEjb ejbLocalRef : ejbLocalRefs.values()) { + sb.append(" \n"); + appendElement(sb, INDENT4, "description", + ejbLocalRef.getDescription()); + appendElement(sb, INDENT4, "ejb-ref-name", ejbLocalRef.getName()); + appendElement(sb, INDENT4, "ejb-ref-type", ejbLocalRef.getType()); + appendElement(sb, INDENT4, "local-home", ejbLocalRef.getHome()); + appendElement(sb, INDENT4, "local", ejbLocalRef.getLocal()); + appendElement(sb, INDENT4, "ejb-link", ejbLocalRef.getLink()); + // TODO mapped-name + for (InjectionTarget target : ejbLocalRef.getInjectionTargets()) { + sb.append(" \n"); + appendElement(sb, INDENT6, "injection-target-class", + target.getTargetClass()); + appendElement(sb, INDENT6, "injection-target-name", + target.getTargetName()); + sb.append(" \n"); + } + // TODO lookup-name + sb.append(" \n"); + } + sb.append('\n'); + + for (ContextService serviceRef : serviceRefs.values()) { + sb.append(" \n"); + appendElement(sb, INDENT4, "description", + serviceRef.getDescription()); + appendElement(sb, INDENT4, "display-name", + serviceRef.getDisplayname()); + appendElement(sb, INDENT4, "service-ref-name", + serviceRef.getName()); + appendElement(sb, INDENT4, "service-interface", + serviceRef.getInterface()); + appendElement(sb, INDENT4, "service-ref-type", + serviceRef.getType()); + appendElement(sb, INDENT4, "wsdl-file", serviceRef.getWsdlfile()); + appendElement(sb, INDENT4, "jaxrpc-mapping-file", + serviceRef.getJaxrpcmappingfile()); + String qname = serviceRef.getServiceqnameNamespaceURI(); + if (qname != null) { + qname = qname + ":"; + } + qname = qname + serviceRef.getServiceqnameLocalpart(); + appendElement(sb, INDENT4, "service-qname", qname); + Iterator endpointIter = serviceRef.getServiceendpoints(); + while (endpointIter.hasNext()) { + String endpoint = endpointIter.next(); + sb.append(" \n"); + appendElement(sb, INDENT6, "service-endpoint-interface", + endpoint); + appendElement(sb, INDENT6, "port-component-link", + serviceRef.getProperty(endpoint)); + sb.append(" \n"); + } + Iterator handlerIter = serviceRef.getHandlers(); + while (handlerIter.hasNext()) { + String handler = handlerIter.next(); + sb.append(" \n"); + ContextHandler ch = serviceRef.getHandler(handler); + appendElement(sb, INDENT6, "handler-name", ch.getName()); + appendElement(sb, INDENT6, "handler-class", + ch.getHandlerclass()); + sb.append(" \n"); + } + // TODO handler-chains + // TODO mapped-name + for (InjectionTarget target : serviceRef.getInjectionTargets()) { + sb.append(" \n"); + appendElement(sb, INDENT6, "injection-target-class", + target.getTargetClass()); + appendElement(sb, INDENT6, "injection-target-name", + target.getTargetName()); + sb.append(" \n"); + } + // TODO lookup-name + sb.append(" \n"); + } + sb.append('\n'); + + for (ContextResource resourceRef : resourceRefs.values()) { + sb.append(" \n"); + appendElement(sb, INDENT4, "description", + resourceRef.getDescription()); + appendElement(sb, INDENT4, "res-ref-name", resourceRef.getName()); + appendElement(sb, INDENT4, "res-type", resourceRef.getType()); + appendElement(sb, INDENT4, "res-auth", resourceRef.getAuth()); + appendElement(sb, INDENT4, "res-sharing-scope", + resourceRef.getScope()); + // TODO mapped-name + for (InjectionTarget target : resourceRef.getInjectionTargets()) { + sb.append(" \n"); + appendElement(sb, INDENT6, "injection-target-class", + target.getTargetClass()); + appendElement(sb, INDENT6, "injection-target-name", + target.getTargetName()); + sb.append(" \n"); + } + // TODO lookup-name + sb.append(" \n"); + } + sb.append('\n'); + + for (ContextResourceEnvRef resourceEnvRef : resourceEnvRefs.values()) { + sb.append(" \n"); + appendElement(sb, INDENT4, "description", + resourceEnvRef.getDescription()); + appendElement(sb, INDENT4, "resource-env-ref-name", + resourceEnvRef.getName()); + appendElement(sb, INDENT4, "resource-env-ref-type", + resourceEnvRef.getType()); + // TODO mapped-name + for (InjectionTarget target : + resourceEnvRef.getInjectionTargets()) { + sb.append(" \n"); + appendElement(sb, INDENT6, "injection-target-class", + target.getTargetClass()); + appendElement(sb, INDENT6, "injection-target-name", + target.getTargetName()); + sb.append(" \n"); + } + // TODO lookup-name + sb.append(" \n"); + } + sb.append('\n'); + + for (MessageDestinationRef mdr : messageDestinationRefs.values()) { + sb.append(" \n"); + appendElement(sb, INDENT4, "description", mdr.getDescription()); + appendElement(sb, INDENT4, "message-destination-ref-name", + mdr.getName()); + appendElement(sb, INDENT4, "message-destination-type", + mdr.getType()); + appendElement(sb, INDENT4, "message-destination-usage", + mdr.getUsage()); + appendElement(sb, INDENT4, "message-destination-link", + mdr.getLink()); + // TODO mapped-name + for (InjectionTarget target : mdr.getInjectionTargets()) { + sb.append(" \n"); + appendElement(sb, INDENT6, "injection-target-class", + target.getTargetClass()); + appendElement(sb, INDENT6, "injection-target-name", + target.getTargetName()); + sb.append(" \n"); + } + // TODO lookup-name + sb.append(" \n"); + } + sb.append('\n'); + + for (MessageDestination md : messageDestinations.values()) { + sb.append(" \n"); + appendElement(sb, INDENT4, "description", md.getDescription()); + appendElement(sb, INDENT4, "display-name", md.getDisplayName()); + appendElement(sb, INDENT4, "message-destination-name", + md.getName()); + // TODO mapped-name + sb.append(" \n"); + } + sb.append('\n'); + + if (localeEncodingMappings.size() > 0) { + sb.append(" \n"); + for (Map.Entry entry : + localeEncodingMappings.entrySet()) { + sb.append(" \n"); + appendElement(sb, INDENT6, "locale", entry.getKey()); + appendElement(sb, INDENT6, "encoding", entry.getValue()); + sb.append(" \n"); + } + sb.append(" \n"); + } + sb.append(""); + return sb.toString(); + } + + private static void appendElement(StringBuilder sb, String indent, + String elementName, String value) { + if (value == null || value.length() == 0) return; + sb.append(indent); + sb.append('<'); + sb.append(elementName); + sb.append('>'); + sb.append(escapeXml(value)); + sb.append("\n"); + } + + private static void appendElement(StringBuilder sb, String indent, + String elementName, Object value) { + if (value == null) return; + appendElement(sb, indent, elementName, value.toString()); + } + + + /** + * Escape the 5 entities defined by XML. + */ + private static String escapeXml(String s) { + if (s == null) + return null; + StringBuilder sb = new StringBuilder(); + 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(); + } + + + /** * Configure a {@link Context} using the stored web.xml representation. * * @param context The context to be configured @@ -726,7 +1285,8 @@ public class WebXml { filters.putAll(temp.getFilters()); for (WebXml fragment : fragments) { - for (JspPropertyGroup jspPropertyGroup : fragment.getJspPropertyGroups()) { + for (JspPropertyGroup jspPropertyGroup : + fragment.getJspPropertyGroups()) { // Always additive addJspPropertyGroup(jspPropertyGroup); } @@ -904,7 +1464,7 @@ public class WebXml { return true; } - private boolean mergeResourceMap( + private static boolean mergeResourceMap( Map fragmentResources, Map mainResources, Map tempResources, Map mergeInjectionFlags, WebXml fragment) { @@ -943,7 +1503,7 @@ public class WebXml { return true; } - private boolean mergeMap(Map fragmentMap, + private static boolean mergeMap(Map fragmentMap, Map mainMap, Map tempMap, WebXml fragment, String mapName) { for (String key : fragmentMap.keySet()) { @@ -969,7 +1529,8 @@ public class WebXml { return true; } - private boolean mergeFilter(FilterDef src, FilterDef dest, boolean failOnConflict) { + private static boolean mergeFilter(FilterDef src, FilterDef dest, + boolean failOnConflict) { if (dest.getAsyncSupported() == null) { dest.setAsyncSupported(src.getAsyncSupported()); } else if (src.getAsyncSupported() != null) { @@ -1002,7 +1563,8 @@ public class WebXml { return true; } - private boolean mergeServlet(ServletDef src, ServletDef dest, boolean failOnConflict) { + private static boolean mergeServlet(ServletDef src, ServletDef dest, + boolean failOnConflict) { // These tests should be unnecessary... if (dest.getServletClass() != null && dest.getJspFile() != null) { return false; @@ -1073,7 +1635,7 @@ public class WebXml { return true; } - private boolean mergeMultipartDef(MultipartDef src, MultipartDef dest, + private static boolean mergeMultipartDef(MultipartDef src, MultipartDef dest, boolean failOnConflict) { if (dest.getLocation() == null) { @@ -1228,4 +1790,3 @@ public class WebXml { } } - diff --git a/java/org/apache/tomcat/util/scan/Constants.java b/java/org/apache/tomcat/util/scan/Constants.java index 52e11c4c0..b84517d29 100644 --- a/java/org/apache/tomcat/util/scan/Constants.java +++ b/java/org/apache/tomcat/util/scan/Constants.java @@ -24,11 +24,15 @@ public final class Constants { public static final String Package = "org.apache.tomcat.util.scan"; + /* System properties */ public static final String SKIP_JARS_PROPERTY = "tomcat.util.scan.DefaultJarScanner.jarsToSkip"; + /* Commons strings */ public static final String JAR_EXT = ".jar"; public static final String WEB_INF_LIB = "/WEB-INF/lib/"; - + /* Context attributes - used to pass short-cuts to Jasper */ + public static final String MERGED_WEB_XML = + "org.apache.tomcat.util.scan.MergedWebXml"; } diff --git a/webapps/docs/config/context.xml b/webapps/docs/config/context.xml index 6d5e852f5..269fa5995 100644 --- a/webapps/docs/config/context.xml +++ b/webapps/docs/config/context.xml @@ -177,6 +177,15 @@ inferred by the automatic deployment process.

+ +

Set to true if you want the effective web.xml used for a + web application to be logged (at INFO level) when the application + starts. The effective web.xml is the result of combining the + application's web.xml with any defaults configured by Tomcat and any + web-fragment.xml files and annotations discovered. If not specified, the + default value of false is used.

+
+

Set to true to have explicit settings in this Context element override any corresponding settings in either the global