comparison OrthancFramework/Sources/RestApi/RestApiHierarchy.h @ 4044:d25f4c0fa160 framework

splitting code into OrthancFramework and OrthancServer
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 10 Jun 2020 20:30:34 +0200
parents Core/RestApi/RestApiHierarchy.h@05a363186da6
children bf7b9edf6b81
comparison
equal deleted inserted replaced
4043:6c6239aec462 4044:d25f4c0fa160
1 /**
2 * Orthanc - A Lightweight, RESTful DICOM Store
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
4 * Department, University Hospital of Liege, Belgium
5 * Copyright (C) 2017-2020 Osimis S.A., Belgium
6 *
7 * This program is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation, either version 3 of the
10 * License, or (at your option) any later version.
11 *
12 * In addition, as a special exception, the copyright holders of this
13 * program give permission to link the code of its release with the
14 * OpenSSL project's "OpenSSL" library (or with modified versions of it
15 * that use the same license as the "OpenSSL" library), and distribute
16 * the linked executables. You must obey the GNU General Public License
17 * in all respects for all of the code used other than "OpenSSL". If you
18 * modify file(s) with this exception, you may extend this exception to
19 * your version of the file(s), but you are not obligated to do so. If
20 * you do not wish to do so, delete this exception statement from your
21 * version. If you delete this exception statement from all source files
22 * in the program, then also delete it here.
23 *
24 * This program is distributed in the hope that it will be useful, but
25 * WITHOUT ANY WARRANTY; without even the implied warranty of
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
27 * General Public License for more details.
28 *
29 * You should have received a copy of the GNU General Public License
30 * along with this program. If not, see <http://www.gnu.org/licenses/>.
31 **/
32
33
34 #pragma once
35
36 #include "RestApiGetCall.h"
37 #include "RestApiPostCall.h"
38 #include "RestApiPutCall.h"
39 #include "RestApiDeleteCall.h"
40
41 #include <set>
42
43 namespace Orthanc
44 {
45 class ORTHANC_PUBLIC RestApiHierarchy : public boost::noncopyable
46 {
47 public:
48 class ORTHANC_PUBLIC Resource : public boost::noncopyable
49 {
50 private:
51 RestApiGetCall::Handler getHandler_;
52 RestApiPostCall::Handler postHandler_;
53 RestApiPutCall::Handler putHandler_;
54 RestApiDeleteCall::Handler deleteHandler_;
55
56 public:
57 Resource();
58
59 bool HasHandler(HttpMethod method) const;
60
61 void Register(RestApiGetCall::Handler handler)
62 {
63 getHandler_ = handler;
64 }
65
66 void Register(RestApiPutCall::Handler handler)
67 {
68 putHandler_ = handler;
69 }
70
71 void Register(RestApiPostCall::Handler handler)
72 {
73 postHandler_ = handler;
74 }
75
76 void Register(RestApiDeleteCall::Handler handler)
77 {
78 deleteHandler_ = handler;
79 }
80
81 bool IsEmpty() const;
82
83 bool Handle(RestApiGetCall& call) const;
84
85 bool Handle(RestApiPutCall& call) const;
86
87 bool Handle(RestApiPostCall& call) const;
88
89 bool Handle(RestApiDeleteCall& call) const;
90 };
91
92
93 class IVisitor : public boost::noncopyable
94 {
95 public:
96 virtual ~IVisitor()
97 {
98 }
99
100 virtual bool Visit(const Resource& resource,
101 const UriComponents& uri,
102 const IHttpHandler::Arguments& components,
103 const UriComponents& trailing) = 0;
104 };
105
106
107 private:
108 typedef std::map<std::string, RestApiHierarchy*> Children;
109
110 Resource handlers_;
111 Children children_;
112 Children wildcardChildren_;
113 Resource universalHandlers_;
114
115 static RestApiHierarchy& AddChild(Children& children,
116 const std::string& name);
117
118 static void DeleteChildren(Children& children);
119
120 template <typename Handler>
121 void RegisterInternal(const RestApiPath& path,
122 Handler handler,
123 size_t level);
124
125 bool CanGenerateDirectory() const;
126
127 bool LookupResource(IHttpHandler::Arguments& components,
128 const UriComponents& uri,
129 IVisitor& visitor,
130 size_t level);
131
132 bool GetDirectory(Json::Value& result,
133 const UriComponents& uri,
134 size_t level);
135
136 public:
137 ~RestApiHierarchy();
138
139 void Register(const std::string& uri,
140 RestApiGetCall::Handler handler);
141
142 void Register(const std::string& uri,
143 RestApiPutCall::Handler handler);
144
145 void Register(const std::string& uri,
146 RestApiPostCall::Handler handler);
147
148 void Register(const std::string& uri,
149 RestApiDeleteCall::Handler handler);
150
151 void CreateSiteMap(Json::Value& target) const;
152
153 bool GetDirectory(Json::Value& result,
154 const UriComponents& uri)
155 {
156 return GetDirectory(result, uri, 0);
157 }
158
159 bool LookupResource(const UriComponents& uri,
160 IVisitor& visitor);
161
162 void GetAcceptedMethods(std::set<HttpMethod>& methods,
163 const UriComponents& uri);
164 };
165 }