00001 #ifndef __ARC_INFOSYS_REGISTER_H__
00002 #define __ARC_INFOSYS_REGISTER_H__
00003
00004 #include <list>
00005 #include <string>
00006 #include <arc/ArcConfig.h>
00007 #include <arc/XMLNode.h>
00008 #include <arc/message/MCC.h>
00009 #include <arc/message/Service.h>
00010 #include <arc/Logger.h>
00011 #include <arc/URL.h>
00012 #include <arc/DateTime.h>
00013
00014 #define GLUE2_D42_NAMESPACE "http://schemas.ogf.org/glue/2008/05/spec_2.0_d42_r1"
00015 #define REGISTRATION_NAMESPACE "http://www.nordugrid.org/schemas/registartion/2008/08"
00016 #define ISIS_NAMESPACE "http://www.nordugrid.org/schemas/isis/2008/08"
00017 #define REGISTRATION_CONFIG_NAMESPACE "http://www.nordugrid.org/schemas/InfoRegisterConfig/2008"
00018
00019 namespace Arc {
00020
00021 class InfoRegisterContainer;
00022
00024
00028 class InfoRegister {
00029 friend class InfoRegisterContainer;
00030 private:
00031
00032 long int reg_period_;
00033
00034 std::string serviceid;
00035 std::string expiration;
00036 std::string endpoint;
00037
00038 Service *service_;
00039 NS ns_;
00040 public:
00041 InfoRegister(XMLNode node, Service *service_);
00042 ~InfoRegister();
00043 operator bool(void) { return service_; };
00044 bool operator!(void) { return !service_; };
00045 long int getPeriod(void) const { return reg_period_; };
00046 std::string getServiceID(void) { if (serviceid.empty()) return ""; else return serviceid; };
00047 std::string getEndpoint(void) { if (endpoint.empty()) return ""; else return endpoint; };
00048 std::string getExpiration(void) { if (expiration.empty()) return ""; else return expiration; };
00049 Service* getService(void) { return service_; };
00050 };
00051
00053 class InfoRegisters {
00054 private:
00055 std::list<InfoRegister*> registers_;
00056 public:
00058
00061 InfoRegisters(XMLNode cfg, Service *service);
00062 ~InfoRegisters(void);
00064 bool addRegister(XMLNode cfg, Service *service);
00065 };
00066
00067
00068 struct Register_Info_Type{
00069
00070 InfoRegister* p_register;
00071 Period period;
00072 Time next_registration;
00073
00074 std::string serviceid_;
00075
00076 std::string serviceid;
00077 std::string expiration;
00078 std::string endpoint;
00079 };
00080
00081
00082 struct ISIS_description {
00083 std::string url;
00084 std::string key;
00085 std::string cert;
00086 std::string proxy;
00087 std::string cadir;
00088 std::string cafile;
00089 };
00090
00092
00096 class InfoRegistrar {
00097 friend class InfoRegisterContainer;
00098 private:
00100
00103 InfoRegistrar(XMLNode cfg);
00104
00105 std::string id_;
00106
00107 std::string infosys_type;
00108 std::string path;
00109 int retry;
00110
00111 std::string key_;
00112 std::string cert_;
00113 std::string proxy_;
00114 std::string cadir_;
00115 std::string cafile_;
00116
00117 std::list<Register_Info_Type> reg_;
00118
00119 Glib::Mutex lock_;
00120
00121 Glib::Cond cond_exit_;
00122
00123 Glib::Cond cond_exited_;
00124
00125 Time creation_time;
00126
00127 Period stretch_window;
00128
00129
00130 ISIS_description defaultBootstrapISIS;
00131 ISIS_description myISIS;
00132 bool myISISList_initialized;
00133 int originalISISCount;
00134 int call_depth;
00135 std::vector<ISIS_description> myISISList;
00136
00137 void initISIS(XMLNode cfg);
00138 void removeISIS(ISIS_description isis);
00139 void getISISList(ISIS_description isis);
00140 ISIS_description getISIS(void);
00141
00142
00143
00144 bool already_registered;
00145 void sendRegistrationToISIS();
00146 void sendRegistrationToEMIREG();
00147 void sendDeleteToISIS(std::list<Register_Info_Type>::iterator r);
00148 void sendDeleteToEMIREG(std::list<Register_Info_Type>::iterator r);
00149
00150 public:
00151 ~InfoRegistrar(void);
00152 operator bool(void) { return !myISIS.url.empty(); };
00153 bool operator!(void) { return myISIS.url.empty(); };
00155
00157 void registration(void);
00159
00161 bool addService(InfoRegister*, XMLNode);
00163 bool removeService(InfoRegister*);
00164 const std::string& id(void) { return id_; };
00165
00166
00167 };
00168
00171
00172 class InfoRegisterContainer {
00173 private:
00174 static InfoRegisterContainer* instance_;
00175
00176 std::list<InfoRegistrar*> regr_;
00177
00178 Glib::Mutex lock_;
00179 InfoRegisterContainer(void);
00180 InfoRegisterContainer(const InfoRegisterContainer&) {};
00181 public:
00182 ~InfoRegisterContainer(void);
00183 static InfoRegisterContainer& Instance(void);
00185
00188 InfoRegistrar *addRegistrar(XMLNode doc);
00190
00198 void addService(InfoRegister* reg,const std::list<std::string>& ids,XMLNode cfg = XMLNode());
00199
00201 void removeService(InfoRegister* reg);
00202 };
00203
00204 }
00205
00206 #endif
00207