40 #ifndef __OPENFLUID_MACHINE_WAREPLUGINSSEARCHRESULTSSERIALIZER_HPP__
41 #define __OPENFLUID_MACHINE_WAREPLUGINSSEARCHRESULTSSERIALIZER_HPP__
46 #include <rapidjson/document.h>
47 #include <rapidjson/stringbuffer.h>
48 #include <rapidjson/prettywriter.h>
63 template<
class SignatureInstanceType>
76 for (
auto Auth: Authors)
96 std::string Str =
"undefined";
98 if (Type == openfluid::ware::SignatureTimeScheduling::SchedulingType::DEFAULT)
102 else if (Type == openfluid::ware::SignatureTimeScheduling::SchedulingType::FIXED)
106 else if (Type == openfluid::ware::SignatureTimeScheduling::SchedulingType::RANGE)
114 static std::string getIndentedText(
const unsigned int Level,
115 const std::string& Title,
const std::string& Content =
"")
134 if (!Content.empty())
136 Text +=
": "+Content;
142 void writeListToStreamAsText(std::ostream& OutStm,
bool WithErrors)
const;
151 std::ostream& OutStm)
const;
154 std::ostream& OutStm)
const;
157 const std::string& CatStr, std::ostream& OutStm)
const;
167 void writeToStreamAsText(std::ostream& OutStm,
bool WithErrors)
const;
169 void addErrorsToJSONDoc(rapidjson::Document& Doc, rapidjson::Document::AllocatorType& Alloc)
const;
171 static std::string getJSONAsString(rapidjson::Document& Doc);
173 void writeListToStreamAsJSON(std::ostream& OutStm,
bool WithErrors)
const;
176 rapidjson::Value& Arr,rapidjson::Document::AllocatorType& Alloc)
const;
179 rapidjson::Value& Arr,rapidjson::Document::AllocatorType& Alloc)
const;
182 rapidjson::Value& Arr,rapidjson::Document::AllocatorType& Alloc)
const;
185 rapidjson::Value& Obj,rapidjson::Document::AllocatorType& Alloc)
const;
188 rapidjson::Value& Obj,rapidjson::Document::AllocatorType& Alloc)
const;
191 rapidjson::Value& Obj,rapidjson::Document::AllocatorType& Alloc)
const;
194 rapidjson::Value& Obj,rapidjson::Document::AllocatorType& Alloc)
const;
196 void writeToStreamAsJSON(std::ostream& OutStm,
bool WithErrors)
const;
202 m_SearchResults(SearchResults)
207 void writeToStream(std::ostream& OutStm,
const std::string& Format,
bool Detailed,
bool WithErrors)
const;
216 template<
class SignatureInstanceType>
217 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::writeListToStreamAsText(std::ostream& OutStm,
218 bool WithErrors)
const
220 for (
auto& Plug : m_SearchResults.availablePlugins())
222 if (Plug->Verified && Plug->Signature)
224 OutStm << Plug->Signature->ID <<
"\n";
228 if (WithErrors && !m_SearchResults.erroredFiles().empty())
230 for (
auto& EFile : m_SearchResults.erroredFiles())
232 OutStm <<
"Error on file " << EFile.first <<
": " << EFile.second <<
"\n";
242 template<
class SignatureInstanceType>
243 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::addWareMetaForText(
256 template<
class SignatureInstanceType>
257 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::addWareMetaForText(
268 template<
class SignatureInstanceType>
269 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::addSchedulingDetailsForText(
272 std::ostringstream oss;
276 oss <<
"fixed to default deltaT";
291 OutStm << getIndentedText(2,
"Time scheduling",oss.str()) <<
"\n";
299 template<
class SignatureInstanceType>
300 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::addDataForText(
303 std::ostringstream oss;
311 oss << CatStr <<
". " << Item.
Description << UnitStr;
312 OutStm << getIndentedText(3,Item.
DataName,oss.str()) <<
"\n";
320 template<
class SignatureInstanceType>
321 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::addSpatialDataForText(
324 std::ostringstream oss;
332 oss << CatStr <<
". " << Item.
Description << UnitStr;
333 OutStm << getIndentedText(3,Item.
DataName+
" {"+Item.
UnitsClass+
"}",oss.str()) <<
"\n";
341 template<
class SignatureInstanceType>
342 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::addTypedSpatialDataForText(
345 std::ostringstream oss;
359 oss << CatStr <<
". " << Item.
Description << UnitStr;
360 OutStm << getIndentedText(3,Item.
DataName+
" {"+Item.
UnitsClass+
"}"+TypeStr,oss.str()) <<
"\n";
368 template<
class SignatureInstanceType>
369 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::addDataDetailsForText(
374 if (!Data.UsedParams.empty() || !Data.RequiredParams.empty() ||
375 !Data.ProducedVars.empty() || !Data.UpdatedVars.empty() ||
376 !Data.RequiredVars.empty() || !Data.UsedVars.empty() ||
377 !Data.ProducedAttribute.empty() || !Data.RequiredAttribute.empty() || !Data.UsedAttribute.empty() ||
378 !Data.RequiredExtraFiles.empty() || !Data.UsedExtraFiles.empty() ||
379 !Data.UsedEventsOnUnits.empty())
381 OutStm << getIndentedText(2,
"Handled data") <<
"\n";
386 for (
const auto& Item : Data.RequiredParams)
388 addDataForText(Item,
"required parameter",OutStm);
391 for (
const auto& Item : Data.UsedParams)
393 addDataForText(Item,
"used parameter",OutStm);
399 for (
const auto& Item : Data.RequiredAttribute)
401 addSpatialDataForText(Item,
"required attribute",OutStm);
404 for (
const auto& Item : Data.UsedAttribute)
406 addSpatialDataForText(Item,
"used attribute",OutStm);
409 for (
const auto& Item : Data.ProducedAttribute)
411 addSpatialDataForText(Item,
"produced attribute",OutStm);
417 for (
const auto& Item : Data.RequiredVars)
419 addTypedSpatialDataForText(Item,
"required variable",OutStm);
422 for (
const auto& Item : Data.UsedVars)
424 addTypedSpatialDataForText(Item,
"used variable",OutStm);
427 for (
const auto& Item : Data.UpdatedVars)
429 addTypedSpatialDataForText(Item,
"updated variable",OutStm);
432 for (
const auto& Item : Data.ProducedVars)
434 addTypedSpatialDataForText(Item,
"produced variable",OutStm);
439 if (!Data.UsedEventsOnUnits.empty())
442 std::string EventsStr;
444 for (
const auto& Item : Data.UsedEventsOnUnits)
453 OutStm << getIndentedText(3,
"Events handled on",EventsStr) <<
"\n";
459 for (
const auto& Item : Data.RequiredExtraFiles)
461 OutStm << getIndentedText(3,
"Required extra file",Item) <<
"\n";
464 for (
const auto& Item : Data.UsedExtraFiles)
466 OutStm << getIndentedText(3,
"Used extra file",Item) <<
"\n";
477 template<
class SignatureInstanceType>
478 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::addGraphDetailsForText(
483 OutStm << getIndentedText(2,
"Handled units graph") <<
"\n";
493 OutStm << getIndentedText(3,
"Units graph update on class "+UC.UnitsClass,UC.Description) <<
"\n";
503 template<
class SignatureInstanceType>
504 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::addWareDynaForText(
507 addSchedulingDetailsForText(Sign,OutStm);
508 addDataDetailsForText(Sign,OutStm);
509 addGraphDetailsForText(Sign,OutStm);
517 template<
class SignatureInstanceType>
518 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::addWareDynaForText(
529 template<
class SignatureInstanceType>
530 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::writeToStreamAsText(std::ostream& OutStm,
531 bool WithErrors)
const
535 for (
auto& Plug : m_SearchResults.availablePlugins())
537 if (Plug->Verified && Plug->Signature)
541 OutStm <<
"================================================================================\n";
545 const auto Sign = Plug->Signature;
547 OutStm << getIndentedText(1,Sign->
ID) <<
"\n";
549 OutStm << getIndentedText(2,
"File",Plug->FileFullPath) <<
"\n";
550 addWareMetaForText(Sign,OutStm);
553 OutStm << getIndentedText(2,
"Version",Sign->
Version) <<
"\n";
554 OutStm << getIndentedText(2,
"SDK version used at build time",Sign->
BuildInfo.
SDKVersion) <<
"\n";
555 OutStm << getIndentedText(2,
"Build information") <<
"\n";
563 getIndentedText(3,
"Compiler version",
567 getIndentedText(3,
"Compilation flags",
572 OutStm << getIndentedText(2,
"Author(s)",getAuthorsAsString(Sign->
Authors)) <<
"\n";
573 addWareDynaForText(Sign,OutStm);
577 if (WithErrors && !m_SearchResults.erroredFiles().empty())
581 OutStm <<
"================================================================================\n";
585 for (
auto& EFile : m_SearchResults.erroredFiles())
588 OutStm <<
"Error on file " << EFile.first <<
": " << EFile.second <<
"\n";
598 template<
class SignatureInstanceType>
599 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::addErrorsToJSONDoc(
600 rapidjson::Document& Doc, rapidjson::Document::AllocatorType& Alloc)
const
602 rapidjson::Value Errors(rapidjson::kArrayType);
604 for (
auto& EFile : m_SearchResults.erroredFiles())
606 rapidjson::Value EObj(rapidjson::kObjectType);
607 EObj.AddMember(
"file_path",rapidjson::Value(EFile.first.c_str(),Alloc),Alloc);
608 EObj.AddMember(
"message",rapidjson::Value(EFile.second.c_str(),Alloc),Alloc);
609 Errors.PushBack(EObj,Alloc);
612 Doc.AddMember(
"errors",Errors,Alloc);
620 template<
class SignatureInstanceType>
621 std::string WarePluginsSearchResultsSerializer<SignatureInstanceType>::getJSONAsString(rapidjson::Document& Doc)
623 rapidjson::StringBuffer JSONbuffer;
624 rapidjson::PrettyWriter<rapidjson::StringBuffer> JSONwriter(JSONbuffer);
625 JSONwriter.SetIndent(
' ',2);
626 Doc.Accept(JSONwriter);
628 return JSONbuffer.GetString();
636 template<
class SignatureInstanceType>
637 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::writeListToStreamAsJSON(std::ostream& OutStm,
638 bool WithErrors)
const
640 rapidjson::Document JSON;
642 rapidjson::Document::AllocatorType& JSONalloc = JSON.GetAllocator();
644 rapidjson::Value Available(rapidjson::kArrayType);
646 for (
auto& Plug : m_SearchResults.availablePlugins())
648 if (Plug->Verified && Plug->Signature)
650 Available.PushBack(rapidjson::Value(Plug->Signature->ID.c_str(),JSONalloc),JSONalloc);
654 JSON.AddMember(
"available",Available,JSONalloc);
658 addErrorsToJSONDoc(JSON,JSONalloc);
662 OutStm << getJSONAsString(JSON) <<
"\n";
670 template<
class SignatureInstanceType>
671 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::addDataForJSON(
674 rapidjson::Value Obj(rapidjson::kObjectType);
675 Obj.AddMember(
"name",rapidjson::Value(Item.
DataName.c_str(),Alloc),Alloc);
676 Obj.AddMember(
"description",rapidjson::Value(Item.
Description.c_str(),Alloc),Alloc);
677 Obj.AddMember(
"si_unit",rapidjson::Value(Item.
DataUnit.c_str(),Alloc),Alloc);
678 Arr.PushBack(Obj,Alloc);
686 template<
class SignatureInstanceType>
687 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::addSpatialDataForJSON(
689 rapidjson::Value& Arr,rapidjson::Document::AllocatorType& Alloc)
const
691 rapidjson::Value Obj(rapidjson::kObjectType);
692 Obj.AddMember(
"name",rapidjson::Value(Item.
DataName.c_str(),Alloc),Alloc);
693 Obj.AddMember(
"units_class",rapidjson::Value(Item.
UnitsClass.c_str(),Alloc),Alloc);
694 Obj.AddMember(
"description",rapidjson::Value(Item.
Description.c_str(),Alloc),Alloc);
695 Obj.AddMember(
"si_unit",rapidjson::Value(Item.
DataUnit.c_str(),Alloc),Alloc);
696 Arr.PushBack(Obj,Alloc);
704 template<
class SignatureInstanceType>
705 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::addTypedSpatialDataForJSON(
707 rapidjson::Value& Arr,rapidjson::Document::AllocatorType& Alloc)
const
711 rapidjson::Value Obj(rapidjson::kObjectType);
712 Obj.AddMember(
"name",rapidjson::Value(Item.
DataName.c_str(),Alloc),Alloc);
713 Obj.AddMember(
"type",rapidjson::Value(TypeStr.c_str(),Alloc),Alloc);
714 Obj.AddMember(
"units_class",rapidjson::Value(Item.
UnitsClass.c_str(),Alloc),Alloc);
715 Obj.AddMember(
"description",rapidjson::Value(Item.
Description.c_str(),Alloc),Alloc);
716 Obj.AddMember(
"si_unit",rapidjson::Value(Item.
DataUnit.c_str(),Alloc),Alloc);
717 Arr.PushBack(Obj,Alloc);
725 template<
class SignatureInstanceType>
726 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::addDataDetailsForJSON(
728 rapidjson::Value& Obj,
729 rapidjson::Document::AllocatorType& Alloc)
const
733 rapidjson::Value ParamsObj(rapidjson::kObjectType);
735 rapidjson::Value ReqParamsArray(rapidjson::kArrayType);
738 addDataForJSON(Item,ReqParamsArray,Alloc);
741 rapidjson::Value UsedParamsArray(rapidjson::kArrayType);
744 addDataForJSON(Item,UsedParamsArray,Alloc);
747 ParamsObj.AddMember(
"required",ReqParamsArray,Alloc);
748 ParamsObj.AddMember(
"used",UsedParamsArray,Alloc);
749 Obj.AddMember(
"parameters",ParamsObj,Alloc);
754 rapidjson::Value AttrsObj(rapidjson::kObjectType);
756 rapidjson::Value ReqAttrsArray(rapidjson::kArrayType);
759 addSpatialDataForJSON(Item,ReqAttrsArray,Alloc);
762 rapidjson::Value UsedAttrsArray(rapidjson::kArrayType);
765 addSpatialDataForJSON(Item,UsedAttrsArray,Alloc);
768 rapidjson::Value ProdAttrsArray(rapidjson::kArrayType);
771 addSpatialDataForJSON(Item,ProdAttrsArray,Alloc);
774 AttrsObj.AddMember(
"required",ReqAttrsArray,Alloc);
775 AttrsObj.AddMember(
"used",UsedAttrsArray,Alloc);
776 AttrsObj.AddMember(
"produced",ProdAttrsArray,Alloc);
777 Obj.AddMember(
"attributes",AttrsObj,Alloc);
782 rapidjson::Value VarsObj(rapidjson::kObjectType);
784 rapidjson::Value ReqVarsArray(rapidjson::kArrayType);
787 addTypedSpatialDataForJSON(Item,ReqVarsArray,Alloc);
790 rapidjson::Value UsedVarsArray(rapidjson::kArrayType);
793 addTypedSpatialDataForJSON(Item,UsedVarsArray,Alloc);
796 rapidjson::Value UpVarsArray(rapidjson::kArrayType);
799 addTypedSpatialDataForJSON(Item,UpVarsArray,Alloc);
802 rapidjson::Value ProdVarsArray(rapidjson::kArrayType);
805 addTypedSpatialDataForJSON(Item,ProdVarsArray,Alloc);
808 VarsObj.AddMember(
"required",ReqVarsArray,Alloc);
809 VarsObj.AddMember(
"used",UsedVarsArray,Alloc);
810 VarsObj.AddMember(
"updated",UpVarsArray,Alloc);
811 VarsObj.AddMember(
"produced",ProdVarsArray,Alloc);
812 Obj.AddMember(
"variables",VarsObj,Alloc);
817 rapidjson::Value EvArray(rapidjson::kArrayType);
820 EvArray.PushBack(rapidjson::Value(Item.c_str(),Alloc),Alloc);
822 Obj.AddMember(
"events",EvArray,Alloc);
827 rapidjson::Value ExtraObj(rapidjson::kObjectType);
829 rapidjson::Value ReqExtraArray(rapidjson::kArrayType);
832 ReqExtraArray.PushBack(rapidjson::Value(Item.c_str(),Alloc),Alloc);
835 rapidjson::Value UsedExtraArray(rapidjson::kArrayType);
838 UsedExtraArray.PushBack(rapidjson::Value(Item.c_str(),Alloc),Alloc);
841 ExtraObj.AddMember(
"required",ReqExtraArray,Alloc);
842 ExtraObj.AddMember(
"used",UsedExtraArray,Alloc);
843 Obj.AddMember(
"extra_files",ExtraObj,Alloc);
851 template<
class SignatureInstanceType>
852 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::addGraphDetailsForJSON(
854 rapidjson::Value& Obj,rapidjson::Document::AllocatorType& Alloc)
const
858 rapidjson::Value ClassesArray(rapidjson::kArrayType);
861 rapidjson::Value ClassObj(rapidjson::kObjectType);
862 ClassObj.AddMember(
"class_name",rapidjson::Value(Class.UnitsClass.c_str(),Alloc),Alloc);
863 ClassObj.AddMember(
"description",rapidjson::Value(Class.Description.c_str(),Alloc),Alloc);
864 ClassesArray.PushBack(ClassObj,Alloc);
866 Obj.AddMember(
"units_classses",ClassesArray,Alloc);
874 template<
class SignatureInstanceType>
875 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::addWareDetailsForJSON(
877 rapidjson::Value& Obj, rapidjson::Document::AllocatorType& Alloc)
const
879 Obj.AddMember(
"domain",rapidjson::Value(Sign->
Domain.c_str(),Alloc),Alloc);
880 Obj.AddMember(
"process",rapidjson::Value(Sign->
Process.c_str(),Alloc),Alloc);
881 Obj.AddMember(
"method",rapidjson::Value(Sign->
Method.c_str(),Alloc),Alloc);
884 rapidjson::Value DataObj(rapidjson::kObjectType);
885 addDataDetailsForJSON(Sign,DataObj,Alloc);
886 Obj.AddMember(
"data",DataObj,Alloc);
889 rapidjson::Value SchedObj(rapidjson::kObjectType);
890 SchedObj.AddMember(
"type",rapidjson::Value(getSchedulingTypeAsString(Sign->
TimeScheduling.
Type).c_str(),Alloc),
894 Obj.AddMember(
"scheduling",SchedObj,Alloc);
897 rapidjson::Value GraphObj(rapidjson::kObjectType);
898 addGraphDetailsForJSON(Sign,GraphObj,Alloc);
899 Obj.AddMember(
"spatial_graph",GraphObj,Alloc);
907 template<
class SignatureInstanceType>
908 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::addWareDetailsForJSON(
911 rapidjson::Document::AllocatorType& )
const
921 template<
class SignatureInstanceType>
922 void WarePluginsSearchResultsSerializer<SignatureInstanceType>::writeToStreamAsJSON(std::ostream& OutStm,
923 bool WithErrors)
const
925 rapidjson::Document JSON;
927 rapidjson::Document::AllocatorType& JSONalloc = JSON.GetAllocator();
929 rapidjson::Value Available(rapidjson::kArrayType);
931 for (
auto& Plug : m_SearchResults.availablePlugins())
933 if (Plug->Verified && Plug->Signature)
935 const auto Sign = Plug->Signature;
937 rapidjson::Value WareObj(rapidjson::kObjectType);
938 WareObj.AddMember(
"id",rapidjson::Value(Sign->
ID.c_str(),JSONalloc),JSONalloc);
939 WareObj.AddMember(
"file_path",rapidjson::Value(Plug->FileFullPath.c_str(),JSONalloc),JSONalloc);
940 WareObj.AddMember(
"abi_version",rapidjson::Value(Sign->
BuildInfo.
SDKVersion.c_str(),JSONalloc),JSONalloc);
942 rapidjson::Value BuildObj(rapidjson::kObjectType);
943 BuildObj.AddMember(
"type",rapidjson::Value(Sign->
BuildInfo.
BuildType.c_str(),JSONalloc),JSONalloc);
944 BuildObj.AddMember(
"compiler_id",rapidjson::Value(Sign->
BuildInfo.
CompilerID.c_str(),JSONalloc),JSONalloc);
945 BuildObj.AddMember(
"compiler_version",
947 BuildObj.AddMember(
"compilation_flags",
949 WareObj.AddMember(
"build_info",BuildObj,JSONalloc);
951 WareObj.AddMember(
"name",rapidjson::Value(Sign->
Name.c_str(),JSONalloc),JSONalloc);
952 WareObj.AddMember(
"description",rapidjson::Value(Sign->
Description.c_str(),JSONalloc),JSONalloc);
953 WareObj.AddMember(
"version",rapidjson::Value(Sign->
Version.c_str(),JSONalloc),JSONalloc);
954 WareObj.AddMember(
"status",
956 JSONalloc),JSONalloc);
958 rapidjson::Value AuthsArray(rapidjson::kArrayType);
959 for (
auto& Author : Sign->
Authors)
961 rapidjson::Value AuthObj(rapidjson::kObjectType);
962 AuthObj.AddMember(
"name",rapidjson::Value(Author.first.c_str(),JSONalloc),JSONalloc);
963 AuthObj.AddMember(
"email",rapidjson::Value(Author.second.c_str(),JSONalloc),JSONalloc);
964 AuthsArray.PushBack(AuthObj,JSONalloc);
966 WareObj.AddMember(
"authors",AuthsArray,JSONalloc);
968 addWareDetailsForJSON(Sign,WareObj,JSONalloc);
970 Available.PushBack(WareObj,JSONalloc);
974 JSON.AddMember(
"available",Available,JSONalloc);
979 addErrorsToJSONDoc(JSON,JSONalloc);
983 OutStm << getJSONAsString(JSON) <<
"\n";
991 template<
class SignatureInstanceType>
993 const std::string& Format,
994 bool Detailed,
bool WithErrors)
const
996 if (Format ==
"text")
1000 writeToStreamAsText(OutStm,WithErrors);
1004 writeListToStreamAsText(OutStm,WithErrors);
1007 else if (Format ==
"json")
1011 writeToStreamAsJSON(OutStm,WithErrors);
1015 writeListToStreamAsJSON(OutStm,WithErrors);
1021 "Wrong format for available wares reporting");