Imported Upstream version 0.9.1
[platform/upstream/iotivity.git] / service / soft-sensor-manager / SSMCore / src / SSMInterface / SSMCore_JNI.cpp
1 /******************************************************************
2 *
3 * Copyright 2014 Samsung Electronics All Rights Reserved.
4 *
5 *
6 *
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
10 *
11 *      http://www.apache.org/licenses/LICENSE-2.0
12 *
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.
18 *
19 ******************************************************************/
20 #include "SSMInterface/SSMCore_JNI.h"
21
22 #include "SSMCore.h"
23 #include "Common/PlatformLayer.h"
24
25 #define JNI_E_INVALIDARG -1001
26 #define JNI_E_METHODID   -1002
27
28 JavaVM *g_JVM = NULL;
29
30 #if defined(WIN32)
31 #define ATTACH_CURRENT_THREAD(javaVM, env) if(env == NULL) javaVM->AttachCurrentThread((void**)&env, NULL)
32 #else
33 #define ATTACH_CURRENT_THREAD(javaVM, env) if(env == NULL) javaVM->AttachCurrentThread(&env, NULL)
34 #endif
35 #define DETACH_CURRENT_THREAD(javaVM) javaVM->DetachCurrentThread()
36
37 jclass                      g_ClassQueryEngine = NULL;
38 jclass                      g_ClassDataReader = NULL;
39 jclass                      g_ClassModelData = NULL;
40 jclass                      g_ClassQueryEngineEvent = NULL;
41 jclass                      g_ClassReportReceiver = NULL;
42 jobject                     g_objReportReceiver = NULL;
43
44 void ReportMessage(const char *tag, const char *msg)
45 {
46     JNIEnv *env;
47
48     if (g_objReportReceiver == NULL)
49         return;
50
51     g_JVM->GetEnv((void **) &env, JNI_VERSION_1_6);
52
53     ATTACH_CURRENT_THREAD(g_JVM, env);
54
55     jmethodID midReportReceiver =
56         env->GetMethodID(g_ClassReportReceiver, "onMessageReceived",
57                          "(Ljava/lang/String;Ljava/lang/String;)V");
58
59     env->CallVoidMethod(g_objReportReceiver, midReportReceiver,
60                         env->NewStringUTF(tag), env->NewStringUTF(msg));
61
62     DETACH_CURRENT_THREAD(g_JVM);
63
64     return;
65 }
66
67 class QueryEngineEventReceiver
68     : public IQueryEngineEvent
69 {
70     private:
71         jobject         m_objQueryEngineEvent;
72
73     public:
74         QueryEngineEventReceiver()
75         {
76             m_objQueryEngineEvent = NULL;
77         }
78
79         ~QueryEngineEventReceiver()
80         {
81             if (m_objQueryEngineEvent != NULL)
82             {
83                 JNIEnv *env;
84                 g_JVM->GetEnv((void **) &env, JNI_VERSION_1_6);
85                 env->DeleteGlobalRef(m_objQueryEngineEvent);
86             }
87         }
88
89         void setQueryEngineEventObj(jobject objQueryEngineEvent)
90         {
91             if (m_objQueryEngineEvent != NULL)
92             {
93                 JNIEnv *env;
94                 g_JVM->GetEnv((void **) &env, JNI_VERSION_1_6);
95                 env->DeleteGlobalRef(m_objQueryEngineEvent);
96             }
97
98             m_objQueryEngineEvent = objQueryEngineEvent;
99         }
100
101         SSMRESULT onQueryEngineEvent(int cqid, IDataReader *pResult)
102         {
103             JNIEnv *env;
104             g_JVM->GetEnv((void **) &env, JNI_VERSION_1_6);
105
106             ATTACH_CURRENT_THREAD(g_JVM, env);
107
108             jmethodID midQueryEngineEvent =
109                 env->GetMethodID(g_ClassQueryEngineEvent, "onQueryEngineEvent",
110                                  "(ILorg/iotivity/service/ssm/DataReader;)V");
111
112             jmethodID cid_DataReader = env->GetMethodID(g_ClassDataReader, "<init>", "(I)V");
113
114             if (cid_DataReader == NULL)
115                 return SSM_E_FAIL;
116
117             env->CallVoidMethod(m_objQueryEngineEvent, midQueryEngineEvent,
118                                 (jint)cqid,
119                                 env->NewObject(g_ClassDataReader, cid_DataReader, (jint)pResult));
120
121             DETACH_CURRENT_THREAD(g_JVM);
122
123             return SSM_S_OK;
124         }
125 };
126
127 QueryEngineEventReceiver    *g_QueryEngineEventReceiver = NULL;
128
129 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
130 {
131     JNIEnv *env;
132     if (jvm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK)
133         return JNI_ERR;
134
135     g_ClassQueryEngine = (jclass) env->NewGlobalRef(
136                              env->FindClass("org/iotivity/service/ssm/QueryEngine"));
137
138     g_ClassDataReader = (jclass) env->NewGlobalRef(
139                             env->FindClass("org/iotivity/service/ssm/DataReader"));
140
141     g_ClassModelData = (jclass) env->NewGlobalRef(env->FindClass("org/iotivity/service/ssm/ModelData"));
142
143     g_ClassQueryEngineEvent = (jclass) env->NewGlobalRef(
144                                   env->FindClass("org/iotivity/service/ssm/IQueryEngineEvent"));
145
146
147     g_ClassReportReceiver = (jclass) env->NewGlobalRef(
148                                 env->FindClass("org/iotivity/service/ssm/IReportReceiver"));
149
150
151     g_JVM = jvm;
152
153     g_QueryEngineEventReceiver = new QueryEngineEventReceiver();
154
155     return JNI_VERSION_1_6;
156 }
157
158 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *jvm, void *reserved)
159 {
160     JNIEnv *env;
161     if (jvm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK)
162         return;
163
164     if (g_ClassQueryEngine != NULL)
165         env->DeleteGlobalRef(g_ClassQueryEngine);
166
167     if (g_ClassDataReader != NULL)
168         env->DeleteGlobalRef(g_ClassDataReader);
169
170     if (g_ClassModelData != NULL)
171         env->DeleteGlobalRef(g_ClassModelData);
172
173     if (g_ClassQueryEngineEvent != NULL)
174         env->DeleteGlobalRef(g_ClassQueryEngineEvent);
175
176
177     if (g_ClassReportReceiver != NULL)
178         env->DeleteGlobalRef(g_ClassReportReceiver);
179
180     if (g_objReportReceiver != NULL)
181         env->DeleteGlobalRef(g_objReportReceiver);
182
183
184     g_JVM = NULL;
185
186     if (g_QueryEngineEventReceiver != NULL)
187         delete g_QueryEngineEventReceiver;
188 }
189
190 JNIEXPORT void JNICALL Java_org_iotivity_service_ssm_CoreController_initializeSSMCore
191 (JNIEnv *env, jclass clz, jstring jstrXmlDescription)
192 {
193     if (jstrXmlDescription == NULL)
194     {
195         env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"),
196                       "InitializeSSMCore failed with Invalid parameter");
197         return;
198     }
199
200     SSMRESULT res = SSM_E_FAIL;
201     const char *xmlDescription = env->GetStringUTFChars(jstrXmlDescription, NULL);
202
203     res = InitializeSSMCore(xmlDescription);
204
205     env->ReleaseStringUTFChars(jstrXmlDescription, xmlDescription);
206
207     if (res != SSM_S_OK)
208         env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "InitializeSSMCore failed");
209 }
210
211 JNIEXPORT void JNICALL Java_org_iotivity_service_ssm_CoreController_startSSMCore
212 (JNIEnv *env, jclass clz)
213 {
214     if (StartSSMCore() != SSM_S_OK)
215         env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "StartSSMCore failed");
216 }
217
218 JNIEXPORT void JNICALL Java_org_iotivity_service_ssm_CoreController_stopSSMCore
219 (JNIEnv *env, jclass clz)
220 {
221     if (StopSSMCore() != SSM_S_OK)
222         env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "StopSSMCore failed");
223 }
224
225 JNIEXPORT void JNICALL Java_org_iotivity_service_ssm_CoreController_terminateSSMCore
226 (JNIEnv *env, jclass clz)
227 {
228     if (TerminateSSMCore() != SSM_S_OK)
229         env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "TerminateSSMCore failed");
230 }
231
232 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ssm_CoreController_createQueryEngine
233 (JNIEnv *env, jclass clz)
234 {
235     IQueryEngine        *pQueryEngine = NULL;
236
237     if (CreateQueryEngine(&pQueryEngine) != SSM_S_OK)
238     {
239         env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "CreateQueryEngine failed");
240         return NULL;
241     }
242
243     jmethodID cid_QueryEngine = env->GetMethodID(g_ClassQueryEngine, "<init>", "(I)V");
244
245     if (cid_QueryEngine == NULL)
246         return NULL;
247
248     return env->NewObject(g_ClassQueryEngine, cid_QueryEngine, (jint)pQueryEngine);
249 }
250
251 JNIEXPORT jint JNICALL Java_org_iotivity_service_ssm_CoreController_releaseQueryEngine
252 (JNIEnv *env, jclass clz, jobject queryEngine)
253 {
254     IQueryEngine        *pQueryEngine = NULL;
255
256     jmethodID mid_GetQueryEngineInstance = env->GetMethodID(g_ClassQueryEngine,
257                                            "getQueryEngineInstance", "()I");
258
259     if (mid_GetQueryEngineInstance == NULL)
260         return JNI_E_METHODID;
261
262     pQueryEngine = (IQueryEngine *)env->CallIntMethod(queryEngine, mid_GetQueryEngineInstance);
263
264     return ReleaseQueryEngine(pQueryEngine);
265 }
266
267 JNIEXPORT jint JNICALL Java_org_iotivity_service_ssm_CoreController_executeContextQuery
268 (JNIEnv *env, jclass clz, jint pQueryEngineInstance, jstring jstrContextQuery)
269 {
270     int                 cqid = -1;
271     if (jstrContextQuery == NULL)
272     {
273         env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"),
274                       "ExecuteContextQuery with Invalid context query");
275         return cqid;
276     }
277
278     IQueryEngine        *pQueryEngine = (IQueryEngine *)pQueryEngineInstance;
279
280     const char *contextQuery = env->GetStringUTFChars(jstrContextQuery, NULL);
281
282     if (pQueryEngine->executeContextQuery(contextQuery, &cqid) != SSM_S_OK)
283     {
284         env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "ExecuteContextQuery failed");
285     }
286
287     env->ReleaseStringUTFChars(jstrContextQuery, contextQuery);
288     return cqid;
289 }
290
291 JNIEXPORT void JNICALL Java_org_iotivity_service_ssm_CoreController_registerQueryEvent
292 (JNIEnv *env, jclass clz, jint pQueryEngineInstance, jobject queryEngineEvent)
293 {
294     IQueryEngine        *pQueryEngine = (IQueryEngine *)pQueryEngineInstance;
295
296     if (queryEngineEvent == NULL)
297     {
298         pQueryEngine->unregisterQueryEvent(g_QueryEngineEventReceiver);
299         return;
300     }
301
302     g_QueryEngineEventReceiver->setQueryEngineEventObj(env->NewGlobalRef(queryEngineEvent));
303     pQueryEngine->registerQueryEvent(g_QueryEngineEventReceiver);
304 }
305
306 JNIEXPORT void JNICALL Java_org_iotivity_service_ssm_CoreController_killContextQuery
307 (JNIEnv *env, jclass clz, jint pQueryEngineInstance, jint cqid)
308 {
309     IQueryEngine        *pQueryEngine = (IQueryEngine *)pQueryEngineInstance;
310
311     if (pQueryEngine->killContextQuery(cqid) != SSM_S_OK)
312     {
313         env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "KillContextQuery failed");
314     }
315 }
316
317 JNIEXPORT jint JNICALL Java_org_iotivity_service_ssm_CoreController_getDataId
318 (JNIEnv *env, jclass clz, jint pDataReaderInstance)
319 {
320     IModelData *pDataReader = (IModelData *)pDataReaderInstance;
321
322     return pDataReader->getDataId();
323 }
324
325 JNIEXPORT jint JNICALL Java_org_iotivity_service_ssm_CoreController_getPropertyCount
326 (JNIEnv *env, jclass clz, jint pIModelDataInstance )
327 {
328     IModelData *pModelData = (IModelData *)pIModelDataInstance;
329
330     return pModelData->getPropertyCount();
331 }
332
333 JNIEXPORT jstring JNICALL Java_org_iotivity_service_ssm_CoreController_getPropertyName
334 (JNIEnv *env, jclass clz, jint pIModelDataInstance, jint propertyIndex )
335 {
336     IModelData *pModelData = (IModelData *)pIModelDataInstance;
337
338     return env->NewStringUTF(pModelData->getPropertyName(propertyIndex).c_str());
339 }
340
341 JNIEXPORT jstring JNICALL Java_org_iotivity_service_ssm_CoreController_getPropertyValue
342 (JNIEnv *env, jclass clz, jint pIModelDataInstance, jint propertyIndex )
343 {
344     IModelData *pModelData = (IModelData *)pIModelDataInstance;
345
346     return env->NewStringUTF(pModelData->getPropertyValue(propertyIndex).c_str());
347 }
348
349 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ssm_CoreController_getAffectedModels
350 (JNIEnv *env, jclass clz, jint pDataReaderInstance)
351 {
352     IDataReader *pDataReader = (IDataReader *)pDataReaderInstance;
353     std::vector<std::string>    affectedModels;
354
355     jclass listClass = env->FindClass("java/util/ArrayList");
356
357     jmethodID add_mid = env->GetMethodID(listClass, "add", "(Ljava/lang/Object;)Z");
358
359     jmethodID list_cid = env->GetMethodID(listClass, "<init>", "()V");
360
361     jobject objAffectedModels = env->NewObject(listClass, list_cid);
362
363     pDataReader->getAffectedModels(&affectedModels);
364
365     for (std::vector<std::string>::iterator itor = affectedModels.begin();
366          itor != affectedModels.end(); ++itor)
367     {
368         env->CallBooleanMethod(objAffectedModels, add_mid, env->NewStringUTF((*itor).c_str()));
369     }
370
371     return objAffectedModels;
372 }
373
374 JNIEXPORT jint JNICALL Java_org_iotivity_service_ssm_CoreController_getModelDataCount
375 (JNIEnv *env, jclass clz, jint pDataReaderInstance, jstring jstrModelName)
376 {
377     IDataReader *pDataReader = (IDataReader *)pDataReaderInstance;
378     int modelCount = 0;
379     const char *modelName = env->GetStringUTFChars(jstrModelName, NULL);
380
381     if (pDataReader->getModelDataCount(modelName, &modelCount) != SSM_S_OK)
382     {
383         env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "GetModelDataCount failed");
384     }
385
386     env->ReleaseStringUTFChars(jstrModelName, modelName);
387
388     return modelCount;
389 }
390 //return IModelData
391 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ssm_CoreController_getModelData
392 (JNIEnv *env, jclass clz, jint pDataReaderInstance, jstring jstrModelName, jint jintDataIndex )
393 {
394     IDataReader *pDataReader = (IDataReader *)pDataReaderInstance;
395     IModelData *pModelData = NULL;
396     const char *modelName = env->GetStringUTFChars(jstrModelName, NULL);
397
398     if (pDataReader->getModelData(modelName, jintDataIndex, &pModelData) != SSM_S_OK)
399     {
400         env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "GetModelData failed");
401         return NULL;
402     }
403
404     jmethodID cid_ModelData = env->GetMethodID(g_ClassModelData, "<init>", "(I)V");
405
406     if (cid_ModelData == NULL)
407         return NULL;
408
409     return env->NewObject(g_ClassModelData, cid_ModelData, (jint)pModelData);
410 }
411
412 JNIEXPORT void JNICALL Java_org_iotivity_service_ssm_CoreController_registerReportReceiver
413 (JNIEnv *env, jclass clz, jobject reportReceiver)
414 {
415     if (g_objReportReceiver != NULL)
416         env->DeleteGlobalRef(g_objReportReceiver);
417
418     g_objReportReceiver = NULL;
419
420     if (reportReceiver != NULL)
421         g_objReportReceiver = env->NewGlobalRef(reportReceiver);
422 }