/*******************************************************************************
 * 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 org.eclipse.persistence.internal.sessions.AbstractSession;
import org.eclipse.persistence.queries.*;

/**
 * <p><b>Purpose</b>: This interface defines the link between the Session and the PerformanceProfiler tool.
 * It is provide to decouple the session from tools and to allow other profilers to register with the session.
 *
 * @author James Sutherland
 */
public interface SessionProfiler {
    //dms sensor weight constants
    public static final int NONE = 0;
    public static final int NORMAL = 5;
    public static final int HEAVY = 10;
    public static final int ALL = Integer.MAX_VALUE;

    // Sensors display name
    public static final String SessionName = "Info:SessionName";
    public static final String LoginTime = "Info:LoginTime";
    public static final String RcmStatus = "Info:CacheCoordinationStatus";
    public static final String CacheSize = "Info:CacheSize";//TODO
    
    public static final String ClientSessionCreated = "Counter:ClientSessionCreates";
    public static final String ClientSessionReleased = "Counter:ClientSessionReleases";
    public static final String UowCreated = "Counter:UnitOfWorkCreates";
    public static final String UowReleased = "Counter:UnitOfWorkReleases";
    public static final String UowCommits = "Counter:UnitOfWorkCommits";
    public static final String UowRollbacks = "Counter:UnitOfWorkRollbacks";
    public static final String OptimisticLockException = "Counter:OptimisticLocks";
    public static final String RcmReceived = "Counter:MessagesReceived";
    public static final String RcmSent = "Counter:MessagesSent";
    public static final String RemoteChangeSet = "Counter:RemoteChangeSets";
    public static final String Connects = "Counter:ConnectCalls";
    public static final String Disconnects = "Counter:DisconnectCalls";
    public static final String CacheHits = "Counter:CacheHits";
    public static final String CacheMisses = "Counter:CacheMisses";
    public static final String ChangeSetsProcessed = "Counter:ChangesProcessed";
    public static final String ChangeSetsNotProcessed = "Counter:ChangesNotProcessed";
    
    public static final String DescriptorEvent = "Timer:DescriptorEvents";
    public static final String SessionEvent = "Timer:SessionEvents";
    public static final String QueryPreparation = "Timer:QueryPreparation";
    public static final String SqlGeneration = "Timer:SqlGeneration";
    public static final String SqlPrepare = "Timer:SqlPrepare";
    public static final String StatementExecute = "Timer:StatementExecute";
    public static final String RowFetch = "Timer:RowFetch";
    public static final String ObjectBuilding = "Timer:ObjectBuilding";
    public static final String Register = "Timer:Register";
    public static final String Merge = "Timer:Merge";
    public static final String DistributedMerge = "Timer:DistributedMerge";
    public static final String AssignSequence = "Timer:Sequencing";
    public static final String Caching = "Timer:Caching";
    public static final String CacheCoordinationSerialize = "Timer:CacheCoordinationSerialize";
    public static final String CacheCoordination = "Timer:CacheCoordination";
    public static final String ConnectionManagement = "Timer:ConnectionManagement";
    public static final String Logging = "Timer:Logging";
    public static final String JtsBeforeCompletion = "Timer:TXBeforeCompletion";
    public static final String JtsAfterCompletion = "Timer:TXAfterCompletion";
    public static final String Transaction = "Timer:Transactions";
    public static final String UowCommit = "Timer:UnitOfWorkCommit";
    public static final String ConnectionPing = "Timer:ConnectionPing";
    public static final String Remote = "Timer:Remote";
    public static final String RemoteLazy = "Timer:RemoteLazy";
    public static final String RemoteMetadata = "Timer:RemoteMetadata";

    /**
     * INTERNAL:
     * End the operation timing.
     */
    public void endOperationProfile(String operationName);

    /**
     * INTERNAL:
     * End the operation timing.
     */
    public void endOperationProfile(String operationName, DatabaseQuery query, int weight);

    /**
     * INTERNAL:
     * Finish a profile operation if profiling.
     * This assumes the start operation proceeds on the stack.
     * The session must be passed to allow units of work etc. to share their parents profiler.
     *
     * @return the execution result of the query.
     */
    public Object profileExecutionOfQuery(DatabaseQuery query, Record row, AbstractSession session);

    /**
     * INTERNAL:
     * Set the session.
     */
    public void setSession(Session session);

    /**
     * INTERNAL:
     * Start the operation timing.
     */
    public void startOperationProfile(String operationName);

    /**
     * INTERNAL:
     * Start the operation timing.
     */
    public void startOperationProfile(String operationName, DatabaseQuery query, int weight);

    /**
     * INTERNAL:
     * Update the value of the State sensor.(DMS)
     */
    public void update(String operationName, Object value);

    /**
     * INTERNAL:
     * Increase DMS Event sensor occurrence.(DMS)
     */
    public void occurred(String operationName, AbstractSession session);
    
    /**
     * INTERNAL:
     * Increase DMS Event sensor occurrence.(DMS)
     */
    public void occurred(String operationName, DatabaseQuery query, AbstractSession session);

    /**
     * INTERNAL:
     * Set DMS sensor weight(DMS)
     */
    public void setProfileWeight(int weight);

    /**
     * INTERNAL:
     * Return DMS sensor weight(DMS)
     */
    public int getProfileWeight();

    /**
     * INTERNAL:
     * Initialize EclipseLink noun tree(DMS)
     */
    public void initialize();
}
