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_dbos_AutoObject_hpp
10 #define anna_dbos_AutoObject_hpp
12 #include <anna/dbos/Object.hpp>
20 Facilita el uso de los punteros a objectos obtenidos a partir de los datos guardados en un medio fisico.
22 La idea de esta clase es que el constructor y el destructor de esta clase cooperan para reservar y/o
23 liberar correctamente la instancia de T asociada a esta instancia.
25 \param T Clase que vamos a gestionar.
27 En el siguiente ejemplo podemos ver la forma habitual de trabajar con un objeto persistente tiene
28 el incoveniente de que tenemos que tener en cuenta cada una de las situaciones en las que la
29 referencia obtenida mediante el metodo \em instantiate debe ser liberada.
32 void Application::getServerSocketsData (vector <SocketData>& serverSocketsData) const
33 throw (RuntimeException)
35 LOGMETHOD (TraceMethod ("anna::Application", "getServerSocketsData", ANNA_FILE_LOCATION));
37 Facility* facility (NULL);
38 FacilityLoader facilityLoader;
41 facility = Facility::instantiate (facilityLoader.setKey (a_thisFacility)); // (1)
42 LOGDEBUG (Logger::write (Logger::Debug, facility->asString (), ANNA_FILE_LOCATION));
44 getSocketsData (getThisHostName (), facility->getName (), a_thisCell, a_thisInstance, serverSocketsData);
46 Facility::release (facility);
48 catch (dbos::DatabaseException& edbos) {
49 Facility::release (facility);
50 throw RuntimeException (edbos.getText (), ANNA_FILE_LOCATION);
52 catch (RuntimeException&) { // Tenemos que capturar esta excepcion para liberar el recurso.
53 Facility::release (facility);
59 Como podemos ver a continuacion el siguiente metodo es mucho mas sencillo y aporta la gran ventaja de que
60 el sistema trabaja por nosotros para liberar correctamente los recursos.
63 void Application::getServerSocketsData (vector <SocketData>& serverSocketsData) const
64 throw (RuntimeException)
66 LOGMETHOD (TraceMethod ("anna::Application", "getServerSocketsData", ANNA_FILE_LOCATION));
68 AutoObject <Facility> facility;
69 FacilityLoader facilityLoader;
72 facility = Facility::instantiate (facilityLoader.setKey (a_thisFacility)); // (1)
74 LOGDEBUG (Logger::write (Logger::Debug, facility->asString (), ANNA_FILE_LOCATION));
76 getSocketsData (getThisHostName (), facility->getName (), a_thisCell, a_thisInstance, serverSocketsData);
78 catch (dbos::DatabaseException& edbos) {
79 throw RuntimeException (edbos.getText (), ANNA_FILE_LOCATION);
84 template <typename T> class AutoObject {
88 \param t Instancia del objeto asociado a esta instancia.
89 \warning La instancia deberia haber sido obtenida mediate la invocacion a \em T::instantiate de la
92 explicit AutoObject(T* t) : a_t(t) {;}
97 AutoObject() : a_t(NULL) {;}
100 Destructor. Invoca al metodo \em T::release
102 ~AutoObject() { if(a_t != NULL) T::release(a_t); }
106 Permite invocar a metodos de la clase T.
107 \return La instancia de la clase T asociada a esta instancia.
109 T* operator -> () const throw() { return a_t; }
113 \param t Referencia al objeto que vamos a tratar.
114 \return La instancia de la clase T asociada a esta instancia.
116 T* operator = (T* t) throw() {
127 \param other Referencia al objeto que vamos a tratar.
128 \return La instancia de la clase T asociada a esta instancia.
130 T* operator = (const AutoObject <T>& other) throw(RuntimeException) {
131 return (this != &other) ? (*this = T::duplicate(other.a_t)) : a_t;
135 Operador de conversion.
136 \return La instancia de la clase T asociada a esta instancia.
138 operator T*() const throw() { return a_t; }