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_utils_jni.h"
23 #include "jni_string.h"
29 JniTypeInfo(JNIEnv *env) : m_env(env) {}
31 SimulatorResourceModel::TypeInfo toCpp(jobject jAttributeValue)
33 static jmethodID typeInfoMID = m_env->GetMethodID(gSimulatorClassRefs.attributeValueCls,
34 "typeInfo", "()Lorg/oic/simulator/AttributeValue$TypeInfo;");
35 static jfieldID typeFID = m_env->GetFieldID(gSimulatorClassRefs.attributeTypeInfoCls,
36 "mType", "Lorg/oic/simulator/AttributeValue$ValueType;");
37 static jfieldID baseTypeFID = m_env->GetFieldID(gSimulatorClassRefs.attributeTypeInfoCls,
38 "mBaseType", "Lorg/oic/simulator/AttributeValue$ValueType;");
39 static jfieldID depthFID = m_env->GetFieldID(gSimulatorClassRefs.attributeTypeInfoCls,
42 jobject jTypeInfo = m_env->CallObjectMethod(jAttributeValue, typeInfoMID);
43 jobject jType = m_env->GetObjectField(jTypeInfo, typeFID);
44 jobject jBaseType = m_env->GetObjectField(jTypeInfo, baseTypeFID);
45 jint jDepth = m_env->GetIntField(jTypeInfo, depthFID);
47 return SimulatorResourceModel::TypeInfo(getValueType(jType),
48 getValueType(jBaseType), jDepth);
52 AttributeValueType getValueType(jobject jValueType)
54 static jmethodID ordinalMID = m_env->GetMethodID(
55 gSimulatorClassRefs.attributeValueTypeCls, "ordinal", "()I");
57 int ordinal = m_env->CallIntMethod(jValueType, ordinalMID);
58 return AttributeValueType(ordinal);
64 class ValueConverterJava : public boost::static_visitor<jobject>
67 ValueConverterJava(JNIEnv *env) : m_env(env) {}
69 jobject operator ()(const int &value)
71 static jmethodID integerCtor =
72 m_env->GetMethodID(gSimulatorClassRefs.integerCls, "<init>", "(I)V");
73 return m_env->NewObject(gSimulatorClassRefs.integerCls,
77 jobject operator ()(const double &value)
79 static jmethodID doubleCtor =
80 m_env->GetMethodID(gSimulatorClassRefs.doubleCls, "<init>", "(D)V");
81 return m_env->NewObject(gSimulatorClassRefs.doubleCls,
85 jobject operator ()(const bool &value)
87 static jmethodID booleanCtor =
88 m_env->GetMethodID(gSimulatorClassRefs.booleanCls, "<init>", "(Z)V");
89 return m_env->NewObject(gSimulatorClassRefs.booleanCls,
93 jobject operator ()(const std::string &value)
95 jstring stringValue = m_env->NewStringUTF(value.c_str());
96 return static_cast<jobject>(stringValue);
99 jobject operator ()(const SimulatorResourceModel &value)
101 return SimulatorResourceModelToJava(m_env, const_cast<SimulatorResourceModel &>(value));
104 template <typename T>
105 jobject operator ()(const std::vector<T> &values)
107 jobjectArray jArray = m_env->NewObjectArray(values.size(), getClass(values), nullptr);
111 for (size_t index = 0; index < values.size(); index++)
113 jobject element = operator()(values[index]);
114 m_env->SetObjectArrayElement(jArray, index, element);
120 template <typename T>
121 jobject operator ()(const std::vector<std::vector<T>> &values)
123 jobjectArray jArray = m_env->NewObjectArray(values.size(), getClass(values), nullptr);
127 for (size_t index = 0; index < values.size(); index++)
129 jobject element = operator()(values[index]);
130 m_env->SetObjectArrayElement(jArray, index, element);
136 template <typename T>
137 jobject operator ()(const std::vector<std::vector<std::vector<T>>> &values)
139 jobjectArray jArray = m_env->NewObjectArray(values.size(), getClass(values), nullptr);
143 for (size_t index = 0; index < values.size(); index++)
145 jobject element = operator()(values[index]);
146 m_env->SetObjectArrayElement(jArray, index, element);
153 jclass getClass(const std::vector<int> &)
155 return gSimulatorClassRefs.integerCls;
158 jclass getClass(const std::vector<std::vector<int>> &)
160 return gSimulatorClassRefs.integer1DArrayCls;
163 jclass getClass(const std::vector<std::vector<std::vector<int>>> &)
165 return gSimulatorClassRefs.integer2DArrayCls;
168 jclass getClass(const std::vector<double> &)
170 return gSimulatorClassRefs.doubleCls;
173 jclass getClass(const std::vector<std::vector<double>> &)
175 return gSimulatorClassRefs.double1DArrayCls;
178 jclass getClass(const std::vector<std::vector<std::vector<double>>> &)
180 return gSimulatorClassRefs.double2DArrayCls;
183 jclass getClass(const std::vector<bool> &)
185 return gSimulatorClassRefs.booleanCls;
188 jclass getClass(const std::vector<std::vector<bool>> &)
190 return gSimulatorClassRefs.boolean1DArrayCls;
193 jclass getClass(const std::vector<std::vector<std::vector<bool>>> &)
195 return gSimulatorClassRefs.boolean2DArrayCls;
198 jclass getClass(const std::vector<std::string> &)
200 return gSimulatorClassRefs.stringCls;
203 jclass getClass(const std::vector<std::vector<std::string>> &)
205 return gSimulatorClassRefs.string1DArrayCls;
208 jclass getClass(const std::vector<std::vector<std::vector<std::string>>> &)
210 return gSimulatorClassRefs.string2DArrayCls;
213 jclass getClass(const std::vector<SimulatorResourceModel> &)
215 return gSimulatorClassRefs.simulatorResourceModelCls;
218 jclass getClass(const std::vector<std::vector<SimulatorResourceModel>> &)
220 return gSimulatorClassRefs.simulatorResModel1DArrayCls;
223 jclass getClass(const std::vector<std::vector<std::vector<SimulatorResourceModel>>> &)
225 return gSimulatorClassRefs.simulatorResModel2DArrayCls;
231 class ValueConverterCpp
234 ValueConverterCpp(JNIEnv *env, SimulatorResourceModel::TypeInfo &typeInfo,
235 jobject &value) : m_env(env), m_typeInfo(typeInfo), m_value(value) {}
239 switch (m_typeInfo.baseType())
241 case AttributeValueType::INTEGER:
242 return handleByDepth<int>();
243 case AttributeValueType::DOUBLE:
244 return handleByDepth<double>();
245 case AttributeValueType::BOOLEAN:
246 return handleByDepth<bool>();
247 case AttributeValueType::STRING:
248 return handleByDepth<std::string>();
249 case AttributeValueType::RESOURCE_MODEL:
250 return handleByDepth<SimulatorResourceModel>();
251 case AttributeValueType::VECTOR:
252 case AttributeValueType::UNKNOWN:
257 AttributeValueVariant get()
259 return std::move(m_result);
263 template <typename T>
266 if (0 == m_typeInfo.depth())
269 getValue(m_value, value);
272 else if (1 == m_typeInfo.depth())
274 std::vector<T> value;
275 getValue(m_value, value);
278 else if (2 == m_typeInfo.depth())
280 std::vector<std::vector<T>> value;
281 getValue(m_value, value);
284 else if (3 == m_typeInfo.depth())
286 std::vector<std::vector<std::vector<T>>> value;
287 getValue(m_value, value);
292 void getValue(jobject &jValue, int &value)
294 static jmethodID intValueMID = m_env->GetMethodID(
295 gSimulatorClassRefs.integerCls, "intValue", "()I");
297 jint temp = m_env->CallIntMethod(jValue, intValueMID);
301 void getValue(jobject &jValue, std::vector<int> &value)
303 jobjectArray array = (jobjectArray) jValue;
304 size_t length = m_env->GetArrayLength(array);
305 for (size_t i = 0; i < length; i++)
307 jobject jElement = m_env->GetObjectArrayElement(array, i);
310 getValue(jElement, element);
311 value.push_back(element);
315 void getValue(jobject &jValue, std::vector<std::vector<int>> &value)
317 jobjectArray array = (jobjectArray) jValue;
318 size_t length = m_env->GetArrayLength(array);
319 for (size_t i = 0; i < length; i++)
321 jobject jElement = m_env->GetObjectArrayElement(array, i);
323 std::vector<int> element;
324 getValue(jElement, element);
325 value.push_back(element);
329 void getValue(jobject &jValue, std::vector<std::vector<std::vector<int>>> &value)
331 jobjectArray array = (jobjectArray) jValue;
332 size_t length = m_env->GetArrayLength(array);
333 for (size_t i = 0; i < length; i++)
335 jobject jElement = m_env->GetObjectArrayElement(array, i);
337 std::vector<std::vector<int>> element;
338 getValue(jElement, element);
339 value.push_back(element);
343 void getValue(jobject &jValue, double &value)
345 static jmethodID doubleValueMID = m_env->GetMethodID(
346 gSimulatorClassRefs.doubleCls, "doubleValue", "()D");
348 value = m_env->CallDoubleMethod(jValue, doubleValueMID);
351 void getValue(jobject &jValue, std::vector<double> &value)
353 jobjectArray array = (jobjectArray) jValue;
354 size_t length = m_env->GetArrayLength(array);
355 for (size_t i = 0; i < length; i++)
357 jobject jElement = m_env->GetObjectArrayElement(array, i);
360 getValue(jElement, element);
361 value.push_back(element);
365 void getValue(jobject &jValue, std::vector<std::vector<double>> &value)
367 jobjectArray array = (jobjectArray) jValue;
368 size_t length = m_env->GetArrayLength(array);
369 for (size_t i = 0; i < length; i++)
371 jobject jElement = m_env->GetObjectArrayElement(array, i);
373 std::vector<double> element;
374 getValue(jElement, element);
375 value.push_back(element);
379 void getValue(jobject &jValue, std::vector<std::vector<std::vector<double>>> &value)
381 jobjectArray array = (jobjectArray) jValue;
382 size_t length = m_env->GetArrayLength(array);
383 for (size_t i = 0; i < length; i++)
385 jobject jElement = m_env->GetObjectArrayElement(array, i);
387 std::vector<std::vector<double>> element;
388 getValue(jElement, element);
389 value.push_back(element);
393 void getValue(jobject &jValue, bool &value)
395 static jmethodID boolValueMID = m_env->GetMethodID(
396 gSimulatorClassRefs.booleanCls, "booleanValue", "()Z");
398 value = m_env->CallBooleanMethod(jValue, boolValueMID);
401 void getValue(jobject &jValue, std::vector<bool> &value)
403 jobjectArray array = (jobjectArray) jValue;
404 size_t length = m_env->GetArrayLength(array);
405 for (size_t i = 0; i < length; i++)
407 jobject jElement = m_env->GetObjectArrayElement(array, i);
410 getValue(jElement, element);
411 value.push_back(element);
415 void getValue(jobject &jValue, std::vector<std::vector<bool>> &value)
417 jobjectArray array = (jobjectArray) jValue;
418 size_t length = m_env->GetArrayLength(array);
419 for (size_t i = 0; i < length; i++)
421 jobject jElement = m_env->GetObjectArrayElement(array, i);
423 std::vector<bool> element;
424 getValue(jElement, element);
425 value.push_back(element);
429 void getValue(jobject &jValue, std::vector<std::vector<std::vector<bool>>> &value)
431 jobjectArray array = (jobjectArray) jValue;
432 size_t length = m_env->GetArrayLength(array);
433 for (size_t i = 0; i < length; i++)
435 jobject jElement = m_env->GetObjectArrayElement(array, i);
437 std::vector<std::vector<bool>> element;
438 getValue(jElement, element);
439 value.push_back(element);
443 void getValue(jobject &jValue, std::string &value)
445 jstring stringValue = (jstring) jValue;
446 JniString jniValue(m_env, stringValue);
447 value = jniValue.get();
450 void getValue(jobject jValue, std::vector<std::string> &value)
452 jobjectArray array = (jobjectArray) jValue;
453 size_t length = m_env->GetArrayLength(array);
454 for (size_t i = 0; i < length; i++)
456 jobject jElement = m_env->GetObjectArrayElement(array, i);
459 getValue(jElement, element);
460 value.push_back(element);
464 void getValue(jobject &jValue, std::vector<std::vector<std::string>> &value)
466 jobjectArray array = (jobjectArray) jValue;
467 size_t length = m_env->GetArrayLength(array);
468 for (size_t i = 0; i < length; i++)
470 jobject jElement = m_env->GetObjectArrayElement(array, i);
472 std::vector<std::string> element;
473 getValue(jElement, element);
474 value.push_back(element);
478 void getValue(jobject &jValue, std::vector<std::vector<std::vector<std::string>>> &value)
480 jobjectArray array = (jobjectArray) jValue;
481 size_t length = m_env->GetArrayLength(array);
482 for (size_t i = 0; i < length; i++)
484 jobject jElement = m_env->GetObjectArrayElement(array, i);
486 std::vector<std::vector<std::string>> element;
487 getValue(jElement, element);
488 value.push_back(element);
492 void getValue(jobject &jValue, SimulatorResourceModel &value)
494 SimulatorResourceModelToCpp(m_env, jValue, value);
497 void getValue(jobject &jValue, std::vector<SimulatorResourceModel> &value)
499 jobjectArray array = (jobjectArray) jValue;
500 size_t length = m_env->GetArrayLength(array);
501 std::vector<SimulatorResourceModel> result(length);
502 for (size_t i = 0; i < length; i++)
504 jobject jElement = m_env->GetObjectArrayElement(array, i);
506 SimulatorResourceModel element;
507 getValue(jElement, element);
514 void getValue(jobject &jValue, std::vector<std::vector<SimulatorResourceModel>> &value)
516 jobjectArray array = (jobjectArray) jValue;
517 size_t length = m_env->GetArrayLength(array);
518 std::vector<std::vector<SimulatorResourceModel>> result(length);
519 for (size_t i = 0; i < length; i++)
521 jobject jElement = m_env->GetObjectArrayElement(array, i);
523 std::vector<SimulatorResourceModel> childArray;
524 getValue(jElement, childArray);
525 value[i] = childArray;
531 void getValue(jobject &jValue, std::vector<std::vector<std::vector<SimulatorResourceModel>>> &value)
533 jobjectArray array = (jobjectArray) jValue;
534 size_t length = m_env->GetArrayLength(array);
535 std::vector<std::vector<std::vector<SimulatorResourceModel>>> result(length);
536 for (size_t i = 0; i < length; i++)
538 jobject jElement = m_env->GetObjectArrayElement(array, i);
540 std::vector<std::vector<SimulatorResourceModel>> childArray;
541 getValue(jElement, childArray);
542 value[i] = childArray;
549 SimulatorResourceModel::TypeInfo &m_typeInfo;
551 AttributeValueVariant m_result;
554 class JniAttributeValue
557 static jobject toJava(JNIEnv *env, const SimulatorResourceAttribute &attribute)
559 return toJava(env, attribute.getValue());
562 static jobject toJava(JNIEnv *env, const AttributeValueVariant &value)
564 ValueConverterJava converter(env);
565 jobject jValue = boost::apply_visitor(converter, value);
567 static jmethodID attrValueCtor = env->GetMethodID(
568 gSimulatorClassRefs.attributeValueCls, "<init>", "(Ljava/lang/Object;)V");
570 return env->NewObject(gSimulatorClassRefs.attributeValueCls, attrValueCtor, jValue);
573 static AttributeValueVariant toCpp(JNIEnv *env, jobject &jAttributeValue)
575 static jmethodID getMID = env->GetMethodID(gSimulatorClassRefs.attributeValueCls,
576 "get", "()Ljava/lang/Object;");
578 SimulatorResourceModel::TypeInfo typeInfo = JniTypeInfo(env).toCpp(jAttributeValue);
579 jobject jValue = env->CallObjectMethod(jAttributeValue, getMID);
581 ValueConverterCpp converter(env, typeInfo, jValue);
583 return converter.get();
587 jobject SimulatorResourceModelToJava(JNIEnv *env, const SimulatorResourceModel &resModel)
589 JniMap jAttributesMap(env);
591 // Add attribute values for HashMap
592 for (auto &attributeEntry : resModel.getAttributeValues())
594 jstring jAttrName = env->NewStringUTF((attributeEntry.first).c_str());
595 jobject jAttributeValue = JniAttributeValue::toJava(env, attributeEntry.second);
597 jAttributesMap.put(jAttrName, jAttributeValue);
600 // Create Java SimulatorResourceModel object
601 static jmethodID simulatorResourceModelCtor = env->GetMethodID(
602 gSimulatorClassRefs.simulatorResourceModelCls, "<init>", "(Ljava/util/Map;)V");
604 return env->NewObject(gSimulatorClassRefs.simulatorResourceModelCls,
605 simulatorResourceModelCtor, jAttributesMap.get());
608 bool SimulatorResourceModelToCpp(JNIEnv *env, jobject jResModel, SimulatorResourceModel &resModel)
613 static jfieldID valuesFID = env->GetFieldID(gSimulatorClassRefs.simulatorResourceModelCls,
614 "mValues", "Ljava/util/Map;");
615 static jmethodID entrySetMID = env->GetMethodID(gSimulatorClassRefs.mapCls, "entrySet",
616 "()Ljava/util/Set;");
617 static jmethodID iteratorMID = env->GetMethodID(gSimulatorClassRefs.setCls, "iterator",
618 "()Ljava/util/Iterator;");
619 static jmethodID hasNextMID = env->GetMethodID(gSimulatorClassRefs.iteratorCls, "hasNext",
621 static jmethodID nextMID = env->GetMethodID(gSimulatorClassRefs.iteratorCls, "next",
622 "()Ljava/lang/Object;");
623 static jmethodID getKeyMID = env->GetMethodID(gSimulatorClassRefs.mapEntryCls, "getKey",
624 "()Ljava/lang/Object;");
625 static jmethodID getValueMID = env->GetMethodID(gSimulatorClassRefs.mapEntryCls, "getValue",
626 "()Ljava/lang/Object;");
628 jobject jValues = env->GetObjectField(jResModel, valuesFID);
631 jobject entrySet = env->CallObjectMethod(jValues, entrySetMID);
632 jobject iterator = env->CallObjectMethod(entrySet, iteratorMID);
633 if (entrySet && iterator)
635 while (env->CallBooleanMethod(iterator, hasNextMID))
637 jobject entry = env->CallObjectMethod(iterator, nextMID);
638 jstring key = (jstring) env->CallObjectMethod(entry, getKeyMID);
639 jobject value = env->CallObjectMethod(entry, getValueMID);
640 resModel.add(JniString(env, key).get(), JniAttributeValue::toCpp(env, value));
642 env->DeleteLocalRef(entry);
643 env->DeleteLocalRef(key);
644 env->DeleteLocalRef(value);
652 jobject AttributeValueToJava(JNIEnv *env,
653 const AttributeValueVariant &value)
655 return JniAttributeValue::toJava(env, value);
658 bool AttributeValueToCpp(JNIEnv *env, jobject jAttributeValue,
659 AttributeValueVariant &jValue)
661 if (!jAttributeValue)
664 jValue = JniAttributeValue::toCpp(env, jAttributeValue);