1 /******************************************************************
3 * Copyright 2015 Samsung Electronics All Rights Reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 ******************************************************************/
21 #include "simulator_resource_model_jni.h"
22 #include "simulator_exceptions_jni.h"
23 #include "simulator_utils_jni.h"
24 #include "jni_sharedobject_holder.h"
25 #include "jni_listener_holder.h"
26 #include "jni_string.h"
27 #include "jni_vector.h"
29 #include "simulator_resource.h"
31 #define VALIDATE_OBJECT(ENV, OBJECT) if (!OBJECT){throwBadObjectException(ENV, "No corresponsing native object!"); return;}
32 #define VALIDATE_OBJECT_RET(ENV, OBJECT, RET) if (!OBJECT){throwBadObjectException(ENV, "No corresponsing native object!"); return RET;}
34 SimulatorResourceSP SimulatorResourceToCpp(JNIEnv *env, jobject object)
36 JniSharedObjectHolder<SimulatorResource> *jniResource =
37 GetHandle<JniSharedObjectHolder<SimulatorResource>>(env, object);
39 return jniResource->get();
43 static jobject resourceTypeToJava(JNIEnv *env, SimulatorResource::Type type)
45 static jfieldID single = env->GetStaticFieldID(gSimulatorClassRefs.simulatorResourceTypeCls,
46 "SINGLE", "Lorg/oic/simulator/server/SimulatorResource$Type;");
47 static jfieldID collection = env->GetStaticFieldID(gSimulatorClassRefs.simulatorResourceTypeCls,
48 "COLLECTION", "Lorg/oic/simulator/server/SimulatorResource$Type;");
52 case SimulatorResource::Type::SINGLE_RESOURCE:
53 return env->GetStaticObjectField(gSimulatorClassRefs.simulatorResourceTypeCls, single);
54 case SimulatorResource::Type::COLLECTION_RESOURCE:
55 return env->GetStaticObjectField(gSimulatorClassRefs.simulatorResourceTypeCls, collection);
61 static jobject createObserverInfo(JNIEnv *env, const ObserverInfo &observerInfo)
63 static jmethodID observerInfoCtor = env->GetMethodID(gSimulatorClassRefs.observerCls,
64 "<init>", "(ILjava/lang/String;I)V");
66 jstring address = env->NewStringUTF(observerInfo.address.c_str());
67 jobject observer = (jobject) env->NewObject(gSimulatorClassRefs.observerCls,
68 observerInfoCtor, observerInfo.id, address, observerInfo.port);
69 env->DeleteLocalRef(address);
74 static jobject createObserverInfoVector(JNIEnv *env,
75 const std::vector<ObserverInfo> observersList)
77 jobject vectorObject = JniVector(env).toJava();
81 static jmethodID addMethod = env->GetMethodID(gSimulatorClassRefs.vectorCls,
82 "add", "(Ljava/lang/Object;)Z");
84 for (auto &observer : observersList)
85 env->CallBooleanMethod(vectorObject, addMethod, createObserverInfo(env, observer));
90 static void onObserverChange(jobject listener, const std::string &uri,
91 ObservationStatus state, const ObserverInfo &observerInfo)
93 JNIEnv *env = getEnv();
97 jclass listenerCls = env->GetObjectClass(listener);
98 jmethodID listenerMethod = nullptr;
99 if (ObservationStatus::REGISTER == state)
101 listenerMethod = env->GetMethodID(listenerCls, "onObserverAdded",
102 "(Ljava/lang/String;Lorg/oic/simulator/server/Observer;)V");
106 listenerMethod = env->GetMethodID(listenerCls, "onObserverRemoved",
107 "(Ljava/lang/String;Lorg/oic/simulator/server/Observer;)V");
110 jstring jUri = env->NewStringUTF(uri.c_str());
111 jobject jobserver = createObserverInfo(env, observerInfo);
113 env->CallVoidMethod(listener, listenerMethod, jUri, jobserver);
117 static void onResourceModelChange(jobject listener, const std::string &uri,
118 SimulatorResourceModel &resModel)
120 JNIEnv *env = getEnv();
124 jclass listenerCls = env->GetObjectClass(listener);
125 jmethodID listenerMethod = env->GetMethodID(listenerCls, "onResourceModelChanged",
126 "(Ljava/lang/String;Lorg/oic/simulator/SimulatorResourceModel;)V");
128 jobject jResModel = simulatorResourceModelToJava(env, resModel);
129 jstring jUri = env->NewStringUTF(uri.c_str());
130 env->CallVoidMethod(listener, listenerMethod, jUri, jResModel);
138 JNIEXPORT jstring JNICALL
139 Java_org_oic_simulator_server_SimulatorResource_getName
140 (JNIEnv *env, jobject object)
142 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
143 VALIDATE_OBJECT_RET(env, resource, nullptr)
145 return env->NewStringUTF(resource->getName().c_str());
148 JNIEXPORT jobject JNICALL
149 Java_org_oic_simulator_server_SimulatorResource_getType
150 (JNIEnv *env, jobject object)
152 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
153 VALIDATE_OBJECT_RET(env, resource, nullptr)
155 return resourceTypeToJava(env, resource->getType());
158 JNIEXPORT jstring JNICALL
159 Java_org_oic_simulator_server_SimulatorResource_getURI
160 (JNIEnv *env, jobject object)
162 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
163 VALIDATE_OBJECT_RET(env, resource, nullptr)
165 return env->NewStringUTF(resource->getURI().c_str());
168 JNIEXPORT jstring JNICALL
169 Java_org_oic_simulator_server_SimulatorResource_getResourceType
170 (JNIEnv *env, jobject object)
172 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
173 VALIDATE_OBJECT_RET(env, resource, nullptr)
175 return env->NewStringUTF(resource->getResourceType().c_str());
178 JNIEXPORT jobject JNICALL
179 Java_org_oic_simulator_server_SimulatorResource_getInterface
180 (JNIEnv *env, jobject object)
182 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
183 VALIDATE_OBJECT_RET(env, resource, nullptr)
185 std::vector<std::string> interfaces = resource->getInterface();
186 return JniVector(env).toJava(interfaces);
189 JNIEXPORT jboolean JNICALL
190 Java_org_oic_simulator_server_SimulatorResource_isObservable
191 (JNIEnv *env, jobject object)
193 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
194 VALIDATE_OBJECT_RET(env, resource, false)
196 return resource->isObservable();
199 JNIEXPORT jboolean JNICALL
200 Java_org_oic_simulator_server_SimulatorResource_isStarted
201 (JNIEnv *env, jobject object)
203 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
204 VALIDATE_OBJECT_RET(env, resource, false)
206 return resource->isStarted();
209 JNIEXPORT jobject JNICALL
210 Java_org_oic_simulator_server_SimulatorResource_getResourceModel
211 (JNIEnv *env, jobject object)
213 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
214 VALIDATE_OBJECT_RET(env, resource, nullptr)
216 SimulatorResourceModel resModel = resource->getResourceModel();
217 return simulatorResourceModelToJava(env, resModel);
220 JNIEXPORT void JNICALL
221 Java_org_oic_simulator_server_SimulatorResource_setName
222 (JNIEnv *env, jobject object, jstring name)
224 VALIDATE_INPUT(env, !name, "Name is null!")
226 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
227 VALIDATE_OBJECT(env, resource)
231 JniString jniName(env, name);
232 resource->setName(jniName.get());
234 catch (InvalidArgsException &e)
236 throwInvalidArgsException(env, e.code(), e.what());
240 JNIEXPORT void JNICALL
241 Java_org_oic_simulator_server_SimulatorResource_setURI
242 (JNIEnv *env, jobject object, jstring uri)
244 VALIDATE_INPUT(env, !uri, "Uri is null!")
246 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
247 VALIDATE_OBJECT(env, resource)
251 JniString jniUri(env, uri);
252 resource->setURI(jniUri.get());
254 catch (InvalidArgsException &e)
256 throwInvalidArgsException(env, e.code(), e.what());
258 catch (SimulatorException &e)
260 throwSimulatorException(env, e.code(), e.what());
264 JNIEXPORT void JNICALL
265 Java_org_oic_simulator_server_SimulatorResource_setResourceType
266 (JNIEnv *env, jobject object, jstring resourceType)
268 VALIDATE_INPUT(env, !resourceType, "Resource type is null!")
270 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
271 VALIDATE_OBJECT(env, resource)
275 JniString jniType(env, resourceType);
276 resource->setResourceType(jniType.get());
278 catch (InvalidArgsException &e)
280 throwInvalidArgsException(env, e.code(), e.what());
282 catch (SimulatorException &e)
284 throwSimulatorException(env, e.code(), e.what());
288 JNIEXPORT void JNICALL
289 Java_org_oic_simulator_server_SimulatorResource_addInterface
290 (JNIEnv *env, jobject object, jstring interfaceType)
292 VALIDATE_INPUT(env, !interfaceType, "Interface type is null!")
294 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
295 VALIDATE_OBJECT(env, resource)
299 JniString jniInterfaceType(env, interfaceType);
300 resource->addInterface(jniInterfaceType.get());
302 catch (InvalidArgsException &e)
304 throwInvalidArgsException(env, e.code(), e.what());
306 catch (NoSupportException &e)
308 throwNoSupportException(env, e.what());
310 catch (SimulatorException &e)
312 throwSimulatorException(env, e.code(), e.what());
316 JNIEXPORT void JNICALL
317 Java_org_oic_simulator_server_SimulatorResource_removeInterface
318 (JNIEnv *env, jobject object, jstring interfaceType)
320 VALIDATE_INPUT(env, !interfaceType, "Interface type is null!")
322 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
323 VALIDATE_OBJECT(env, resource)
325 JniString jniInterfaceType(env, interfaceType);
326 resource->removeInterface(jniInterfaceType.get());
329 JNIEXPORT void JNICALL
330 Java_org_oic_simulator_server_SimulatorResource_addInterfaces
331 (JNIEnv *env, jobject object, jobject interfaceType)
333 VALIDATE_INPUT(env, !interfaceType, "Interface type is null!")
335 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
336 VALIDATE_OBJECT(env, resource)
338 std::vector<std::string> interfaceList = JniVector(env).toCpp<std::string>(interfaceType);
342 resource->addInterface(interfaceList);
344 catch (InvalidArgsException &e)
346 throwInvalidArgsException(env, e.code(), e.what());
348 catch (NoSupportException &e)
350 throwNoSupportException(env, e.what());
352 catch (SimulatorException &e)
354 throwSimulatorException(env, e.code(), e.what());
358 JNIEXPORT void JNICALL
359 Java_org_oic_simulator_server_SimulatorResource_removeInterfaces
360 (JNIEnv *env, jobject object, jobject interfaceType)
362 VALIDATE_INPUT(env, !interfaceType, "Interface type is null!")
364 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
365 VALIDATE_OBJECT(env, resource)
367 std::vector<std::string> interfaceList = JniVector(env).toCpp<std::string>(interfaceType);
369 resource->removeInterface(interfaceList);
372 JNIEXPORT void JNICALL
373 Java_org_oic_simulator_server_SimulatorResource_setObservable
374 (JNIEnv *env, jobject object, jboolean state)
376 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
377 VALIDATE_OBJECT(env, resource)
381 resource->setObservable(static_cast<bool>(state));
383 catch (SimulatorException &e)
385 throwSimulatorException(env, e.code(), e.what());
389 JNIEXPORT void JNICALL
390 Java_org_oic_simulator_server_SimulatorResource_setObserverListener
391 (JNIEnv *env, jobject object, jobject listener)
393 VALIDATE_CALLBACK(env, listener)
395 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
396 VALIDATE_OBJECT(env, resource)
398 SimulatorResource::ObserverCallback callback = std::bind([](const std::string & uri,
399 ObservationStatus state, const ObserverInfo & observerInfo,
400 const std::shared_ptr<JniListenerHolder> &listenerRef)
402 onObserverChange(listenerRef->get(), uri, state, observerInfo);
403 }, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3,
404 JniListenerHolder::create(env, listener));
408 resource->setObserverCallback(callback);
410 catch (InvalidArgsException &e)
412 throwInvalidArgsException(env, e.code(), e.what());
416 JNIEXPORT void JNICALL
417 Java_org_oic_simulator_server_SimulatorResource_setResourceModelChangeListener
418 (JNIEnv *env, jobject object, jobject listener)
420 VALIDATE_CALLBACK(env, listener)
422 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
423 VALIDATE_OBJECT(env, resource)
425 SimulatorResource::ResourceModelChangedCallback callback = std::bind(
426 [](const std::string & uri, SimulatorResourceModel & resModel,
427 const std::shared_ptr<JniListenerHolder> &listenerRef)
429 onResourceModelChange(listenerRef->get(), uri, resModel);
430 }, std::placeholders::_1, std::placeholders::_2, JniListenerHolder::create(env, listener));
434 resource->setModelChangeCallback(callback);
436 catch (InvalidArgsException &e)
438 throwInvalidArgsException(env, e.code(), e.what());
442 JNIEXPORT void JNICALL
443 Java_org_oic_simulator_server_SimulatorResource_start
444 (JNIEnv *env, jobject object)
446 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
447 VALIDATE_OBJECT(env, resource)
453 catch (SimulatorException &e)
455 throwSimulatorException(env, e.code(), e.what());
459 JNIEXPORT void JNICALL
460 Java_org_oic_simulator_server_SimulatorResource_stop
461 (JNIEnv *env, jobject object)
463 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
464 VALIDATE_OBJECT(env, resource)
470 catch (SimulatorException &e)
472 throwSimulatorException(env, e.code(), e.what());
476 JNIEXPORT jobject JNICALL
477 Java_org_oic_simulator_server_SimulatorResource_getObservers
478 (JNIEnv *env, jobject object)
480 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
481 VALIDATE_OBJECT_RET(env, resource, nullptr)
483 return createObserverInfoVector(env, resource->getObserversList());
486 JNIEXPORT void JNICALL
487 Java_org_oic_simulator_server_SimulatorResource_notifyObserver
488 (JNIEnv *env, jobject object, jint id)
490 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
491 VALIDATE_OBJECT(env, resource)
495 resource->notify(id);
497 catch (SimulatorException &e)
499 throwSimulatorException(env, e.code(), e.what());
503 JNIEXPORT void JNICALL
504 Java_org_oic_simulator_server_SimulatorResource_notifyAllObservers
505 (JNIEnv *env, jobject object)
507 SimulatorResourceSP resource = SimulatorResourceToCpp(env, object);
508 VALIDATE_OBJECT(env, resource)
512 resource->notifyAll();
514 catch (SimulatorException &e)
516 throwSimulatorException(env, e.code(), e.what());