I set up to make Apache jetspeed run with jikesRVM +
classpath. I'm having (and am reporting both in
classpath and here) several JAAS/security and
classloading issues.
Once I arrived to a partly running setup, I was still
having an error in the bean loading of struts, giving a
NPE which originated at VM_TypeReference.
This patch solved it, and made struts run on my setup:
RCS file:
/cvsroot/jikesrvm/rvm/src/vm/classLoader/VM_TypeReference.java,v
retrieving revision 1.20
diff -u -p -r1.20 VM_TypeReference.java
--- classLoader/VM_TypeReference.java 14 Jan 2005
05:44:31 -0000 1.20
+++ classLoader/VM_TypeReference.java 17 Sep 2005
07:42:44 -0000
@@ -572,7 +572,9 @@ public class VM_TypeReference
implements
public final boolean equals(Object other) {
if (other instanceof VM_TypeReference) {
VM_TypeReference that = (VM_TypeReference)other;
- return name == that.name &&
classloader.equals(that.classloader);
+ return name == that.name &&
+ (classloader == that.classloader ||
+ (classloader != null &&
classloader.equals(that.classloader)));
} else {
return false;
}
There are two possibilities here:
a) either VM_TypeReference.classloader != is a
representation invariant, and then it is somehow not
enforced
b) it is not, and then the patch is right, as we need
to check for it
Logged In: YES
user_id=178886
I am Santiago Gala, BTW, just unable to undestand the state
machine that sourceforge uses for login/session tracking :)
Logged In: YES
user_id=178886
Alternatively, if VM_TypeReference.classloader != null is a
class invariant, preventing null references getting in can
be achieved through this:
Index: src/vm/classLoader/VM_TypeReference.java
RCS file:
/cvsroot/jikesrvm/rvm/src/vm/classLoader/VM_TypeReference.java,v
retrieving revision 1.20
diff -u -p -u -r1.20 VM_TypeReference.java
--- src/vm/classLoader/VM_TypeReference.java 14 Jan 2005
05:44:31 -0000 1.20
+++ src/vm/classLoader/VM_TypeReference.java 21 Sep 2005
08:14:18 -0000
@@ -149,7 +149,7 @@ public class VM_TypeReference implements
// classes must use the bootstrap classloader. Force
that here so we don't // have to worry about it anywhere
else in the VM.
ClassLoader bootstrapCL =
VM_BootstrapClassLoader.getBootstrapClassLoader();
- if (cl != bootstrapCL) {
+ if (cl == null || cl != bootstrapCL) {
if (tn.isClassDescriptor()) {
if (tn.isBootstrapClassDescriptor()) {
cl = bootstrapCL;
@@ -168,6 +168,8 @@ public class VM_TypeReference implements
}
}
// Next actually findOrCreate the type reference using
the proper classloader.
+ if(cl == null)
+ cl = bootstrapCL;
VM_TypeReference key = new VM_TypeReference(cl, tn);
VM_TypeReference val =
(VM_TypeReference)dictionary.get(key);
if (val != null) return val;
Requesting a "null" classLoader is a common idiom, and I was
actually finding it in Struts code (Apache Commons
Beanutils, IIRC).
Logged In: YES
user_id=1215435
classloader != null is supposed to be an invariant, so the
second patch looks plausible. I'll give it a whirl and
assuming no regressions it should get in later today. Thanks,
--dave
Logged In: YES
user_id=1215435
committed slightly modified version of second patch to
VM_TypeReference. I think it should fix the problem, if not
let me know.