Remove dynamic exceptions
[anna.git] / include / anna / http / wims20 / ServerSide.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_ServerSide_hpp
10 #define anna_http_wims20_ServerSide_hpp
11
12 #include <anna/core/RuntimeException.hpp>
13 #include <anna/core/util/Tokenizer.hpp>
14
15 #include <anna/http/wims20/Abstract.hpp>
16
17 namespace anna {
18
19 namespace http {
20
21 class Request;
22
23 namespace wims20 {
24
25 /**
26    Permite interpretar una URI según las recomendaciones de WIMS 2.0, lo que facilita
27    el desarrollo de aplicaciones integradas en Web 2.0; estas recomendaciones indican
28    cómo debe formarse la petición ServerSide (REpresentational State Transfer) para permitir
29    el desarrollo de cualquier servicio.
30
31    Implementa el interfaz WIMS 2.0 desde el punto de vista del proceso que recibe la petición.
32
33    El formato general de una URI según la recomendación de WIMS 2.0 es:
34
35    <p>
36 http://domain-openapis/path-openapis/serviceID/guid/other_possible_levels?query_parameters
37    </p>
38
39    Dónde los campos tienen siguen la siguiente especificación:
40    \li http://domain-openapis: Identifica el recurso del Open API.
41    \li path-openapis: Recurso opcional que ajusta la ruta hacia los recursos de éste API.
42    \li serviceID: Identificador de recurso.
43    \li guid: Identificador del usuario que solicita la petición.
44    \li other_possible_level: Opcionalmente se pueden indicar tantos niveles jerárquicos como fuera
45    necesario para el servicio.
46    \li query_parameters: Lista de parámetros. Si hay más de un parámetro se separará con '&'.
47 */
48 class ServerSide : public Abstract {
49 public:
50   /**
51    * Contructor indicando el parámetro opcional \em path-openapis. Estos dos parámetros se obtendrá como
52    * parte de la configuración de nuestro sistema.
53    * \param domain: Identifica el recurso del OpenAPI.
54    * \param path: Parámetro opcional que ajusta la ruta hacia los recusos de éste API.
55    */
56   ServerSide(const std::string& domain, const std::string& path) :
57     Abstract("ServerSide", domain, path) {
58     for(int ii = 0; ii < SplitCode::Max; ii ++)
59       a_tokenizer [ii].activateStrip(true);
60   }
61
62   /**
63    * Constructor que no usará el parámetro opcional \em path-openapis. Este parámetro se obtendrá como
64    * parte de la configuración de nuestro sistema.
65    * \param domain: Identifica el recurso del OpenAPI.
66    */
67   explicit ServerSide(const std::string& domain) :
68     Abstract("ServerSide", domain) {
69     for(int ii = 0; ii < SplitCode::Max; ii ++)
70       a_tokenizer [ii].activateStrip(true);
71   }
72
73   /**
74    * Obtiene el valor asociado a parámetro recibido como parámetro, que habrá sido obtenido
75    * de la URI mediante el método #decode.
76    * \param name Nombre del parámetro que se desea obtener.
77    * \param mode Modo de actuar en caso de que no se encuentre el parámetro.
78    * \return El valor asociado al parámetro recibido como parémtro. Puede ser NULL.
79    */
80   const std::string* getValue(const char* name, const Exception::Mode::_v mode = Exception::Mode::Throw) const noexcept(false);
81
82   /**
83    * Obtiene el valor asociado a parámetro recibido como parámetro, que habrá sido obtenido
84    * de la URI mediante el método #decode.
85    * \param name Nombre del parámetro que se desea obtener.
86    * \param mode Modo de actuar en caso de que no se encuentre el parámetro.
87    * \return El valor asociado al parámetro recibido como parémtro. Puede ser NULL.
88    */
89   const char* getCStringValue(const char* name, const Exception::Mode::_v mode = Exception::Mode::Throw) const noexcept(false);
90
91   /**
92    * Obtiene el valor asociado a parámetro recibido como parámetro, que habrá sido obtenido
93    * de la URI mediante el método #decode.
94    * \param name Nombre del parámetro que se desea obtener.
95    * \param mode Modo de actuar en caso de que no se encuentre el parámetro.
96    * \return El valor asociado al parámetro recibido como parémtro. Puede ser NULL.
97    */
98   int getIntegerValue(const char* name, const Exception::Mode::_v mode = Exception::Mode::Throw) const noexcept(false);
99
100   /**
101    * Decodifica la URI de la petición enviada como parámetro y la interpreta según
102    * las recomendaciones de WIMS 2.0
103    *
104    * \param request Petición HTTP que va a tratar este servidor.
105    */
106   void decode(const http::Request& request) noexcept(false);
107
108 private:
109   struct SplitCode { enum _v { HierarchyAndParameter, HierarchyItem, Parameters, ParameterAndArgument, Max }; };
110
111   void decodeHierarchy(const std::string& hierarchy) noexcept(false);
112   void decodeParameters(const std::string& parameters) noexcept(false);
113
114   const Tokenizer& split(const SplitCode::_v splitZone, const std::string&) noexcept(false);
115
116   anna::Tokenizer a_tokenizer [SplitCode::Max];
117 };
118
119 }
120 }
121 }
122
123 #endif