Imported Upstream version 1.0.0
[platform/upstream/iotivity.git] / service / simulator / ramlparser / raml / RamlParser.cpp
1 /******************************************************************\r
2  *\r
3  * Copyright 2015 Samsung Electronics All Rights Reserved.\r
4  *\r
5  *\r
6  *\r
7  * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * you may not use this file except in compliance with the License.\r
9  * You may obtain a copy of the License at\r
10  *\r
11  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  *\r
13  * Unless required by applicable law or agreed to in writing, software\r
14  * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * See the License for the specific language governing permissions and\r
17  * limitations under the License.\r
18  *\r
19  ******************************************************************/\r
20 \r
21 #include "RamlParser.h"\r
22 #include <map>\r
23 \r
24 namespace RAML\r
25 {\r
26     RamlPtr RamlParser::getRamlPtr(RamlParserResult &result)\r
27     {\r
28         result = m_ramlParserResult;\r
29         return m_ramlPtr;\r
30     }\r
31     RamlPtr RamlParser::getRamlPtr()\r
32     {\r
33         return m_ramlPtr;\r
34     }\r
35     void RamlParser::setDataFromRoot()\r
36     {\r
37         setTypes(getRamlPtr()->getResources());\r
38         setTraits(getRamlPtr()->getResources());\r
39         setBodyDefaultMediaType(getRamlPtr()->getResources());\r
40         setBodySchema(getRamlPtr()->getResources());\r
41     }\r
42     void RamlParser::setBodyDefaultMediaType(const std::map<std::string, RamlResourcePtr> &resource)\r
43     {\r
44         if (getRamlPtr()->getMediaType().empty())\r
45         {\r
46             return;\r
47         }\r
48         for (auto const & it : resource)\r
49         {\r
50             std::string type = getRamlPtr()->getMediaType();\r
51 \r
52             for (auto const & action :  it.second->getActions())\r
53             {\r
54                 if (action.second->getRequestBody().empty())\r
55                 {\r
56                     action.second->setRequestBody(type);\r
57                 }\r
58                 for (auto const & response : action.second->getResponses())\r
59                 {\r
60                     if (response.second->getResponseBody().empty())\r
61                     {\r
62                         response.second->setResponseBody(type);\r
63                     }\r
64                 }\r
65             }\r
66             setBodyDefaultMediaType(it.second->getResources());\r
67         }\r
68     }\r
69     void RamlParser::setBodySchema(const std::map<std::string, RamlResourcePtr> &resource)\r
70     {\r
71         if (getRamlPtr()->getSchemas().empty())\r
72         {\r
73             return;\r
74         }\r
75         for (auto const & it : resource)\r
76         {\r
77             for (auto const & action :  it.second->getActions())\r
78             {\r
79                 for (auto const & body :  action.second->getRequestBody())\r
80                 {\r
81                     SchemaPtr schema = body.second->getSchema();\r
82 \r
83                     if (schema != NULL)\r
84                     {\r
85                         std::string schemaValue = schema->getSchema();\r
86                         auto pos = std::find_if(getRamlPtr()->getSchemas().begin(), getRamlPtr()->getSchemas().end(),\r
87                                                 [schemaValue](std::pair<std::string, SchemaPtr> const & pair)\r
88                         {\r
89                             return (pair.first == schemaValue);\r
90                         });\r
91                         if (pos != getRamlPtr()->getSchemas().end())\r
92                         {\r
93                             schema->setSchema((pos->second->getSchema()));\r
94                         }\r
95                     }\r
96                 }\r
97                 for (auto const & response : action.second->getResponses())\r
98                 {\r
99                     for (auto const & body :  response.second->getResponseBody())\r
100                     {\r
101                         SchemaPtr schema = body.second->getSchema();\r
102                         if (schema != NULL)\r
103                         {\r
104                             std::string schemaValue = schema->getSchema();\r
105                             auto schemas = getRamlPtr()->getSchemas();\r
106 \r
107                             auto iter = schemas.begin();\r
108                             for (; iter != schemas.end(); iter++)\r
109                             {\r
110                                 if (((*iter).first) == schemaValue)\r
111                                     break;\r
112                             }\r
113                             if (iter != schemas.end())\r
114                             {\r
115                                 schema->setSchema((*iter).second->getSchema());\r
116                             }\r
117                         }\r
118                     }\r
119                 }\r
120             }\r
121             setBodySchema(it.second->getResources());\r
122         }\r
123     }\r
124     void RamlParser::setTypes(const std::map<std::string, RamlResourcePtr> &resource)\r
125     {\r
126         if (getRamlPtr()->getResourceTypes().empty())\r
127         {\r
128             return;\r
129         }\r
130         for (auto const & it : resource)\r
131         {\r
132             auto const &resourceTypes = getRamlPtr()->getResourceTypes();\r
133             std::string typeValue = it.second->getResourceType();\r
134 \r
135             auto iter = resourceTypes.begin();\r
136             for (; iter != resourceTypes.end(); iter++)\r
137             {\r
138                 if (((*iter).first) == typeValue)\r
139                     break;\r
140             }\r
141             if (iter != resourceTypes.end())\r
142             {\r
143                 if ((*iter).second->getActions().empty())\r
144                     return;\r
145 \r
146                 for (auto resActions : (*iter).second->getActions())\r
147                 {\r
148                     if (it.second->getActions().count(resActions.first) == 0)\r
149                         it.second->setAction(resActions.first, std::make_shared<Action>(*(resActions.second)));\r
150                 }\r
151             }\r
152             setTypes(it.second->getResources());\r
153         }\r
154     }\r
155     void RamlParser::setTraits(const std::map<std::string, RamlResourcePtr> &resource)\r
156     {\r
157         if (getRamlPtr()->getTraits().empty())\r
158         {\r
159             return;\r
160         }\r
161         for (auto const & it : resource)\r
162         {\r
163             auto const &trait = getRamlPtr()->getTraits();\r
164             for (auto const & act : it.second->getActions())\r
165             {\r
166                 for (const std::string & traitValue :  act.second->getTraits())\r
167                 {\r
168                     auto iter = trait.begin();\r
169                     for (; iter != trait.end(); iter++)\r
170                     {\r
171                         if (((*iter).first) == traitValue)\r
172                             break;\r
173                     }\r
174                     if (iter != trait.end())\r
175                     {\r
176                         for (auto head : (*iter).second->getHeaders())\r
177                         {\r
178                             if (act.second->getHeaders().count(head.first) == 0)\r
179                                 act.second->setHeader(head.first, head.second);\r
180                         }\r
181                         for (auto query : (*iter).second->getQueryParameters())\r
182                         {\r
183                             if (act.second->getQueryParameters().count(query.first) == 0)\r
184                                 act.second->setQueryParameter(query.first, query.second);\r
185                         }\r
186                         for (auto resp : (*iter).second->getResponses())\r
187                         {\r
188                             if (act.second->getResponses().count(resp.first) == 0)\r
189                                 act.second->setResponse(resp.first, resp.second);\r
190                         }\r
191                     }\r
192                 }\r
193             }\r
194             for (const std::string & traitValue :  it.second->getTraits())\r
195             {\r
196                 auto iter = trait.begin();\r
197                 for (; iter != trait.end(); iter++)\r
198                 {\r
199                     if (((*iter).first) == traitValue)\r
200                         break;\r
201                 }\r
202                 if (iter != trait.end())\r
203                 {\r
204                     for (auto act : it.second->getActions())\r
205                     {\r
206                         for (auto head : (*iter).second->getHeaders())\r
207                         {\r
208                             if (act.second->getHeaders().count(head.first) == 0)\r
209                                 act.second->setHeader(head.first, head.second);\r
210                         }\r
211                         for (auto query : (*iter).second->getQueryParameters())\r
212                         {\r
213                             if (act.second->getQueryParameters().count(query.first) == 0)\r
214                                 act.second->setQueryParameter(query.first, query.second);\r
215                         }\r
216                         for (auto resp : (*iter).second->getResponses())\r
217                         {\r
218                             if (act.second->getResponses().count(resp.first) == 0)\r
219                                 act.second->setResponse(resp.first, resp.second);\r
220                         }\r
221                     }\r
222                 }\r
223             }\r
224             setTraits(it.second->getResources());\r
225         }\r
226     }\r
227 \r
228 }\r