ANNA Suite  2020b
Multipurpose development suite for Telco applications
Public Member Functions | Static Public Member Functions | Protected Member Functions | List of all members
anna::timex::Context< Tid > Class Template Referenceabstract

#include <Context.hpp>

Inheritance diagram for anna::timex::Context< Tid >:
Inheritance graph
[legend]
Collaboration diagram for anna::timex::Context< Tid >:
Collaboration graph
[legend]

Public Member Functions

Transactionopen (const Tid &tid, const int classType=0) noexcept(false)
 
Transactionfind (const Tid &tid, const Exception::Mode::_v emode=Exception::Mode::Throw) noexcept(false)
 
const Tid & getIdentifier (const Transaction *transaction) const noexcept(false)
 
void close (Transaction *transaction)
 
virtual xml::NodeasXML (xml::Node *parent) const
 
- Public Member Functions inherited from anna::timex::TimeEventObserver
 TimeEventObserver (const char *name)
 
std::string asString () const
 

Static Public Member Functions

static const ContextgetInstance (const Transaction *transaction) noexcept(false)
 

Protected Member Functions

 Context (const char *observerName, timex::Engine &timeController, const Millisecond &timeout)
 
virtual TransactioncreateTransaction (const int classType)=0
 
virtual void releaseTransaction (Transaction *transaction)=0
 
virtual std::string identifierAsString (const Tid &tid) const =0
 
virtual const Tid & contextAsIdentifier (const void *tid) const =0
 

Detailed Description

template<typename Tid>
class anna::timex::Context< Tid >

Automatiza todas las operaciones relacionadas con el control de las transaciones de nuestra aplicación.

Parameters
TidIndica el tipo de dato usado para ordenar las transaciones en el contexto. Es distinto del identificador de transacción. El identificador de transacción facilita su localización en los niveles de plataforma, mientras que este Tid facilita su localización a niveles de aplicación. Habitualmente este Tid será una cadena alfanumérica.
Warning
  • El contexto asociado a la anna::timex::Transaction no puede ser usado al nivel de aplicación, ya que esta clase lo usa internamente.
  • No se puede establecer un observador para estas transaciones ya que de otro modo el contexto no podría seguir la pista de las operaciones realizadas sobre ella.
El tipo de dato Tid debe tener los operadores requeridos para actuar como clave de una map <Tid, Transaction>

Constructor & Destructor Documentation

◆ Context()

template<typename Tid >
anna::timex::Context< Tid >::Context ( const char *  observerName,
timex::Engine timeController,
const Millisecond timeout 
)
inlineprotected

Constructor.

Parameters
observerNameEsta clase hera de anna::timex::TimeEventObserver por lo que debe tener un nombre lógico
timeControllerGestor de temporización usado en la aplicación.
timeoutDuración de las transaciones creadas por el contexto. En principio todas las transaciones tendrán la misma duración, pero en próximas versiones se podría ampliar la funcionalidad para que cada transación pueda indicar su duración de forma independiente.
220  :
221  TimeEventObserver(observerName),
222  a_timeController(timeController),
223  a_timeout(timeout) {
224  a_counter = a_accDelay = a_accSize = 0;
225  }
TimeEventObserver(const char *name)
Definition: TimeEventObserver.hpp:39
Here is the call graph for this function:

Member Function Documentation

◆ asXML()

template<typename Tid >
virtual xml::Node* anna::timex::Context< Tid >::asXML ( xml::Node parent) const
inlinevirtual

Devuelve la información relevante de esta clase en forma de documento XML.

Parameters
parentNodo XML del que colgar la información de esta instancia.
Returns
Un documento XML con la información relevante de esta clase.
185  {
186  xml::Node* result = parent->createChild("timex.Context");
187  result->createAttribute("Size", a_transactions.size());
188  result->createAttribute("AvgSize", (a_counter == 0) ? 0 : a_accSize / a_counter);
189  result->createChild("Timeout")->createAttribute("Millisecond", a_timeout.getValue());
190  result->createChild("AvgResponseTime")->createAttribute("Millisecond", (a_counter == 0) ? 0 : a_accDelay / a_counter);
191  return result;
192  }
xml::Attribute * createAttribute(const char *name, const char *value, const Namespace *_namespace=NULL)
Node * createChild(const char *name)
type_t getValue() const
Definition: Millisecond.hpp:120
xml::Node Node
Definition: Node.hpp:21
Here is the call graph for this function:

◆ close()

template<typename Tid >
void anna::timex::Context< Tid >::close ( Transaction transaction)
inline

Termina la transación antes de que termine su periodo de espera.

Parameters
transactionTransación a terminar. Si fuera NULL este método no tiene ningún efecto.
162  {
163  if(transaction == NULL)
164  return;
165 
167  std::string msg("timex::Context::close | ");
168  msg += transaction->asString();
170  );
171 
172  try {
173  a_timeController.cancel(transaction);
174  } catch(RuntimeException& ex) {
175  ex.trace();
176  }
177  }
static void information(const std::string &text, const char *fromFile, const int fromLine)
Definition: Logger.hpp:316
virtual std::string asString() const
Definition: Transaction.hpp:84
#define LOGINFORMATION(a)
Definition: defines.hpp:62
void cancel(TimeEvent *timeEvent) noexcept(false)
#define ANNA_FILE_LOCATION
Definition: defines.hpp:23
Here is the call graph for this function:

◆ contextAsIdentifier()

template<typename Tid >
virtual const Tid& anna::timex::Context< Tid >::contextAsIdentifier ( const void *  tid) const
protectedpure virtual

Método virtual puro que debe devolver la clave de aplicación asociada a una transación

Parameters
tidPuntero que apunta a la clave de aplicación usada para acceder a una transacción.
Returns
La clave de aplicación correspondiente al puntero recibido como parámetro.

◆ createTransaction()

template<typename Tid >
virtual Transaction* anna::timex::Context< Tid >::createTransaction ( const int  classType)
protectedpure virtual

Método virtual puro que creará las transaciones de este contexto cuando sea necesario. Lo más adecuado sería implementar este método mediate el uso del patrón anna::Recycler.

Parameters
classTypeTipo de transación que deseamos crear. Este parámetro sólo será útil en caso de que nuestra aplicación tenga que gestionar varios tipos de transaciones u operaciones.
Returns
Una nueva transación que puede ser usada por este contexto.

◆ find()

template<typename Tid >
Transaction* anna::timex::Context< Tid >::find ( const Tid &  tid,
const Exception::Mode::_v  emode = Exception::Mode::Throw 
)
inlinenoexcept

Devuelve al instancia de la transación correspondiente al identificador recibido como parámetro.

Parameters
tidIdentificador de aplicación de la transación.
emodeModo de actuar en caso de que no se encuentre la transacción correspondiente al identificador.
Returns
La transación correspondiente al identificador recibido. Puede ser NULL.
113  {
114  Guard guard(a_mutex, "timex::Context::find");
115  transaction_iterator ii = a_transactions.find(tid);
116  Transaction* result = (ii != a_transactions.end()) ? transaction(ii) : NULL;
117 
118  if(result == NULL) {
119  if(emode == Exception::Mode::Throw) {
120  std::string msg("Transaction: ");
121  msg += identifierAsString(tid);
122  msg += " | Tid not found";
123  throw RuntimeException(msg, ANNA_FILE_LOCATION);
125  std::string msg("Transaction: ");
126  msg += identifierAsString(tid);
127  msg += " | Tid not found";
129  }
130  }
131 
132  return result;
133  }
Definition: Exception.hpp:26
Definition: Exception.hpp:26
static void warning(const std::string &text, const char *fromFile, const int fromLine)
Definition: Logger.hpp:338
Definition: Logger.hpp:41
virtual std::string identifierAsString(const Tid &tid) const =0
#define ANNA_FILE_LOCATION
Definition: defines.hpp:23
static bool isActive(const Level level)
Definition: Logger.hpp:169
Here is the call graph for this function:

◆ getIdentifier()

template<typename Tid >
const Tid& anna::timex::Context< Tid >::getIdentifier ( const Transaction transaction) const
inlinenoexcept

Obtiene el identificador de aplicación asociado a la transación recibida como parámetro.

Parameters
transactionPuntero a la transación a procesar. Debe haber sido creada con el método open.
Returns
El identificador de aplicación indicado en el método open.
141  {
142  if(transaction == NULL)
143  throw RuntimeException("timex::Context::getIdentifier | Can not work with NULL transaction", ANNA_FILE_LOCATION);
144 
145  const void* context = transaction->getContext();
146 
147  if(context == NULL) {
148  std::string msg("timex::Context::getIdentifier | ");
149  msg += transaction->asString();
150  msg += " | Can not work with NULL context";
151  throw RuntimeException(msg, ANNA_FILE_LOCATION);
152  }
153 
154  return contextAsIdentifier(context);
155  }
virtual std::string asString() const
Definition: Transaction.hpp:84
void * getContext()
Definition: Transaction.hpp:66
#define ANNA_FILE_LOCATION
Definition: defines.hpp:23
virtual const Tid & contextAsIdentifier(const void *tid) const =0
Here is the call graph for this function:

