The problems was found on the following environment.
OS : Readhat EL 4 (x86)
JDK: 1.4.2_05 (Server VM)
The details:
(1)com.licensee.uji.http.HttpSessionProfile
This class has a following method that is not specified any access modifier.
--------
void setApplicationProfile(ApplicationProfile)
--------
(2)com.licensee.sms.sol.sys.servlet.SMSCJFSessionProfile
The following method with public access modifier in this class has the
same signature as (1).
--------
public void setApplicationProfile(ApplicationProfile)
--------
(2)'s SMSCJFSessionProfile extends (1)'s HttpSessionProfile shown
below. Since (1)'s package name is different from (2)'s, (2)'s
method does not override (1)'s.
+--------------------------+
|(1) HttpSessionProfile |
+--------------------------+
+--------------------------+
| ~setApplicationProfile |
+--------------------------+
A
|
+--------------------------+
|(2) SMSCJFSessionProfile |
+--------------------------+
+--------------------------+
| +setApplicationProfile |
+--------------------------+
(3)com.licensee.uji.http.HttpSessionProfile.getSessionProfile(ApplicationProfile,SessionProfile) calls (1)'s method like below.
--------
((HttpSessionProfile)profile).setApplicationProfile(ApplicationProfile);
--------
(3) and (1) are in the same package, but calling (1)'s method may fail.
To investigate the cause, the following code inserts print() near
setApplicationProfile mehod calling.
----->
/* ObjectDispatcher.java */
package com.licensee.uji.http;
....
protected SessionProfile getSessionProfile(ApplicationProfile ap, HttpSession session) {
SessionProfile profile = (SessionProfile) session.getAttribute(SESSION);
if (profile == null) {
Ami.println(session, "getSessionProfile: profile == null."); ---------------- (a)
profile = ap.getFactory().newSessionProfile();
if (profile == null) {
Ami.println("getSessionProfile: newSessionProfile() return null."); ---------- (b)
} else {
Ami.println("getSessionProfile: newSessionProfile() " ---------------- (c)
+ profile.getClass().getName() + " (" + Integer.toHexString(profile.hashCode()) + ")");
}
if (profile instanceof HttpSessionProfile) {
Ami.println("getSessionProfile: profile instanceof HttpSessionProfile."); ---- (d)
((HttpSessionProfile) profile).init(session);
Ami.println("getSessionProfile: Before setApplicationProfile ap =" + ap); ---- (e)
((HttpSessionProfile) profile).setApplicationProfile(ap);
Ami.println("getSessionProfile: After setApplicationProfile ap =" + ap); ---- (f)
} else {
ap.getLogComposer().println(LOGLEVEL,
"uji:Warning - a result of newSessionProfile is not an instance of HttpSessionProfile");
}
session.setAttribute(SESSION, profile);
session.removeAttribute(BEAN_PROFILE);
}
return profile;
}
<-----
----->
/* HttpSessionProfile.java */
package com.licensee.uji.http;
void setApplicationProfile(ApplicationProfile ap) {
Ami.println("setApplicationProfile: ap =" + ap
+ " sp =" + Integer.toHexString(this.hashCode())); -------------- (x)
if (ap == null) {
new Throwable("setApplicationProfile").printStackTrace();
}
this.ap = ap;
}
<-----
Below is the log.
run correctly:
----->
(a) [18/09/2007 18:43:23:306 +0900] ApcAmi: getSessionProfile: profile == null.
(c) [18/09/2007 18:43:23:306 +0900] ApcAmi: getSessionProfile: newSessionProfile() com.licensee.sms.sol.sys.servlet.SMSCJFSessionProfile (129ec81)
(d) [18/09/2007 18:43:23:306 +0900] ApcAmi: getSessionProfile: profile instanceof HttpSessionProfile.
(e) [18/09/2007 18:43:23:306 +0900] ApcAmi: getSessionProfile: Before setApplicationProfile ap =com.licensee.sms.sol.sys.servlet.SMSCJFApplicationProfile@eca36e
(x) [18/09/2007 18:43:23:306 +0900] ApcAmi: setApplicationProfile: ap =com.licensee.sms.sol.sys.servlet.SMSCJFApplicationProfile@eca36e sp =129ec81
(f) [18/09/2007 18:43:23:307 +0900] ApcAmi: getSessionProfile: After setApplicationProfile ap =com.licensee.sms.sol.sys.servlet.SMSCJFApplicationProfile@eca36e
<-----
wrong behavior:
----->
(a) [18/09/2007 19:05:03:283 +0900] ApcAmi: getSessionProfile: profile == null.
(c) [18/09/2007 19:05:03:283 +0900] ApcAmi: getSessionProfile: newSessionProfile() com.licensee.sms.sol.sys.servlet.SMSCJFSessionProfile (147f96a)
(d) [18/09/2007 19:05:03:283 +0900] ApcAmi: getSessionProfile: profile instanceof HttpSessionProfile.
(e) [18/09/2007 19:05:03:283 +0900] ApcAmi: getSessionProfile: Before setApplicationProfile ap =com.licensee.sms.sol.sys.servlet.SMSCJFApplicationProfile@eca36e
(f) [18/09/2007 19:05:03:284 +0900] ApcAmi: getSessionProfile: After setApplicationProfile ap =com.licensee.sms.sol.sys.servlet.SMSCJFApplicationProfile@eca36e
<-----
Comparing the two logs, (c) points the variable profile was set to
SMSCJFSessionProfile in both logs before calling setApplicationProfile
method.
When running correctly, log (x) shows
com.licensee.uji.http.HttpSessionProfile#setApplicationProfile was
called successfully but it was not called in the wrong case.
Since com.licensee.sms.sol.sys.servlet.SMSCJFSessionProfile is
customer's package, it is impossible to collect data to see if
SMSCJFSessionProfile#setApplicationProfile was executed when running
incorrectly.
In (3), The problem will not occur if stop using dynamic compilation.