source: trunk/zoo-kernel/service_internal_java.c @ 59

Last change on this file since 59 was 59, checked in by djay, 13 years ago

Small fix for binary string support in dupMaps function to ensure that the binary value willbe passed to various laguages correctly. Memory cleanup.

File size: 10.3 KB
Line 
1/**
2 * Author : Gérald FENOY
3 *
4 * Copyright (c) 2009-2010 GeoLabs SARL
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"
26
27int zoo_java_support(maps** main_conf,map* request,service* s,maps **real_inputs,maps **real_outputs){
28  maps* m=*main_conf;
29  maps* inputs=*real_inputs;
30  maps* outputs=*real_outputs;
31  char ntmp[1024];
32  getcwd(ntmp,1024);
33  map* tmp=getMap(request,"metapath");
34  char classpath[2048];
35  char oclasspath[2068];
36  int res=SERVICE_FAILED;
37  if(tmp!=NULL){
38    sprintf(classpath,"%s/%s/:$CLASSPATH",ntmp,tmp->value);
39    sprintf(oclasspath,"-Djava.class.path=%s/%s",ntmp,tmp->value);
40  }
41  else{
42    sprintf(classpath,"%s:$CLASSPATH",ntmp);
43    sprintf(oclasspath,"-Djava.class.path=%s",ntmp);
44  }
45#ifdef DEBUG
46  fprintf(stderr,"CLASSPATH=%s\n",classpath);
47#endif
48  setenv("CLASSPATH",classpath,1);
49
50  JavaVMOption options[2];
51  JavaVMInitArgs vm_args;
52  JavaVM *jvm;
53  JNIEnv *env;
54  long result;
55  jmethodID pmid;
56  jfieldID fid;
57  jobject jobj;
58  jclass cls,cls_gr;
59  int i;
60
61  options[0].optionString = oclasspath;
62  options[1].optionString = "-Djava.compiler=NONE";
63
64  vm_args.version = JNI_VERSION_1_2;
65  JNI_GetDefaultJavaVMInitArgs(&vm_args);
66  vm_args.options = options;
67  vm_args.nOptions = 2;
68  vm_args.ignoreUnrecognized = JNI_FALSE;
69
70  result = JNI_CreateJavaVM(&jvm,(void **)&env, &vm_args);
71  if(result == JNI_ERR ) {
72    fprintf(stderr,"Error invoking the JVM");
73    return -1;
74  }
75#ifdef DEBUG
76  else 
77    fprintf(stderr,"JAVA VM Started\n");
78#endif
79
80  tmp=getMap(s->content,"serviceProvider");
81  cls = (*env)->FindClass(env,tmp->value);
82  cls_gr = (*env)->NewGlobalRef(env, cls);
83  if( cls == NULL ) {
84    char pbt[10240];
85    sprintf(pbt,"can't find class %s\n",tmp->value);
86    map* err=createMap("text",pbt);
87    addToMap(err,"code","NoApplicableCode");
88    printExceptionReportResponse(m,err);
89    freeMap(&err);
90    free(err);
91    (*jvm)->DestroyJavaVM(jvm);
92    return 1;
93  }
94#ifdef DEBUG
95  else{
96    fprintf(stderr,"%s loaded\n",tmp->value);
97  }
98#endif
99
100  if (cls != NULL) {
101    (*env)->ExceptionClear(env);
102    pmid=(*env)->GetStaticMethodID(env,cls_gr, s->name, "(Ljava/util/HashMap;Ljava/util/HashMap;Ljava/util/HashMap;)I");
103    if (pmid!=0){
104#ifdef DEBUG
105      fprintf(stderr,"Function successfully loaded\n");
106#endif
107      jclass scHashMapClass,scHashMap_class;
108      jmethodID scHashMap_constructor;
109      scHashMapClass = (*env)->FindClass(env, "java/util/HashMap");
110      scHashMap_class = (*env)->NewGlobalRef(env, scHashMapClass);
111      scHashMap_constructor = (*env)->GetMethodID(env, scHashMap_class, "<init>", "()V");
112      /**
113       * The 3 standard parameter for each services
114       */
115      jobject arg1=HashMap_FromMaps(env,m,scHashMapClass,scHashMap_class,scHashMap_constructor);
116      jobject arg2=HashMap_FromMaps(env,inputs,scHashMapClass,scHashMap_class,scHashMap_constructor);
117      jobject arg3=HashMap_FromMaps(env,outputs,scHashMapClass,scHashMap_class,scHashMap_constructor);
118      jint pValue=0;
119
120      pValue=(*env)->CallStaticIntMethod(env,cls,pmid,arg1,arg2,arg3);
121      if (pValue != NULL){
122        res=pValue;
123        m=mapsFromHashMap(env,arg1,scHashMapClass);
124        *main_conf=m;
125        outputs=mapsFromHashMap(env,arg3,scHashMapClass);
126        *real_outputs=outputs;
127
128#ifdef DEBUG
129        fprintf(stderr,"Result of call: %i\n", pValue);
130        dumpMaps(inputs);
131        dumpMaps(outputs);
132#endif
133      }else{     
134        /**
135         * Error handling displayig stack trace in ExceptionReport
136         */
137        map *tmpm=getMapFromMaps(*main_conf,"main","tmpPath");
138        char tmps[1024];
139        sprintf(tmps,"%s/%d.ztmp",tmpm->value,getpid());
140        int old_stdout=dup(fileno(stdout));
141        FILE* new_stdout=fopen(tmps,"w+");
142        dup2(fileno(new_stdout),fileno(stdout));
143        (*env)->ExceptionDescribe(env);
144        fflush(stdout);
145        dup2(old_stdout,fileno(stdout));
146        fseek(new_stdout, 0, SEEK_END);
147        long flen=ftell(new_stdout);
148        rewind(new_stdout);
149        char tmps1[flen];
150        fread(tmps1,flen,1,new_stdout);
151        fclose(new_stdout);
152        char pbt[100+flen];
153        sprintf(pbt,"Unable to run your java process properly. Server returns : %s",tmps1);
154        map* err=createMap("text",pbt);
155        addToMap(err,"code","NoApplicableCode");
156        printExceptionReportResponse(m,err);
157        freeMap(&err);
158        free(err);
159        (*jvm)->DestroyJavaVM(jvm);
160        return -1;
161      }
162    }
163    else{
164      char tmpS[1024];
165      sprintf(tmpS, "Cannot find function %s \n", s->name);
166      map* err=createMap("text",tmpS);
167      printExceptionReportResponse(m,err);
168      freeMap(&err);
169      free(err);
170      (*jvm)->DestroyJavaVM(jvm);
171      return -1;
172    }
173  }else{
174    char tmpS[1024];
175    sprintf(tmpS, "Cannot find function %s \n", tmp->value);
176    map* err=createMap("text",tmpS);
177    printExceptionReportResponse(m,err);
178    freeMap(&err);
179    free(err);
180    (*jvm)->DestroyJavaVM(jvm);
181    return -1;
182  }
183  (*jvm)->DestroyJavaVM(jvm);
184  return res;
185}
186
187jobject HashMap_FromMaps(JNIEnv *env,maps* t,jclass scHashMapClass,jclass scHashMap_class,jmethodID scHashMap_constructor){
188  jobject scObject,scObject1;
189  if(scHashMap_constructor!=NULL){
190    scObject = (*env)->NewObject(env, scHashMap_class, scHashMap_constructor);
191    jmethodID put_mid = 0;
192
193    put_mid = (*env)->GetMethodID(env,scHashMapClass, "put",
194                                  "(Ljava/lang/Object;Ljava/lang/Object;)"
195                                  "Ljava/lang/Object;");
196    maps* tmp=t;
197    while(tmp!=NULL){
198      map* tmp1=tmp->content;
199      scObject1 = (*env)->NewObject(env, scHashMap_class, scHashMap_constructor);
200      while(tmp1!=NULL){
201        (*env)->CallObjectMethod(env,scObject1, put_mid, (*env)->NewStringUTF(env,tmp1->name), (*env)->NewStringUTF(env,tmp1->value));
202        tmp1=tmp1->next;
203      }
204      (*env)->CallObjectMethod(env,scObject, put_mid, (*env)->NewStringUTF(env,tmp->name), scObject1);
205      tmp=tmp->next;
206    }
207    return scObject;
208  }
209  else
210    return NULL;
211}
212
213maps* mapsFromHashMap(JNIEnv *env,jobject t,jclass scHashMapClass){
214#ifdef DEBUG
215  fprintf(stderr,"mapsFromHashMap start\n");
216#endif
217  /**
218   * What need to be done (in java).
219   * Set set = hm.entrySet();
220   * Iterator i = set.iterator();
221   * while(i.hasNext()){
222   *   Map.Entry me = (Map.Entry)i.next();
223   *   System.out.println(me.getKey() + " : " + me.getValue() );
224   * }
225   */
226  jclass scHashMap_class,scSetClass,scIteratorClass,scMapEntryClass,scSet_class,scMapClass;
227  jmethodID entrySet_mid,iterator_mid,hasNext_mid,next_mid,getKey_mid,getValue_mid;
228  jobject scObject,scObject1;
229  if(scHashMapClass==NULL){
230    fprintf(stderr,"Unable to load java.util.HashMap\n");
231    return NULL;
232  }
233  entrySet_mid = (*env)->GetMethodID(env, scHashMapClass, "entrySet", "()Ljava/util/Set;"); 
234  if(entrySet_mid==0){
235    fprintf(stderr,"unable to load entrySet from HashMap object (%d) \n",entrySet_mid);
236    return NULL;
237  }
238#ifdef DEBUG
239  else
240    fprintf(stderr,"entrySet loaded from HashMap object (%d) \n",entrySet_mid);
241#endif
242
243  scSetClass = (*env)->FindClass(env, "java/util/Set");
244  iterator_mid = (*env)->GetMethodID(env, scSetClass, "iterator", "()Ljava/util/Iterator;"); 
245#ifdef DEBUG
246  fprintf(stderr,"mapsFromHashMap 1 (%d) \n",iterator_mid);
247#endif
248
249  scIteratorClass = (*env)->FindClass(env, "java/util/Iterator");
250  hasNext_mid = (*env)->GetMethodID(env, scIteratorClass, "hasNext", "()Z");
251#ifdef DEBUG
252  fprintf(stderr,"mapsFromHashMap 2 (%d)\n",hasNext_mid);
253#endif
254  next_mid = (*env)->GetMethodID(env, scIteratorClass, "next", "()Ljava/lang/Object;");
255#ifdef DEBUG
256  fprintf(stderr,"mapsFromHashMap 3 (%d)\n",next_mid);
257#endif
258
259  scMapEntryClass = (*env)->FindClass(env, "java/util/Map$Entry");
260  getKey_mid = (*env)->GetMethodID(env, scMapEntryClass, "getKey", "()Ljava/lang/Object;");
261#ifdef DEBUG
262  fprintf(stderr,"mapsFromHashMap 4 (%d)\n",getKey_mid);
263#endif
264  getValue_mid = (*env)->GetMethodID(env, scMapEntryClass, "getValue", "()Ljava/lang/Object;");
265#ifdef DEBUG
266  fprintf(stderr,"mapsFromHashMap 5 (%d)\n",getValue_mid);
267#endif
268
269  jobject final_set=(*env)->CallObjectMethod(env,t,entrySet_mid);
270  jobject final_iterator=(*env)->CallObjectMethod(env,final_set,iterator_mid);
271
272
273  maps* final_res=NULL;
274  map* res=NULL;
275  while((*env)->CallBooleanMethod(env,final_iterator,hasNext_mid)){
276    jobject tmp=(*env)->CallObjectMethod(env,final_iterator,next_mid);
277
278    jobject imap=(*env)->CallObjectMethod(env,tmp,getValue_mid);
279    jobject set=(*env)->CallObjectMethod(env,imap,entrySet_mid);
280    jobject iterator=(*env)->CallObjectMethod(env,set,iterator_mid);
281
282    while((*env)->CallBooleanMethod(env,iterator,hasNext_mid)){
283      jobject tmp1=(*env)->CallObjectMethod(env,iterator,next_mid);
284      jobject jk=(*env)->CallObjectMethod(env,tmp1,getKey_mid);
285      jobject jv=(*env)->CallObjectMethod(env,tmp1,getValue_mid);
286
287      jstring jkd=(*env)->GetStringUTFChars(env, jk, NULL);
288      jstring jvd=(*env)->GetStringUTFChars(env, jv, NULL);
289
290#ifdef DEBUG
291      fprintf(stderr,"%s %s\n",jkd,jvd);
292#endif
293
294      if(res==NULL){
295        res=createMap(jkd,jvd);
296      }else{
297        addToMap(res,jkd,jvd);
298      }
299      (*env)->ReleaseStringChars(env, jk, jkd);
300      (*env)->ReleaseStringChars(env, jv, jvd);
301
302    }
303    jobject jk=(*env)->CallObjectMethod(env,tmp,getKey_mid);
304    maps* cmap=(maps*)malloc(sizeof(maps));
305    cmap->name=(*env)->GetStringUTFChars(env, jk, NULL);
306#ifdef DEBUG
307    fprintf(stderr," / %s \n",cmap->name);
308#endif
309    cmap->content=res;
310    cmap->next=NULL;
311    if(final_res==NULL)
312      final_res=dupMaps(&cmap);
313    else
314      addMapsToMaps(&final_res,cmap);
315    freeMaps(&cmap);
316    free(cmap);
317    cmap=NULL;
318    res=NULL;
319  }
320#ifdef DEBUG
321  fprintf(stderr,"mapsFromHashMap end\n");
322#endif
323
324  return final_res;
325}
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