From 17362929c2d1de8e8ccdb6eb306838263f1332bc Mon Sep 17 00:00:00 2001
From: Sergey Yakubov <sergey.yakubov@desy.de>
Date: Sun, 28 Jan 2018 10:24:11 +0100
Subject: [PATCH] start server databroker

---
 .../worker/process_folder/process_folder.cpp  |  2 +-
 .../content_multithread.cpp                   |  2 +-
 .../next_multithread/next_multithread.cpp     |  2 +-
 worker/api/cpp/CMakeLists.txt                 |  2 +-
 worker/api/cpp/include/worker/data_broker.h   |  6 +++++-
 worker/api/cpp/src/data_broker.cpp            | 21 +++++++++++++++----
 worker/api/cpp/src/server_data_broker.cpp     | 17 +++++++++++++++
 worker/api/cpp/src/server_data_broker.h       | 17 +++++++++++++++
 worker/api/cpp/unittests/test_worker_api.cpp  | 18 ++++++++++++++--
 9 files changed, 76 insertions(+), 11 deletions(-)
 create mode 100644 worker/api/cpp/src/server_data_broker.cpp
 create mode 100644 worker/api/cpp/src/server_data_broker.h

diff --git a/examples/worker/process_folder/process_folder.cpp b/examples/worker/process_folder/process_folder.cpp
index 54935ab54..40bf59482 100644
--- a/examples/worker/process_folder/process_folder.cpp
+++ b/examples/worker/process_folder/process_folder.cpp
@@ -28,7 +28,7 @@ std::string ProcessCommandArguments(int argc, char* argv[]) {
 
 std::unique_ptr<hidra2::DataBroker> CreateBroker(const std::string& folder) {
     hidra2::WorkerErrorCode err;
-    auto broker = hidra2::DataBrokerFactory::Create(folder, &err);
+    auto broker = hidra2::DataBrokerFactory::CreateFolderBroker(folder, &err);
     if (err != WorkerErrorCode::kOK) {
         std::cout << "Cannot create broker" << std::endl;
         exit(EXIT_FAILURE);
diff --git a/tests/worker/connect_multithread/content_multithread.cpp b/tests/worker/connect_multithread/content_multithread.cpp
index 677fc65fc..e4bfcceb8 100644
--- a/tests/worker/connect_multithread/content_multithread.cpp
+++ b/tests/worker/connect_multithread/content_multithread.cpp
@@ -40,7 +40,7 @@ int main(int argc, char* argv[]) {
     auto args = GetArgs(argc, argv);
 
     hidra2::WorkerErrorCode err;
-    auto broker = hidra2::DataBrokerFactory::Create(args.folder, &err);
+    auto broker = hidra2::DataBrokerFactory::CreateFolderBroker(args.folder, &err);
 
     std::vector<WorkerErrorCode>errors(args.nthreads, WorkerErrorCode::kUnknownIOError);
 
diff --git a/tests/worker/next_multithread/next_multithread.cpp b/tests/worker/next_multithread/next_multithread.cpp
index c94436b94..01f66e9fb 100644
--- a/tests/worker/next_multithread/next_multithread.cpp
+++ b/tests/worker/next_multithread/next_multithread.cpp
@@ -42,7 +42,7 @@ Args GetArgs(int argc, char* argv[]) {
 
 void ReadFiles(const Args& args) {
     hidra2::WorkerErrorCode err;
-    auto broker = hidra2::DataBrokerFactory::Create(args.folder, &err);
+    auto broker = hidra2::DataBrokerFactory::CreateFolderBroker(args.folder, &err);
     broker->Connect();
 
     std::vector<hidra2::FileInfo>file_infos(args.nthreads);
diff --git a/worker/api/cpp/CMakeLists.txt b/worker/api/cpp/CMakeLists.txt
index 46b83b837..44b0b1912 100644
--- a/worker/api/cpp/CMakeLists.txt
+++ b/worker/api/cpp/CMakeLists.txt
@@ -1,6 +1,6 @@
 set(TARGET_NAME hidra2-worker)
 
-set(SOURCE_FILES include/worker/data_broker.h src/data_broker.cpp src/folder_data_broker.cpp src/folder_data_broker.h include/hidra2_worker.h)
+set(SOURCE_FILES include/worker/data_broker.h src/data_broker.cpp src/folder_data_broker.cpp src/folder_data_broker.h include/hidra2_worker.h src/server_data_broker.cpp src/server_data_broker.h)
 
 
 ################################
diff --git a/worker/api/cpp/include/worker/data_broker.h b/worker/api/cpp/include/worker/data_broker.h
index 57393eab7..71c69d2a2 100644
--- a/worker/api/cpp/include/worker/data_broker.h
+++ b/worker/api/cpp/include/worker/data_broker.h
@@ -39,7 +39,11 @@ class DataBroker {
 /*! A class to create a data broker instance. The class's only function Create is used for this*/
 class DataBrokerFactory {
   public:
-    static std::unique_ptr<DataBroker> Create(const std::string& source_name, WorkerErrorCode* return_code) noexcept;
+    static std::unique_ptr<DataBroker> CreateFolderBroker(const std::string& source_name,
+            WorkerErrorCode* return_code) noexcept;
+    static std::unique_ptr<DataBroker> CreateServerBroker(const std::string& source_name,
+            WorkerErrorCode* return_code) noexcept;
+
 };
 
 }
diff --git a/worker/api/cpp/src/data_broker.cpp b/worker/api/cpp/src/data_broker.cpp
index 70a821580..517ec519b 100644
--- a/worker/api/cpp/src/data_broker.cpp
+++ b/worker/api/cpp/src/data_broker.cpp
@@ -1,11 +1,13 @@
 #include "worker/data_broker.h"
 #include "folder_data_broker.h"
+#include "server_data_broker.h"
 
-namespace hidra2 {
 
-std::unique_ptr<DataBroker> DataBrokerFactory::Create(const std::string& source_name,
-        WorkerErrorCode* return_code) noexcept {
+namespace hidra2 {
 
+template <class Broker>
+std::unique_ptr<DataBroker> Create(const std::string& source_name,
+                                   WorkerErrorCode* return_code) noexcept {
     if (source_name.empty()) {
         *return_code = WorkerErrorCode::kEmptyDatasource;
         return nullptr;
@@ -13,14 +15,25 @@ std::unique_ptr<DataBroker> DataBrokerFactory::Create(const std::string& source_
 
     std::unique_ptr<DataBroker> p = nullptr;
     try {
-        p.reset(new FolderDataBroker(source_name));
+        p.reset(new Broker(source_name));
         *return_code = WorkerErrorCode::kOK;
     } catch (...) {         // we do not test this part
         *return_code = WorkerErrorCode::kMemoryError;
     }
 
     return p;
+
+}
+
+std::unique_ptr<DataBroker> DataBrokerFactory::CreateFolderBroker(const std::string& source_name,
+        WorkerErrorCode* return_code) noexcept {
+    return Create<FolderDataBroker>(source_name, return_code);
 };
 
+std::unique_ptr<DataBroker> DataBrokerFactory::CreateServerBroker(const std::string& source_name,
+        WorkerErrorCode* return_code) noexcept {
+    return Create<ServerDataBroker>(source_name, return_code);
+}
+
 }
 
diff --git a/worker/api/cpp/src/server_data_broker.cpp b/worker/api/cpp/src/server_data_broker.cpp
new file mode 100644
index 000000000..cf08000be
--- /dev/null
+++ b/worker/api/cpp/src/server_data_broker.cpp
@@ -0,0 +1,17 @@
+#include "server_data_broker.h"
+
+namespace hidra2 {
+
+ServerDataBroker::ServerDataBroker(const std::string& source_name) {
+
+}
+
+WorkerErrorCode ServerDataBroker::Connect() {
+    return WorkerErrorCode::kOK;
+}
+
+WorkerErrorCode ServerDataBroker::GetNext(FileInfo* info, FileData* data) {
+    return {};
+}
+
+}
\ No newline at end of file
diff --git a/worker/api/cpp/src/server_data_broker.h b/worker/api/cpp/src/server_data_broker.h
new file mode 100644
index 000000000..32a77072a
--- /dev/null
+++ b/worker/api/cpp/src/server_data_broker.h
@@ -0,0 +1,17 @@
+#ifndef HIDRA2_SERVER_DATA_BROKER_H
+#define HIDRA2_SERVER_DATA_BROKER_H
+
+#include "worker/data_broker.h"
+
+namespace hidra2 {
+
+class ServerDataBroker final : public hidra2::DataBroker {
+  public:
+    explicit ServerDataBroker(const std::string& source_name);
+    WorkerErrorCode Connect() override;
+    WorkerErrorCode GetNext(FileInfo* info, FileData* data) override;
+};
+
+}
+
+#endif //HIDRA2_SERVER_DATA_BROKER_H
diff --git a/worker/api/cpp/unittests/test_worker_api.cpp b/worker/api/cpp/unittests/test_worker_api.cpp
index 227dda59b..b8e7fb7b4 100644
--- a/worker/api/cpp/unittests/test_worker_api.cpp
+++ b/worker/api/cpp/unittests/test_worker_api.cpp
@@ -2,10 +2,14 @@
 
 #include "worker/data_broker.h"
 #include "../src/folder_data_broker.h"
+#include "../src/server_data_broker.h"
+
 
 using hidra2::DataBrokerFactory;
 using hidra2::DataBroker;
 using hidra2::FolderDataBroker;
+using hidra2::ServerDataBroker;
+
 using hidra2::WorkerErrorCode;
 
 using ::testing::Eq;
@@ -19,7 +23,7 @@ namespace {
 TEST(DataBrokerFactoryTests, CreateFolderDataSource) {
     WorkerErrorCode return_code;
 
-    auto data_broker = DataBrokerFactory::Create("path/to/file", &return_code);
+    auto data_broker = DataBrokerFactory::CreateFolderBroker("path/to/file", &return_code);
 
     ASSERT_THAT(return_code, Eq(WorkerErrorCode::kOK));
     ASSERT_THAT(dynamic_cast<FolderDataBroker*>(data_broker.get()), Ne(nullptr));
@@ -28,10 +32,20 @@ TEST(DataBrokerFactoryTests, CreateFolderDataSource) {
 TEST(DataBrokerFactoryTests, FailCreateDataSourceWithEmptySource) {
     WorkerErrorCode return_code;
 
-    auto data_broker = DataBrokerFactory::Create("", &return_code);
+    auto data_broker = DataBrokerFactory::CreateFolderBroker("", &return_code);
 
     ASSERT_THAT(return_code, Eq(WorkerErrorCode::kEmptyDatasource));
     ASSERT_THAT(data_broker.release(), Eq(nullptr));
 }
 
+TEST(DataBrokerFactoryTests, CreateServerDataSource) {
+    WorkerErrorCode return_code;
+
+    auto data_broker = DataBrokerFactory::CreateServerBroker("server", &return_code);
+
+    ASSERT_THAT(return_code, Eq(WorkerErrorCode::kOK));
+    ASSERT_THAT(dynamic_cast<ServerDataBroker*>(data_broker.get()), Ne(nullptr));
+}
+
+
 }
-- 
GitLab