You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2011/02/03 03:46:01 UTC

svn commit: r1066726 - in /qpid/trunk/qpid/cpp: bindings/qmf2/examples/cpp/agent.cpp include/qmf/AgentSession.h src/qmf/AgentSession.cpp

Author: tross
Date: Thu Feb  3 02:46:01 2011
New Revision: 1066726

URL: http://svn.apache.org/viewvc?rev=1066726&view=rev
Log:
Added severity and timestamp fields to raised events.
Enhanced the example agent to illustrate the raising of events.

Modified:
    qpid/trunk/qpid/cpp/bindings/qmf2/examples/cpp/agent.cpp
    qpid/trunk/qpid/cpp/include/qmf/AgentSession.h
    qpid/trunk/qpid/cpp/src/qmf/AgentSession.cpp

Modified: qpid/trunk/qpid/cpp/bindings/qmf2/examples/cpp/agent.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qmf2/examples/cpp/agent.cpp?rev=1066726&r1=1066725&r2=1066726&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qmf2/examples/cpp/agent.cpp (original)
+++ qpid/trunk/qpid/cpp/bindings/qmf2/examples/cpp/agent.cpp Thu Feb  3 02:46:01 2011
@@ -49,6 +49,7 @@ private:
     Schema sch_exception;
     Schema sch_control;
     Schema sch_child;
+    Schema sch_event;
     Data control;
     DataAddr controlAddr;
 
@@ -115,6 +116,11 @@ void ExampleAgent::setupSchema()
     echoMethod.addArgument(SchemaProperty("map", SCHEMA_DATA_MAP, "{dir:INOUT}"));
     sch_control.addMethod(echoMethod);
 
+    SchemaMethod eventMethod("event", "{desc:'Raise an Event'}");
+    eventMethod.addArgument(SchemaProperty("text", SCHEMA_DATA_STRING, "{dir:IN}"));
+    eventMethod.addArgument(SchemaProperty("severity", SCHEMA_DATA_INT, "{dir:IN}"));
+    sch_control.addMethod(eventMethod);
+
     SchemaMethod failMethod("fail", "{desc:'Expected to Fail'}");
     failMethod.addArgument(SchemaProperty("useString", SCHEMA_DATA_BOOL, "{dir:IN}"));
     failMethod.addArgument(SchemaProperty("stringVal", SCHEMA_DATA_STRING, "{dir:IN}"));
@@ -133,11 +139,18 @@ void ExampleAgent::setupSchema()
     sch_child.addProperty(SchemaProperty("name", SCHEMA_DATA_STRING));
 
     //
+    // Declare the event class
+    //
+    sch_event = Schema(SCHEMA_TYPE_EVENT, package, "event");
+    sch_event.addProperty(SchemaProperty("text", SCHEMA_DATA_STRING));
+
+    //
     // Register our schemata with the agent session.
     //
     session.registerSchema(sch_exception);
     session.registerSchema(sch_control);
     session.registerSchema(sch_child);
+    session.registerSchema(sch_event);
 }
 
 void ExampleAgent::populateData()
