00001 #ifndef _ManagementBroker_
00002 #define _ManagementBroker_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "qpid/Options.h"
00025 #include "qpid/broker/Exchange.h"
00026 #include "qpid/broker/Timer.h"
00027 #include "qpid/framing/Uuid.h"
00028 #include "qpid/sys/Mutex.h"
00029 #include "qpid/broker/ConnectionToken.h"
00030 #include "qpid/agent/ManagementAgent.h"
00031 #include "ManagementObject.h"
00032 #include "Manageable.h"
00033 #include "qpid/management/Agent.h"
00034 #include <qpid/framing/AMQFrame.h>
00035
00036 namespace qpid {
00037 namespace management {
00038
00039 class ManagementBroker : public ManagementAgent
00040 {
00041 private:
00042
00043 int threadPoolSize;
00044
00045 public:
00046
00047 ManagementBroker ();
00048 virtual ~ManagementBroker ();
00049
00050 void configure (std::string dataDir, uint16_t interval, Manageable* broker, int threadPoolSize);
00051 void setInterval (uint16_t _interval) { interval = _interval; }
00052 void setExchange (broker::Exchange::shared_ptr mgmtExchange,
00053 broker::Exchange::shared_ptr directExchange);
00054 int getMaxThreads () { return threadPoolSize; }
00055 void RegisterClass (std::string packageName,
00056 std::string className,
00057 uint8_t* md5Sum,
00058 ManagementObject::writeSchemaCall_t schemaCall);
00059 uint64_t addObject (ManagementObject* object,
00060 uint32_t persistId = 0,
00061 uint32_t persistBank = 4);
00062 void clientAdded (void);
00063 bool dispatchCommand (broker::Deliverable& msg,
00064 const std::string& routingKey,
00065 const framing::FieldTable* args);
00066
00067
00068 void init (std::string, uint16_t, uint16_t, bool) { assert(0); }
00069 uint32_t pollCallbacks (uint32_t) { assert(0); return 0; }
00070 int getSignalFd () { assert(0); return -1; }
00071
00072 private:
00073 friend class ManagementAgent;
00074
00075 struct Periodic : public broker::TimerTask
00076 {
00077 ManagementBroker& broker;
00078
00079 Periodic (ManagementBroker& broker, uint32_t seconds);
00080 virtual ~Periodic ();
00081 void fire ();
00082 };
00083
00084
00085
00086
00087 struct RemoteAgent : public Manageable
00088 {
00089 uint32_t objIdBank;
00090 std::string routingKey;
00091 uint64_t connectionRef;
00092 Agent* mgmtObject;
00093 ManagementObject* GetManagementObject (void) const { return mgmtObject; }
00094 virtual ~RemoteAgent ();
00095 };
00096
00097
00098
00099
00100 typedef std::map<uint64_t, RemoteAgent*> RemoteAgentMap;
00101 typedef std::vector<std::string> ReplyToVector;
00102
00103
00104
00105
00106
00107
00108
00109 struct SchemaClassKey
00110 {
00111 std::string name;
00112 uint8_t hash[16];
00113 };
00114
00115 struct SchemaClassKeyComp
00116 {
00117 bool operator() (const SchemaClassKey& lhs, const SchemaClassKey& rhs) const
00118 {
00119 if (lhs.name != rhs.name)
00120 return lhs.name < rhs.name;
00121 else
00122 for (int i = 0; i < 16; i++)
00123 if (lhs.hash[i] != rhs.hash[i])
00124 return lhs.hash[i] < rhs.hash[i];
00125 return false;
00126 }
00127 };
00128
00129 struct SchemaClass
00130 {
00131 ManagementObject::writeSchemaCall_t writeSchemaCall;
00132 uint32_t pendingSequence;
00133 size_t bufferLen;
00134 uint8_t* buffer;
00135
00136 SchemaClass () : writeSchemaCall(0), pendingSequence(0), bufferLen(0), buffer(0) {}
00137 bool hasSchema () { return (writeSchemaCall != 0) || (buffer != 0); }
00138 void appendSchema (framing::Buffer& buf);
00139 };
00140
00141 typedef std::map<SchemaClassKey, SchemaClass*, SchemaClassKeyComp> ClassMap;
00142 typedef std::map<std::string, ClassMap> PackageMap;
00143
00144 RemoteAgentMap remoteAgents;
00145 PackageMap packages;
00146 ManagementObjectMap managementObjects;
00147 ManagementObjectMap newManagementObjects;
00148
00149 static ManagementAgent* agent;
00150 static bool enabled;
00151
00152 framing::Uuid uuid;
00153 sys::Mutex addLock;
00154 sys::Mutex userLock;
00155 broker::Timer timer;
00156 broker::Exchange::shared_ptr mExchange;
00157 broker::Exchange::shared_ptr dExchange;
00158 std::string dataDir;
00159 uint16_t interval;
00160 Manageable* broker;
00161 uint16_t bootSequence;
00162 uint32_t localBank;
00163 uint32_t nextObjectId;
00164 uint32_t nextRemoteBank;
00165 uint32_t nextRequestSequence;
00166 bool clientWasAdded;
00167
00168 # define MA_BUFFER_SIZE 65536
00169 char inputBuffer[MA_BUFFER_SIZE];
00170 char outputBuffer[MA_BUFFER_SIZE];
00171
00172 void writeData ();
00173 void PeriodicProcessing (void);
00174 void EncodeHeader (framing::Buffer& buf, uint8_t opcode, uint32_t seq = 0);
00175 bool CheckHeader (framing::Buffer& buf, uint8_t *opcode, uint32_t *seq);
00176 void SendBuffer (framing::Buffer& buf,
00177 uint32_t length,
00178 broker::Exchange::shared_ptr exchange,
00179 std::string routingKey);
00180 void moveNewObjectsLH();
00181
00182 void dispatchAgentCommandLH (broker::Message& msg);
00183
00184 PackageMap::iterator FindOrAddPackageLH(std::string name);
00185 void AddClass(PackageMap::iterator pIter,
00186 std::string className,
00187 uint8_t* md5Sum,
00188 ManagementObject::writeSchemaCall_t schemaCall);
00189 void EncodePackageIndication (framing::Buffer& buf,
00190 PackageMap::iterator pIter);
00191 void EncodeClassIndication (framing::Buffer& buf,
00192 PackageMap::iterator pIter,
00193 ClassMap::iterator cIter);
00194 bool bankInUse (uint32_t bank);
00195 uint32_t allocateNewBank ();
00196 uint32_t assignBankLH (uint32_t requestedPrefix);
00197 void deleteOrphanedAgentsLH();
00198 void sendCommandComplete (std::string replyToKey, uint32_t sequence,
00199 uint32_t code = 0, std::string text = std::string("OK"));
00200 void handleBrokerRequestLH (framing::Buffer& inBuffer, std::string replyToKey, uint32_t sequence);
00201 void handlePackageQueryLH (framing::Buffer& inBuffer, std::string replyToKey, uint32_t sequence);
00202 void handlePackageIndLH (framing::Buffer& inBuffer, std::string replyToKey, uint32_t sequence);
00203 void handleClassQueryLH (framing::Buffer& inBuffer, std::string replyToKey, uint32_t sequence);
00204 void handleClassIndLH (framing::Buffer& inBuffer, std::string replyToKey, uint32_t sequence);
00205 void handleSchemaRequestLH (framing::Buffer& inBuffer, std::string replyToKey, uint32_t sequence);
00206 void handleSchemaResponseLH (framing::Buffer& inBuffer, std::string replyToKey, uint32_t sequence);
00207 void handleAttachRequestLH (framing::Buffer& inBuffer, std::string replyToKey, uint32_t sequence, const broker::ConnectionToken* connToken);
00208 void handleGetQueryLH (framing::Buffer& inBuffer, std::string replyToKey, uint32_t sequence);
00209 void handleMethodRequestLH (framing::Buffer& inBuffer, std::string replyToKey, uint32_t sequence);
00210
00211 size_t ValidateSchema(framing::Buffer&);
00212 };
00213
00214 }}
00215
00216 #endif