2012/5/22 <[email protected]>:
> Author: kfujino
> Date: Tue May 22 09:27:00 2012
> New Revision: 1341370
>
> URL: http://svn.apache.org/viewvc?rev=1341370&view=rev
> Log:
> Enable host's xmlBase attribute in ContextConfig.
>
> Modified:
> tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextConfig.java
> tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
>
> Modified:
> tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextConfig.java
> URL:
> http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextConfig.java?rev=1341370&r1=1341369&r2=1341370&view=diff
> ==============================================================================
> --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextConfig.java
> (original)
> +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextConfig.java
> Tue May 22 09:27:00 2012
> @@ -559,9 +559,8 @@ public class ContextConfig implements Li
> "contextConfig.badUrl", defaultContextFile), e);
> }
> }
> -
> - File hostContextFile = new File(getConfigBase(),
> - getHostConfigPath(Constants.HostContextXml));
> +
> + File hostContextFile = new File(getHostConfigBase(),
> Constants.HostContextXml);
> if (hostContextFile.exists()) {
> try {
> URL hostContextUrl = hostContextFile.toURI().toURL();
> @@ -1152,30 +1151,43 @@ public class ContextConfig implements Li
> return configBase;
> }
>
> -
> - protected String getHostConfigPath(String resourceName) {
> - StringBuilder result = new StringBuilder();
> + protected File getHostConfigBase() {
> + File file = null;
> Container container = context;
> - Container host = null;
> - Container engine = null;
> + Host host = null;
> + Engine engine = null;
> while (container != null) {
> - if (container instanceof Host)
> - host = container;
> - if (container instanceof Engine)
> - engine = container;
> + if (container instanceof Host) {
> + host = (Host)container;
> + }
> + if (container instanceof Engine) {
> + engine = (Engine)container;
> + }
> container = container.getParent();
> }
> - if (engine != null) {
> - result.append(engine.getName()).append('/');
> + if (host != null && host.getXmlBase()!=null) {
> + String xmlBase = host.getXmlBase();
> + file = new File(xmlBase);
> + if (!file.isAbsolute())
> + file = new File(new
> File(System.getProperty(Globals.CATALINA_BASE_PROP)),
> + xmlBase);
BTW, ContextConfig could call its own ContextConfig.getBaseDir() here
instead of direct look up of the system property.
The same in 3 other its methods (antiLocking(), fixDocBase(), getConfigBase()).
> + } else {
> + StringBuilder result = new StringBuilder();
> + if (engine != null) {
> + result.append(engine.getName()).append('/');
> + }
> + if (host != null) {
> + result.append(host.getName()).append('/');
> + }
> + file = new File (getConfigBase(), result.toString());
> }
> - if (host != null) {
> - result.append(host.getName()).append('/');
> + try {
> + return file.getCanonicalFile();
> + } catch (IOException e) {
> + return file;
> }
> - result.append(resourceName);
> - return result.toString();
> }
>
> -
> /**
> * Scan the web.xml files that apply to the web application and merge them
> * using the rules defined in the spec. For the global web.xml files,
> @@ -1686,22 +1698,15 @@ public class ContextConfig implements Li
> * it.
> */
> protected InputSource getHostWebXmlSource() {
> - String resourceName = getHostConfigPath(Constants.HostWebXml);
> -
> - // In an embedded environment, configBase might not be set
> - File configBase = getConfigBase();
> - if (configBase == null)
> - return null;
> -
The above "return null" case disappears without replacement.
> String basePath = null;
> try {
> - basePath = configBase.getCanonicalPath();
> + basePath = getHostConfigBase().getCanonicalPath();
getCanonicalFile() is already called inside of getHostConfigBase(), so
there is double work here.
> } catch (IOException e) {
> log.error(sm.getString("contextConfig.baseError"), e);
> return null;
> }
>
> - return getWebXmlSource(resourceName, basePath);
> + return getWebXmlSource(Constants.HostWebXml, basePath);
> }
>
> /**
>
There is code duplication between
HostConfig.configBase() and this new method ContextConfig.getHostConfigBase()
I wonder whether it could be simplified. If HostConfig reference
cannot be reached from ContextConfig, it could be a static method
inside of HostConfig to perform the calculation. Calculation of host's
default config path belongs to the host.
Best regards,
Konstantin Kolinko
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]