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_manager_jni.h"
22 #include "simulator_resource_server_jni.h"
23 #include "simulator_common_jni.h"
24 #include "simulator_manager.h"
25 #include "simulator_remote_resource_jni.h"
26 #include "simulator_resource_model_jni.h"
28 SimulatorClassRefs gSimulatorClassRefs;
34 std::unique_lock<std::mutex> lock(gEnvMutex);
39 jint ret = gvm->GetEnv((void **)&env, JNI_VERSION_1_6);
45 if (0 == gvm->AttachCurrentThread((void **)&env, NULL))
54 std::unique_lock<std::mutex> lock(gEnvMutex);
57 gvm->DetachCurrentThread();
60 class JNILogger : public ILogger
63 void setJavaLogger(JNIEnv *env, jobject logger)
65 m_logger = env->NewWeakGlobalRef(logger);
68 void write(std::string time, ILogger::Level level, std::string message)
70 JNIEnv *env = getEnv();
74 jobject logger = env->NewLocalRef(m_logger);
81 jclass loggerCls = env->GetObjectClass(logger);
88 jmethodID writeMId = env->GetMethodID(loggerCls, "write",
89 "(Ljava/lang/String;ILjava/lang/String;)V");
96 jstring msg = env->NewStringUTF(message.c_str());
97 jstring timeStr = env->NewStringUTF(time.c_str());
98 env->CallVoidMethod(logger, writeMId, timeStr, static_cast<jint>(level), msg);
99 env->DeleteLocalRef(msg);
100 env->DeleteLocalRef(timeStr);
109 jobject SimulatorRemoteResourceToJava(JNIEnv *env, jlong resource)
111 jmethodID constructor = env->GetMethodID(gSimulatorClassRefs.classSimulatorRemoteResource, "<init>",
113 if (NULL == constructor)
118 jobject resourceObj = (jobject) env->NewObject(gSimulatorClassRefs.classSimulatorRemoteResource,
119 constructor, resource);
120 if (NULL == resourceObj)
128 class JNIFoundResourceListener
131 void setJavaFoundResourceListener(JNIEnv *env, jobject listener)
133 m_listener = env->NewWeakGlobalRef(listener);
136 void onFoundResource(std::shared_ptr<SimulatorRemoteResource> resource)
138 JNIEnv *env = getEnv();
142 jobject foundResourceListener = env->NewLocalRef(m_listener);
143 if (!foundResourceListener)
149 jclass foundResourceCls = env->GetObjectClass(foundResourceListener);
150 if (!foundResourceCls)
156 jmethodID foundResourceMId = env->GetMethodID(foundResourceCls, "onResourceCallback",
157 "(Lorg/oic/simulator/clientcontroller/SimulatorRemoteResource;)V");
158 if (!foundResourceMId)
164 JniSimulatorRemoteResource *jniSimulatorResource = new JniSimulatorRemoteResource(resource);
166 if (!jniSimulatorResource)
172 jobject simulatorResource = SimulatorRemoteResourceToJava(env,
173 reinterpret_cast<jlong>(jniSimulatorResource));
175 env->CallVoidMethod(foundResourceListener, foundResourceMId, simulatorResource);
176 if ((env)->ExceptionCheck())
190 void onResourceModelChange(jweak jlistenerRef, const std::string &uri,
191 const SimulatorResourceModel &resModel)
193 JNIEnv *env = getEnv();
197 jobject modelChangeListener = env->NewLocalRef(jlistenerRef);
198 if (!modelChangeListener)
204 jclass modelChangeCls = env->GetObjectClass(modelChangeListener);
211 jmethodID foundModelChangeMId = env->GetMethodID(modelChangeCls, "onResourceModelChanged",
212 "(Ljava/lang/String;Lorg/oic/simulator/serviceprovider/SimulatorResourceModel;)V");
213 if (!foundModelChangeMId)
219 JniSimulatorResourceModel *jniModel = new JniSimulatorResourceModel(resModel);
226 jobject jModel = JniSimulatorResourceModel::toJava(env, reinterpret_cast<jlong>(jniModel));
228 jstring jUri = env->NewStringUTF(uri.c_str());
230 env->CallVoidMethod(modelChangeListener, foundModelChangeMId, jUri, jModel);
231 if ((env)->ExceptionCheck())
237 env->DeleteLocalRef(jUri);
243 JNIEXPORT jobject JNICALL
244 Java_org_oic_simulator_SimulatorManagerNativeInterface_createResource
245 (JNIEnv *env, jclass object, jstring configPath, jobject listener)
253 jweak jlistenerRef = env->NewWeakGlobalRef(listener);
254 SimulatorResourceServer::ResourceModelChangedCB callback = [jlistenerRef](const std::string & uri,
255 const SimulatorResourceModel & resModel)
257 onResourceModelChange(jlistenerRef, uri, resModel);
260 const char *configPathCStr = env->GetStringUTFChars(configPath, NULL);
261 SimulatorResourceServerPtr resource = SimulatorManager::getInstance()->createResource(
262 configPathCStr, callback);
263 if (nullptr == resource)
266 env->ReleaseStringUTFChars(configPath, configPathCStr);
270 JniSimulatorResource *jniSimResource = new JniSimulatorResource(resource);
271 jobject jSimulatorResource = JniSimulatorResource::toJava(env,
272 reinterpret_cast<jlong>(jniSimResource));
274 jniSimResource->setResourceInfo(env, jSimulatorResource);
277 env->ReleaseStringUTFChars(configPath, configPathCStr);
278 return jSimulatorResource;
281 JNIEXPORT jobjectArray JNICALL
282 Java_org_oic_simulator_SimulatorManagerNativeInterface_createResources
283 (JNIEnv *env, jclass object, jstring configPath, jint count, jobject listener)
291 jweak jlistenerRef = env->NewWeakGlobalRef(listener);
292 SimulatorResourceServer::ResourceModelChangedCB callback = [jlistenerRef](const std::string & uri,
293 const SimulatorResourceModel & resModel)
295 onResourceModelChange(jlistenerRef, uri, resModel);
299 const char *configPathCStr = env->GetStringUTFChars(configPath, NULL);
300 std::vector<SimulatorResourceServerPtr> resources =
301 SimulatorManager::getInstance()->createResource(configPathCStr, count, callback);
303 // Construct the object array and send it java layer
304 jobjectArray resourceArray = env->NewObjectArray(resources.size(),
305 gSimulatorClassRefs.classSimulatorResource, NULL);
308 for (size_t i = 0; i < resources.size(); i++)
310 JniSimulatorResource *jniSimResource = new JniSimulatorResource(resources[i]);
311 jobject jSimulatorResource = JniSimulatorResource::toJava(env,
312 reinterpret_cast<jlong>(jniSimResource));
313 jniSimResource->setResourceInfo(env, jSimulatorResource);
314 env->SetObjectArrayElement(resourceArray, i, jSimulatorResource);
319 env->ReleaseStringUTFChars(configPath, configPathCStr);
320 return resourceArray;
323 JNIEXPORT jobjectArray JNICALL
324 Java_org_oic_simulator_SimulatorManagerNativeInterface_getResources
325 (JNIEnv *env, jclass object)
327 //TODO: Need to implement this method
331 JNIEXPORT void JNICALL
332 Java_org_oic_simulator_SimulatorManagerNativeInterface_deleteResource
333 (JNIEnv *env, jclass object, jobject jResource)
338 SimulatorResourceServerPtr resource =
339 JniSimulatorResource::getJniSimulatorResourcePtr(env, jResource);
343 SimulatorManager::getInstance()->deleteResource(resource);
346 JNIEXPORT void JNICALL
347 Java_org_oic_simulator_SimulatorManagerNativeInterface_deleteResources
348 (JNIEnv *env, jclass object, jstring resourceType)
351 const char *typeCStr = NULL;
354 typeCStr = env->GetStringUTFChars(resourceType, NULL);
358 SimulatorManager::getInstance()->deleteResources(type);
360 env->ReleaseStringUTFChars(resourceType, typeCStr);
363 JNIEXPORT jint JNICALL
364 Java_org_oic_simulator_SimulatorManagerNativeInterface_findResource
365 (JNIEnv *env, jobject object, jstring resourceType, jobject listener)
367 const char *typeCStr = NULL;
371 typeCStr = env->GetStringUTFChars(resourceType, NULL);
374 JNIFoundResourceListener *resourceListener = new JNIFoundResourceListener();
375 resourceListener->setJavaFoundResourceListener(env, listener);
377 SimulatorResult result = SimulatorManager::getInstance()->findResource(typeCStr,
378 std::bind(&JNIFoundResourceListener::onFoundResource, resourceListener, std::placeholders::_1));
381 env->ReleaseStringUTFChars(resourceType, typeCStr);
385 JNIEXPORT jobject JNICALL
386 Java_org_oic_simulator_SimulatorManagerNativeInterface_getFoundResources
387 (JNIEnv *env, jobject object, jstring resourceType)
389 const char *typeCStr = NULL;
392 typeCStr = env->GetStringUTFChars(resourceType, NULL);
395 std::vector<SimulatorRemoteResourcePtr> resourceList;
396 resourceList = SimulatorManager::getInstance()->getFoundResources(typeCStr);
397 if (resourceList.empty())
400 env->ReleaseStringUTFChars(resourceType, typeCStr);
404 jobject vectorObj = env->NewObject(gSimulatorClassRefs.classVector,
405 gSimulatorClassRefs.classVectorCtor);
409 env->ReleaseStringUTFChars(resourceType, typeCStr);
413 // Convert to java SimulatorRemoteResource object
414 for (unsigned int i = 0; i < resourceList.size(); i++)
416 JniSimulatorRemoteResource *jniSimulatorResource = new JniSimulatorRemoteResource(resourceList[i]);
417 if (!jniSimulatorResource)
420 env->ReleaseStringUTFChars(resourceType, typeCStr);
424 jobject resource = SimulatorRemoteResourceToJava(env,
425 reinterpret_cast<jlong>(jniSimulatorResource));
426 env->CallVoidMethod(vectorObj, gSimulatorClassRefs.classVectorAddElement, resource);
430 env->ReleaseStringUTFChars(resourceType, typeCStr);
434 JNIEXPORT void JNICALL
435 Java_org_oic_simulator_SimulatorManagerNativeInterface_setLogger
436 (JNIEnv *env, jclass object, jobject logger)
438 static std::shared_ptr<ILogger> target(new JNILogger());
439 dynamic_cast<JNILogger *>(target.get())->setJavaLogger(env, logger);
440 SimulatorManager::getInstance()->setLogger(target);
443 static bool getClassRef(JNIEnv *env, const char *className, jclass &classRef)
445 jclass localClassRef = nullptr;
446 localClassRef = env->FindClass(className);
450 classRef = (jclass)env->NewGlobalRef(localClassRef);
451 env->DeleteLocalRef(localClassRef);
458 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
466 if (JNI_OK != vm->GetEnv((void **) &env, JNI_VERSION_1_6))
471 // Get the class references
472 if (false == getClassRef(env, "java/lang/Integer", gSimulatorClassRefs.classInteger))
477 if (false == getClassRef(env, "java/lang/Double", gSimulatorClassRefs.classDouble))
482 if (false == getClassRef(env, "java/lang/String", gSimulatorClassRefs.classString))
487 if (false == getClassRef(env, "java/util/HashMap", gSimulatorClassRefs.classHashMap))
492 if (false == getClassRef(env, "java/util/Vector", gSimulatorClassRefs.classVector))
497 if (false == getClassRef(env, "java/util/Map", gSimulatorClassRefs.classMap))
502 if (false == getClassRef(env, "java/util/Map$Entry", gSimulatorClassRefs.classMapEntry))
507 if (false == getClassRef(env, "java/util/Set", gSimulatorClassRefs.classSet))
512 if (false == getClassRef(env, "java/util/Iterator", gSimulatorClassRefs.classIterator))
517 if (false == getClassRef(env, "org/oic/simulator/serviceprovider/SimulatorResourceServer",
518 gSimulatorClassRefs.classSimulatorResource))
523 if (false == getClassRef(env, "org/oic/simulator/serviceprovider/SimulatorResourceModel",
524 gSimulatorClassRefs.classSimulatorResourceModel))
529 if (false == getClassRef(env, "org/oic/simulator/SimulatorResourceAttribute",
530 gSimulatorClassRefs.classSimulatorResourceAttribute))
535 if (false == getClassRef(env, "org/oic/simulator/clientcontroller/SimulatorRemoteResource",
536 gSimulatorClassRefs.classSimulatorRemoteResource))
541 // Get the reference to methods
542 gSimulatorClassRefs.classIntegerCtor = env->GetMethodID(gSimulatorClassRefs.classInteger, "<init>",
544 if (!gSimulatorClassRefs.classIntegerCtor)
547 gSimulatorClassRefs.classDoubleCtor = env->GetMethodID(gSimulatorClassRefs.classDouble, "<init>",
549 if (!gSimulatorClassRefs.classDoubleCtor)
552 gSimulatorClassRefs.classHashMapCtor = env->GetMethodID(gSimulatorClassRefs.classHashMap, "<init>",
554 if (!gSimulatorClassRefs.classHashMapCtor)
557 gSimulatorClassRefs.classHashMapPut = env->GetMethodID(gSimulatorClassRefs.classHashMap, "put",
558 "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
559 if (!gSimulatorClassRefs.classHashMapPut)
562 gSimulatorClassRefs.classVectorCtor = env->GetMethodID(gSimulatorClassRefs.classVector, "<init>",
564 if (!gSimulatorClassRefs.classVectorCtor)
567 gSimulatorClassRefs.classVectorAddElement = env->GetMethodID(gSimulatorClassRefs.classVector,
569 "(Ljava/lang/Object;)V");
570 if (!gSimulatorClassRefs.classVectorAddElement)
573 gSimulatorClassRefs.classMapEntrySet = env->GetMethodID(
574 gSimulatorClassRefs.classMap, "entrySet", "()Ljava/util/Set;");
575 if (!gSimulatorClassRefs.classMapEntrySet)
578 gSimulatorClassRefs.classMapGetKey = env->GetMethodID(
579 gSimulatorClassRefs.classMapEntry, "getKey", "()Ljava/lang/Object;");
580 if (!gSimulatorClassRefs.classMapGetKey)
583 gSimulatorClassRefs.classMapGetValue = env->GetMethodID(
584 gSimulatorClassRefs.classMapEntry, "getValue", "()Ljava/lang/Object;");
585 if (!gSimulatorClassRefs.classMapGetValue)
588 gSimulatorClassRefs.classIteratorId = env->GetMethodID(
589 gSimulatorClassRefs.classSet, "iterator", "()Ljava/util/Iterator;");
590 if (!gSimulatorClassRefs.classIteratorId)
593 gSimulatorClassRefs.classHasNextId = env->GetMethodID(
594 gSimulatorClassRefs.classIterator, "hasNext", "()Z");
595 if (!gSimulatorClassRefs.classHasNextId)
598 gSimulatorClassRefs.classNextId = env->GetMethodID(
599 gSimulatorClassRefs.classIterator, "next", "()Ljava/lang/Object;");
600 if (!gSimulatorClassRefs.classNextId)
603 gSimulatorClassRefs.classSimulatorResourceCtor = env->GetMethodID(
604 gSimulatorClassRefs.classSimulatorResource, "<init>", "(J)V");
605 if (!gSimulatorClassRefs.classSimulatorResourceCtor)
608 gSimulatorClassRefs.classSimulatorResourceSetURI = env->GetMethodID(
609 gSimulatorClassRefs.classSimulatorResource, "setURI", "(Ljava/lang/String;)V");
610 if (!gSimulatorClassRefs.classSimulatorResourceSetURI)
613 gSimulatorClassRefs.classSimulatorResourceSetResourceType = env->GetMethodID(
614 gSimulatorClassRefs.classSimulatorResource, "setResourceType", "(Ljava/lang/String;)V");
615 if (!gSimulatorClassRefs.classSimulatorResourceSetResourceType)
618 gSimulatorClassRefs.classSimulatorResourceSetInterfaceType = env->GetMethodID(
619 gSimulatorClassRefs.classSimulatorResource, "setInterfaceType", "(Ljava/lang/String;)V");
620 if (!gSimulatorClassRefs.classSimulatorResourceSetInterfaceType)
623 gSimulatorClassRefs.classSimulatorResourceSetName = env->GetMethodID(
624 gSimulatorClassRefs.classSimulatorResource, "setName", "(Ljava/lang/String;)V");
625 if (!gSimulatorClassRefs.classSimulatorResourceSetName)
628 gSimulatorClassRefs.classSimulatorResourceModelCtor = env->GetMethodID(
629 gSimulatorClassRefs.classSimulatorResourceModel, "<init>", "(J)V");
630 if (!gSimulatorClassRefs.classSimulatorResourceModelCtor)
633 gSimulatorClassRefs.classSimulatorResourceAttributeCtor = env->GetMethodID(
634 gSimulatorClassRefs.classSimulatorResourceAttribute, "<init>", "(J)V");
635 if (!gSimulatorClassRefs.classSimulatorResourceAttributeCtor)
638 gSimulatorClassRefs.classSimulatorResourceModelId = env->GetMethodID(
639 gSimulatorClassRefs.classSimulatorResourceModel, "<init>", "(J)V");
640 if (!gSimulatorClassRefs.classSimulatorResourceModelId)
644 return JNI_VERSION_1_6;
647 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved)