bug in RC
[anna.git] / include / anna / comm / IndexedDelivery.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #ifndef anna_comm_IndexedDelivery_hpp
10 #define anna_comm_IndexedDelivery_hpp
11
12 #include <anna/comm/Service.hpp>
13
14 namespace anna {
15
16 namespace comm {
17 class Resource;
18 }
19
20 namespace comm {
21
22 /**
23    Servicio de reparto de peticiones. Selecciona el destino de la proxima peticion en base una clave numerica de forma
24    que el recurso usado sera el que ocupe la posicicion i-esima. Donde i = key % N, donde key es la clave recibida
25    y N es el numero total de recursos definidos en este reparto.
26 */
27 class IndexedDelivery : public comm::Service {
28 public:
29   /**
30      Define las formas de actuar de comm::IndexedDelivery en caso de error.
31   */
32   struct Mode {
33     enum _v {
34       Strict, /**< Si el servicio seleccionado no esta disponible aborta el envio del mensaje */
35       Flexible /**< Si el servicio seleccionado no esta disponible pasa al siguiente disponible */
36     };
37   };
38
39   /**
40      Constructor.
41      \param name Nombre logico del servicio de reparto de carga.
42      \param isCritical Indica las caracteristicas del reparto de carga. Debe valor \em true si el
43      reparto de carga a crear es critico o \em false en otro caso.
44      \param mode Modo de actuar en caso de que el recurso seleccionado no este disponible.
45   */
46   IndexedDelivery(const char* name, const bool isCritical, const Mode::_v mode) :
47     comm::Service(name, isCritical),
48     a_mode(mode),
49     a_iikey(0)
50   {;}
51
52   /**
53      Establece la clave que se usara para decidir el comm::Server al que se va a enviar el mensaje.
54      \param key Clave usada para calcular el servidor destino.
55      \warning Este metodo debe invocarse siempre antes de enviar un mensaje.
56   */
57   void prepare(const int key) throw(RuntimeException);
58
59   std::string asString() const throw();
60
61   xml::Node* asXML(xml::Node* parent) const throw();
62
63   /**
64      Metodo que devuelve el nombre completo de este selector de recursos.
65      Para evitar ambiguedades este nombre incluye la lista completa de \em namespaces
66      a los que pertenece la clase.
67      \return Una cadena con el nombre de este selector.
68   */
69   static const char* className() throw() { return "anna::comm::IndexedDelivery"; }
70
71 private:
72   //------------------------------------------------------------------------------------
73   // - a_iiserver: iterador que apunta al servidor que debemos usar.
74   //------------------------------------------------------------------------------------
75   const Mode::_v a_mode;
76   iterator a_iikey;
77
78   virtual void do_initialize() throw(RuntimeException) {;}
79   comm::Resource* do_apply() throw(RuntimeException);
80 };
81
82 }
83 }
84
85 #endif
86