source: trunk/zoo-project/zoo-kernel/service_internal_java.c @ 767

Last change on this file since 767 was 767, checked in by djay, 8 years ago

Fix issue with headers located in extern C. Define java.library.path at runtime to search for libZOO.so from the Java zoo-api.

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc
File size: 24.1 KB
RevLine 
[580]1/*
[1]2 * Author : Gérald FENOY
3 *
[388]4 * Copyright (c) 2009-2013 GeoLabs SARL
[1]5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24
25#include "service_internal_java.h"
[640]26#include "response_print.h"
[1]27
[580]28/**
29 * Load a JAVA class then run the static public method corresponding to the
30 * service by passing the conf, inputs and outputs parameters by reference.
31 *
32 * @param main_conf the conf maps containing the main.cfg settings
33 * @param request the map containing the HTTP request
34 * @param s the service structure
35 * @param real_inputs the maps containing the inputs
36 * @param real_outputs the maps containing the outputs
37 */
[1]38int zoo_java_support(maps** main_conf,map* request,service* s,maps **real_inputs,maps **real_outputs){
39  maps* m=*main_conf;
40  maps* inputs=*real_inputs;
41  maps* outputs=*real_outputs;
[767]42  map* cwdMap=getMapFromMaps(*main_conf,"lenv","cwd");
43  char *ntmp=NULL;
44  if(cwdMap!=NULL)
45    ntmp=zStrdup(cwdMap->value);
[1]46  map* tmp=getMap(request,"metapath");
[355]47  char *classpath;
48  char *oclasspath;
[1]49  int res=SERVICE_FAILED;
[352]50  char *cclasspath=getenv("CLASSPATH");
[1]51  if(tmp!=NULL){
[355]52    if(cclasspath!=NULL){
53      classpath=(char*) malloc((strlen(ntmp)+strlen(tmp->value)+strlen(cclasspath)+4)*sizeof(char));
54      oclasspath=(char*) malloc((strlen(ntmp)+strlen(tmp->value)+strlen(cclasspath)+22)*sizeof(char));
[364]55#ifndef WIN32
[352]56      sprintf(classpath,"%s/%s/:%s",ntmp,tmp->value,cclasspath);
[364]57#else
58      sprintf(classpath,"%s/%s/;%s",ntmp,tmp->value,cclasspath);
59#endif
[355]60    }
61    else{
62      classpath=(char*) malloc((strlen(ntmp)+strlen(tmp->value)+3)*sizeof(char));
63      oclasspath=(char*) malloc((strlen(ntmp)+strlen(tmp->value)+21)*sizeof(char));
[352]64      sprintf(classpath,"%s/%s/",ntmp,tmp->value);
[355]65    }
[388]66  }else{
67    if(cclasspath!=NULL){
68      classpath=(char*) malloc((strlen(ntmp)+strlen(cclasspath)+3)*sizeof(char));
69      oclasspath=(char*) malloc((strlen(ntmp)+strlen(cclasspath)+21)*sizeof(char));
70#ifndef WIN32
71      sprintf(classpath,"%s/:%s",ntmp,cclasspath);
72#else
73      sprintf(classpath,"%s/;%s",ntmp,cclasspath);
74#endif
75    }
76    else{
77      classpath=(char*) malloc((strlen(ntmp)+2)*sizeof(char));
78      oclasspath=(char*) malloc((strlen(ntmp)+20)*sizeof(char));
79      sprintf(classpath,"%s/",ntmp);
80    }
81
[1]82  }
[388]83  sprintf(oclasspath,"-Djava.class.path=%s",classpath);
[1]84#ifdef DEBUG
85  fprintf(stderr,"CLASSPATH=%s\n",classpath);
[354]86  fprintf(stderr,"(%s)\n",oclasspath);
[1]87#endif
[767]88#ifndef USE_JDB
89  int njdb=0;
90#else
91  int njdb=2;
92#endif
[765]93#ifndef WIN32
[767]94  int nb=3+njdb;
[765]95#endif
[539]96  int nbc0=0;
[640]97  maps* javaXXMap=getMaps(*main_conf,"javaxx");
[539]98  if(javaXXMap!=NULL){
99    nbc0+=count(javaXXMap->content);
100  }
101  int nbc1=0;
[640]102  maps* javaXMap=getMaps(*main_conf,"javax");
[539]103  if(javaXMap!=NULL){
104    nbc1+=count(javaXMap->content);
105  }
[364]106#ifdef WIN32
[765]107  //#define nb (2+nbc0+nbc1)
108  const int nb=2+nbc0+nbc1;
109  JavaVMOption *options=(JavaVMOption*)malloc(nb*sizeof(JavaVMOption));
[364]110#else
[747]111  JavaVMOption options[nb+nbc0+nbc1+1];
[364]112#endif
[1]113  JavaVMInitArgs vm_args;
114  JavaVM *jvm;
115  JNIEnv *env;
116  long result;
117  jmethodID pmid;
[364]118  jclass cls;
119#ifdef JAVA7
120  jobject cls_gr;
121#else
122  jclass cls_gr;
123#endif
[539]124  int i,start;
125  map *cursorxx=NULL;
126  if(javaXXMap!=NULL)
127    cursorxx=javaXXMap->content;
128  map *cursorx=NULL;
129  if(javaXMap!=NULL)
130    cursorx=javaXMap->content;
[748]131  options[0].optionString = oclasspath;
[747]132  options[0].extraInfo=NULL;
[767]133  options[1].optionString = "-server";
134  options[1].extraInfo=NULL;
135  char tmp1[100];
136  sprintf(tmp1,"-Djava.library.path=%s",cwdMap->value);
137  fprintf(stderr,"%s\n",tmp1);
138  options[2].optionString = tmp1;
139  options[2].extraInfo=NULL;
140#ifdef USE_JDB
141  options[3].optionString = "-Xdebug";
142  options[3].extraInfo=NULL;
143  options[4].optionString = "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7896";
144  options[4].extraInfo=NULL;
145#endif
[364]146#ifdef WIN32
[539]147  start=2;
[388]148  options[1].optionString = "-Xmx512m";
[539]149#else
[767]150  start=3+njdb;
[364]151#endif
[539]152  for(i=0;i<nbc0;i++){
153    char *tmp=parseJVMXXOption(cursorxx);
[748]154    options[start+i].optionString = zStrdup(tmp);
[747]155    options[start+i].extraInfo=NULL;
[539]156    free(tmp);
157    cursorxx=cursorxx->next;
158  }
159  for(;i<nbc1+nbc0;i++){
160    char *tmp=parseJVMXOption(cursorx);
[748]161    options[start+i].optionString = zStrdup(tmp);
[747]162    options[start+i].extraInfo=NULL;
[539]163    free(tmp);
164    cursorx=cursorx->next;
165  }
[1]166
[59]167  JNI_GetDefaultJavaVMInitArgs(&vm_args);
[352]168  vm_args.version = JNI_VERSION_1_6;
[1]169  vm_args.options = options;
[539]170  vm_args.nOptions = start+nbc0+nbc1;
[364]171  vm_args.ignoreUnrecognized = JNI_TRUE;
[1]172
173  result = JNI_CreateJavaVM(&jvm,(void **)&env, &vm_args);
174  if(result == JNI_ERR ) {
175    fprintf(stderr,"Error invoking the JVM");
176    return -1;
177  }
178#ifdef DEBUG
[364]179  else
[1]180    fprintf(stderr,"JAVA VM Started\n");
181#endif
182
183  tmp=getMap(s->content,"serviceProvider");
[364]184#ifdef JAVA7
[767]185  cls = (*env).FindClass(tmp->value);
[364]186#else
[1]187  cls = (*env)->FindClass(env,tmp->value);
[364]188#endif
[1]189  if( cls == NULL ) {
[388]190    displayStack(env,*main_conf);
[364]191#ifdef JAVA7
192    (*jvm).DestroyJavaVM();
193#else
[1]194    (*jvm)->DestroyJavaVM(jvm);
[364]195#endif
[352]196    return -1;
[1]197  }
198#ifdef DEBUG
199  else{
200    fprintf(stderr,"%s loaded\n",tmp->value);
201  }
202#endif
[767]203#ifdef JAVA7
204  cls_gr = (*env)NewGlobalRef(cls);
205#else
206  cls_gr = (*env)->NewGlobalRef(env, cls);
207#endif
[1]208
209  if (cls != NULL) {
[364]210#ifdef JAVA7
211    (*env).ExceptionClear();
212    pmid=(*env).GetStaticMethodID(cls, s->name, "(Ljava/util/HashMap;Ljava/util/HashMap;Ljava/util/HashMap;)I");
213#else
[1]214    (*env)->ExceptionClear(env);
215    pmid=(*env)->GetStaticMethodID(env,cls_gr, s->name, "(Ljava/util/HashMap;Ljava/util/HashMap;Ljava/util/HashMap;)I");
[364]216#endif
[1]217    if (pmid!=0){
218#ifdef DEBUG
219      fprintf(stderr,"Function successfully loaded\n");
220#endif
[57]221      jclass scHashMapClass,scHashMap_class;
222      jmethodID scHashMap_constructor;
[364]223#ifdef JAVA7
224      scHashMapClass = (*env).FindClass("java/util/HashMap");
225      scHashMap_class = (jclass)(*env).NewGlobalRef(scHashMapClass);
226      scHashMap_constructor = (*env).GetMethodID(scHashMap_class, "<init>", "()V");
227#else
[57]228      scHashMapClass = (*env)->FindClass(env, "java/util/HashMap");
229      scHashMap_class = (*env)->NewGlobalRef(env, scHashMapClass);
230      scHashMap_constructor = (*env)->GetMethodID(env, scHashMap_class, "<init>", "()V");
[364]231#endif
[1]232      /**
233       * The 3 standard parameter for each services
234       */
[57]235      jobject arg1=HashMap_FromMaps(env,m,scHashMapClass,scHashMap_class,scHashMap_constructor);
236      jobject arg2=HashMap_FromMaps(env,inputs,scHashMapClass,scHashMap_class,scHashMap_constructor);
237      jobject arg3=HashMap_FromMaps(env,outputs,scHashMapClass,scHashMap_class,scHashMap_constructor);
[1]238      jint pValue=0;
239
[364]240#ifdef JAVA7
241      pValue=(*env).CallStaticIntMethod(cls,pmid,arg1,arg2,arg3);
242#else
[1]243      pValue=(*env)->CallStaticIntMethod(env,cls,pmid,arg1,arg2,arg3);
[364]244#endif
[114]245      if (pValue != (jint)NULL){
[1]246        res=pValue;
[57]247        m=mapsFromHashMap(env,arg1,scHashMapClass);
248        *main_conf=m;
249        outputs=mapsFromHashMap(env,arg3,scHashMapClass);
[1]250        *real_outputs=outputs;
251
252#ifdef DEBUG
253        fprintf(stderr,"Result of call: %i\n", pValue);
254        dumpMaps(inputs);
255        dumpMaps(outputs);
256#endif
[388]257      }else{
258        displayStack(env,*main_conf);
[364]259#ifdef JAVA7
260        (*jvm).DestroyJavaVM();
261#else
[1]262        (*jvm)->DestroyJavaVM(jvm);
[364]263#endif
[9]264        return -1;
[1]265      }
266    }
267    else{
[388]268      displayStack(env,*main_conf);
[364]269#ifdef JAVA7
[767]270      (*env).ExceptionDescribe();
[364]271      (*jvm).DestroyJavaVM();
272#else
[1]273      (*jvm)->DestroyJavaVM(jvm);
[364]274#endif
[9]275      return -1;
[1]276    }
277  }
[364]278#ifdef JAVA7
279      (*jvm).DestroyJavaVM();
280#else
[1]281  (*jvm)->DestroyJavaVM(jvm);
[364]282#endif
[748]283  for(i=0;i<nbc1+nbc0;i++){
284    free(options[start+i].optionString);
285  }
[765]286#ifdef WIN32
287  free(options);
288#endif
[1]289  return res;
290}
291
[388]292/**
293 * Error handling: display stack trace in an ExceptionReport Document
[580]294 *
295 * @param env the JNI environment pointer
296 * @param main_conf the conf maps containing the main.cfg settings
[388]297 */
298void displayStack(JNIEnv *env,maps* main_conf){
299  map *tmpm=getMapFromMaps(main_conf,"main","tmpPath");
300  char tmps[1024];
301  sprintf(tmps,"%s/%d.ztmp",tmpm->value,getpid());
302  FILE* new_stdout=fopen(tmps,"wb+");
[527]303  if(new_stdout==NULL){
304    map* err=createMap("text","Unable to run your service, no debug informations can be provided (please verify privileges on tmpPath)");
305    addToMap(err,"code","InternalError");
306    printExceptionReportResponse(main_conf,err);
307    freeMap(&err);
308    free(err);
309    return;
310  }
[388]311  fflush(stderr);
312  dup2(fileno(new_stdout),fileno(stderr));
313  fprintf(stderr,"Unable to run your java process properly: ");
314  fflush(stderr);
315#ifdef JAVA7
316  (*env).ExceptionDescribe();
317#else
318  (*env)->ExceptionDescribe(env);
319#endif
320  fflush(new_stdout);
321  fseek(new_stdout, 0, SEEK_END);
322  long flen=ftell(new_stdout);
323  fseek(new_stdout, 0, SEEK_SET);
324  char *tmps1=(char*)malloc((flen+1)*sizeof(char));
325  fread(tmps1,flen,1,new_stdout);
326  fclose(new_stdout);
327  tmps1[flen]=0;
328  map* err=createMap("text",tmps1);
329  addToMap(err,"code","InternalError");
330  printExceptionReportResponse(main_conf,err);
331  freeMap(&err);
332  free(err);
333}
334
[580]335/**
336 * Create a string containing the JVM -XX:* option for a given map
337 * Depending on the map' name:
[613]338 *  - in case the value is minus then the result will be : -XX:-name
339 *  - in case the value is plus then the result will be : -XX:+name
340 *  - in other cases the result will be : -XX:name=value
[580]341 *
342 * @param m the map containing the option
343 * @return a char* containing the valide JVM option (-XX:*)
344 */
[539]345char *parseJVMXXOption(map* m){
[747]346  char *res=(char*)malloc((strlen(m->name)+strlen(m->value)+6)*sizeof(char));
[539]347  if(strncasecmp(m->value,"minus",5)==0)
348    sprintf(res,"-XX:-%s",m->name);
[767]349  else if(strncasecmp(m->value,"plus",4)==0)
[539]350    sprintf(res,"-XX:+%s",m->name);
351  else
352    sprintf(res,"-XX:%s=%s",m->name,m->value);
353  return res;
354}
355
[580]356/**
[613]357 * Create a string containing the JVM -X** option for a given map.
358 * The result will be in the following format: -Xnamevalue
[580]359 *
360 * @param m the map containing the option
[613]361 * @return a char* containing the valide JVM option (-X**)
[580]362 */
[539]363char *parseJVMXOption(map* m){
364  char *res=(char*)malloc((strlen(m->name)+strlen(m->value)+5)*sizeof(char));
[613]365  sprintf(res,"-X%s%s",m->name,m->value);
[539]366  return res;
367}
368
[580]369/**
370 * Convert a maps to a JAVA HashMap<String,HashMap<String,String>>
371 *
372 * @param env the JNI environment pointer
373 * @param t the maps to convert
374 * @param scHashMapClass the HashMap class
375 * @param scHashMap_class the HashMap class
376 * @param scHashMap_constructor the pointer to the hashMap constructor method
377 * @return a created JAVA HashMap containing the converted maps
378 * @warning make sure to free ressources returned by this function
379 */
[57]380jobject HashMap_FromMaps(JNIEnv *env,maps* t,jclass scHashMapClass,jclass scHashMap_class,jmethodID scHashMap_constructor){
[1]381  jobject scObject,scObject1;
382  if(scHashMap_constructor!=NULL){
[364]383#ifdef JAVA7
384    scObject = (*env).NewObject(scHashMap_class, scHashMap_constructor);
385#else
[1]386    scObject = (*env)->NewObject(env, scHashMap_class, scHashMap_constructor);
[364]387#endif
[1]388    jmethodID put_mid = 0;
389
[364]390#ifdef JAVA7
391    put_mid = (*env).GetMethodID(scHashMapClass, "put",
392                                  "(Ljava/lang/Object;Ljava/lang/Object;)"
393                                  "Ljava/lang/Object;");
394#else
[1]395    put_mid = (*env)->GetMethodID(env,scHashMapClass, "put",
396                                  "(Ljava/lang/Object;Ljava/lang/Object;)"
397                                  "Ljava/lang/Object;");
[364]398#endif
[1]399    maps* tmp=t;
400    while(tmp!=NULL){
[360]401      map* tmap=getMapType(tmp->content);
[1]402      map* tmp1=tmp->content;
[364]403#ifdef JAVA7
404      scObject1 = (*env).NewObject(scHashMap_class, scHashMap_constructor);
405#else
[1]406      scObject1 = (*env)->NewObject(env, scHashMap_class, scHashMap_constructor);
[364]407#endif
[68]408      map* sizeV=getMap(tmp1,"size");
[360]409      map* isArray=getMap(tmp1,"isArray");
410      map* alen=getMap(tmp1,"length");
[1]411      while(tmp1!=NULL){
[360]412        if(strcmp(tmp1->name,"value")==0){
413          if(isArray==NULL){
414            if(sizeV!=NULL && strcmp(tmp1->name,"value")==0){
[364]415#ifdef JAVA7
416              jbyteArray tmpData=(*env).NewByteArray(atoi(sizeV->value));
417              (*env).SetByteArrayRegion(tmpData,0,atoi(sizeV->value),(const jbyte *)tmp1->value);
[767]418              (*env).CallObjectMethod(env,scObject1, put_mid, (*env).NewStringUTF(env,tmp1->name), tmpData);
[364]419#else
[360]420              jbyteArray tmpData=(*env)->NewByteArray(env,atoi(sizeV->value));
[767]421              (*env)->SetByteArrayRegion(env,tmpData,0,atoi(sizeV->value),(jbyte*) tmp1->value);
[360]422              (*env)->CallObjectMethod(env,scObject1, put_mid, (*env)->NewStringUTF(env,tmp1->name), tmpData);
[364]423#endif
[360]424            }else
[364]425#ifdef JAVA7
426              (*env).CallObjectMethod(scObject1, put_mid, (*env).NewStringUTF(tmp1->name), (*env).NewStringUTF(tmp1->value));
427#else
[360]428              (*env)->CallObjectMethod(env,scObject1, put_mid, (*env)->NewStringUTF(env,tmp1->name), (*env)->NewStringUTF(env,tmp1->value));
[364]429#endif
[360]430          }
431          else{
432            int alen1=atoi(alen->value);
433            fprintf(stderr,"LENGTH %d \n",alen1);
434           
435            jclass scArrayListClass,scArrayList_class;
436            jmethodID scArrayList_constructor;
[388]437            jobject scObject2;
[364]438#ifdef JAVA7
439            scArrayListClass = (*env).FindClass("java/util/ArrayList");
440            scArrayList_class = (jclass)(*env).NewGlobalRef(scArrayListClass);
441            scArrayList_constructor = (*env).GetMethodID(scArrayList_class, "<init>", "()V");
442            jmethodID add_mid = 0;
443            scObject2 = (*env).NewObject(scArrayList_class, scArrayList_constructor);
444
445            add_mid = (*env).GetMethodID(scArrayListClass,
446                                          "add","(Ljava/lang/Object;)Z");
447#else
[360]448            scArrayListClass = (*env)->FindClass(env, "java/util/ArrayList");
449            scArrayList_class = (*env)->NewGlobalRef(env, scArrayListClass);
450            scArrayList_constructor = (*env)->GetMethodID(env, scArrayList_class, "<init>", "()V");
451            jmethodID add_mid = 0;
452            scObject2 = (*env)->NewObject(env, scArrayList_class, scArrayList_constructor);
453
454            add_mid = (*env)->GetMethodID(env,scArrayListClass,
455                                          "add","(Ljava/lang/Object;)Z");
[364]456#endif     
[360]457            int i;
458           
459            for(i=0;i<alen1;i++){
460              map* vMap=getMapArray(tmp->content,"value",i);       
461              map* sMap=getMapArray(tmp->content,"size",i);
462              map* mMap=getMapArray(tmp->content,tmap->value,i);
463             
464              if(sMap!=NULL && vMap!=NULL && strncmp(vMap->name,"value",5)==0){
[364]465#ifdef JAVA7
466                jbyteArray tmpData=(*env).NewByteArray(atoi(sMap->value));
467                (*env).SetByteArrayRegion(tmpData,0,atoi(sMap->value),(const jbyte *)vMap->value);
468                (*env).CallObjectMethod(scObject2, add_mid, tmpData);
469#else
[360]470                jbyteArray tmpData=(*env)->NewByteArray(env,atoi(sMap->value));
471                (*env)->SetByteArrayRegion(env,tmpData,0,atoi(sMap->value),vMap->value);
472                (*env)->CallObjectMethod(env,scObject2, add_mid, tmpData);
[364]473#endif
[360]474              }else{
[364]475#ifdef JAVA7
476                jobject tmpData=(*env).NewStringUTF(vMap->value);
477                (*env).CallObjectMethod(scObject2, add_mid, tmpData);
478#else
[360]479                jobject tmpData=(*env)->NewStringUTF(env,vMap->value);
480                (*env)->CallObjectMethod(env,scObject2, add_mid, tmpData);
[364]481#endif
[360]482              }
483             
484            }
[364]485
486#ifdef JAVA7
487            (*env).CallObjectMethod(scObject1, put_mid, (*env).NewStringUTF(tmp1->name), scObject2);
488#else       
[360]489            (*env)->CallObjectMethod(env,scObject1, put_mid, (*env)->NewStringUTF(env,tmp1->name), scObject2);
[364]490#endif
491
[360]492          }
493        }
494        else
[364]495#ifdef JAVA7
496          (*env).CallObjectMethod(scObject1, put_mid, (*env).NewStringUTF(tmp1->name), (*env).NewStringUTF(tmp1->value));
497#else
[68]498          (*env)->CallObjectMethod(env,scObject1, put_mid, (*env)->NewStringUTF(env,tmp1->name), (*env)->NewStringUTF(env,tmp1->value));
[364]499#endif
[1]500        tmp1=tmp1->next;
501      }
[364]502#ifdef JAVA7
503      (*env).CallObjectMethod(scObject, put_mid, (*env).NewStringUTF(tmp->name), scObject1);
504#else
[1]505      (*env)->CallObjectMethod(env,scObject, put_mid, (*env)->NewStringUTF(env,tmp->name), scObject1);
[364]506#endif
[1]507      tmp=tmp->next;
[57]508    }
[1]509    return scObject;
510  }
511  else
512    return NULL;
513}
514
[580]515/**
516 * Convert a JAVA HashMap<String,HashMap<String,String>> to a maps
517 *
518 * @param env the JNI environment pointer
519 * @param t the HashMap
520 * @param scHashMapClass the hashMap class
521 * @return a created maps containing the converted HashMap
522 * @warning make sure to free ressources returned by this function
523 */
[57]524maps* mapsFromHashMap(JNIEnv *env,jobject t,jclass scHashMapClass){
[1]525#ifdef DEBUG
526  fprintf(stderr,"mapsFromHashMap start\n");
527#endif
528  /**
529   * What need to be done (in java).
530   * Set set = hm.entrySet();
531   * Iterator i = set.iterator();
532   * while(i.hasNext()){
533   *   Map.Entry me = (Map.Entry)i.next();
534   *   System.out.println(me.getKey() + " : " + me.getValue() );
535   * }
536   */
[640]537  jclass scSetClass,scIteratorClass,scMapEntryClass;
[68]538  jmethodID entrySet_mid,containsKey_mid,get_mid,iterator_mid,hasNext_mid,next_mid,getKey_mid,getValue_mid;
[1]539  if(scHashMapClass==NULL){
[114]540#ifdef DEBUG
[1]541    fprintf(stderr,"Unable to load java.util.HashMap\n");
[114]542#endif
[1]543    return NULL;
544  }
[364]545#ifdef JAVA7
546  entrySet_mid = (*env).GetMethodID(scHashMapClass, "entrySet", "()Ljava/util/Set;"); 
547  containsKey_mid = (*env).GetMethodID(scHashMapClass, "containsKey", "(Ljava/lang/Object;)Z");
548  get_mid = (*env).GetMethodID(scHashMapClass, "get", "(Ljava/lang/Object;)Ljava/lang/Object;"); 
549#else
[1]550  entrySet_mid = (*env)->GetMethodID(env, scHashMapClass, "entrySet", "()Ljava/util/Set;"); 
[68]551  containsKey_mid = (*env)->GetMethodID(env, scHashMapClass, "containsKey", "(Ljava/lang/Object;)Z");
552  get_mid = (*env)->GetMethodID(env, scHashMapClass, "get", "(Ljava/lang/Object;)Ljava/lang/Object;"); 
[364]553#endif
[114]554
[68]555  if(containsKey_mid==0){
[114]556#ifdef DEBUG
[68]557    fprintf(stderr,"unable to load containsKey from HashMap object (%d) \n",entrySet_mid);
[114]558#endif
559    return NULL;
[68]560  }
561  if(get_mid==0){
[114]562#ifdef DEBUG
[68]563    fprintf(stderr,"unable to load get from HashMap object (%d) \n",entrySet_mid);
[114]564#endif
565    return NULL;
[68]566  }
[1]567  if(entrySet_mid==0){
[114]568#ifdef DEBUG
[1]569    fprintf(stderr,"unable to load entrySet from HashMap object (%d) \n",entrySet_mid);
[114]570#endif
[1]571    return NULL;
572  }
573#ifdef DEBUG
574  else
575    fprintf(stderr,"entrySet loaded from HashMap object (%d) \n",entrySet_mid);
576#endif
577
[364]578#ifdef JAVA7
579  scSetClass = (*env).FindClass("java/util/Set");
580  iterator_mid = (*env).GetMethodID(scSetClass, "iterator", "()Ljava/util/Iterator;"); 
581#else
[1]582  scSetClass = (*env)->FindClass(env, "java/util/Set");
583  iterator_mid = (*env)->GetMethodID(env, scSetClass, "iterator", "()Ljava/util/Iterator;"); 
[364]584#endif
[1]585#ifdef DEBUG
586  fprintf(stderr,"mapsFromHashMap 1 (%d) \n",iterator_mid);
587#endif
588
[364]589#ifdef JAVA7
590  scIteratorClass = (*env).FindClass("java/util/Iterator");
591  hasNext_mid = (*env).GetMethodID(scIteratorClass, "hasNext", "()Z");
592#else
[1]593  scIteratorClass = (*env)->FindClass(env, "java/util/Iterator");
594  hasNext_mid = (*env)->GetMethodID(env, scIteratorClass, "hasNext", "()Z");
[364]595#endif
596
[1]597#ifdef DEBUG
598  fprintf(stderr,"mapsFromHashMap 2 (%d)\n",hasNext_mid);
599#endif
[364]600
601#ifdef JAVA7
602  next_mid = (*env).GetMethodID(scIteratorClass, "next", "()Ljava/lang/Object;");
603#else
[1]604  next_mid = (*env)->GetMethodID(env, scIteratorClass, "next", "()Ljava/lang/Object;");
[364]605#endif
[1]606#ifdef DEBUG
607  fprintf(stderr,"mapsFromHashMap 3 (%d)\n",next_mid);
608#endif
609
[364]610#ifdef JAVA7
611  scMapEntryClass = (*env).FindClass("java/util/Map$Entry");
612  getKey_mid = (*env).GetMethodID(scMapEntryClass, "getKey", "()Ljava/lang/Object;");
613#else
[1]614  scMapEntryClass = (*env)->FindClass(env, "java/util/Map$Entry");
615  getKey_mid = (*env)->GetMethodID(env, scMapEntryClass, "getKey", "()Ljava/lang/Object;");
[364]616#endif
[1]617#ifdef DEBUG
618  fprintf(stderr,"mapsFromHashMap 4 (%d)\n",getKey_mid);
619#endif
[364]620#ifdef JAVA7
621  getValue_mid = (*env).GetMethodID(scMapEntryClass, "getValue", "()Ljava/lang/Object;");
622#else
[1]623  getValue_mid = (*env)->GetMethodID(env, scMapEntryClass, "getValue", "()Ljava/lang/Object;");
[364]624#endif
[1]625#ifdef DEBUG
626  fprintf(stderr,"mapsFromHashMap 5 (%d)\n",getValue_mid);
627#endif
628
[364]629#ifdef JAVA7
630  jobject final_set=(*env).CallObjectMethod(t,entrySet_mid);
631  jobject final_iterator=(*env).CallObjectMethod(final_set,iterator_mid);
632#else
[1]633  jobject final_set=(*env)->CallObjectMethod(env,t,entrySet_mid);
634  jobject final_iterator=(*env)->CallObjectMethod(env,final_set,iterator_mid);
[364]635#endif
[1]636
637  maps* final_res=NULL;
638  map* res=NULL;
[364]639#ifdef JAVA7
640  while((*env).CallBooleanMethod(final_iterator,hasNext_mid)){
641    jobject tmp=(*env).CallObjectMethod(final_iterator,next_mid);
642
643    jobject imap=(*env).CallObjectMethod(tmp,getValue_mid);
644    jobject set=(*env).CallObjectMethod(imap,entrySet_mid);
645    jobject iterator=(*env).CallObjectMethod(set,iterator_mid);
646
647#else
[1]648  while((*env)->CallBooleanMethod(env,final_iterator,hasNext_mid)){
649    jobject tmp=(*env)->CallObjectMethod(env,final_iterator,next_mid);
650
651    jobject imap=(*env)->CallObjectMethod(env,tmp,getValue_mid);
652    jobject set=(*env)->CallObjectMethod(env,imap,entrySet_mid);
653    jobject iterator=(*env)->CallObjectMethod(env,set,iterator_mid);
[57]654
[364]655#endif
[68]656    int size=-1;
[364]657#ifdef JAVA7
658    if((*env).CallBooleanMethod(imap,containsKey_mid,(*env).NewStringUTF("size"))){
659      jobject sizeV=(*env).CallObjectMethod(imap, get_mid,(*env).NewStringUTF("size"));
660      const char* sizeVS=(*env).GetStringUTFChars((jstring)sizeV, NULL);
661#else
[68]662    if((*env)->CallBooleanMethod(env,imap,containsKey_mid,(*env)->NewStringUTF(env,"size"))){
663      jobject sizeV=(*env)->CallObjectMethod(env, imap, get_mid,(*env)->NewStringUTF(env,"size"));
[114]664      const char* sizeVS=(*env)->GetStringUTFChars(env, sizeV, NULL);
[364]665#endif
[68]666      size=atoi(sizeVS);
667      fprintf(stderr,"SIZE : %s\n",sizeVS);
[364]668#ifdef JAVA7
669      (*env).ReleaseStringUTFChars((jstring)sizeV, sizeVS);
670#else
[114]671      (*env)->ReleaseStringUTFChars(env, sizeV, sizeVS);
[364]672#endif
[68]673    }
674   
[364]675#ifdef JAVA7
676    while((*env).CallBooleanMethod(iterator,hasNext_mid)){
677      jobject tmp1=(*env).CallObjectMethod(iterator,next_mid);
678      jobject jk=(*env).CallObjectMethod(tmp1,getKey_mid);
679      jobject jv=(*env).CallObjectMethod(tmp1,getValue_mid);
680
681      const char* jkd=(*env).GetStringUTFChars((jstring)jk, NULL);
682#else
[1]683    while((*env)->CallBooleanMethod(env,iterator,hasNext_mid)){
684      jobject tmp1=(*env)->CallObjectMethod(env,iterator,next_mid);
685      jobject jk=(*env)->CallObjectMethod(env,tmp1,getKey_mid);
686      jobject jv=(*env)->CallObjectMethod(env,tmp1,getValue_mid);
687
[114]688      const char* jkd=(*env)->GetStringUTFChars(env, jk, NULL);
[364]689#endif
[68]690      if(size>=0 && strcmp(jkd,"value")==0){
[364]691#ifdef JAVA7
692        jobject value=(jobject)(*env).GetByteArrayElements((jbyteArray)jv, NULL);
693#else
[68]694        jobject value=(*env)->GetByteArrayElements(env, jv, NULL);
[364]695#endif
[68]696        if(res==NULL){
697          res=createMap(jkd,"");
698        }else{
699          addToMap(res,jkd,"");
700        }
701        map* tmpR=getMap(res,"value");
702        free(tmpR->value);
703        tmpR->value=(char*)malloc((size+1)*sizeof(char));
704        memmove(tmpR->value,value,size*sizeof(char));
705        tmpR->value[size]=0;
[114]706        char tmp[128];
707        sprintf(tmp,"%d",size);
708        addToMap(res,"size",tmp);
[68]709      }
710      else{
[364]711#ifdef JAVA7
712        const char* jvd=(*env).GetStringUTFChars((jstring)jv, NULL);
713#else
[114]714        const char* jvd=(*env)->GetStringUTFChars(env, jv, NULL);
[364]715#endif
[68]716        if(res==NULL){
717          res=createMap(jkd,jvd);
718        }else{
719          addToMap(res,jkd,jvd);
720        }
[364]721#ifdef JAVA7
722        (*env).ReleaseStringUTFChars((jstring)jv, jvd);
723#else
[114]724        (*env)->ReleaseStringUTFChars(env, jv, jvd);
[364]725#endif
[68]726      }
[59]727
[364]728#ifdef JAVA7
729      (*env).ReleaseStringUTFChars((jstring)jk, jkd);
730#else
[114]731      (*env)->ReleaseStringUTFChars(env, jk, jkd);
[364]732#endif
[59]733
[1]734    }
[364]735#ifdef JAVA7
736    jobject jk=(*env).CallObjectMethod(tmp,getKey_mid);
737#else
[1]738    jobject jk=(*env)->CallObjectMethod(env,tmp,getKey_mid);
[364]739#endif
[1]740    maps* cmap=(maps*)malloc(sizeof(maps));
[364]741#ifdef JAVA7
742    cmap->name=(char*)(*env).GetStringUTFChars((jstring)jk, NULL);
743#else
[1]744    cmap->name=(*env)->GetStringUTFChars(env, jk, NULL);
[364]745#endif
[57]746#ifdef DEBUG
747    fprintf(stderr," / %s \n",cmap->name);
748#endif
[1]749    cmap->content=res;
750    cmap->next=NULL;
[57]751    if(final_res==NULL)
[9]752      final_res=dupMaps(&cmap);
[57]753    else
[9]754      addMapsToMaps(&final_res,cmap);
755    freeMaps(&cmap);
756    free(cmap);
757    cmap=NULL;
[1]758    res=NULL;
759  }
760#ifdef DEBUG
761  fprintf(stderr,"mapsFromHashMap end\n");
762#endif
763
764  return final_res;
765}
[527]766
Note: See TracBrowser for help on using the repository browser.

Search

ZOO Sponsors

http://www.zoo-project.org/trac/chrome/site/img/geolabs-logo.pnghttp://www.zoo-project.org/trac/chrome/site/img/neogeo-logo.png http://www.zoo-project.org/trac/chrome/site/img/apptech-logo.png http://www.zoo-project.org/trac/chrome/site/img/3liz-logo.png http://www.zoo-project.org/trac/chrome/site/img/gateway-logo.png

Become a sponsor !

Knowledge partners

http://www.zoo-project.org/trac/chrome/site/img/ocu-logo.png http://www.zoo-project.org/trac/chrome/site/img/gucas-logo.png http://www.zoo-project.org/trac/chrome/site/img/polimi-logo.png http://www.zoo-project.org/trac/chrome/site/img/fem-logo.png http://www.zoo-project.org/trac/chrome/site/img/supsi-logo.png http://www.zoo-project.org/trac/chrome/site/img/cumtb-logo.png

Become a knowledge partner

Related links

http://zoo-project.org/img/ogclogo.png http://zoo-project.org/img/osgeologo.png