/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package javax.servlet.http;

/**
 * Events of this type are either sent to an object that implements
 * {@link HttpSessionBindingListener} when it is bound or unbound from a
 * session, or to a {@link HttpSessionAttributeListener} that has been
 * configured in the deployment descriptor when any attribute is bound, unbound
 * or replaced in a session.
 * <p>
 * The session binds the object by a call to
 * <code>HttpSession.setAttribute</code> and unbinds the object by a call to
 * <code>HttpSession.removeAttribute</code>.
 *
 * @see HttpSession
 * @see HttpSessionBindingListener
 * @see HttpSessionAttributeListener
 */
public class HttpSessionBindingEvent extends HttpSessionEvent {

    private static final long serialVersionUID = 1L;

    /* The name to which the object is being bound or unbound */
    private final String name;

    /* The object is being bound or unbound */
    private final Object value;

    /**
     * Constructs an event that notifies an object that it has been bound to or
     * unbound from a session. To receive the event, the object must implement
     * {@link HttpSessionBindingListener}.
     *
     * @param session
     *            the session to which the object is bound or unbound
     * @param name
     *            the name with which the object is bound or unbound
     * @see #getName()
     * @see #getSession()
     */
    public HttpSessionBindingEvent(HttpSession session, String name) {
        super(session);
        this.name = name;
        this.value = null;
    }

    /**
     * Constructs an event that notifies an object that it has been bound to or
     * unbound from a session. To receive the event, the object must implement
     * {@link HttpSessionBindingListener}.
     *
     * @param session
     *            the session to which the object is bound or unbound
     * @param name
     *            the name with which the object is bound or unbound
     * @param value
     *            the object that is bound or unbound
     * @see #getName()
     * @see #getSession()
     * @see #getValue()
     */
    public HttpSessionBindingEvent(HttpSession session, String name,
            Object value) {
        super(session);
        this.name = name;
        this.value = value;
    }

    /**
     * Get the session that changed.
     * @return The session that changed
     */
    @Override
    public HttpSession getSession() {
        return super.getSession();
    }

    /**
     * Returns the name with which the attribute is bound to or unbound from the
     * session.
     *
     * @return a string specifying the name with which the object is bound to or
     *         unbound from the session
     */
    public String getName() {
        return name;
    }

    /**
     * Returns the value of the attribute that has been added, removed or
     * replaced.
     *
     * @return If the attribute was added (or bound), this is the value of the
     *         attribute. If the attribute was removed (or unbound), this is the
     *         value of the removed attribute. If the attribute was replaced,
     *         this is the old value of the attribute.
     *
     * @since 2.3
     */
    public Object getValue() {
        return this.value;
    }
}
