+++ /dev/null
-// ANNA - Anna is Not 'N' Anymore
-//
-// (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
-//
-// https://bitbucket.org/testillano/anna
-//
-// 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 Google Inc. 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
-
-
-#ifndef anna_core_oam_CounterManager_hpp
-#define anna_core_oam_CounterManager_hpp
-
-#include <anna/core/functions.hpp>
-#include <anna/core/Singleton.hpp>
-
-#include <anna/timex/Timer.hpp>
-
-#include <anna/core/oam/Counter.hpp>
-#include <anna/core/oam/CounterScope.hpp>
-
-namespace anna {
-
-namespace xml {
-class Node;
-}
-
-namespace timex {
-class Engine;
-}
-
-namespace oam {
-
-class CounterScope;
-class CounterRecorder;
-class CounterSummarizer;
-class Counter;
-
-/**
- Gestor de contadores.
-
- Mantiene la lista de ambitos y contadores definidas en nuestra aplicacion. Ademas establece
- el periodo de grabacion de los contadores modificados.
-
- El periodo de grabacion se iniciara cada vez que se incremente un contador.
-*/
-class CounterManager : public Singleton <CounterManager> {
-public:
- static const int MaxScope = 100; /**< Numero maximo de ambitos */
-
- /**
- Destructor.
- */
- virtual ~CounterManager();
-
- /**
- * Devuelve el gestor de tiempos asociado al gestor de contadores.
- * \return el gestor de tiempos asociado al gestor de contadores.
- */
- timex::Engine* getEngine() throw() { return a_timeController; }
-
- /**
- Establece el gestor de tiempos usado para establecer el periodo de grabacion
- de contadores.
- \param timeController Gestor de tiempos usado para establecer el periodo de
- grabacion de contadores.
- */
- void setEngine(timex::Engine* timeController) throw() { a_timeController = timeController; }
-
- /**
- Establece la instancia de la clase encargada de grabar el fichero con la informacion
- de los contadores.
- \param counterRecorder Instancia encargada de grabar los contadores.
- \warning Sera invocado automaticamente cuando se cumpla el periodo de grabacion indicado en
- la configuracion de esta clase.
-
- */
- void setCounterRecorder(CounterRecorder* counterRecorder) throw() { a_counterRecorder = counterRecorder; }
-
- /**
- Establece la instancia de la clase encargada de calcular los contadores acumulados o
- expresados en funcion de algunos otros.
- \param counterSummarizer Instancia encargada de calcular los contadores acumulados o
- expresados en funcion de algunos otros.
- \warning Sera invocado automaticamente cuando se cumpla el periodo de grabacion indicado en
- la configuracion de esta clase.
-
- */
- void setCounterSummarizer(CounterSummarizer* counterSummarizer) throw() { a_counterSummarizer = counterSummarizer; }
-
- /**
- Establece el periodo de grabacion de los contadores. Por defecto sera 600000 (10 minutos).
- \param millisecond Periodo de grabacion de contadores expresado en milisegundos.
- */
- void setRecordPeriod(const anna::Millisecond & millisecond) throw() { a_timer.setTimeout(millisecond); }
-
- /**
- Operador de acceso. El ambito solicitado deberia estar creado mediate #create.
- \param scope Indica el numero de ambito al que deseamos acceder.
- \return El ambito de contadores.
- */
- CounterScope& operator [](const int scope) throw(RuntimeException) { return find(scope); }
-
- /**
- Operador de acceso. El ambito solicitado deberia estar creado mediate #create.
- \param scope Indica el numero de ambito al que deseamos acceder.
- \return El ambito de contadores.
- */
- const CounterScope& operator [](const int scope) const throw(RuntimeException) { return find(scope); }
-
- /**
- Crea un nuevo ambito de contadores.
- \param scope Índice del ambito. Debera ser menor de MaxScope.
- \param name Nombre logico del ambito.
- \param reuse Reusa el ambito si ya fue creado o da excepcion (por defecto).
- */
- CounterScope& create(const int scope, const char* name, bool reuse = false) throw(RuntimeException);
-
- /**
- Crea un nuevo ambito de contadores. Creara el ambito 0.
- \param name Nombre logico del ambito.
- */
- CounterScope& create(const char* name) throw(RuntimeException) { return create(0, name); }
-
- /**
- Devuelve el ambito de contadores asociado al numero recibido como parametro.
- El ambito solicitado deberia estar creado mediate #create.
- \param scope Indica el numero de ambito al que deseamos acceder.
- \return El ambito de contadores.
- */
- CounterScope& find(const int scope) throw(RuntimeException);
-
- /**
- Devuelve el ambito de contadores asociado al numero recibido como parametro.
- El ambito solicitado deberia estar creado mediate #create.
- \param scope Indica el numero de ambito al que deseamos acceder.
- \return El ambito de contadores.
- */
- const CounterScope& find(const int scope) const throw(RuntimeException);
-
- /**
- Vuelca los contadores modificados desde la ultima llamada a este metodo.
-
- \warning Si se ha establecido un anna::timex::Engine valido mediante la invocacion al
- metodo #setEngine no seria necesario invocar a este metodo, ya que se invocara automaticamente
- cuando se cumpla el periodo de grabacion establecido por la configuracion.
- */
- void record() throw(RuntimeException);
-
- /**
- * Devuelve la información relevante de esta instancia en un documento XML.
- * \return la información relevante de esta instancia en un documento XML.
- */
- xml::Node* asXML(xml::Node* parent) const throw(RuntimeException);
-
- /**
- Incrementa la cuenta del contador identificador por (scope, counter)
- El ambito solicitado deberia estar creado mediate #create, ademas el contador debera
- estar creado mediante CounterScope::create.
- \param scope Ámbito del contador.
- \param counter Identificador del contador.
- \param value Valor con el que incrementar el contador.
- */
- static void count(const int scope, const int counter, const oam::Counter::type_t value = 1) throw();
-
- /**
- Incrementa la cuenta del contador identificador por (scope = 0, counter)
- El ambito solicitado deberia estar creado mediate #create, ademas el contador debera
- estar creado mediante CounterScope::create.
- \param counter Identificador del contador.
- */
- static void count(const int counter) { count(0, counter, 1); }
-
-private:
- class Timer : public timex::Timer {
- public:
- Timer(CounterManager& counterManager) :
- timex::Timer("anna::oam:CounterManager::Timer", Millisecond(600000)),
- a_counterManager(counterManager)
- {;}
-
- private:
- CounterManager& a_counterManager;
- void expire(timex::Engine *) throw(RuntimeException) { a_counterManager.record(); }
- };
-
- class RecordingGuard {
- public:
- RecordingGuard(CounterManager*);
- ~RecordingGuard();
- private:
- CounterManager* a_counterManager;
- };
-
- CounterScope* a_scopes [MaxScope];
- Timer a_timer;
- timex::Engine* a_timeController;
- CounterRecorder* a_counterRecorder;
- CounterSummarizer* a_counterSummarizer;
- bool a_recording;
-
- CounterManager();
- CounterManager(const CounterManager&);
- void activateTimer() throw(RuntimeException);
-
- friend class Singleton <CounterManager>;
- friend class Timer;
-
- friend class CounterScope;
- // activateTimer
-
- friend class RecordingGuard;
-};
-
-}
-}
-
-#endif
-