fhanik 2004/02/05 13:08:02
Modified: modules/cluster/src/share/org/apache/catalina/cluster/session
DeltaManager.java DeltaRequest.java
DeltaSession.java
modules/cluster/src/share/org/apache/catalina/cluster/tcp
SimpleTcpCluster.java
Log:
Ported latest bugfixes from StandardSession, hopefully in a near future I can extend
it, but for now, this is they way it is
Revision Changes Path
1.11 +5 -4
jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/session/DeltaManager.java
Index: DeltaManager.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/session/DeltaManager.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- DeltaManager.java 5 Feb 2004 01:02:48 -0000 1.10
+++ DeltaManager.java 5 Feb 2004 21:08:02 -0000 1.11
@@ -936,6 +936,7 @@
// -------------------------------------------------------- Private Methods
public void backgroundProcess() {
+ log.debug("DeltaManager.backgroundProcess invoked at
"+System.currentTimeMillis());
processExpires();
}
/**
1.5 +8 -3
jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/session/DeltaRequest.java
Index: DeltaRequest.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/session/DeltaRequest.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- DeltaRequest.java 13 Jan 2004 04:22:28 -0000 1.4
+++ DeltaRequest.java 5 Feb 2004 21:08:02 -0000 1.5
@@ -215,6 +215,11 @@
return actions.size();
}
+ public void clear() {
+ actions.clear();
+ actionPool.clear();
+ }
+
public void readExternal(java.io.ObjectInput in) throws java.io.IOException,
java.lang.ClassNotFoundException {
//sessionId - String
1.12 +106 -94
jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/session/DeltaSession.java
Index: DeltaSession.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/session/DeltaSession.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- DeltaSession.java 4 Feb 2004 20:22:26 -0000 1.11
+++ DeltaSession.java 5 Feb 2004 21:08:02 -0000 1.12
@@ -339,6 +339,11 @@
*/
private transient long lastTimeReplicated = System.currentTimeMillis();
+ /**
+ * The access count for this session
+ */
+ protected transient int accessCount = 1;
+
// ----------------------------------------------------- Session Properties
/**
@@ -642,6 +647,10 @@
return false;
}
+ if (accessCount > 0 ) {
+ return true;
+ }
+
if (maxInactiveInterval >= 0) {
long timeNow = System.currentTimeMillis();
int timeIdle = (int) ((timeNow - lastAccessedTime) / 1000L);
@@ -686,11 +695,14 @@
this.thisAccessedTime = System.currentTimeMillis();
evaluateIfValid();
+
+ accessCount++;
}
public void endAccess() {
- // FIXME
+ isNew = false;
+ accessCount--;
}
@@ -777,17 +789,13 @@
}
}
}
+ accessCount=0;
setValid(false);
// Remove this session from our manager's active sessions
if (manager != null)
manager.remove(this);
- // Unbind any objects associated with this session
- String keys[] = keys();
- for (int i = 0; i < keys.length; i++)
- removeAttribute(keys[i], notify);
-
// Notify interested session event listeners
if (notify) {
fireSessionEvent(Session.SESSION_DESTROYED_EVENT, null);
@@ -795,6 +803,13 @@
// We have completed expire of this session
expiring = false;
+
+ // Unbind any objects associated with this session
+ String keys[] = keys();
+ for (int i = 0; i < keys.length; i++)
+ removeAttributeInternal(keys[i], notify, false);
+
+
if ( notifyCluster ) {
log.debug("Notifying cluster of expiration primary=" +
@@ -849,11 +864,13 @@
id = null;
lastAccessedTime = 0L;
maxInactiveInterval = -1;
+ accessCount = 1;
notes.clear();
setPrincipal(null);
isNew = false;
isValid = false;
manager = null;
+ deltaRequest.clear();
}
@@ -1217,67 +1234,10 @@
if (!isValid())
throw new IllegalStateException
(sm.getString("standardSession.removeAttribute.ise"));
-
- // Remove this attribute from our collection
- Object value = null;
- boolean found = false;
- synchronized (attributes) {
- found = attributes.containsKey(name);
- if (found) {
- value = attributes.get(name);
- attributes.remove(name);
- } else {
- return;
- }
- }
-
- if (addDeltaRequest && (deltaRequest!=null))
deltaRequest.removeAttribute(name);
-
- // Do we need to do valueUnbound() and attributeRemoved() notification?
- if (!notify) {
- return;
- }
-
- // Call the valueUnbound() method if necessary
- HttpSessionBindingEvent event =
- new HttpSessionBindingEvent((HttpSession) this, name, value);
- if ((value != null) &&
- (value instanceof HttpSessionBindingListener))
- ((HttpSessionBindingListener) value).valueUnbound(event);
-
- // Notify interested application event listeners
- Context context = (Context) manager.getContainer();
- Object listeners[] = context.getApplicationEventListeners();
- if (listeners == null)
- return;
- for (int i = 0; i < listeners.length; i++) {
- if (!(listeners[i] instanceof HttpSessionAttributeListener))
- continue;
- HttpSessionAttributeListener listener =
- (HttpSessionAttributeListener) listeners[i];
- try {
- fireContainerEvent(context,
- "beforeSessionAttributeRemoved",
- listener);
- listener.attributeRemoved(event);
- fireContainerEvent(context,
- "afterSessionAttributeRemoved",
- listener);
- } catch (Throwable t) {
- try {
- fireContainerEvent(context,
- "afterSessionAttributeRemoved",
- listener);
- } catch (Exception e) {
- ;
- }
- // FIXME - should we do anything besides log these?
- log.error(sm.getString("standardSession.attributeEvent"), t);
- }
- }
-
+ removeAttributeInternal(name,notify,addDeltaRequest);
}
-
+
+
/**
* Remove the object bound with the specified name from this session. If
@@ -1351,12 +1311,18 @@
throw new IllegalArgumentException
(sm.getString("standardSession.setAttribute.iae"));
- // Replace or add this attribute
- Object unbound = null;
- synchronized (attributes) {
- unbound = attributes.get(name);
- attributes.put(name, value);
+
+ // Construct an event with the new value
+ HttpSessionBindingEvent event = null;
+
+ // Call the valueBound() method if necessary
+ if ( value instanceof HttpSessionBindingListener ) {
+ event = new HttpSessionBindingEvent(this, name, value);
+ ((HttpSessionBindingListener) value).valueBound(event);
}
+
+ // Replace or add this attribute
+ Object unbound = attributes.put(name, value);
// Call the valueUnbound() method if necessary
if ((unbound != null) &&
@@ -1365,16 +1331,6 @@
(new HttpSessionBindingEvent((HttpSession) this, name));
}
- // Call the valueBound() method if necessary
- HttpSessionBindingEvent event = null;
- if (unbound != null)
- event = new HttpSessionBindingEvent
- ((HttpSession) this, name, unbound);
- else
- event = new HttpSessionBindingEvent
- ((HttpSession) this, name, value);
- if (value instanceof HttpSessionBindingListener)
- ((HttpSessionBindingListener) value).valueBound(event);
// Notify interested application event listeners
Context context = (Context) manager.getContainer();
@@ -1391,6 +1347,10 @@
fireContainerEvent(context,
"beforeSessionAttributeReplaced",
listener);
+ if ( event == null ) {
+ event = new HttpSessionBindingEvent
+ (this,name,unbound);
+ }
listener.attributeReplaced(event);
fireContainerEvent(context,
"afterSessionAttributeReplaced",
@@ -1399,6 +1359,10 @@
fireContainerEvent(context,
"beforeSessionAttributeAdded",
listener);
+ if (event == null) {
+ event = new HttpSessionBindingEvent
+ (this, name, unbound);
+ }
listener.attributeAdded(event);
fireContainerEvent(context,
"afterSessionAttributeAdded",
@@ -1559,13 +1523,7 @@
if (!this.isValid || expiring || maxInactiveInterval < 0)
return;
- if (!isValid()) {
- try {
- expire();
- } catch (Throwable t) {
- log.error(sm.getString("standardSession.expireException"), t);
- }
- }
+ isValid();
}
@@ -1635,7 +1593,7 @@
* as an array of Strings. If there are no defined attributes, a
* zero-length array is returned.
*/
- private String[] keys() {
+ protected String[] keys() {
String results[] = new String[0];
synchronized (attributes) {
@@ -1648,13 +1606,67 @@
/**
* Return the value of an attribute without a check for validity.
*/
- private Object getAttributeInternal(String name) {
+ protected Object getAttributeInternal(String name) {
synchronized (attributes) {
return (attributes.get(name));
}
}
+
+ protected void removeAttributeInternal(String name, boolean notify, boolean
addDeltaRequest) {
+
+ // Remove this attribute from our collection
+ Object value = attributes.remove(name);
+ if ( value == null ) return;
+
+ if (addDeltaRequest && (deltaRequest!=null))
deltaRequest.removeAttribute(name);
+
+ // Do we need to do valueUnbound() and attributeRemoved() notification?
+ if (!notify) {
+ return;
+ }
+
+ // Call the valueUnbound() method if necessary
+ HttpSessionBindingEvent event =
+ new HttpSessionBindingEvent((HttpSession) this, name, value);
+ if ((value != null) &&
+ (value instanceof HttpSessionBindingListener))
+ ((HttpSessionBindingListener) value).valueUnbound(event);
+
+ // Notify interested application event listeners
+ Context context = (Context) manager.getContainer();
+ Object listeners[] = context.getApplicationEventListeners();
+ if (listeners == null)
+ return;
+ for (int i = 0; i < listeners.length; i++) {
+ if (!(listeners[i] instanceof HttpSessionAttributeListener))
+ continue;
+ HttpSessionAttributeListener listener =
+ (HttpSessionAttributeListener) listeners[i];
+ try {
+ fireContainerEvent(context,
+ "beforeSessionAttributeRemoved",
+ listener);
+ listener.attributeRemoved(event);
+ fireContainerEvent(context,
+ "afterSessionAttributeRemoved",
+ listener);
+ } catch (Throwable t) {
+ try {
+ fireContainerEvent(context,
+ "afterSessionAttributeRemoved",
+ listener);
+ } catch (Exception e) {
+ ;
+ }
+ // FIXME - should we do anything besides log these?
+ log.error(sm.getString("standardSession.attributeEvent"), t);
+ }
+ }
+
+ }
+
protected long getLastTimeReplicated() {
return lastTimeReplicated;
1.32 +6 -6
jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/tcp/SimpleTcpCluster.java
Index: SimpleTcpCluster.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/tcp/SimpleTcpCluster.java,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- SimpleTcpCluster.java 5 Feb 2004 16:07:57 -0000 1.31
+++ SimpleTcpCluster.java 5 Feb 2004 21:08:02 -0000 1.32
@@ -127,14 +127,13 @@
public static org.apache.commons.logging.Log log =
org.apache.commons.logging.LogFactory.getLog( SimpleTcpCluster.class );
-
// ----------------------------------------------------- Instance Variables
/**
* Descriptive information about this component implementation.
*/
- protected static final String info = "SimpleTcpCluster2/1.0";
+ protected static final String info = "SimpleTcpCluster/1.0";
/**
@@ -339,6 +338,7 @@
public synchronized Manager createManager(String name) {
+ log.debug("Creating ClusterManager for context "+name + " using class
"+getManagerClassName());
ClusterManager manager = null;
try {
manager =
(ClusterManager)getClass().getClassLoader().loadClass(getManagerClassName()).newInstance();
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]