fixed agent crash if Java plugin returns null value for table cell; correct columns...
authorVictor Kirhenshtein <victor@netxms.org>
Thu, 21 Jul 2016 13:10:37 +0000 (16:10 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Thu, 21 Jul 2016 13:10:37 +0000 (16:10 +0300)
src/agent/subagents/java/SubAgent.cpp
src/agent/subagents/java/main.cpp
src/agent/subagents/ubntlw/pom.xml

index 4e3b122..49ad49c 100644 (file)
@@ -1,7 +1,7 @@
 /* 
  ** Java-Bridge NetXMS subagent
  ** Copyright (c) 2013 TEMPEST a.s.
- ** Copyright (c) 2015 Raden Solutions SIA
+ ** Copyright (c) 2015-2016 Raden Solutions SIA
  **
  ** 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
@@ -468,8 +468,11 @@ LONG SubAgent::tableHandler(const TCHAR *param, const TCHAR *id, Table *value)
                   for(jsize j = 0; j < columns; j++)
                   {
                      jstring s = reinterpret_cast<jstring>(curEnv->GetObjectArrayElement(row, j));
-                     value->setPreallocated(j, CStringFromJavaString(curEnv, s));
-                     curEnv->DeleteLocalRef(s);
+                     if (s != NULL)
+                     {
+                        value->setPreallocated(j, CStringFromJavaString(curEnv, s));
+                        curEnv->DeleteLocalRef(s);
+                     }
                   }
                   curEnv->DeleteLocalRef(row);
                }
index d83e026..e5c12b7 100644 (file)
 #define CLASSPATH_SEPARATOR   _T(':')
 #endif
 
+/**
+ * Java table info
+ */
+struct JavaTableInfo
+{
+   TCHAR *key;
+   NETXMS_SUBAGENT_TABLE *definition;
+};
+
 /**
  * JVM instance
  */
@@ -112,12 +121,21 @@ static LONG ListHandler(const TCHAR *cmd, const TCHAR *id, StringList *value, Ab
 /**
  * Handler for table parameters
  */
-static LONG TableHandler(const TCHAR *cmd, const TCHAR *id, Table *value, AbstractCommSession *session)
+static LONG TableHandler(const TCHAR *cmd, const TCHAR *arg, Table *value, AbstractCommSession *session)
 {
    if (s_subAgent == NULL)
       return SYSINFO_RC_ERROR;
 
-   LONG rc = s_subAgent->tableHandler(cmd, id, value);
+   // Prepare result table using column infor provided during initialization
+   const JavaTableInfo *info = (const JavaTableInfo *)arg;
+   NETXMS_SUBAGENT_TABLE_COLUMN *columns = info->definition->columns;
+   int count = info->definition->numColumns;
+   for(int i = 0; i < count; i++)
+   {
+      value->addColumn(columns[i].name, columns[i].dataType, columns[i].displayName, columns[i].isInstance);
+   }
+
+   LONG rc = s_subAgent->tableHandler(cmd, info->key, value);
    s_jvm->DetachCurrentThread();
    return rc;
 }
@@ -200,7 +218,7 @@ static NX_CFG_TEMPLATE s_configTemplate[] =
 };
 
 /**
- * Sabagent information
+ * Subagent information
  */
 static NETXMS_SUBAGENT_INFO s_subagentInfo =
 {
@@ -209,7 +227,7 @@ static NETXMS_SUBAGENT_INFO s_subagentInfo =
    NETXMS_VERSION_STRING,
    SubAgentInit,
    SubAgentShutdown,
-   NULL,                         // BOOL (*commandhandler)(UINT32 dwCommand, NXCPMessage *pRequest, NXCPMessage *pResponse, void *session)
+   NULL,                         // BOOL (*commandHandler)(UINT32 dwCommand, NXCPMessage *pRequest, NXCPMessage *pResponse, void *session)
    0,                            // numParamaters
    NULL,                         // parameters
    0,                            // numLists
@@ -300,7 +318,10 @@ static void AddContributionItems()
       s_subagentInfo.tables = (NETXMS_SUBAGENT_TABLE *)calloc(s_subagentInfo.numTables, sizeof(NETXMS_SUBAGENT_TABLE));
       for(int i = 1, j = 0; j < (int)s_subagentInfo.numTables; j++)
       {
-         s_subagentInfo.tables[j].arg = _tcsdup(tables->get(i++));
+         JavaTableInfo *tableInfo = new JavaTableInfo();
+         tableInfo->key = _tcsdup(tables->get(i++));
+         tableInfo->definition = &s_subagentInfo.tables[j];
+         s_subagentInfo.tables[j].arg = (const TCHAR *)tableInfo;
          nx_strncpy(s_subagentInfo.tables[j].name, tables->get(i++), MAX_PARAM_NAME);
          nx_strncpy(s_subagentInfo.tables[j].description, tables->get(i++), MAX_DB_STRING);
          s_subagentInfo.tables[j].handler = TableHandler;
index 264c5d6..ece0cbb 100644 (file)
@@ -4,7 +4,7 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.rfelements</groupId>
     <artifactId>ubntlw</artifactId>
-    <version>2.0.3</version>
+    <version>2.1-M1</version>
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>