/*******************************************************************************
 * Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the 
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Oracle - initial API and implementation from Oracle TopLink
 ******************************************************************************/  
package org.eclipse.persistence.sessions;

import java.util.*;
import org.eclipse.persistence.queries.*;

/**
 * <p><b>Purpose</b>: Encapsulate the information provided with session events.
 * This is used as the argument to any event raised by the session.
 * To register for events notification an event listener must be registered with the session.
 *
 * @see SessionEventManager#addListener(SessionEventListener)
 * @see Session#getEventManager()
 * @see SessionEventListener
 */
public class SessionEvent extends EventObject {

    /** Some events may have a query associated with them (pre/postExecuteQuery). */
    protected DatabaseQuery query;

    /** Some events may have a result associated with them (pre/postExecuteQuery). */
    protected Object result;

    /** The session or unit of work raising the event. */
    protected Session session;

    /** The code of the event being raised. This is an integer constant value as defined below. */
    protected int eventCode;

    /** Additional properties may be added. */
    protected Hashtable properties;
    public static final int PreExecuteQuery = 1;
    public static final int PostExecuteQuery = 2;
    public static final int PreBeginTransaction = 3;
    public static final int PostBeginTransaction = 4;
    public static final int PreCommitTransaction = 5;
    public static final int PostCommitTransaction = 6;
    public static final int PreRollbackTransaction = 7;
    public static final int PostRollbackTransaction = 8;

    // Unit of work events, only raised on unit of work.
    public static final int PostAcquireUnitOfWork = 9;
    public static final int PreCommitUnitOfWork = 10;
    public static final int PostCommitUnitOfWork = 11;
    public static final int PreReleaseUnitOfWork = 12;
    public static final int PostReleaseUnitOfWork = 13;
    public static final int PrepareUnitOfWork = 14;
    public static final int PostResumeUnitOfWork = 15;

    // Three-tier events, only raised on server/client session.
    public static final int PostAcquireClientSession = 16;
    public static final int PreReleaseClientSession = 17;
    public static final int PostReleaseClientSession = 18;
    public static final int PostAcquireConnection = 22;
    public static final int PostAcquireExclusiveConnection = 33;
    public static final int PreReleaseConnection = 23;
    public static final int PreReleaseExclusiveConnection = 34;

    // Database access events.
    public static final int OutputParametersDetected = 19;
    public static final int MoreRowsDetected = 20;
    public static final int PostConnect = 21;

    // Login events
    public static final int PreLogin = 24;
    public static final int PostLogin = 25;
    public static final int PreLogout = 40;
    public static final int PostLogout = 41;
    public static final int PreMergeUnitOfWorkChangeSet = 26;
    public static final int PreDistributedMergeUnitOfWorkChangeSet = 27;
    public static final int PostMergeUnitOfWorkChangeSet = 28;
    public static final int PostDistributedMergeUnitOfWorkChangeSet = 29;

    //ChangeSet Events
    public static final int PreCalculateUnitOfWorkChangeSet = 30;
    public static final int PostCalculateUnitOfWorkChangeSet = 31;
    public static final int MissingDescriptor = 32;
    public static final int NoRowsModified = 35;

    // last event value for this class as of Jan 26th, 2004 is 41

    /**
     * INTERNAL:
     * Create the event.
     */
    public SessionEvent(int eventCode, Session session) {
        super(session);
        this.session = session;
        this.eventCode = eventCode;
    }

    /**
     * PUBLIC:
     * The code of the session event being raised.
     * This is an integer constant value from this class.
     */
    public int getEventCode() {
        return eventCode;
    }

    /**
     * PUBLIC:
     * Additional properties may be added to the event.
     */
    public Hashtable getProperties() {
        if (properties == null) {
            properties = new Hashtable(2);
        }
        return properties;
    }

    /**
     * PUBLIC:
     * Additional properties may be added to the event.
     */
    public Object getProperty(String name) {
        return getProperties().get(name);
    }

    /**
     * PUBLIC:
     * Some events may have a query associated with them (pre/postExecuteQuery).
     */
    public DatabaseQuery getQuery() {
        return query;
    }

    /**
     * PUBLIC:
     * Some events may have a result associated with them (pre/postExecuteQuery).
     */
    public Object getResult() {
        return result;
    }

    /**
     * PUBLIC:
     * The session in which the event is raised.
     */
    public Session getSession() {
        return session;
    }

    /**
     * INTERNAL:
     * The code of the session event being raised.
     * This is an integer constant value from this class.
     */
    public void setEventCode(int eventCode) {
        this.eventCode = eventCode;
    }

    /**
     * INTERNAL:
     * Additional properties may be added to the event.
     */
    public void setProperties(Hashtable properties) {
        this.properties = properties;
    }

    /**
     * INTERNAL:
     * Additional properties may be added to the event.
     */
    public void setProperty(String name, Object value) {
        getProperties().put(name, value);
    }

    /**
     * INTERNAL:
     * Some events may have a query associated with them (pre/postExecuteQuery).
     */
    public void setQuery(DatabaseQuery query) {
        this.query = query;
    }

    /**
     * INTERNAL:
     * Some events may have a result associated with them (pre/postExecuteQuery).
     */
    public void setResult(Object result) {
        this.result = result;
    }

    /**
     * INTERNAL:
     * The session in which the event is raised.
     */
    public void setSession(Session session) {
        this.session = session;
    }
}
