implemented Template::toJson
authorVictor Kirhenshtein <victor@netxms.org>
Fri, 19 May 2017 19:54:52 +0000 (22:54 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Fri, 19 May 2017 19:54:52 +0000 (22:54 +0300)
12 files changed:
include/nms_util.h
src/libnetxms/json.cpp
src/libnetxms/stringlist.cpp
src/server/core/dcitem.cpp
src/server/core/dcithreshold.cpp
src/server/core/dcobject.cpp
src/server/core/dctable.cpp
src/server/core/dctcolumn.cpp
src/server/core/dctthreshold.cpp
src/server/core/template.cpp
src/server/include/nms_dcoll.h
src/server/include/nms_objects.h

index 378becd..f8a0b05 100644 (file)
@@ -881,20 +881,24 @@ public:
 #else
        void addMBString(const char *value) { add(value); }
 #endif
+   void addAll(const StringList *src);
+   void merge(const StringList *src, bool matchCase);
+   void splitAndAdd(const TCHAR *src, const TCHAR *separator);
+   void remove(int index);
        void clear();
+
+   void sort(bool ascending = true, bool caseSensitive = false);
+
        int size() const { return m_count; }
        const TCHAR *get(int index) const { return ((index >=0) && (index < m_count)) ? m_values[index] : NULL; }
        int indexOf(const TCHAR *value) const;
        bool contains(const TCHAR *value) const { return indexOf(value) != -1; }
        int indexOfIgnoreCase(const TCHAR *value) const;
    bool containsIgnoreCase(const TCHAR *value) const { return indexOfIgnoreCase(value) != -1; }
-       void remove(int index);
-   void addAll(const StringList *src);
-   void merge(const StringList *src, bool matchCase);
    TCHAR *join(const TCHAR *separator);
-   void splitAndAdd(const TCHAR *src, const TCHAR *separator);
-   void sort(bool ascending = true, bool caseSensitive = false);
+
    void fillMessage(NXCPMessage *msg, UINT32 baseId, UINT32 countId);
+   json_t *toJson() const;
 };
 
 /**
@@ -1353,10 +1357,19 @@ public:
  * Create JSON string from wide character string
  */
 json_t LIBNETXMS_EXPORTABLE *json_string_w(const WCHAR *s);
+
+/**
+ * Create JSON string with null check
+ */
+inline json_t *json_string_a(const char *s)
+{
+   return (s != NULL) ? json_string(s) : json_null();
+}
+
 #ifdef UNICODE
 #define json_string_t json_string_w
 #else
-#define json_string_t json_string
+#define json_string_t json_string_a
 #endif
 
 /**
@@ -1376,8 +1389,15 @@ template<typename T> json_t LIBNETXMS_EXPORTABLE *json_integer_array(const T *va
 template<typename T> json_t *json_object_array(ObjectArray<T> *a)
 {
    json_t *root = json_array();
-   for(int i = 0; i < a->size(); i++)
-      json_array_append_new(root, a->get(i)->toJson());
+   if (a != NULL)
+   {
+      for(int i = 0; i < a->size(); i++)
+      {
+         T *e = a->get(i);
+         if (e != NULL)
+            json_array_append_new(root, e->toJson());
+      }
+   }
    return root;
 }
 
index 81cb01f..b236bff 100644 (file)
@@ -27,6 +27,8 @@
  */
 json_t LIBNETXMS_EXPORTABLE *json_string_w(const WCHAR *s)
 {
+   if (s == NULL)
+      return json_null();
    char *us = UTF8StringFromWideString(s);
    json_t *js = json_string(us);
    free(us);
index 0a1e396..9d4460a 100644 (file)
@@ -387,3 +387,16 @@ void StringList::fillMessage(NXCPMessage *msg, UINT32 baseId, UINT32 countId)
       msg->setField(fieldId++, CHECK_NULL_EX(m_values[i]));
    }
 }
+
+/**
+ * Serialize to JSON
+ */
+json_t *StringList::toJson() const
+{
+   json_t *root = json_array();
+   for(int i = 0; i < m_count; i++)
+   {
+      json_array_append_new(root, json_string_t(CHECK_NULL_EX(m_values[i])));
+   }
+   return root;
+}
index 978b98e..d6e17d2 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2016 Victor Kirhenshtein
+** Copyright (C) 2003-2017 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -1773,3 +1773,23 @@ DCObject *DCItem::clone()
 {
    return new DCItem(this);
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *DCItem::toJson()
+{
+   json_t *root = DCObject::toJson();
+   json_object_set_new(root, "deltaCalculation", json_integer(m_deltaCalculation));
+   json_object_set_new(root, "dataType", json_integer(m_dataType));
+   json_object_set_new(root, "sampleCount", json_integer(m_sampleCount));
+   json_object_set_new(root, "thresholds", json_object_array(m_thresholds));
+   json_object_set_new(root, "prevRawValue", json_string_t(m_prevRawValue));
+   json_object_set_new(root, "prevValueTimeStamp", json_integer(m_tPrevValueTimeStamp));
+   json_object_set_new(root, "baseUnits", json_integer(m_nBaseUnits));
+   json_object_set_new(root, "multiplier", json_integer(m_nMultiplier));
+   json_object_set_new(root, "customUnitName", json_string_t(m_customUnitName));
+   json_object_set_new(root, "snmpRawValueType", json_integer(m_snmpRawValueType));
+   json_object_set_new(root, "predictionEngine", json_string_t(m_predictionEngine));
+   return root;
+}
index 121c9da..ce1124b 100644 (file)
@@ -821,6 +821,30 @@ void Threshold::createNXMPRecord(String &str, int index)
    str.append(_T("\t\t\t\t\t\t</threshold>\n"));
 }
 
+/**
+ * Serialize to JSON
+ */
+json_t *Threshold::toJson() const
+{
+   json_t *root = json_object();
+   json_object_set_new(root, "id", json_integer(m_id));
+   json_object_set_new(root, "targetId", json_integer(m_targetId));
+   json_object_set_new(root, "eventCode", json_integer(m_eventCode));
+   json_object_set_new(root, "rearmEventCode", json_integer(m_rearmEventCode));
+   json_object_set_new(root, "value", json_string_t(m_value));
+   json_object_set_new(root, "function", json_integer(m_function));
+   json_object_set_new(root, "operation", json_integer(m_operation));
+   json_object_set_new(root, "dataType", json_integer(m_dataType));
+   json_object_set_new(root, "currentSeverity", json_integer(m_currentSeverity));
+   json_object_set_new(root, "sampleCount", json_integer(m_sampleCount));
+   json_object_set_new(root, "script", json_string_t(CHECK_NULL_EX(m_scriptSource)));
+   json_object_set_new(root, "isReached", json_boolean(m_isReached));
+   json_object_set_new(root, "numMatches", json_integer(m_numMatches));
+   json_object_set_new(root, "repeatInterval", json_integer(m_repeatInterval));
+   json_object_set_new(root, "lastEventTimestamp", json_integer(m_lastEventTimestamp));
+   return root;
+}
+
 /**
  * Make an association with DCI (used by management pack parser)
  */
index 63f3289..42343ce 100644 (file)
@@ -1250,6 +1250,43 @@ void DCObject::setInstanceFilter(const TCHAR *pszScript)
    }
 }
 
+/**
+ * Serialize object to JSON
+ */
+json_t *DCObject::toJson()
+{
+   json_t *root = json_object();
+   json_object_set_new(root, "id", json_integer(m_id));
+   json_object_set_new(root, "guid", m_guid.toJson());
+   json_object_set_new(root, "name", json_string_t(m_name));
+   json_object_set_new(root, "description", json_string_t(m_description));
+   json_object_set_new(root, "systemTag", json_string_t(m_systemTag));
+   json_object_set_new(root, "lastPoll", json_integer(m_tLastPoll));
+   json_object_set_new(root, "pollingInterval", json_integer(m_iPollingInterval));
+   json_object_set_new(root, "retentionTime", json_integer(m_iRetentionTime));
+   json_object_set_new(root, "source", json_integer(m_source));
+   json_object_set_new(root, "status", json_integer(m_status));
+   json_object_set_new(root, "busy", json_integer(m_busy));
+   json_object_set_new(root, "scheduledForDeletion", json_integer(m_scheduledForDeletion));
+   json_object_set_new(root, "flags", json_integer(m_flags));
+   json_object_set_new(root, "dwTemplateId", json_integer(m_dwTemplateId));
+   json_object_set_new(root, "dwTemplateItemId", json_integer(m_dwTemplateItemId));
+   json_object_set_new(root, "schedules", (m_schedules != NULL) ? m_schedules->toJson() : json_array());
+   json_object_set_new(root, "lastCheck", json_integer(m_tLastCheck));
+   json_object_set_new(root, "errorCount", json_integer(m_dwErrorCount));
+   json_object_set_new(root, "resourceId", json_integer(m_dwResourceId));
+   json_object_set_new(root, "sourceNode", json_integer(m_sourceNode));
+   json_object_set_new(root, "snmpPort", json_integer(m_snmpPort));
+   json_object_set_new(root, "perfTabSettings", json_string_t(m_pszPerfTabSettings));
+   json_object_set_new(root, "transformationScript", json_string_t(m_transformationScriptSource));
+   json_object_set_new(root, "comments", json_string_t(m_comments));
+   json_object_set_new(root, "instanceDiscoveryMethod", json_integer(m_instanceDiscoveryMethod));
+   json_object_set_new(root, "instanceDiscoveryData", json_string_t(m_instanceDiscoveryData));
+   json_object_set_new(root, "instanceFilter", json_string_t(m_instanceFilterSource));
+   json_object_set_new(root, "instance", json_string_t(m_instance));
+   return root;
+}
+
 /**
  * Data collection object info - constructor
  */
index 090a282..9dc90d2 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2016 Victor Kirhenshtein
+** Copyright (C) 2003-2017 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -1138,3 +1138,14 @@ DCObject *DCTable::clone()
 {
    return new DCTable(this);
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *DCTable::toJson()
+{
+   json_t *root = DCObject::toJson();
+   json_object_set_new(root, "columns", json_object_array(m_columns));
+   json_object_set_new(root, "thresholds", json_object_array(m_thresholds));
+   return root;
+}
index 6ca7338..965b70e 100644 (file)
@@ -148,3 +148,16 @@ void DCTableColumn::createNXMPRecord(String &str, int id)
                                                                  (const TCHAR *)EscapeStringForXML2(CHECK_NULL_EX(m_displayName)),
                           (m_snmpOid != NULL) ? (const TCHAR *)m_snmpOid->toString() : _T(""), (int)m_flags);
 }
+
+/**
+ * Serialize to JSON
+ */
+json_t *DCTableColumn::toJson() const
+{
+   json_t *root = json_object();
+   json_object_set_new(root, "name", json_string_t(m_name));
+   json_object_set_new(root, "displayName", json_string_t(m_displayName));
+   json_object_set_new(root, "snmpOid", (m_snmpOid != NULL) ? json_string_t(m_snmpOid->toString()) : json_null());
+   json_object_set_new(root, "flags", json_integer(m_flags));
+   return root;
+}
index 91b1a41..59482b3 100644 (file)
@@ -229,6 +229,18 @@ bool DCTableCondition::check(Table *value, int row)
    return result;
 }
 
+/**
+ * Serialize to JSON
+ */
+json_t *DCTableCondition::toJson() const
+{
+   json_t *root = json_object();
+   json_object_set_new(root, "column", json_string_t(m_column));
+   json_object_set_new(root, "operation", json_integer(m_operation));
+   json_object_set_new(root, "value", json_string_t(m_value));
+   return root;
+}
+
 /**
  * Condition group constructor
  */
@@ -317,6 +329,16 @@ UINT32 DCTableConditionGroup::fillMessage(NXCPMessage *msg, UINT32 baseId)
    return varId;
 }
 
+/**
+ * Serialize to JSON
+ */
+json_t *DCTableConditionGroup::toJson() const
+{
+   json_t *root = json_object();
+   json_object_set_new(root, "conditions", json_object_array(m_conditions));
+   return root;
+}
+
 /**
  * Check if condition group is true
  */
@@ -663,6 +685,20 @@ void DCTableThreshold::createNXMPRecord(String &str, int id)
    str += _T("\t\t\t\t\t\t\t</groups>\n\t\t\t\t\t\t</threshold>\n");
 }
 
