bug in RC
[anna.git] / include / anna / comm / Host.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_Host_hpp
10 #define anna_comm_Host_hpp
11
12 #include <algorithm>
13 #include <vector>
14 #include <map>
15 #include <string>
16
17 #include <anna/core/mt/Mutex.hpp>
18 #include <anna/core/util/MultiMap.hpp>
19
20 namespace anna {
21
22 namespace xml {
23 class Node;
24 }
25
26 namespace comm {
27
28 class Communicator;
29 class Server;
30 class TransportFactory;
31 class Device;
32 class Network;
33 class ServerAllocator;
34
35 /**
36    Clase que modela una maquina en la que se ejecutan procesos servidores. Cada maquina contiene
37    un nmero indeterminado de procesos servidores (ver Server) a los que enviar peticiones, bien
38    directamente, o bien a traves del un sistema de reparto de carga.
39
40    Para crear una nueva maquina hay que invocar a Network::find(const char*) o Network::find(const std::string&).
41
42    \see Server
43    \see Service
44    \see Network::find
45 */
46 class Host : public Mutex {
47
48   typedef int Port;
49
50   // Requerido por Forte C++
51 //   struct Comparator;
52 //   friend struct Comparator;
53
54
55   struct SortBy {
56     static int value(const Server* server) throw();
57   };
58
59   std::string a_name;
60
61 public:
62
63   typedef std::vector <const Device*> device_container;
64   typedef device_container::const_iterator const_device_iterator; /**<Iterador para acceder a los dispositivo de red de la maquina */
65
66   typedef MultiMap <Server, SortBy> server_container;
67
68   typedef server_container::iterator server_iterator; /**<Iterador para acceder a los Servidores asociados a cada uno de los puertos en esta maquina. */
69   typedef server_container::const_iterator const_server_iterator; /**<Iterador para acceder a los Servidores asociados a cada uno de los puertos en esta maquina. */
70
71
72   /**
73      Destructor.
74   */
75   virtual ~Host();
76
77   /**
78      Devuelve el nombre logico de esta maquina.
79
80      @return El nombre logico de esta maquina.
81   */
82   const std::string& getName() const throw() { return a_name; }
83
84   /**
85      Crea y registra un nuevo proceso servidor sobre esta maquina (maquina, remotePort) con el nombre indicado.
86
87      @param name Nombre logico del proceso servidor.
88      @param remotePort Puerto remoto en el que atiende peticiones este proceso servidor.
89      \param autoRecovery Indica si en caso de caida se debe intenrar la recuperacion
90      automatica de la conexion.
91      \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
92      proceso servidor.
93      \param ignoreIncomingMessages Indicador de ignorar mensajes entrantes.
94      \param doConnect Indicador de connectar al servidor en el momento de crearlo.
95
96      @return La instancia del nuevo proceso servidor
97   */
98   Server* createServer(const char* name, const int remotePort, const bool autoRecovery, TransportFactory* transportFactory = NULL, const bool ignoreIncomingMessages = false, const bool doConnect = true)
99   throw(RuntimeException) {
100     return createServer(std::string(name), remotePort, autoRecovery, transportFactory, ignoreIncomingMessages, doConnect);
101   }
102
103   /**
104      Crea y registra un nuevo proceso servidor sobre esta maquina (maquina, remotePort) con el nombre indicado.
105
106      @param name Nombre logico del proceso servidor.
107      @param remotePort Puerto remoto en el que atiende peticiones este proceso servidor.
108      \param autoRecovery Indica si en caso de caida se debe intentar la recuperacion
109      automatica de la conexion.
110      \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
111      proceso servidor.
112      \param ignoreIncomingMessages Indicador de ignorar mensajes entrantes.
113      \param doConnect Indicador de connectar al servidor en el momento de crearlo.
114
115      @return La instancia del nuevo proceso servidor
116   */
117   Server* createServer(const std::string& name, const int remotePort, const bool autoRecovery, TransportFactory* transportFactory = NULL, const bool ignoreIncomingMessages = false, const bool doConnect = true)
118   throw(RuntimeException);
119
120   /**
121      Crea y registra un nuevo proceso servidor sobre esta maquina (maquina, remotePort) con el nombre indicado.
122
123      \param serverAllocator Instanciador de Server utilizado para crear la instancia del Server.
124
125      @return La instancia del nuevo proceso servidor
126   */
127   Server* createServer(const ServerAllocator& serverAllocator) throw(RuntimeException);
128
129   /**
130      Devuelve un iterador al comienzo de la lista de servidores asociados a esta maquina.
131      \return Un iterador al comienzo de la lista de servidores asociados a esta maquina.
132   */
133   server_iterator server_begin() throw() { return a_servers.begin(); }
134
135   /**
136      Devuelve un iterador al comienzo de la lista de servidores asociados a esta maquina.
137      \return Un iterador al comienzo de la lista de servidores asociados a esta maquina.
138   */
139   const_server_iterator server_begin() const throw() { return a_servers.begin(); }
140
141   /**
142      Devuelve un iterador al comienzo de la lista de servidores asociados a esta maquina.
143      \return Un iterador al final de la lista de servidores asociados a esta maquina.
144   */
145   server_iterator server_end() throw() { return a_servers.end(); }
146
147   /**
148      Devuelve un iterador al comienzo de la lista de servidores asociados a esta maquina.
149      \return Un iterador al final de la lista de servidores asociados a esta maquina.
150   */
151   const_server_iterator server_end() const throw() { return a_servers.end(); }
152
153   /**
154      Devuelve la instancia del servidor sobre el que esta posicionado el iterador recibido
155      como parametro.
156      \param ii Iterador que debera estar comprendido entre begin y end.
157      \return La instancia del servidor sobre el que esta posicionado el iterador recibido
158   */
159   static Server* server(server_iterator ii) throw() { return server_container::data(ii); }
160
161   /**
162      Devuelve la instancia del servidor sobre el que esta posicionado el iterador recibido
163      como parametro.
164      \param ii Iterador que debera estar comprendido entre begin y end.
165      \return La instancia del servidor sobre el que esta posicionado el iterador recibido
166   */
167   static const Server* server(const_server_iterator ii) throw() { return server_container::data(ii); }
168
169
170   /**
171      Devuelve un iterador al comienzo de la lista de direcciones IPs asociadas a esta maquina.
172      \return Un iterador al comienzo de la lista de direcciones IPs asociadas a esta maquina.
173   */
174   const_device_iterator device_begin() const throw() { return a_devices.begin(); }
175
176   /**
177      Devuelve un iterador al final de la lista de direcciones IPs asociadas a esta maquina.
178      \return Un iterador al final de la lista de direcciones IPs asociadas a esta maquina.
179   */
180   const_device_iterator device_end() const throw() { return a_devices.end(); }
181
182   /**
183      Devuelve la instancia de la IP sobre el que esta posicionado el iterador recibido
184      como parametro.
185      \param ii Iterador que debera estar comprendido entre begin y end.
186      \return La instancia de la sobre el que esta posicionado el iterador recibido
187   */
188   static const Device* device(const_device_iterator ii) throw() { return *ii; }
189
190   /**
191    * Devuelve la instancia del proceso servidor asociado al puerto recibido como parametro. Si
192    * hay más de una conexión sobre el mismo puerto sólo devolverá la primera.
193    *
194    * @param remotePort Puerto remoto en el que atiende peticiones este proceso servidor.
195    *
196    * @return La instancia del proceso servidor asociado al puerto recibido. Puede ser NULL si no
197    * hay ningn proceso servidor asociado con el puerto recibido.
198    *
199    * @see #createServer
200    */
201   const Server* find_server(const int remotePort) const throw();
202
203   /**
204    * Devuelve la instancia del proceso servidor asociado al puerto recibido como parametro. Si
205    * hay más de una conexión sobre el mismo puerto sólo devolverá la primera.
206    *
207    * @param remotePort Puerto remoto en el que atiende peticiones este proceso servidor.
208    *
209    * @return La instancia del proceso servidor asociado al puerto recibido. Puede ser NULL si no
210    * hay ningn proceso servidor asociado con el puerto recibido.
211    *
212    * @see #createServer
213    */
214   Server* find_server(const int remotePort) throw();
215   /**
216      Incorpora un dispositivo de red.
217      \param device Dispositivo de red a incorporar.
218   */
219   void assign(const Device* device) throw(RuntimeException);
220
221   /**
222      Devuelve \em true si el dispositivo de red recibido fue asignado a esta maquina o \em
223      false en otro caso.
224      \param device Dispositivo de red a comprobar.
225      \return \em true si el dispositivo de red recibido fue asignado a esta maquina o \em
226      false en otro caso.
227      \see #assign
228   */
229   bool contains(const Device* device) const
230   throw() {
231     const_device_iterator end = device_end();
232     return (std::find(device_begin(), end, device) != end);
233   }
234
235   /**
236      Devuelve una cadena con la informacin referente a esta maquina.
237      @return Una cadena con la informacin referente a esta maquina.
238   */
239   std::string asString() const throw();
240
241   /**
242      Devuelve un nodo XML con la informacin referente a este objeto.
243      \param parent Nodo XML a partir del cual introducir la informacin.
244      \return Un nodo XML con la informacin referente a este objeto.
245   */
246   xml::Node* asXML(xml::Node* parent) const throw(RuntimeException);
247
248
249 protected:
250   /**
251      Constructor.
252      \param name Nombre logico de esta maquina.
253      \warning Cualquier clase heredada que invoque a este constructor debe evitar el acceso
254      al metodo #createServer.
255   */
256   Host(const char* name) : a_name(name) {}
257
258 private:
259   device_container a_devices;
260   server_container a_servers;
261
262   Server* add(Server*, const int remotePort, const bool doConnect) throw();
263
264   friend class Network;
265 };
266
267 }
268 }
269
270 #endif