Hi,

we now get this exception:

java.lang.StringIndexOutOfBoundsException: String index out of range: 3
   at java.lang.String.charAt(String.java:658)
   at
org.apache.catalina.loader.WebappClassLoaderBase.filter(WebappClassLoaderBase.java:2780)
   at
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1253)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
   at org.mozilla.javascript.Kit.classOrNull(Kit.java:89)
   at
org.mozilla.javascript.NativeJavaPackage.getPkgProperty(NativeJavaPackage.java:154)
   at
org.mozilla.javascript.NativeJavaPackage.get(NativeJavaPackage.java:111)
   at
org.mozilla.javascript.NativeJavaTopPackage.init(NativeJavaTopPackage.java:119)


that is because WebappClassLoaderBase.filter() is really changed in this
release and assumes:

  } else if (name.startsWith("org")) {
            /* 3 == length("org") */
            ch = name.charAt(3);

that when it gets "org" it can get the 4 the (position 3) char
That bombs out now

This is because NativeJavaPackage tries to load anything that it gets
through its get method so it does try "org" until it sees somethign that is
a class. (so org.xxx then org.xxx.Yyy will be seen as a class)

I guess that code could be written with a simple length check in that if
above
or write it a bit different and have something like:

 } else if (isClassName && name.startsWith("org.apache.")) {
              /* 11 == length("org.apache.") */
              if (name.startsWith("tomcat.jdbc.", 11)) {
                  return false;
              }
              if (name.startsWith("el.", 11) ||
                  name.startsWith("catalina.", 11) ||
                  name.startsWith("jasper.", 11) ||
                  name.startsWith("juli.", 11) ||
                  name.startsWith("tomcat.", 11) ||
                  name.startsWith("naming.", 11) ||
                  name.startsWith("coyote.", 11)) {
                  return true;
              }
          } else if (!isClassName && name.startsWith("org/apache/")) {
                /* 11 == length("org/apache/") */
                if (name.startsWith("tomcat/jdbc/", 11)) {
                    return false;
                }
                if (name.startsWith("el/", 11) ||
                    name.startsWith("catalina/", 11) ||
                    name.startsWith("jasper/", 11) ||
                    name.startsWith("juli/", 11) ||
                    name.startsWith("tomcat/", 11) ||
                    name.startsWith("naming/", 11) ||
                    name.startsWith("coyote/", 11)) {
                    return true;
                }
        }

*that seems a bit shorter and should do the same.*

-- 
Johan Compagner
Servoy

Reply via email to