Author: remy.maucherat(a)jboss.com
Date: 2009-04-21 14:15:22 -0400 (Tue, 21 Apr 2009)
New Revision: 1022
Modified:
trunk/java/org/apache/catalina/Host.java
trunk/java/org/apache/catalina/core/StandardHost.java
trunk/java/org/apache/catalina/manager/host/HostManagerServlet.java
trunk/java/org/apache/catalina/mbeans/MBeanFactory.java
trunk/java/org/apache/catalina/startup/BaseContextScanner.java
trunk/java/org/apache/catalina/startup/ContextConfig.java
trunk/java/org/apache/catalina/startup/HostConfig.java
trunk/java/org/apache/catalina/startup/WarScanner.java
trunk/java/org/apache/tomcat/WarComponents.java
Log:
- Remove XML properties from the host as well.
- Refactor TLD parsing.
Modified: trunk/java/org/apache/catalina/Host.java
===================================================================
--- trunk/java/org/apache/catalina/Host.java 2009-04-21 03:39:25 UTC (rev 1021)
+++ trunk/java/org/apache/catalina/Host.java 2009-04-21 18:15:22 UTC (rev 1022)
@@ -149,38 +149,6 @@
public void setName(String name);
- /**
- * Get the server.xml <host> attribute's xmlNamespaceAware.
- * @return true if namespace awarenes is enabled.
- *
- */
- public boolean getXmlNamespaceAware();
-
-
- /**
- * Get the server.xml <host> attribute's xmlValidation.
- * @return true if validation is enabled.
- *
- */
- public boolean getXmlValidation();
-
-
- /**
- * Set the validation feature of the XML parser used when
- * parsing xml instances.
- * @param xmlValidation true to enable xml instance validation
- */
- public void setXmlValidation(boolean xmlValidation);
-
-
- /**
- * Set the namespace aware feature of the XML parser used when
- * parsing xml instances.
- * @param xmlNamespaceAware true to enable namespace awareness
- */
- public void setXmlNamespaceAware(boolean xmlNamespaceAware);
-
-
// --------------------------------------------------------- Public Methods
Modified: trunk/java/org/apache/catalina/core/StandardHost.java
===================================================================
--- trunk/java/org/apache/catalina/core/StandardHost.java 2009-04-21 03:39:25 UTC (rev
1021)
+++ trunk/java/org/apache/catalina/core/StandardHost.java 2009-04-21 18:15:22 UTC (rev
1022)
@@ -150,18 +150,6 @@
private String workDir = null;
- /**
- * Attribute value used to turn on/off XML validation
- */
- private boolean xmlValidation = false;
-
-
- /**
- * Attribute value used to turn on/off XML namespace awarenes.
- */
- private boolean xmlNamespaceAware = false;
-
-
// ------------------------------------------------------------- Properties
@@ -421,46 +409,7 @@
}
- /**
- * Set the validation feature of the XML parser used when
- * parsing xml instances.
- * @param xmlValidation true to enable xml instance validation
- */
- public void setXmlValidation(boolean xmlValidation){
-
- this.xmlValidation = xmlValidation;
-
- }
-
/**
- * Get the server.xml <host> attribute's xmlValidation.
- * @return true if validation is enabled.
- *
- */
- public boolean getXmlValidation(){
- return xmlValidation;
- }
-
- /**
- * Get the server.xml <host> attribute's xmlNamespaceAware.
- * @return true if namespace awarenes is enabled.
- *
- */
- public boolean getXmlNamespaceAware(){
- return xmlNamespaceAware;
- }
-
-
- /**
- * Set the namespace aware feature of the XML parser used when
- * parsing xml instances.
- * @param xmlNamespaceAware true to enable namespace awareness
- */
- public void setXmlNamespaceAware(boolean xmlNamespaceAware){
- this.xmlNamespaceAware=xmlNamespaceAware;
- }
-
- /**
* Host work directory base.
*/
public String getWorkDir() {
@@ -705,12 +654,7 @@
errorReportValveClass), t);
}
}
- if(log.isDebugEnabled()) {
- if (xmlValidation)
- log.debug(sm.getString("standardHost.validationEnabled"));
- else
- log.debug(sm.getString("standardHost.validationDisabled"));
- }
+
super.start();
}
Modified: trunk/java/org/apache/catalina/manager/host/HostManagerServlet.java
===================================================================
--- trunk/java/org/apache/catalina/manager/host/HostManagerServlet.java 2009-04-21
03:39:25 UTC (rev 1021)
+++ trunk/java/org/apache/catalina/manager/host/HostManagerServlet.java 2009-04-21
18:15:22 UTC (rev 1022)
@@ -455,8 +455,6 @@
host.setDeployOnStartup(deployOnStartup);
host.setDeployXML(deployXML);
host.setUnpackWARs(unpackWARs);
- host.setXmlNamespaceAware(xmlNamespaceAware);
- host.setXmlValidation(xmlValidation);
// Add new host
try {
Modified: trunk/java/org/apache/catalina/mbeans/MBeanFactory.java
===================================================================
--- trunk/java/org/apache/catalina/mbeans/MBeanFactory.java 2009-04-21 03:39:25 UTC (rev
1021)
+++ trunk/java/org/apache/catalina/mbeans/MBeanFactory.java 2009-04-21 18:15:22 UTC (rev
1022)
@@ -720,8 +720,6 @@
host.setDeployOnStartup(deployOnStartup);
host.setDeployXML(deployXML);
host.setUnpackWARs(unpackWARs);
- host.setXmlNamespaceAware(xmlNamespaceAware);
- host.setXmlValidation(xmlValidation);
// add HostConfig for active reloading
HostConfig hostConfig = new HostConfig();
Modified: trunk/java/org/apache/catalina/startup/BaseContextScanner.java
===================================================================
--- trunk/java/org/apache/catalina/startup/BaseContextScanner.java 2009-04-21 03:39:25 UTC
(rev 1021)
+++ trunk/java/org/apache/catalina/startup/BaseContextScanner.java 2009-04-21 18:15:22 UTC
(rev 1022)
@@ -32,8 +32,8 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
-import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
@@ -108,7 +108,7 @@
protected ArrayList<Class<?>> annotatedClasses = new
ArrayList<Class<?>>();
protected ArrayList<String> overlays = new ArrayList<String>();
protected ArrayList<String> webFragments = new ArrayList<String>();
- protected Map<String, List<String>> TLDs = new HashMap<String,
List<String>>();
+ protected Map<String, Set<String>> TLDs = new HashMap<String,
Set<String>>();
public Iterator<Class<?>> getAnnotatedClasses() {
@@ -126,7 +126,7 @@
}
- public Map<String, List<String>> getTLDs() {
+ public Map<String, Set<String>> getTLDs() {
return TLDs;
}
@@ -199,26 +199,14 @@
loader = loader.getParent();
}
- ArrayList<String> warTLDs = new ArrayList<String>();
+ HashSet<String> warTLDs = new HashSet<String>();
- // Find taglibs from web.xml
- // FIXME: move this elsewhere, this should be done last when parsing TLDs
- String taglibs[] = context.findTaglibs();
- for (int i = 0; i < taglibs.length; i++) {
- String resourcePath = context.findTaglib(taglibs[i]);
- if (!resourcePath.startsWith("/")) {
- resourcePath = "/WEB-INF/" + resourcePath;
- }
- warTLDs.add(resourcePath);
- }
// Find any TLD file in /WEB-INF
DirContext resources = context.getResources();
if (resources != null) {
tldScanResourcePathsWebInf(resources, "/WEB-INF", warTLDs);
}
- if (warTLDs.size() > 0) {
- TLDs.put("", warTLDs);
- }
+ TLDs.put("", warTLDs);
/*
DirContext resources = context.getResources();
@@ -261,7 +249,7 @@
*/
protected void tldScanResourcePathsWebInf(DirContext resources,
String rootPath,
- ArrayList<String> tldPaths) {
+ HashSet<String> tldPaths) {
try {
NamingEnumeration items = resources.list(rootPath);
while (items.hasMoreElements()) {
@@ -386,7 +374,7 @@
if (file.getEntry(Globals.OVERLAY_PATH) != null) {
overlays.add(file.getName());
}
- ArrayList<String> jarTLDs = new ArrayList<String>();
+ HashSet<String> jarTLDs = new HashSet<String>();
Enumeration<JarEntry> entries = file.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
Modified: trunk/java/org/apache/catalina/startup/ContextConfig.java
===================================================================
--- trunk/java/org/apache/catalina/startup/ContextConfig.java 2009-04-21 03:39:25 UTC (rev
1021)
+++ trunk/java/org/apache/catalina/startup/ContextConfig.java 2009-04-21 18:15:22 UTC (rev
1022)
@@ -53,12 +53,18 @@
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
+import java.util.Enumeration;
import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import java.util.Properties;
+import java.util.Set;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
import javax.servlet.DispatcherType;
import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
import javax.servlet.annotation.HandlesTypes;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebFilter;
@@ -185,6 +191,13 @@
/**
+ * The <code>Digester</code> we will use to process tag library
+ * descriptor files.
+ */
+ protected static Digester tldDigester = null;
+
+
+ /**
* The <code>Rule</code> used to parse the web.xml
*/
protected static WebRuleSet webRuleSet = new WebRuleSet();
@@ -417,6 +430,9 @@
*/
protected void applicationWebConfig() {
+ // FIXME: Parse web fragments here
+ // FIXME: Parse according to the configured order
+
String altDDName = null;
// Open the application web.xml file, if it exists
@@ -489,6 +505,7 @@
ok = false;
} finally {
webDigester.reset();
+ webRuleSet.recycle();
parseException = null;
try {
if (stream != null) {
@@ -499,15 +516,105 @@
}
}
}
- webRuleSet.recycle();
+ // Add all TLDs from explicit web config
+ Map<String, Set<String>> TLDs = scanner.getTLDs();
+ Set<String> warTLDs = TLDs.get("");
+ String taglibs[] = context.findTaglibs();
+ for (int i = 0; i < taglibs.length; i++) {
+ String resourcePath = context.findTaglib(taglibs[i]);
+ if (!resourcePath.startsWith("/")) {
+ resourcePath = "/WEB-INF/" + resourcePath;
+ }
+ warTLDs.add(resourcePath);
+ }
+
+ // Parse all TLDs from the WAR
+ Iterator<String> warTLDsIterator = warTLDs.iterator();
+ while (warTLDsIterator.hasNext()) {
+ String tldPath = warTLDsIterator.next();
+ try {
+ stream = context.getServletContext().getResourceAsStream(tldPath);
+ if (stream == null) {
+ log.error(sm.getString("contextConfig.tldResourcePath",
tldPath));
+ ok = false;
+ } else {
+ synchronized (tldDigester) {
+ try {
+ tldDigester.push(context);
+ tldDigester.parse(new InputSource(stream));
+ } finally {
+ tldDigester.reset();
+ }
+ }
+ }
+ } catch (Exception e) {
+ log.error(sm.getString("contextConfig.tldFileException",
tldPath,
+ context.getPath()), e);
+ ok = false;
+ } finally {
+ if (stream != null) {
+ try {
+ stream.close();
+ } catch (Throwable t) {
+ // Ignore
+ }
+ }
+ }
+
+ }
+
+ // Parse all TLDs from JARs
+ Iterator<String> jarPaths = TLDs.keySet().iterator();
+ while (jarPaths.hasNext()) {
+ String jarPath = jarPaths.next();
+ if (jarPath.equals("")) {
+ continue;
+ }
+ JarFile jarFile = null;
+ try {
+ jarFile = new JarFile(jarPath);
+ Iterator<String> jarTLDsIterator = TLDs.get(jarPath).iterator();
+ while (jarTLDsIterator.hasNext()) {
+ stream =
jarFile.getInputStream(jarFile.getEntry(jarTLDsIterator.next()));
+ synchronized (tldDigester) {
+ try {
+ tldDigester.push(context);
+ tldDigester.parse(new InputSource(stream));
+ } finally {
+ tldDigester.reset();
+ if (stream != null) {
+ try {
+ stream.close();
+ } catch (Throwable t) {
+ // Ignore
+ }
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ log.error(sm.getString("contextConfig.tldJarException",
+ jarPath, context.getPath()), e);
+ ok = false;
+ } finally {
+ if (jarFile != null) {
+ try {
+ jarFile.close();
+ } catch (Throwable t) {
+ // Ignore
+ }
+ }
+ }
+ }
+
long t2=System.currentTimeMillis();
if (context instanceof StandardContext) {
((StandardContext) context).setStartupTime(t2-t1);
}
}
+
-
/**
* Set up an Authenticator automatically if required, and one has not
* already been configured.
@@ -629,25 +736,24 @@
* web application deployment descriptor (web.xml).
*/
protected static Digester createWebDigester() {
- return createWebXmlDigester(Globals.XML_NAMESPACE_AWARE,
Globals.XML_VALIDATION);
+ return DigesterFactory.newDigester(Globals.XML_NAMESPACE_AWARE,
Globals.XML_VALIDATION, webRuleSet);
}
/**
- * Create (if necessary) and return a Digester configured to process the
- * web application deployment descriptor (web.xml).
+ * Create (if necessary) and return a Digester configured to process tag
+ * library descriptors.
*/
- public static Digester createWebXmlDigester(boolean namespaceAware,
- boolean validation) {
- return DigesterFactory.newDigester(validation, namespaceAware, webRuleSet);
+ protected static Digester createTldDigester() {
+ return DigesterFactory.newDigester(Globals.XML_NAMESPACE_AWARE,
Globals.XML_VALIDATION, new TldRuleSet());
}
-
+
/**
* Create (if necessary) and return a Digester configured to process the
* context configuration descriptor for an application.
*/
- protected Digester createContextDigester() {
+ protected static Digester createContextDigester() {
Digester digester = new Digester();
digester.setValidating(false);
RuleSet contextRuleSet = new ContextRuleSet("", false);
@@ -820,36 +926,13 @@
/**
* Process additional descriptors: TLDs, web fragments, and map overlays.
*/
- // FIXME: Processing of web fragments
- // FIXME: Map overlays
protected void applicationExtraDescriptorsConfig() {
- WarScanner tldConfig = new WarScanner();
- tldConfig.setContext(context);
+ // FIXME: Read order from web.xml and fragments (note: if no fragments, skip)
- /*
- // (1) check if the attribute has been defined
- // on the context element.
- tldConfig.setTldValidation(context.getTldValidation());
- tldConfig.setTldNamespaceAware(context.getTldNamespaceAware());
-
- // (2) if the attribute wasn't defined on the context
- // try the host.
- if (!context.getTldValidation()) {
- tldConfig.setTldValidation
- (((StandardHost) context.getParent()).getXmlValidation());
- }
-
- if (!context.getTldNamespaceAware()) {
- tldConfig.setTldNamespaceAware
- (((StandardHost) context.getParent()).getXmlNamespaceAware());
- }*/
-
- try {
- tldConfig.execute();
- } catch (Exception ex) {
- log.error("Error reading tld listeners "
- + ex.toString(), ex);
- }
+ // FIXME: Generate final web descriptor order
+
+ // FIXME: Add overlays
+
}
@@ -1135,6 +1218,11 @@
webDigester.getParser();
}
+ if (tldDigester == null){
+ tldDigester = createTldDigester();
+ tldDigester.getParser();
+ }
+
if (contextDigester == null){
contextDigester = createContextDigester();
contextDigester.getParser();
@@ -1173,14 +1261,14 @@
if (log.isDebugEnabled())
log.debug(sm.getString("contextConfig.start"));
- ContextScanner scanner = new ClassLoadingContextScanner();
+ scanner = new ClassLoadingContextScanner();
// Process the default and application web.xml files
defaultWebConfig();
+ applicationWebConfig();
+ scanner.scan(context);
// FIXME: look where to place it according to the merging rules
applicationExtraDescriptorsConfig();
- applicationWebConfig();
- scanner.scan(context);
if (!context.getIgnoreAnnotations()) {
applicationAnnotationsConfig();
}
Modified: trunk/java/org/apache/catalina/startup/HostConfig.java
===================================================================
--- trunk/java/org/apache/catalina/startup/HostConfig.java 2009-04-21 03:39:25 UTC (rev
1021)
+++ trunk/java/org/apache/catalina/startup/HostConfig.java 2009-04-21 18:15:22 UTC (rev
1022)
@@ -137,18 +137,6 @@
/**
- * Attribute value used to turn on/off XML validation
- */
- protected boolean xmlValidation = false;
-
-
- /**
- * Attribute value used to turn on/off XML namespace awarenes.
- */
- protected boolean xmlNamespaceAware = false;
-
-
- /**
* The <code>Digester</code> instance used to parse context descriptors.
*/
protected static Digester digester = createDigester();
@@ -245,44 +233,6 @@
}
- /**
- * Set the validation feature of the XML parser used when
- * parsing xml instances.
- * @param xmlValidation true to enable xml instance validation
- */
- public void setXmlValidation(boolean xmlValidation){
- this.xmlValidation = xmlValidation;
- }
-
- /**
- * Get the server.xml <host> attribute's xmlValidation.
- * @return true if validation is enabled.
- *
- */
- public boolean getXmlValidation(){
- return xmlValidation;
- }
-
- /**
- * Get the server.xml <host> attribute's xmlNamespaceAware.
- * @return true if namespace awarenes is enabled.
- *
- */
- public boolean getXmlNamespaceAware(){
- return xmlNamespaceAware;
- }
-
-
- /**
- * Set the namespace aware feature of the XML parser used when
- * parsing xml instances.
- * @param xmlNamespaceAware true to enable namespace awareness
- */
- public void setXmlNamespaceAware(boolean xmlNamespaceAware){
- this.xmlNamespaceAware=xmlNamespaceAware;
- }
-
-
// --------------------------------------------------------- Public Methods
@@ -302,8 +252,6 @@
if (host instanceof StandardHost) {
setDeployXML(((StandardHost) host).isDeployXML());
setUnpackWARs(((StandardHost) host).isUnpackWARs());
- setXmlNamespaceAware(((StandardHost) host).getXmlNamespaceAware());
- setXmlValidation(((StandardHost) host).getXmlValidation());
}
} catch (ClassCastException e) {
log.error(sm.getString("hostConfig.cce", event.getLifecycle()),
e);
Modified: trunk/java/org/apache/catalina/startup/WarScanner.java
===================================================================
--- trunk/java/org/apache/catalina/startup/WarScanner.java 2009-04-21 03:39:25 UTC (rev
1021)
+++ trunk/java/org/apache/catalina/startup/WarScanner.java 2009-04-21 18:15:22 UTC (rev
1022)
@@ -86,6 +86,7 @@
* @author Jean-Francois Arcand
* @author Costin Manolache
* @author Remy Maucherat
+ * @deprecated No longer used
*/
public final class WarScanner {
Modified: trunk/java/org/apache/tomcat/WarComponents.java
===================================================================
--- trunk/java/org/apache/tomcat/WarComponents.java 2009-04-21 03:39:25 UTC (rev 1021)
+++ trunk/java/org/apache/tomcat/WarComponents.java 2009-04-21 18:15:22 UTC (rev 1022)
@@ -24,8 +24,8 @@
package org.apache.tomcat;
import java.util.Iterator;
-import java.util.List;
import java.util.Map;
+import java.util.Set;
public interface WarComponents {
@@ -50,6 +50,6 @@
/**
* Find TLDs.
*/
- public Map<String, List<String>> getTLDs();
+ public Map<String, Set<String>> getTLDs();
}