From 3ba4896adbc9fef1f9bfb1ba1b8dde0a32240b04 Mon Sep 17 00:00:00 2001 From: Franklin_Zhang Date: Wed, 17 Jan 2018 15:41:13 +0800 Subject: [PATCH 1/6] update gitgnore Signed-off-by: Franklin_Zhang --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 3c38058..2b1cad7 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ NJModelServiceSDK +.vscode \ No newline at end of file -- Gitee From ad7c68ccb7fe70b2269f7016372386b93365d4e2 Mon Sep 17 00:00:00 2001 From: Franklin_Zhang Date: Wed, 31 Jan 2018 11:17:20 +0800 Subject: [PATCH 2/6] update data creation Signed-off-by: Franklin_Zhang --- include/INxData.h | 4 +- include/INxFormParam.h | 31 +++++++++++ include/INxLocalFiles.h | 32 +++++++++++ include/INxServiceAccess.h | 6 +++ include/NxServiceAPI.h | 2 + src/NxData.cpp | 17 +++--- src/NxData.h | 23 +++++++- src/NxDataFactory.cpp | 23 +++++++- src/NxServiceAPI.cpp | 8 ++- src/NxServiceAccess.cpp | 48 ++++++++++++++++- src/NxServiceAccess.h | 4 ++ test/test.cpp | 9 +++- utils/NxFile.cpp | 66 +++++++++++++++++++++++ utils/NxFile.h | 41 +++++++++++++++ utils/NxFormParam.cpp | 67 +++++++++++++++++++++++ utils/NxFormParam.h | 40 ++++++++++++++ utils/NxHttp.cpp | 105 +++++++++++++++++++++++++++++++++---- utils/NxHttp.h | 9 +++- 18 files changed, 507 insertions(+), 28 deletions(-) create mode 100644 include/INxFormParam.h create mode 100644 include/INxLocalFiles.h create mode 100644 utils/NxFile.cpp create mode 100644 utils/NxFile.h create mode 100644 utils/NxFormParam.cpp create mode 100644 utils/NxFormParam.h diff --git a/include/INxData.h b/include/INxData.h index ca69f8b..32dd6ee 100644 --- a/include/INxData.h +++ b/include/INxData.h @@ -19,7 +19,7 @@ namespace NJGIS class INjData : public virtual INjService { public: - virtual int isExist(); + virtual int isExist() = 0; virtual const char* getID() = 0; @@ -33,7 +33,7 @@ namespace NJGIS virtual const char* getValue() = 0; - virtual int save(const char* path) = 0; + virtual int saveAs(const char* path) = 0; }; } } diff --git a/include/INxFormParam.h b/include/INxFormParam.h new file mode 100644 index 0000000..8a379d3 --- /dev/null +++ b/include/INxFormParam.h @@ -0,0 +1,31 @@ +#ifndef __NJGIS_INXFORMPARAM_H__ +#define __NJGIS_INXFORMPARAM_H__ + +#include "INxUnknown.h" + +namespace NJGIS +{ + namespace SERVICE + { + class INjFormParam : public virtual INxUnknown + { + public: + //! get params count + virtual int getCount() = 0; + + //! get the key of param + virtual const char* getKey(int index) = 0; + + //! get the value of the param by index + virtual const char* getValue(int index) = 0; + + //! get the value of the param by key + virtual const char* getValue(const char* key) = 0; + + //! add key and value + virtual int insertParam(const char* key, const char* value) = 0; + }; + } +} + +#endif \ No newline at end of file diff --git a/include/INxLocalFiles.h b/include/INxLocalFiles.h new file mode 100644 index 0000000..296b095 --- /dev/null +++ b/include/INxLocalFiles.h @@ -0,0 +1,32 @@ +#ifndef __NJGIS_INJLOCALFILE_H__ +#define __NJGIS_INJLOCALFILE_H__ + +#include "INxUnknown.h" + +namespace NJGIS +{ + namespace SERVICE + { + class INjLocalFiles : public virtual INxUnknown + { + public: + //! get files count + virtual int getCount() = 0; + + //! get files name by index + virtual const char* getName(int index) = 0; + + //! get files path by index + virtual const char* getPath(int index) = 0; + + //! get files path by name + virtual const char* getPath(const char* name) = 0; + + //! insert a item + virtual int insertFile(const char* name, const char* path) = 0; + }; + + } +} + +#endif \ No newline at end of file diff --git a/include/INxServiceAccess.h b/include/INxServiceAccess.h index ca3c4da..5f3d1b8 100644 --- a/include/INxServiceAccess.h +++ b/include/INxServiceAccess.h @@ -23,6 +23,12 @@ namespace NJGIS //! get a data service virtual NJGIS::SERVICE::INjData* getDataServiceByID(const char* id) = 0; + + //! upload a data file + virtual NJGIS::SERVICE::INjData* uploadDataByFile(const char* filepath, const char* tag) = 0; + + //! upload a data stream + virtual NJGIS::SERVICE::INjData* uploadDataStream(const char* stream, const char* tag) = 0; }; } diff --git a/include/NxServiceAPI.h b/include/NxServiceAPI.h index 23ec80b..f12980b 100644 --- a/include/NxServiceAPI.h +++ b/include/NxServiceAPI.h @@ -28,6 +28,8 @@ namespace NJGIS { namespace SERVICE { + extern "C" NJGIS_SERVICE int init(); + extern "C" NJGIS_SERVICE const char* getVersion(); extern "C" NJGIS_SERVICE NJGIS::SERVICE::INjServerFactory* createServerFactory(); diff --git a/src/NxData.cpp b/src/NxData.cpp index a3dde88..5bfd5f6 100644 --- a/src/NxData.cpp +++ b/src/NxData.cpp @@ -2,22 +2,22 @@ int NJGIS::SERVICE::NjData::isExist() { - return NULL; + return 0; } const char* NJGIS::SERVICE::NjData::getID() { - return NULL; + return this->_id.c_str(); } const char* NJGIS::SERVICE::NjData::getTag() { - return NULL; + return this->_tag.c_str(); } const char* NJGIS::SERVICE::NjData::getGenarationDateTime() { - return NULL; + return this->_genarationDateTime.c_str(); } NJGIS::SERVICE::NjDataType NJGIS::SERVICE::NjData::getType() @@ -27,16 +27,15 @@ NJGIS::SERVICE::NjDataType NJGIS::SERVICE::NjData::getType() int NJGIS::SERVICE::NjData::getSize() { - return NULL; + return this->_size; } const char* NJGIS::SERVICE::NjData::getValue() { - return NULL; + return this->_value.c_str(); } -int NJGIS::SERVICE::NjData::save( const char* path ) +int NJGIS::SERVICE::NjData::saveAs( const char* path ) { return NULL; -} - +} \ No newline at end of file diff --git a/src/NxData.h b/src/NxData.h index 825a895..83ea02a 100644 --- a/src/NxData.h +++ b/src/NxData.h @@ -11,6 +11,27 @@ namespace NJGIS class NjData : public virtual INjData, public virtual NjService { public: + NjData(){}; + + NjData( + const char* id, + const char* tag, + int size, + const char* genarationDateTime, + NJGIS::SERVICE::NjDataType type, + const char* value, + const char* ip, + int port + ): + _id(id), + _tag(tag), + _size(size), + _genarationDateTime(genarationDateTime), + _type(type), + _value(value), + NjService(ip, port) + {}; + virtual int isExist(); virtual const char* getID(); @@ -25,7 +46,7 @@ namespace NJGIS virtual const char* getValue(); - virtual int save( const char* path ); + virtual int saveAs( const char* path ); private: std::string _id; diff --git a/src/NxDataFactory.cpp b/src/NxDataFactory.cpp index 414625d..f252ef9 100644 --- a/src/NxDataFactory.cpp +++ b/src/NxDataFactory.cpp @@ -1,6 +1,27 @@ #include "NxDataFactory.h" +#include "NxData.h" NJGIS::SERVICE::INjData* NJGIS::SERVICE::NjDataFactory::createDataByJSON( Json::Value jData, const char* ip, int port ) { - return NULL; + std::string gd_id = jData["gd_id"].asString(); + std::string gd_tag = jData["gd_tag"].asString(); + std::string gd_datetime = jData["gd_datetime"].asString(); + std::string gd_type = jData["gd_type"].asString(); + NJGIS::SERVICE::NjDataType type; + if (gd_type == "XML") + { + type = NJGIS::SERVICE::NjDataType::XML; + } + else if (gd_type == "ZIP") + { + type = NJGIS::SERVICE::NjDataType::ZIP; + } + else if (gd_type == "RAW") + { + type = NJGIS::SERVICE::NjDataType::RAW; + } + int gd_size = jData["gd_size"].asInt(); + std::string gd_value = jData["gd_value"].asString(); + NJGIS::SERVICE::INjData* pData = new NJGIS::SERVICE::NjData(gd_id.c_str(), gd_tag.c_str(), gd_size, gd_datetime.c_str(), type, gd_value.c_str(), ip, port); + return pData; } \ No newline at end of file diff --git a/src/NxServiceAPI.cpp b/src/NxServiceAPI.cpp index 0328756..ad2375a 100644 --- a/src/NxServiceAPI.cpp +++ b/src/NxServiceAPI.cpp @@ -1,5 +1,6 @@ #include "../include/NxServiceAPI.h" #include "NxServerFactory.h" +#include "../utils/NxHttp.h" extern "C" NJGIS_SERVICE const char* NJGIS::SERVICE::getVersion() { @@ -9,4 +10,9 @@ extern "C" NJGIS_SERVICE const char* NJGIS::SERVICE::getVersion() extern "C" NJGIS_SERVICE NJGIS::SERVICE::INjServerFactory* NJGIS::SERVICE::createServerFactory() { return new NJGIS::SERVICE::NjServerFactory(); -} \ No newline at end of file +} + +extern "C" NJGIS_SERVICE int NJGIS::SERVICE::init() +{ + return NJGIS::SERVICE::NjHttpHelper::init(); +} diff --git a/src/NxServiceAccess.cpp b/src/NxServiceAccess.cpp index c58345c..1eb5e0a 100644 --- a/src/NxServiceAccess.cpp +++ b/src/NxServiceAccess.cpp @@ -1,6 +1,7 @@ #include "NxServiceAccess.h" #include "NxModelService.h" #include "NxModelServiceFactory.h" +#include "NxDataFactory.h" #include "../utils/NxHttp.h" int NJGIS::SERVICE::NjServiceAccess::getModelServicesList( std::vector &list ) @@ -54,6 +55,51 @@ int NJGIS::SERVICE::NjServiceAccess::getModelServicesByName( const char* name, s NJGIS::SERVICE::INjData* NJGIS::SERVICE::NjServiceAccess::getDataServiceByID( const char* id ) { - // TODO YL + std::string url; + this->getBaseUrl(url); + url = url + "modelser/json/" + id; + Json::Value jResonese; + NJGIS::SERVICE::NjHttpHelper::request_get_json_sync(url.c_str(), jResonese); + + if(jResonese["result"].asString() == "suc") + { + Json::Value jData = jResonese["data"]; + if(jData.asString() == "") + { + return NULL; + } + NJGIS::SERVICE::INjData* pData = NJGIS::SERVICE::NjDataFactory::createDataByJSON(jData, this->getIP(), this->getPort()); + return pData; + } + return NULL; +} + +NJGIS::SERVICE::INjData* NJGIS::SERVICE::NjServiceAccess::uploadDataByFile( const char* filepath, const char* tag ) +{ + std::string url = ""; + this->getBaseUrl(url); + url = url + "geodata?type=file"; + + NJGIS::SERVICE::INjFormParam* pFormData = NJGIS::SERVICE::NjFormHelper::createForm(); + NJGIS::SERVICE::INjLocalFiles* pFiles = NJGIS::SERVICE::NjFileHelper::createLocalFiles(); + + pFiles->insertFile(filepath, "myfile"); + pFormData->insertParam("gd_tag", tag); + + Json::Value jResonese; + int code = NJGIS::SERVICE::NjHttpHelper::request_post_withform_json_sync(url.c_str(), pFormData, pFiles, jResonese); + if(code != 1) return NULL; + if(jResonese["res"].asString() == "suc") + { + std::string gdid = jResonese["gd_id"].asString(); + NJGIS::SERVICE::INjData* pData = NJGIS::SERVICE::NjDataFactory::createDataByJSON(jResonese, this->getIP(), this->getPort()); + return pData; + } + + return NULL; +} + +NJGIS::SERVICE::INjData* NJGIS::SERVICE::NjServiceAccess::uploadDataStream( const char* stream, const char* tag ) +{ return NULL; } diff --git a/src/NxServiceAccess.h b/src/NxServiceAccess.h index d0451f1..e9ac1b2 100644 --- a/src/NxServiceAccess.h +++ b/src/NxServiceAccess.h @@ -22,6 +22,10 @@ namespace NJGIS virtual NJGIS::SERVICE::INjData* getDataServiceByID( const char* id ); + virtual NJGIS::SERVICE::INjData* uploadDataByFile( const char* filepath, const char* tag ); + + virtual NJGIS::SERVICE::INjData* uploadDataStream( const char* stream, const char* tag ); + }; } } diff --git a/test/test.cpp b/test/test.cpp index 9938bad..fc768fd 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -2,10 +2,12 @@ #include #include + int main() { + int njs_init = NJGIS::SERVICE::init(); NJGIS::SERVICE::INjServerFactory* pServerFactory = NJGIS::SERVICE::createServerFactory(); - NJGIS::SERVICE::INjServer* pServer = pServerFactory->createServer("172.21.212.119"); + NJGIS::SERVICE::INjServer* pServer = pServerFactory->createServer("127.0.0.1"); if(pServer != NULL) { if(pServer->connect() == 1) @@ -19,6 +21,11 @@ int main() if(list_ms[i] == NULL) continue; std::cout << list_ms[i]->getServiceOID() << " - " << list_ms[i]->getServiceName() << " - " << list_ms[i]->getServiceType() << std::endl; } + NJGIS::SERVICE::INjData* pData = pServiceAccess->uploadDataByFile("E:/DemoData/test/static4.xml", "static4.xml"); + if(pData != NULL) + { + std::cout << pData->getID() << " - " << pData->getSize() << " - " << pData->getGenarationDateTime() << " - " << pData->getTag() << std::endl; + } } } diff --git a/utils/NxFile.cpp b/utils/NxFile.cpp new file mode 100644 index 0000000..034a5d0 --- /dev/null +++ b/utils/NxFile.cpp @@ -0,0 +1,66 @@ +#include "NxFile.h" + + +int NJGIS::SERVICE::NjLocalFiles::getCount() +{ + return this->_mFiles.size(); +} + +int NJGIS::SERVICE::NjLocalFiles::getIterByIndex( int index, std::map::iterator &iter ) +{ + if(index > this->_mFiles.size()) + { + return -2; + } + int localIndex = 0; + for(iter = this->_mFiles.begin(); iter != this->_mFiles.end(); ++iter ) + { + index++; + if(localIndex == index) + { + return 1; + } + } + return -1; +} + +const char* NJGIS::SERVICE::NjLocalFiles::getName( int index ) +{ + std::map::iterator iter; + if(this->getIterByIndex(index, iter) == 1) + { + return iter->first.c_str(); + } + return NULL; +} + +const char* NJGIS::SERVICE::NjLocalFiles::getPath( int index ) +{ + std::map::iterator iter; + if(this->getIterByIndex(index, iter) == 1) + { + return iter->second.c_str(); + } + return NULL; +} + +const char* NJGIS::SERVICE::NjLocalFiles::getPath( const char* name ) +{ + std::map::iterator iter = this->_mFiles.find(name); + if (iter != this->_mFiles.end()) + { + return iter->second.c_str(); + } + return NULL; +} + +int NJGIS::SERVICE::NjLocalFiles::insertFile( const char* name, const char* path ) +{ + this->_mFiles.insert(std::pair(name, path)); + return 1; +} + +NJGIS::SERVICE::INjLocalFiles* NJGIS::SERVICE::NjFileHelper::createLocalFiles() +{ + return new NJGIS::SERVICE::NjLocalFiles(); +} diff --git a/utils/NxFile.h b/utils/NxFile.h new file mode 100644 index 0000000..c59bcf1 --- /dev/null +++ b/utils/NxFile.h @@ -0,0 +1,41 @@ +#ifndef __NJGIS_NJFILE_H__ +#define __NJGIS_NJFILE_H__ + +#include +#include +#include "../include/INxLocalFiles.h" + +namespace NJGIS +{ + namespace SERVICE + { + class NjLocalFiles : public virtual INjLocalFiles + { + public: + + virtual int getCount(); + + virtual const char* getName( int index ); + + virtual const char* getPath( int index ); + + virtual const char* getPath( const char* name ); + + virtual int insertFile( const char* name, const char* path ); + + private: + virtual int getIterByIndex( int index, std::map::iterator &iter ); + + private: + std::map _mFiles; + }; + + class NjFileHelper + { + public: + static INjLocalFiles* createLocalFiles(); + }; + } +} + +#endif \ No newline at end of file diff --git a/utils/NxFormParam.cpp b/utils/NxFormParam.cpp new file mode 100644 index 0000000..e85edf0 --- /dev/null +++ b/utils/NxFormParam.cpp @@ -0,0 +1,67 @@ +#include +#include "NxFormParam.h" + +int NJGIS::SERVICE::NjFormParam::getCount() +{ + return this->_mParams.size(); +} + +int NJGIS::SERVICE::NjFormParam::getIterByIndex( int index, std::map::iterator &iter ) +{ + if(index > this->_mParams.size()) + { + return -2; + } + int localIndex = 0; + for(iter = this->_mParams.begin(); iter != this->_mParams.end(); ++iter ) + { + index++; + if(localIndex == index) + { + return 1; + } + } + return -1; +} + +const char* NJGIS::SERVICE::NjFormParam::getKey( int index ) +{ + std::map::iterator iter; + if(this->getIterByIndex(index, iter) == 1) + { + return iter->first.c_str(); + } + return NULL; +} + +const char* NJGIS::SERVICE::NjFormParam::getValue( int index ) +{ + std::map::iterator iter; + if(this->getIterByIndex(index, iter) == 1) + { + return iter->second.c_str(); + } + return NULL; +} + +const char* NJGIS::SERVICE::NjFormParam::getValue( const char* key ) +{ + std::map::iterator iter = this->_mParams.find(key); + if(iter != this->_mParams.end()) + { + return iter->second.c_str(); + } + return NULL; +} + +int NJGIS::SERVICE::NjFormParam::insertParam( const char* key, const char* value ) +{ + this->_mParams.insert(std::pair(key, value)); + return 1; +} + + +NJGIS::SERVICE::INjFormParam* NJGIS::SERVICE::NjFormHelper::createForm() +{ + return new NJGIS::SERVICE::NjFormParam(); +} diff --git a/utils/NxFormParam.h b/utils/NxFormParam.h new file mode 100644 index 0000000..3778abc --- /dev/null +++ b/utils/NxFormParam.h @@ -0,0 +1,40 @@ +#ifndef __NJGIS_NJFORMPARAM_H__ +#define __NJGIS_NJFORMPARAM_H__ + +#include +#include "../include/INxFormParam.h" + +namespace NJGIS +{ + namespace SERVICE + { + class NjFormParam : public virtual INjFormParam + { + public: + virtual int getCount(); + + virtual const char* getKey( int index ); + + virtual const char* getValue( int index ); + + virtual const char* getValue( const char* key ); + + virtual int insertParam( const char* key, const char* value ); + + private: + virtual int getIterByIndex(int index, std::map::iterator &iter); + + private: + std::map _mParams; + + }; + + class NjFormHelper + { + public: + static INjFormParam* createForm(); + }; + } +} + +#endif \ No newline at end of file diff --git a/utils/NxHttp.cpp b/utils/NxHttp.cpp index 05c82ad..36b4b69 100644 --- a/utils/NxHttp.cpp +++ b/utils/NxHttp.cpp @@ -1,15 +1,21 @@ #include "NxHttp.h" #include "curl/curl.h" +size_t NJGIS::SERVICE::NjHttpHelper::req_reply( void *ptr, size_t size, size_t nmemb, void *stream ) +{ + std::string *str = (std::string*)stream; + (*str).append((char*)ptr, size*nmemb); + return size * nmemb; +} + int NJGIS::SERVICE::NjHttpHelper::init() { curl_global_init(CURL_GLOBAL_ALL); return 1; } -int NJGIS::SERVICE::NjHttpHelper::request_get_sync( const char* url, std::string &responesbody ) +int NJGIS::SERVICE::NjHttpHelper::request_get_sync( const char* url, std::string &responsebody ) { - curl_global_init(CURL_GLOBAL_ALL); // init curl CURL *curl = curl_easy_init(); // res code @@ -27,7 +33,7 @@ int NJGIS::SERVICE::NjHttpHelper::request_get_sync( const char* url, std::string curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NJGIS::SERVICE::NjHttpHelper::req_reply); curl_easy_setopt(curl, CURLOPT_HEADERDATA, (void *)&head); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&responesbody); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&responsebody); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3); // set transport and time out time curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3); @@ -40,9 +46,79 @@ int NJGIS::SERVICE::NjHttpHelper::request_get_sync( const char* url, std::string return 1; } -int NJGIS::SERVICE::NjHttpHelper::request_post_sync( const char* url ) +int NJGIS::SERVICE::NjHttpHelper::request_post_withform_sync( const char* url, INjFormParam* &list_form, INjLocalFiles* &list_files, std::string &responsebody ) { - return 0; + // init curl + CURL *curl = curl_easy_init(); + // res code + CURLcode res; + + struct curl_httppost *formpost=NULL; + struct curl_httppost *lastptr=NULL; + struct curl_slist *headerlist=NULL; + static const char buf[] = "Expect:"; + // head + std::string head; + + curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, "filename", + CURLFORM_END); + + for(int i = 0 ; i < list_form->getCount(); i++) + { + /* Fill in the param field */ + curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, list_form->getKey(i), + CURLFORM_COPYCONTENTS, list_form->getValue(i), + CURLFORM_END); + } + + for(int i = 0; i < list_files->getCount(); i++) + { + /* Fill in the file upload field */ + curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, list_files->getName(i), + CURLFORM_FILE, list_files->getPath(i), + CURLFORM_END); + } + curl = curl_easy_init(); + headerlist = curl_slist_append(headerlist, buf); + if(curl) + { + /* what URL that receives this POST */ + curl_easy_setopt(curl, CURLOPT_URL, url); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist); + curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); + + curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NJGIS::SERVICE::NjHttpHelper::req_reply); + curl_easy_setopt(curl, CURLOPT_HEADERDATA, (void *)&head); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&responsebody); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3); // set transport and time out time + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3); + + /* Perform the request, res will get the return code */ + res = curl_easy_perform(curl); + /* Check for errors */ + if(res != CURLE_OK) + { + fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); + } + + /* always cleanup */ + curl_easy_cleanup(curl); + + /* then cleanup the formpost chain */ + curl_formfree(formpost); + /* free slist */ + curl_slist_free_all (headerlist); + } + + return 1; } int NJGIS::SERVICE::NjHttpHelper::request_get_json_sync( const char* url, Json::Value &value ) @@ -60,9 +136,18 @@ int NJGIS::SERVICE::NjHttpHelper::request_get_json_sync( const char* url, Json:: } } -size_t NJGIS::SERVICE::NjHttpHelper::req_reply( void *ptr, size_t size, size_t nmemb, void *stream ) -{ - std::string *str = (std::string*)stream; - (*str).append((char*)ptr, size*nmemb); - return size * nmemb; +int NJGIS::SERVICE::NjHttpHelper::request_post_withform_json_sync( const char* url, INjFormParam* &list_form, INjLocalFiles* &list_files, Json::Value &value ) +{ + std::string body; + int res = NJGIS::SERVICE::NjHttpHelper::request_post_withform_sync(url, list_form, list_files, body); + Json::Reader reader; + if (reader.parse(body, value)) + { + return 1; + } + else + { + return -2; + } + } diff --git a/utils/NxHttp.h b/utils/NxHttp.h index 294c703..f57dc2f 100644 --- a/utils/NxHttp.h +++ b/utils/NxHttp.h @@ -5,6 +5,8 @@ #include "curl/curl.h" #include "json/json.h" +#include "NxFile.h" +#include "NxFormParam.h" namespace NJGIS { @@ -18,15 +20,18 @@ namespace NJGIS /* TEST */ //! Request -GET - static int request_get_sync(const char* url, std::string &responesbody); + static int request_get_sync(const char* url, std::string &responsebody); //! Request -POST - static int request_post_sync(const char* url); + static int request_post_withform_sync( const char* url, INjFormParam* &list_form, INjLocalFiles* &list_files, std::string &responsebody ); /* JSON */ //! Request -GET static int request_get_json_sync(const char* url, Json::Value &value); + //! Request -Post + static int request_post_withform_json_sync(const char* url, INjFormParam* &list_form, INjLocalFiles* &list_files, Json::Value &value); + private: //! reply static size_t req_reply(void *ptr, size_t size, size_t nmemb, void *stream); -- Gitee From 18c4e8435d11b1731f06b72ada8a0bb80ecb8414 Mon Sep 17 00:00:00 2001 From: Franklin_Zhang Date: Thu, 1 Feb 2018 11:01:42 +0800 Subject: [PATCH 3/6] update data cpp files Signed-off-by: Franklin_Zhang --- include/INxData.h | 7 +-- src/NxDataFactory.cpp | 14 ++++-- src/NxServiceAccess.cpp | 18 ++++++-- test/test.cpp | 2 +- utils/NxFile.cpp | 2 +- utils/NxFormParam.cpp | 2 +- utils/NxHttp.cpp | 100 ++++++++++++++++++++-------------------- 7 files changed, 81 insertions(+), 64 deletions(-) diff --git a/include/INxData.h b/include/INxData.h index 32dd6ee..90686e8 100644 --- a/include/INxData.h +++ b/include/INxData.h @@ -11,9 +11,10 @@ namespace NJGIS //! type of data typedef enum { - RAW = 1, - XML = 2, - ZIP = 3 + DAT_UNKNOWN = 0, + DAT_RAW = 1, + DAT_XML = 2, + DAT_ZIP = 3 } NjDataType; class INjData : public virtual INjService diff --git a/src/NxDataFactory.cpp b/src/NxDataFactory.cpp index f252ef9..dacac75 100644 --- a/src/NxDataFactory.cpp +++ b/src/NxDataFactory.cpp @@ -10,17 +10,23 @@ NJGIS::SERVICE::INjData* NJGIS::SERVICE::NjDataFactory::createDataByJSON( Json:: NJGIS::SERVICE::NjDataType type; if (gd_type == "XML") { - type = NJGIS::SERVICE::NjDataType::XML; + type = NJGIS::SERVICE::NjDataType::DAT_XML; } else if (gd_type == "ZIP") { - type = NJGIS::SERVICE::NjDataType::ZIP; + type = NJGIS::SERVICE::NjDataType::DAT_ZIP; } else if (gd_type == "RAW") { - type = NJGIS::SERVICE::NjDataType::RAW; + type = NJGIS::SERVICE::NjDataType::DAT_RAW; } - int gd_size = jData["gd_size"].asInt(); + else + { + type = NJGIS::SERVICE::NjDataType::DAT_UNKNOWN; + } + // int gd_size = jData["gd_size"].asInt(); + std::string sszie = jData["gd_size"].asString(); + int gd_size = atoi(sszie.c_str()); std::string gd_value = jData["gd_value"].asString(); NJGIS::SERVICE::INjData* pData = new NJGIS::SERVICE::NjData(gd_id.c_str(), gd_tag.c_str(), gd_size, gd_datetime.c_str(), type, gd_value.c_str(), ip, port); return pData; diff --git a/src/NxServiceAccess.cpp b/src/NxServiceAccess.cpp index 1eb5e0a..5b7283a 100644 --- a/src/NxServiceAccess.cpp +++ b/src/NxServiceAccess.cpp @@ -76,6 +76,9 @@ NJGIS::SERVICE::INjData* NJGIS::SERVICE::NjServiceAccess::getDataServiceByID( co NJGIS::SERVICE::INjData* NJGIS::SERVICE::NjServiceAccess::uploadDataByFile( const char* filepath, const char* tag ) { + //! TODO Check the file + + std::string url = ""; this->getBaseUrl(url); url = url + "geodata?type=file"; @@ -83,7 +86,7 @@ NJGIS::SERVICE::INjData* NJGIS::SERVICE::NjServiceAccess::uploadDataByFile( cons NJGIS::SERVICE::INjFormParam* pFormData = NJGIS::SERVICE::NjFormHelper::createForm(); NJGIS::SERVICE::INjLocalFiles* pFiles = NJGIS::SERVICE::NjFileHelper::createLocalFiles(); - pFiles->insertFile(filepath, "myfile"); + pFiles->insertFile("myfile", filepath); pFormData->insertParam("gd_tag", tag); Json::Value jResonese; @@ -92,8 +95,17 @@ NJGIS::SERVICE::INjData* NJGIS::SERVICE::NjServiceAccess::uploadDataByFile( cons if(jResonese["res"].asString() == "suc") { std::string gdid = jResonese["gd_id"].asString(); - NJGIS::SERVICE::INjData* pData = NJGIS::SERVICE::NjDataFactory::createDataByJSON(jResonese, this->getIP(), this->getPort()); - return pData; + + //! get the data information + this->getBaseUrl(url); + url = url + "geodata/json/" + gdid; + Json::Value jGeoData; + NJGIS::SERVICE::NjHttpHelper::request_get_json_sync(url.c_str(), jGeoData); + if (jGeoData["result"].asString() == "suc") + { + NJGIS::SERVICE::INjData* pData = NJGIS::SERVICE::NjDataFactory::createDataByJSON(jGeoData["data"], this->getIP(), this->getPort()); + return pData; + } } return NULL; diff --git a/test/test.cpp b/test/test.cpp index fc768fd..57078b6 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -21,7 +21,7 @@ int main() if(list_ms[i] == NULL) continue; std::cout << list_ms[i]->getServiceOID() << " - " << list_ms[i]->getServiceName() << " - " << list_ms[i]->getServiceType() << std::endl; } - NJGIS::SERVICE::INjData* pData = pServiceAccess->uploadDataByFile("E:/DemoData/test/static4.xml", "static4.xml"); + NJGIS::SERVICE::INjData* pData = pServiceAccess->uploadDataByFile("E:\\DemoData\\GeoModeling\\sqrt_demo.xml", "sqrt_demo.xml"); if(pData != NULL) { std::cout << pData->getID() << " - " << pData->getSize() << " - " << pData->getGenarationDateTime() << " - " << pData->getTag() << std::endl; diff --git a/utils/NxFile.cpp b/utils/NxFile.cpp index 034a5d0..a732e56 100644 --- a/utils/NxFile.cpp +++ b/utils/NxFile.cpp @@ -15,11 +15,11 @@ int NJGIS::SERVICE::NjLocalFiles::getIterByIndex( int index, std::map_mFiles.begin(); iter != this->_mFiles.end(); ++iter ) { - index++; if(localIndex == index) { return 1; } + localIndex++; } return -1; } diff --git a/utils/NxFormParam.cpp b/utils/NxFormParam.cpp index e85edf0..abfcd7b 100644 --- a/utils/NxFormParam.cpp +++ b/utils/NxFormParam.cpp @@ -15,11 +15,11 @@ int NJGIS::SERVICE::NjFormParam::getIterByIndex( int index, std::map_mParams.begin(); iter != this->_mParams.end(); ++iter ) { - index++; if(localIndex == index) { return 1; } + localIndex++; } return -1; } diff --git a/utils/NxHttp.cpp b/utils/NxHttp.cpp index 36b4b69..c6a08b2 100644 --- a/utils/NxHttp.cpp +++ b/utils/NxHttp.cpp @@ -46,52 +46,49 @@ int NJGIS::SERVICE::NjHttpHelper::request_get_sync( const char* url, std::string return 1; } -int NJGIS::SERVICE::NjHttpHelper::request_post_withform_sync( const char* url, INjFormParam* &list_form, INjLocalFiles* &list_files, std::string &responsebody ) +int NJGIS::SERVICE::NjHttpHelper::request_post_withform_sync( const char* url, NJGIS::SERVICE::INjFormParam* &list_form, NJGIS::SERVICE::INjLocalFiles* &list_files, std::string &responsebody ) { - // init curl - CURL *curl = curl_easy_init(); - // res code + CURL *curl; CURLcode res; - struct curl_httppost *formpost=NULL; - struct curl_httppost *lastptr=NULL; - struct curl_slist *headerlist=NULL; - static const char buf[] = "Expect:"; - // head std::string head; - - curl_formadd(&formpost, - &lastptr, - CURLFORM_COPYNAME, "filename", - CURLFORM_END); - - for(int i = 0 ; i < list_form->getCount(); i++) + + struct curl_httppost *formpost=NULL; + struct curl_httppost *lastptr=NULL; + struct curl_slist *headerlist=NULL; + static const char buf[] = "Expect:"; + + curl_global_init(CURL_GLOBAL_ALL); + + /* Fill in the file upload field */ + for (int i = 0 ; i < list_files->getCount(); i++) { - /* Fill in the param field */ - curl_formadd(&formpost, - &lastptr, - CURLFORM_COPYNAME, list_form->getKey(i), - CURLFORM_COPYCONTENTS, list_form->getValue(i), - CURLFORM_END); + curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, list_files->getName(i), + CURLFORM_FILE, list_files->getPath(i), + CURLFORM_END); } - - for(int i = 0; i < list_files->getCount(); i++) + + + /* Fill in the submit field too, even if this is rarely needed */ + for (int i = 0; i < list_form->getCount(); i++) { - /* Fill in the file upload field */ - curl_formadd(&formpost, - &lastptr, - CURLFORM_COPYNAME, list_files->getName(i), - CURLFORM_FILE, list_files->getPath(i), + curl_formadd(&formpost, + &lastptr, + CURLFORM_COPYNAME, list_form->getKey(i), + CURLFORM_COPYCONTENTS, list_form->getValue(i), CURLFORM_END); } + curl = curl_easy_init(); - headerlist = curl_slist_append(headerlist, buf); - if(curl) - { - /* what URL that receives this POST */ + /* initialize custom header list (stating that Expect: 100-continue is not + wanted */ + headerlist = curl_slist_append(headerlist, buf); + if(curl) { + /* what URL that receives this POST */ curl_easy_setopt(curl, CURLOPT_URL, url); - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist); - curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); + curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NJGIS::SERVICE::NjHttpHelper::req_reply); @@ -99,24 +96,25 @@ int NJGIS::SERVICE::NjHttpHelper::request_post_withform_sync( const char* url, I curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&responsebody); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3); // set transport and time out time - curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3); - - /* Perform the request, res will get the return code */ - res = curl_easy_perform(curl); - /* Check for errors */ + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3); + + /* Perform the request, res will get the return code */ + res = curl_easy_perform(curl); + /* Check for errors */ if(res != CURLE_OK) { - fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); - } - - /* always cleanup */ - curl_easy_cleanup(curl); - - /* then cleanup the formpost chain */ - curl_formfree(formpost); - /* free slist */ - curl_slist_free_all (headerlist); - } + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + } + + /* always cleanup */ + curl_easy_cleanup(curl); + + /* then cleanup the formpost chain */ + curl_formfree(formpost); + /* free slist */ + curl_slist_free_all (headerlist); + } return 1; } -- Gitee From c55d42fe56dd8442dfc65c8e118e37296b2ce4dc Mon Sep 17 00:00:00 2001 From: Franklin_Zhang Date: Thu, 1 Feb 2018 23:18:43 +0800 Subject: [PATCH 4/6] update invoking interface Signed-off-by: Franklin_Zhang --- include/INxDataConfiguration.h | 10 +++--- include/INxModelService.h | 22 ++++++------ include/INxServiceAccess.h | 5 ++- src/NxDataConfiguration.cpp | 64 ++++++++++++++++++++++++++++++++++ src/NxDataConfiguration.h | 39 +++++++++++++++++++++ src/NxModelService.cpp | 42 ++++++++++++++++++++-- src/NxModelService.h | 2 +- src/NxServiceAccess.cpp | 5 +++ src/NxServiceAccess.h | 3 ++ test/test.cpp | 10 +++++- 10 files changed, 181 insertions(+), 21 deletions(-) create mode 100644 src/NxDataConfiguration.cpp create mode 100644 src/NxDataConfiguration.h diff --git a/include/INxDataConfiguration.h b/include/INxDataConfiguration.h index c4d7137..5b90658 100644 --- a/include/INxDataConfiguration.h +++ b/include/INxDataConfiguration.h @@ -10,12 +10,14 @@ namespace NJGIS class INjDataConfiguration : public virtual INxUnknown { - public: - virtual int pushData(const char* state, const char* event, const INjData* data) = 0; + public: + virtual int getCount() = 0; - virtual int getCount() = 0; + virtual int insertData(const char* state, const char* event, INjData* data) = 0; - virtual int getData(std::string& state, std::string& event, INjData* &data) = 0; + virtual int getData(int index, std::string &state, std::string &event, INjData* &data) = 0; + + virtual INjData* getData(const char* state, const char* event) = 0; }; } } diff --git a/include/INxModelService.h b/include/INxModelService.h index b78201f..827c525 100644 --- a/include/INxModelService.h +++ b/include/INxModelService.h @@ -11,31 +11,31 @@ namespace NJGIS //! type of platform typedef enum { - UNKNOWN = 0, - WINDOWS = 1, - LINUX = 2, - MACOS = 4 + PLF_UNKNOWN = 0, + PLF_WINDOWS = 1, + PLF_LINUX = 2, + PLF_MACOS = 4 } NjPlatform; //! type of service status typedef enum { - OFFLINE = 0, - ONLINE = 1 + STAT_OFFLINE = 0, + STAT_ONLINE = 1 } NjModelServiceStatus; //! type of limitation typedef enum { - PRIVATE = 0, - PUBLIC = 1 + LMT_PRIVATE = 0, + LMT_PUBLIC = 1 } NjModelServiceLimitation; //! type of permission typedef enum { - OPEN = 0, - PERMISSION = 1 + PMS_OPEN = 0, + PMS_PERMISSION = 1 } NjModelServicePermission; //! model service @@ -94,7 +94,7 @@ namespace NJGIS virtual const NJGIS::SERVICE::NjModelServicePermission getServicePermission() = 0; //! invoke service - virtual int invoke(const INjDataConfiguration* config, std::string& recordid) = 0; + virtual int invoke(INjDataConfiguration* config, std::string& recordid) = 0; //! get laster information virtual int refresh() = 0; diff --git a/include/INxServiceAccess.h b/include/INxServiceAccess.h index 5f3d1b8..ef08e15 100644 --- a/include/INxServiceAccess.h +++ b/include/INxServiceAccess.h @@ -2,7 +2,7 @@ #define __NJGIS_INJSERVICEACCESS_H__ #include "INxModelService.h" -#include "INxData.h" +#include "INxDataConfiguration.h" #include namespace NJGIS @@ -29,6 +29,9 @@ namespace NJGIS //! upload a data stream virtual NJGIS::SERVICE::INjData* uploadDataStream(const char* stream, const char* tag) = 0; + + //! create a data configuration + virtual NJGIS::SERVICE::INjDataConfiguration* createDataConfig() = 0; }; } diff --git a/src/NxDataConfiguration.cpp b/src/NxDataConfiguration.cpp new file mode 100644 index 0000000..ea0346b --- /dev/null +++ b/src/NxDataConfiguration.cpp @@ -0,0 +1,64 @@ +#include "NxDataConfiguration.h" + +NJGIS::SERVICE::NjDataConfiguration::~NjDataConfiguration() +{ + +} + +int NJGIS::SERVICE::NjDataConfiguration::getCount() +{ + return this->_items.size(); +} + +int NJGIS::SERVICE::NjDataConfiguration::insertData( const char* state, const char* event, NJGIS::SERVICE::INjData* data ) +{ + for(int i = 0; i < this->_items.size(); i++) + { + if((strcmp(this->_items[i].state, state) == 0) && (strcmp(this->_items[i].event, event) == 0)) + { + this->_items[i].data = (void*)data; + return 2; + } + } + NjDataConfigItem item; + char* cstate = new char[strlen(state)]; + char* cevent = new char[strlen(event)]; + strcpy(cstate, state); + strcpy(cevent, event); + item.state = cstate; + item.event = cevent; + item.data = (void*)data; + this->_items.push_back(item); + return 1; +} + +int NJGIS::SERVICE::NjDataConfiguration::getData( int index, std::string &state, std::string &event, NJGIS::SERVICE::INjData* &data ) +{ + if(index > (this->_items.size() - 1) || index < 0) + { + return -2; + } + for(int i = 0; i < this->_items.size(); i++) + { + if(i == index) + { + state = std::string(this->_items[i].state); + event = std::string(this->_items[i].event); + data = (NJGIS::SERVICE::INjData*)this->_items[i].data; + return 1; + } + } + return 0; +} + +NJGIS::SERVICE::INjData* NJGIS::SERVICE::NjDataConfiguration::getData( const char* state, const char* event ) +{ + for(int i = 0; i < this->_items.size(); i++) + { + if((strcmp(this->_items[i].state, state) == 0) && (strcmp(this->_items[i].event, event) == 0)) + { + return (NJGIS::SERVICE::INjData*)this->_items[i].data; + } + } + return NULL; +} diff --git a/src/NxDataConfiguration.h b/src/NxDataConfiguration.h new file mode 100644 index 0000000..c7e18f6 --- /dev/null +++ b/src/NxDataConfiguration.h @@ -0,0 +1,39 @@ +#ifndef __NJGIS_NJDATACONFIGURATION_H__ +#define __NJGIS_NJDATACONFIGURATION_H__ + +#include +#include +#include +#include "../include/INxDataConfiguration.h" + +namespace NJGIS +{ + namespace SERVICE + { + typedef struct + { + const char* state; + const char* event; + void* data; + }NjDataConfigItem; + + class NjDataConfiguration : public virtual INjDataConfiguration + { + public: + ~NjDataConfiguration(); + + virtual int getCount(); + + virtual int insertData( const char* state, const char* event, INjData* data ); + + virtual int getData( int index, std::string &state, std::string &event, INjData* &data ); + + virtual INjData* getData( const char* state, const char* event ); + + private: + std::vector _items; + }; + } +} + +#endif \ No newline at end of file diff --git a/src/NxModelService.cpp b/src/NxModelService.cpp index a39a008..157774d 100644 --- a/src/NxModelService.cpp +++ b/src/NxModelService.cpp @@ -1,4 +1,6 @@ +#include #include "NxModelService.h" +#include "../utils/NxHttp.h" const char* NJGIS::SERVICE::NjModelService::getServiceOID() { @@ -85,9 +87,43 @@ const NJGIS::SERVICE::NjModelServicePermission NJGIS::SERVICE::NjModelService::g return this->_permission; } -int NJGIS::SERVICE::NjModelService::invoke( const INjDataConfiguration* config, std::string& recordid ) -{ - return NULL; +int NJGIS::SERVICE::NjModelService::invoke( INjDataConfiguration* config, std::string& recordid ) +{ + std::string url; + this->getBaseUrl(url); + + url += "modelser/"; + url += this->getServiceOID(); + url += "?ac=run&inputdata=["; + + for(int i = 0 ; i < config->getCount(); i++) + { + std::string state; + std::string event; + INjData* data; + if(config->getData(i, state, event, data) > 0) + { + url += "{\"StateId\":\"" + state + "\",\"Event\":\"" + event + "\",\"DataId\":\"" + data->getID() + "\"}"; + } + else + { + continue; + } + } + url += "]&auth="; + + Json::Value jRespones; + NJGIS::SERVICE::NjHttpHelper::request_get_json_sync(url.c_str(), jRespones); + if(jRespones["res"].asString() == "suc") + { + recordid = jRespones["msr_id"].asString(); + return 1; + } + else if(jRespones["res"].asString() == "error") + { + return -1; + } + return 0; } int NJGIS::SERVICE::NjModelService::refresh() diff --git a/src/NxModelService.h b/src/NxModelService.h index bd657fd..c2a2bf8 100644 --- a/src/NxModelService.h +++ b/src/NxModelService.h @@ -88,7 +88,7 @@ namespace NJGIS virtual const NJGIS::SERVICE::NjModelServicePermission getServicePermission(); - virtual int invoke( const INjDataConfiguration* config, std::string& recordid ); + virtual int invoke( INjDataConfiguration* config, std::string& recordid ); //! to refresh the information of this model service virtual int refresh(); diff --git a/src/NxServiceAccess.cpp b/src/NxServiceAccess.cpp index 5b7283a..4340fb9 100644 --- a/src/NxServiceAccess.cpp +++ b/src/NxServiceAccess.cpp @@ -115,3 +115,8 @@ NJGIS::SERVICE::INjData* NJGIS::SERVICE::NjServiceAccess::uploadDataStream( cons { return NULL; } + +NJGIS::SERVICE::INjDataConfiguration* NJGIS::SERVICE::NjServiceAccess::createDataConfig() +{ + return new NJGIS::SERVICE::NjDataConfiguration(); +} diff --git a/src/NxServiceAccess.h b/src/NxServiceAccess.h index e9ac1b2..23db5fa 100644 --- a/src/NxServiceAccess.h +++ b/src/NxServiceAccess.h @@ -4,6 +4,7 @@ #include "../include/INxServiceAccess.h" #include "json/json.h" #include "NxService.h" +#include "NxDataConfiguration.h" namespace NJGIS { @@ -26,6 +27,8 @@ namespace NJGIS virtual NJGIS::SERVICE::INjData* uploadDataStream( const char* stream, const char* tag ); + virtual NJGIS::SERVICE::INjDataConfiguration* createDataConfig(); + }; } } diff --git a/test/test.cpp b/test/test.cpp index 57078b6..0ad0b61 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -21,10 +21,18 @@ int main() if(list_ms[i] == NULL) continue; std::cout << list_ms[i]->getServiceOID() << " - " << list_ms[i]->getServiceName() << " - " << list_ms[i]->getServiceType() << std::endl; } - NJGIS::SERVICE::INjData* pData = pServiceAccess->uploadDataByFile("E:\\DemoData\\GeoModeling\\sqrt_demo.xml", "sqrt_demo.xml"); + NJGIS::SERVICE::INjData* pData = pServiceAccess->uploadDataByFile("E:\\DemoData\\GeoModeling\\SWAT\\ComputeAreaD8\\testify\\default\\udx_zip_d8.zip", "udx_zip_d8.zip"); if(pData != NULL) { std::cout << pData->getID() << " - " << pData->getSize() << " - " << pData->getGenarationDateTime() << " - " << pData->getTag() << std::endl; + NJGIS::SERVICE::INjDataConfiguration* pDataconfig = pServiceAccess->createDataConfig(); + pDataconfig->insertData("ba0300a8-a21d-45ef-9428-d48d857825ce", "D8", pData); + NJGIS::SERVICE::INjModelService* pMService = pServiceAccess->getModelServiceByOID("5a72dd126f7bff05649f2213"); + std::string recordid; + if( pMService->invoke(pDataconfig, recordid) == 1) + { + std::cout << "Invoke successfully!" << recordid << std::endl; + } } } } -- Gitee From 256679b423bc4eb795a5b6c6e8a5a010939c64e5 Mon Sep 17 00:00:00 2001 From: Franklin_Zhang Date: Sat, 3 Feb 2018 21:05:12 +0800 Subject: [PATCH 5/6] Update data configuration Signed-off-by: Franklin_Zhang --- include/INxDataConfiguration.h | 4 +-- include/INxModelServiceRecord.h | 8 ++--- include/INxServiceAccess.h | 4 +++ src/NxDataConfiguration.cpp | 7 ++-- src/NxDataConfiguration.h | 5 +-- src/NxDataFactory.h | 3 ++ src/NxModelService.cpp | 5 +-- src/NxModelServiceRecord.cpp | 52 +++++++++++++-------------- src/NxModelServiceRecord.h | 54 +++++++++++++++++++++++++++-- src/NxModelServiceRecordFactory.cpp | 15 ++++++++ src/NxServiceAccess.cpp | 18 ++++++++++ src/NxServiceAccess.h | 2 ++ test/test.cpp | 11 +++--- 13 files changed, 140 insertions(+), 48 deletions(-) diff --git a/include/INxDataConfiguration.h b/include/INxDataConfiguration.h index 5b90658..6b8dbd9 100644 --- a/include/INxDataConfiguration.h +++ b/include/INxDataConfiguration.h @@ -13,9 +13,9 @@ namespace NJGIS public: virtual int getCount() = 0; - virtual int insertData(const char* state, const char* event, INjData* data) = 0; + virtual int insertData(const char* state, const char* event, INjData* data, bool destoryed = false) = 0; - virtual int getData(int index, std::string &state, std::string &event, INjData* &data) = 0; + virtual int getData(int index, std::string &state, std::string &event, INjData* &data, bool &destoryed) = 0; virtual INjData* getData(const char* state, const char* event) = 0; }; diff --git a/include/INxModelServiceRecord.h b/include/INxModelServiceRecord.h index 5d09ff3..378b5b5 100644 --- a/include/INxModelServiceRecord.h +++ b/include/INxModelServiceRecord.h @@ -15,9 +15,9 @@ namespace NJGIS { typedef enum { - UNFINISHED = 0, - FINISHED = 1, - ERROR = 2 + MSRS_UNFINISHED = 0, + MSRS_FINISHED = 1, + MSRS_ERROR = 2 } NjRecordStatus; @@ -28,8 +28,6 @@ namespace NJGIS virtual const char* getModelServiceID() = 0; - virtual INjModelService* getModelService() = 0; - virtual const char* getStartDatetime() = 0; virtual int getTimeSpan() = 0; diff --git a/include/INxServiceAccess.h b/include/INxServiceAccess.h index ef08e15..61f0908 100644 --- a/include/INxServiceAccess.h +++ b/include/INxServiceAccess.h @@ -3,6 +3,7 @@ #include "INxModelService.h" #include "INxDataConfiguration.h" +#include "INxModelServiceRecord.h" #include namespace NJGIS @@ -21,6 +22,9 @@ namespace NJGIS //! get model servcie by name virtual int getModelServicesByName(const char* name, std::vector &list) = 0; + //! get model service record by id + virtual INjModelServiceRecord* getModelServiceRecordByID(const char* msrid) = 0; + //! get a data service virtual NJGIS::SERVICE::INjData* getDataServiceByID(const char* id) = 0; diff --git a/src/NxDataConfiguration.cpp b/src/NxDataConfiguration.cpp index ea0346b..f864aa7 100644 --- a/src/NxDataConfiguration.cpp +++ b/src/NxDataConfiguration.cpp @@ -10,13 +10,14 @@ int NJGIS::SERVICE::NjDataConfiguration::getCount() return this->_items.size(); } -int NJGIS::SERVICE::NjDataConfiguration::insertData( const char* state, const char* event, NJGIS::SERVICE::INjData* data ) +int NJGIS::SERVICE::NjDataConfiguration::insertData( const char* state, const char* event, NJGIS::SERVICE::INjData* data, bool destoryed ) { for(int i = 0; i < this->_items.size(); i++) { if((strcmp(this->_items[i].state, state) == 0) && (strcmp(this->_items[i].event, event) == 0)) { this->_items[i].data = (void*)data; + this->_items[i].destoryed = destoryed; return 2; } } @@ -28,11 +29,12 @@ int NJGIS::SERVICE::NjDataConfiguration::insertData( const char* state, const ch item.state = cstate; item.event = cevent; item.data = (void*)data; + item.destoryed = destoryed; this->_items.push_back(item); return 1; } -int NJGIS::SERVICE::NjDataConfiguration::getData( int index, std::string &state, std::string &event, NJGIS::SERVICE::INjData* &data ) +int NJGIS::SERVICE::NjDataConfiguration::getData( int index, std::string &state, std::string &event, INjData* &data, bool &destoryed) { if(index > (this->_items.size() - 1) || index < 0) { @@ -45,6 +47,7 @@ int NJGIS::SERVICE::NjDataConfiguration::getData( int index, std::string &state, state = std::string(this->_items[i].state); event = std::string(this->_items[i].event); data = (NJGIS::SERVICE::INjData*)this->_items[i].data; + destoryed = this->_items[i].destoryed; return 1; } } diff --git a/src/NxDataConfiguration.h b/src/NxDataConfiguration.h index c7e18f6..30b365b 100644 --- a/src/NxDataConfiguration.h +++ b/src/NxDataConfiguration.h @@ -15,6 +15,7 @@ namespace NJGIS const char* state; const char* event; void* data; + bool destoryed; }NjDataConfigItem; class NjDataConfiguration : public virtual INjDataConfiguration @@ -24,9 +25,9 @@ namespace NJGIS virtual int getCount(); - virtual int insertData( const char* state, const char* event, INjData* data ); + virtual int insertData( const char* state, const char* event, INjData* data, bool destoryed = false ); - virtual int getData( int index, std::string &state, std::string &event, INjData* &data ); + virtual int getData( int index, std::string &state, std::string &event, INjData* &data, bool &destoryed ); virtual INjData* getData( const char* state, const char* event ); diff --git a/src/NxDataFactory.h b/src/NxDataFactory.h index 528aec4..256df2b 100644 --- a/src/NxDataFactory.h +++ b/src/NxDataFactory.h @@ -2,6 +2,7 @@ #define __NJGIS_NJDATAFACTORY_H__ #include "../include/INxData.h" +#include "../include/INxDataConfiguration.h" #include "json/json.h" namespace NJGIS @@ -12,6 +13,8 @@ namespace NJGIS { public: static NJGIS::SERVICE::INjData* createDataByJSON(Json::Value jData, const char* ip, int port); + + static NJGIS::SERVICE::INjDataConfiguration* createDataConfigByJSON(Json::Value jConfig); }; } } diff --git a/src/NxModelService.cpp b/src/NxModelService.cpp index 157774d..8959732 100644 --- a/src/NxModelService.cpp +++ b/src/NxModelService.cpp @@ -101,9 +101,10 @@ int NJGIS::SERVICE::NjModelService::invoke( INjDataConfiguration* config, std::s std::string state; std::string event; INjData* data; - if(config->getData(i, state, event, data) > 0) + bool destoryed; + if(config->getData(i, state, event, data, destoryed) > 0) { - url += "{\"StateId\":\"" + state + "\",\"Event\":\"" + event + "\",\"DataId\":\"" + data->getID() + "\"}"; + url += "{\"StateId\":\"" + state + "\",\"Event\":\"" + event + "\",\"DataId\":\"" + data->getID() + "\",\"Destoryed\":\"false\"}"; } else { diff --git a/src/NxModelServiceRecord.cpp b/src/NxModelServiceRecord.cpp index bab1a43..71d0127 100644 --- a/src/NxModelServiceRecord.cpp +++ b/src/NxModelServiceRecord.cpp @@ -1,66 +1,62 @@ #include "NxModelServiceRecord.h" -const char* NJGIS::SERVICE::NxModelServiceRecord::getID() +const char* NJGIS::SERVICE::NjModelServiceRecord::getID() { - throw std::exception("The method or operation is not implemented."); + return this->_oid.c_str(); } -const char* NJGIS::SERVICE::NxModelServiceRecord::getModelServiceID() +const char* NJGIS::SERVICE::NjModelServiceRecord::getModelServiceID() { - throw std::exception("The method or operation is not implemented."); + return this->_msid.c_str(); } -NJGIS::SERVICE::INjModelService* NJGIS::SERVICE::NxModelServiceRecord::getModelService() +const char* NJGIS::SERVICE::NjModelServiceRecord::getStartDatetime() { - throw std::exception("The method or operation is not implemented."); + return this->_datetime.c_str(); } -const char* NJGIS::SERVICE::NxModelServiceRecord::getStartDatetime() +int NJGIS::SERVICE::NjModelServiceRecord::getTimeSpan() { - throw std::exception("The method or operation is not implemented."); + return this->_span; } -int NJGIS::SERVICE::NxModelServiceRecord::getTimeSpan() +NJGIS::SERVICE::INjDataConfiguration* NJGIS::SERVICE::NjModelServiceRecord::getInputData() { - throw std::exception("The method or operation is not implemented."); + return this->_input; } -NJGIS::SERVICE::INjDataConfiguration* NJGIS::SERVICE::NxModelServiceRecord::getInputData() +NJGIS::SERVICE::INjDataConfiguration* NJGIS::SERVICE::NjModelServiceRecord::getOutputData() { - throw std::exception("The method or operation is not implemented."); + return this->_output; } -NJGIS::SERVICE::INjDataConfiguration* NJGIS::SERVICE::NxModelServiceRecord::getOutputData() +NJGIS::SERVICE::NjRecordStatus NJGIS::SERVICE::NjModelServiceRecord::getStatus() { - throw std::exception("The method or operation is not implemented."); + return this->_status; } -NJGIS::SERVICE::NjRecordStatus NJGIS::SERVICE::NxModelServiceRecord::getStatus() +const char* NJGIS::SERVICE::NjModelServiceRecord::getRunningInfo_Standout() { - throw std::exception("The method or operation is not implemented."); + return this->_stdout.c_str(); } -const char* NJGIS::SERVICE::NxModelServiceRecord::getRunningInfo_Standout() +const char* NJGIS::SERVICE::NjModelServiceRecord::getRunningInfo_Standerr() { - throw std::exception("The method or operation is not implemented."); + return this->_stderr.c_str(); } -const char* NJGIS::SERVICE::NxModelServiceRecord::getRunningInfo_Standerr() +const char* NJGIS::SERVICE::NjModelServiceRecord::getRunningInfo_Invokeerr() { - throw std::exception("The method or operation is not implemented."); + return this->_invkerr.c_str(); } -const char* NJGIS::SERVICE::NxModelServiceRecord::getRunningInfo_Invokeerr() +int NJGIS::SERVICE::NjModelServiceRecord::getLogs() { - throw std::exception("The method or operation is not implemented."); + return NULL; } -int NJGIS::SERVICE::NxModelServiceRecord::getLogs() +int NJGIS::SERVICE::NjModelServiceRecord::refresh() { - throw std::exception("The method or operation is not implemented."); -} -int NJGIS::SERVICE::NxModelServiceRecord::refresh() -{ - throw std::exception("The method or operation is not implemented."); + return 0; } diff --git a/src/NxModelServiceRecord.h b/src/NxModelServiceRecord.h index 0946483..3699506 100644 --- a/src/NxModelServiceRecord.h +++ b/src/NxModelServiceRecord.h @@ -8,15 +8,42 @@ namespace NJGIS { namespace SERVICE { - class NxModelServiceRecord : public virtual INjModelServiceRecord, public virtual NjService + class NjModelServiceRecord : public virtual INjModelServiceRecord, public virtual NjService { public: + NjModelServiceRecord(){}; + + NjModelServiceRecord( + const char* oid, + const char* msid, + const char* datetime, + int span, + INjDataConfiguration* input, + INjDataConfiguration* output, + NjRecordStatus status, + const char* cstdout, + const char* cstderr, + const char* invkerr, + const char* ip, + int port + ): + _oid(oid), + _msid(msid), + _datetime(datetime), + _span(span), + _input(input), + _output(output), + _status(status), + _stdout(cstdout), + _stderr(cstderr), + _invkerr(invkerr), + NjService(ip, port) + {}; + virtual const char* getID(); virtual const char* getModelServiceID(); - virtual INjModelService* getModelService(); - virtual const char* getStartDatetime(); virtual int getTimeSpan(); @@ -37,6 +64,27 @@ namespace NJGIS virtual int refresh(); + private: + std::string _oid; + + std::string _msid; + + std::string _datetime; + + int _span; + + INjDataConfiguration* _input; + + INjDataConfiguration* _output; + + NjRecordStatus _status; + + std::string _stdout; + + std::string _stderr; + + std::string _invkerr; + }; } } diff --git a/src/NxModelServiceRecordFactory.cpp b/src/NxModelServiceRecordFactory.cpp index 9177223..bb5bf5b 100644 --- a/src/NxModelServiceRecordFactory.cpp +++ b/src/NxModelServiceRecordFactory.cpp @@ -1,6 +1,21 @@ #include "NxModelServiceRecordFactory.h" +#include "NxModelServiceRecord.h" NJGIS::SERVICE::INjModelServiceRecord* NJGIS::SERVICE::NjModelServiceRecordFactory::createModelServiceRecordByJSON( Json::Value jMsr, const char* ip, int port ) { + NJGIS::SERVICE::INjModelServiceRecord* pMsr = new NJGIS::SERVICE::NjModelServiceRecord( + jMsr["_id"].asString().c_str(), + jMsr["ms_id"].asString().c_str(), + jMsr["msr_datetime"].asString().c_str(), + jMsr["msr_span"].asInt(), + NULL, + NULL, + NJGIS::SERVICE::NjRecordStatus::MSRS_FINISHED, + jMsr["msr_runninginfo"]["StdOut"].asString().c_str(), + jMsr["msr_runninginfo"]["StdErr"].asString().c_str(), + jMsr["msr_runninginfo"]["InvokeErr"].asString().c_str(), + ip, + port + ); return NULL; } \ No newline at end of file diff --git a/src/NxServiceAccess.cpp b/src/NxServiceAccess.cpp index 4340fb9..5498e32 100644 --- a/src/NxServiceAccess.cpp +++ b/src/NxServiceAccess.cpp @@ -2,6 +2,7 @@ #include "NxModelService.h" #include "NxModelServiceFactory.h" #include "NxDataFactory.h" +#include "NxModelServiceRecordFactory.h" #include "../utils/NxHttp.h" int NJGIS::SERVICE::NjServiceAccess::getModelServicesList( std::vector &list ) @@ -120,3 +121,20 @@ NJGIS::SERVICE::INjDataConfiguration* NJGIS::SERVICE::NjServiceAccess::createDat { return new NJGIS::SERVICE::NjDataConfiguration(); } + +NJGIS::SERVICE::INjModelServiceRecord* NJGIS::SERVICE::NjServiceAccess::getModelServiceRecordByID( const char* msrid ) +{ + std::string url; + this->getBaseUrl(url); + url += "modelserrun/json/" + std::string(msrid); + NJGIS::SERVICE::INjModelServiceRecord* pRecord = NULL; + + Json::Value jResponse; + NJGIS::SERVICE::NjHttpHelper::request_get_json_sync(url.c_str(), jResponse); + if(jResponse["result"].asString() == "suc") + { + NJGIS::SERVICE::NjModelServiceRecordFactory::createModelServiceRecordByJSON(jResponse["data"], this->getIP(), this->getPort()); + } + + return pRecord; +} diff --git a/src/NxServiceAccess.h b/src/NxServiceAccess.h index 23db5fa..acbfdd5 100644 --- a/src/NxServiceAccess.h +++ b/src/NxServiceAccess.h @@ -29,6 +29,8 @@ namespace NJGIS virtual NJGIS::SERVICE::INjDataConfiguration* createDataConfig(); + virtual INjModelServiceRecord* getModelServiceRecordByID( const char* msrid ); + }; } } diff --git a/test/test.cpp b/test/test.cpp index 0ad0b61..f0b86d9 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -21,17 +21,20 @@ int main() if(list_ms[i] == NULL) continue; std::cout << list_ms[i]->getServiceOID() << " - " << list_ms[i]->getServiceName() << " - " << list_ms[i]->getServiceType() << std::endl; } - NJGIS::SERVICE::INjData* pData = pServiceAccess->uploadDataByFile("E:\\DemoData\\GeoModeling\\SWAT\\ComputeAreaD8\\testify\\default\\udx_zip_d8.zip", "udx_zip_d8.zip"); + NJGIS::SERVICE::INjData* pData = pServiceAccess->uploadDataByFile( + "E:\\DemoData\\GeoModeling\\SWAT\\SWATModel664\\testify\\default\\udx_zip_hrudata.zip", "udx_zip_hrudata.zip"); if(pData != NULL) { std::cout << pData->getID() << " - " << pData->getSize() << " - " << pData->getGenarationDateTime() << " - " << pData->getTag() << std::endl; NJGIS::SERVICE::INjDataConfiguration* pDataconfig = pServiceAccess->createDataConfig(); - pDataconfig->insertData("ba0300a8-a21d-45ef-9428-d48d857825ce", "D8", pData); - NJGIS::SERVICE::INjModelService* pMService = pServiceAccess->getModelServiceByOID("5a72dd126f7bff05649f2213"); + pDataconfig->insertData("04579ee0-5983-4d75-bdc9-a1a460229aa0", "LoadHydroResponseUnit", pData); + NJGIS::SERVICE::INjModelService* pMService = pServiceAccess->getModelServiceByOID("5a0516bbbd2ff04f3c19d291"); std::string recordid; if( pMService->invoke(pDataconfig, recordid) == 1) { - std::cout << "Invoke successfully!" << recordid << std::endl; + std::cout << "Invoke successfully! Model Service Record ID is : [" << recordid << "]" << std::endl; + NJGIS::SERVICE::INjModelServiceRecord* pRecord = pServiceAccess->getModelServiceRecordByID(recordid.c_str()); + } } } -- Gitee From 3615449a0b7e3b9a27d8c3ecc75fe24e2faade9d Mon Sep 17 00:00:00 2001 From: Franklin_Zhang Date: Mon, 19 Mar 2018 11:58:58 +0800 Subject: [PATCH 6/6] Interface Change Signed-off-by: Franklin_Zhang --- src/NxModelService.cpp | 6 +++--- src/NxServiceAccess.cpp | 6 +++--- test/test.cpp | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/NxModelService.cpp b/src/NxModelService.cpp index 8959732..cade387 100644 --- a/src/NxModelService.cpp +++ b/src/NxModelService.cpp @@ -115,12 +115,12 @@ int NJGIS::SERVICE::NjModelService::invoke( INjDataConfiguration* config, std::s Json::Value jRespones; NJGIS::SERVICE::NjHttpHelper::request_get_json_sync(url.c_str(), jRespones); - if(jRespones["res"].asString() == "suc") + if(jRespones["result"].asString() == "suc") { - recordid = jRespones["msr_id"].asString(); + recordid = jRespones["data"].asString(); return 1; } - else if(jRespones["res"].asString() == "error") + else if(jRespones["result"].asString() == "error") { return -1; } diff --git a/src/NxServiceAccess.cpp b/src/NxServiceAccess.cpp index 5498e32..f4ddd5e 100644 --- a/src/NxServiceAccess.cpp +++ b/src/NxServiceAccess.cpp @@ -93,9 +93,9 @@ NJGIS::SERVICE::INjData* NJGIS::SERVICE::NjServiceAccess::uploadDataByFile( cons Json::Value jResonese; int code = NJGIS::SERVICE::NjHttpHelper::request_post_withform_json_sync(url.c_str(), pFormData, pFiles, jResonese); if(code != 1) return NULL; - if(jResonese["res"].asString() == "suc") + if(jResonese["result"].asString() == "suc") { - std::string gdid = jResonese["gd_id"].asString(); + std::string gdid = jResonese["data"].asString(); //! get the data information this->getBaseUrl(url); @@ -108,12 +108,12 @@ NJGIS::SERVICE::INjData* NJGIS::SERVICE::NjServiceAccess::uploadDataByFile( cons return pData; } } - return NULL; } NJGIS::SERVICE::INjData* NJGIS::SERVICE::NjServiceAccess::uploadDataStream( const char* stream, const char* tag ) { + //! TODD upload data stream return NULL; } diff --git a/test/test.cpp b/test/test.cpp index f0b86d9..9773948 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -28,13 +28,13 @@ int main() std::cout << pData->getID() << " - " << pData->getSize() << " - " << pData->getGenarationDateTime() << " - " << pData->getTag() << std::endl; NJGIS::SERVICE::INjDataConfiguration* pDataconfig = pServiceAccess->createDataConfig(); pDataconfig->insertData("04579ee0-5983-4d75-bdc9-a1a460229aa0", "LoadHydroResponseUnit", pData); - NJGIS::SERVICE::INjModelService* pMService = pServiceAccess->getModelServiceByOID("5a0516bbbd2ff04f3c19d291"); + NJGIS::SERVICE::INjModelService* pMService = pServiceAccess->getModelServiceByOID("5aaabce23f761b048081dd9f"); std::string recordid; if( pMService->invoke(pDataconfig, recordid) == 1) { std::cout << "Invoke successfully! Model Service Record ID is : [" << recordid << "]" << std::endl; NJGIS::SERVICE::INjModelServiceRecord* pRecord = pServiceAccess->getModelServiceRecordByID(recordid.c_str()); - + } } } -- Gitee