00001 /* 00002 * XrdClRedirectorRegister.hh 00003 * 00004 * Created on: May 23, 2016 00005 * Author: simonm 00006 */ 00007 00008 #ifndef SRC_XRDCL_XRDCLREDIRECTORREGISTRY_HH_ 00009 #define SRC_XRDCL_XRDCLREDIRECTORREGISTRY_HH_ 00010 00011 #include "XrdCl/XrdClXRootDResponses.hh" 00012 #include "XrdCl/XrdClURL.hh" 00013 #include "XrdCl/XrdClJobManager.hh" 00014 #include "XrdSys/XrdSysPthread.hh" 00015 00016 #include <string> 00017 #include <vector> 00018 #include <map> 00019 00020 namespace XrdCl 00021 { 00022 00023 class Message; 00024 class IncomingMsgHandler; 00025 class OutgoingMsgHandler; 00026 00027 //-------------------------------------------------------------------------------- 00029 //-------------------------------------------------------------------------------- 00030 class RedirectJob: public Job 00031 { 00032 public: 00033 //------------------------------------------------------------------------ 00035 //------------------------------------------------------------------------ 00036 RedirectJob( IncomingMsgHandler *handler ) : pHandler( handler ) 00037 { 00038 } 00039 00040 //------------------------------------------------------------------------ 00042 //------------------------------------------------------------------------ 00043 virtual ~RedirectJob() 00044 { 00045 } 00046 00047 //------------------------------------------------------------------------ 00049 //------------------------------------------------------------------------ 00050 virtual void Run( void *arg ); 00051 00052 private: 00053 IncomingMsgHandler *pHandler; 00054 }; 00055 00056 //-------------------------------------------------------------------------------- 00058 //-------------------------------------------------------------------------------- 00059 class VirtualRedirector 00060 { 00061 public: 00062 //---------------------------------------------------------------------------- 00064 //---------------------------------------------------------------------------- 00065 virtual ~VirtualRedirector(){} 00066 00067 //---------------------------------------------------------------------------- 00072 //---------------------------------------------------------------------------- 00073 virtual XRootDStatus HandleRequest( const Message *msg, 00074 IncomingMsgHandler *handler ) = 0; 00075 00076 //---------------------------------------------------------------------------- 00078 //---------------------------------------------------------------------------- 00079 virtual XRootDStatus Load( ResponseHandler *userHandler ) = 0; 00080 00081 //---------------------------------------------------------------------------- 00083 //---------------------------------------------------------------------------- 00084 virtual std::string GetTargetName() const = 0; 00085 00086 //---------------------------------------------------------------------------- 00089 //---------------------------------------------------------------------------- 00090 virtual std::string GetCheckSum( const std::string &type ) const = 0; 00091 00092 //---------------------------------------------------------------------------- 00095 //---------------------------------------------------------------------------- 00096 virtual std::vector<std::string> GetSupportedCheckSums() const = 0; 00097 00098 //---------------------------------------------------------------------------- 00101 //---------------------------------------------------------------------------- 00102 virtual long long GetSize() const = 0; 00103 00104 //---------------------------------------------------------------------------- 00106 //---------------------------------------------------------------------------- 00107 virtual const std::vector<std::string>& GetReplicas() = 0; 00108 00109 //---------------------------------------------------------------------------- 00111 //---------------------------------------------------------------------------- 00112 virtual int Count( Message *req ) const = 0; 00113 }; 00114 00115 //-------------------------------------------------------------------------------- 00117 //-------------------------------------------------------------------------------- 00118 class RedirectorRegistry 00119 { 00120 00121 public: 00122 00123 //---------------------------------------------------------------------------- 00125 //---------------------------------------------------------------------------- 00126 static RedirectorRegistry& Instance(); 00127 00128 //---------------------------------------------------------------------------- 00130 //---------------------------------------------------------------------------- 00131 ~RedirectorRegistry(); 00132 00133 //---------------------------------------------------------------------------- 00135 //---------------------------------------------------------------------------- 00136 XRootDStatus Register( const URL &url ); 00137 00138 //---------------------------------------------------------------------------- 00140 //---------------------------------------------------------------------------- 00141 XRootDStatus RegisterAndWait( const URL &url ); 00142 00143 //---------------------------------------------------------------------------- 00145 //---------------------------------------------------------------------------- 00146 VirtualRedirector* Get( const URL &url ) const; 00147 00148 //---------------------------------------------------------------------------- 00150 //---------------------------------------------------------------------------- 00151 void Release( const URL &url ); 00152 00153 private: 00154 00155 typedef std::map< std::string, std::pair<VirtualRedirector*, size_t> > RedirectorMap; 00156 00157 //---------------------------------------------------------------------------- 00159 //---------------------------------------------------------------------------- 00160 XRootDStatus RegisterImpl( const URL &url, ResponseHandler *handler ); 00161 00162 //---------------------------------------------------------------------------- 00167 //---------------------------------------------------------------------------- 00168 static URL ConvertLocalfile( const URL &url ); 00169 00170 //---------------------------------------------------------------------------- 00171 // Constructor (private!). 00172 //---------------------------------------------------------------------------- 00173 RedirectorRegistry() {} 00174 00175 //---------------------------------------------------------------------------- 00176 // Copy constructor (private!). 00177 //---------------------------------------------------------------------------- 00178 RedirectorRegistry( const RedirectorRegistry & ); 00179 00180 //---------------------------------------------------------------------------- 00181 // Assignment operator (private!). 00182 //---------------------------------------------------------------------------- 00183 RedirectorRegistry& operator=( const RedirectorRegistry & ); 00184 00185 RedirectorMap pRegistry; 00186 00187 mutable XrdSysMutex pMutex; 00188 }; 00189 00190 } /* namespace XrdCl */ 00191 00192 #endif /* SRC_XRDCL_XRDCLREDIRECTORREGISTRY_HH_ */