Repository: nifi-minifi-cpp
Updated Branches:
  refs/heads/master ed6dc27f6 -> 1c1f53ba5


MINFICIPP-568: Change resp to componentmanifest

MINIFICP-568: Add type for agent information

MINIFICPP-569: Break apart the different extensions in the c2 response

This closes #378.

Signed-off-by: Aldrin Piri <ald...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/repo
Commit: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/commit/1c1f53ba
Tree: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/tree/1c1f53ba
Diff: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/diff/1c1f53ba

Branch: refs/heads/master
Commit: 1c1f53ba5626ebfe0621a14bc6fa3c492949274a
Parents: ed6dc27
Author: Marc Parisi <phroc...@apache.org>
Authored: Sat Jul 21 20:52:56 2018 -0400
Committer: Aldrin Piri <ald...@apache.org>
Committed: Tue Jul 24 09:53:01 2018 -0400

----------------------------------------------------------------------
 CMakeLists.txt                                  |   2 -
 cmake/Extensions.cmake                          |   3 +-
 extensions/ExtensionHeader.txt                  |   2 +-
 extensions/civetweb/CMakeLists.txt              |   3 +-
 extensions/http-curl/CMakeLists.txt             |   5 +-
 libminifi/CMakeLists.txt                        |   1 +
 libminifi/include/agent/build_description.h     |  50 +--
 libminifi/include/core/ClassLoader.h            |  25 +-
 libminifi/include/core/Resource.h               |  11 +-
 libminifi/include/core/state/Value.h            |   5 +
 .../include/core/state/nodes/AgentInformation.h | 317 ++++++++++---------
 .../include/core/state/nodes/MetricsBase.h      |   1 -
 libminifi/src/c2/C2Agent.cpp                    |   3 +
 .../unit/PropertyValidationAgentInfoTests.cpp   |   4 +-
 14 files changed, 242 insertions(+), 190 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1177813..c996758 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -356,8 +356,6 @@ if (NOT DISABLE_CURL)
   add_subdirectory(LibExample)
 endif()
 
