diff --git a/Modules/CppRestSdk/include/mitkIRESTManager.h b/Modules/CppRestSdk/include/mitkIRESTManager.h index c65e2ad471..40dbd2afaa 100644 --- a/Modules/CppRestSdk/include/mitkIRESTManager.h +++ b/Modules/CppRestSdk/include/mitkIRESTManager.h @@ -1,30 +1,31 @@ #ifndef mitkIRESTManager_h #define mitkIRESTManager_h #include "cpprest/uri.h" +#include "cpprest/json.h" #include #include #include namespace mitk { class IRESTManager { public: virtual ~IRESTManager(); enum RequestType { get, post, put }; virtual void sendRequest(RequestType type) = 0; virtual void receiveRequest(web::uri uri, IRESTObserver *observer) = 0; - virtual bool handle(web::uri) = 0; + virtual web::json::value handle(web::uri, web::json::value) = 0; }; } // namespace mitk MITK_DECLARE_SERVICE_INTERFACE(mitk::IRESTManager, "org.mitk.IRESTManager") #endif diff --git a/Modules/CppRestSdk/include/mitkIRESTObserver.h b/Modules/CppRestSdk/include/mitkIRESTObserver.h index 34dd7facdb..e60f96de34 100644 --- a/Modules/CppRestSdk/include/mitkIRESTObserver.h +++ b/Modules/CppRestSdk/include/mitkIRESTObserver.h @@ -1,16 +1,18 @@ #ifndef mitkIRESTObserver_h #define mitkIRESTObserver_h +#include "cpprest/json.h" + namespace mitk { class IRESTObserver { public: - virtual bool notify() = 0; + virtual web::json::value notify(web::json::value data) = 0; private: }; } #endif // !mitkIRESTObserver diff --git a/Modules/CppRestSdk/include/mitkRESTManager.h b/Modules/CppRestSdk/include/mitkRESTManager.h index c919a0bd89..20d659a6de 100644 --- a/Modules/CppRestSdk/include/mitkRESTManager.h +++ b/Modules/CppRestSdk/include/mitkRESTManager.h @@ -1,30 +1,30 @@ #ifndef mitkRESTManager_h #define mitkRESTManager_h #include #include #include #include namespace mitk { class RESTManager : public IRESTManager { public: RESTManager(); ~RESTManager() override; //calls RESTClient void sendRequest(RequestType type) override; //calls RESTServer void receiveRequest(web::uri uri, IRESTObserver *observer) override; - bool handle(web::uri) override; + web::json::value handle(web::uri, web::json::value) override; private: std::map m_ClientMap; // Map with port client pairs std::map m_ServerMap; // Map with port server pairs std::map, IRESTObserver*> m_Observer; //Map with all observers }; } // namespace mitk #endif // !mitkRESTManager_h diff --git a/Modules/CppRestSdk/include/mitkRESTTest.h b/Modules/CppRestSdk/include/mitkRESTTest.h index 58d0d27efa..dd17110590 100644 --- a/Modules/CppRestSdk/include/mitkRESTTest.h +++ b/Modules/CppRestSdk/include/mitkRESTTest.h @@ -1,22 +1,23 @@ #ifndef MITKRESTTEST_H_ #define MITKRESTTEST_H_ #include "mitkIRESTManager.h" #include #include #include #include "mitkIRESTObserver.h" +#include "cpprest/json.h" namespace mitk { class RestTest: public IRESTObserver { public: RestTest(); ~RestTest(); void TestRESTServer(); - bool notify() override; + web::json::value notify(web::json::value data) override; private: }; } // namespace mitk #endif // !mitkRESTTest_h diff --git a/Modules/CppRestSdk/src/mitkRESTManager.cpp b/Modules/CppRestSdk/src/mitkRESTManager.cpp index 578b58305a..c945f57d30 100644 --- a/Modules/CppRestSdk/src/mitkRESTManager.cpp +++ b/Modules/CppRestSdk/src/mitkRESTManager.cpp @@ -1,93 +1,93 @@ #include "mitkRESTManager.h" #include mitk::RESTManager::RESTManager() {} mitk::RESTManager::~RESTManager() {} void mitk::RESTManager::sendRequest(RequestType type) { switch (type) { case get: // Call get in mitkRESTClientMicroService break; case post: // Call post in mitkRESTClientMicroService break; case put: // Call put in mitkRESTClientMicroService break; } } void mitk::RESTManager::receiveRequest(web::uri uri, mitk::IRESTObserver *observer) { // New instance of RESTServerMicroservice in m_ServerMap, key is port of the request int port = uri.port(); // Checking if port is free to add a new Server if (m_ServerMap.count(port) == 0) { // new observer has to be added std::pair key(uri.port(), uri.path()); m_Observer[key] = observer; // testing if entry has been added to observer map utility::string_t uristringt = uri.path(); std::string uristring(uristringt.begin(), uristringt.end()); MITK_INFO << uristring << " : Number of elements in map: " << m_Observer.count(key); // creating server instance RESTServerMicroService *server = new RESTServerMicroService(uri.authority()); // add reference to server instance to map m_ServerMap[port] = server; // info output utility::string_t host = uri.authority().to_string(); std::string hoststring(host.begin(), host.end()); MITK_INFO << "new server" << hoststring << " at port" << port; } // If there is already a server under this port else { // Same host, means new observer but not a new server instance if (m_ServerMap[port]->GetUri() == uri.authority()) { // new observer has to be added std::pair key(uri.port(), uri.path()); m_Observer[key] = observer; // testing if entry has been added to map utility::string_t uristringt = uri.to_string(); std::string uristring(uristringt.begin(), uristringt.end()); MITK_INFO << uristring << " : Number of elements in map: " << m_Observer.count(key); // info output MITK_INFO << "started listening, no new server instance has been created"; } // Error, since another server can't be added under this port else { MITK_ERROR << "there is already another server listening under this port"; } } } -// TODO replace boolean as return value by actual data -bool mitk::RESTManager::handle(web::uri uri) + +web::json::value mitk::RESTManager::handle(web::uri uri, web::json::value data) { // Checking if is there is a observer for the port and path std::pair key(uri.port(), uri.path()); if (m_Observer.count(key) != 0) { - // TODO replace by data - return m_Observer[key]->notify(); + MITK_INFO << "Manager: Data send to observer"; + return m_Observer[key]->notify(data); } //No map under this port, delete Server Object to release port for other servers else { MITK_WARN << "No Observer can handle the data"; - return false; + return NULL; } } diff --git a/Modules/CppRestSdk/src/mitkRESTServerMicroService.cpp b/Modules/CppRestSdk/src/mitkRESTServerMicroService.cpp index 7428b10c0c..14ad7a7576 100644 --- a/Modules/CppRestSdk/src/mitkRESTServerMicroService.cpp +++ b/Modules/CppRestSdk/src/mitkRESTServerMicroService.cpp @@ -1,68 +1,72 @@ #include "mitkRESTServerMicroService.h" #include #include #include mitk::RESTServerMicroService::RESTServerMicroService(web::uri uri) : m_Listener(uri) { m_Uri = uri; m_Listener.support(MitkRESTMethods::GET, std::bind(&RESTServerMicroService::HandleGet, this, std::placeholders::_1)); openListener(); } mitk::RESTServerMicroService::~RESTServerMicroService() { closeListener(); } pplx::task mitk::RESTServerMicroService::openListener() { return m_Listener.open(); } pplx::task mitk::RESTServerMicroService::closeListener() { return m_Listener.close(); } web::uri mitk::RESTServerMicroService::GetUri() { return m_Uri; } void mitk::RESTServerMicroService::HandleGet(MitkRequest request) { int port = m_Listener.uri().port(); //getting exact request uri has to be a parameter in handle function web::uri_builder build(m_Listener.uri()); build.append(request.absolute_uri()); utility::string_t uri = build.to_uri().to_string(); std::string uriString(uri.begin(), uri.end()); web::json::value content; //example content, has to be replace by getting actual modified data by handle content[L"key 1"] = web::json::value::string(U("this is a first test")); request.set_body(content); auto answer = request.extract_json().get(); MITK_INFO << "Test for Server at port " << port << " Exact request uri: " << uriString; - //TODO replace worked by data object - bool worked = false; + web::json::value worked; us::ModuleContext *context = us::GetModuleContext(); auto managerRef = context->GetServiceReference(); if (managerRef) { auto managerService = context->GetService(managerRef); if (managerService) { - worked = managerService->handle(build.to_uri()); + //TODO extract actual json from request body + web::json::value v; + MITK_INFO << "Server: Data send to manager"; + worked = managerService->handle(build.to_uri(), v); + MITK_INFO << "server: Data received from manager"; } } - if (worked) + if (worked!=NULL) { - //TODO return modified data - MITK_INFO << "Pipeline worked"; + request.reply(MitkRestStatusCodes::OK, worked); + } + else + { + request.reply(MitkRestStatusCodes::NotFound); } - - request.reply(MitkRestStatusCodes::OK, answer); } \ No newline at end of file diff --git a/Modules/CppRestSdk/src/mitkRESTTest.cpp b/Modules/CppRestSdk/src/mitkRESTTest.cpp index 7117db74ee..9237756534 100644 --- a/Modules/CppRestSdk/src/mitkRESTTest.cpp +++ b/Modules/CppRestSdk/src/mitkRESTTest.cpp @@ -1,30 +1,32 @@ #include "mitkRESTTest.h" #include #include #include mitk::RestTest::RestTest() {} mitk::RestTest::~RestTest() {} void mitk::RestTest::TestRESTServer() { us::ModuleContext *context = us::GetModuleContext(); auto managerRef = context->GetServiceReference(); if (managerRef) { auto managerService = context->GetService(managerRef); if (managerService) { managerService->receiveRequest(L"http://localhost:8080/test", this); managerService->receiveRequest(L"http://localhost:8080/example", this); managerService->receiveRequest(L"http://localhost:8090", this); } } } //TODO get Data, return modified Data -bool mitk::RestTest::notify() +web::json::value mitk::RestTest::notify(web::json::value data) { - return true; + MITK_INFO << "Observer: Data in observer"; + data[L"key 1"] = web::json::value::string(U("Data modified")); + return data; }