+#include "FileService.hpp"
+#include "HttpConnection.hpp"
+#include "CommandTO.hpp"
+#include "CommandResultTO.hpp"
+#include "JsonFormatter.hpp"
+#include "Credentials.hpp"
+
+#include <Poco/DateTimeFormatter.h>
+#include <Poco/Timestamp.h>
+#include <Poco/DateTimeFormat.h>
+
+/*
+ * WARNING: keep enum values synchronized to WEB API (FileService)
+ */
+enum {
+ CREATE_FILE = 1,
+ DELETE_FILE,
+ UPDATE_FILE,
+ READ_FILE,
+ FIND_BY_NAME
+};
+
+std::string gde::FileService::_servletName = "FileService";
+
+const gde::File
+gde::FileService::createFile(const std::string& name)
+{
+ // build JSON string for CommandTO data
+ Poco::JSON::Object obj;
+ obj.set("name", Poco::Dynamic::Var(name));
+ std::string creationDate = Poco::DateTimeFormatter::format(Poco::Timestamp(), Poco::DateTimeFormat::SORTABLE_FORMAT);
+ obj.set("creationDate", Poco::Dynamic::Var(creationDate));
+ std::string data = JsonFormatter::stringify(obj);
+
+ CommandTO cto(CREATE_FILE, data);
+ const Credentials& credentials = _session.getCredentials();
+ std::string uri = _session.getServiceURI(_servletName);
+ CommandResultTO crto = gde::HttpConnection(Poco::URI(uri), credentials).doPost(cto);
+
+ // build File object from CommandResultTO data (json format)
+ {
+ Poco::JSON::Object::Ptr object = JsonFormatter::parse(crto.getData());
+ int id = JsonFormatter::extract<int>(object, "id");
+ std::string name = JsonFormatter::extract<std::string>(object, "name");
+ int length = JsonFormatter::extract<int>(object, "length");
+ std::string checksum = JsonFormatter::extract<std::string>(object, "checksum");
+ Poco::Timestamp creationDate = JsonFormatter::extract(object, "creationDate");
+ Poco::Timestamp updateDate = JsonFormatter::extract(object, "updateDate");
+ bool valid = JsonFormatter::extract<bool>(object, "valid");
+ bool deleted = JsonFormatter::extract<bool>(object, "deleted");
+ Poco::Timestamp deletionDate = JsonFormatter::extract(object, "deletionDate");
+ int attributeGroupId = JsonFormatter::extract<int>(object, "attributeGroupId");
+ std::string data = JsonFormatter::extract<std::string>(object, "data");
+ int dataProfileId = JsonFormatter::extract<int>(object, "dataProfileId");
+
+ return gde::File(id, name, length, checksum, creationDate, updateDate, valid, deleted, deletionDate, attributeGroupId, data, dataProfileId);
+ }
+}
+
+bool
+gde::FileService::deleteFile(const File& file)
+{
+ CommandTO cto(DELETE_FILE);
+ cto.setParameter("fileId", file.getId());
+
+ const Credentials& credentials = _session.getCredentials();
+ std::string uri = _session.getServiceURI(_servletName);
+ CommandResultTO crto = gde::HttpConnection(Poco::URI(uri), credentials).doPost(cto);
+ return crto.getCode() == CommandResultTO::OK;
+}
+
+const gde::File
+gde::FileService::updateFile(const File& file)
+{
+ // build JSON string for CommandTO data
+ Poco::JSON::Object obj;
+ obj.set("id", Poco::Dynamic::Var(file.getId()));
+ obj.set("name", Poco::Dynamic::Var(file.getName()));
+ obj.set("length", Poco::Dynamic::Var(file.getLength()));
+ obj.set("checksum", Poco::Dynamic::Var(file.getChecksum()));
+ obj.set("creationDate", Poco::Dynamic::Var(file.getCreationDate()));
+ obj.set("valid", Poco::Dynamic::Var(file.getValid()));
+ obj.set("deleted", Poco::Dynamic::Var(file.getDeleted()));
+ obj.set("deletionDate", Poco::Dynamic::Var(file.getDeletionDate()));
+ obj.set("attributeGroupId", Poco::Dynamic::Var(file.getAttributeGroupId()));
+ obj.set("data", Poco::Dynamic::Var(file.getData()));
+ obj.set("dataProfileId", Poco::Dynamic::Var(file.getDataProfileId()));
+ std::string updateDate = Poco::DateTimeFormatter::format(Poco::Timestamp(), Poco::DateTimeFormat::SORTABLE_FORMAT);
+ obj.set("updateDate", Poco::Dynamic::Var(updateDate));
+ std::string data = JsonFormatter::stringify(obj);
+
+ CommandTO cto(UPDATE_FILE, data);
+ const Credentials& credentials = _session.getCredentials();
+ std::string uri = _session.getServiceURI(_servletName);
+ CommandResultTO crto = gde::HttpConnection(Poco::URI(uri), credentials).doPost(cto);
+
+ // build File object from CommandResultTO data (json format)
+ {
+ Poco::JSON::Object::Ptr object = JsonFormatter::parse(crto.getData());
+ int id = JsonFormatter::extract<int>(object, "id");
+ std::string name = JsonFormatter::extract<std::string>(object, "name");
+ int length = JsonFormatter::extract<int>(object, "length");
+ std::string checksum = JsonFormatter::extract<std::string>(object, "checksum");
+ Poco::Timestamp creationDate = JsonFormatter::extract(object, "creationDate");
+ Poco::Timestamp updateDate = JsonFormatter::extract(object, "updateDate");
+ bool valid = JsonFormatter::extract<bool>(object, "valid");
+ bool deleted = JsonFormatter::extract<bool>(object, "deleted");
+ Poco::Timestamp deletionDate = JsonFormatter::extract(object, "deletionDate");
+ int attributeGroupId = JsonFormatter::extract<int>(object, "attributeGroupId");
+ std::string data = JsonFormatter::extract<std::string>(object, "data");
+ int dataProfileId = JsonFormatter::extract<int>(object, "dataProfileId");
+
+ return gde::File(id, name, length, checksum, creationDate, updateDate, valid, deleted, deletionDate, attributeGroupId, data, dataProfileId);
+ }
+}
+
+const gde::File
+gde::FileService::readFile(int fileId)
+{
+ CommandTO cto(READ_FILE);
+ cto.setParameter("fileId", fileId);
+
+ const Credentials& credentials = _session.getCredentials();
+ std::string uri = _session.getServiceURI(_servletName);
+ CommandResultTO crto = gde::HttpConnection(Poco::URI(uri), credentials).doPost(cto);
+
+ // build File object from CommandResultTO data (json format)
+ {
+ Poco::JSON::Object::Ptr object = JsonFormatter::parse(crto.getData());
+ int id = JsonFormatter::extract<int>(object, "id");
+ std::string name = JsonFormatter::extract<std::string>(object, "name");
+ int length = JsonFormatter::extract<int>(object, "length");
+ std::string checksum = JsonFormatter::extract<std::string>(object, "checksum");
+ Poco::Timestamp creationDate = JsonFormatter::extract(object, "creationDate");
+ Poco::Timestamp updateDate = JsonFormatter::extract(object, "updateDate");
+ bool valid = JsonFormatter::extract<bool>(object, "valid");
+ bool deleted = JsonFormatter::extract<bool>(object, "deleted");
+ Poco::Timestamp deletionDate = JsonFormatter::extract(object, "deletionDate");
+ int attributeGroupId = JsonFormatter::extract<int>(object, "attributeGroupId");
+ std::string data = JsonFormatter::extract<std::string>(object, "data");
+ int dataProfileId = JsonFormatter::extract<int>(object, "dataProfileId");
+
+ return gde::File(id, name, length, checksum, creationDate, updateDate, valid, deleted, deletionDate, attributeGroupId, data, dataProfileId);
+ }
+}
+
+const gde::File
+gde::FileService::findByName(const std::string& name)
+{
+ CommandTO cto(FIND_BY_NAME);
+ cto.setParameter("fileName", name);
+
+ const Credentials& credentials = _session.getCredentials();
+ std::string uri = _session.getServiceURI(_servletName);
+ CommandResultTO crto = gde::HttpConnection(Poco::URI(uri), credentials).doPost(cto);
+
+ // build File object from CommandResultTO data (json format)
+ {
+ Poco::JSON::Object::Ptr object = JsonFormatter::parse(crto.getData());
+ int id = JsonFormatter::extract<int>(object, "id");
+ std::string name = JsonFormatter::extract<std::string>(object, "name");
+ int length = JsonFormatter::extract<int>(object, "length");
+ std::string checksum = JsonFormatter::extract<std::string>(object, "checksum");
+ Poco::Timestamp creationDate = JsonFormatter::extract(object, "creationDate");
+ Poco::Timestamp updateDate = JsonFormatter::extract(object, "updateDate");
+ bool valid = JsonFormatter::extract<bool>(object, "valid");
+ bool deleted = JsonFormatter::extract<bool>(object, "deleted");
+ Poco::Timestamp deletionDate = JsonFormatter::extract(object, "deletionDate");
+ int attributeGroupId = JsonFormatter::extract<int>(object, "attributeGroupId");
+ std::string data = JsonFormatter::extract<std::string>(object, "data");
+ int dataProfileId = JsonFormatter::extract<int>(object, "dataProfileId");
+
+ return gde::File(id, name, length, checksum, creationDate, updateDate, valid, deleted, deletionDate, attributeGroupId, data, dataProfileId);
+ }
+}