Author: markt
Date: Wed May 7 13:12:27 2014
New Revision: 1593009
URL: http://svn.apache.org/r1593009
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56451
Revert r1592052 and apply and alternative fix that should have fewer side
effects.
Modified:
tomcat/tc7.0.x/trunk/java/org/apache/naming/resources/BaseDirContext.java
tomcat/tc7.0.x/trunk/test/org/apache/naming/resources/TestNamingContext.java
Modified:
tomcat/tc7.0.x/trunk/java/org/apache/naming/resources/BaseDirContext.java
URL:
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/naming/resources/BaseDirContext.java?rev=1593009&r1=1593008&r2=1593009&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/naming/resources/BaseDirContext.java
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/naming/resources/BaseDirContext.java
Wed May 7 13:12:27 2014
@@ -181,7 +181,11 @@ public abstract class BaseDirContext imp
* Add an alias.
*/
public void addAlias(String path, BaseDirContext dirContext) {
- aliases.put(convertPathToName(path), dirContext);
+ if (!path.startsWith("/")) {
+ throw new IllegalArgumentException(
+ sm.getString("resources.invalidAliasPath", path));
+ }
+ aliases.put(path, dirContext);
}
@@ -189,21 +193,14 @@ public abstract class BaseDirContext imp
* Remove an alias.
*/
public void removeAlias(String path) {
- aliases.remove(convertPathToName(path));
- }
-
-
- private String convertPathToName(String path) {
- // Path should have a leading /
if (!path.startsWith("/")) {
throw new IllegalArgumentException(
sm.getString("resources.invalidAliasPath", path));
}
-
- // Name should not have a leading /
- return path.substring(1);
+ aliases.remove(path);
}
+
/**
* Get the current alias configuration in String form. If no aliases are
* configured, an empty string will be returned.
@@ -220,7 +217,6 @@ public abstract class BaseDirContext imp
result.append(',');
}
Entry<String,BaseDirContext> entry = iter.next();
- result.append('/');
result.append(entry.getKey());
result.append('=');
result.append(entry.getValue().getDocBase());
@@ -1656,7 +1652,23 @@ public abstract class BaseDirContext imp
private AliasResult findAlias(String name) {
AliasResult result = new AliasResult();
- String searchName = name;
+ // The JNDI resources code mixes names (that don't have leading '/')
and
+ // paths (which do have leading '/'). This code is a little messy but
+ // the alternative is reviewing the entire o.a.n.resources package for
+ // the correct use of name vs path and that is very likely to break
+ // clients (including Tomcat internals and user applications).
+ String searchName;
+ boolean slashAppended;
+ if (name.length() == 0) {
+ searchName = "/";
+ slashAppended = true;
+ } else if (name.charAt(0) == '/') {
+ searchName = name;
+ slashAppended = false;
+ } else {
+ searchName = "/" + name;
+ slashAppended = true;
+ }
result.dirContext = aliases.get(searchName);
while (result.dirContext == null) {
@@ -1667,8 +1679,13 @@ public abstract class BaseDirContext imp
result.dirContext = aliases.get(searchName);
}
- if (result.dirContext != null)
- result.aliasName = name.substring(searchName.length());
+ if (result.dirContext != null) {
+ if (slashAppended) {
+ result.aliasName = name.substring(searchName.length() - 1);
+ } else {
+ result.aliasName = name.substring(searchName.length());
+ }
+ }
return result;
}
Modified:
tomcat/tc7.0.x/trunk/test/org/apache/naming/resources/TestNamingContext.java
URL:
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/naming/resources/TestNamingContext.java?rev=1593009&r1=1593008&r2=1593009&view=diff
==============================================================================
---
tomcat/tc7.0.x/trunk/test/org/apache/naming/resources/TestNamingContext.java
(original)
+++
tomcat/tc7.0.x/trunk/test/org/apache/naming/resources/TestNamingContext.java
Wed May 7 13:12:27 2014
@@ -148,7 +148,7 @@ public class TestNamingContext extends T
+",/a2=" + alternate2.getCanonicalPath());
// Check first alias
- Object file = ctx.lookup("a1/test1.txt");
+ Object file = ctx.lookup("/a1/test1.txt");
Assert.assertNotNull(file);
Assert.assertTrue(file instanceof Resource);
@@ -168,7 +168,7 @@ public class TestNamingContext extends T
assertEquals(foxText, contents);
// Check second alias
- file = ctx.lookup("a2/test2.txt");
+ file = ctx.lookup("/a2/test2.txt");
Assert.assertNotNull(file);
Assert.assertTrue(file instanceof Resource);
@@ -191,7 +191,7 @@ public class TestNamingContext extends T
+ ",");
// Check first alias
- file = ctx.lookup("a1/test1.txt");
+ file = ctx.lookup("/a1/test1.txt");
Assert.assertNotNull(file);
Assert.assertTrue(file instanceof Resource);
@@ -208,7 +208,7 @@ public class TestNamingContext extends T
assertEquals(foxText, contents);
// Check second alias
- file = ctx.lookup("a2/test2.txt");
+ file = ctx.lookup("/a2/test2.txt");
Assert.assertNotNull(file);
Assert.assertTrue(file instanceof Resource);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]