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_app_Component_hpp
10 #define anna_app_Component_hpp
14 #include <anna/core/RuntimeException.hpp>
15 #include <anna/core/mt/Mutex.hpp>
17 #include <anna/app/Application.hpp>
28 Clase de la que heredan los componentes de aplicacion.
30 Solo deberia haber una instancia de cada uno de los componentes, pero no podemos
31 declararlos como heredados de anna::Singleton porque debemos dar la posiblidad de
32 que el programador re-escriba su comportamiento mediante herencia.
34 Todos los componentes se arrancan y paran automaticamente desde la aplicacion.
36 El siguiente ejemplo muestra como obtener la instancia de un componente asociado a nuestra aplicacion:
39 Clase* objeto = anna::app::functions::component <Clase> (FILE_LOCATION);
41 ..... uso del objeto ....
44 Si el componente \em 'Clase' no hubiera sido registrado (instanciado) en nuestra aplicacion el metodo
45 template anna::component lanzara una excepcion.
47 class Component : public Mutex {
55 Class name given in constructor.
56 \return El nombre de la clase indicado en el constructor.
58 const char* getClassName() const throw() { return a_className.c_str(); }
61 Conecta explicitamente este componente con la aplicacion. Sera necesario invocar a este metodo
62 cuando instanciemos un componentes despues de comenzar la ejecucion de nuestra aplicacion y
63 cuando el nuevo componente este completamente listo para su inicializacion.
65 void attach() throw(RuntimeException);
68 Devuelve una cadena con la informacion mas relevante de esta instancia.
69 \return Una cadena con la informacion mas relevante de esta instancia.
71 virtual std::string asString() const throw();
74 Devuelve un documento XML con la informacion mas relevante de esta instancia.
75 \param parent Nodo XML del que colgar la informacion referente a esta instancia.
76 \return Un documento XML con la informacion mas relevante de esta instancia.
78 virtual xml::Node* asXML(xml::Node* parent) const throw();
82 Estados en los que puede estar un componente.
85 struct State { enum _v { Stopped, Starting, Running }; };
89 @param className Nombre lgico asociado a esta clase.
91 explicit Component(const char* className);
94 Devuelve el estado de este componente.
95 \return el estado de este componente.
97 State::_v getState() const throw() { return a_state; }
100 Indica que el nombre de un componente que debe ser initializa antes que este.
101 \param componentName Nombre de componente requerido por esta instancia.
102 \warning Solo tendra efecto antes de inicializar el componente.
104 void addPredecessor(const char* componentName) throw();
107 metodo que debemos implementar si la clase heredada necesita algn tipo de inicializacin.
108 Este metodo se invocara automaticamente desde anna::Application::start.
110 void initialize() throw(RuntimeException);
113 metodo que debemos implementar en la clase heredada para implementar el proceso de parada de
116 Este metodo debe implementar un metodo de parada controlada. Se invocara automaticamente
119 void stop() throw() { a_state = State::Stopped; do_stop(); }
122 metodo que debemos implementar en la clase heredada para implementar el proceso de parada de
123 esta clase. Se invocara automaticamente desde el nucleo
125 Este metodo implementa un metodo de parada no controlada.
127 virtual void kill() throw() { stop(); }
130 typedef std::vector <std::string>::iterator iterator;
132 const std::string a_className;
134 std::vector <std::string> a_predecessors;
136 Component(const Component& other);
137 iterator begin() throw() { return a_predecessors.begin(); }
138 iterator end() throw() { return a_predecessors.end(); }
139 const std::string& data(iterator& ii) throw() { return *ii; }
142 metodo que debemos implementar si la clase heredada necesita algn tipo de inicializacin.
143 Este metodo se invocara automaticamente desde anna::Application::start.
145 virtual void do_initialize() throw(RuntimeException) = 0;
148 Metodo que debemos implementar en la clase heredada para tratar el proceso de parada de
150 Este metodo debe implementar un metodo de parada controlada. Se invocara automaticamente
153 virtual void do_stop() throw() = 0;
156 * Metodo que debemos implementar en la clase heredada para tratar el proceso de clonado de
157 * esta clase desde el punto de vista del proceso original.
158 * \warning Si se detecta algun error terminara abortara la ejecucion del proceso hijo.
160 virtual void do_cloneParent() throw(RuntimeException) { ; }
163 * Metodo que debemos implementar en la clase heredada para tratar el proceso de clonado de
164 * esta clase desde el punto de vista del proceso hijo.
165 * \warning Si se detecta algun error terminara abortara la ejecucion de este proceso.
167 virtual void do_cloneChild() throw(RuntimeException) { ; }
169 friend void Application::startComponents() throw(RuntimeException);
170 friend void Application::stopComponents() throw(RuntimeException);
171 friend void Application::attach(Component*) throw(RuntimeException);
172 friend Application& Application::clone() throw(RuntimeException);