1 // ANNA - Anna is Not Nothingness Anymore //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
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 //
9 #ifndef anna_comm_Host_hpp
10 #define anna_comm_Host_hpp
17 #include <anna/core/mt/Mutex.hpp>
18 #include <anna/core/util/MultiMap.hpp>
30 class TransportFactory;
33 class ServerAllocator;
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.
40 Para crear una nueva maquina hay que invocar a Network::find(const char*) o Network::find(const std::string&).
46 class Host : public Mutex {
50 // Requerido por Forte C++
52 // friend struct Comparator;
56 static int value(const Server* server) throw();
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 */
66 typedef MultiMap <Server, SortBy> server_container;
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. */
78 Devuelve el nombre logico de esta maquina.
80 @return El nombre logico de esta maquina.
82 const std::string& getName() const throw() { return a_name; }
85 Crea y registra un nuevo proceso servidor sobre esta maquina (maquina, remotePort) con el nombre indicado.
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
93 \param ignoreIncomingMessages Indicador de ignorar mensajes entrantes.
94 \param doConnect Indicador de connectar al servidor en el momento de crearlo.
96 @return La instancia del nuevo proceso servidor
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);
104 Crea y registra un nuevo proceso servidor sobre esta maquina (maquina, remotePort) con el nombre indicado.
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
112 \param ignoreIncomingMessages Indicador de ignorar mensajes entrantes.
113 \param doConnect Indicador de connectar al servidor en el momento de crearlo.
115 @return La instancia del nuevo proceso servidor
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);
121 Crea y registra un nuevo proceso servidor sobre esta maquina (maquina, remotePort) con el nombre indicado.
123 \param serverAllocator Instanciador de Server utilizado para crear la instancia del Server.
125 @return La instancia del nuevo proceso servidor
127 Server* createServer(const ServerAllocator& serverAllocator) throw(RuntimeException);
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.
133 server_iterator server_begin() throw() { return a_servers.begin(); }
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.
139 const_server_iterator server_begin() const throw() { return a_servers.begin(); }
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.
145 server_iterator server_end() throw() { return a_servers.end(); }
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.
151 const_server_iterator server_end() const throw() { return a_servers.end(); }
154 Devuelve la instancia del servidor sobre el que esta posicionado el iterador recibido
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
159 static Server* server(server_iterator ii) throw() { return server_container::data(ii); }
162 Devuelve la instancia del servidor sobre el que esta posicionado el iterador recibido
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
167 static const Server* server(const_server_iterator ii) throw() { return server_container::data(ii); }
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.
174 const_device_iterator device_begin() const throw() { return a_devices.begin(); }
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.
180 const_device_iterator device_end() const throw() { return a_devices.end(); }
183 Devuelve la instancia de la IP sobre el que esta posicionado el iterador recibido
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
188 static const Device* device(const_device_iterator ii) throw() { return *ii; }
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.
194 * @param remotePort Puerto remoto en el que atiende peticiones este proceso servidor.
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.
201 const Server* find_server(const int remotePort) const throw();
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.
207 * @param remotePort Puerto remoto en el que atiende peticiones este proceso servidor.
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.
214 Server* find_server(const int remotePort) throw();
216 Incorpora un dispositivo de red.
217 \param device Dispositivo de red a incorporar.
219 void assign(const Device* device) throw(RuntimeException);
222 Devuelve \em true si el dispositivo de red recibido fue asignado a esta maquina o \em
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
229 bool contains(const Device* device) const
231 const_device_iterator end = device_end();
232 return (std::find(device_begin(), end, device) != end);
236 Devuelve una cadena con la informacin referente a esta maquina.
237 @return Una cadena con la informacin referente a esta maquina.
239 std::string asString() const throw();
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.
246 xml::Node* asXML(xml::Node* parent) const throw(RuntimeException);
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.
256 Host(const char* name) : a_name(name) {}
259 device_container a_devices;
260 server_container a_servers;
262 Server* add(Server*, const int remotePort, const bool doConnect) throw();
264 friend class Network;