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
13 #include <anna/core/util/Component.hpp>
14 #include <anna/app/Application.hpp>
25 Clase de la que heredan los componentes de aplicacion.
27 Solo deberia haber una instancia de cada uno de los componentes, pero no podemos
28 declararlos como heredados de anna::Singleton porque debemos dar la posiblidad de
29 que el programador re-escriba su comportamiento mediante herencia.
31 Todos los componentes se arrancan y paran automaticamente desde la aplicacion.
33 El siguiente ejemplo muestra como obtener la instancia de un componente asociado a nuestra aplicacion:
36 Clase* objeto = anna::app::functions::component <Clase> (FILE_LOCATION);
38 ..... uso del objeto ....
41 Si el componente \em 'Clase' no hubiera sido registrado (instanciado) en nuestra aplicacion el metodo
42 template anna::component lanzara una excepcion.
44 class Component : public anna::Component {
52 Conecta explicitamente este componente con la aplicacion. Sera necesario invocar a este metodo
53 cuando instanciemos un componentes despues de comenzar la ejecucion de nuestra aplicacion y
54 cuando el nuevo componente este completamente listo para su inicializacion.
56 void attach() noexcept(false);
59 Devuelve una cadena con la informacion mas relevante de esta instancia.
60 \return Una cadena con la informacion mas relevante de esta instancia.
62 virtual std::string asString() const ;
65 Devuelve un documento XML con la informacion mas relevante de esta instancia.
66 \param parent Nodo XML del que colgar la informacion referente a esta instancia.
67 \return Un documento XML con la informacion mas relevante de esta instancia.
69 virtual xml::Node* asXML(xml::Node* parent) const ;
73 Estados en los que puede estar un componente.
76 struct State { enum _v { Stopped, Starting, Running }; };
80 @param className Nombre lgico asociado a esta clase.
82 explicit Component(const char* className);
85 Devuelve el estado de este componente.
86 \return el estado de este componente.
88 State::_v getState() const { return a_state; }
91 Indica que el nombre de un componente que debe ser initializa antes que este.
92 \param componentName Nombre de componente requerido por esta instancia.
93 \warning Solo tendra efecto antes de inicializar el componente.
95 void addPredecessor(const char* componentName) ;
98 metodo que debemos implementar si la clase heredada necesita algn tipo de inicializacin.
99 Este metodo se invocara automaticamente desde anna::Application::start.
101 void initialize() noexcept(false);
104 metodo que debemos implementar en la clase heredada para implementar el proceso de parada de
107 Este metodo debe implementar un metodo de parada controlada. Se invocara automaticamente
110 void stop() { a_state = State::Stopped; do_stop(); }
113 metodo que debemos implementar en la clase heredada para implementar el proceso de parada de
114 esta clase. Se invocara automaticamente desde el nucleo
116 Este metodo implementa un metodo de parada no controlada.
118 virtual void kill() { stop(); }
121 typedef std::vector <std::string>::iterator iterator;
124 std::vector <std::string> a_predecessors;
126 Component(const Component& other);
127 iterator begin() { return a_predecessors.begin(); }
128 iterator end() { return a_predecessors.end(); }
129 const std::string& data(iterator& ii) { return *ii; }
132 metodo que debemos implementar si la clase heredada necesita algn tipo de inicializacin.
133 Este metodo se invocara automaticamente desde anna::Application::start.
135 virtual void do_initialize() noexcept(false) = 0;
138 Metodo que debemos implementar en la clase heredada para tratar el proceso de parada de
140 Este metodo debe implementar un metodo de parada controlada. Se invocara automaticamente
143 virtual void do_stop() = 0;
146 * Metodo que debemos implementar en la clase heredada para tratar el proceso de clonado de
147 * esta clase desde el punto de vista del proceso original.
148 * \warning Si se detecta algun error terminara abortara la ejecucion del proceso hijo.
150 virtual void do_cloneParent() noexcept(false) { ; }
153 * Metodo que debemos implementar en la clase heredada para tratar el proceso de clonado de
154 * esta clase desde el punto de vista del proceso hijo.
155 * \warning Si se detecta algun error terminara abortara la ejecucion de este proceso.
157 virtual void do_cloneChild() noexcept(false) { ; }
159 friend void Application::startComponents() noexcept(false);
160 friend void Application::stopComponents() noexcept(false);
161 friend void Application::attach(Component*) noexcept(false);
162 friend Application& Application::clone() noexcept(false);