Remove dynamic exceptions
[anna.git] / include / anna / http / wims20 / ClientSide.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
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 //
7
8
9 #ifndef anna_http_wims20_ClientSide_hpp
10 #define anna_http_wims20_ClientSide_hpp
11
12 #include <anna/core/functions.hpp>
13
14 #include <anna/http/wims20/Abstract.hpp>
15
16 namespace anna {
17
18 namespace http {
19
20 class Request;
21
22 namespace wims20 {
23
24 /**
25    Permite interpretar una URI según las recomendaciones de WIMS 2.0, lo que facilita
26    el desarrollo de aplicaciones integradas en Web 2.0; estas recomendaciones indican
27    cómo debe formarse la petición ClientSide (REpresentational State Transfer) para permitir
28    el desarrollo de cualquier servicio.
29
30    Implementa el interfaz WIMS 2.0 desde el punto de vista del proceso que genera la petición.
31
32    El formato general de una URI según la recomendación de WIMS 2.0 es:
33
34    <p>
35 http://domain-openapis/path-openapis/serviceID/guid/other_possible_levels?query_parameters
36    </p>
37
38    Dónde los campos tienen siguen la siguiente especificación:
39    \li http://domain-openapis: Identifica el recurso del Open API.
40    \li path-openapis: Recurso opcional que ajusta la ruta hacia los recursos de éste API.
41    \li serviceID: Identificador de recurso.
42    \li guid: Identificador del usuario que solicita la petición.
43    \li other_possible_level: Opcionalmente se pueden indicar tantos niveles jerárquicos como fuera
44    necesario para el servicio.
45    \li query_parameters: Lista de parámetros. Si hay más de un parámetro se separará con '&'.
46 */
47 class ClientSide : public Abstract {
48 public:
49   /**
50    * Contructor indicando el parámetro opcional \em path-openapis. Estos dos parámetros se obtendrá como
51    * parte de la configuración de nuestro sistema.
52    * \param domain: Identifica el recurso del OpenAPI.
53    * \param path: Parámetro opcional que ajusta la ruta hacia los recusos de éste API.
54    */
55   ClientSide(const std::string& domain, const std::string& path) :
56     Abstract("ClientSide", domain, path) {
57     a_strOtherLevels = NULL;
58   }
59
60   /**
61    * Constructor que no usará el parámetro opcional \em path-openapis. Este parámetro se obtendrá como
62    * parte de la configuración de nuestro sistema.
63    * \param domain: Identifica el recurso del OpenAPI.
64    */
65   explicit ClientSide(const std::string& domain) :
66     Abstract("ClientSide", domain) {
67     a_strOtherLevels = NULL;
68   }
69
70   /**
71    * Destructor.
72    */
73   ~ClientSide() { Abstract::destroyString(a_strOtherLevels); }
74
75   /**
76    * Amplía el campo \em other_possible_level con el valor recibido.
77    * \param otherLevel Valor con el que ampliar la ruta.
78    */
79   void addOtherLevel(const std::string& otherLevel) noexcept(false);
80
81   /**
82    * Amplía el campo \em other_possible_level con el valor recibido.
83    * \param otherLevel Valor con el que ampliar la ruta.
84    */
85   void addOtherLevel(const char* otherLevel) noexcept(false) {
86     std::string aux(otherLevel);
87     addOtherLevel(aux);
88   }
89
90   /**
91    * Establece el valor del parámetro indicado como parámetro. Si el parámetro indicado ya
92    * existe en la lista de parámetros registrados su valor se sobreescribe.
93    * \param parameter Nombre del parámetro a establecer.
94    * \param value Valor asociado al parámetro.
95    */
96   void setParameter(const char* parameter, const char* value) noexcept(false) {
97     std::string p(parameter);
98     std::string v(value);
99     Abstract::parameter_set(p, v);
100   }
101
102   /**
103    * Establece el valor del parámetro indicado como parámetro. Si el parámetro indicado ya
104    * existe en la lista de parámetros registrados su valor se sobreescribe.
105    * \param parameter Nombre del parámetro a establecer.
106    * \param value Valor asociado al parámetro.
107    */
108   void setParameter(const char* parameter, const int value) noexcept(false) {
109     std::string p(parameter);
110     Abstract::parameter_set(p, anna::functions::asString(value));
111   }
112
113   /**
114    * Establece el valor del parámetro indicado como parámetro. Si el parámetro indicado ya
115    * existe en la lista de parámetros registrados su valor se sobreescribe.
116    * \param parameter Nombre del parámetro a establecer.
117    * \param value Valor asociado al parámetro.
118    */
119   void setParameter(const std::string& parameter, const std::string& value) noexcept(false) {
120     Abstract::parameter_set(parameter, value);
121   }
122
123   /**
124    * Establece el valor del parámetro indicado como parámetro. Si el parámetro indicado ya
125    * existe en la lista de parámetros registrados su valor se sobreescribe.
126    * \param parameter Nombre del parámetro a establecer.
127    * \param value Valor asociado al parámetro.
128    */
129   void setParameter(const std::string& parameter, const int value) noexcept(false) {
130     Abstract::parameter_set(parameter, anna::functions::asString(value));
131   }
132
133   /**
134    * Limpia el contenido asociado al parámetro \em other_possible_level. Sólo debería
135    * invocarse a este método en caso de que el servicio destino de la petición haya cambiado.
136    */
137   void clearOtherLevels() {
138     Abstract::clearOtherLevels();
139     Abstract::destroyString(a_strOtherLevels);
140     a_strOtherLevels = NULL;
141   }
142
143   /**
144    * Recopila la información contenida en la petición REST de WIMS2.0 y la
145    * codifica sobre la URI de la petición HTTP recibida como parámetro.
146    * \param message Mensaje HTTP sobre el que se establecerá la URI necesaria para
147    * realizar la peticion WIMS 2.0.
148    */
149   void codeOn(http::Request& message) noexcept(false);
150
151 private:
152   std::string* a_strOtherLevels;
153   std::string a_uri;
154 };
155
156 }
157 }
158 }
159
160 #endif