annotate Plugin/Plugin.cpp @ 9:88c1614fb3dc

added sample basic plugin
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 19 Oct 2023 11:55:38 +0200
parents 26c08ff926a3
children 1c407ba1d311
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * SPDX-FileCopyrightText: 2023 Sebastien Jodogne, UCLouvain, Belgium
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3 * SPDX-License-Identifier: GPL-3.0-or-later
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4 */
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
5
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 /**
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 * Java plugin for Orthanc
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * Copyright (C) 2023 Sebastien Jodogne, UCLouvain, Belgium
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 *
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 * This program is free software: you can redistribute it and/or
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 * modify it under the terms of the GNU General Public License as
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 * published by the Free Software Foundation, either version 3 of the
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * License, or (at your option) any later version.
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 *
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * This program is distributed in the hope that it will be useful, but
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 * General Public License for more details.
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 *
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 * You should have received a copy of the GNU General Public License
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22 **/
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24
7
b14ed1ea3a23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5
diff changeset
25 #include "JavaLocalObject.h"
b14ed1ea3a23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5
diff changeset
26 #include "JavaGlobalReference.h"
b14ed1ea3a23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5
diff changeset
27 #include "OrthancBytes.h"
b14ed1ea3a23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5
diff changeset
28 #include "OrthancString.h"
b14ed1ea3a23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5
diff changeset
29 #include "JavaBytes.h"
b14ed1ea3a23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5
diff changeset
30 #include "JavaString.h"
5
c8f19e93ff99 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
31 #include "JavaEnvironment.h"
c8f19e93ff99 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
32 #include "JavaVirtualMachine.h"
c8f19e93ff99 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
33
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
34 #include <orthanc/OrthancCPlugin.h>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36 #include <cassert>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37 #include <iostream>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38 #include <jni.h>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39 #include <list>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40 #include <map>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41 #include <memory>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
42 #include <set>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
43 #include <stdexcept>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
44 #include <vector>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46 #include <json/reader.h>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48 #include "Mutex.h"
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49
5
c8f19e93ff99 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
50 OrthancPluginContext* context_ = NULL;
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52 static std::unique_ptr<JavaVirtualMachine> java_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54
8
26c08ff926a3 added warning about auto-generated files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
55 // This function is implemented in the "NativeSDK.cpp" auto-generated file
26c08ff926a3 added warning about auto-generated files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
56 extern void JNI_LoadNatives(std::vector<JNINativeMethod>& methods);
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 #define MAX_REST_CALLBACKS 10
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61 class CallbacksConfiguration : public NonCopyable
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
63 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
64 Mutex mutex_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 std::list<JavaGlobalReference*> onChangeCallbacks_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66 std::vector<JavaGlobalReference*> onRestRequestCallbacks_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
68 static void DestructCallbacks(std::list<JavaGlobalReference*>& lst)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 for (std::list<JavaGlobalReference*>::iterator it = lst.begin(); it != lst.end(); ++it)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 assert(*it != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 delete *it;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 static void DestructCallbacks(std::vector<JavaGlobalReference*>& v)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79 for (size_t i = 0; i < v.size(); i++)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 assert(v[i] != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 delete v[i];
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86 void CopyCallbacks(std::list<jobject>& target,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 const std::list<JavaGlobalReference*>& lst)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89 Mutex::Locker locker(mutex_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
90 target.clear();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92 for (std::list<JavaGlobalReference*>::const_iterator it = lst.begin(); it != lst.end(); ++it)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 assert(*it != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95 target.push_back((*it)->GetValue());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 void AddCallback(std::list<JavaGlobalReference*>& lst,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 JavaVirtualMachine& jvm,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101 jobject callback)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 if (callback == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
105 throw std::runtime_error("Null pointer");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
106 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
108 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
109 Mutex::Locker locker(mutex_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110 lst.push_back(new JavaGlobalReference(jvm, callback));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
112 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
113
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
114 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
115 CallbacksConfiguration()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
116 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
117 onRestRequestCallbacks_.reserve(MAX_REST_CALLBACKS);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
118 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
119
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
120 ~CallbacksConfiguration()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
121 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
122 DestructCallbacks(onChangeCallbacks_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
123 DestructCallbacks(onRestRequestCallbacks_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
124 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
125
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
126 void AddOnChangeCallback(JavaVirtualMachine& jvm,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
127 jobject callback)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
128 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
129 AddCallback(onChangeCallbacks_, jvm, callback);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
130 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
131
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
132 void GetOnChangeCallbacks(std::list<jobject>& target)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
133 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
134 CopyCallbacks(target, onChangeCallbacks_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
135 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
136
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137 size_t AddOnRestRequestCallback(JavaVirtualMachine& jvm,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138 jobject callback)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
139 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
140 if (callback == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
142 throw std::runtime_error("Null pointer");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
143 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
145 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
146 Mutex::Locker locker(mutex_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
148 if (onRestRequestCallbacks_.size() >= MAX_REST_CALLBACKS)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
149 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
150 char buf[16];
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
151 sprintf(buf, "%d", MAX_REST_CALLBACKS);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
152 throw std::runtime_error("The Java plugin for Orthanc has been compiled for a maximum of " +
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
153 std::string(buf) + " REST callbacks");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
154 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
155 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
156 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
157 size_t result = onRestRequestCallbacks_.size();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
158 onRestRequestCallbacks_.push_back(new JavaGlobalReference(jvm, callback));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
159 return result;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
160 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
161 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
162 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
163
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
164 jobject GetOnRestCallback(size_t i)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
165 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
166 Mutex::Locker locker(mutex_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
167
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
168 if (i >= onRestRequestCallbacks_.size())
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
169 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
170 throw std::runtime_error("Unknown REST callback");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
171 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
172 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
173 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
174 assert(onRestRequestCallbacks_[i] != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
175 return onRestRequestCallbacks_[i]->GetValue();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
176 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
177 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
178 };
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
179
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
180 static std::unique_ptr<CallbacksConfiguration> callbacksConfiguration_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
181
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
182
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
183
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
184
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
185 template<size_t Index>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
186 class RestCallbacksPool
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
187 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
188 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
189 RestCallbacksPool<Index - 1> next_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
190
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
191 static OrthancPluginErrorCode Callback(OrthancPluginRestOutput* output,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
192 const char* uri,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
193 const OrthancPluginHttpRequest* request)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
194 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
195 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
196 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
197 jobject callback = callbacksConfiguration_->GetOnRestCallback(MAX_REST_CALLBACKS - Index);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
198 if (callback == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
199 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
200 throw std::runtime_error("Missing callback");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
201 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
202
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
203 std::vector<std::string> groups;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
204 groups.resize(request->groupsCount);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
205 for (uint32_t i = 0; i < request->groupsCount; i++)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
206 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
207 groups[i].assign(request->groups[i]);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
208 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
209
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
210 std::map<std::string, std::string> headers;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
211 for (uint32_t i = 0; i < request->headersCount; i++)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
212 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
213 headers[request->headersKeys[i]] = request->headersValues[i];
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
214 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
215
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
216 std::map<std::string, std::string> getParameters;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
217 for (uint32_t i = 0; i < request->getCount; i++)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
218 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
219 getParameters[request->getKeys[i]] = request->getValues[i];
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
220 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
221
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
222 JavaEnvironment env(*java_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
223
7
b14ed1ea3a23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5
diff changeset
224 JavaLocalObject joutput(env, env.ConstructJavaWrapper("be/uclouvain/orthanc/RestOutput", output));
b14ed1ea3a23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5
diff changeset
225 JavaLocalObject jmethod(env, env.ConstructEnumValue("be/uclouvain/orthanc/HttpMethod", request->method));
b14ed1ea3a23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5
diff changeset
226 JavaLocalObject juri(env, env.GetValue().NewStringUTF(uri == NULL ? "" : uri));
b14ed1ea3a23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5
diff changeset
227 std::unique_ptr<JavaLocalObject> jgroups(JavaLocalObject::CreateArrayOfStrings(env, groups));
b14ed1ea3a23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5
diff changeset
228 std::unique_ptr<JavaLocalObject> jheaders(JavaLocalObject::CreateDictionary(env, headers));
b14ed1ea3a23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5
diff changeset
229 std::unique_ptr<JavaLocalObject> jgetParameters(JavaLocalObject::CreateDictionary(env, getParameters));
b14ed1ea3a23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5
diff changeset
230 JavaLocalObject jbody(env, env.ConstructByteArray(request->bodySize, request->body));
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
231
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
232 jmethodID call = env.GetMethodID(
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
233 env.GetObjectClass(callback), "call",
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
234 "(Lbe/uclouvain/orthanc/RestOutput;Lbe/uclouvain/orthanc/HttpMethod;Ljava/lang/String;"
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
235 "[Ljava/lang/String;Ljava/util/Map;Ljava/util/Map;[B)V");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
236
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
237 env.GetValue().CallVoidMethod(callback, call, joutput.GetValue(), jmethod.GetValue(), juri.GetValue(),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
238 jgroups->GetValue(), jheaders->GetValue(), jgetParameters->GetValue(), jbody.GetValue());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
239 env.CheckException();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
240
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
241 return OrthancPluginErrorCode_Success;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
242 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
243 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
244 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
245 OrthancPluginLogError(context_, e.what());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
246 return OrthancPluginErrorCode_Plugin;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
247 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
248 catch (...)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
249 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
250 OrthancPluginLogError(context_, "Caught native exception");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
251 return OrthancPluginErrorCode_Plugin;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
252 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
253 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
254
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
255 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
256 OrthancPluginRestCallback GetCallback(size_t i)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
257 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
258 if (i == 0)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
259 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
260 return Callback;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
261 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
262 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
263 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
264 return next_.GetCallback(i - 1);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
265 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
266 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
267 };
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
268
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
269 template<>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
270 class RestCallbacksPool<0>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
271 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
272 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
273 OrthancPluginRestCallback& GetCallback(size_t i)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
274 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
275 throw std::runtime_error("Out of tuple");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
276 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
277 };
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
278
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
279
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
280 static RestCallbacksPool<MAX_REST_CALLBACKS> restCallbacksPool_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
281
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
282
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
283
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
284 OrthancPluginErrorCode OnChangeCallback(OrthancPluginChangeType changeType,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
285 OrthancPluginResourceType resourceType,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
286 const char* resourceId)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
287 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
288 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
289 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
290 std::list<jobject> callbacks;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
291 callbacksConfiguration_->GetOnChangeCallbacks(callbacks);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
292
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
293 if (!callbacks.empty())
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
294 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
295 JavaEnvironment env(*java_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
296
7
b14ed1ea3a23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5
diff changeset
297 JavaLocalObject c(env, env.ConstructEnumValue("be/uclouvain/orthanc/ChangeType", changeType));
b14ed1ea3a23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5
diff changeset
298 JavaLocalObject r(env, env.ConstructEnumValue("be/uclouvain/orthanc/ResourceType", resourceType));
b14ed1ea3a23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5
diff changeset
299 JavaLocalObject s(env, env.GetValue().NewStringUTF(resourceId == NULL ? "" : resourceId));
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
300
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
301 for (std::list<jobject>::const_iterator
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
302 callback = callbacks.begin(); callback != callbacks.end(); ++callback)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
303 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
304 assert(*callback != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
305
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
306 jmethodID call = env.GetMethodID(
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
307 env.GetObjectClass(*callback), "call",
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
308 "(Lbe/uclouvain/orthanc/ChangeType;Lbe/uclouvain/orthanc/ResourceType;Ljava/lang/String;)V");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
309
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
310 env.GetValue().CallVoidMethod(*callback, call, c.GetValue(), r.GetValue(), s.GetValue());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
311 env.CheckException();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
312 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
313 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
314
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
315 return OrthancPluginErrorCode_Success;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
316 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
317 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
318 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
319 OrthancPluginLogError(context_, e.what());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
320 return OrthancPluginErrorCode_Plugin;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
321 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
322 catch (...)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
323 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
324 OrthancPluginLogError(context_, "Caught native exception");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
325 return OrthancPluginErrorCode_Plugin;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
326 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
327 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
328
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
329
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
330 JNIEXPORT void RegisterOnChangeCallback(JNIEnv* env, jobject sdkObject, jobject callback)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
331 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
332 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
333 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
334 callbacksConfiguration_->AddOnChangeCallback(*java_, callback);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
335 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
336 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
337 {
5
c8f19e93ff99 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
338 JavaEnvironment::ThrowOrthancException(env, e.what());
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
339 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
340 catch (...)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
341 {
5
c8f19e93ff99 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
342 JavaEnvironment::ThrowOrthancException(env, OrthancPluginErrorCode_Plugin);
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
343 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
344 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
345
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
346
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
347 JNIEXPORT void RegisterOnRestRequestCallback(JNIEnv* env, jobject sdkObject, jstring regex, jobject callback)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
348 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
349 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
350 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
351 JavaString cregex(env, regex);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
352 size_t index = callbacksConfiguration_->AddOnRestRequestCallback(*java_, callback);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
353 OrthancPluginRegisterRestCallbackNoLock(context_, cregex.GetValue(), restCallbacksPool_.GetCallback(index));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
354 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
355 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
356 {
5
c8f19e93ff99 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
357 JavaEnvironment::ThrowOrthancException(env, e.what());
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
358 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
359 catch (...)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
360 {
5
c8f19e93ff99 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
361 JavaEnvironment::ThrowOrthancException(env, OrthancPluginErrorCode_Plugin);
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
362 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
363 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
364
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
365
4
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
366 static void ParseJson(Json::Value& target,
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
367 const std::string& source)
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
368 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
369 Json::CharReaderBuilder builder;
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
370 builder.settings_["collectComments"] = false;
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
371
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
372 const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
373 assert(reader.get() != NULL);
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
374
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
375 JSONCPP_STRING err;
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
376 if (!reader->parse(source.c_str(), source.c_str() + source.size(), &target, &err))
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
377 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
378 throw std::runtime_error("Cannot parse JSON: " + err);
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
379 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
380 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
381
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
382
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
383 static bool HasOption(const Json::Value& json,
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
384 const std::string& key,
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
385 Json::ValueType type,
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
386 bool isMandatory)
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
387 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
388 if (!json.isMember(key))
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
389 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
390 if (isMandatory)
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
391 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
392 throw std::runtime_error("Missing configuration option for the Java plugin: \"" + key + "\"");
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
393 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
394 else
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
395 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
396 return false;
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
397 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
398 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
399 else if (json[key].type() == type)
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
400 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
401 return true;
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
402 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
403 else
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
404 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
405 throw std::runtime_error("The configuration option \"" + key + "\" for the Java plugin has not the proper type");
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
406 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
407 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
408
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
409
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
410 static std::string GetMandatoryString(const Json::Value& json,
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
411 const std::string& key)
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
412 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
413 HasOption(json, key, Json::stringValue, true);
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
414 assert(json.isMember(key) &&
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
415 json[key].type() == Json::stringValue);
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
416 return json[key].asString();
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
417 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
418
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
419
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
420 extern "C"
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
421 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
422 ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(OrthancPluginContext* context)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
423 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
424 context_ = context;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
425
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
426 /* Check the version of the Orthanc core */
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
427 if (OrthancPluginCheckVersion(context) == 0)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
428 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
429 char info[1024];
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
430 sprintf(info, "Your version of Orthanc (%s) must be above %d.%d.%d to run this plugin",
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
431 context->orthancVersion,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
432 ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
433 ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
434 ORTHANC_PLUGINS_MINIMAL_REVISION_NUMBER);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
435 OrthancPluginLogError(context, info);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
436 return -1;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
437 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
438
4
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
439 OrthancPluginSetDescription(context, "Java plugin for Orthanc");
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
440
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
441 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
442 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
443 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
444 // Sanity check to ensure that the compiler has created different callback functions
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
445 std::set<intptr_t> c;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
446 for (unsigned int i = 0; i < MAX_REST_CALLBACKS; i++)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
447 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
448 c.insert(reinterpret_cast<intptr_t>(restCallbacksPool_.GetCallback(i)));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
449 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
450
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
451 if (c.size() != MAX_REST_CALLBACKS)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
452 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
453 throw std::runtime_error("The Java plugin has not been properly compiled");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
454 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
455 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
456
4
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
457 Json::Value globalConfiguration;
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
458
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
459 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
460 OrthancString tmp(OrthancPluginGetConfiguration(context));
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
461 ParseJson(globalConfiguration, tmp.GetValue());
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
462 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
463
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
464 static const std::string KEY_JAVA = "Java";
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
465 static const std::string KEY_ENABLED = "Enabled";
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
466 static const std::string KEY_CLASSPATH = "Classpath";
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
467 static const std::string KEY_INITIALIZATION_CLASS = "InitializationClass";
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
468
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
469 if (!HasOption(globalConfiguration, KEY_JAVA, Json::objectValue, false))
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
470 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
471 OrthancPluginLogInfo(context, "Java plugin is disabled");
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
472 return 0;
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
473 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
474
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
475 Json::Value javaConfiguration = globalConfiguration[KEY_JAVA];
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
476 assert(javaConfiguration.isObject());
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
477
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
478 if (HasOption(javaConfiguration, KEY_ENABLED, Json::booleanValue, false) &&
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
479 !javaConfiguration[KEY_ENABLED].asBool())
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
480 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
481 OrthancPluginLogInfo(context, "Java plugin is disabled");
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
482 return 0;
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
483 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
484
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
485 java_.reset(new JavaVirtualMachine(GetMandatoryString(javaConfiguration, KEY_CLASSPATH)));
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
486
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
487 callbacksConfiguration_.reset(new CallbacksConfiguration);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
488 OrthancPluginRegisterOnChangeCallback(context_, OnChangeCallback);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
489
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
490 JavaEnvironment env(*java_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
491
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
492 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
493 std::vector<JNINativeMethod> methods;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
494 JNI_LoadNatives(methods);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
495 env.RegisterNatives("be/uclouvain/orthanc/NativeSDK", methods);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
496 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
497
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
498 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
499 std::vector<JNINativeMethod> methods;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
500 methods.push_back((JNINativeMethod) {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
501 const_cast<char*>("register"),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
502 const_cast<char*>("(Lbe/uclouvain/orthanc/Callbacks$OnChange;)V"),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
503 (void*) RegisterOnChangeCallback });
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
504 methods.push_back((JNINativeMethod) {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
505 const_cast<char*>("register"),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
506 const_cast<char*>("(Ljava/lang/String;Lbe/uclouvain/orthanc/Callbacks$OnRestRequest;)V"),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
507 (void*) RegisterOnRestRequestCallback });
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
508 env.RegisterNatives("be/uclouvain/orthanc/Callbacks", methods);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
509 }
4
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
510
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
511 if (HasOption(javaConfiguration, KEY_INITIALIZATION_CLASS, Json::stringValue, false))
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
512 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
513 env.FindClass(javaConfiguration[KEY_INITIALIZATION_CLASS].asString());
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
514 }
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
515 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
516 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
517 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
518 OrthancPluginLogError(context, e.what());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
519 return -1;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
520 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
521
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
522 return 0;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
523 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
524
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
525
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
526 ORTHANC_PLUGINS_API void OrthancPluginFinalize()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
527 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
528 if (java_.get() != NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
529 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
530 callbacksConfiguration_.reset(NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
531
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
532 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
533 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
534 JavaEnvironment env(*java_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
535 env.RunGarbageCollector();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
536 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
537 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
538 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
539 OrthancPluginLogError(context_, e.what());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
540 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
541
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
542 java_.reset(NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
543 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
544 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
545
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
546
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
547 ORTHANC_PLUGINS_API const char* OrthancPluginGetName()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
548 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
549 return "java";
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
550 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
551
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
552
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
553 ORTHANC_PLUGINS_API const char* OrthancPluginGetVersion()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
554 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
555 return PLUGIN_VERSION;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
556 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
557 }