Remove dynamic exceptions
[anna.git] / source / core / oam / Module.cpp
index f0fad25..8f8af47 100644 (file)
@@ -1,37 +1,9 @@
-// ANNA - Anna is Not Nothingness Anymore
-//
-// (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
-//
-// http://redmine.teslayout.com/projects/anna-suite
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions
-// are met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     *  Neither the name of the copyright holder nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: eduardo.ramos.testillano@gmail.com
-//          cisco.tierra@gmail.com
+// ANNA - Anna is Not Nothingness Anymore                                                         //
+//                                                                                                //
+// (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
+//                                                                                                //
+// See project site at http://redmine.teslayout.com/projects/anna-suite                           //
+// See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
 
 
 // Local
@@ -70,7 +42,7 @@ anna::oam::Module::~Module() {
 //------------------------------------------------------------------------------
 //----------------------------------------------------------- Module::getScope()
 //------------------------------------------------------------------------------
-anna::oam::CounterScope *anna::oam::Module::getScope(const int &id) throw() {
+anna::oam::CounterScope *anna::oam::Module::getScope(const int &id) {
   scope_iterator it = scope_find(id);
   return ((it != scope_end()) ? scope(it) : NULL);
 }
@@ -78,7 +50,7 @@ anna::oam::CounterScope *anna::oam::Module::getScope(const int &id) throw() {
 ////------------------------------------------------------------------------------
 ////------------------------------------------------------- Module::alarm_remove()
 ////------------------------------------------------------------------------------
-//bool anna::oam::Module::alarm_remove(const int &key) throw() {
+//bool anna::oam::Module::alarm_remove(const int &key) {
 //   alarm_iterator it = alarm_find(key);
 //   if (it != alarm_end()) {
 //      a_alarms.erase(key);
@@ -91,7 +63,7 @@ anna::oam::CounterScope *anna::oam::Module::getScope(const int &id) throw() {
 ////------------------------------------------------------------------------------
 ////----------------------------------------------------- Module::counter_remove()
 ////------------------------------------------------------------------------------
-//bool anna::oam::Module::counter_remove(const int &key) throw() {
+//bool anna::oam::Module::counter_remove(const int &key) {
 //   counter_iterator it = counter_find(key);
 //   if (it != counter_end()) {
 //      a_counters.erase(key);
@@ -108,7 +80,7 @@ anna::oam::CounterScope *anna::oam::Module::getScope(const int &id) throw() {
 //------------------------------------------------------------------------------
 //----------------------------------------------------- Module::enableCounters()
 //------------------------------------------------------------------------------
-void anna::oam::Module::enableCounters(void) throw() {
+void anna::oam::Module::enableCounters(void) {
   a_counters_enabled = true;
   LOGDEBUG(anna::Logger::debug("Scoped counters ENABLED", ANNA_FILE_LOCATION));
 }
@@ -117,7 +89,7 @@ void anna::oam::Module::enableCounters(void) throw() {
 //------------------------------------------------------------------------------
 //---------------------------------------------------- Module::disableCounters()
 //------------------------------------------------------------------------------
-void anna::oam::Module::disableCounters(void) throw() {
+void anna::oam::Module::disableCounters(void) {
   a_counters_enabled = false;
   LOGDEBUG(anna::Logger::debug("Scoped counters DISABLED", ANNA_FILE_LOCATION));
 }
@@ -126,7 +98,7 @@ void anna::oam::Module::disableCounters(void) throw() {
 //------------------------------------------------------------------------------
 //------------------------------------------------------- Module::enableAlarms()
 //------------------------------------------------------------------------------
-void anna::oam::Module::enableAlarms(void) throw() {
+void anna::oam::Module::enableAlarms(void) {
   a_alarms_enabled = true;
   LOGDEBUG(anna::Logger::debug("Scoped alarms ENABLED", ANNA_FILE_LOCATION));
 }
@@ -135,7 +107,7 @@ void anna::oam::Module::enableAlarms(void) throw() {
 //------------------------------------------------------------------------------
 //------------------------------------------------------ Module::disableAlarms()
 //------------------------------------------------------------------------------
-void anna::oam::Module::disableAlarms(void) throw() {
+void anna::oam::Module::disableAlarms(void) {
   a_alarms_enabled = false;
   LOGDEBUG(anna::Logger::debug("Scoped alarms DISABLED", ANNA_FILE_LOCATION));
 }
@@ -144,7 +116,7 @@ void anna::oam::Module::disableAlarms(void) throw() {
 //------------------------------------------------------------------------------
 //------------------------------------------------ Module::enableAlarmsPreffix()
 //------------------------------------------------------------------------------
-void anna::oam::Module::enableAlarmsPreffix(void) throw() {
+void anna::oam::Module::enableAlarmsPreffix(void) {
   a_alarms_preffix_enabled = true;
   LOGDEBUG(anna::Logger::debug("Alarm preffix module components SHOWN", ANNA_FILE_LOCATION));
 }
@@ -153,7 +125,7 @@ void anna::oam::Module::enableAlarmsPreffix(void) throw() {
 //------------------------------------------------------------------------------
 //------------------------------------------------- Module::enableAlarmsSuffix()
 //------------------------------------------------------------------------------
-void anna::oam::Module::enableAlarmsSuffix(void) throw() {
+void anna::oam::Module::enableAlarmsSuffix(void) {
   a_alarms_suffix_enabled = true;
   LOGDEBUG(anna::Logger::debug("Alarm suffix module components SHOWN", ANNA_FILE_LOCATION));
 }
@@ -162,7 +134,7 @@ void anna::oam::Module::enableAlarmsSuffix(void) throw() {
 //------------------------------------------------------------------------------
 //----------------------------------------------- Module::disableAlarmsPreffix()
 //------------------------------------------------------------------------------
-void anna::oam::Module::disableAlarmsPreffix(void) throw() {
+void anna::oam::Module::disableAlarmsPreffix(void) {
   a_alarms_preffix_enabled = false;
   LOGDEBUG(anna::Logger::debug("Alarm preffix module components HIDDEN", ANNA_FILE_LOCATION));
 }
@@ -171,7 +143,7 @@ void anna::oam::Module::disableAlarmsPreffix(void) throw() {
 //------------------------------------------------------------------------------
 //------------------------------------------------ Module::disableAlarmsSuffix()
 //------------------------------------------------------------------------------
-void anna::oam::Module::disableAlarmsSuffix(void) throw() {
+void anna::oam::Module::disableAlarmsSuffix(void) {
   a_alarms_suffix_enabled = false;
   LOGDEBUG(anna::Logger::debug("Alarm suffix module components HIDDEN", ANNA_FILE_LOCATION));
 }
@@ -180,7 +152,7 @@ void anna::oam::Module::disableAlarmsSuffix(void) throw() {
 //------------------------------------------------------------------------------
 //--------------------------------- Module::getDefaultInternalAlarmDescription()
 //------------------------------------------------------------------------------
-std::string anna::oam::Module::getDefaultInternalAlarmDescription(const int & type) const throw() {
+std::string anna::oam::Module::getDefaultInternalAlarmDescription(const int & type) const {
   return UNDEFINED_EVENT_DESCRIPTION;
 }
 
@@ -188,7 +160,7 @@ std::string anna::oam::Module::getDefaultInternalAlarmDescription(const int & ty
 //------------------------------------------------------------------------------
 //------------------------------- Module::getDefaultInternalCounterDescription()
 //------------------------------------------------------------------------------
-std::string anna::oam::Module::getDefaultInternalCounterDescription(const int & type) const throw() {
+std::string anna::oam::Module::getDefaultInternalCounterDescription(const int & type) const {
   return UNDEFINED_EVENT_DESCRIPTION;
 }
 
@@ -196,7 +168,7 @@ std::string anna::oam::Module::getDefaultInternalCounterDescription(const int &
 //------------------------------------------------------------------------------
 //---------------------------------------------- Module::alarmComponentsToText()
 //------------------------------------------------------------------------------
-std::string anna::oam::Module::alarmComponentsToText(const std::vector<std::string> & components, const std::string & psL, const std::string & psS, const std::string & psR) const throw() {
+std::string anna::oam::Module::alarmComponentsToText(const std::vector<std::string> & components, const std::string & psL, const std::string & psS, const std::string & psR) const {
   if(components.size() == 0) return ("");
 
   std::vector<std::string>::const_iterator it_min(components.begin());
@@ -215,7 +187,7 @@ std::string anna::oam::Module::alarmComponentsToText(const std::vector<std::stri
 //------------------------------------------------------------------------------
 //------------------------------ Module::getAlarmPreffixSuffixAndZoneSeparator()
 //------------------------------------------------------------------------------
-void anna::oam::Module::getAlarmPreffixSuffixAndZoneSeparator(std::string & preffix, std::string & suffix, char & zS) const throw() {
+void anna::oam::Module::getAlarmPreffixSuffixAndZoneSeparator(std::string & preffix, std::string & suffix, char & zS) const {
   Configuration &conf = Configuration::instantiate();
   const std::vector<std::string> * globalPreffixComponents = conf.getAlarmPreffixComponents();
   const std::vector<std::string> * globalSuffixComponents = conf.getAlarmSuffixComponents();
@@ -253,12 +225,13 @@ void anna::oam::Module::getAlarmPreffixSuffixAndZoneSeparator(std::string & pref
 //------------------------------------------------------------------------------
 //--------------------------------------------- Module::initializeCounterScope()
 //------------------------------------------------------------------------------
-void anna::oam::Module::initializeCounterScope(const int & scopeId, const std::string & description) throw(anna::RuntimeException) {
+void anna::oam::Module::initializeCounterScope(const int & scopeId, const std::string & description) noexcept(false) {
   LOGMETHOD(anna::TraceMethod tttm("anna::oam::Module", "initializeCounterScope", ANNA_FILE_LOCATION));
 
   // Order of use:
-  if(a_counters.size() != 0)  // any counter have been registered
-    throw anna::RuntimeException("After use of counter registration can't initialize more scope ids!. Do initializations firstly", ANNA_FILE_LOCATION);
+  // https://redmine.teslayout.com/issues/48
+  //if(a_counters.size() != 0)  // any counter have been registered
+  //  throw anna::RuntimeException("After use of counter registration can't initialize more scope ids!. Do initializations firstly", ANNA_FILE_LOCATION);
 
   // Scope range: 0 - 99
   if(scopeId < 0 || scopeId >= MaxScope) {
@@ -284,7 +257,7 @@ void anna::oam::Module::initializeCounterScope(const int & scopeId, const std::s
   anna::Logger::warning("This is not the first initialized scope. Perhaps you should provide specific description better than general module name ...", ANNA_FILE_LOCATION);
   }
   );
-  const char * c_description = (missingScopeDescription ? getClassName() : description.c_str());
+  const char * c_description = (missingScopeDescription ? getName() : description.c_str());
   a_active_counter_scope = new CounterScope(scopeId, c_description);
   a_scopes[scopeId] = a_active_counter_scope;
 }
@@ -293,7 +266,7 @@ void anna::oam::Module::initializeCounterScope(const int & scopeId, const std::s
 //------------------------------------------------------------------------------
 //---------------------------------------------- Module::setActiveCounterScope()
 //------------------------------------------------------------------------------
-void anna::oam::Module::setActiveCounterScope(const int & scopeId) throw() {
+void anna::oam::Module::setActiveCounterScope(const int & scopeId) {
   anna::oam::CounterScope *scope = getScope(scopeId);
 
   if(!scope) {
@@ -308,7 +281,7 @@ void anna::oam::Module::setActiveCounterScope(const int & scopeId) throw() {
 //------------------------------------------------------------------------------
 //---------------------------------------------------- Module::registerCounter()
 //------------------------------------------------------------------------------
-void anna::oam::Module::registerCounter(const int & type, const std::string & description, const int & offset) throw(anna::RuntimeException) {
+void anna::oam::Module::registerCounter(const int & type, const std::string & description, const int & offset) noexcept(false) {
   // Handler-specific
   a_handler->registerCounter(this, type, description, offset);
 
@@ -358,7 +331,7 @@ void anna::oam::Module::registerCounter(const int & type, const std::string & de
 //------------------------------------------------------------------------------
 //------------------------------------------------------ Module::registerAlarm()
 //------------------------------------------------------------------------------
-void anna::oam::Module::registerAlarm(const int & type, const std::string &description, const int & externalId, const std::string & dynamicVariablesCSL, const int & activationId, const int & cancellationId) throw(anna::RuntimeException) {
+void anna::oam::Module::registerAlarm(const int & type, const std::string &description, const int & externalId, const std::string & dynamicVariablesCSL, const int & activationId, const int & cancellationId) noexcept(false) {
   // Handler-specific
   a_handler->registerAlarm(this, type, description, externalId, dynamicVariablesCSL, activationId, cancellationId);
   // Check type existence:
@@ -402,7 +375,7 @@ void anna::oam::Module::registerAlarm(const int & type, const std::string &descr
 //------------------------------------------------------------------------------
 //------------------------------------------------------ Module::activateAlarm()
 //------------------------------------------------------------------------------
-void anna::oam::Module::alarmEvent(bool activation, const int & type, va_list argList) const throw() {
+void anna::oam::Module::alarmEvent(bool activation, const int & type, va_list argList) const {
   // Preffix/Suffix and separator:
   std::string userPreffix, userSuffix; char separator;
   getAlarmPreffixSuffixAndZoneSeparator(userPreffix, userSuffix, separator);
@@ -418,7 +391,7 @@ void anna::oam::Module::alarmEvent(bool activation, const int & type, va_list ar
 //------------------------------------------------------------------------------
 //------------------------------------------------------ Module::activateAlarm()
 //------------------------------------------------------------------------------
-void anna::oam::Module::activateAlarm(int type, ...) const throw(anna::RuntimeException) {
+void anna::oam::Module::activateAlarm(int type, ...) const noexcept(false) {
 //   LOGMETHOD(anna::TraceMethod tttm("anna::oam::Module", "activateAlarm", ANNA_FILE_LOCATION));
 
   // Checkings
@@ -426,7 +399,7 @@ void anna::oam::Module::activateAlarm(int type, ...) const throw(anna::RuntimeEx
     LOGDEBUG
     (
       std::string msg = "Alarm activation ignored over module '";
-      msg += getClassName();
+      msg += getName();
       msg += "': alarms are disabled";
       anna::Logger::debug(msg, ANNA_FILE_LOCATION);
     );
@@ -444,7 +417,7 @@ void anna::oam::Module::activateAlarm(int type, ...) const throw(anna::RuntimeEx
 //------------------------------------------------------------------------------
 //-------------------------------------------------------- Module::cancelAlarm()
 //------------------------------------------------------------------------------
-void anna::oam::Module::cancelAlarm(int type, ...) const throw(anna::RuntimeException) {
+void anna::oam::Module::cancelAlarm(int type, ...) const noexcept(false) {
 //   LOGMETHOD(anna::TraceMethod tttm("anna::oam::Module", "cancelAlarm", ANNA_FILE_LOCATION));
 
   // Checkings
@@ -452,7 +425,7 @@ void anna::oam::Module::cancelAlarm(int type, ...) const throw(anna::RuntimeExce
     LOGDEBUG
     (
       std::string msg = "Alarm cancellation ignored over module '";
-      msg += getClassName();
+      msg += getName();
       msg += "': alarms are disabled";
       anna::Logger::debug(msg, ANNA_FILE_LOCATION);
     );
@@ -470,7 +443,7 @@ void anna::oam::Module::cancelAlarm(int type, ...) const throw(anna::RuntimeExce
 //------------------------------------------------------------------------------
 //-------------------------------------------------------------- Module::count()
 //------------------------------------------------------------------------------
-void anna::oam::Module::count(const int & type, const int & amount) throw(anna::RuntimeException) {
+void anna::oam::Module::count(const int & type, const int & amount) noexcept(false) {
 //   LOGMETHOD(anna::TraceMethod tttm("anna::oam::Module", "count", ANNA_FILE_LOCATION));
 
   // Checkings
@@ -478,7 +451,7 @@ void anna::oam::Module::count(const int & type, const int & amount) throw(anna::
     LOGDEBUG
     (
       std::string msg = "Count operation ignored over module '";
-      msg += getClassName();
+      msg += getName();
       msg += "': counters are disabled";
       anna::Logger::debug(msg, ANNA_FILE_LOCATION);
     );
@@ -492,7 +465,7 @@ void anna::oam::Module::count(const int & type, const int & amount) throw(anna::
 //------------------------------------------------------------------------------
 //------------------------------------------------------ Module::resetCounters()
 //------------------------------------------------------------------------------
-int anna::oam::Module::resetCounters(const int & scopeId) throw() {
+int anna::oam::Module::resetCounters(const int & scopeId) {
   LOGMETHOD(anna::TraceMethod tttm("anna::oam::Module", "resetCounters", ANNA_FILE_LOCATION));
   int result = 0; // affected number
 
@@ -507,23 +480,23 @@ int anna::oam::Module::resetCounters(const int & scopeId) throw() {
 //------------------------------------- Module::RecordingGuard::RecordingGuard()
 //------------------------------------------------------------------------------
 anna::oam::Module::RecordingGuard::RecordingGuard(anna::oam::Module* module) :
-  a_module(module) {                                                
-  module->a_counterRecording = true;                                               
-}                                                                                   
-                                                                                    
+  a_module(module) {
+  module->a_counterRecording = true;
+}
+
 
 //------------------------------------------------------------------------------
 //------------------------------------ Module::RecordingGuard::~RecordingGuard()
 //------------------------------------------------------------------------------
-anna::oam::Module::RecordingGuard::~RecordingGuard() {                            
-  a_module->a_counterRecording = false;                                            
-}                                                                                   
+anna::oam::Module::RecordingGuard::~RecordingGuard() {
+  a_module->a_counterRecording = false;
+}
 
 
 //------------------------------------------------------------------------------
 //----------------------------------------------------- Module::recordCounters()
 //------------------------------------------------------------------------------
-void anna::oam::Module::recordCounters() throw(anna::RuntimeException) {
+void anna::oam::Module::recordCounters() noexcept(false) {
   LOGMETHOD(anna::TraceMethod tttm("anna::oam::Module", "recordCounters", ANNA_FILE_LOCATION));
 
   if(a_counterRecorder == NULL)
@@ -537,7 +510,6 @@ void anna::oam::Module::recordCounters() throw(anna::RuntimeException) {
   RecordingGuard guard(this);
 
   a_counterRecorder->open();
-  Counter* counter = NULL;
   CounterScope* cscope = NULL;
 
   try {
@@ -571,10 +543,10 @@ void anna::oam::Module::recordCounters() throw(anna::RuntimeException) {
 //------------------------------------------------------------------------------
 //----------------------------------------------------------- Module::asString()
 //------------------------------------------------------------------------------
-std::string anna::oam::Module::asString(void) const throw() {
+std::string anna::oam::Module::asString(void) const {
   std::string trace;
   trace = "Module name: '";
-  trace += getClassName();
+  trace += getName();
   trace += "'";
   trace += "\n\nCOUNTERS"; trace += "\n--------";
   trace += "\nScoped counters "; trace += a_counters_enabled ? "Enabled" : "Disabled";
@@ -590,14 +562,25 @@ std::string anna::oam::Module::asString(void) const throw() {
 
     for(const_counter_iterator cnt_it = counter_begin(); cnt_it != counter_end(); cnt_it++) {
       ptrCounterData = (counter_data_t *) & ((*cnt_it).second);
+
+      // Counter registered ?
+      int offset = ptrCounterData->Offset;
+      unsigned long long int accValue = 0ULL;
+      try {
+        const anna::oam::CounterScope *csAux = scope(scope_it);
+        accValue = csAux->getAccValue(offset);
+      } catch(anna::RuntimeException &ex) {
+        ex.trace();
+        continue;
+      }
+
       // Counter:
       trace += "\n\tType: "; trace += anna::functions::asString((*cnt_it).first);
       trace += " | Description: '"; trace += ptrCounterData->Description; trace += "'";
-      int offset = ptrCounterData->Offset;
       int realId = (1000 * scopeId) + offset;
       trace += " | ScopeId/Offset: "; trace += anna::functions::asString(scopeId); trace += "/"; trace += anna::functions::asString(offset);
       trace += " | RealId: "; trace += anna::functions::asString(realId);
-      unsigned long long int accValue = scope(scope_it)->getAccValue(offset);
+      accValue = scope(scope_it)->getAccValue(offset);
 
       if(accValue != 0ULL) {
         trace += " | AccumulatedAmount: ";
@@ -633,9 +616,9 @@ std::string anna::oam::Module::asString(void) const throw() {
 //------------------------------------------------------------------------------
 //-------------------------------------------------------------- Module::asXML()
 //------------------------------------------------------------------------------
-anna::xml::Node* anna::oam::Module::asXML(anna::xml::Node* parent) const throw() {
+anna::xml::Node* anna::oam::Module::asXML(anna::xml::Node* parent) const {
   anna::xml::Node* result = parent->createChild("oam.Module");
-  result->createAttribute("Name", getClassName());
+  result->createAttribute("Name", getName());
   result->createAttribute("Counters", a_counters_enabled ? "Enabled" : "Disabled");
   anna::xml::Node* registeredCounterScopes = result->createChild("RegisteredCounterScopes");
 
@@ -651,16 +634,26 @@ anna::xml::Node* anna::oam::Module::asXML(anna::xml::Node* parent) const throw()
 
     for(const_counter_iterator cnt_it = counter_begin(); cnt_it != counter_end(); cnt_it++) {
       ptrCounterData = (counter_data_t *) & ((*cnt_it).second);
+
+      // Counter registered ?
+      int offset = ptrCounterData->Offset;
+      unsigned long long int accValue = 0ULL;
+      try {
+        const anna::oam::CounterScope *csAux = scope(scope_it);
+        accValue = csAux->getAccValue(offset);
+      } catch(anna::RuntimeException &ex) {
+        ex.trace();
+        continue;
+      }
+
       // Counter:
       anna::xml::Node* counter = registeredCounters->createChild("Counter");
       counter->createAttribute("Type", anna::functions::asString((*cnt_it).first));
       counter->createAttribute("Description", ptrCounterData->Description);
-      int offset = ptrCounterData->Offset;
       int realId = (1000 * scopeId) + offset;
       counter->createAttribute("ScopeId", anna::functions::asString(scopeId));
       counter->createAttribute("Offset", anna::functions::asString(offset));
       counter->createAttribute("RealId", anna::functions::asString(realId));
-      unsigned long long int accValue = scope(scope_it)->getAccValue(offset);
 
       if(accValue != 0ULL)
         counter->createAttribute("AccumulatedAmount", anna::functions::asString("%llu", accValue));