publisher: use ndn-cxx dispatcher for dataset publisher

Change-Id: I836a718ba40ff471bcdac7a7cc684c13914c4ea5
refs: #3728
diff --git a/src/nlsr.cpp b/src/nlsr.cpp
index 02df4aa..ca829e0 100644
--- a/src/nlsr.cpp
+++ b/src/nlsr.cpp
@@ -56,7 +56,11 @@
   , m_routingTable(scheduler)
   , m_fib(m_nlsrFace, scheduler, m_adjacencyList, m_confParam, m_keyChain)
   , m_namePrefixTable(*this)
+  , m_localhostDispatcher(m_nlsrFace, m_keyChain)
+  , m_routerNameDispatcher(m_nlsrFace, m_keyChain)
   , m_lsdbDatasetHandler(m_nlsrLsdb,
+                         m_localhostDispatcher,
+                         m_routerNameDispatcher,
                          m_nlsrFace,
                          m_keyChain)
   , m_helloProtocol(*this, scheduler)
@@ -69,8 +73,7 @@
                             m_keyChain,
                             m_certificateCache,
                             m_certStore)
-  , m_dispatcher(m_nlsrFace, m_keyChain, m_signingInfo)
-  , m_nfdRibCommandProcessor(m_dispatcher,
+  , m_nfdRibCommandProcessor(m_localhostDispatcher,
                              m_namePrefixList,
                              m_nlsrLsdb)
   , m_faceMonitor(m_nlsrFace)
@@ -93,23 +96,27 @@
   _LOG_DEBUG("Successfully registered prefix: " << name);
 
   if (name.equals(m_confParam.getRouterPrefix())) {
-    m_lsdbDatasetHandler.startListeningOnRouterPrefix();
+    // the top-level prefixes are added.
+    try {
+      m_routerNameDispatcher.addTopPrefix(m_confParam.getRouterPrefix(), false, m_signingInfo);
+    }
+    catch (const std::exception& e) {
+      _LOG_ERROR("Error setting top-level prefix in dispatcher: " << e.what() << "\n");
+    }
   }
 }
 
 void
 Nlsr::onLocalhostRegistrationSuccess(const ndn::Name& name)
 {
-  _LOG_DEBUG("Successfully registered prefix: " << name);
+  _LOG_DEBUG("Successfully registered local prefix: " << name);
 
   m_prefixUpdateProcessor.startListening();
-  m_lsdbDatasetHandler.startListeningOnLocalhost();
-  // Dispatcher prefix registrations
   m_nfdRibCommandProcessor.startListening();
   // All dispatcher-related sub-prefixes *must* be registered before
   // the top-level prefixes are added.
   try {
-    m_dispatcher.addTopPrefix(LOCALHOST_PREFIX, false, m_signingInfo);
+    m_localhostDispatcher.addTopPrefix(LOCALHOST_PREFIX, false, m_signingInfo);
   }
   catch (const std::exception& e) {
     _LOG_ERROR("Error setting top-level prefix in dispatcher: " << e.what() << "\n");
@@ -136,7 +143,7 @@
   ndn::Name name = m_confParam.getLsaPrefix();
   name.append(m_confParam.getSiteName());
   name.append(m_confParam.getRouterName());
-  _LOG_DEBUG("Setting interest filter for name: " << name);
+  _LOG_DEBUG("Setting interest filter for LsaPrefix: " << name);
   getNlsrFace().setInterestFilter(name,
                                   std::bind(&Lsdb::processInterest,
                                             &m_nlsrLsdb, _1, _2),
@@ -335,7 +342,6 @@
 Nlsr::onKeyInterest(const ndn::Name& name, const ndn::Interest& interest)
 {
   const ndn::Name& interestName = interest.getName();
-
   ndn::Name certName = interestName.getSubName(name.size());
 
   if (certName[-2].toUri() == "ID-CERT")
@@ -394,9 +400,6 @@
   }
 }
 
-
-
-
 void
 Nlsr::onFaceEventNotification(const ndn::nfd::FaceEventNotification& faceEventNotification)
 {
diff --git a/src/nlsr.hpp b/src/nlsr.hpp
index 3df4fd1..81629ae 100644
--- a/src/nlsr.hpp
+++ b/src/nlsr.hpp
@@ -287,7 +287,13 @@
   ndn::mgmt::Dispatcher&
   getDispatcher()
   {
-    return m_dispatcher;
+    return m_localhostDispatcher;
+  }
+
+  ndn::mgmt::Dispatcher&
+  getDispatcherRouterName()
+  {
+    return m_routerNameDispatcher;
   }
 
   void
@@ -404,6 +410,9 @@
   RoutingTable m_routingTable;
   Fib m_fib;
   NamePrefixTable m_namePrefixTable;
+  ndn::mgmt::Dispatcher m_localhostDispatcher;
+  ndn::mgmt::Dispatcher m_routerNameDispatcher;
+
   LsdbDatasetInterestHandler m_lsdbDatasetHandler;
 
 PUBLIC_WITH_TESTS_ELSE_PRIVATE:
@@ -416,7 +425,6 @@
   ndn::security::SigningInfo m_signingInfo;
   ndn::Name m_defaultCertName;
   update::PrefixUpdateProcessor m_prefixUpdateProcessor;
-  ndn::mgmt::Dispatcher m_dispatcher;
   update::NfdRibCommandProcessor m_nfdRibCommandProcessor;
 
   ndn::nfd::FaceMonitor m_faceMonitor;
diff --git a/src/publisher/lsa-publisher.cpp b/src/publisher/lsa-publisher.cpp
index 7060c05..a46ef60 100644
--- a/src/publisher/lsa-publisher.cpp
+++ b/src/publisher/lsa-publisher.cpp
@@ -33,8 +33,7 @@
 AdjacencyLsaPublisher::AdjacencyLsaPublisher(Lsdb& lsdb,
                                              ndn::Face& face,
                                              ndn::KeyChain& keyChain)
-  : LsaPublisher(face, keyChain)
-  , m_adjacencyLsas(lsdb.getAdjLsdb())
+  : m_adjacencyLsas(lsdb.getAdjLsdb())
 {
 }
 
@@ -73,8 +72,7 @@
 CoordinateLsaPublisher::CoordinateLsaPublisher(Lsdb& lsdb,
                                                ndn::Face& face,
                                                ndn::KeyChain& keyChain)
-  : LsaPublisher(face, keyChain)
-  , m_coordinateLsas(lsdb.getCoordinateLsdb())
+  : m_coordinateLsas(lsdb.getCoordinateLsdb())
 {
 }
 
@@ -109,8 +107,7 @@
 NameLsaPublisher::NameLsaPublisher(Lsdb& lsdb,
                                    ndn::Face& face,
                                    ndn::KeyChain& keyChain)
-  : LsaPublisher(face, keyChain)
-  , m_nameLsas(lsdb.getNameLsdb())
+  : m_nameLsas(lsdb.getNameLsdb())
 {
 }
 
diff --git a/src/publisher/lsa-publisher.hpp b/src/publisher/lsa-publisher.hpp
index 413731f..1c33242 100644
--- a/src/publisher/lsa-publisher.hpp
+++ b/src/publisher/lsa-publisher.hpp
@@ -32,43 +32,12 @@
 
 namespace nlsr {
 
-template <class TlvType>
-class LsaPublisher : public SegmentPublisher<ndn::Face>
-{
-public:
-  LsaPublisher(ndn::Face& face, ndn::KeyChain& keyChain)
-  : SegmentPublisher<ndn::Face>(face, keyChain)
-  {
-  }
-
-  virtual
-  ~LsaPublisher()
-  {
-  }
-
-protected:
-  virtual size_t
-  generate(ndn::EncodingBuffer& outBuffer)
-  {
-    size_t totalLength = 0;
-
-    for (const TlvType& lsaTlv : getTlvLsas()) {
-      totalLength += lsaTlv.wireEncode(outBuffer);
-    }
-
-    return totalLength;
-  }
-
-  virtual std::list<TlvType>
-  getTlvLsas() = 0;
-};
-
   /*! \brief Class to publish adjacency lsa dataset
 
     \sa https://redmine.named-data.net/projects/nlsr/wiki/LSDB_DataSet
 
   */
-class AdjacencyLsaPublisher : public LsaPublisher<tlv::AdjacencyLsa>
+class AdjacencyLsaPublisher
 {
 public:
   AdjacencyLsaPublisher(Lsdb& lsdb,
@@ -89,7 +58,7 @@
   /*! \brief Class to publish coordinate lsa dataset
     \sa https://redmine.named-data.net/projects/nlsr/wiki/LSDB_DataSet
   */
-class CoordinateLsaPublisher : public LsaPublisher<tlv::CoordinateLsa>
+class CoordinateLsaPublisher
 {
 public:
   CoordinateLsaPublisher(Lsdb& lsdb,
@@ -110,7 +79,7 @@
   /*! \brief Class to publish name lsa dataset
     \sa https://redmine.named-data.net/projects/nlsr/wiki/LSDB_DataSet
   */
-class NameLsaPublisher : public LsaPublisher<tlv::NameLsa>
+class NameLsaPublisher
 {
 public:
   NameLsaPublisher(Lsdb& lsdb,
diff --git a/src/publisher/lsdb-dataset-interest-handler.cpp b/src/publisher/lsdb-dataset-interest-handler.cpp
index 7ba0e92..e3cfa1f 100644
--- a/src/publisher/lsdb-dataset-interest-handler.cpp
+++ b/src/publisher/lsdb-dataset-interest-handler.cpp
@@ -34,110 +34,137 @@
 #include <ndn-cxx/face.hpp>
 #include <ndn-cxx/mgmt/nfd/control-response.hpp>
 #include <ndn-cxx/util/regex.hpp>
+#include "tlv/lsdb-status.hpp"
 
 namespace nlsr {
 
 INIT_LOGGER("LsdbDatasetInterestHandler");
-
-const uint32_t LsdbDatasetInterestHandler::ERROR_CODE_MALFORMED_COMMAND = 400;
-const uint32_t LsdbDatasetInterestHandler::ERROR_CODE_UNSUPPORTED_COMMAND = 501;
+const ndn::PartialName ADJACENCIES_DATASET = ndn::PartialName("lsdb/adjacencies");
+const ndn::PartialName COORDINATES_DATASET = ndn::PartialName("lsdb/coordinates");
+const ndn::PartialName NAMES_DATASET = ndn::PartialName("lsdb/names");
+const ndn::PartialName LISTS_DATASET = ndn::PartialName("lsdb/list");
+const ndn::PartialName LsdbDatasetInterestHandler::LOCALHOST_COMMAND_PREFIX =
+      ndn::Name(Nlsr::LOCALHOST_PREFIX).append(Lsdb::NAME_COMPONENT);
 
 LsdbDatasetInterestHandler::LsdbDatasetInterestHandler(Lsdb& lsdb,
+                                                       ndn::mgmt::Dispatcher& localHostDispatcher,
+                                                       ndn::mgmt::Dispatcher& routerNameDispatcher,
                                                        ndn::Face& face,
                                                        ndn::KeyChain& keyChain)
-  : LOCALHOST_COMMAND_PREFIX(ndn::Name(Nlsr::LOCALHOST_PREFIX).append(Lsdb::NAME_COMPONENT))
-  , m_face(face)
-  , m_keyChain(keyChain)
+  : m_localhostDispatcher(localHostDispatcher)
+  , m_routerNameDispatcher(routerNameDispatcher)
   , m_adjacencyLsaPublisher(lsdb, face, keyChain)
   , m_coordinateLsaPublisher(lsdb, face, keyChain)
   , m_nameLsaPublisher(lsdb, face, keyChain)
-  , m_lsdbStatusPublisher(lsdb, face, keyChain,
-                          m_adjacencyLsaPublisher,
-                          m_coordinateLsaPublisher,
-                          m_nameLsaPublisher)
-
+  , m_adjacencyLsas(lsdb.getAdjLsdb())
+  , m_coordinateLsas(lsdb.getCoordinateLsdb())
+  , m_nameLsas(lsdb.getNameLsdb())
 {
+  _LOG_DEBUG("Setting dispatcher for lsdb status dataset:");
+  setDispatcher(m_localhostDispatcher);
+  setDispatcher(m_routerNameDispatcher);
 }
 
 void
-LsdbDatasetInterestHandler::startListeningOnLocalhost()
+LsdbDatasetInterestHandler::setDispatcher(ndn::mgmt::Dispatcher& dispatcher)
 {
-  _LOG_DEBUG("Setting interest filter for: " << LOCALHOST_COMMAND_PREFIX);
-  m_face.setInterestFilter(LOCALHOST_COMMAND_PREFIX,
-                           std::bind(&LsdbDatasetInterestHandler::onInterest, this, _2,
-                                     std::cref(LOCALHOST_COMMAND_PREFIX)));
+  dispatcher.addStatusDataset(ADJACENCIES_DATASET,
+    ndn::mgmt::makeAcceptAllAuthorization(),
+    std::bind(&LsdbDatasetInterestHandler::publishAdjStatus, this, _1, _2, _3));
+  dispatcher.addStatusDataset(COORDINATES_DATASET,
+    ndn::mgmt::makeAcceptAllAuthorization(),
+    std::bind(&LsdbDatasetInterestHandler::publishCoordinateStatus, this, _1, _2, _3));
+  dispatcher.addStatusDataset(NAMES_DATASET,
+    ndn::mgmt::makeAcceptAllAuthorization(),
+    std::bind(&LsdbDatasetInterestHandler::publishNameStatus, this, _1, _2, _3));
+  dispatcher.addStatusDataset(LISTS_DATASET,
+    ndn::mgmt::makeAcceptAllAuthorization(),
+    std::bind(&LsdbDatasetInterestHandler::publishAllStatus, this, _1, _2, _3));
 }
 
 void
-LsdbDatasetInterestHandler::startListeningOnRouterPrefix()
+LsdbDatasetInterestHandler::publishAdjStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
+                                             ndn::mgmt::StatusDatasetContext& context)
 {
-  _LOG_DEBUG("Setting interest filter for: " << m_routerNameCommandPrefix);
-  m_face.setInterestFilter(m_routerNameCommandPrefix,
-                           std::bind(&LsdbDatasetInterestHandler::onInterest, this, _2,
-                                     std::cref(m_routerNameCommandPrefix)));
+  _LOG_DEBUG("Received interest:  " << interest);
+  for (AdjLsa lsa : m_adjacencyLsas) {
+    tlv::AdjacencyLsa tlvLsa;
+    std::shared_ptr<tlv::LsaInfo> tlvLsaInfo = tlv::makeLsaInfo(lsa);
+    tlvLsa.setLsaInfo(*tlvLsaInfo);
+
+    for (const Adjacent& adj : lsa.getAdl().getAdjList()) {
+      tlv::Adjacency tlvAdj;
+      tlvAdj.setName(adj.getName());
+      tlvAdj.setUri(adj.getFaceUri().toString());
+      tlvAdj.setCost(adj.getLinkCost());
+      tlvLsa.addAdjacency(tlvAdj);
+    }
+    const ndn::Block& wire = tlvLsa.wireEncode();
+    context.append(wire);
+  }
+  context.end();
 }
 
 void
-LsdbDatasetInterestHandler::onInterest(const ndn::Interest& interest,
-                                       const ndn::Name& commandPrefix)
+LsdbDatasetInterestHandler::publishCoordinateStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
+                                                    ndn::mgmt::StatusDatasetContext& context)
 {
-  if (!isValidCommandPrefix(interest, commandPrefix))
-  {
-    _LOG_DEBUG("Received malformed interest: " << interest.getName());
+  _LOG_DEBUG("Received interest:  " << interest);
+  for (const CoordinateLsa lsa : m_coordinateLsas) {
+    tlv::CoordinateLsa tlvLsa;
+    std::shared_ptr<tlv::LsaInfo> tlvLsaInfo = tlv::makeLsaInfo(lsa);
+    tlvLsa.setLsaInfo(*tlvLsaInfo);
 
-    sendErrorResponse(interest.getName(), ERROR_CODE_MALFORMED_COMMAND, "Malformed command");
-    return;
+    tlvLsa.setHyperbolicRadius(lsa.getCorRadius());
+    tlvLsa.setHyperbolicAngle(lsa.getCorTheta());
+
+    const ndn::Block& wire = tlvLsa.wireEncode();
+    context.append(wire);
   }
-
-  ndn::Name::Component command = interest.getName().get(commandPrefix.size());
-  processCommand(interest, command);
-}
-
-bool
-LsdbDatasetInterestHandler::isValidCommandPrefix(const ndn::Interest& interest,
-                                                 const ndn::Name& commandPrefix)
-{
-  size_t commandSize = interest.getName().size();
-
-  return (commandSize == commandPrefix.size() + 1 && commandPrefix.isPrefixOf(interest.getName()));
+  context.end();
 }
 
 void
-LsdbDatasetInterestHandler::processCommand(const ndn::Interest& interest,
-                                           const ndn::Name::Component& command)
+LsdbDatasetInterestHandler::publishNameStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
+                                              ndn::mgmt::StatusDatasetContext& context)
 {
-  _LOG_TRACE("Received interest with command: " << command);
+  _LOG_DEBUG("Received interest:  " << interest);
+  for (NameLsa lsa : m_nameLsas) {
+    tlv::NameLsa tlvLsa;
 
-  if (command.equals(AdjacencyLsaPublisher::DATASET_COMPONENT)) {
-    m_adjacencyLsaPublisher.publish(interest.getName());
+    std::shared_ptr<tlv::LsaInfo> tlvLsaInfo = tlv::makeLsaInfo(lsa);
+    tlvLsa.setLsaInfo(*tlvLsaInfo);
+
+    for (const ndn::Name& name : lsa.getNpl().getNameList()) {
+      tlvLsa.addName(name);
+    }
+
+    const ndn::Block& wire = tlvLsa.wireEncode();
+    context.append(wire);
   }
-  else if (command.equals(CoordinateLsaPublisher::DATASET_COMPONENT)) {
-    m_coordinateLsaPublisher.publish(interest.getName());
-  }
-  else if (command.equals(NameLsaPublisher::DATASET_COMPONENT)) {
-    m_nameLsaPublisher.publish(interest.getName());
-  }
-  else if (command.equals(LsdbStatusPublisher::DATASET_COMPONENT)) {
-    m_lsdbStatusPublisher.publish(interest.getName());
-  }
-  else {
-    _LOG_DEBUG("Unsupported command: " << command);
-    sendErrorResponse(interest.getName(), ERROR_CODE_UNSUPPORTED_COMMAND, "Unsupported command");
-  }
+  context.end();
 }
 
 void
-LsdbDatasetInterestHandler::sendErrorResponse(const ndn::Name& name,
-                                              uint32_t code,
-                                              const std::string& error)
+LsdbDatasetInterestHandler::publishAllStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
+                                             ndn::mgmt::StatusDatasetContext& context)
 {
-  ndn::nfd::ControlResponse response(code, error);
+  _LOG_DEBUG("Received interest:  " << interest);
+  tlv::LsdbStatus lsdbStatus;
+  for (const tlv::AdjacencyLsa& tlvLsa : m_adjacencyLsaPublisher.getTlvLsas()) {
+    lsdbStatus.addAdjacencyLsa(tlvLsa);
+  }
 
-  std::shared_ptr<ndn::Data> data = std::make_shared<ndn::Data>(name);
-  data->setContent(response.wireEncode());
+  for (const tlv::CoordinateLsa& tlvLsa : m_coordinateLsaPublisher.getTlvLsas()) {
+    lsdbStatus.addCoordinateLsa(tlvLsa);
+  }
 
-  m_keyChain.sign(*data);
-  m_face.put(*data);
+  for (const tlv::NameLsa& tlvLsa : m_nameLsaPublisher.getTlvLsas()) {
+    lsdbStatus.addNameLsa(tlvLsa);
+  }
+  const ndn::Block& wire = lsdbStatus.wireEncode();
+  context.append(wire);
+  context.end();
 }
 
 } // namespace nlsr
diff --git a/src/publisher/lsdb-dataset-interest-handler.hpp b/src/publisher/lsdb-dataset-interest-handler.hpp
index 3976cd1..f16075f 100644
--- a/src/publisher/lsdb-dataset-interest-handler.hpp
+++ b/src/publisher/lsdb-dataset-interest-handler.hpp
@@ -23,17 +23,21 @@
 #define NLSR_PUBLISHER_LSDB_DATASET_INTEREST_HANDLER_HPP
 
 #include "lsa-publisher.hpp"
-#include "lsdb-status-publisher.hpp"
 
+#include <ndn-cxx/mgmt/dispatcher.hpp>
 #include <ndn-cxx/face.hpp>
+#include <boost/noncopyable.hpp>
+#include "tlv/adjacency-lsa.hpp"
+#include "tlv/coordinate-lsa.hpp"
+#include "tlv/name-lsa.hpp"
 
 namespace nlsr {
 
 /*!
    \brief Class to publish all lsa dataset
-   \sa http://redmine.named-data.net/projects/nlsr/wiki/LSDB_DataSet
+   \sa https://redmine.named-data.net/projects/nlsr/wiki/LSDB_DataSet
  */
-class LsdbDatasetInterestHandler
+class LsdbDatasetInterestHandler : boost::noncopyable
 {
 public:
   class Error : std::runtime_error
@@ -47,15 +51,11 @@
   };
 
   LsdbDatasetInterestHandler(Lsdb& lsdb,
+                             ndn::mgmt::Dispatcher& localHostDispatcher,
+                             ndn::mgmt::Dispatcher& routerNameDispatcher,
                              ndn::Face& face,
                              ndn::KeyChain& keyChain);
 
-  void
-  startListeningOnLocalhost();
-
-  void
-  startListeningOnRouterPrefix();
-
   const ndn::Name&
   getLocalhostCommandPrefix()
   {
@@ -65,43 +65,59 @@
   ndn::Name&
   getRouterNameCommandPrefix()
   {
-    return m_routerNameCommandPrefix;
+    return m_routerNamePrefix;
   }
 
   void
   setRouterNameCommandPrefix(const ndn::Name& routerName) {
-    m_routerNameCommandPrefix = routerName;
-    m_routerNameCommandPrefix.append(Lsdb::NAME_COMPONENT);
+    m_routerNamePrefix = routerName;
+    m_routerNamePrefix.append(Lsdb::NAME_COMPONENT);
   }
 
 private:
+  /*! \brief set dispatcher for localhost/router name.
+   */
   void
-  onInterest(const ndn::Interest& interest, const ndn::Name& commandPrefix);
+  setDispatcher(ndn::mgmt::Dispatcher& dispatcher);
 
-  bool
-  isValidCommandPrefix(const ndn::Interest& interest, const ndn::Name& commandPrefix);
-
+  /*! \brief provide adjacent status dataset
+   */
   void
-  processCommand(const ndn::Interest& interest, const ndn::Name::Component& command);
+  publishAdjStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
+                   ndn::mgmt::StatusDatasetContext& context);
 
+  /*! \brief provide coordinate status dataset
+   */
   void
-  sendErrorResponse(const ndn::Name& name, uint32_t code, const std::string& error);
+  publishCoordinateStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
+                          ndn::mgmt::StatusDatasetContext& context);
+
+  /*! \brief provide name status dataset
+   */
+  void
+  publishNameStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
+                    ndn::mgmt::StatusDatasetContext& context);
+
+  /*! \brief provide ladb status dataset
+   */
+  void
+  publishAllStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
+                   ndn::mgmt::StatusDatasetContext& context);
 
 private:
-  const ndn::Name LOCALHOST_COMMAND_PREFIX;
-  ndn::Name m_routerNameCommandPrefix;
+  static const ndn::Name LOCALHOST_COMMAND_PREFIX;
+  ndn::Name m_routerNamePrefix;
 
-  ndn::Face& m_face;
-  ndn::KeyChain& m_keyChain;
+  ndn::mgmt::Dispatcher& m_localhostDispatcher;
+  ndn::mgmt::Dispatcher& m_routerNameDispatcher;
 
   AdjacencyLsaPublisher m_adjacencyLsaPublisher;
   CoordinateLsaPublisher m_coordinateLsaPublisher;
   NameLsaPublisher m_nameLsaPublisher;
-  LsdbStatusPublisher m_lsdbStatusPublisher;
 
-PUBLIC_WITH_TESTS_ELSE_PRIVATE:
-  static const uint32_t ERROR_CODE_MALFORMED_COMMAND;
-  static const uint32_t ERROR_CODE_UNSUPPORTED_COMMAND;
+  const std::list<AdjLsa>& m_adjacencyLsas;
+  const std::list<CoordinateLsa>& m_coordinateLsas;
+  const std::list<NameLsa>& m_nameLsas;
 };
 
 } // namespace nlsr
diff --git a/src/publisher/lsdb-status-publisher.cpp b/src/publisher/lsdb-status-publisher.cpp
deleted file mode 100644
index b7b90bd..0000000
--- a/src/publisher/lsdb-status-publisher.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2017,  The University of Memphis,
- *                           Regents of the University of California,
- *                           Arizona Board of Regents.
- *
- * This file is part of NLSR (Named-data Link State Routing).
- * See AUTHORS.md for complete list of NLSR authors and contributors.
- *
- * NLSR is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#include "lsdb-status-publisher.hpp"
-
-#include "lsa.hpp"
-#include "tlv/lsdb-status.hpp"
-
-#include <ndn-cxx/face.hpp>
-
-namespace nlsr {
-
-const ndn::Name::Component LsdbStatusPublisher::DATASET_COMPONENT = ndn::Name::Component("list");
-
-LsdbStatusPublisher::LsdbStatusPublisher(Lsdb& lsdb,
-                                         ndn::Face& face,
-                                         ndn::KeyChain& keyChain,
-                                         AdjacencyLsaPublisher& adjacencyLsaPublisher,
-                                         CoordinateLsaPublisher& coordinateLsaPublisher,
-                                         NameLsaPublisher& nameLsaPublisher)
-  : SegmentPublisher<ndn::Face>(face, keyChain)
-  , m_adjacencyLsaPublisher(adjacencyLsaPublisher)
-  , m_coordinateLsaPublisher(coordinateLsaPublisher)
-  , m_nameLsaPublisher(nameLsaPublisher)
-{
-}
-
-size_t
-LsdbStatusPublisher::generate(ndn::EncodingBuffer& outBuffer)
-{
-  size_t totalLength = 0;
-
-  tlv::LsdbStatus lsdbStatus;
-  for (const tlv::AdjacencyLsa& tlvLsa : m_adjacencyLsaPublisher.getTlvLsas()) {
-    lsdbStatus.addAdjacencyLsa(tlvLsa);
-  }
-
-  for (const tlv::CoordinateLsa& tlvLsa : m_coordinateLsaPublisher.getTlvLsas()) {
-    lsdbStatus.addCoordinateLsa(tlvLsa);
-  }
-
-  for (const tlv::NameLsa& tlvLsa : m_nameLsaPublisher.getTlvLsas()) {
-    lsdbStatus.addNameLsa(tlvLsa);
-  }
-
-  totalLength += lsdbStatus.wireEncode(outBuffer);
-
-  return totalLength;
-}
-
-} // namespace nlsr
diff --git a/src/publisher/lsdb-status-publisher.hpp b/src/publisher/lsdb-status-publisher.hpp
deleted file mode 100644
index 4606b61..0000000
--- a/src/publisher/lsdb-status-publisher.hpp
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2017,  The University of Memphis,
- *                           Regents of the University of California,
- *                           Arizona Board of Regents.
- *
- * This file is part of NLSR (Named-data Link State Routing).
- * See AUTHORS.md for complete list of NLSR authors and contributors.
- *
- * NLSR is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef NLSR_PUBLISHER_LSDB_STATUS_PUBLISHER_HPP
-#define NLSR_PUBLISHER_LSDB_STATUS_PUBLISHER_HPP
-
-#include "lsa-publisher.hpp"
-#include "lsdb.hpp"
-#include "segment-publisher.hpp"
-
-#include <ndn-cxx/face.hpp>
-
-namespace nlsr {
-
-/*!
-   \brief Publishes lsdb status dataset
-   \sa http://redmine.named-data.net/projects/nlsr/wiki/LSDB_DataSet
- */
-class LsdbStatusPublisher : public SegmentPublisher<ndn::Face>
-{
-public:
-  LsdbStatusPublisher(Lsdb& lsdb,
-                      ndn::Face& face,
-                      ndn::KeyChain& keyChain,
-                      AdjacencyLsaPublisher& adjacencyLsaPublisher,
-                      CoordinateLsaPublisher& coordinateLsaPublisher,
-                      NameLsaPublisher& nameLsaPublisher);
-
-protected:
-  virtual size_t
-  generate(ndn::EncodingBuffer& outBuffer);
-
-private:
-  AdjacencyLsaPublisher& m_adjacencyLsaPublisher;
-  CoordinateLsaPublisher& m_coordinateLsaPublisher;
-  NameLsaPublisher& m_nameLsaPublisher;
-
-public:
-  static const ndn::Name::Component DATASET_COMPONENT;
-};
-
-} // namespace nlsr
-
-#endif // NLSR_PUBLISHER_LSDB_STATUS_PUBLISHER_HPP