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("");
+ sb.append(elementName);
+ 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