add name assignment config

Change-Id: I7a67759c50ed9986a8bcf6db814c372a0ee418d5
diff --git a/src/ca-module.cpp b/src/ca-module.cpp
index fed30aa..b41efac 100644
--- a/src/ca-module.cpp
+++ b/src/ca-module.cpp
@@ -31,6 +31,7 @@
 #include <ndn-cxx/security/verification-helpers.hpp>
 #include <ndn-cxx/util/io.hpp>
 #include <ndn-cxx/util/random.hpp>
+#include <name-assignments/assignment-funcs.hpp>
 
 namespace ndn {
 namespace ndncert {
@@ -50,6 +51,10 @@
   m_storage = CaStorage::createCaStorage(storageType, m_config.m_caItem.m_caPrefix, "");
   random::generateSecureBytes(m_requestIdGenKey, 32);
   registerPrefix();
+  if (!m_config.m_nameAssignmentFunc) {
+      m_config.m_nameAssignmentFunc =
+              NameAssignmentFuncFactory::createNameAssignmentFuncFactory("random")->getFunction("");
+  }
 }
 
 CaModule::~CaModule()
@@ -186,20 +191,14 @@
   // process PROBE requests: collect probe parameters
   auto parameters = PROBE::decodeApplicationParameters(request.getApplicationParameters());
   std::vector<PartialName> availableComponents;
-  if (m_config.m_nameAssignmentFunc) {
-    try {
-      availableComponents = m_config.m_nameAssignmentFunc(parameters);
-    }
-    catch (const std::exception& e) {
-      _LOG_TRACE("Cannot parse probe parameters: " << e.what());
-      m_face.put(generateErrorDataPacket(request.getName(), ErrorCode::INVALID_PARAMETER,
-                                         "Cannot parse probe parameters: " + std::string(e.what())));
-      return;
-    }
+  try {
+    availableComponents = m_config.m_nameAssignmentFunc(parameters);
   }
-  else {
-    // if there is no app-specified name lookup, use a random name id
-    availableComponents.push_back(std::to_string(random::generateSecureWord64()));
+  catch (const std::exception& e) {
+    _LOG_TRACE("Cannot parse probe parameters: " << e.what());
+    m_face.put(generateErrorDataPacket(request.getName(), ErrorCode::INVALID_PARAMETER,
+            "Cannot parse probe parameters: " + std::string(e.what())));
+    return;
   }
   std::vector<Name> availableNames;
   for (const auto& component : availableComponents) {
diff --git a/src/configuration.cpp b/src/configuration.cpp
index 10fe352..5bad3bb 100644
--- a/src/configuration.cpp
+++ b/src/configuration.cpp
@@ -22,6 +22,7 @@
 #include "challenge-module.hpp"
 #include <ndn-cxx/util/io.hpp>
 #include <boost/filesystem.hpp>
+#include <name-assignments/assignment-funcs.hpp>
 
 namespace ndn {
 namespace ndncert {
@@ -147,6 +148,31 @@
       m_redirection->push_back(caCert);
     }
   }
+  //parse name assignment if appears
+  m_nameAssignmentFunc = nullptr;
+  auto nameAssignmentItems = configJson.get_child_optional(CONFIG_NAME_ASSIGNMENT);
+  if (nameAssignmentItems) {
+    std::vector<NameAssignmentFunc> funcs;
+    for (const auto item : *nameAssignmentItems) {
+        auto factory = NameAssignmentFuncFactory::createNameAssignmentFuncFactory(item.first);
+        if (!factory) {
+            BOOST_THROW_EXCEPTION(std::runtime_error("Invalid assignment factory type"));
+        }
+        try {
+            funcs.push_back(factory->getFunction(item.second.data()));
+        } catch (const std::exception& e) {
+            BOOST_THROW_EXCEPTION(std::runtime_error("Error on creating function"));
+        }
+    }
+    if (funcs.size() < 1) {
+        BOOST_THROW_EXCEPTION(std::runtime_error("Empty assignment body supplied"));
+    } else if (funcs.size() == 1) {
+        m_nameAssignmentFunc = funcs[0];
+    } else {
+        //TODO "or" all the name function together as all suggestions
+        m_nameAssignmentFunc = funcs[0];
+    }
+  }
 }
 
 void
diff --git a/src/name-assignments/assignment-funcs.cpp b/src/name-assignments/assignment-funcs.cpp
index f67e8b0..6e7f008 100644
--- a/src/name-assignments/assignment-funcs.cpp
+++ b/src/name-assignments/assignment-funcs.cpp
@@ -38,7 +38,7 @@
 }
 
 unique_ptr<NameAssignmentFuncFactory>
-NameAssignmentFuncFactory::createNameAssignmentFuncFactories(const std::string& challengeType)
+NameAssignmentFuncFactory::createNameAssignmentFuncFactory(const std::string& challengeType)
 {
   FuncFactoryFactory& factory = getFactory();
   auto i = factory.find(challengeType);
diff --git a/src/name-assignments/assignment-funcs.hpp b/src/name-assignments/assignment-funcs.hpp
index e42299c..bef3de1 100644
--- a/src/name-assignments/assignment-funcs.hpp
+++ b/src/name-assignments/assignment-funcs.hpp
@@ -47,7 +47,7 @@
   isChallengeSupported(const std::string& challengeType);
 
   static unique_ptr<NameAssignmentFuncFactory>
-  createNameAssignmentFuncFactories(const std::string& challengeType);
+  createNameAssignmentFuncFactory(const std::string& challengeType);
 
   virtual NameAssignmentFunc
   getFunction(const std::string& factoryParam) = 0;
diff --git a/src/ndncert-common.hpp b/src/ndncert-common.hpp
index 4da43c9..b14cd12 100644
--- a/src/ndncert-common.hpp
+++ b/src/ndncert-common.hpp
@@ -123,6 +123,7 @@
 const std::string CONFIG_CHALLENGE = "challenge";
 const std::string CONFIG_CERTIFICATE = "certificate";
 const std::string CONFIG_REDIRECTION = "redirect-to";
+const std::string CONFIG_NAME_ASSIGNMENT = "name-assignment";
 
 
 // NDNCERT Status Enum