◆ getInstance()

template<typename Tid >
static const Context* anna::timex::Context< Tid >::getInstance ( const Transaction transaction)
inlinestaticnoexcept

Obtiene la instancia del gestor del contexto asociado a la transación recibida como parámetro. Puede ser NULL.

Parameters
transactionPuntero a la transación a procesar. Si no ha sido creada con el método open el resultado de esta operación no está determinado.
Returns
la instancia del gestor del contexto asociado a la transación recibida como parámetro. Puede ser NULL.
203  {
204  if(transaction == NULL)
205  throw RuntimeException("timex::Context::getInstance | Can not work with NULL transaction", ANNA_FILE_LOCATION);
206 
207  return reinterpret_cast <const Context*>(transaction->getObserver());
208  }
const TimeEventObserver * getObserver() const
Definition: TimeEvent.hpp:61
#define ANNA_FILE_LOCATION
Definition: defines.hpp:23
Context(const char *observerName, timex::Engine &timeController, const Millisecond &timeout)
Definition: Context.hpp:220
Here is the call graph for this function:

◆ identifierAsString()

template<typename Tid >
virtual std::string anna::timex::Context< Tid >::identifierAsString ( const Tid &  tid) const
protectedpure virtual

Método virtual puro que debe devolver una std::string correspondiente al valor del identificador recibido como parámetro.

Parameters
tidIdentificador único que la transación.
Returns
una std::string correspondiente al valor del identificador recibido como parámetro.

◆ open()

template<typename Tid >
Transaction* anna::timex::Context< Tid >::open ( const Tid &  tid,
const int  classType = 0 
)
inlinenoexcept

Crea una transacción con el identificador recibido como parámetro. En caso de que el identificador ya esté registrado en el contexto obtendremos una excepción.

Parameters
tidIdentificador de aplicación de la transación.
classTypeTipo de transación que deseamos crear. Este parámetro sólo será útil en caso de que nuestra aplicación tenga que gestionar varios tipos de transaciones u operaciones.

Este método terminará llamando al método createTransaction.

Returns
La nueva transación que ya habrá sido activada.
63  {
64  Transaction* result = NULL;
65  {
66  Guard guard(a_mutex, "timex::Context::open");
67  transaction_iterator ii = a_transactions.find(tid);
68 
69  if(ii != a_transactions.end()) {
70  std::string msg(transaction(ii)->asString());
71  msg += " | Already in progress";
72  throw RuntimeException(msg, ANNA_FILE_LOCATION);
73  }
74 
75  if((result = createTransaction(classType)) == NULL) {
76  std::string msg("timex::Context::createTransaction returned NULL | ClassType: ");
77  msg += functions::asString(classType);
78  throw RuntimeException(msg, ANNA_FILE_LOCATION);
79  }
80 
81  result->setTimeout(a_timeout);
82  result->setObserver(this);
83  result->setControlPoint();
84  result->setId(anna_ptrnumber_cast(result));
85  // Copia en el contexto de la transacción la clave usada.
86  // Se usará para poder buscar por clave a la hora de liberar la transacción.
87  std::pair <transaction_iterator, bool> rr = a_transactions.insert(value_type(tid, result));
88  result->setContext((void*) &rr.first->first);
89  }
90 
91  try {
92  a_timeController.activate(result);
93  } catch(RuntimeException&) {
94  releaseTransaction(result);
95  throw;
96  }
97 
99  std::string msg("timex::Context::open | ");
100  msg += result->asString();
102  );
103  return result;
104  }
virtual Transaction * createTransaction(const int classType)=0
#define anna_ptrnumber_cast(pointer)
Definition: defines.hpp:118
static void information(const std::string &text, const char *fromFile, const int fromLine)
Definition: Logger.hpp:316
#define LOGINFORMATION(a)
Definition: defines.hpp:62
static std::string asString(const int number)
virtual void releaseTransaction(Transaction *transaction)=0
void activate(TimeEvent *timeEvent) noexcept(false)
#define ANNA_FILE_LOCATION
Definition: defines.hpp:23
std::string asString() const
Definition: TimeEventObserver.hpp:45
Here is the call graph for this function:

◆ releaseTransaction()

template<typename Tid >
virtual void anna::timex::Context< Tid >::releaseTransaction ( Transaction transaction)
protectedpure virtual

Método virtual puro que liberá el espacio asociado a la transación recibida como parámetro. Lo más adecuado sería implementar este método mediate el uso del patrón anna::Recycler.

Parameters
transactionTransación a liberar.

The documentation for this class was generated from the following file: