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
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 void setMapObjectTypes(
const std::vector<Reading *>& data,
245 std::map<std::string, Reading*>& dataSuperSet);
247 void unsetMapObjectTypes(std::map<std::string, Reading*>& dataSuperSet)
const;
249 void setStaticData(std::vector<std::pair<std::string, std::string>> *staticData)
251 m_staticData = staticData;
254 void generateAFHierarchyPrefixLevel(
string& path,
string& prefix,
string& AFHierarchyLevel);
257 map<std::string, std::string> getNamesRules()
const {
return m_NamesRules; };
258 map<std::string, std::string> getMetadataRulesExist()
const {
return m_MetadataRulesExist; };
260 bool getAFMapEmptyNames()
const {
return m_AFMapEmptyNames; };
261 bool getAFMapEmptyMetadata()
const {
return m_AFMapEmptyMetadata; };
263 void setLegacyMode(
bool legacy) { m_legacy = legacy; };
265 static std::string ApplyPIServerNamingRulesObj(
const std::string &objName,
bool *changed);
266 static std::string ApplyPIServerNamingRulesPath(
const std::string &objName,
bool *changed);
267 static std::string ApplyPIServerNamingRulesInvalidChars(
const std::string &objName,
bool *changed);
269 static std::string variableValueHandle(
const Reading& reading, std::string &AFHierarchy);
270 static bool extractVariable(
string &strToHandle,
string &variable,
string &value,
string &defaultValue);
271 static void reportAsset(
const string& asset,
const string& level,
const string& msg);
279 const std::vector<std::pair<std::string, std::string>>
280 createMessageHeader(
const std::string& type,
const std::string& action=
"create")
const;
283 const std::string createTypeData(
const Reading& reading,
OMFHints *hints);
286 const std::string createContainerData(
const Reading& reading,
OMFHints *hints);
289 const std::string createStaticData(
const Reading& reading);
292 std::string createLinkData(
const Reading& reading, std::string& AFHierarchyLevel, std::string& prefix, std::string& objectPrefix,
OMFHints *hints,
bool legacy);
299 const std::string createMessageData(
Reading& reading);
302 void setAssetTypeTag(
const std::string& assetName,
303 const std::string& tagName,
306 void setAssetTypeTagNew(
const std::string& assetName,
307 const std::string& tagName,
311 bool handleDataTypes(
const string keyComplete,
313 bool skipSendingTypes,
OMFHints *hints);
319 bool getCreatedTypes(
const std::string& keyComplete,
const Reading& row,
OMFHints *hints);
322 unsigned long calcTypeShort(
const Reading& row);
325 void clearCreatedTypes();
328 void incrementTypeId();
331 bool handleTypeErrors(
const string& keyComplete,
const Reading& reading,
OMFHints*hints);
333 string errorMessageHandler(
const string &msg);
335 void handleRESTException(
const std::exception &e,
const char *mainMessage);
337 void CheckHttpCode(
const int httpCode,
const std::string &errorMessage);
339 std::string getExceptionMessage(
const std::exception &e,
OMFError *error);
342 std::string getAssetNameFromError(
const char* message);
345 long getAssetTypeId(
const std::string& assetName);
348 void incrementAssetTypeId(
const std::string& keyComplete);
349 void incrementAssetTypeIdOnly(
const std::string& keyComplete);
358 void clearCreatedTypes(
const std::string& keyComplete);
361 void setAFHierarchy();
363 bool handleAFHierarchy();
364 bool handleAFHierarchySystemWide();
365 bool handleOmfHintHierarchies();
367 bool sendAFHierarchy(std::string AFHierarchy);
369 bool sendAFHierarchyLevels(std::string parentPath, std::string path, std::string &lastLevel);
370 bool sendAFHierarchyTypes(
const std::string AFHierarchyLevel,
const std::string prefix);
371 bool sendAFHierarchyStatic(
const std::string AFHierarchyLevel,
const std::string prefix);
372 bool sendAFHierarchyLink(std::string parent, std::string child, std::string prefixIdParent, std::string prefixId);
374 bool manageAFHierarchyLink(std::string parent, std::string child, std::string prefixIdParent, std::string prefixId, std::string childFull,
string action);
376 bool AFHierarchySendMessage(
const std::string& msgType, std::string& jsonData,
const std::string& action=
"create");
379 std::string generateUniquePrefixId(
const std::string &path);
380 bool evaluateAFHierarchyRules(
const string& assetName,
const Reading& reading);
381 void retrieveAFHierarchyPrefixAssetName(
const string& assetName,
string& prefix,
string& AFHierarchyLevel);
382 void retrieveAFHierarchyFullPrefixAssetName(
const string& assetName,
string& prefix,
string& AFHierarchy);
384 bool createAFHierarchyOmfHint(
const string& assetName,
const string &OmfHintHierarchy);
386 bool HandleAFMapNames(Document& JSon);
387 bool HandleAFMapMetedata(Document& JSon);
390 bool sendBaseTypes();
402 unsigned char tTotal;
403 unsigned char tFloat;
404 unsigned char tString;
405 unsigned char spare0;
407 unsigned char spare1;
408 unsigned char spare2;
409 unsigned char spare3;
410 unsigned char spare4;
412 unsigned long valueLong = 0;
415 std::string m_assetName;
416 const std::string m_path;
418 const std::string m_producerToken;
419 OMF_ENDPOINT m_PIServerEndpoint;
420 NAMINGSCHEME_ENDPOINT m_NamingScheme;
421 std::string m_DefaultAFLocation;
422 bool m_sendFullStructure;
423 std::string m_delimiter;
424 std::string m_dataActionCode;
429 bool m_AFMapEmptyNames;
430 bool m_AFMapEmptyMetadata;
431 std::string m_AFHierarchyLevel;
432 std::string m_prefixAFAsset;
434 vector<std::string> m_afhHierarchyAlreadyCreated={
440 map<std::string, std::string> m_NamesRules={
446 map<std::string, std::string> m_MetadataRulesExist={
452 map<std::string, std::string> m_MetadataRulesNonExist={
458 map<std::string, vector<pair<string, string>>> m_MetadataRulesEqual={
464 map<std::string, vector<pair<string, string>>> m_MetadataRulesNotEqual={
470 map<std::string, vector<pair<string, string>>> m_AssetNamePrefix ={
478 std::map<const std::string, std::string> m_formatTypes {
479 {OMF_TYPE_STRING,
""},
480 {OMF_TYPE_INTEGER,
"int64"},
481 {OMF_TYPE_FLOAT,
"float64"},
482 {OMF_TYPE_UNSUPPORTED,
"unsupported"}
486 const std::vector<std::string> omfTypes = { OMF_TYPE_STRING,
489 OMF_TYPE_UNSUPPORTED};
497 std::vector<std::string> m_notBlockingErrors;
500 std::map<std::string, OMFDataTypes>* m_OMFDataTypes;
503 std::map<string, Reading*> m_SuperSetDataPoints;
508 std::vector<std::pair<std::string, std::string>> *m_staticData;
514 std::string m_OMFVersion;
519 bool m_linkedProperties;
527 std::unordered_map<std::string, LALookup>
539 static std::vector<std::string>
544 const std::string m_name;
549 bool m_baseTypesSent;
576 string measurementId,
578 const OMF_ENDPOINT PIServerEndpoint = ENDPOINT_CR,
579 const std::string& DefaultAFLocation = std::string(),
581 bool hasData() {
return m_hasData; };
An encapsulation of an error return from an OMF call.
Definition: omferror.h:21
The OMF class.
Definition: omf.h:109
Definition: asset_tracking.h:108
A set of hints for a reading.
Definition: OMFHint.h:151
An asset reading represented as a class.
Definition: reading.h:33
The OMFData class.
Definition: omf.h:571
Definition: http_sender.h:20
Buffer class designed to hold OMF payloads that can grow as required but have minimal copy semantics...
Definition: omfbuffer.h:24
Per asset dataTypes - This class is used in a std::map where assetName is a key.
Definition: omf.h:89