RestPersistence.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <SimoxUtility/json.h>
4 
7 
9 
10 
12 {
13  enum DataType {
15  };
16 
17  /**
18  * Persistence strategy that uses a rest server as its data sink.
19  * How the data is stored on the rest server is up to the server.
20  *
21  * The structure of rest endpoints are very similar to a directory structure.
22  *
23  * General endpoint:
24  * /endpoint
25  * GET: /endpoint?containers: return all container keys of the endpoint
26  * GET: /endpoint?container=key: check if a container with key exists (true = Status Code 200, false = Status Code 404)
27  * GET: /endpoint?items: return all item keys of the endpoint
28  * GET: /endpoint?item=key: return Status Code 200 with item data OR Status Code 404 if the item is not inside of the container
29  * PUT: /endpoint?item: store item data (data = http body content)
30  * DELETE: /endpoint?item=key: removes item with key, return Status Code 200 on success and Status Code 404 if item not found
31  * DELETE: /endpoint?container=key: removes container with key, return Status Code 200 on success and Status Code 404 if container not found
32  *
33  * NOTE: DELETE-methods are implemented, but the curren memory system does not use it in general.
34  *
35  * Available endpoints:
36  * /ltm/:exportName
37  * -> memories
38  * /ltm/:exportName/:memoryName
39  * -> core segments
40  * /ltm/:exportName/:memoryName/:coreSegmentName
41  * -> provider segments
42  * /ltm/:exportName/:memoryName/:coreSegmentName/:providerSegmentName
43  * -> entities
44  * /ltm/:exportName/:memoryName/:coreSegmentName/:providerSegmentName/:entityName
45  * -> entity snapshots
46  * /ltm/:exportName/:memoryName/:coreSegmentName/:providerSegmentName/:entityName/:timestamp
47  * -> entity instances
48  * /ltm/:exportName/:memoryName/:coreSegmentName/:providerSegmentName/:entityName/:timestamp/:instanceIndex
49  * -> entity instance (here you will definitely find some items)
50  */
52  {
53  public:
54  RestPersistence() : RestPersistence("Rest", "DefaultExport") {}
55 
56  RestPersistence(const std::string& identifier, const std::string& exportName) : MemoryPersistenceStrategy(identifier, exportName) {}
57 
58  /**
59  * @param identifier basically a unique name for the strategy (important if you use different strategies @see RedundantPersistenceStrategy)
60  * @param exportName identifier for the exported memory where any items are written. Changes http endpoints.
61  * @param id memory id, gives us the hierarchy depth to store some items for it (e.g. a core segment)
62  * @param host rest server address (e.g. localhost or a specific ip or a domain)
63  * @param port network port where the rest server runs
64  */
65  RestPersistence(const std::string& identifier, const std::string& exportName, const std::string& host, int port, bool disableIfNotAvailable = false) : MemoryPersistenceStrategy(identifier, exportName), host_(host), port_(port) {
66  client_ = std::make_shared<httplib::Client>(host, port);
67 
68  bool available = checkConnection();
69 
70  if (disableIfNotAvailable && !available)
71  {
72  ARMARX_IMPORTANT << "REST Server not available. Disabling...";
73  disable();
74  }
75  }
76 
77  const static std::string DEFAULT_HOST;
78  const static int DEFAULT_PORT = 8080;
79 
80  std::vector<std::string> getContainerKeys(const armarx::armem::MemoryID& id) override;
81 
82  std::vector<std::string> getItemKeys(const armarx::armem::MemoryID& id) override;
83 
84  bool containsContainer(const armarx::armem::MemoryID& id, std::string key) override;
85 
86  bool containsItem(const armarx::armem::MemoryID& id, std::string key) override;
87 
88  void storeItem(const armarx::armem::MemoryID& id, std::string key, std::vector<unsigned char>& data) override;
89 
90  std::vector<unsigned char> retrieveItem(const armarx::armem::MemoryID& id, std::string key) override;
91 
92  void createPropertyDefinitions(PropertyDefinitionsPtr& defs, const std::string& prefix) override;
93 
94 
95  /**
96  * Checks if the server is up
97  */
98  bool checkConnection();
99 
100  private:
101  std::shared_ptr<httplib::Client> client_;
102 
103  std::string host_ = "localhost";
104  int port_ = DEFAULT_PORT;
105 
106 
107  /* Internal rest logic */
108 
109  /**
110  * Stops and restarts the client (e.g. if some parameters like the port are changed)
111  */
112  void resetClient();
113 
114  bool restContainsItem(const armarx::armem::MemoryID& id, std::string& key);
115 
116  bool restContainsContainer(const armarx::armem::MemoryID& id, std::string& key);
117 
118  std::vector<std::string> getRestItems(const armarx::armem::MemoryID& id);
119 
120  std::vector<std::string> getRestContainers(const armarx::armem::MemoryID& id);
121 
122  std::vector<unsigned char> readItemFromRest(const armarx::armem::MemoryID& id, std::string& key);
123 
124  void writeItemToRest(const armarx::armem::MemoryID& id, std::string& key, const std::vector<unsigned char>& data);
125 
126  void writeItemToRest(const armarx::armem::MemoryID& id, std::string& key, nlohmann::json& jsonData);
127 
128  void writeItemToRest(const armarx::armem::MemoryID& id, std::string& key, DataType type, const std::vector<unsigned char>& data);
129 
130  void removeRestItem(const armarx::armem::MemoryID& id, std::string& key);
131 
132  void setPort(int port);
133 
134  int getPort() const;
135 
136  void setHost(std::string& host);
137 
138  std::string getHost();
139 
140  /**
141  * Creates our endpoint resp. http request path using the export name and memory id
142  */
143  std::string buildPath(const armarx::armem::MemoryID& id);
144 
145  std::string getMimeType(DataType type);
146  };
147 } // namespace armarx::armem::server::ltm::persistence
armarx::armem::server::ltm::persistence::RestPersistence
Persistence strategy that uses a rest server as its data sink.
Definition: RestPersistence.h:51
armarx::armem::server::ltm::persistence::DataType
DataType
Definition: RestPersistence.h:13
ARMARX_IMPORTANT
#define ARMARX_IMPORTANT
Definition: Logging.h:190
armarx::armem::server::ltm::persistence::MemoryPersistenceStrategy
Abstract memory persistence strategy (resp.
Definition: MemoryPersistenceStrategy.h:61
MemoryPersistenceStrategy.h
armarx::armem::server::ltm::persistence::RestPersistence::RestPersistence
RestPersistence(const std::string &identifier, const std::string &exportName)
Definition: RestPersistence.h:56
armarx::armem::server::ltm::persistence::RestPersistence::getItemKeys
std::vector< std::string > getItemKeys(const armarx::armem::MemoryID &id) override
Keys of the actual items containing data stored for the memory id.
Definition: RestPersistence.cpp:21
MemoryID.h
armarx::armem::server::ltm::persistence::RestPersistence::RestPersistence
RestPersistence()
Definition: RestPersistence.h:54
armarx::armem::server::ltm::persistence::RestPersistence::containsItem
bool containsItem(const armarx::armem::MemoryID &id, std::string key) override
Definition: RestPersistence.cpp:45
armarx::armem::server::ltm::persistence::RestPersistence::retrieveItem
std::vector< unsigned char > retrieveItem(const armarx::armem::MemoryID &id, std::string key) override
Retrieve the actual data of an item stored for the memory id.
Definition: RestPersistence.cpp:69
armarx::armem::server::ltm::persistence
Definition: DiskPersistence.cpp:5
armarx::armem::server::ltm::persistence::RestPersistence::DEFAULT_PORT
const static int DEFAULT_PORT
Definition: RestPersistence.h:78
armarx::armem::server::ltm::persistence::RestPersistence::DEFAULT_HOST
const static std::string DEFAULT_HOST
Definition: RestPersistence.h:77
armarx::armem::server::ltm::persistence::MemoryPersistenceStrategy::disable
virtual void disable()
Definition: MemoryPersistenceStrategy.h:151
armarx::armem::server::ltm::persistence::RestPersistence::containsContainer
bool containsContainer(const armarx::armem::MemoryID &id, std::string key) override
Definition: RestPersistence.cpp:33
armarx::armem::MemoryID
A memory ID.
Definition: MemoryID.h:47
armarx::armem::server::ltm::persistence::RestPersistence::checkConnection
bool checkConnection()
Checks if the server is up.
Definition: RestPersistence.cpp:92
data
uint8_t data[1]
Definition: EtherCATFrame.h:68
armarx::armem::server::ltm::persistence::RestPersistence::getContainerKeys
std::vector< std::string > getContainerKeys(const armarx::armem::MemoryID &id) override
Returns keys that allow use to move a step further in the hierarchy (e.g.
Definition: RestPersistence.cpp:9
armarx::armem::server::ltm::persistence::JSON
@ JSON
Definition: RestPersistence.h:14
armarx::armem::server::ltm::persistence::RestPersistence::createPropertyDefinitions
void createPropertyDefinitions(PropertyDefinitionsPtr &defs, const std::string &prefix) override
Definition: RestPersistence.cpp:86
armarx::armem::server::ltm::persistence::RestPersistence::storeItem
void storeItem(const armarx::armem::MemoryID &id, std::string key, std::vector< unsigned char > &data) override
Stores an item containing actual data for the current memory id.
Definition: RestPersistence.cpp:57
armarx::armem::server::ltm::persistence::RestPersistence::RestPersistence
RestPersistence(const std::string &identifier, const std::string &exportName, const std::string &host, int port, bool disableIfNotAvailable=false)
Definition: RestPersistence.h:65
IceUtil::Handle< class PropertyDefinitionContainer >
httplib.h
armarx::armem::server::ltm::persistence::PNG
@ PNG
Definition: RestPersistence.h:14