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_http_wims20_ServerSide_hpp
10 #define anna_http_wims20_ServerSide_hpp
12 #include <anna/core/RuntimeException.hpp>
13 #include <anna/core/util/Tokenizer.hpp>
15 #include <anna/http/wims20/Abstract.hpp>
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.
31 Implementa el interfaz WIMS 2.0 desde el punto de vista del proceso que recibe la petición.
33 El formato general de una URI según la recomendación de WIMS 2.0 es:
36 http://domain-openapis/path-openapis/serviceID/guid/other_possible_levels?query_parameters
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 '&'.
48 class ServerSide : public Abstract {
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.
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);
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.
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);
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.
80 const std::string* getValue(const char* name, const Exception::Mode::_v mode = Exception::Mode::Throw) const throw(RuntimeException);
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.
89 const char* getCStringValue(const char* name, const Exception::Mode::_v mode = Exception::Mode::Throw) const throw(RuntimeException);
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.
98 int getIntegerValue(const char* name, const Exception::Mode::_v mode = Exception::Mode::Throw) const throw(RuntimeException);
101 * Decodifica la URI de la petición enviada como parámetro y la interpreta según
102 * las recomendaciones de WIMS 2.0
104 * \param request Petición HTTP que va a tratar este servidor.
106 void decode(const http::Request& request) throw(RuntimeException);
109 struct SplitCode { enum _v { HierarchyAndParameter, HierarchyItem, Parameters, ParameterAndArgument, Max }; };
111 void decodeHierarchy(const std::string& hierarchy) throw(RuntimeException);
112 void decodeParameters(const std::string& parameters) throw(RuntimeException);
114 const Tokenizer& split(const SplitCode::_v splitZone, const std::string&) throw(RuntimeException);
116 anna::Tokenizer a_tokenizer [SplitCode::Max];