@@ -173,40 +186,55 @@ bool ExampleAgent::method(AgentEvent& ev
     const string& name(event.getMethodName());
     control.setProperty("methodCount", control.getProperty("methodCount").asUint32() + 1);
 
-    if (controlAddr == event.getDataAddr()) {
-        if (name == "stop") {
-            cout << "Stopping: message=" << event.getArguments()["message"] << endl;
-            session.methodSuccess(event);
-            return false;
-        }
+    try {
+        if (controlAddr == event.getDataAddr()) {
+            if (name == "stop") {
+                cout << "Stopping: message=" << event.getArguments()["message"] << endl;
+                session.methodSuccess(event);
+                return false;
+            }
 
-        if (name == "echo") {
-            event.addReturnArgument("sequence", event.getArguments()["sequence"]);
-            event.addReturnArgument("map", event.getArguments()["map"]);
-            session.methodSuccess(event);
-            return true;
-        }
+            if (name == "echo") {
+                event.addReturnArgument("sequence", event.getArguments()["sequence"]);
+                event.addReturnArgument("map", event.getArguments()["map"]);
+                session.methodSuccess(event);
+                return true;
+            }
 
-        if (name == "fail") {
-            if (event.getArguments()["useString"])
-                session.raiseException(event, event.getArguments()["stringVal"]);
-            else {
-                Data ex(sch_exception);
-                ex.setProperty("whatHappened", "It Failed");
-                ex.setProperty("howBad", 75);
-                ex.setProperty("details", event.getArguments()["details"]);
-                session.raiseException(event, ex);
+            if (name == "event") {
+                Data ev(sch_event);
+                ev.setProperty("text", event.getArguments()["text"]);
+                session.raiseEvent(ev, event.getArguments()["severity"]);
+                session.methodSuccess(event);
+                return true;
             }
-        }
 
-        if (name == "create_child") {
-            const string& name(event.getArguments()["name"]);
-            Data child(sch_child);
-            child.setProperty("name", name);
-            DataAddr addr(session.addData(child, name));
-            event.addReturnArgument("childAddr", addr.asMap());
-            session.methodSuccess(event);
+            if (name == "fail") {
+                if (event.getArguments()["useString"])
+                    session.raiseException(event, event.getArguments()["stringVal"]);
+                else {
+                    Data ex(sch_exception);
+                    ex.setProperty("whatHappened", "It Failed");
+                    ex.setProperty("howBad", 75);
+                    ex.setProperty("details", event.getArguments()["details"]);
+                    session.raiseException(event, ex);
+                }
+            }
+
+            if (name == "create_child") {
+                const string& name(event.getArguments()["name"]);
+                Data child(sch_child);
+                child.setProperty("name", name);
+                DataAddr addr(session.addData(child, name));
+                event.addReturnArgument("childAddr", addr.asMap());
+                session.methodSuccess(event);
+            }
         }
+    } catch (const exception& e) {
+        //
+        // Pass the exception on to the caller.
+        //
+        session.raiseException(event, e.what());
     }
 
     return true;

Modified: qpid/trunk/qpid/cpp/include/qmf/AgentSession.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/include/qmf/AgentSession.h?rev=1066726&r1=1066725&r2=1066726&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/include/qmf/AgentSession.h (original)
+++ qpid/trunk/qpid/cpp/include/qmf/AgentSession.h Thu Feb  3 02:46:01 2011
@@ -165,8 +165,14 @@ namespace qmf {
 
         /**
          * Raise an event to be sent into the QMF network.
+         *
+         * @param data - A data object that contains the event contents.
+         * @param severity - Explicit severity (from qmf/SchemaTypes.h).  If omitted, the severity is set to
+         *        the default severity for the data's schema.  If the data has no schema, the severity defaults
+         *        to SEV_NOTICE.
          */
-        QMF_EXTERN void raiseEvent(const Data&);
+        QMF_EXTERN void raiseEvent(const Data& data);
+        QMF_EXTERN void raiseEvent(const Data& data, int severity);
 
 #ifndef SWIG
     private:

Modified: qpid/trunk/qpid/cpp/src/qmf/AgentSession.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qmf/AgentSession.cpp?rev=1066726&r1=1066725&r2=1066726&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qmf/AgentSession.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qmf/AgentSession.cpp Thu Feb  3 02:46:01 2011
@@ -85,6 +85,7 @@ namespace qmf {
         void complete(AgentEvent& e);
         void methodSuccess(AgentEvent& e);
         void raiseEvent(const Data& d);
+        void raiseEvent(const Data& d, int s);
 
     private:
         typedef map<DataAddr, Data, DataAddrCompare> DataIndex;
@@ -171,6 +172,7 @@ void AgentSession::response(AgentEvent& 
 void AgentSession::complete(AgentEvent& e) { impl->complete(e); }
 void AgentSession::methodSuccess(AgentEvent& e) { impl->methodSuccess(e); }
 void AgentSession::raiseEvent(const Data& d) { impl->raiseEvent(d); }
+void AgentSession::raiseEvent(const Data& d, int s) { impl->raiseEvent(d, s); }
 
 //========================================================================================
 // Impl Method Bodies
@@ -526,24 +528,50 @@ void AgentSessionImpl::methodSuccess(Age
 
 void AgentSessionImpl::raiseEvent(const Data& data)
 {
+    int severity(SEV_NOTICE);
+    if (data.hasSchema()) {
+        const Schema& schema(DataImplAccess::get(data).getSchema());
+        if (schema.isValid())
+            severity = schema.getDefaultSeverity();
+    }
+
+    raiseEvent(data, severity);
+}
+
+
+void AgentSessionImpl::raiseEvent(const Data& data, int severity)
+{
     Message msg;
     Variant::Map map;
     Variant::Map& headers(msg.getProperties());
+    string subject("agent.ind.event");
+
+    if (data.hasSchema()) {
+        const SchemaId& schemaId(data.getSchemaId());
+        if (schemaId.getType() != SCHEMA_TYPE_EVENT)
+            throw QmfException("Cannot call raiseEvent on data that is not an Event");
+        subject = subject + "." + schemaId.getPackageName() + "." + schemaId.getName();
+    }
 
-    // TODO: add severity.package.class to key
-    //       or modify to send only to subscriptions with matching queries
+    if (severity < SEV_EMERG || severity > SEV_DEBUG)
+        throw QmfException("Invalid severity value");
 
     headers[protocol::HEADER_KEY_METHOD] = protocol::HEADER_METHOD_INDICATION;
     headers[protocol::HEADER_KEY_OPCODE] = protocol::HEADER_OPCODE_DATA_INDICATION;
     headers[protocol::HEADER_KEY_CONTENT] = protocol::HEADER_CONTENT_EVENT;
     headers[protocol::HEADER_KEY_AGENT] = agentName;
     headers[protocol::HEADER_KEY_APP_ID] = protocol::HEADER_APP_ID_QMF;
-    msg.setSubject("agent.ind.event");
+    msg.setSubject(subject);
 
-    encode(DataImplAccess::get(data).asMap(), msg);
+    Variant::List list;
+    Variant::Map dataAsMap(DataImplAccess::get(data).asMap());
+    dataAsMap["_severity"] = severity;
+    dataAsMap["_timestamp"] = uint64_t(qpid::sys::Duration(qpid::sys::EPOCH, qpid::sys::now()));
+    list.push_back(dataAsMap);
+    encode(list, msg);
     topicSender.send(msg);
 
-    QPID_LOG(trace, "SENT EventIndication to=agent.ind.event");
+    QPID_LOG(trace, "SENT EventIndication to=" << subject);
 }
 
 



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org