First commit
[anna.git] / include / anna / comm / Service.hpp
1 // ANNA - Anna is Not 'N' Anymore
2 //
3 // (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
4 //
5 // https://bitbucket.org/testillano/anna
6 //
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions
9 // are met:
10 //
11 //     * Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 //     * Redistributions in binary form must reproduce the above
14 // copyright notice, this list of conditions and the following disclaimer
15 // in the documentation and/or other materials provided with the
16 // distribution.
17 //     * Neither the name of Google Inc. nor the names of its
18 // contributors may be used to endorse or promote products derived from
19 // this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 //
33 // Authors: eduardo.ramos.testillano@gmail.com
34 //          cisco.tierra@gmail.com
35
36
37 #ifndef anna_comm_Service_hpp
38 #define anna_comm_Service_hpp
39
40 #include <anna/comm/Delivery.hpp>
41
42 namespace anna {
43
44 namespace comm {
45
46 class Server;
47 class Message;
48
49 /**
50    Clase que modela un servicio de reparto de carga. Cada servicio de reparto de carga esta asociado
51    a un nmero indeterminado de procesos servidores (ver Server) entre los que puede seleccionar a
52    la hora de enviar una peticin.
53
54    Para crear un nuevo servicio hay que invocar a Communicator::createService.
55 */
56 class Service : public Delivery {
57 public:
58   /**
59      Constructor.
60      \param name Nombre lógico del servicio de reparto de carga.
61      \param isCritical Indica las caracteristicas del reparto de carga. Debe valor \em true si el
62      reparto de carga a crear es crítico o \em false en otro caso.
63   */
64   Service(const char* name, const bool isCritical) :
65     Delivery(name),
66     a_isCritical(isCritical) {}
67
68   /**
69      Devuelve la caracteristica de criticidad de este reparto.
70
71      @return La caracteristica de criticidad de este reparto.
72   */
73   bool isCritical() const throw() { return a_isCritical; }
74
75   /**
76      Conecta el servidor recibido como parámetro con este reparto.
77      \param server Instancia del servidor que vamos a registrar en este reparto.
78   */
79   void attach(Server* server) throw(RuntimeException);
80
81   /**
82      Envía el mensaje recibido como parámetro. El bloque de datos recibido se codifica segun las
83      reglas establecidas por el protocolo asociado en el contructor.
84
85      \param message Mensaje que vamos codificar para enviar a la capa de transporte.
86      @return Servidor usado en el envio
87   */
88   comm::Server* send(Message& message) throw(RuntimeException);
89
90   /**
91      Envía el mensaje recibido como parámetro. El bloque de datos recibido se codifica segun las
92      reglas establecidas por el protocolo asociado en el contructor.
93
94      \param message Mensaje que vamos codificar para enviar a la capa de transporte.
95      @return Servidor usado en el envio
96   */
97   comm::Server* send(Message* message) throw(RuntimeException);
98
99   /**
100      Envía el mensaje recibido como parámetro a todos los servidores incluidos en el servicio de reparto de carga
101      recibido como parámetro. El bloque de datos recibido se codifica segun las reglas establecidas
102      por el protocolo asociado.
103
104      \param message Mensaje que vamos a enviar al todos los procesos que componente el servicio.
105
106      @return Numero de servidores a los que ha enviado el mensaje.
107   */
108   int broadcast(Message& message) throw();
109
110   /**
111      Envía el mensaje recibido como parámetro a todos los servidores incluidos en el servicio de reparto de carga
112      recibido como parámetro. El bloque de datos recibido se codifica segun las reglas establecidas
113      por el protocolo asociado.
114
115      \param message Mensaje que vamos a enviar al todos los procesos que componente el servicio.
116
117      @return Numero de servidores a los que ha enviado el mensaje.
118   */
119   int broadcast(Message* message) throw();
120
121   /**
122      Devuelve una cadena con la información referente a esta maquina.
123      @return Una cadena con la información referente a esta maquina.
124   */
125   std::string asString() const throw();
126
127   /**
128      Devuelve un nodo XML con la información referente a este objeto.
129      \param parent Nodo XML a partir del cual introducir la información.
130      \return Un nodo XML con la información referente a este objeto.
131   */
132   xml::Node* asXML(xml::Node* parent) const throw();
133
134   /**
135      Devuelve el recurso remoto apuntado por el iterador recibido como parámetro.
136      \param ii Iterador usado para recorrer los recursos asociados a este reparto.
137      \return El recurso remoto apuntado por el iterador recibido como parámetro.
138   */
139   static Server* server(iterator& ii) throw();
140
141   /**
142      Devuelve el recurso remoto apuntado por el iterador recibido como parámetro.
143      \param ii Iterador usado para recorrer los recursos asociados a este reparto.
144      \return El recurso remoto apuntado por el iterador recibido como parámetro.
145   */
146   static const Server* server(const_iterator& ii) throw();
147
148 private:
149   const bool a_isCritical;
150 };
151
152 }
153 }
154
155 #endif