+/**
+ * Serialize object to JSON
+ */
+json_t *DCTableThreshold::toJson() const
+{
+   json_t *root = json_object();
+   json_object_set_new(root, "id", json_integer(m_id));
+   json_object_set_new(root, "groups", json_object_array(m_groups));
+   json_object_set_new(root, "activationEvent", json_integer(m_activationEvent));
+   json_object_set_new(root, "deactivationEvent", json_integer(m_deactivationEvent));
+   json_object_set_new(root, "sampleCount", json_integer(m_sampleCount));
+   return root;
+}
+
 /**
  * Callback for cloning threshld instances
  */
index b158235..dceb1a2 100644 (file)
@@ -1365,3 +1365,16 @@ void Template::updateFromImport(ConfigEntry *config)
 
    queueUpdate();
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *Template::toJson()
+{
+   json_t *root = NetObj::toJson();
+   json_object_set_new(root, "dcObjects", json_object_array(m_dcObjects));
+   json_object_set_new(root, "version", json_integer(m_dwVersion));
+   json_object_set_new(root, "flags", json_integer(m_flags));
+   json_object_set_new(root, "applyFilter", json_string_t(m_applyFilterSource));
+   return root;
+}
index 7f2fc21..df9e739 100644 (file)
@@ -164,6 +164,7 @@ public:
    BOOL compare(Threshold *pThr);
 
    void createNXMPRecord(String &str, int index);
+   json_t *toJson() const;
 
        void associate(DCItem *pItem);
        void setFunction(int nFunc) { m_function = nFunc; }
@@ -304,6 +305,7 @@ public:
 
    virtual void getEventList(IntegerArray<UINT32> *eventList) = 0;
    virtual void createExportRecord(String &str) = 0;
+   virtual json_t *toJson();
 
    NXSL_Value *createNXSLObject();
 
@@ -419,6 +421,7 @@ public:
 
    virtual void getEventList(IntegerArray<UINT32> *eventList);
    virtual void createExportRecord(String &str);
+   virtual json_t *toJson();
 
        int getThresholdCount() const { return (m_thresholds != NULL) ? m_thresholds->size() : 0; }
        BOOL enumThresholds(BOOL (* pfCallback)(Threshold *, UINT32, void *), void *pArg);
@@ -459,6 +462,7 @@ public:
    bool isInstanceColumn() { return (m_flags & TCF_INSTANCE_COLUMN) != 0; }
 
    void createNXMPRecord(String &str, int id);
+   json_t *toJson() const;
 };
 
 /**
@@ -490,6 +494,8 @@ public:
    const TCHAR *getColumn() { return m_column; }
    int getOperation() { return m_operation; }
    const TCHAR *getValue() { return m_value.getString(); }
+
+   json_t *toJson() const;
 };
 
 /**
@@ -510,6 +516,7 @@ public:
    bool check(Table *value, int row);
 
    UINT32 fillMessage(NXCPMessage *msg, UINT32 baseId);
+   json_t *toJson() const;
 
    ObjectArray<DCTableCondition> *getConditions() { return m_conditions; }
 };
@@ -568,6 +575,7 @@ public:
    bool saveToDatabase(DB_HANDLE hdb, UINT32 tableId, int seq);
    UINT32 fillMessage(NXCPMessage *msg, UINT32 baseId);
    void createNXMPRecord(String &str, int id);
+   json_t *toJson() const;
 
    UINT32 getId() const { return m_id; }
    UINT32 getActivationEvent() const { return m_activationEvent; }
@@ -626,6 +634,7 @@ public:
 
    virtual void getEventList(IntegerArray<UINT32> *eventList);
    virtual void createExportRecord(String &str);
+   virtual json_t *toJson();
 
        void fillLastValueMessage(NXCPMessage *msg);
    void fillLastValueSummaryMessage(NXCPMessage *pMsg, UINT32 dwId);
index eb8f54a..2d1efd4 100644 (file)
@@ -774,6 +774,8 @@ public:
    virtual bool deleteFromDatabase(DB_HANDLE hdb);
    virtual bool loadFromDatabase(DB_HANDLE hdb, UINT32 id);
 
+   virtual json_t *toJson();
+
    virtual void calculateCompoundStatus(BOOL bForcedRecalc = FALSE);
 
    UINT32 getFlags() const { return m_flags; }