1 // ANNA - Anna is Not 'N' Anymore
3 // (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
5 // https://bitbucket.org/testillano/anna
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions
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
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.
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.
33 // Authors: eduardo.ramos.testillano@gmail.com
34 // cisco.tierra@gmail.com
37 #ifndef anna_comm_Host_hpp
38 #define anna_comm_Host_hpp
45 #include <anna/core/mt/Mutex.hpp>
46 #include <anna/core/util/MultiMap.hpp>
58 class TransportFactory;
61 class ServerAllocator;
64 Clase que modela una maquina en la que se ejecutan procesos servidores. Cada maquina contiene
65 un nmero indeterminado de procesos servidores (ver Server) a los que enviar peticiones, bien
66 directamente, o bien a traves del un sistema de reparto de carga.
68 Para crear una nueva maquina hay que invocar a Network::find(const char*) o Network::find(const std::string&).
74 class Host : public Mutex {
78 // Requerido por Forte C++
80 // friend struct Comparator;
84 static int value(const Server* server) throw();
91 typedef std::vector <const Device*> device_container;
92 typedef device_container::const_iterator const_device_iterator; /**<Iterador para acceder a los dispositivo de red de la maquina */
94 typedef MultiMap <Server, SortBy> server_container;
96 typedef server_container::iterator server_iterator; /**<Iterador para acceder a los Servidores asociados a cada uno de los puertos en esta maquina. */
97 typedef server_container::const_iterator const_server_iterator; /**<Iterador para acceder a los Servidores asociados a cada uno de los puertos en esta maquina. */
106 Devuelve el nombre logico de esta maquina.
108 @return El nombre logico de esta maquina.
110 const std::string& getName() const throw() { return a_name; }
113 Crea y registra un nuevo proceso servidor sobre esta maquina (maquina, remotePort) con el nombre indicado.
115 @param name Nombre logico del proceso servidor.
116 @param remotePort Puerto remoto en el que atiende peticiones este proceso servidor.
117 \param autoRecovery Indica si en caso de caida se debe intenrar la recuperacion
118 automatica de la conexion.
119 \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
121 \param ignoreIncomingMessages Indicador de ignorar mensajes entrantes.
122 \param doConnect Indicador de connectar al servidor en el momento de crearlo.
124 @return La instancia del nuevo proceso servidor
126 Server* createServer(const char* name, const int remotePort, const bool autoRecovery, TransportFactory* transportFactory = NULL, const bool ignoreIncomingMessages = false, const bool doConnect = true)
127 throw(RuntimeException) {
128 return createServer(std::string(name), remotePort, autoRecovery, transportFactory, ignoreIncomingMessages, doConnect);
132 Crea y registra un nuevo proceso servidor sobre esta maquina (maquina, remotePort) con el nombre indicado.
134 @param name Nombre logico del proceso servidor.
135 @param remotePort Puerto remoto en el que atiende peticiones este proceso servidor.
136 \param autoRecovery Indica si en caso de caida se debe intentar la recuperacion
137 automatica de la conexion.
138 \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
140 \param ignoreIncomingMessages Indicador de ignorar mensajes entrantes.
141 \param doConnect Indicador de connectar al servidor en el momento de crearlo.
143 @return La instancia del nuevo proceso servidor
145 Server* createServer(const std::string& name, const int remotePort, const bool autoRecovery, TransportFactory* transportFactory = NULL, const bool ignoreIncomingMessages = false, const bool doConnect = true)
146 throw(RuntimeException);
149 Crea y registra un nuevo proceso servidor sobre esta maquina (maquina, remotePort) con el nombre indicado.
151 \param serverAllocator Instanciador de Server utilizado para crear la instancia del Server.
153 @return La instancia del nuevo proceso servidor
155 Server* createServer(const ServerAllocator& serverAllocator) throw(RuntimeException);
158 Devuelve un iterador al comienzo de la lista de servidores asociados a esta maquina.
159 \return Un iterador al comienzo de la lista de servidores asociados a esta maquina.
161 server_iterator server_begin() throw() { return a_servers.begin(); }
164 Devuelve un iterador al comienzo de la lista de servidores asociados a esta maquina.
165 \return Un iterador al comienzo de la lista de servidores asociados a esta maquina.
167 const_server_iterator server_begin() const throw() { return a_servers.begin(); }
170 Devuelve un iterador al comienzo de la lista de servidores asociados a esta maquina.
171 \return Un iterador al final de la lista de servidores asociados a esta maquina.
173 server_iterator server_end() throw() { return a_servers.end(); }
176 Devuelve un iterador al comienzo de la lista de servidores asociados a esta maquina.
177 \return Un iterador al final de la lista de servidores asociados a esta maquina.
179 const_server_iterator server_end() const throw() { return a_servers.end(); }
182 Devuelve la instancia del servidor sobre el que esta posicionado el iterador recibido
184 \param ii Iterador que debera estar comprendido entre begin y end.
185 \return La instancia del servidor sobre el que esta posicionado el iterador recibido
187 static Server* server(server_iterator ii) throw() { return server_container::data(ii); }
190 Devuelve la instancia del servidor sobre el que esta posicionado el iterador recibido
192 \param ii Iterador que debera estar comprendido entre begin y end.
193 \return La instancia del servidor sobre el que esta posicionado el iterador recibido
195 static const Server* server(const_server_iterator ii) throw() { return server_container::data(ii); }
199 Devuelve un iterador al comienzo de la lista de direcciones IPs asociadas a esta maquina.
200 \return Un iterador al comienzo de la lista de direcciones IPs asociadas a esta maquina.
202 const_device_iterator device_begin() const throw() { return a_devices.begin(); }
205 Devuelve un iterador al final de la lista de direcciones IPs asociadas a esta maquina.
206 \return Un iterador al final de la lista de direcciones IPs asociadas a esta maquina.
208 const_device_iterator device_end() const throw() { return a_devices.end(); }
211 Devuelve la instancia de la IP sobre el que esta posicionado el iterador recibido
213 \param ii Iterador que debera estar comprendido entre begin y end.
214 \return La instancia de la sobre el que esta posicionado el iterador recibido
216 static const Device* device(const_device_iterator ii) throw() { return *ii; }
219 * Devuelve la instancia del proceso servidor asociado al puerto recibido como parametro. Si
220 * hay más de una conexión sobre el mismo puerto sólo devolverá la primera.
222 * @param remotePort Puerto remoto en el que atiende peticiones este proceso servidor.
224 * @return La instancia del proceso servidor asociado al puerto recibido. Puede ser NULL si no
225 * hay ningn proceso servidor asociado con el puerto recibido.
229 const Server* find_server(const int remotePort) const throw();
232 * Devuelve la instancia del proceso servidor asociado al puerto recibido como parametro. Si
233 * hay más de una conexión sobre el mismo puerto sólo devolverá la primera.
235 * @param remotePort Puerto remoto en el que atiende peticiones este proceso servidor.
237 * @return La instancia del proceso servidor asociado al puerto recibido. Puede ser NULL si no
238 * hay ningn proceso servidor asociado con el puerto recibido.
242 Server* find_server(const int remotePort) throw();
244 Incorpora un dispositivo de red.
245 \param device Dispositivo de red a incorporar.
247 void assign(const Device* device) throw(RuntimeException);
250 Devuelve \em true si el dispositivo de red recibido fue asignado a esta maquina o \em
252 \param device Dispositivo de red a comprobar.
253 \return \em true si el dispositivo de red recibido fue asignado a esta maquina o \em
257 bool contains(const Device* device) const
259 const_device_iterator end = device_end();
260 return (std::find(device_begin(), end, device) != end);
264 Devuelve una cadena con la informacin referente a esta maquina.
265 @return Una cadena con la informacin referente a esta maquina.
267 std::string asString() const throw();
270 Devuelve un nodo XML con la informacin referente a este objeto.
271 \param parent Nodo XML a partir del cual introducir la informacin.
272 \return Un nodo XML con la informacin referente a este objeto.
274 xml::Node* asXML(xml::Node* parent) const throw(RuntimeException);
280 \param name Nombre logico de esta maquina.
281 \warning Cualquier clase heredada que invoque a este constructor debe evitar el acceso
282 al metodo #createServer.
284 Host(const char* name) : a_name(name) {}
287 device_container a_devices;
288 server_container a_servers;
290 Server* add(Server*, const int remotePort, const bool doConnect) throw();
292 friend class Network;