15 #include <unordered_map>
17 #include <http_sender.h>
19 #include <rapidjson/document.h>
20 #include <omfbuffer.h>
22 #include <linkedlookup.h>
24 #define OMF_HINT "OMFHint"
26 #define PIWEBAPI_PIPOINTS_NOT_CREATED "One or more PI Points could not be created."
27 #define PIWEBAPI_CONTAINER_NOT_FOUND "Container not found."
28 #define PIWEBAPI_UPDATE_EXCEPTION "An exception occurred while updating data."
29 #define MESSAGE_PI_UNSTABLE "HTTP Code %d: Processing cannot continue until data archive errors are corrected"
30 #define MESSAGE_UNAUTHORIZED "OMF endpoint reported we are not authorized, please check configuration of the authentication method and credentials"
32 const char *
const noConnectionErrorMessages[] =
33 {
"Failed to send data: Operation canceled",
34 "Failed to send data: Connection refused",
35 "Failed to send data: Host not found",
36 "Failed to send data: Network is unreachable",
42 #define EDS_OMF_VERSION "1.0"
43 #define CR_OMF_VERSION "1.0"
46 #define TYPE_ID_DEFAULT 1
47 #define FAKE_ASSET_KEY "_default_start_id_"
48 #define OMF_TYPE_STRING "string"
49 #define OMF_TYPE_INTEGER "integer"
50 #define OMF_TYPE_FLOAT "number"
51 #define OMF_TYPE_UNSUPPORTED "unsupported"
62 enum NAMINGSCHEME_ENDPOINT {
66 NAMINGSCHEME_COMPATIBILITY
71 using namespace rapidjson;
73 std::string ApplyPIServerNamingRules(
const std::string &objName,
bool *changed);
74 std::string DataPointNamesAsString(
const Reading& reading);
94 unsigned long typesShort;
98 string afHierarchyOrig;
100 unsigned short hintChkSum;
116 OMF(
const std::string& name,
118 const std::string& path,
120 const std::string& producerToken);
122 OMF(
const std::string& name,
124 const std::string& path,
125 std::map<std::string, OMFDataTypes>& types,
126 const std::string& producerToken);
131 void setOMFVersion(std::string& omfversion)
133 m_OMFVersion = omfversion;
134 if (omfversion.compare(
"1.0") == 0
135 || omfversion.compare(
"1.1") == 0)
137 m_linkedProperties =
false;
141 m_linkedProperties =
true;
164 uint32_t sendToServer(
const std::vector<Reading>& readings,
165 bool skipSentDataTypes =
true);
168 uint32_t sendToServer(
const std::vector<Reading *>& readings,
169 bool compression,
bool skipSentDataTypes =
true);
172 uint32_t sendToServer(
const Reading& reading,
173 bool skipSentDataTypes =
true);
176 uint32_t sendToServer(
const Reading* reading,
177 bool skipSentDataTypes =
true);
180 void setFormatType(
const std::string &key, std::string &value);
183 void setPIServerEndpoint(
const OMF_ENDPOINT PIServerEndpoint);
186 void setNamingScheme(
const NAMINGSCHEME_ENDPOINT namingScheme) {m_NamingScheme = namingScheme;};
189 std::string generateMeasurementId(
const string& assetName);
192 std::string generateSuffixType(
string &assetName,
long typeId);
195 long getNamingScheme(
const string& assetName);
197 string getHashStored(
const string& assetName);
198 string getPathStored(
const string& assetName);
199 string getPathOrigStored(
const string& assetName);
200 bool setPathStored(
const string& assetName,
string &afHierarchy);
201 bool deleteAssetAFH(
const string& assetName,
string& path);
202 bool createAssetAFH(
const string& assetName,
string& path);
205 void setDefaultAFLocation(
const std::string &DefaultAFLocation);
207 bool setAFMap(
const std::string &AFMap);
209 void setSendFullStructure(
const bool sendFullStructure) {m_sendFullStructure = sendFullStructure;};
211 void setPrefixAFAsset(
const std::string &prefixAFAsset);
213 void setDelimiter(
const std::string &delimiter) {m_delimiter = delimiter;};
215 void setDataActionCode(
const std::string &actionCode) {m_dataActionCode = actionCode;};
218 std::string getFormatType(
const std::string &key)
const;
222 void setNotBlockingErrors(std::vector<std::string>& );
225 std::string compress_string(
const std::string& str,
226 int compressionlevel = Z_DEFAULT_COMPRESSION);
229 const long getTypeId()
const {
return m_typeId; };
232 bool isDataTypeError(
const char* message);
235 bool isPIstable() {
return m_PIstable; };
238 bool isPIconnected() {
return m_connected; };
241 void setPIconnected(
bool connectionStatus) { m_connected = connectionStatus; };
244 std::size_t getNumBlocks() {
return m_numBlocks; };
245 void setNumBlocks(std::size_t numBlocks) { m_numBlocks = numBlocks; };
248 void setMapObjectTypes(
const std::vector<Reading *>& data,
249 std::map<std::string, Reading*>& dataSuperSet);
251 void unsetMapObjectTypes(std::map<std::string, Reading*>& dataSuperSet)
const;
253 void setStaticData(std::vector<std::pair<std::string, std::string>> *staticData)
255 m_staticData = staticData;
258 void generateAFHierarchyPrefixLevel(
string& path,
string& prefix,
string& AFHierarchyLevel);
261 map<std::string, std::string> getNamesRules()
const {
return m_NamesRules; };
262 map<std::string, std::string> getMetadataRulesExist()
const {
return m_MetadataRulesExist; };
264 bool getAFMapEmptyNames()
const {
return m_AFMapEmptyNames; };
265 bool getAFMapEmptyMetadata()
const {
return m_AFMapEmptyMetadata; };
267 void setLegacyMode(
bool legacy) { m_legacy = legacy; };
269 static std::string ApplyPIServerNamingRulesObj(
const std::string &objName,
bool *changed);
270 static std::string ApplyPIServerNamingRulesPath(
const std::string &objName,
bool *changed);
271 static std::string ApplyPIServerNamingRulesInvalidChars(
const std::string &objName,
bool *changed);
273 static std::string variableValueHandle(
const Reading& reading, std::string &AFHierarchy);
274 static bool extractVariable(
string &strToHandle,
string &variable,
string &value,
string &defaultValue);
275 static void reportAsset(
const string& asset,
const string& level,
const string& msg);
283 const std::vector<std::pair<std::string, std::string>>
284 createMessageHeader(
const std::string& type,
const std::string& action=
"create")
const;
287 const std::string createTypeData(
const Reading& reading,
OMFHints *hints);
290 const std::string createContainerData(
const Reading& reading,
OMFHints *hints);
293 const std::string createStaticData(
const Reading& reading);
296 std::string createLinkData(
const Reading& reading, std::string& AFHierarchyLevel, std::string& prefix, std::string& objectPrefix,
OMFHints *hints,
bool legacy);
303 const std::string createMessageData(
Reading& reading);
306 void setAssetTypeTag(
const std::string& assetName,
307 const std::string& tagName,
310 void setAssetTypeTagNew(
const std::string& assetName,
311 const std::string& tagName,
315 bool handleDataTypes(
const string keyComplete,
317 bool skipSendingTypes,
OMFHints *hints);
323 bool getCreatedTypes(
const std::string& keyComplete,
const Reading& row,
OMFHints *hints);
326 unsigned long calcTypeShort(
const Reading& row);
329 void clearCreatedTypes();
332 void incrementTypeId();
335 bool handleTypeErrors(
const string& keyComplete,
const Reading& reading,
OMFHints*hints);
337 string errorMessageHandler(
const string &msg);
339 void handleRESTException(
const std::exception &e,
const char *mainMessage);
341 void CheckHttpCode(
const int httpCode,
const std::string &errorMessage);
343 std::string getExceptionMessage(
const std::exception &e,
OMFError *error);
346 std::string getAssetNameFromError(
const char* message);
349 long getAssetTypeId(
const std::string& assetName);
352 void incrementAssetTypeId(
const std::string& keyComplete);
353 void incrementAssetTypeIdOnly(
const std::string& keyComplete);
362 void clearCreatedTypes(
const std::string& keyComplete);
365 void setAFHierarchy();
367 bool handleAFHierarchy();
368 bool handleAFHierarchySystemWide();
369 bool handleOmfHintHierarchies();
371 bool sendAFHierarchy(std::string AFHierarchy);
373 bool sendAFHierarchyLevels(std::string parentPath, std::string path, std::string &lastLevel);
374 bool sendAFHierarchyTypes(
const std::string AFHierarchyLevel,
const std::string prefix);
375 bool sendAFHierarchyStatic(
const std::string AFHierarchyLevel,
const std::string prefix);
376 bool sendAFHierarchyLink(std::string parent, std::string child, std::string prefixIdParent, std::string prefixId);
378 bool manageAFHierarchyLink(std::string parent, std::string child, std::string prefixIdParent, std::string prefixId, std::string childFull,
string action);
380 bool AFHierarchySendMessage(
const std::string& msgType, std::string& jsonData,
const std::string& action=
"create");
383 std::string generateUniquePrefixId(
const std::string &path);
384 bool evaluateAFHierarchyRules(
const string& assetName,
const Reading& reading);
385 void retrieveAFHierarchyPrefixAssetName(
const string& assetName,
string& prefix,
string& AFHierarchyLevel);
386 void retrieveAFHierarchyFullPrefixAssetName(
const string& assetName,
string& prefix,
string& AFHierarchy);
388 bool createAFHierarchyOmfHint(
const string& assetName,
const string &OmfHintHierarchy);
390 bool HandleAFMapNames(Document& JSon);
391 bool HandleAFMapMetedata(Document& JSon);
394 bool sendBaseTypes();
395 bool sendFledgeAssetType();
407 unsigned char tTotal;
408 unsigned char tFloat;
409 unsigned char tString;
410 unsigned char spare0;
412 unsigned char spare1;
413 unsigned char spare2;
414 unsigned char spare3;
415 unsigned char spare4;
417 unsigned long valueLong = 0;
420 std::string m_assetName;
421 const std::string m_path;
423 const std::string m_producerToken;
424 OMF_ENDPOINT m_PIServerEndpoint;
425 NAMINGSCHEME_ENDPOINT m_NamingScheme;
426 std::string m_DefaultAFLocation;
427 bool m_sendFullStructure;
428 std::string m_delimiter;
429 std::string m_dataActionCode;
434 bool m_AFMapEmptyNames;
435 bool m_AFMapEmptyMetadata;
436 std::string m_AFHierarchyLevel;
437 std::string m_prefixAFAsset;
439 vector<std::string> m_afhHierarchyAlreadyCreated={
445 map<std::string, std::string> m_NamesRules={
451 map<std::string, std::string> m_MetadataRulesExist={
457 map<std::string, std::string> m_MetadataRulesNonExist={
463 map<std::string, vector<pair<string, string>>> m_MetadataRulesEqual={
469 map<std::string, vector<pair<string, string>>> m_MetadataRulesNotEqual={
475 map<std::string, vector<pair<string, string>>> m_AssetNamePrefix ={
483 std::map<const std::string, std::string> m_formatTypes {
484 {OMF_TYPE_STRING,
""},
485 {OMF_TYPE_INTEGER,
"int64"},
486 {OMF_TYPE_FLOAT,
"float64"},
487 {OMF_TYPE_UNSUPPORTED,
"unsupported"}
491 const std::vector<std::string> omfTypes = { OMF_TYPE_STRING,
494 OMF_TYPE_UNSUPPORTED};
502 std::vector<std::string> m_notBlockingErrors;
505 std::map<std::string, OMFDataTypes>* m_OMFDataTypes;
508 std::map<string, Reading*> m_SuperSetDataPoints;
513 std::vector<std::pair<std::string, std::string>> *m_staticData;
519 std::string m_OMFVersion;
524 bool m_linkedProperties;
532 std::unordered_map<std::string, LALookup>
544 static std::vector<std::string>
549 const std::string m_name;
554 bool m_baseTypesSent;
570 std::size_t m_numBlocks;
586 string measurementId,
588 const OMF_ENDPOINT PIServerEndpoint = ENDPOINT_CR,
589 const std::string& DefaultAFLocation = std::string(),
591 bool hasData() {
return m_hasData; };