diff -Naur apache-tomcat-6.0.44-src.orig/java/org/apache/catalina/startup/Bootstrap.java apache-tomcat-6.0.44-src/java/org/apache/catalina/startup/Bootstrap.java --- apache-tomcat-6.0.44-src.orig/java/org/apache/catalina/startup/Bootstrap.java 2015-05-08 13:22:05.000000000 +0100 +++ apache-tomcat-6.0.44-src/java/org/apache/catalina/startup/Bootstrap.java 2015-08-25 21:34:29.774917427 +0100 @@ -109,40 +109,18 @@ String value = CatalinaProperties.getProperty(name + ".loader"); if ((value == null) || (value.equals(""))) return parent; + + value = replace(value); ArrayList repositoryLocations = new ArrayList(); ArrayList repositoryTypes = new ArrayList(); - int i; StringTokenizer tokenizer = new StringTokenizer(value, ","); while (tokenizer.hasMoreElements()) { - String repository = tokenizer.nextToken(); - - // Local repository - boolean replace = false; - String before = repository; - while ((i=repository.indexOf(CATALINA_HOME_TOKEN))>=0) { - replace=true; - if (i>0) { - repository = repository.substring(0,i) + getCatalinaHome() - + repository.substring(i+CATALINA_HOME_TOKEN.length()); - } else { - repository = getCatalinaHome() - + repository.substring(CATALINA_HOME_TOKEN.length()); - } - } - while ((i=repository.indexOf(CATALINA_BASE_TOKEN))>=0) { - replace=true; - if (i>0) { - repository = repository.substring(0,i) + getCatalinaBase() - + repository.substring(i+CATALINA_BASE_TOKEN.length()); - } else { - repository = getCatalinaBase() - + repository.substring(CATALINA_BASE_TOKEN.length()); - } + String repository = tokenizer.nextToken().trim(); + if (repository.length() == 0) { + continue; } - if (replace && log.isDebugEnabled()) - log.debug("Expanded " + before + " to " + repository); // Check for a JAR URL repository try { @@ -154,6 +132,7 @@ // Ignore } + // Local repository if (repository.endsWith("*.jar")) { repository = repository.substring (0, repository.length() - "*.jar".length()); @@ -192,6 +171,51 @@ } + /** + * System property replacement in the given string. + * + * @param str The original string + * @return the modified string + */ + protected String replace(String str) { + // Implementation is copied from ClassLoaderLogManager.replace(), + // but added special processing for catalina.home and catalina.base. + String result = str; + int pos_start = str.indexOf("${"); + if (pos_start >= 0) { + StringBuilder builder = new StringBuilder(); + int pos_end = -1; + while (pos_start >= 0) { + builder.append(str, pos_end + 1, pos_start); + pos_end = str.indexOf('}', pos_start + 2); + if (pos_end < 0) { + pos_end = pos_start - 1; + break; + } + String propName = str.substring(pos_start + 2, pos_end); + String replacement; + if (propName.length() == 0) { + replacement = null; + } else if (CATALINA_HOME_TOKEN.equals(propName)) { + replacement = getCatalinaHome(); + } else if (CATALINA_BASE_TOKEN.equals(propName)) { + replacement = getCatalinaBase(); + } else { + replacement = System.getProperty(propName); + } + if (replacement != null) { + builder.append(replacement); + } else { + builder.append(str, pos_start, pos_end + 1); + } + pos_start = str.indexOf("${", pos_end + 1); + } + builder.append(str, pos_end + 1, str.length()); + result = builder.toString(); + } + return result; + } + /** * Initialize daemon.