Ignore:
Timestamp:
Sep 24, 2010, 5:11:43 AM (14 years ago)
Author:
djay
Message:

ZOO-Kernel updates and bug fixes :

  • Fixing gestion of RawDataOutput? when the Service return SERVICE_FAILED an ExceptionReport? was returned to the client.
  • Use gcc when compiling service_internal.c to avoid strange error messages about switch ....
  • Function setMapInMaps was added in service.h to let users set the value of a specific map in a maps.
  • Fixing JavaScript? issue during the context destruction process.
  • Use the GetStatus? ZOO Service when it is available on the local installation for statusLocation.
  • Add some comments for ServiceStarted?, ServiceSucceeded?, ServiceFailed? and ServiceAccepted?.
  • Dynamic creation of a lenv maps in the main configuration file maps, containing the current status and a sid (Service ID). Those informations can be used later by the GetStatus? Service to let user check the on-going status during the Service runs.
  • Function updateStatus was added to service_internal.h which let the Services developers set the current percentCompleted value.

ZOO-Service updates and bug fixes :

  • Add GetStatus? Service and its demo longProcess Service. All are in the wps_status.zo Services Provider.
  • Use the setMapInMaps in the base-vect-ops code to enhance readibility.

ZOO-API updates :

  • Add the function ZOO.UpdateStatus? to the ZOO JavaScript? API which simply point on ZOOUpdateStatus which can be called as-is from JavaScript?. Use : ZOOUpdateStatus(conf,value) where conf is the main configuration file maps and value the the value of the current status.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/zoo-kernel/service_internal.c

    r9 r26  
    3535  return hex[code & 15];
    3636}
     37
     38void* unhandleStatus(maps *conf){
     39  int shmid,i;
     40  key_t key;
     41  void *shm;
     42  struct shmid_ds shmids;
     43  char *s,*s1;
     44  map *tmpMap=getMapFromMaps(conf,"lenv","sid");
     45  if(tmpMap!=NULL){
     46    key=atoi(tmpMap->value);
     47    if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
     48#ifdef DEBUG
     49      fprintf(stderr,"shmget failed to update value\n");
     50#endif
     51    }else{
     52      if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
     53#ifdef DEBUG
     54        fprintf(stderr,"shmat failed to update value\n");
     55#endif
     56      }else{
     57        shmdt(shm);
     58        shmctl(shmid,IPC_RMID,&shmids);
     59      }
     60    }
     61  }
     62}
     63
     64#ifdef USE_JS
     65
     66JSBool
     67JSUpdateStatus(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
     68{
     69  JS_MaybeGC(cx);
     70  char *sid;
     71  int istatus=0;
     72  char *status=NULL;
     73  maps *conf;
     74  int i=0;
     75  if(argc>2){
     76#ifdef JS_DEBUG
     77    fprintf(stderr,"Number of arguments used to call the function : %i",argc);
     78#endif
     79    return JS_FALSE;
     80  }
     81  conf=mapsFromJSObject(cx,argv[0]);
     82  dumpMaps(conf);
     83  if(JS_ValueToInt32(cx,argv[1],&istatus)==JS_TRUE){
     84    char tmpStatus[4];
     85    sprintf(tmpStatus,"%i",istatus);
     86    tmpStatus[3]=0;
     87    status=strdup(tmpStatus);
     88  }
     89  if(getMapFromMaps(conf,"lenv","status")!=NULL){
     90    if(status!=NULL)
     91      setMapInMaps(conf,"lenv","status",status);
     92    else
     93      setMapInMaps(conf,"lenv","status","15");
     94    updateStatus(conf);
     95  }
     96  freeMaps(&conf);
     97  free(conf);
     98  JS_MaybeGC(cx);
     99  return JS_TRUE;
     100}
     101
     102#endif
     103
     104void* updateStatus(maps *conf){
     105  int shmid,i;
     106  key_t key;
     107  char *shm,*s,*s1;
     108  map *tmpMap=NULL;
     109  tmpMap=getMapFromMaps(conf,"lenv","sid");
     110  if(tmpMap!=NULL){
     111    key=atoi(tmpMap->value);
     112    if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
     113#ifdef DEBUG
     114      fprintf(stderr,"shmget failed to update value\n");
     115#endif
     116    }else{
     117      if ((shm = (char*) shmat(shmid, NULL, 0)) == (char *) -1) {
     118#ifdef DEBUG
     119        fprintf(stderr,"shmat failed to update value\n");
     120#endif
     121      }
     122      else{
     123        tmpMap=getMapFromMaps(conf,"lenv","status");
     124        s1=shm;
     125        for(s=tmpMap->value;*s!=NULL;s++)
     126          *s1++=*s;
     127        shmdt((void *)shm);
     128      }
     129    }
     130  }
     131}
     132
     133char* getStatus(int pid){
     134  int shmid,i;
     135  key_t key;
     136  void *shm;
     137  char *s;
     138  key=pid;
     139  if ((shmid = shmget(key, SHMSZ, 0666)) < 0) {
     140#ifdef DEBUG
     141    fprintf(stderr,"shmget failed in getStatus\n");
     142#endif
     143  }else{
     144    if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
     145#ifdef DEBUG
     146      fprintf(stderr,"shmat failed in getStatus\n");
     147#endif
     148    }else{
     149      return (char*)shm;
     150    }
     151  }
     152  return "-1";
     153}
     154
    37155
    38156/* Returns a url-encoded version of str */
     
    729847          char tmp[1024];
    730848          sprintf(tmp,"http://www.w3.org/TR/xmlschema-2/#%s",tmp1->value);
    731           xmlNewNsProp(nc6,ns_xlink,BAD_CAST "reference",BAD_CAST tmp);
     849          xmlNewNsProp(nc6,ns_ows,BAD_CAST "reference",BAD_CAST tmp);
    732850          xmlAddChild(nc3,nc6);
    733851          tmp1=tmp1->next;
     
    841959  xmlNewProp(n,BAD_CAST "xml:lang",BAD_CAST "en");
    842960  char tmp[256];
    843   char url[256];
     961  char url[1024];
    844962  memset(tmp,0,256);
    845963  memset(url,0,256);
    846964  maps* tmp_maps=getMaps(m,"main");
    847965  if(tmp_maps!=NULL){
    848     map* tmpm=getMap(tmp_maps->content,"serverAddress");
    849     map* tmpm1=getMap(tmp_maps->content,"tmpUrl");
    850     if(tmpm!=NULL && tmpm1!=NULL){
    851       sprintf(url,"%s/%s/%s_%i.xml",tmpm->value,tmpm1->value,service,pid);
    852     }
    853     if(tmpm!=NULL)
    854       sprintf(tmp,"%s/",tmpm->value);
     966    dumpMaps(getMaps(m,"lenv"));
     967    map* tmpm1=getMap(tmp_maps->content,"serverAddress");
     968    /**
     969     * Check if the ZOO Service GetStatus is available in the local directory.
     970     * If yes, then it uses a reference to an URL which the client can access
     971     * to get information on the status of a running Service (using the
     972     * percentCompleted attribute).
     973     * Else fallback to the initial method using the xml file to write in ...
     974     */
     975    char ntmp[1024];
     976#ifndef WIN32
     977    getcwd(ntmp,1024);
     978#else
     979    _getcwd(ntmp,1024);
     980#endif
     981    struct stat myFileInfo;
     982    int statRes;
     983    char file_path[1024];
     984    sprintf(file_path,"%s/GetStatus.zcfg",ntmp);
     985    statRes=stat(file_path,&myFileInfo);
     986    if(statRes==0){
     987      char currentSid[128];
     988      map* tmpm=getMap(tmp_maps->content,"rewriteUrl");
     989      map *tmp_lenv=NULL;
     990      tmp_lenv=getMapFromMaps(m,"lenv","sid");
     991      if(tmp_lenv==NULL)
     992        sprintf(currentSid,"%i",pid);
     993      else
     994        sprintf(currentSid,"%s",tmp_lenv->value);
     995      if(tmpm==NULL || strcasecmp(tmpm->value,"false")==0){
     996        sprintf(url,"%s/?request=Execute&amp;service=WPS&amp;version=1.0.0&amp;Identifier=GetStatus&amp;DataInputs=sid=%s&amp;RawDataOutput=Result",tmpm1->value,currentSid);
     997      }else{
     998        if(strlen(tmpm->value)>0)
     999          if(strcasecmp(tmpm->value,"true")!=0)
     1000            sprintf(url,"%s/%s/GetStatus/%s",tmpm1->value,tmpm->value,currentSid);
     1001          else
     1002            sprintf(url,"%s/GetStatus/%s",tmpm1->value,currentSid);
     1003        else
     1004          sprintf(url,"%s/?request=Execute&amp;service=WPS&amp;version=1.0.0&amp;Identifier=GetStatus&amp;DataInputs=sid=%s&amp;RawDataOutput=Result",tmpm1->value,currentSid);
     1005      }
     1006    }else{
     1007      map* tmpm2=getMap(tmp_maps->content,"tmpUrl");
     1008      if(tmpm1!=NULL && tmpm2!=NULL){
     1009        sprintf(url,"%s/%s/%s_%i.xml",tmpm1->value,tmpm2->value,service,pid);
     1010      }
     1011    }
     1012    if(tmpm1!=NULL)
     1013      sprintf(tmp,"%s/",tmpm1->value);
    8551014  }
    8561015
    8571016  xmlNewProp(n,BAD_CAST "serviceInstance",BAD_CAST tmp);
    858   if(status!=SERVICE_SUCCEEDED){
     1017  if(status!=SERVICE_SUCCEEDED && status!=SERVICE_FAILED){
    8591018    xmlNewProp(n,BAD_CAST "statusLocation",BAD_CAST url);
    8601019  }
     
    8761035  time_t now;
    8771036  char *tmp1;
     1037  map *tmpStatus;
    8781038 
    8791039  now = time ( NULL );
     
    8841044  len = strftime ( tmp1, TIME_SIZE, "%Y-%m-%dT%I:%M:%SZ", tm );
    8851045
     1046  xmlNewProp(nc,BAD_CAST "creationTime",BAD_CAST tmp1);
     1047
     1048  char sMsg[2048];
    8861049  switch(status){
    8871050  case SERVICE_SUCCEEDED:
    888     xmlNewProp(nc,BAD_CAST "creationTime",BAD_CAST tmp1);
    8891051    nc1 = xmlNewNode(ns, BAD_CAST "ProcessSucceeded");
     1052    sprintf(sMsg,"Service \"%s\" run successfully.",serv->name);
     1053    nc3=xmlNewText(BAD_CAST sMsg);
     1054    xmlAddChild(nc1,nc3);
    8901055    break;
    8911056  case SERVICE_STARTED:
    892     xmlNewProp(nc,BAD_CAST "creationTime",BAD_CAST tmp1);
    8931057    nc1 = xmlNewNode(ns, BAD_CAST "ProcessStarted");
    894     xmlNewProp(nc1,BAD_CAST "percentCompleted",BAD_CAST "NEED_SERVICE_ACCESS");
     1058    tmpStatus=getMapFromMaps(m,"lenv","status");
     1059    xmlNewProp(nc1,BAD_CAST "percentCompleted",BAD_CAST tmpStatus->value);
     1060    sprintf(sMsg,"ZOO Service \"%s\" is currently running. Please, reload this document to get the up-to-date status of the Service.",serv->name);
     1061    nc3=xmlNewText(BAD_CAST sMsg);
     1062    xmlAddChild(nc1,nc3);
    8951063    break;
    8961064  case SERVICE_ACCEPTED:
    897     xmlNewProp(nc,BAD_CAST "creationTime",BAD_CAST tmp1);
    8981065    nc1 = xmlNewNode(ns, BAD_CAST "ProcessAccepted");
     1066    sprintf(sMsg,"Service \"%s\" was accepted by the ZOO Kernel and it run as a background task. Please consult the statusLocation attribtue providen in this document to get the up-to-date document.",serv->name);
     1067    nc3=xmlNewText(BAD_CAST sMsg);
     1068    xmlAddChild(nc1,nc3);
    8991069    break;
    9001070  case SERVICE_FAILED:
    9011071    nc1 = xmlNewNode(ns, BAD_CAST "ProcessFailed");
     1072    map *errorMap;
     1073    map *te;
     1074    te=getMapFromMaps(m,"lenv","code");
     1075    if(te!=NULL)
     1076      errorMap=createMap("code",te->value);
     1077    else
     1078      errorMap=createMap("code","NoApplicableCode");
     1079    te=getMapFromMaps(m,"lenv","message");
     1080    if(te!=NULL)
     1081      addToMap(errorMap,"text",te->value);
     1082    else
     1083      addToMap(errorMap,"text","No more information available");
     1084    nc3=createExceptionReportNode(m,errorMap,0);
     1085    xmlAddChild(nc1,nc3);
    9021086    break;
    9031087  default :
    9041088    printf("error code not know : %i\n",status);
    905     exit(1);
     1089    //exit(1);
    9061090    break;
    9071091  }
     
    10591243  nc1=xmlNewNode(ns_wps, BAD_CAST type);
    10601244  map *tmp=e->content;
    1061   //#ifdef DEBUG
     1245#ifdef DEBUG
    10621246  dumpMap(tmp);
    10631247  dumpElements(e);
    1064   //#endif
     1248#endif
    10651249  nc2=xmlNewNode(ns_ows, BAD_CAST "Identifier");
    10661250  nc3=xmlNewText(BAD_CAST e->name);
     
    10851269   * IO type Reference or full Data ?
    10861270   */
    1087   //#ifdef DEBUG
     1271#ifdef DEBUG
    10881272  fprintf(stderr,"FORMAT %s %s\n",e->format,e->format);
    1089   //#endif
     1273#endif
    10901274  map *tmpMap=getMap(m->content,"Reference");
    10911275  if(tmpMap==NULL){
     
    12101394  maps* tmpMap=getMaps(m,"main");
    12111395  char *encoding=getEncoding(tmpMap);
    1212   printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
     1396  map *tmpSid=getMapFromMaps(m,"lenv","sid");
     1397  if(tmpSid==NULL)
     1398    printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
    12131399
    12141400  ns=xmlNewNs(NULL,BAD_CAST "http://www.opengis.net/ows/1.1",BAD_CAST "ows");
     
    12171403  ns_xlink=xmlNewNs(n,BAD_CAST "http://www.w3.org/1999/xlink",BAD_CAST "xlink");
    12181404  ns_xsi=xmlNewNs(n,BAD_CAST "http://www.w3.org/2001/XMLSchema-instance",BAD_CAST "xsi");
    1219   xmlNewProp(n,BAD_CAST "xsi:schemaLocation",BAD_CAST "http://www.opengis.net/ows/1.1 http://schemas.opengis.net/ows/1.1/owsExceptionReport.xsd");
     1405  xmlNewProp(n,BAD_CAST "xsi:schemaLocation",BAD_CAST "http://www.opengis.net/ows/1.1 http://schemas.opengis.net/ows/1.1.0/owsExceptionReport.xsd");
    12201406  xmlNewProp(n,BAD_CAST "xml:lang",BAD_CAST "en");
    1221   xmlNewProp(n,BAD_CAST "service",BAD_CAST "WPS");
    1222 
    1223   xmlNewProp(n,BAD_CAST "version",BAD_CAST getVersion(tmpMap));
     1407  xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.1.0");
    12241408
    12251409  nc = xmlNewNode(ns, BAD_CAST "Exception"); 
     
    12511435  xmlFreeNs(ns);
    12521436  xmlCleanupParser();
     1437}
     1438
     1439xmlNodePtr createExceptionReportNode(maps* m,map* s,int use_ns){
     1440 
     1441  int buffersize;
     1442  xmlChar *xmlbuff;
     1443  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
     1444  xmlNodePtr n,nc,nc1,nc2;
     1445
     1446  maps* tmpMap=getMaps(m,"main");
     1447
     1448  ns=xmlNewNs(NULL,BAD_CAST "http://www.opengis.net/ows/1.1",BAD_CAST "ows");
     1449  n = xmlNewNode(ns, BAD_CAST "ExceptionReport");
     1450
     1451  if(use_ns==1){
     1452    ns_ows=xmlNewNs(n,BAD_CAST "http://www.opengis.net/ows/1.1",BAD_CAST "ows");
     1453    int xsiId=zooXmlAddNs(n,"http://www.w3.org/2001/XMLSchema-instance","xsi");
     1454    ns_xsi=usedNs[xsiId];
     1455    int xlinkId=zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
     1456    ns_xlink=usedNs[xlinkId];
     1457    xmlNewNsProp(n,ns_xsi,BAD_CAST "schemaLocation",BAD_CAST "http://www.opengis.net/ows/1.1 http://schemas.opengis.net/ows/1.1.0/owsExceptionReport.xsd");
     1458  }
     1459  xmlNewProp(n,BAD_CAST "xml:lang",BAD_CAST "en");
     1460  xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.1.0");
     1461 
     1462  nc = xmlNewNode(ns, BAD_CAST "Exception");
     1463
     1464  map* tmp=getMap(s,"code");
     1465  if(tmp!=NULL)
     1466    xmlNewProp(nc,BAD_CAST "exceptionCode",BAD_CAST tmp->value);
     1467  else
     1468    xmlNewProp(nc,BAD_CAST "exceptionCode",BAD_CAST "NoApplicableCode");
     1469
     1470  tmp=getMap(s,"text");
     1471  nc1 = xmlNewNode(ns, BAD_CAST "ExceptionText");
     1472  nc2=NULL;
     1473  if(tmp!=NULL){
     1474    xmlNodeSetContent(nc1, BAD_CAST tmp->value);
     1475  }
     1476  else{
     1477    xmlNodeSetContent(nc1, BAD_CAST "No debug message available");
     1478  }
     1479  xmlAddChild(nc,nc1);
     1480  xmlAddChild(n,nc);
     1481  return n;
    12531482}
    12541483
     
    12961525#endif
    12971526    printProcessResponse(m,request_inputs1,cpid,
    1298                           s,r_inputs->value,res,
    1299                           request_inputs,
    1300                           request_outputs);
    1301   }
    1302   else{
    1303     /**
    1304      * We get the first output only !!
    1305      */
    1306     char mime[1024];
    1307     map* mi=getMap(request_outputs->content,"mimeType");
    1308 #ifdef DEBUG
    1309     fprintf(stderr,"SERVICE OUTPUTS\n");
    1310     dumpMaps(request_outputs);
    1311     fprintf(stderr,"SERVICE OUTPUTS\n");
    1312 #endif
    1313     map* en=getMap(request_outputs->content,"encoding");
    1314     if(mi!=NULL && en!=NULL)
    1315       sprintf(mime,
    1316               "Content-Type: %s; charset=%s\r\nStatus: 200 OK\r\n\r\n",
    1317               mi->value,en->value);
    1318     else
    1319       if(mi!=NULL)
     1527                         s,r_inputs->value,res,
     1528                         request_inputs,
     1529                         request_outputs);
     1530  }
     1531  else
     1532    if(res!=SERVICE_FAILED){
     1533      /**
     1534       * We get the first output only !!
     1535       */
     1536      char mime[1024];
     1537      map* mi=getMap(request_outputs->content,"mimeType");
     1538#ifdef DEBUG
     1539      fprintf(stderr,"SERVICE OUTPUTS\n");
     1540      dumpMaps(request_outputs);
     1541      fprintf(stderr,"SERVICE OUTPUTS\n");
     1542#endif
     1543      map* en=getMap(request_outputs->content,"encoding");
     1544      if(mi!=NULL && en!=NULL)
    13201545        sprintf(mime,
    1321                 "Content-Type: %s; charset=UTF-8\r\nStatus: 200 OK\r\n\r\n",
    1322                 mi->value);
     1546                "Content-Type: %s; charset=%s\r\nStatus: 200 OK\r\n\r\n",
     1547                mi->value,en->value);
    13231548      else
    1324         sprintf(mime,"Content-Type: text/plain; charset=utf-8\r\nStatus: 200 OK\r\n\r\n");
    1325     printf("%s",mime);
    1326     toto=getMap(request_outputs->content,"value");
    1327     if(mi!=NULL && strncmp(mi->value,"image",5)==0){
    1328       map* rs=getMapFromMaps(request_outputs,request_outputs->name,"size");
    1329       fwrite(toto->value,atoi(rs->value),1,stdout);
    1330     }
    1331     else
    1332       printf("%s",toto->value);
    1333 #ifdef DEBUG
    1334     dumpMap(toto);
    1335 #endif
    1336   }
     1549        if(mi!=NULL)
     1550          sprintf(mime,
     1551                  "Content-Type: %s; charset=UTF-8\r\nStatus: 200 OK\r\n\r\n",
     1552                  mi->value);
     1553        else
     1554          sprintf(mime,"Content-Type: text/plain; charset=utf-8\r\nStatus: 200 OK\r\n\r\n");
     1555      printf("%s",mime);
     1556      toto=getMap(request_outputs->content,"value");
     1557      if(mi!=NULL && strncmp(mi->value,"image",5)==0){
     1558        map* rs=getMapFromMaps(request_outputs,request_outputs->name,"size");
     1559        fwrite(toto->value,atoi(rs->value),1,stdout);
     1560      }
     1561      else
     1562        printf("%s",toto->value);
     1563#ifdef DEBUG
     1564      dumpMap(toto);
     1565#endif
     1566    }else{
     1567      char tmp[1024];
     1568      map * errormap;
     1569      map *lenv;
     1570      lenv=getMapFromMaps(m,"lenv","message");
     1571      if(lenv!=NULL)
     1572        sprintf(tmp,"Unable to run the Service. The message returned back by the Service was the following : %s",lenv->value);
     1573      else
     1574        sprintf(tmp,"Unable to run the Service. No more information was returned back by the Service.");
     1575      errormap = createMap("text",tmp);     
     1576      addToMap(errormap,"code", "InternalError");
     1577      printf("Content-Type: text/xml; charset=utf-8\r\nStatus: 200 OK\r\n\r\n");
     1578      printExceptionReportResponse(m,errormap);
     1579      freeMap(&errormap);
     1580      free(errormap);
     1581    }
    13371582}
    13381583
Note: See TracChangeset for help on using the changeset viewer.

Search

Context Navigation

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