remm        2004/01/23 14:29:32

  Modified:    catalina/src/share/org/apache/catalina/session
                        StandardSession.java
  Log:
  - Bug 26341: When calling the removeAttributes during session expiration,
    notified attributes should see the session as invalid.
  
  Revision  Changes    Path
  1.32      +76 -56    
jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/StandardSession.java
  
  Index: StandardSession.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/StandardSession.java,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- StandardSession.java      22 Jan 2004 18:21:21 -0000      1.31
  +++ StandardSession.java      23 Jan 2004 22:29:32 -0000      1.32
  @@ -732,11 +732,6 @@
               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);
  @@ -745,6 +740,11 @@
               // 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);
  +
           }
   
       }
  @@ -1182,53 +1182,7 @@
               throw new IllegalStateException
                   (sm.getString("standardSession.removeAttribute.ise"));
   
  -        // Remove this attribute from our collection
  -        Object value = attributes.remove(name);
  -
  -        // Do we need to do valueUnbound() and attributeRemoved() notification?
  -        if (!notify || (value == null)) {
  -            return;
  -        }
  -
  -        // Call the valueUnbound() method if necessary
  -        HttpSessionBindingEvent event = null;
  -        if (value instanceof HttpSessionBindingListener) {
  -            event = new HttpSessionBindingEvent(this, name, value);
  -            ((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);
  -                if (event == null) {
  -                    event = new HttpSessionBindingEvent(this, name, value);
  -                }
  -                listener.attributeRemoved(event);
  -                fireContainerEvent(context,
  -                                   "afterSessionAttributeRemoved",
  -                                   listener);
  -            } catch (Throwable t) {
  -                try {
  -                    fireContainerEvent(context,
  -                                       "afterSessionAttributeRemoved",
  -                                       listener);
  -                } catch (Exception e) {
  -                    ;
  -                }
  -                log(sm.getString("standardSession.attributeEvent"), t);
  -            }
  -        }
  +        removeAttributeInternal(name, notify);
   
       }
   
  @@ -1589,6 +1543,72 @@
       protected Object getAttributeInternal(String name) {
   
           return (attributes.get(name));
  +
  +    }
  +
  +
  +    /**
  +     * Remove the object bound with the specified name from this session.  If
  +     * the session does not have an object bound with this name, this method
  +     * does nothing.
  +     * <p>
  +     * After this method executes, and if the object implements
  +     * <code>HttpSessionBindingListener</code>, the container calls
  +     * <code>valueUnbound()</code> on the object.
  +     *
  +     * @param name Name of the object to remove from this session.
  +     * @param notify Should we notify interested listeners that this
  +     *  attribute is being removed?
  +     */
  +    protected void removeAttributeInternal(String name, boolean notify) {
  +
  +        // Remove this attribute from our collection
  +        Object value = attributes.remove(name);
  +
  +        // Do we need to do valueUnbound() and attributeRemoved() notification?
  +        if (!notify || (value == null)) {
  +            return;
  +        }
  +
  +        // Call the valueUnbound() method if necessary
  +        HttpSessionBindingEvent event = null;
  +        if (value instanceof HttpSessionBindingListener) {
  +            event = new HttpSessionBindingEvent(this, name, value);
  +            ((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);
  +                if (event == null) {
  +                    event = new HttpSessionBindingEvent(this, name, value);
  +                }
  +                listener.attributeRemoved(event);
  +                fireContainerEvent(context,
  +                                   "afterSessionAttributeRemoved",
  +                                   listener);
  +            } catch (Throwable t) {
  +                try {
  +                    fireContainerEvent(context,
  +                                       "afterSessionAttributeRemoved",
  +                                       listener);
  +                } catch (Exception e) {
  +                    ;
  +                }
  +                log(sm.getString("standardSession.attributeEvent"), t);
  +            }
  +        }
   
       }
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to