/*=========================================================================
 * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
 * This product is protected by U.S. and international copyright
 * and intellectual property laws. Pivotal products are covered by
 * one or more patents listed at http://www.pivotal.io/patents.
 *=========================================================================
 */
#ifndef __THINCLIENT_POOL_STICKY_MANAGER__
#define __THINCLIENT_POOL_STICKY_MANAGER__

#include "TssConnectionWrapper.hpp"
#include <algorithm>
#include <vector>
#include <set>
#include <ace/Recursive_Thread_Mutex.h>
namespace gemfire{
  class ThinClientPoolDM;
  class ServerLocation;
  class TcrConnection;  
  class TcrEndpoint;    
  class ThinClientStickyManager
  {
  public:
    ThinClientStickyManager(ThinClientPoolDM* poolDM): m_dm( poolDM )
    {
    }
    bool getStickyConnection(TcrConnection*& conn, GfErrType* error, std::set< ServerLocation >& excludeServers, bool forTransaction);
    void setStickyConnection( TcrConnection* conn,bool forTransaction);
    void addStickyConnection(TcrConnection* conn);
    void cleanStaleStickyConnection( );
    
    void closeAllStickyConnections( );
    bool canThisConnBeDeleted( TcrConnection* conn );
 
    void releaseThreadLocalConnection( );
    void setSingleHopStickyConnection(TcrEndpoint* ep, TcrConnection*& conn);
    void getSingleHopStickyConnection(TcrEndpoint* ep, TcrConnection*& conn);    
    void getAnyConnection(TcrConnection*& conn);
  private:
    static bool isNULL(TcrConnection** conn);
    ThinClientPoolDM* m_dm;
    std::set<TcrConnection**> m_stickyConnList;
    ACE_Recursive_Thread_Mutex m_stickyLock;
  };
}
#endif
