Allow to log statistics samples as a event operation
[anna.git] / example / diameter / launcher / Launcher.hpp
index 204459a..dcc684d 100644 (file)
@@ -18,6 +18,7 @@
 #include <anna/core/core.hpp>
 #include <anna/comm/comm.hpp>
 #include <anna/time/Date.hpp>
+#include <anna/diameter/codec/Message.hpp>
 
 // Process
 #include <MyCommunicator.hpp>
 #include <TestManager.hpp>
 
 
+#define SH_COMMAND_TAG_FOR_REPLACE__CYCLE_ID    "##cycleid##"
+#define SH_COMMAND_TAG_FOR_REPLACE__TESTCASE_ID "##testcaseid##"
+#define SH_COMMAND_TAG_FOR_REPLACE__TESTSTEP_ID "##teststepid##"
+
+
 namespace anna {
   namespace timex {
     class Engine;
@@ -37,66 +43,85 @@ namespace anna {
 }
 
 class TestManager;
+class OriginHost;
+class MyDiameterEntity;
+class MyLocalServer;
+class MyDiameterEngine;
 
-// RealmNode resources
-class RealmNode;
-typedef std::map<std::string, RealmNode*> realm_nodes_t;
-typedef std::map<std::string, RealmNode*>::const_iterator realm_nodes_it;
-typedef std::map<std::string, RealmNode*>::iterator realm_nodes_nc_it;
+// OriginHost resources
+class OriginHost;
+typedef std::map<std::string, OriginHost*> origin_hosts_t;
+typedef std::map<std::string, OriginHost*>::const_iterator origin_hosts_it;
+typedef std::map<std::string, OriginHost*>::iterator origin_hosts_nc_it;
 
 
 class Launcher : public anna::comm::Application {
 
   // Start time:
   anna::time::Date a_start_time;
+  std::string a_initialWorkingDirectory;
 
   // Core engines:
   MyCommunicator *a_communicator;
-  anna::diameter::codec::Engine *a_codecEngine;
-  anna::diameter::stack::Dictionary *a_baseProtocolDictionary;
   anna::timex::Engine* a_timeEngine;
   MyCounterRecorder *a_counterRecorder;
   anna::Millisecond a_admlMinResolution;
   MyCounterRecorderClock *a_counterRecorderClock;
 
   // Nodes deployment:
-  realm_nodes_t a_nodes;
-  RealmNode *a_workingNode;
+  origin_hosts_t a_originHosts;
+  OriginHost *a_workingNode;
+  OriginHost *a_operatedHost; // auxiliary for eventOperation
 
   // comm resources:
   anna::comm::ServerSocket* a_httpServerSocket; // HTTP
 
   const anna::Millisecond &getADMLMinResolution() const throw() { return a_admlMinResolution; }
 
+  std::string getSignalUSR2InputFile() const throw();
+  std::string getSignalUSR2OutputFile() const throw();
+
   void servicesFromXML(const anna::xml::Node* servicesNode, bool eventOperation) throw(anna::RuntimeException);
   anna::Millisecond checkTimeMeasure(const std::string &parameter, const std::string &value) throw(anna::RuntimeException);
   void initialize() throw(anna::RuntimeException); // HTTP
   void run() throw(anna::RuntimeException);
 
+
+
 public:
   Launcher();
+  //~Launcher(); TODO
 
   void loadServices(const std::string & xmlPathFile, bool eventOperation = false) throw(anna::RuntimeException);
   void startServices() throw(anna::RuntimeException);
 
-  anna::diameter::codec::Engine *getCodecEngine() const throw() { return a_codecEngine; }
-  //anna::diameter::stack::Dictionary *getBaseProtocolDictionary() const throw() { return a_baseProtocolDictionary; }
-  RealmNode *getWorkingNode() const throw(anna::RuntimeException); // management operations working node
-  bool setWorkingNode(const std::string &name) throw(); // we could update ignoreFlagsOnValidation/integrationAndDebugging over the global codec engine
-                                                        //  but finally, that configuration issues will be global to the process.
+  bool setWorkingNode(const std::string &name) throw();
+  OriginHost *getOriginHost(const std::string &oh) const throw(anna::RuntimeException);
+  OriginHost *getOriginHost(const anna::diameter::codec::Message &message) const throw(anna::RuntimeException);
+  bool uniqueOriginHost() const throw() { return (a_originHosts.size() == 1); }
 
-  RealmNode *getRealmNode(const std::string &realmName) const throw();
+  // Operated host for communication resources smart assignment ////////////////////////////////////////////////////////////
+  void updateOperatedOriginHostWithMessage(const anna::diameter::codec::Message &message) throw(anna::RuntimeException);
+  OriginHost *getOperatedHost() const throw(anna::RuntimeException);
+  MyDiameterEntity *getOperatedEntity() const throw(anna::RuntimeException);
+  MyLocalServer *getOperatedServer() const throw(anna::RuntimeException);
+  MyDiameterEngine *getOperatedEngine() const throw(anna::RuntimeException);
+  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 
   MyCommunicator *getCommunicator() throw() { return a_communicator; }
   void eventOperation(const std::string &, std::string &) throw(anna::RuntimeException);
   void forceCountersRecord() throw(anna::RuntimeException) { if (a_counterRecorderClock) a_counterRecorderClock->tick(); }
+  void logStatisticsSamples(const std::string &conceptsList) throw();
+
 
   anna::xml::Node* asXML(anna::xml::Node* parent) const throw();
   void resetStatistics() throw();
   void resetCounters() throw();
   void signalUSR2() throw(anna::RuntimeException);
   std::string help() const throw();
+  anna::xml::Node* oamAsXML(anna::xml::Node* parent) const throw();
+  anna::xml::Node* statsAsXML(anna::xml::Node* parent) const throw();
 
   // helpers
   bool getDataBlockFromHexFile(const std::string &pathfile, anna::DataBlock &db) const throw();