Adding ramlparser implementation for simulator.
[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::build()\r
27     {\r
28         YAML::Node yamlRootNode = YAML::LoadFile(m_fileLocation + m_ramlName);\r
29         m_ramlPtr->readRamlFromYaml(yamlRootNode);\r
30         setDataFromRoot();\r
31         return (m_ramlPtr);\r
32 \r
33     }\r
34     RamlPtr RamlParser::getRamlPtr()\r
35     {\r
36         return m_ramlPtr;\r
37     }\r
38     void RamlParser::setDataFromRoot()\r
39     {\r
40         setTypes(getRamlPtr()->getResources());\r
41         setTraits(getRamlPtr()->getResources());\r
42         setBodyDefaultMediaType(getRamlPtr()->getResources());\r
43         setBodySchema(getRamlPtr()->getResources());\r
44     }\r
45     void RamlParser::setBodyDefaultMediaType(std::map<std::string, RamlResource> resource)\r
46     {\r
47         if (getRamlPtr()->getMediaType().empty())\r
48         {\r
49             return;\r
50         }\r
51         for (auto it : resource)\r
52         {\r
53             std::string type = getRamlPtr()->getMediaType();\r
54 \r
55             for (auto  action :  it.second.getActions())\r
56             {\r
57                 if (action.second.getRequestBody().empty())\r
58                 {\r
59                     std::string resName = it.first;\r
60                     getRamlPtr()->getResource(resName).getAction(action.first).setRequestBody(type);\r
61                 }\r
62                 for (auto  response : action.second.getResponses())\r
63                 {\r
64                     if (response.second.getResponseBody().empty())\r
65                     {\r
66                         std::string resName = it.first;\r
67                         std::string responseCode = response.first;\r
68                         getRamlPtr()->getResource(resName).getAction(action.first).getResponse(\r
69                             responseCode).setResponseBody(\r
70                                 type);\r
71                     }\r
72                 }\r
73             }\r
74         }\r
75     }\r
76     void RamlParser::setBodySchema(std::map<std::string, RamlResource> resource)\r
77     {\r
78         if (getRamlPtr()->getSchemas().empty())\r
79         {\r
80             return;\r
81         }\r
82         for (auto  it : resource)\r
83         {\r
84             for (auto  action :  it.second.getActions())\r
85             {\r
86                 for (auto  body :  action.second.getRequestBody())\r
87                 {\r
88                     Schema *schema = body.second.getSchema();\r
89 \r
90                     if (schema != NULL)\r
91                     {\r
92                         std::string schemaValue = schema->getSchema();\r
93                         auto pos = std::find_if(getRamlPtr()->getSchemas().begin(), getRamlPtr()->getSchemas().end(),\r
94                                                 [schemaValue](std::pair<std::string, Schema> const & pair)\r
95                         {\r
96                             return (pair.first == schemaValue);\r
97                         });\r
98                         if (pos != getRamlPtr()->getSchemas().end())\r
99                         {\r
100                             schema->setSchema((pos->second.getSchema()));\r
101                         }\r
102                     }\r
103                 }\r
104                 for (auto  response : action.second.getResponses())\r
105                 {\r
106                     for (auto  body :  response.second.getResponseBody())\r
107                     {\r
108                         Schema *schema = body.second.getSchema();\r
109                         if (schema != NULL)\r
110                         {\r
111                             std::string schemaValue = schema->getSchema();\r
112                             auto schemas = getRamlPtr()->getSchemas();\r
113 \r
114                             auto iter = schemas.begin();\r
115                             for (; iter != schemas.end(); iter++)\r
116                             {\r
117                                 if (((*iter).first) == schemaValue)\r
118                                     break;\r
119                             }\r
120                             if (iter != schemas.end())\r
121                             {\r
122                                 schema->setSchema((*iter).second.getSchema());\r
123                             }\r
124                         }\r
125                     }\r
126                 }\r
127             }\r
128         }\r
129     }\r
130     void RamlParser::setTypes(std::map<std::string, RamlResource> resource)\r
131     {\r
132         if (getRamlPtr()->getResourceTypes().empty())\r
133         {\r
134             return;\r
135         }\r
136         for (auto  it : resource)\r
137         {\r
138             auto resourceTypes = getRamlPtr()->getResourceTypes();\r
139             std::string typeValue = it.second.getResourceType();\r
140 \r
141             auto iter = resourceTypes.begin();\r
142             for (; iter != resourceTypes.end(); iter++)\r
143             {\r
144                 if (((*iter).first) == typeValue)\r
145                     break;\r
146             }\r
147             if (iter != resourceTypes.end())\r
148             {\r
149                 std::string resName = it.first;\r
150                 RamlResource &res = getRamlPtr()->getResource(resName);\r
151                 RamlResource resType =  (*iter).second;\r
152 \r
153                 if (resType.getActions().empty())\r
154                     return;\r
155 \r
156                 for (auto resActions : resType.getActions())\r
157                 {\r
158                     if (res.getActions().count(resActions.first) == 0)\r
159                         res.setAction(resActions.first, resActions.second);\r
160                 }\r
161             }\r
162         }\r
163     }\r
164     void RamlParser::setTraits(std::map<std::string, RamlResource> resource)\r
165     {\r
166         if (getRamlPtr()->getTraits().empty())\r
167         {\r
168             return;\r
169         }\r
170         for (auto  it : resource)\r
171         {\r
172             auto trait = getRamlPtr()->getTraits();\r
173             for (auto act : it.second.getActions())\r
174             {\r
175                 for (std::string  traitValue :  act.second.getTraits())\r
176                 {\r
177                     auto iter = trait.begin();\r
178                     for (; iter != trait.end(); iter++)\r
179                     {\r
180                         if (((*iter).first) == traitValue)\r
181                             break;\r
182                     }\r
183                     if (iter != trait.end())\r
184                     {\r
185                         std::string resName = it.first;\r
186                         RamlResource &res = getRamlPtr()->getResource(resName);\r
187                         Action resTrait =  (*iter).second;\r
188 \r
189                         Action &action = res.getAction(act.first);\r
190                         for (auto head : resTrait.getHeaders())\r
191                         {\r
192                             if (action.getHeaders().count(head.first) == 0)\r
193                                 action.setHeader(head.first, head.second);\r
194                         }\r
195                         for (auto query : resTrait.getQueryParameters())\r
196                         {\r
197                             if (action.getQueryParameters().count(query.first) == 0)\r
198                                 action.setQueryParameter(query.first, query.second);\r
199                         }\r
200                         for (auto resp : resTrait.getResponses())\r
201                         {\r
202                             if (action.getResponses().count(resp.first) == 0)\r
203                                 action.setResponse(resp.first, resp.second);\r
204                         }\r
205                     }\r
206                 }\r
207             }\r
208             for (std::string  traitValue :  it.second.getTraits())\r
209             {\r
210                 auto iter = trait.begin();\r
211                 for (; iter != trait.end(); iter++)\r
212                 {\r
213                     if (((*iter).first) == traitValue)\r
214                         break;\r
215                 }\r
216                 if (iter != trait.end())\r
217                 {\r
218                     std::string resName = it.first;\r
219                     RamlResource &res = getRamlPtr()->getResource(resName);\r
220                     Action resTrait =  (*iter).second;\r
221 \r
222                     for (auto act : res.getActions())\r
223                     {\r
224                         Action &action = res.getAction(act.first);\r
225                         for (auto head : resTrait.getHeaders())\r
226                         {\r
227                             if (action.getHeaders().count(head.first) == 0)\r
228                                 action.setHeader(head.first, head.second);\r
229                         }\r
230                         for (auto query : resTrait.getQueryParameters())\r
231                         {\r
232                             if (action.getQueryParameters().count(query.first) == 0)\r
233                                 action.setQueryParameter(query.first, query.second);\r
234                         }\r
235                         for (auto resp : resTrait.getResponses())\r
236                         {\r
237                             if (action.getResponses().count(resp.first) == 0)\r
238                                 action.setResponse(resp.first, resp.second);\r
239                         }\r
240                     }\r
241                 }\r
242             }\r
243         }\r
244     }\r
245 \r
246 }\r