1 #include <Poco/JSON/JSON.h>
2 #include <Poco/JSON/Stringifier.h>
3 #include <Poco/JSON/Parser.h>
4 #include <Poco/JSON/JSONException.h>
5 #include <Poco/Dynamic/Var.h>
22 void DRCEResultDataSerializator::packToObject(Poco::JSON::Object& obj,
DRCEResultDataItem& resultDataItem)
throw (Poco::Exception)
38 Poco::JSON::Object::Ptr pFields =
new Poco::JSON::Object();
39 if (!pFields.isNull())
41 for (std::map<std::string, std::string>::const_iterator iter=resultDataItem.getFields().begin();iter!=resultDataItem.getFields().end();++iter)
43 pFields->set((*iter).first, (*iter).second);
48 Poco::JSON::Array::Ptr pFiles =
new Poco::JSON::Array();
51 const size_t filesCount = resultDataItem.getFilesCount();
52 for (
size_t k=0;k<filesCount;++k)
54 Poco::JSON::Object::Ptr pFileElem =
new Poco::JSON::Object();
55 if (!pFileElem.isNull())
60 pFiles->add(pFileElem);
66 Poco::JSON::Array::Ptr pSubtasks =
new Poco::JSON::Array();
67 if (!pSubtasks.isNull())
69 packToArray(*pSubtasks, resultDataItem);
74 void DRCEResultDataSerializator::packToArray(Poco::JSON::Array& arr, DRCEResultDataItem& resultDataItem)
throw (Poco::Exception)
76 for (
size_t i=0;i<resultDataItem.getSubtasksCount();++i)
78 Poco::JSON::Object::Ptr
pObj =
new Poco::JSON::Object();
81 DRCEResultDataItem resultItem(resultDataItem.getSubtaskItem(i));
82 packToObject(*pObj, resultItem);
88 void DRCEResultDataSerializator::unpackFromObject(Poco::JSON::Object& obj, DRCEResultDataItem& resultDataItem)
throw (Poco::Exception)
91 resultDataItem.setErrorCode(convertVarToNumeric<unsigned int>(tmp, 0));
95 resultDataItem.setErrorMessage(tmp.convert<std::string>());
98 resultDataItem.setRequestId(convertVarToNumeric<unsigned int>(tmp, 0));
101 resultDataItem.setRequestType(static_cast<DRCETaskRequest::RequestType>(convertVarToNumeric<unsigned int>(tmp, 0)));
105 resultDataItem.setNodeHost(tmp.convert<std::string>());
109 resultDataItem.setNodePort(tmp.convert<std::string>());
112 resultDataItem.setState(convertVarToNumeric<unsigned int>(tmp, 0));
115 resultDataItem.setPid(convertVarToNumeric<unsigned int>(tmp, 0));
119 resultDataItem.setStdoutStream(
DRCEDecodeBase64(tmp.convert<std::string>()));
123 resultDataItem.setStderrStream(
DRCEDecodeBase64(tmp.convert<std::string>()));
127 resultDataItem.setNodeName(tmp.convert<std::string>());
130 resultDataItem.setTime(convertVarToNumeric<unsigned int>(tmp, 0));
133 resultDataItem.setExitStatus(convertVarToNumeric<unsigned int>(tmp, 0));
136 if (!pFields.isNull())
138 std::map<std::string, std::string>
fields;
139 std::vector<std::string> names;
140 pFields->getNames(names);
141 for (
size_t i=0;i<names.size();++i)
143 tmp = pFields->get(names[i]);
145 fields[names[i]] = tmp.convert<std::string>();
147 resultDataItem.setFields(fields);
151 if (!pFiles.isNull())
153 for (
size_t k=0;k<pFiles->size();++k)
155 Poco::JSON::Object::Ptr pFileElem = pFiles->getObject(k);
156 if (!pFileElem.isNull())
162 fileItem.name = tmp.convert<std::string>();
166 fileItem.data = tmp.convert<std::string>();
169 fileItem.actionType = convertVarToNumeric<unsigned int>(tmp, 0);
171 resultDataItem.addFileItem(std::forward<FileItem>(fileItem));
177 if (!pSubtasks.isNull())
179 unpackFromArray(*pSubtasks, resultDataItem);
183 void DRCEResultDataSerializator::unpackFromArray(Poco::JSON::Array& arr, DRCEResultDataItem& resultDataItem)
throw (Poco::Exception)
185 for (
size_t i=0;i<arr.size();++i)
187 Poco::JSON::Object::Ptr pObj = arr.getObject(i);
190 DRCEResultDataItem resultItem;
191 unpackFromObject(*pObj, resultItem);
192 resultDataItem.addSubtaskItem(resultItem);
204 Poco::JSON::Array::Ptr pItems =
new Poco::JSON::Array();
210 Poco::JSON::Object::Ptr pItemElem =
new Poco::JSON::Object();
212 if (!pItemElem.isNull())
215 packToObject(*pItemElem, resultItem);
216 pItems->add(pItemElem);
220 std::stringstream ostr;
221 Poco::JSON::Stringifier::stringify(pItems, ostr);
226 catch(Poco::Exception& e)
232 catch(std::exception& e)
250 Poco::JSON::Parser parser;
251 Poco::Dynamic::Var res = parser.parse(json);
253 Poco::Dynamic::Var tmp;
254 Poco::JSON::Array::Ptr pItems = res.extract<Poco::JSON::Array::Ptr>();
255 if (!pItems.isNull())
257 for (
size_t i=0;i<pItems->size();++i)
259 Poco::JSON::Object::Ptr pItemElem = pItems->getObject(i);
260 if (!pItemElem.isNull())
263 unpackFromObject(*pItemElem, resultDataItem);
264 resultData.
addDataItem(std::forward<DRCEResultDataItem>(resultDataItem));
270 catch(Poco::JSON::JSONException& e)
276 catch(Poco::Exception& e)