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_remote_resource_jni.h"
22 #include "simulator_common_jni.h"
23 #include "simulator_error_codes.h"
24 #include "simulator_resource_jni_util.h"
25 #include "simulator_resource_model_jni.h"
26 #include "simulator_client_types.h"
27 #include "simulator_exceptions.h"
28 #include "simulator_jni_utils.h"
30 extern SimulatorClassRefs gSimulatorClassRefs;
32 SimulatorRemoteResourceSP JniSimulatorRemoteResource::getResourceHandle
33 (JNIEnv *env, jobject object)
35 JniSimulatorRemoteResource *jniResource = GetHandle<JniSimulatorRemoteResource>(env, object);
36 if (env->ExceptionCheck() || !jniResource)
41 return jniResource->m_resource;
44 class JNIOnObserveListener
47 void setJavaOnObserveListener(JNIEnv *env, jobject listener)
49 m_listener = env->NewWeakGlobalRef(listener);
52 void onObserveCallback(const std::string &uId, const int errorCode,
53 SimulatorResourceModelSP representation,
56 JNIEnv *env = getEnv();
60 jobject onObserveListener = env->NewLocalRef(m_listener);
61 if (!onObserveListener)
67 jclass onObserveCls = env->GetObjectClass(onObserveListener);
74 if (OC_STACK_OK != errorCode && OC_STACK_RESOURCE_CREATED != errorCode
75 && OC_STACK_RESOURCE_DELETED != errorCode)
77 jmethodID midL = env->GetMethodID(onObserveCls, "onObserveFailed", "(Ljava/lang/Throwable;)V");
83 env->CallVoidMethod(onObserveListener, midL);
87 JSimulatorResourceModel *jniModel = new JSimulatorResourceModel(representation);
94 jobject jRepresentation = JSimulatorResourceModel::toJava(env,
95 reinterpret_cast<jlong>(jniModel));
103 jmethodID midL = env->GetMethodID(onObserveCls, "onObserveCompleted",
104 "(Ljava/lang/String;Lorg/oic/simulator/SimulatorResourceModel;I)V");
112 jstring jUid = env->NewStringUTF(uId.c_str());
114 env->CallVoidMethod(onObserveListener, midL, jUid, jRepresentation,
115 static_cast<jint>(seqNumber));
116 if (env->ExceptionCheck())
128 class JNIOnGetListener
131 void setJavaOnGetListener(JNIEnv *env, jobject listener)
133 m_listener = env->NewWeakGlobalRef(listener);
136 void onGetCallback(const std::string &uId, int errorCode,
137 SimulatorResourceModelSP representation)
139 JNIEnv *env = getEnv();
143 jobject onGetListener = env->NewLocalRef(m_listener);
150 jclass onGetCls = env->GetObjectClass(onGetListener);
157 // TODO: Revisit is it required?
158 if (OC_STACK_OK != errorCode && OC_STACK_RESOURCE_CREATED != errorCode
159 && OC_STACK_RESOURCE_DELETED != errorCode)
161 jmethodID midL = env->GetMethodID(onGetCls, "onGetFailed", "(Ljava/lang/Throwable;)V");
167 env->CallVoidMethod(onGetListener, midL);
171 JSimulatorResourceModel *jniModel = new JSimulatorResourceModel(representation);
178 jobject jRepresentation = JSimulatorResourceModel::toJava(env, reinterpret_cast<jlong>(jniModel));
179 if (!jRepresentation)
186 jmethodID midL = env->GetMethodID(onGetCls, "onGetCompleted",
187 "(Ljava/lang/String;Lorg/oic/simulator/SimulatorResourceModel;)V");
195 jstring jUid = env->NewStringUTF(uId.c_str());
196 env->CallVoidMethod(onGetListener, midL, jUid, jRepresentation);
197 if (env->ExceptionCheck())
209 class JNIOnPutListener
212 void setJavaOnPutListener(JNIEnv *env, jobject listener)
214 m_listener = env->NewWeakGlobalRef(listener);
217 void onPutCallback(const std::string &uId, int errorCode,
218 SimulatorResourceModelSP representation)
220 JNIEnv *env = getEnv();
224 jobject onPutListener = env->NewLocalRef(m_listener);
231 jclass onGetCls = env->GetObjectClass(onPutListener);
238 // TODO: Revisit is it required?
239 if (OC_STACK_OK != errorCode && OC_STACK_RESOURCE_CREATED != errorCode
240 && OC_STACK_RESOURCE_DELETED != errorCode)
242 jmethodID midL = env->GetMethodID(onGetCls, "onPutFailed", "(Ljava/lang/Throwable;)V");
248 env->CallVoidMethod(onPutListener, midL);
252 JSimulatorResourceModel *jniModel = new JSimulatorResourceModel(representation);
259 jobject jRepresentation = JSimulatorResourceModel::toJava(env,
260 reinterpret_cast<jlong>(jniModel));
261 if (!jRepresentation)
268 jmethodID midL = env->GetMethodID(onGetCls, "onPutCompleted",
269 "(Ljava/lang/String;Lorg/oic/simulator/SimulatorResourceModel;)V");
277 jstring jUid = env->NewStringUTF(uId.c_str());
278 env->CallVoidMethod(onPutListener, midL, jUid, jRepresentation);
279 if (env->ExceptionCheck())
291 class JNIOnPostListener
294 void setJavaOnPostListener(JNIEnv *env, jobject listener)
296 m_listener = env->NewWeakGlobalRef(listener);
299 void onPostCallback(const std::string &uId, int errorCode,
300 SimulatorResourceModelSP representation)
302 JNIEnv *env = getEnv();
306 jobject onPostListener = env->NewLocalRef(m_listener);
313 jclass onGetCls = env->GetObjectClass(onPostListener);
320 // TODO: Revisit is it required?
321 if (OC_STACK_OK != errorCode && OC_STACK_RESOURCE_CREATED != errorCode
322 && OC_STACK_RESOURCE_DELETED != errorCode)
324 jmethodID midL = env->GetMethodID(onGetCls, "onPostFailed", "(Ljava/lang/Throwable;)V");
330 env->CallVoidMethod(onPostListener, midL);
334 JSimulatorResourceModel *jniModel = new JSimulatorResourceModel(representation);
341 jobject jRepresentation = JSimulatorResourceModel::toJava(env,
342 reinterpret_cast<jlong>(jniModel));
343 if (!jRepresentation)
350 jmethodID midL = env->GetMethodID(onGetCls, "onPostCompleted",
351 "(Ljava/lang/String;Lorg/oic/simulator/SimulatorResourceModel;)V");
359 jstring jUid = env->NewStringUTF(uId.c_str());
361 env->CallVoidMethod(onPostListener, midL, jUid, jRepresentation);
362 if (env->ExceptionCheck())
375 class JNIOnVerificationListener
378 void setJavaOnVerificationListener(JNIEnv *env, jobject listener)
380 m_listener = env->NewWeakGlobalRef(listener);
383 void onVerificationCallback(const std::string &uId, int id, OperationState opState)
385 JNIEnv *env = getEnv();
389 jobject onVerificationListener = env->NewLocalRef(m_listener);
390 if (!onVerificationListener)
396 jclass onVerificationCls = env->GetObjectClass(onVerificationListener);
397 if (!onVerificationCls)
405 if (OP_START == opState)
407 midL = env->GetMethodID(onVerificationCls, "onVerificationStarted", "(Ljava/lang/String;I)V");
409 else if (OP_COMPLETE == opState)
411 midL = env->GetMethodID(onVerificationCls, "onVerificationCompleted", "(Ljava/lang/String;I)V");
415 midL = env->GetMethodID(onVerificationCls, "onVerificationAborted", "(Ljava/lang/String;I)V");
424 jstring jUid = env->NewStringUTF(uId.c_str());
426 env->CallVoidMethod(onVerificationListener, midL, jUid, (jint)id);
428 if (env->ExceptionCheck())
440 JNIEXPORT void JNICALL
441 Java_org_oic_simulator_clientcontroller_SimulatorRemoteResource_startObserve
442 (JNIEnv *env, jobject thiz, jint observeType, jobject jQueryParamsMap, jobject jListener)
446 throwInvalidArgsException(env, SIMULATOR_INVALID_CALLBACK, "Invalid callback!");
450 SimulatorRemoteResourceSP resource = JniSimulatorRemoteResource::getResourceHandle(env,
454 throwSimulatorException(env, SIMULATOR_BAD_OBJECT, "No resource!");
458 std::map<std::string, std::string> queryParams;
460 convertJavaMapToQueryParamsMap(env, jQueryParamsMap, queryParams);
462 ObserveType type = ObserveType::OBSERVE;
463 if (1 == observeType)
464 type = ObserveType::OBSERVE_ALL;
466 JNIOnObserveListener *onObserveListener = new JNIOnObserveListener();
467 onObserveListener->setJavaOnObserveListener(env, jListener);
471 resource->observe(type,
472 std::bind(&JNIOnObserveListener::onObserveCallback,
473 onObserveListener, std::placeholders::_1,
474 std::placeholders::_2, std::placeholders::_3,
475 std::placeholders::_4));
477 catch (InvalidArgsException &e)
479 throwInvalidArgsException(env, e.code(), e.what());
481 catch (SimulatorException &e)
483 throwSimulatorException(env, e.code(), e.what());
487 throwSimulatorException(env, SIMULATOR_ERROR, "Unknown Exception");
491 JNIEXPORT void JNICALL
492 Java_org_oic_simulator_clientcontroller_SimulatorRemoteResource_stopObserve
493 (JNIEnv *env, jobject thiz)
495 SimulatorRemoteResourceSP resource = JniSimulatorRemoteResource::getResourceHandle(env,
499 throwSimulatorException(env, SIMULATOR_BAD_OBJECT, "No resource!");
505 resource->cancelObserve();
507 catch (SimulatorException &e)
509 throwSimulatorException(env, e.code(), e.what());
513 throwSimulatorException(env, SIMULATOR_ERROR, "Unknown Exception");
517 JNIEXPORT void JNICALL
518 Java_org_oic_simulator_clientcontroller_SimulatorRemoteResource_nativeGet
519 (JNIEnv *env, jobject thiz, jstring jResourceInterface,
520 jobject jQueryParamsMap, jobject jListener)
524 throwInvalidArgsException(env, SIMULATOR_INVALID_CALLBACK, "Invalid callback!");
528 SimulatorRemoteResourceSP resource = JniSimulatorRemoteResource::getResourceHandle(env,
532 throwSimulatorException(env, SIMULATOR_BAD_OBJECT, "No resource!");
537 const char *interfaceCStr = NULL;
538 std::string interfaceType;
539 if (jResourceInterface)
541 interfaceCStr = env->GetStringUTFChars(jResourceInterface, NULL);
542 interfaceType = interfaceCStr;
546 std::map<std::string, std::string> queryParams;
548 convertJavaMapToQueryParamsMap(env, jQueryParamsMap, queryParams);
551 JNIOnGetListener *onGetListener = new JNIOnGetListener();
552 onGetListener->setJavaOnGetListener(env, jListener);
556 resource->get(interfaceType,
558 std::bind(&JNIOnGetListener::onGetCallback,
559 onGetListener, std::placeholders::_1,
560 std::placeholders::_2, std::placeholders::_3));
562 catch (InvalidArgsException &e)
564 throwInvalidArgsException(env, e.code(), e.what());
567 catch (NoSupportException &e)
569 throwNoSupportException(env, e.code(), e.what());
572 catch (SimulatorException &e)
574 throwSimulatorException(env, e.code(), e.what());
579 throwSimulatorException(env, SIMULATOR_ERROR, "Unknown Exception");
584 env->ReleaseStringUTFChars(jResourceInterface, interfaceCStr);
587 JNIEXPORT void JNICALL
588 Java_org_oic_simulator_clientcontroller_SimulatorRemoteResource_nativePut
589 (JNIEnv *env, jobject thiz, jstring jResourceInterface,
590 jobject jRepresentation, jobject jQueryParamsMap, jobject jListener)
594 throwInvalidArgsException(env, SIMULATOR_INVALID_CALLBACK, "Invalid callback!");
598 SimulatorRemoteResourceSP resource = JniSimulatorRemoteResource::getResourceHandle(env,
602 throwSimulatorException(env, SIMULATOR_BAD_OBJECT, "No resource!");
607 const char *interfaceCStr = NULL;
608 std::string interfaceType;
609 if (jResourceInterface)
611 interfaceCStr = env->GetStringUTFChars(jResourceInterface, NULL);
612 interfaceType = interfaceCStr;
616 std::map<std::string, std::string> queryParams;
618 convertJavaMapToQueryParamsMap(env, jQueryParamsMap, queryParams);
620 SimulatorResourceModelSP resourceModel =
621 JSimulatorResourceModel::getResourceModelPtr(env, jRepresentation);
624 JNIOnPutListener *onPutListener = new JNIOnPutListener();
625 onPutListener->setJavaOnPutListener(env, jListener);
629 resource->put(interfaceType,
632 std::bind(&JNIOnPutListener::onPutCallback,
633 onPutListener, std::placeholders::_1,
634 std::placeholders::_2, std::placeholders::_3));
636 catch (InvalidArgsException &e)
638 throwInvalidArgsException(env, e.code(), e.what());
641 catch (NoSupportException &e)
643 throwNoSupportException(env, e.code(), e.what());
646 catch (SimulatorException &e)
648 throwSimulatorException(env, e.code(), e.what());
653 throwSimulatorException(env, SIMULATOR_ERROR, "Unknown Exception");
658 env->ReleaseStringUTFChars(jResourceInterface, interfaceCStr);
661 JNIEXPORT void JNICALL
662 Java_org_oic_simulator_clientcontroller_SimulatorRemoteResource_nativePost
663 (JNIEnv *env, jobject thiz, jstring jResourceInterface,
664 jobject jRepresentation, jobject jQueryParamsMap, jobject jListener)
668 throwInvalidArgsException(env, SIMULATOR_INVALID_CALLBACK, "Invalid callback!");
672 SimulatorRemoteResourceSP resource = JniSimulatorRemoteResource::getResourceHandle(env,
676 throwSimulatorException(env, SIMULATOR_BAD_OBJECT, "No resource!");
681 const char *interfaceCStr = NULL;
682 std::string interfaceType;
683 if (jResourceInterface)
685 interfaceCStr = env->GetStringUTFChars(jResourceInterface, NULL);
686 interfaceType = interfaceCStr;
690 std::map<std::string, std::string> queryParams;
692 convertJavaMapToQueryParamsMap(env, jQueryParamsMap, queryParams);
694 SimulatorResourceModelSP resourceModel =
695 JSimulatorResourceModel::getResourceModelPtr(env, jRepresentation);
698 JNIOnPostListener *onPostListener = new JNIOnPostListener();
699 onPostListener->setJavaOnPostListener(env, jListener);
703 resource->post(interfaceType,
706 std::bind(&JNIOnPostListener::onPostCallback,
707 onPostListener, std::placeholders::_1,
708 std::placeholders::_2, std::placeholders::_3));
710 catch (InvalidArgsException &e)
712 throwInvalidArgsException(env, e.code(), e.what());
715 catch (NoSupportException &e)
717 throwNoSupportException(env, e.code(), e.what());
720 catch (SimulatorException &e)
722 throwSimulatorException(env, e.code(), e.what());
727 throwSimulatorException(env, SIMULATOR_ERROR, "Unknown Exception");
732 env->ReleaseStringUTFChars(jResourceInterface, interfaceCStr);
735 JNIEXPORT void JNICALL
736 Java_org_oic_simulator_clientcontroller_SimulatorRemoteResource_setConfigInfo
737 (JNIEnv *env, jobject thiz, jstring jConfigPath)
741 throwInvalidArgsException(env, SIMULATOR_INVALID_PARAM,
742 "Configuration file path is null!");
746 SimulatorRemoteResourceSP resource = JniSimulatorRemoteResource::getResourceHandle(env,
750 throwSimulatorException(env, SIMULATOR_BAD_OBJECT, "No resource!");
755 const char *configCStr = NULL;
756 std::string configPath;
759 configCStr = env->GetStringUTFChars(jConfigPath, NULL);
760 configPath = configCStr;
765 resource->configure(configPath);
767 catch (InvalidArgsException &e)
769 throwInvalidArgsException(env, e.code(), e.what());
774 throwSimulatorException(env, SIMULATOR_ERROR, "Unknown Exception");
779 env->ReleaseStringUTFChars(jConfigPath, configCStr);
782 JNIEXPORT jint JNICALL
783 Java_org_oic_simulator_clientcontroller_SimulatorRemoteResource_startVerification
784 (JNIEnv *env, jobject thiz, jint jReqType, jobject jListener)
788 throwInvalidArgsException(env, SIMULATOR_INVALID_CALLBACK, "Invalid callback!");
789 return SIMULATOR_INVALID_CALLBACK;
792 SimulatorRemoteResourceSP resource = JniSimulatorRemoteResource::getResourceHandle(env,
796 throwSimulatorException(env, SIMULATOR_BAD_OBJECT, "No resource!");
797 return SIMULATOR_BAD_OBJECT;
800 // Convert RequestType
806 reqType = RequestType::RQ_TYPE_GET;
810 reqType = RequestType::RQ_TYPE_PUT;
814 reqType = RequestType::RQ_TYPE_POST;
818 reqType = RequestType::RQ_TYPE_DELETE;
826 JNIOnVerificationListener *onVerificationListener = new JNIOnVerificationListener();
827 onVerificationListener->setJavaOnVerificationListener(env, jListener);
829 int automationId = -1;
833 automationId = resource->startVerification(reqType,
834 std::bind(&JNIOnVerificationListener::onVerificationCallback,
835 onVerificationListener, std::placeholders::_1,
836 std::placeholders::_2, std::placeholders::_3));
838 catch (InvalidArgsException &e)
840 throwInvalidArgsException(env, e.code(), e.what());
842 catch (NoSupportException &e)
844 throwNoSupportException(env, e.code(), e.what());
846 catch (OperationInProgressException &e)
848 throwOperationInProgressException(env, e.code(), e.what());
850 catch (SimulatorException &e)
852 throwSimulatorException(env, e.code(), e.what());
856 throwSimulatorException(env, SIMULATOR_ERROR, "Unknown Exception");
862 JNIEXPORT void JNICALL
863 Java_org_oic_simulator_clientcontroller_SimulatorRemoteResource_stopVerification
864 (JNIEnv *env, jobject thiz, jint jId)
866 SimulatorRemoteResourceSP resource = JniSimulatorRemoteResource::getResourceHandle(env,
870 throwSimulatorException(env, SIMULATOR_BAD_OBJECT, "No resource!");
876 resource->stopVerification((int)jId);
878 catch (InvalidArgsException &e)
880 throwInvalidArgsException(env, e.code(), e.what());
882 catch (NoSupportException &e)
884 throwNoSupportException(env, e.code(), e.what());
888 throwSimulatorException(env, SIMULATOR_ERROR, "Unknown Exception");
892 JNIEXPORT void JNICALL Java_org_oic_simulator_clientcontroller_SimulatorRemoteResource_dispose
893 (JNIEnv *env, jobject thiz)
895 JniSimulatorRemoteResource *resource = GetHandle<JniSimulatorRemoteResource>(env, thiz);