diff options
author | Ted Ross <tross@apache.org> | 2009-09-21 16:24:38 +0000 |
---|---|---|
committer | Ted Ross <tross@apache.org> | 2009-09-21 16:24:38 +0000 |
commit | ffe7d369e3a2c2304743b6a54ff3d4fb6f95a056 (patch) | |
tree | 92fff5c50fed2fce3c1bd45f4d7dae98b7052a41 /qpid/cpp/src | |
parent | e4dc41ed4d12c81a9683d69f6328b2de63c9288f (diff) | |
download | qpid-python-ffe7d369e3a2c2304743b6a54ff3d4fb6f95a056.tar.gz |
Added Ruby test infrastructure and Console tests in Ruby
Fixed issues identified by the new tests:
- Improper formatting of object-id in get-query
- Remote (non-broker-resident) agents not visible to the console
- object.update() and object.merge() not implemented
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@817312 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src')
-rw-r--r-- | qpid/cpp/src/qmf/BrokerProxyImpl.cpp | 44 | ||||
-rw-r--r-- | qpid/cpp/src/qmf/BrokerProxyImpl.h | 3 | ||||
-rw-r--r-- | qpid/cpp/src/qmf/Object.h | 4 | ||||
-rw-r--r-- | qpid/cpp/src/qmf/ObjectIdImpl.cpp | 2 | ||||
-rw-r--r-- | qpid/cpp/src/qmf/ObjectImpl.cpp | 14 | ||||
-rw-r--r-- | qpid/cpp/src/qmf/ObjectImpl.h | 2 |
6 files changed, 58 insertions, 11 deletions
diff --git a/qpid/cpp/src/qmf/BrokerProxyImpl.cpp b/qpid/cpp/src/qmf/BrokerProxyImpl.cpp index 29e51566b3..a66fa24834 100644 --- a/qpid/cpp/src/qmf/BrokerProxyImpl.cpp +++ b/qpid/cpp/src/qmf/BrokerProxyImpl.cpp @@ -113,7 +113,7 @@ void BrokerProxyImpl::startProtocol() char rawbuffer[512]; Buffer buffer(rawbuffer, 512); - agentList.push_back(AgentProxyPtr(AgentProxyImpl::factory(console, publicObject, 0, "Agent embedded in broker"))); + agentList[0] = AgentProxyPtr(AgentProxyImpl::factory(console, publicObject, 0, "Agent embedded in broker")); requestsOutstanding = 1; topicBound = false; @@ -189,10 +189,10 @@ uint32_t BrokerProxyImpl::agentCount() const const AgentProxy* BrokerProxyImpl::getAgent(uint32_t idx) const { Mutex::ScopedLock _lock(lock); - for (vector<AgentProxyPtr>::const_iterator iter = agentList.begin(); + for (map<uint32_t, AgentProxyPtr>::const_iterator iter = agentList.begin(); iter != agentList.end(); iter++) if (idx-- == 0) - return iter->get(); + return iter->second.get(); return 0; } @@ -204,9 +204,9 @@ void BrokerProxyImpl::sendQuery(const Query& query, void* context, const AgentPr sendGetRequestLH(queryContext, query, agent); } else { // TODO (optimization) only send queries to agents that have the requested class+package - for (vector<AgentProxyPtr>::const_iterator iter = agentList.begin(); + for (map<uint32_t, AgentProxyPtr>::const_iterator iter = agentList.begin(); iter != agentList.end(); iter++) { - sendGetRequestLH(queryContext, query, (*iter).get()); + sendGetRequestLH(queryContext, query, iter->second.get()); } } } @@ -317,6 +317,7 @@ BrokerEventImpl::Ptr BrokerProxyImpl::eventSetupComplete() BrokerEventImpl::Ptr BrokerProxyImpl::eventStable() { + QPID_LOG(trace, "Console Link to Broker Stable"); BrokerEventImpl::Ptr event(new BrokerEventImpl(BrokerEvent::STABLE)); return event; } @@ -432,7 +433,7 @@ void BrokerProxyImpl::handleSchemaResponse(Buffer& inBuffer, uint32_t seq) // request for the current list of agents so we can have it on-hand before we declare // this session "stable". // - if (key->getClassName() == AGENT_CLASS && key->getPackageName() == BROKER_PACKAGE) { + if (key->impl->getClassName() == AGENT_CLASS && key->impl->getPackageName() == BROKER_PACKAGE) { Mutex::ScopedLock _lock(lock); incOutstandingLH(); Buffer outBuffer(outputBuffer, MA_BUFFER_SIZE); @@ -467,7 +468,36 @@ ObjectPtr BrokerProxyImpl::handleObjectIndication(Buffer& inBuffer, uint32_t seq return ObjectPtr(); } - return ObjectPtr(ObjectImpl::factory(schema, this, inBuffer, prop, stat, true)); + ObjectPtr optr(ObjectImpl::factory(schema, this, inBuffer, prop, stat, true)); + if (prop && classKey->impl->getPackageName() == BROKER_PACKAGE && classKey->impl->getClassName() == AGENT_CLASS) { + // + // We've intercepted information about a remote agent... update the agent list accordingly + // + updateAgentList(optr); + } + return optr; +} + +void BrokerProxyImpl::updateAgentList(ObjectPtr obj) +{ + Value* value = obj->getValue("agentBank"); + if (value != 0 && value->isUint()) { + uint32_t agentBank = value->asUint(); + if (obj->isDeleted()) { + agentList.erase(agentBank); + QPID_LOG(trace, "Agent at bank " << agentBank << " removed from agent list"); + } else { + Value* str = obj->getValue("label"); + string label; + if (str != 0 && str->isString()) + label = str->asString(); + map<uint32_t, AgentProxyPtr>::const_iterator iter = agentList.find(agentBank); + if (iter == agentList.end()) { + agentList[agentBank] = AgentProxyPtr(AgentProxyImpl::factory(console, publicObject, agentBank, label)); + QPID_LOG(trace, "Agent '" << label << "' found at bank " << agentBank); + } + } + } } void BrokerProxyImpl::incOutstandingLH() diff --git a/qpid/cpp/src/qmf/BrokerProxyImpl.h b/qpid/cpp/src/qmf/BrokerProxyImpl.h index d98c28c32a..3b85191f85 100644 --- a/qpid/cpp/src/qmf/BrokerProxyImpl.h +++ b/qpid/cpp/src/qmf/BrokerProxyImpl.h @@ -146,7 +146,7 @@ namespace qmf { SequenceManager seqMgr; uint32_t requestsOutstanding; bool topicBound; - std::vector<AgentProxyPtr> agentList; + std::map<uint32_t, AgentProxyPtr> agentList; std::deque<MessageImpl::Ptr> xmtQueue; std::deque<BrokerEventImpl::Ptr> eventQueue; @@ -169,6 +169,7 @@ namespace qmf { void handleEventIndication(qpid::framing::Buffer& inBuffer, uint32_t seq); void handleSchemaResponse(qpid::framing::Buffer& inBuffer, uint32_t seq); ObjectPtr handleObjectIndication(qpid::framing::Buffer& inBuffer, uint32_t seq, bool prop, bool stat); + void updateAgentList(ObjectPtr obj); void incOutstandingLH(); void decOutstanding(); }; diff --git a/qpid/cpp/src/qmf/Object.h b/qpid/cpp/src/qmf/Object.h index ded6714429..58ab12365e 100644 --- a/qpid/cpp/src/qmf/Object.h +++ b/qpid/cpp/src/qmf/Object.h @@ -37,8 +37,10 @@ namespace qmf { const ObjectId* getObjectId() const; void setObjectId(ObjectId* oid); const SchemaObjectClass* getClass() const; - Value* getValue(char* key) const; + Value* getValue(const char* key) const; void invokeMethod(const char* methodName, const Value* inArgs, void* context) const; + bool isDeleted() const; + void merge(const Object& from); private: friend class ObjectImpl; diff --git a/qpid/cpp/src/qmf/ObjectIdImpl.cpp b/qpid/cpp/src/qmf/ObjectIdImpl.cpp index b993c2dbdf..90daf204c8 100644 --- a/qpid/cpp/src/qmf/ObjectIdImpl.cpp +++ b/qpid/cpp/src/qmf/ObjectIdImpl.cpp @@ -115,7 +115,7 @@ std::string ObjectIdImpl::asString() const { stringstream val; - val << getFlags() << "-" << getSequence() << "-" << getBrokerBank() << "-" << + val << (int) getFlags() << "-" << getSequence() << "-" << getBrokerBank() << "-" << getAgentBank() << "-" << getObjectNum(); return val.str(); } diff --git a/qpid/cpp/src/qmf/ObjectImpl.cpp b/qpid/cpp/src/qmf/ObjectImpl.cpp index f78808376f..99d1fb4354 100644 --- a/qpid/cpp/src/qmf/ObjectImpl.cpp +++ b/qpid/cpp/src/qmf/ObjectImpl.cpp @@ -118,6 +118,16 @@ void ObjectImpl::invokeMethod(const string& methodName, const Value* inArgs, voi broker->sendMethodRequest(objectId.get(), objectClass, methodName, inArgs, context); } +void ObjectImpl::merge(const Object& from) +{ + for (map<string, ValuePtr>::const_iterator piter = from.impl->properties.begin(); + piter != from.impl->properties.end(); piter++) + properties[piter->first] = piter->second; + for (map<string, ValuePtr>::const_iterator siter = from.impl->statistics.begin(); + siter != from.impl->statistics.end(); siter++) + statistics[siter->first] = siter->second; +} + void ObjectImpl::parsePresenceMasks(Buffer& buffer, set<string>& excludeList) { int propCount = objectClass->getPropertyCount(); @@ -215,6 +225,8 @@ void Object::destroy() { impl->destroy(); } const ObjectId* Object::getObjectId() const { return impl->getObjectId(); } void Object::setObjectId(ObjectId* oid) { impl->setObjectId(oid); } const SchemaObjectClass* Object::getClass() const { return impl->getClass(); } -Value* Object::getValue(char* key) const { return impl->getValue(key); } +Value* Object::getValue(const char* key) const { return impl->getValue(key); } void Object::invokeMethod(const char* m, const Value* a, void* c) const { impl->invokeMethod(m, a, c); } +bool Object::isDeleted() const { return impl->isDeleted(); } +void Object::merge(const Object& from) { impl->merge(from); } diff --git a/qpid/cpp/src/qmf/ObjectImpl.h b/qpid/cpp/src/qmf/ObjectImpl.h index 565e9a2704..0776aab8fa 100644 --- a/qpid/cpp/src/qmf/ObjectImpl.h +++ b/qpid/cpp/src/qmf/ObjectImpl.h @@ -59,6 +59,8 @@ namespace qmf { const SchemaObjectClass* getClass() const { return objectClass; } Value* getValue(const std::string& key) const; void invokeMethod(const std::string& methodName, const Value* inArgs, void* context) const; + bool isDeleted() const { return destroyTime != 0; } + void merge(const Object& from); void parsePresenceMasks(qpid::framing::Buffer& buffer, std::set<std::string>& excludeList); void encodeSchemaKey(qpid::framing::Buffer& buffer) const; |