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: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to