diff options
author | Ted Ross <tross@apache.org> | 2011-01-11 19:24:14 +0000 |
---|---|---|
committer | Ted Ross <tross@apache.org> | 2011-01-11 19:24:14 +0000 |
commit | 04290ff771075a5e275996a83d87d031a0884823 (patch) | |
tree | a36c71bce7361eee05f5b3b6d9f287a2da0720a0 | |
parent | 180f6554ab2755973026dfe6f47d94be9286da41 (diff) | |
download | qpid-python-04290ff771075a5e275996a83d87d031a0884823.tar.gz |
Added argument/type check for output arguments on methods.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1057814 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | qpid/cpp/src/qmf/AgentEvent.cpp | 3 | ||||
-rw-r--r-- | qpid/cpp/src/qmf/AgentEventImpl.h | 3 | ||||
-rw-r--r-- | qpid/cpp/src/qmf/AgentSession.cpp | 11 |
3 files changed, 13 insertions, 4 deletions
diff --git a/qpid/cpp/src/qmf/AgentEvent.cpp b/qpid/cpp/src/qmf/AgentEvent.cpp index fbdce686d4..2dc24ecac1 100644 --- a/qpid/cpp/src/qmf/AgentEvent.cpp +++ b/qpid/cpp/src/qmf/AgentEvent.cpp @@ -21,6 +21,7 @@ #include "qmf/AgentEventImpl.h" #include "qmf/PrivateImplRef.h" +#include "qmf/SchemaImpl.h" using namespace std; using namespace qmf; @@ -64,6 +65,8 @@ Data AgentEventImpl::dequeueData() void AgentEventImpl::addReturnArgument(const string& key, const Variant& val, const string& subtype) { + if (schema.isValid() && !SchemaImplAccess::get(schema).isValidMethodOutArg(methodName, key, val)) + throw QmfException("Output argument is unknown or the type is incompatible"); outArguments[key] = val; if (!subtype.empty()) outArgumentSubtypes[key] = subtype; diff --git a/qpid/cpp/src/qmf/AgentEventImpl.h b/qpid/cpp/src/qmf/AgentEventImpl.h index 058e31d78d..1ecb41775a 100644 --- a/qpid/cpp/src/qmf/AgentEventImpl.h +++ b/qpid/cpp/src/qmf/AgentEventImpl.h @@ -29,6 +29,7 @@ #include "qmf/Query.h" #include "qmf/DataAddr.h" #include "qmf/Data.h" +#include "qmf/Schema.h" #include <queue> namespace qmf { @@ -45,6 +46,7 @@ namespace qmf { void setArguments(const qpid::types::Variant::Map& a) { arguments = a; } void setArgumentSubtypes(const qpid::types::Variant::Map& a) { argumentSubtypes = a; } void setReplyTo(const qpid::messaging::Address& r) { replyTo = r; } + void setSchema(const Schema& s) { schema = s; } const qpid::messaging::Address& getReplyTo() { return replyTo; } void setCorrelationId(const std::string& c) { correlationId = c; } const std::string& getCorrelationId() { return correlationId; } @@ -73,6 +75,7 @@ namespace qmf { std::string correlationId; Query query; DataAddr dataAddr; + Schema schema; std::string methodName; qpid::types::Variant::Map arguments; qpid::types::Variant::Map argumentSubtypes; diff --git a/qpid/cpp/src/qmf/AgentSession.cpp b/qpid/cpp/src/qmf/AgentSession.cpp index 3426167f87..d8600fc3c0 100644 --- a/qpid/cpp/src/qmf/AgentSession.cpp +++ b/qpid/cpp/src/qmf/AgentSession.cpp @@ -650,16 +650,19 @@ void AgentSessionImpl::handleMethodRequest(const Variant::Map& content, const Me return; } - if (DataImplAccess::get(iter->second).getSchema().isValid()) + Schema schema(DataImplAccess::get(iter->second).getSchema()); + if (schema.isValid()) { + eventImpl->setSchema(schema); for (Variant::Map::const_iterator aIter = eventImpl->getArguments().begin(); aIter != eventImpl->getArguments().end(); aIter++) { const Schema& schema(DataImplAccess::get(iter->second).getSchema()); if (!SchemaImplAccess::get(schema).isValidMethodInArg(eventImpl->getMethodName(), aIter->first, aIter->second)) { - AgentEvent event(eventImpl.release()); - raiseException(event, "Invalid argument: " + aIter->first); - return; + AgentEvent event(eventImpl.release()); + raiseException(event, "Invalid argument: " + aIter->first); + return; } } + } } enqueueEvent(AgentEvent(eventImpl.release())); |