-
-
 get_property(selected_extensions GLOBAL PROPERTY EXTENSION-OPTIONS)
 
 if (NOT BUILD_IDENTIFIER)

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/cmake/Extensions.cmake
----------------------------------------------------------------------
diff --git a/cmake/Extensions.cmake b/cmake/Extensions.cmake
index b945f0b..05daeea 100644
--- a/cmake/Extensions.cmake
+++ b/cmake/Extensions.cmake
@@ -23,8 +23,9 @@ define_property(GLOBAL PROPERTY EXTENSION-OPTIONS
 set_property(GLOBAL PROPERTY EXTENSION-OPTIONS "")
 
 macro(register_extension extension-name)
-       get_property(extensions GLOBAL PROPERTY EXTENSION-OPTIONS)
+  get_property(extensions GLOBAL PROPERTY EXTENSION-OPTIONS)
   set_property(GLOBAL APPEND PROPERTY EXTENSION-OPTIONS ${extension-name})
+  target_compile_definitions(${extension-name} PRIVATE 
"MODULE_NAME=${extension-name}")
 endmacro()
 
 ### TESTING MACROS

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/extensions/ExtensionHeader.txt
----------------------------------------------------------------------
diff --git a/extensions/ExtensionHeader.txt b/extensions/ExtensionHeader.txt
index 8deafa5..328e3be 100644
--- a/extensions/ExtensionHeader.txt
+++ b/extensions/ExtensionHeader.txt
@@ -23,4 +23,4 @@ cmake_minimum_required(VERSION 2.6)
 set(CMAKE_EXE_LINKER_FLAGS "-Wl,--export-all-symbols")
 set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-symbols")
 
-include_directories(../../libminifi/include  ../../libminifi/include/core/yaml 
 ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include 
../../thirdparty/concurrentqueue 
../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include 
${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/)
\ No newline at end of file
+include_directories(../../libminifi/include  ../../libminifi/include/core/yaml 
 ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include 
../../thirdparty/concurrentqueue 
../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include 
${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/)

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/extensions/civetweb/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/extensions/civetweb/CMakeLists.txt 
b/extensions/civetweb/CMakeLists.txt
index 470a231..755cbf8 100644
--- a/extensions/civetweb/CMakeLists.txt
+++ b/extensions/civetweb/CMakeLists.txt
@@ -17,8 +17,7 @@
 # under the License.
 #
 
-set(CMAKE_EXE_LINKER_FLAGS "-Wl,--export-all-symbols")
-set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-symbols")
+include(${CMAKE_SOURCE_DIR}/extensions/ExtensionHeader.txt)
 
 include_directories(${CMAKE_SOURCE_DIR}/libminifi/include
                     ${CMAKE_SOURCE_DIR}/libminifi/include/core

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/extensions/http-curl/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/extensions/http-curl/CMakeLists.txt 
b/extensions/http-curl/CMakeLists.txt
index 14d4193..9d2d816 100644
--- a/extensions/http-curl/CMakeLists.txt
+++ b/extensions/http-curl/CMakeLists.txt
@@ -63,10 +63,7 @@ endif()
 
 find_package(CURL REQUIRED)
 
-set(CMAKE_EXE_LINKER_FLAGS "-Wl,--export-all-symbols")
-set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-symbols")
-
-include_directories(../../libminifi/include  ../../libminifi/include/core/yaml 
 ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include 
../../thirdparty/concurrentqueue 
../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include 
${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/)
+include(${CMAKE_SOURCE_DIR}/extensions/ExtensionHeader.txt)
 include_directories(protocols client processors sitetosite)
 
 file(GLOB SOURCES  "*.cpp" "protocols/*.cpp" "client/*.cpp" "processors/*.cpp" 
"sitetosite/*.cpp")

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/libminifi/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/libminifi/CMakeLists.txt b/libminifi/CMakeLists.txt
index f7f3e93..54a9801 100644
--- a/libminifi/CMakeLists.txt
+++ b/libminifi/CMakeLists.txt
@@ -25,6 +25,7 @@ set(PROJECT_VERSION_MAJOR 0)
 set(PROJECT_VERSION_MINOR 5)
 set(PROJECT_VERSION_PATCH 0)
 
+
 #### Establish Project Configuration ####
 # Enable usage of the VERSION specifier
 set(CMAKE_CXX_STANDARD 11)

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/libminifi/include/agent/build_description.h
----------------------------------------------------------------------
diff --git a/libminifi/include/agent/build_description.h 
b/libminifi/include/agent/build_description.h
index b653b93..b46dde5 100644
--- a/libminifi/include/agent/build_description.h
+++ b/libminifi/include/agent/build_description.h
@@ -51,45 +51,45 @@ struct Components {
 class BuildDescription {
  public:
 
-  static struct Components getClassDescriptions() {
-    static struct Components classes;
-    if (UNLIKELY(IsNullOrEmpty(classes.processors_) && 
IsNullOrEmpty(classes.controller_services_))) {
-      for (auto clazz : 
core::ClassLoader::getDefaultClassLoader().getClasses()) {
-
+  static struct Components getClassDescriptions(const std::string group = 
"default") {
+    static std::map<std::string, struct Components> class_mappings;
+    if (UNLIKELY(IsNullOrEmpty(class_mappings[group].processors_) && 
IsNullOrEmpty(class_mappings[group].processors_))) {
+      for (auto clazz : 
core::ClassLoader::getDefaultClassLoader().getClasses(group)) {
+        std::string class_name = clazz;
         auto lastOfIdx = clazz.find_last_of("::");
         if (lastOfIdx != std::string::npos) {
           lastOfIdx++;  // if a value is found, increment to move beyond the .
           int nameLength = clazz.length() - lastOfIdx;
-          std::string class_name = clazz.substr(lastOfIdx, nameLength);
-
-          auto obj = 
core::ClassLoader::getDefaultClassLoader().instantiate(class_name, class_name);
+          class_name = clazz.substr(lastOfIdx, nameLength);
+        }
+        auto obj = 
core::ClassLoader::getDefaultClassLoader().instantiate(class_name, class_name);
 
-          std::shared_ptr<core::ConfigurableComponent> component = 
std::dynamic_pointer_cast<core::ConfigurableComponent>(obj);
+        std::shared_ptr<core::ConfigurableComponent> component = 
std::dynamic_pointer_cast<core::ConfigurableComponent>(obj);
 
-          ClassDescription description(clazz);
-          if (nullptr != component) {
+        ClassDescription description(clazz);
+        if (nullptr != component) {
 
-            bool is_processor = 
std::dynamic_pointer_cast<core::Processor>(obj) != nullptr;
-            bool is_controller_service = LIKELY(is_processor == true) ? false 
: std::dynamic_pointer_cast<core::controller::ControllerService>(obj) != 
nullptr;
+          bool is_processor = std::dynamic_pointer_cast<core::Processor>(obj) 
!= nullptr;
+          bool is_controller_service = LIKELY(is_processor == true) ? false : 
std::dynamic_pointer_cast<core::controller::ControllerService>(obj) != nullptr;
 
-            component->initialize();
-            description.class_properties_ = component->getProperties();
-            description.support_dynamic_ = 
component->supportsDynamicProperties();
-            if (is_processor) {
-              classes.processors_.emplace_back(description);
-            } else if (is_controller_service) {
-              classes.controller_services_.emplace_back(description);
-            } else {
-              classes.other_components_.emplace_back(description);
-            }
+          component->initialize();
+          description.class_properties_ = component->getProperties();
+          description.support_dynamic_ = 
component->supportsDynamicProperties();
+          if (is_processor) {
+            class_mappings[group].processors_.emplace_back(description);
+          } else if (is_controller_service) {
+            
class_mappings[group].controller_services_.emplace_back(description);
+          } else {
+            class_mappings[group].other_components_.emplace_back(description);
           }
         }
       }
     }
-    return classes;
+    return class_mappings[group];
   }
 
-};
+}
+;
 
 } /* namespace minifi */
 } /* namespace nifi */

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/libminifi/include/core/ClassLoader.h
----------------------------------------------------------------------
diff --git a/libminifi/include/core/ClassLoader.h 
b/libminifi/include/core/ClassLoader.h
index 6c17493..b1ecaf8 100644
--- a/libminifi/include/core/ClassLoader.h
+++ b/libminifi/include/core/ClassLoader.h
@@ -224,6 +224,27 @@ class ClassLoader {
     std::lock_guard<std::mutex> lock(internal_mutex_);
 
     loaded_factories_.insert(std::make_pair(name, std::move(factory)));
+
+  }
+
+  /**
+   * Register a class with the give ProcessorFactory
+   */
+  void registerClass(const std::string &group, const std::string &name, 
std::unique_ptr<ObjectFactory> factory) {
+    if (loaded_factories_.find(name) != loaded_factories_.end()) {
+      return;
+    }
+
+    std::lock_guard<std::mutex> lock(internal_mutex_);
+
+    module_mapping_[group].push_back(factory->getName());
+
+    loaded_factories_.insert(std::make_pair(name, std::move(factory)));
+  }
+
+  std::vector<std::string> getClasses(const std::string &group) {
+    std::lock_guard<std::mutex> lock(internal_mutex_);
+    return module_mapping_[group];
   }
 
   std::vector<std::string> getGroups() {
@@ -242,7 +263,7 @@ class ClassLoader {
       if (nullptr != resource.second) {
         auto classes = resource.second->getClassNames();
         groups.insert(groups.end(), classes.begin(), classes.end());
-      }else{
+      } else {
       }
     }
     return groups;
@@ -286,6 +307,8 @@ class ClassLoader {
 
  protected:
 
+  std::map<std::string, std::vector<std::string>> module_mapping_;
+
   std::map<std::string, std::unique_ptr<ObjectFactory>> loaded_factories_;
 
   std::mutex internal_mutex_;

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/libminifi/include/core/Resource.h
----------------------------------------------------------------------
diff --git a/libminifi/include/core/Resource.h 
b/libminifi/include/core/Resource.h
index 8bb7c97..0dc6723 100644
--- a/libminifi/include/core/Resource.h
+++ b/libminifi/include/core/Resource.h
@@ -26,13 +26,22 @@ namespace nifi {
 namespace minifi {
 namespace core {
 
+
+#define MKSOC(x) #x
+#define MAKESTRING(x) MKSOC(x)
+
+
 template<class T>
 class StaticClassType {
  public:
 
   StaticClassType(const std::string &name) {
     // Notify when the static member is created
-    ClassLoader::getDefaultClassLoader().registerClass(name, 
std::unique_ptr<ObjectFactory>(new DefautObjectFactory<T>()));
+#ifdef MODULE_NAME
+    
ClassLoader::getDefaultClassLoader().registerClass(MAKESTRING(MODULE_NAME), 
name, std::unique_ptr<ObjectFactory>(new DefautObjectFactory<T>()));
+#else
+    ClassLoader::getDefaultClassLoader().registerClass("default", name, 
std::unique_ptr<ObjectFactory>(new DefautObjectFactory<T>()));
+#endif
   }
 };
 

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/libminifi/include/core/state/Value.h
----------------------------------------------------------------------
diff --git a/libminifi/include/core/state/Value.h 
b/libminifi/include/core/state/Value.h
index 5abe9a3..f4a92ad 100644
--- a/libminifi/include/core/state/Value.h
+++ b/libminifi/include/core/state/Value.h
@@ -194,12 +194,17 @@ class ValueNode {
 struct SerializedResponseNode {
   std::string name;
   ValueNode value;
+  bool array;
+
+  SerializedResponseNode() : array(false){
+  }
 
   std::vector<SerializedResponseNode> children;
   SerializedResponseNode &operator=(const SerializedResponseNode &other) {
     name = other.name;
     value = other.value;
     children = other.children;
+    array = other.array;
     return *this;
   }
 };

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/libminifi/include/core/state/nodes/AgentInformation.h
----------------------------------------------------------------------
diff --git a/libminifi/include/core/state/nodes/AgentInformation.h 
b/libminifi/include/core/state/nodes/AgentInformation.h
index 8ca8954..5797ed8 100644
--- a/libminifi/include/core/state/nodes/AgentInformation.h
+++ b/libminifi/include/core/state/nodes/AgentInformation.h
@@ -58,6 +58,160 @@ namespace response {
 
 #define GROUP_STR "org::apache::nifi::minifi"
 
+
+class ComponentManifest : public DeviceInformation {
+ public:
+  ComponentManifest(std::string name, uuid_t uuid)
+      : DeviceInformation(name, uuid) {
+  }
+
+  ComponentManifest(const std::string &name)
+      : DeviceInformation(name, 0) {
+  }
+
+  std::string getName() const {
+    return CoreComponent::getName();
+  }
+
+  std::vector<SerializedResponseNode> serialize() {
+    std::vector<SerializedResponseNode> serialized;
+    SerializedResponseNode resp;
+    resp.name = "componentManifest";
+    struct Components group = 
BuildDescription::getClassDescriptions(getName());
+    serializeClassDescription(group.processors_, "processors", resp);
+    serializeClassDescription(group.controller_services_, 
"controllerServices", resp);
+    serialized.push_back(resp);
+    return serialized;
+  }
+ protected:
+
+  void serializeClassDescription(const std::vector<ClassDescription> 
&descriptions, const std::string name, SerializedResponseNode &response) {
+    if (!descriptions.empty()) {
+      SerializedResponseNode type;
+      type.name = name;
+      type.array = true;
+      std::vector<SerializedResponseNode> serialized;
+      for (auto group : descriptions) {
+
+        SerializedResponseNode desc;
+        desc.name = group.class_name_;
+
+        SerializedResponseNode bgroup;
+        bgroup.name = "group";
+        bgroup.value = GROUP_STR;
+        SerializedResponseNode artifact;
+        artifact.name = "artifact";
+        artifact.value = group.class_name_;
+
+        SerializedResponseNode className;
+        className.name = "type";
+        className.value = group.class_name_;
+
+        SerializedResponseNode version;
+        version.name = "version";
+        version.value = AgentBuild::VERSION;
+
+        if (!group.class_properties_.empty()) {
+          SerializedResponseNode props;
+          props.name = "propertyDescriptors";
+          for (auto && prop : group.class_properties_) {
+
+            SerializedResponseNode child;
+            child.name = prop.first;
+
+            SerializedResponseNode descriptorName;
+            descriptorName.name = "name";
+            descriptorName.value = prop.first;
+
+            SerializedResponseNode descriptorDescription;
+            descriptorDescription.name = "description";
+            descriptorDescription.value = prop.second.getDescription();
+
+            SerializedResponseNode descriptorRequired;
+            descriptorRequired.name = "required";
+            descriptorRequired.value = prop.second.getRequired();
+
+            SerializedResponseNode descriptorDependentProperties;
+            descriptorDependentProperties.name = "dependentProperties";
+
+            for (const auto &propName : prop.second.getDependentProperties()) {
+              SerializedResponseNode descriptorDependentProperty;
+              descriptorDependentProperty.name = propName;
+              
descriptorDependentProperties.children.push_back(descriptorDependentProperty);
+            }
+
+            SerializedResponseNode descriptorExclusiveOfProperties;
+            descriptorExclusiveOfProperties.name = "exclusiveOfProperties";
+
+            for (const auto &exclusiveProp : 
prop.second.getExclusiveOfProperties()) {
+              SerializedResponseNode descriptorExclusiveOfProperty;
+              descriptorExclusiveOfProperty.name = exclusiveProp.first;
+              descriptorExclusiveOfProperty.value = exclusiveProp.second;
+              
descriptorExclusiveOfProperties.children.push_back(descriptorExclusiveOfProperty);
+            }
+
+            child.children.push_back(descriptorName);
+            child.children.push_back(descriptorDescription);
+            child.children.push_back(descriptorRequired);
+            child.children.push_back(descriptorDependentProperties);
+            child.children.push_back(descriptorExclusiveOfProperties);
+
+            props.children.push_back(child);
+          }
+
+          desc.children.push_back(props);
+        }
+
+        SerializedResponseNode dyn_prop;
+        dyn_prop.name = "supportsDynamicProperties";
+        dyn_prop.value = group.support_dynamic_;
+
+        desc.children.push_back(dyn_prop);
+
+        desc.children.push_back(bgroup);
+        desc.children.push_back(artifact);
+        desc.children.push_back(className);
+        desc.children.push_back(version);
+
+        SerializedResponseNode buildInfo;
+        buildInfo.name = "buildInfo";
+
+        SerializedResponseNode build_version;
+        build_version.name = "version";
+        build_version.value = AgentBuild::VERSION;
+
+        SerializedResponseNode build_rev;
+        build_rev.name = "revision";
+        build_rev.value = AgentBuild::BUILD_REV;
+
+        SerializedResponseNode build_date;
+        build_date.name = "timestamp";
+        build_date.value = (uint64_t) std::stoull(AgentBuild::BUILD_DATE);
+
+        SerializedResponseNode compiler_command;
+        compiler_command.name = "compiler";
+        compiler_command.value = AgentBuild::COMPILER;
+
+        SerializedResponseNode compiler_flags;
+        compiler_flags.name = "flags";
+        compiler_flags.value = AgentBuild::COMPILER_FLAGS;
+
+        buildInfo.children.push_back(compiler_flags);
+        buildInfo.children.push_back(compiler_command);
+
+        buildInfo.children.push_back(build_version);
+        buildInfo.children.push_back(build_rev);
+        buildInfo.children.push_back(build_date);
+        desc.children.push_back(buildInfo);
+        type.children.push_back(desc);
+      }
+      response.children.push_back(type);
+    }
+
+  }
+};
+
+
 class Bundles : public DeviceInformation {
  public:
   Bundles(std::string name, uuid_t uuid)
@@ -94,6 +248,12 @@ class Bundles : public DeviceInformation {
       bundle.children.push_back(bgroup);
       bundle.children.push_back(artifact);
       bundle.children.push_back(version);
+
+      ComponentManifest compMan(group, nullptr);
+      // serialize the component information.
+      for (auto component : compMan.serialize()) {
+        bundle.children.push_back(component);
+      }
       serialized.push_back(bundle);
     }
 
@@ -192,7 +352,7 @@ class AgentStatus : public StateMonitorNode {
 class AgentIdentifier {
  public:
 
-  AgentIdentifier(){
+  AgentIdentifier() {
 
   }
 
@@ -200,7 +360,7 @@ class AgentIdentifier {
     identifier_ = identifier;
   }
 
-  void setAgentClass(const std::string &agentClass){
+  void setAgentClass(const std::string &agentClass) {
     agent_class_ = agentClass;
   }
 
@@ -231,151 +391,6 @@ class AgentMonitor {
   std::shared_ptr<state::StateMonitor> monitor_;
 };
 
-class ComponentManifest : public DeviceInformation {
- public:
-  ComponentManifest(std::string name, uuid_t uuid)
-      : DeviceInformation(name, uuid) {
-  }
-
-  ComponentManifest(const std::string &name)
-      : DeviceInformation(name, 0) {
-  }
-
-  std::string getName() const {
-    return "componentManifest";
-  }
-
-  std::vector<SerializedResponseNode> serialize() {
-    std::vector<SerializedResponseNode> serialized;
-    struct Components group = BuildDescription::getClassDescriptions();
-    serializeClassDescription(group.processors_, "processors", serialized);
-    serializeClassDescription(group.controller_services_, 
"controllerServices", serialized);
-    return serialized;
-  }
- protected:
-
-  void serializeClassDescription(const std::vector<ClassDescription> 
&descriptions, const std::string name, std::vector<SerializedResponseNode> 
&response) {
-    SerializedResponseNode resp;
-    resp.name = " resp";
-    if (!descriptions.empty()) {
-
-      SerializedResponseNode type;
-      type.name = name;
-
-      for (auto group : descriptions) {
-
-        SerializedResponseNode desc;
-        desc.name = group.class_name_;
-
-        SerializedResponseNode bgroup;
-        bgroup.name = "group";
-        bgroup.value = GROUP_STR;
-        SerializedResponseNode artifact;
-        artifact.name = "artifact";
-        artifact.value = group.class_name_;
-        SerializedResponseNode version;
-        version.name = "version";
-        version.value = AgentBuild::VERSION;
-
-        if (!group.class_properties_.empty()) {
-          SerializedResponseNode props;
-          props.name = "propertyDescriptors";
-          for (auto && prop : group.class_properties_) {
-
-            SerializedResponseNode child;
-            child.name = prop.first;
-
-            SerializedResponseNode descriptorName;
-            descriptorName.name = "name";
-            descriptorName.value = prop.first;
-
-            SerializedResponseNode descriptorDescription;
-            descriptorDescription.name = "description";
-            descriptorDescription.value = prop.second.getDescription();
-
-            SerializedResponseNode descriptorRequired;
-            descriptorRequired.name = "required";
-            descriptorRequired.value = prop.second.getRequired();
-
-            SerializedResponseNode descriptorDependentProperties;
-            descriptorDependentProperties.name = "dependentProperties";
-
-            for (const auto &propName : prop.second.getDependentProperties()) {
-              SerializedResponseNode descriptorDependentProperty;
-              descriptorDependentProperty.name = propName;
-              
descriptorDependentProperties.children.push_back(descriptorDependentProperty);
-            }
-
-            SerializedResponseNode descriptorExclusiveOfProperties;
-            descriptorExclusiveOfProperties.name = "exclusiveOfProperties";
-
-            for (const auto &exclusiveProp : 
prop.second.getExclusiveOfProperties()) {
-              SerializedResponseNode descriptorExclusiveOfProperty;
-              descriptorExclusiveOfProperty.name = exclusiveProp.first;
-              descriptorExclusiveOfProperty.value = exclusiveProp.second;
-              
descriptorExclusiveOfProperties.children.push_back(descriptorExclusiveOfProperty);
-            }
-
-            child.children.push_back(descriptorName);
-            child.children.push_back(descriptorDescription);
-            child.children.push_back(descriptorRequired);
-            child.children.push_back(descriptorDependentProperties);
-            child.children.push_back(descriptorExclusiveOfProperties);
-
-            props.children.push_back(child);
-          }
-
-          desc.children.push_back(props);
-        }
-
-        SerializedResponseNode dyn_prop;
-        dyn_prop.name = "supportsDynamicProperties";
-        dyn_prop.value = group.support_dynamic_;
-
-        desc.children.push_back(dyn_prop);
-
-        desc.children.push_back(bgroup);
-        desc.children.push_back(artifact);
-        desc.children.push_back(version);
-
-        SerializedResponseNode buildInfo;
-        buildInfo.name = "buildInfo";
-
-        SerializedResponseNode build_version;
-        build_version.name = "version";
-        build_version.value = AgentBuild::VERSION;
-
-        SerializedResponseNode build_rev;
-        build_rev.name = "revision";
-        build_rev.value = AgentBuild::BUILD_REV;
-
-        SerializedResponseNode build_date;
-        build_date.name = "timestamp";
-        build_date.value = (uint64_t)std::stoull(AgentBuild::BUILD_DATE);
-
-        SerializedResponseNode compiler_command;
-        compiler_command.name = "compiler";
-        compiler_command.value = AgentBuild::COMPILER;
-
-        SerializedResponseNode compiler_flags;
-        compiler_flags.name = "flags";
-        compiler_flags.value = AgentBuild::COMPILER_FLAGS;
-
-        buildInfo.children.push_back(compiler_flags);
-        buildInfo.children.push_back(compiler_command);
-
-        buildInfo.children.push_back(build_version);
-        buildInfo.children.push_back(build_rev);
-        buildInfo.children.push_back(build_date);
-        desc.children.push_back(buildInfo);
-        type.children.push_back(desc);
-      }
-      resp.children.push_back(type);
-    }
-    response.push_back(resp);
-
-  }
-};
 
 /**
  * Justification and Purpose: Provides available extensions for the agent 
information block.
@@ -428,7 +443,7 @@ class AgentManifest : public DeviceInformation {
 
     SerializedResponseNode build_date;
     build_date.name = "timestamp";
-    build_date.value = (uint64_t)std::stoull(AgentBuild::BUILD_DATE);
+    build_date.value = (uint64_t) std::stoull(AgentBuild::BUILD_DATE);
 
     SerializedResponseNode compiler_command;
     compiler_command.name = "compiler";
@@ -455,7 +470,7 @@ class AgentManifest : public DeviceInformation {
       serialized.push_back(bundle);
     }
 
-    ComponentManifest compMan("componentManifest", nullptr);
+    ComponentManifest compMan("default", nullptr);
     // serialize the component information.
     for (auto component : compMan.serialize()) {
       serialized.push_back(component);
@@ -473,10 +488,12 @@ class AgentInformation : public DeviceInformation, public 
AgentMonitor, public A
 
   AgentInformation(std::string name, uuid_t uuid)
       : DeviceInformation(name, uuid) {
+    setArray(false);
   }
 
   AgentInformation(const std::string &name)
       : DeviceInformation(name, 0) {
+    setArray(false);
   }
 
   std::string getName() const {
@@ -525,7 +542,7 @@ class AgentInformation : public DeviceInformation, public 
AgentMonitor, public A
   void serializeClass(const std::vector<ClassDescription> &processors, const 
std::vector<ClassDescription> &controller_services, const 
std::vector<ClassDescription> &other_components,
                       std::vector<SerializedResponseNode> &response) {
     SerializedResponseNode resp;
-    resp.name = " resp";
+    resp.name = "componentManifest";
     if (!processors.empty()) {
       SerializedResponseNode type;
       type.name = "Processors";

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/libminifi/include/core/state/nodes/MetricsBase.h
----------------------------------------------------------------------
diff --git a/libminifi/include/core/state/nodes/MetricsBase.h 
b/libminifi/include/core/state/nodes/MetricsBase.h
index 323b6cd..6e5aaf6 100644
--- a/libminifi/include/core/state/nodes/MetricsBase.h
+++ b/libminifi/include/core/state/nodes/MetricsBase.h
@@ -51,7 +51,6 @@ class ResponseNode : public core::Connectable {
   virtual ~ResponseNode() {
 
   }
-  virtual std::string getName() const = 0;
 
   virtual std::vector<SerializedResponseNode> serialize() = 0;
 

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/libminifi/src/c2/C2Agent.cpp
----------------------------------------------------------------------
diff --git a/libminifi/src/c2/C2Agent.cpp b/libminifi/src/c2/C2Agent.cpp
index cb7e0f4..2514906 100644
--- a/libminifi/src/c2/C2Agent.cpp
+++ b/libminifi/src/c2/C2Agent.cpp
@@ -269,6 +269,9 @@ void C2Agent::serializeMetrics(C2Payload &metric_payload, 
const std::string &nam
   for (auto metric : metrics) {
     if (metric.children.size() > 0) {
       C2Payload child_metric_payload(metric_payload.getOperation());
+      if (metric.array) {
+        child_metric_payload.setContainer(true);
+      }
       child_metric_payload.setLabel(metric.name);
       serializeMetrics(child_metric_payload, metric.name, metric.children, 
is_container);
       metric_payload.addPayload(std::move(child_metric_payload));

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/1c1f53ba/libminifi/test/unit/PropertyValidationAgentInfoTests.cpp
----------------------------------------------------------------------
diff --git a/libminifi/test/unit/PropertyValidationAgentInfoTests.cpp 
b/libminifi/test/unit/PropertyValidationAgentInfoTests.cpp
index a7b297d..61fc95f 100644
--- a/libminifi/test/unit/PropertyValidationAgentInfoTests.cpp
+++ b/libminifi/test/unit/PropertyValidationAgentInfoTests.cpp
@@ -26,7 +26,7 @@
 #include "core/ClassLoader.h"
 
 TEST_CASE("Test Required", "[required]") {
-  minifi::state::response::ComponentManifest manifest("PutFile");
+  minifi::state::response::ComponentManifest manifest("default");
   auto serialized = manifest.serialize();
   REQUIRE(serialized.size() > 0);
   const auto &resp = serialized[0];
@@ -45,7 +45,7 @@ TEST_CASE("Test Required", "[required]") {
 }
 
 TEST_CASE("Test Dependent", "[dependent]") {
-  minifi::state::response::ComponentManifest manifest("manifest");
+  minifi::state::response::ComponentManifest manifest("default");
   auto serialized = manifest.serialize();
   REQUIRE(serialized.size() > 0);
   const auto &resp = serialized[0];

Reply via email to