Changeset 550


Ignore:
Timestamp:
Feb 3, 2015, 12:59:21 PM (9 years ago)
Author:
djay
Message:

Add otb2zcfg and OTB applications support without observer by now. Fix issue with maxOccurs and multiple downloaded value for the same input.

Location:
trunk
Files:
6 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/zoo-project/HISTORY.txt

    r546 r550  
     1Version 1.5.0-dev
     2  * Add Orfeo Toolbox support for applications as a service
     3  * Add the otb2zcfg utility to produce zcfg for otb applications
     4  * Fix maxOccurs handling
     5  * Fix gesture of downloaded inputs when multiple values are given
     6  * Add detection of generated_file key in outputs to read the file generated by a service
     7
    18Version 1.4.0
    29  * Small fix for mimeType of results for CGAL services
  • trunk/zoo-project/zoo-kernel/Makefile.in

    r527 r550  
    4545        g++ ${XML2CFLAGS} ${PYTHONCFLAGS} ${CFLAGS} -c service_internal_python.c
    4646
     47service_internal_otb.o: service_internal_otb.c service.h
     48        g++ ${OTBCFLAGS} ${CFLAGS} -c service_internal_otb.c
     49
     50otbRunner.o: otbRunner.cxx otbRunner.h service.h
     51        g++ ${OTBCFLAGS} ${CFLAGS} -c otbRunner.cxx
     52
     53otbZooWatcher.o: otbZooWatcher.cxx otbZooWatcher.h  service.h
     54        g++ ${OTBCFLAGS} ${CFLAGS} -c otbZooWatcher.cxx
     55
    4756service_internal_php.o: service_internal_php.c service.h
    4857        g++ -c ${XML2CFLAGS} ${PHPCFLAGS} ${CFLAGS}  ${PHP_ENABLED} service_internal_php.c
     
    6473
    6574zoo_service_loader.o: zoo_service_loader.c service.h
    66         g++ -g -O2 ${XML2CFLAGS} ${CFLAGS} ${PYTHONCFLAGS} ${JAVACFLAGS} ${JSCFLAGS} ${PERLCFLAGS} ${PHPCFLAGS} ${PYTHON_ENABLED} ${JS_ENABLED} ${PHP_ENABLED} ${PERL_ENABLED} ${JAVA_ENABLED} -c zoo_service_loader.c  -fno-common -DPIC -o zoo_service_loader.o
     75        g++ -g -O2 ${XML2CFLAGS} ${CFLAGS} ${OTBCFLAGS} ${PYTHONCFLAGS} ${JAVACFLAGS} ${JSCFLAGS} ${PERLCFLAGS} ${PHPCFLAGS} ${OTB_ENABLED} ${PYTHON_ENABLED} ${JS_ENABLED} ${PHP_ENABLED} ${PERL_ENABLED} ${JAVA_ENABLED} -c zoo_service_loader.c  -fno-common -DPIC -o zoo_service_loader.o
    6776
    68 zoo_loader.cgi: version.h zoo_loader.c zoo_service_loader.o  ulinet.o service.h lex.sr.o service_conf.tab.o service_conf.y ulinet.o main_conf_read.tab.o lex.cr.o service_internal.o ${MS_FILE} ${PYTHON_FILE} ${PHP_FILE} ${JAVA_FILE} ${JS_FILE} ${PERL_FILE} ${RUBY_FILE} ${YAML_FILE}
     77zoo_loader.cgi: version.h zoo_loader.c zoo_service_loader.o  ulinet.o service.h lex.sr.o service_conf.tab.o service_conf.y ulinet.o main_conf_read.tab.o lex.cr.o service_internal.o ${MS_FILE} ${PYTHON_FILE} ${PHP_FILE} ${JAVA_FILE} ${JS_FILE} ${PERL_FILE} ${RUBY_FILE} ${YAML_FILE} ${OTB_FILE}
    6978        g++ -g -O2 ${JSCFLAGS} ${PHPCFLAGS}  ${PERLCFLAGS} ${RUBYCFLAGS}  ${JAVACFLAGS} ${XML2CFLAGS} ${PYTHONCFLAGS} ${CFLAGS} -c zoo_loader.c  -fno-common -DPIC -o zoo_loader.o
    70         g++  ${JSCFLAGS} ${GDAL_CFLAGS} ${XML2CFLAGS} ${PHPCFLAGS} ${PERLCFLAGS} ${JAVACFLAGS} ${PYTHONCFLAGS} ${CFLAGS} zoo_loader.o zoo_service_loader.o service_internal.o ${MS_FILE} ${PYTHON_FILE}  ${PERL_FILE} ${PHP_FILE}  ${JS_FILE} ${JAVA_FILE} ${YAML_FILE} ulinet.o lex.cr.o lex.sr.o service_conf.tab.o main_conf_read.tab.o -o zoo_loader.cgi ${LDFLAGS}
     79        g++  ${JSCFLAGS} ${OTBCFLAGS} ${GDAL_CFLAGS} ${XML2CFLAGS} ${PHPCFLAGS} ${PERLCFLAGS} ${JAVACFLAGS} ${PYTHONCFLAGS} ${CFLAGS} zoo_loader.o zoo_service_loader.o service_internal.o ${MS_FILE} ${PYTHON_FILE}  ${PERL_FILE} ${PHP_FILE}  ${JS_FILE} ${JAVA_FILE} ${YAML_FILE} ${OTB_FILE} ulinet.o lex.cr.o lex.sr.o service_conf.tab.o main_conf_read.tab.o -o zoo_loader.cgi ${LDFLAGS}
    7180
    7281zcfg2yaml: zcfg2yaml.c  ulinet.o service.h lex.sr.o service_conf.tab.o service_conf.y ulinet.o main_conf_read.tab.o lex.cr.o service_internal.o ${MS_FILE} ${JS_FILE} ${RUBY_FILE}  ${YAML_FILE}
  • trunk/zoo-project/zoo-kernel/ZOOMakefile.opts.in

    r534 r550  
    6969PERL_FILE=@PERL_FILE@
    7070
     71OTBCFLAGS=@OTB_CPPFLAGS@
     72OTBLDFLAGS=@OTB_LDFLAGS@
     73OTB_ENABLED=@OTB_ENABLED@
     74OTB_FILE=@OTB_FILE@
     75
    7176CFLAGS=@DEB_DEF@ -fpic ${YAML_CFLAGS} ${MACOS_CFLAGS} ${MS_CFLAGS} -I../../thirds/cgic206 -I. -DLINUX_FREE_ISSUE #-DDEBUG #-DDEBUG_SERVICE_CONF
    72 LDFLAGS=-lcurl -L../../thirds/cgic206 -lcgic ${GDAL_LIBS} ${XML2LDFLAGS} ${PYTHONLDFLAGS} ${PERLLDFLAGS}  ${PHPLDFLAGS} ${JAVALDFLAGS} ${JSLDFLAGS} -lfcgi -lcrypto ${MS_LDFLAGS} ${MACOS_LD_FLAGS} ${MACOS_LD_NET_FLAGS} ${YAML_LDFLAGS}
     77LDFLAGS=-lcurl -L../../thirds/cgic206 -lcgic ${GDAL_LIBS} ${XML2LDFLAGS} ${PYTHONLDFLAGS} ${PERLLDFLAGS}  ${PHPLDFLAGS} ${JAVALDFLAGS} ${JSLDFLAGS} -lfcgi -lcrypto ${MS_LDFLAGS} ${MACOS_LD_FLAGS} ${MACOS_LD_NET_FLAGS} ${YAML_LDFLAGS} ${OTBLDFLAGS}
    7378
  • trunk/zoo-project/zoo-kernel/configure.ac

    r544 r550  
    1 AC_INIT([ZOO Kernel], [1.5.0], [bugs@zoo-project.org])
     1AC_INIT([ZOO Kernel], [1.5.0-dev], [bugs@zoo-project.org])
    22
    33# Checks for programs.
     
    8484
    8585# ===========================================================================
     86# Detect if otb is available
     87# ===========================================================================
     88
     89AC_ARG_WITH([otb],
     90        [AS_HELP_STRING([--with-otb=PATH], [specify an alternative location for the otb library])],
     91        [OTBPATH="$withval"], [OTBPATH=""])
     92
     93if test -z "$OTBPATH"
     94then
     95        OTB_LDFLAGS=""
     96        OTB_CPPFLAGS=""
     97        OTB_FILE=""
     98        OTB_ENABLED=""
     99else
     100
     101        OTB_ENABLED="-DUSE_OTB"
     102        OTB_LDFLAGS="-L$OTBPATH/lib/otb -lOTBIO -lOTBCommon -lOTBApplicationEngine -lITKBiasCorrection-4.5 -lITKCommon-4.5 -lITKIOImageBase-4.5 -lITKKLMRegionGrowing-4.5 -lITKLabelMap-4.5 -lITKMesh-4.5 -lITKMetaIO-4.5 -lITKOptimizers-4.5 -lITKPath-4.5 -lITKPolynomials-4.5 -lITKQuadEdgeMesh-4.5 -lITKSpatialObjects-4.5 -lITKStatistics-4.5 -lITKVNLInstantiation-4.5 -lITKWatersheds-4.5 -litkNetlibSlatec-4.5 -litksys-4.5 -litkdouble-conversion-4.5 -litkv3p_lsqr-4.5 -litkv3p_netlib-4.5 -litkvcl-4.5 -litkvnl-4.5 -litkvnl_algo-4.5 -litkzlib-4.5"
     103        OTB_CPPFLAGS="-I$OTBPATH/include/otb/ApplicationEngine -I$OTBPATH/include/otb/Common -I$OTBPATH/include/otb/Utilities/ITK -I$OTBPATH/include/otb/ -I$OTBPATH/include/otb/IO -I$OTBPATH/include/otb/UtilitiesAdapters/OssimAdapters -I$OTBPATH/include/otb/UtilitiesAdapters/CurlAdapters -I$OTBPATH/include/otb/Utilities/BGL -I$OTBPATH/include/otb/UtilitiesAdapters/ITKPendingPatches -I$OTBPATH/include/otb/Utilities/otbconfigfile"
     104        OTB_FILE="service_internal_otb.o" #otbZooWatcher.o otbRunner.o"
     105       
     106        AC_LANG_PUSH([C++])
     107        # Check headers file
     108        CPPFLAGS_SAVE="$CPPFLAGS"
     109        CPPFLAGS="$OTB_CPPFLAGS"
     110        LDFLAGS_SAVE="$LDFLAGS"
     111        LDFLAGS="$OTB_LDFLAGS"
     112        for i in otbWrapperApplication.h otbWrapperInputImageListParameter.h otbWrapperApplicationRegistry.h; do
     113            AC_CHECK_HEADERS([$i],
     114                        [], [AC_MSG_ERROR([could not find header file $i related to OTB])])
     115        done
     116        AC_LANG_POP([C++])
     117        ##,otbWrapperInputImageListParameter,otbFilterWatcherBase.h,itksys/SystemTools.hxx,itkCommand.h,itkProcessObject.h,itkTimeProbe.h
     118fi
     119AC_SUBST([OTB_CPPFLAGS])
     120AC_SUBST([OTB_LDFLAGS])
     121AC_SUBST([OTB_FILE])
     122AC_SUBST([OTB_ENABLED])
     123
     124# ===========================================================================
    86125# Detect if libyaml is available
    87126# ===========================================================================
    88127
    89128AC_ARG_WITH([yaml],
    90         [AS_HELP_STRING([--with-yaml=PATH], [specify an alternative location for the fastcgi library])],
     129        [AS_HELP_STRING([--with-yaml=PATH], [specify an alternative location for the yaml library])],
    91130        [YAMLPATH="$withval"], [YAMLPATH=""])
    92131
  • trunk/zoo-project/zoo-kernel/service.h

    r514 r550  
    566566  }
    567567
     568  static void loadMapBinary(map** out,map* in,int pos){
     569    map* size=getMap(in,"size");
     570    map *lout=*out;
     571    if(size!=NULL && pos>0){
     572      char tmp[11];
     573      sprintf(tmp,"size_%d",pos);
     574      size=getMap(in,tmp);
     575      sprintf(tmp,"value_%d",pos);
     576      map* tmpVin=getMap(in,tmp);
     577      map* tmpVout=getMap(lout,tmp);
     578      free(tmpVout->value);
     579      tmpVout->value=(char*)malloc((atoi(size->value)+1)*sizeof(char));
     580      memmove(tmpVout->value,tmpVin->value,atoi(size->value)*sizeof(char));
     581      tmpVout->value[atoi(size->value)]=0;
     582    }else{
     583      if(size!=NULL){
     584        map* tmpVin=getMap(in,"value");
     585        map* tmpVout=getMap(lout,"value");
     586        free(tmpVout->value);
     587        tmpVout->value=(char*)malloc((atoi(size->value)+1)*sizeof(char));
     588        memmove(tmpVout->value,tmpVin->value,atoi(size->value)*sizeof(char));
     589        tmpVout->value[atoi(size->value)]=0;
     590      }
     591    }
     592  }
     593 
     594  static void loadMapBinaries(map** out,map* in){
     595    map* size=getMap(in,"size");
     596    map* length=getMap(in,"length");
     597    if(length!=NULL){
     598      int len=atoi(length->value);
     599      int i=0;
     600      for(i=0;i<len;i++){
     601        loadMapBinary(out,in,i);
     602      }
     603    }
     604    else
     605      if(size!=NULL)
     606        loadMapBinary(out,in,-1);
     607    char* tmpSized=NULL;
     608   
     609  }
     610
    568611  static maps* dupMaps(maps** mo){
    569612    maps* _cursor=*mo;
     
    575618      res->next=NULL;
    576619      map* mc=_cursor->content;
    577       map* tmp=getMap(mc,"size");
    578       char* tmpSized=NULL;
    579       if(tmp!=NULL){
    580         map* tmpV=getMap(mc,"value");
    581         tmpSized=(char*)malloc((atoi(tmp->value)+1)*sizeof(char));
    582         memmove(tmpSized,tmpV->value,atoi(tmp->value)*sizeof(char));
    583       }
    584620      if(mc!=NULL){
    585621        addMapToMap(&res->content,mc);
    586       }
    587       if(tmp!=NULL){
    588         map* tmpV=getMap(res->content,"value");
    589         free(tmpV->value);
    590         tmpV->value=(char*)malloc((atoi(tmp->value)+1)*sizeof(char));
    591         memmove(tmpV->value,tmpSized,atoi(tmp->value)*sizeof(char));
    592         tmpV->value[atoi(tmp->value)]=0;
    593         free(tmpSized);
     622        loadMapBinaries(&res->content,mc);
    594623      }
    595624      res->next=dupMaps(&_cursor->next);
     
    643672    else
    644673      sprintf(tmp,"%s",key);
    645     map* tmpSize=getMapArray(m,(char*)"size",index);
     674    map* tmpSize=getMapArray(m,"size",index);
    646675    if(tmpSize!=NULL && strncasecmp(key,"value",5)==0){
    647676#ifdef DEBUG
     
    685714    }
    686715
    687     char *tmpV[8]={
     716    char *tmpV[11]={
    688717      (char*)"size",
    689718      (char*)"value",
    690719      (char*)"uom",
    691720      (char*)"Reference",
     721      (char*)"cache_file",
     722      (char*)"fmimeType",
    692723      (char*)"xlink:href",
    693724      typ,
    694725      (char*)"schema",
    695       (char*)"encoding"
     726      (char*)"encoding",
     727      (char*)"isCached"
    696728    };
    697729    sprintf(tmpLen,"%d",len+1);
    698730    addToMap(_cursor->content,"length",tmpLen);
    699731    int i=0;
    700     for(i=0;i<8;i++){
     732    for(i=0;i<11;i++){
    701733      map* tmpVI=getMap(tmp->content,tmpV[i]);
    702734      if(tmpVI!=NULL){
     
    704736        fprintf(stderr,"%s = %s\n",tmpV[i],tmpVI->value);
    705737#endif
    706         if(i<5)
     738        if(i<7)
    707739          setMapArray(_cursor->content,tmpV[i],len,tmpVI->value);
    708740        else
    709           if(strncasecmp(tmpV[5],"mimeType",8)==0)
     741          if(strncasecmp(tmpV[7],"mimeType",8)==0)
    710742            setMapArray(_cursor->content,tmpV[i],len,tmpVI->value);
    711743      }
  • trunk/zoo-project/zoo-kernel/service_conf.l

    r539 r550  
    4040chardata        [^<]*
    4141
    42 attname [a-zA-Z0-9_\-]+
    43 attvalue1       [\^\*\+,;@a-zA-Z0-9%_\-::.:" "\"\'/\\\(\)\t\|\$\&>\[\]]+
     42attname [a-zA-Z0-9._\-]+
     43attvalue1       [°²θé#\^\*\+,;@a-zA-Z0-9%_\-::.:" "\"\'/\\\(\)\t\|\$\&>\[\]]+
    4444
    4545attvalue                \"[^"]*\"|\'[^']*\'\(\)
  • trunk/zoo-project/zoo-kernel/service_internal.c

    r542 r550  
    24322432  nc1 = xmlNewNode(ns, BAD_CAST "ExceptionText");
    24332433  if(tmp!=NULL){
    2434     xmlNodeSetContent(nc1, BAD_CAST tmp->value);
     2434    xmlNodePtr txt=xmlNewText(BAD_CAST tmp->value);
     2435    xmlAddChild(nc1,txt);
    24352436  }
    24362437  else{
     
    24422443}
    24432444
     2445/************************************************************************/
     2446/*                          readGeneratedFile()                         */
     2447/************************************************************************/
     2448
     2449/**
     2450 * Read a file generated by a service.
     2451 *
     2452 * @param m the conf maps
     2453 * @param content the output item
     2454 * @param filename the file to read
     2455 */
     2456void readGeneratedFile(maps* m,map* content,char* filename){
     2457  FILE * file=fopen(filename,"rb");
     2458  fseek(file, 0, SEEK_END);
     2459  long count = ftell(file);
     2460  rewind(file);
     2461  struct stat file_status;
     2462  stat(filename, &file_status);
     2463  if(file==NULL){
     2464    fprintf(stderr,"Failed to open file %s for reading purpose.\n",filename);
     2465    setMapInMaps(m,"lenv","message","Unable to read produced file. Please try again later");
     2466    return ;
     2467  }
     2468  map* tmpMap1=getMap(content,"value");
     2469  if(tmpMap1==NULL){
     2470    addToMap(content,"value","");
     2471    tmpMap1=getMap(content,"value");
     2472  }
     2473  free(tmpMap1->value);
     2474  tmpMap1->value=(char*) malloc((count+1)*sizeof(char)); 
     2475  fread(tmpMap1->value,1,count*sizeof(char),file);
     2476  fclose(file);
     2477  char rsize[100];
     2478  sprintf(rsize,"%d",count*sizeof(char));
     2479  addToMap(tmpMap1,"size",rsize);
     2480}
    24442481
    24452482void outputResponse(service* s,maps* request_inputs,maps* request_outputs,
     
    25032540  }
    25042541 
     2542    if(res==SERVICE_FAILED){
     2543      map * errormap;
     2544      map *lenv;
     2545      lenv=getMapFromMaps(m,"lenv","message");
     2546      char *tmp0;
     2547      if(lenv!=NULL){
     2548        tmp0=(char*)malloc((strlen(lenv->value)+strlen(_("Unable to run the Service. The message returned back by the Service was the following: "))+1)*sizeof(char));
     2549        sprintf(tmp0,_("Unable to run the Service. The message returned back by the Service was the following: %s"),lenv->value);
     2550      }
     2551      else{
     2552        tmp0=(char*)malloc((strlen(_("Unable to run the Service. No more information was returned back by the Service."))+1)*sizeof(char));
     2553        sprintf(tmp0,_("Unable to run the Service. No more information was returned back by the Service."));
     2554      }
     2555      errormap = createMap("text",tmp0);
     2556      free(tmp0);
     2557      addToMap(errormap,"code", "InternalError");
     2558      dumpMap(errormap);
     2559      printExceptionReportResponse(m,errormap);
     2560      freeMap(&errormap);
     2561      free(errormap);
     2562      return;
     2563    }
     2564
    25052565
    25062566  if(asRaw==0){
     
    25212581#endif
    25222582        {
    2523         elements* in=getElements(s->outputs,tmpI->name);
    2524         char *format=NULL;
    2525         if(in!=NULL){
    2526           format=strdup(in->format);
    2527         }else
    2528           format=strdup("LiteralData");
    2529         if(strcasecmp(format,"BoundingBoxData")==0){
    2530           addToMap(tmpI->content,"extension","xml");
    2531           addToMap(tmpI->content,"mimeType","text/xml");
    2532           addToMap(tmpI->content,"encoding","UTF-8");
    2533           addToMap(tmpI->content,"schema","http://schemas.opengis.net/ows/1.1.0/owsCommon.xsd");
    2534         }
    2535         map *ext=getMap(tmpI->content,"extension");
    2536         map *tmp1=getMapFromMaps(m,"main","tmpPath");
    2537         char *file_name,*file_path;
    2538         bool hasExt=true;
    2539         if(ext==NULL){
    2540           // We can fallback to a default list of supported formats using
    2541           // mimeType information if present here. Maybe we can add more formats
    2542           // here.
    2543           // If mimeType was not found, we then set txt as the default extension
    2544           map* mtype=getMap(tmpI->content,"mimeType");
    2545           if(mtype!=NULL){
    2546             if(strcasecmp(mtype->value,"text/xml")==0)
    2547               ext=createMap("extension","xml");
    2548             else if(strcasecmp(mtype->value,"application/json")==0)
    2549               ext=createMap("extension","js");
    2550             else if(strncmp(mtype->value,"application/vnd.google-earth.kml",32)==0)
    2551               ext=createMap("extension","kml");
    2552             else if(strncmp(mtype->value,"image/",6)==0)
    2553               ext=createMap("extension",strstr(mtype->value,"/")+1);
    2554             else
    2555               ext=createMap("extension","txt");
     2583          elements* in=getElements(s->outputs,tmpI->name);
     2584          char *format=NULL;
     2585          if(in!=NULL){
     2586            format=strdup(in->format);
     2587          }else
     2588            format=strdup("LiteralData");
     2589          if(strcasecmp(format,"BoundingBoxData")==0){
     2590            addToMap(tmpI->content,"extension","xml");
     2591            addToMap(tmpI->content,"mimeType","text/xml");
     2592            addToMap(tmpI->content,"encoding","UTF-8");
     2593            addToMap(tmpI->content,"schema","http://schemas.opengis.net/ows/1.1.0/owsCommon.xsd");
    25562594          }
    2557           else
    2558             ext=createMap("extension","txt");
    2559           hasExt=false;
    2560         }
    2561         file_name=(char*)malloc((strlen(s->name)+strlen(ext->value)+strlen(tmpI->name)+1024)*sizeof(char));
    2562         int cpid0=cpid+time(NULL);
    2563         sprintf(file_name,"%s_%s_%i.%s",s->name,tmpI->name,cpid0,ext->value);
    2564         file_path=(char*)malloc((strlen(tmp1->value)+strlen(file_name)+2)*sizeof(char));
    2565         sprintf(file_path,"%s/%s",tmp1->value,file_name);
    2566         FILE *ofile=fopen(file_path,"wb");
    2567         if(ofile==NULL){
    2568           char tmpMsg[1024];
    2569           sprintf(tmpMsg,_("Unable to create the file : \"%s\" for storing the %s final result."),file_name,tmpI->name);
    2570           map * errormap = createMap("text",tmpMsg);
    2571           addToMap(errormap,"code", "InternalError");
    2572           printExceptionReportResponse(m,errormap);
    2573           freeMap(&errormap);
    2574           free(errormap);
     2595
     2596          map *tmp1=getMapFromMaps(m,"main","tmpPath");
     2597
     2598          map *gfile=getMap(tmpI->content,"generated_file");
     2599          char *file_name;
     2600          if(gfile!=NULL){
     2601            readGeneratedFile(m,tmpI->content,gfile->value);       
     2602            file_name=(char*)malloc((strlen(gfile->value)+strlen(tmp1->value)+1)*sizeof(char));
     2603            for(int i=0;i<strlen(gfile->value);i++)
     2604              file_name[i]=gfile->value[i+strlen(tmp1->value)];
     2605          }
     2606          else{
     2607            map *ext=getMap(tmpI->content,"extension");
     2608            char *file_path;
     2609            bool hasExt=true;
     2610            if(ext==NULL){
     2611              // We can fallback to a default list of supported formats using
     2612              // mimeType information if present here. Maybe we can add more formats
     2613              // here.
     2614              // If mimeType was not found, we then set txt as the default extension
     2615              map* mtype=getMap(tmpI->content,"mimeType");
     2616              if(mtype!=NULL) {
     2617                if(strncasecmp(mtype->value,"text/xml",8)==0)
     2618                  ext=createMap("extension","xml");
     2619                else if(strncasecmp(mtype->value,"application/zip",15)==0)
     2620                  ext=createMap("extension","zip");
     2621                else if(strncasecmp(mtype->value,"application/json",16)==0)
     2622                  ext=createMap("extension","js");
     2623                else if(strncmp(mtype->value,"application/vnd.google-earth.kml",32)==0)
     2624                  ext=createMap("extension","kml");
     2625                else if(strncmp(mtype->value,"image/",6)==0)
     2626                  ext=createMap("extension",strstr(mtype->value,"/")+1);
     2627                else
     2628                  ext=createMap("extension","txt");
     2629              }
     2630              else
     2631                ext=createMap("extension","txt");
     2632              hasExt=false;
     2633            }
     2634            file_name=(char*)malloc((strlen(s->name)+strlen(ext->value)+strlen(tmpI->name)+1024)*sizeof(char));
     2635            int cpid0=cpid+time(NULL);
     2636            sprintf(file_name,"%s_%s_%i.%s",s->name,tmpI->name,cpid0,ext->value);
     2637            file_path=(char*)malloc((strlen(tmp1->value)+strlen(file_name)+2)*sizeof(char));
     2638            sprintf(file_path,"%s/%s",tmp1->value,file_name);
     2639            FILE *ofile=fopen(file_path,"wb");
     2640            if(ofile==NULL){
     2641              char tmpMsg[1024];
     2642              sprintf(tmpMsg,_("Unable to create the file : \"%s\" for storing the %s final result."),file_name,tmpI->name);
     2643              map * errormap = createMap("text",tmpMsg);
     2644              addToMap(errormap,"code", "InternalError");
     2645              printExceptionReportResponse(m,errormap);
     2646              freeMap(&errormap);
     2647              free(errormap);
     2648              free(file_name);
     2649              free(file_path);
     2650              return;
     2651            }
     2652            free(file_path);
     2653            if(!hasExt){
     2654              freeMap(&ext);
     2655              free(ext);
     2656            }
     2657            toto=getMap(tmpI->content,"value");
     2658            if(strcasecmp(format,"BoundingBoxData")!=0){
     2659              map* size=getMap(tmpI->content,"size");
     2660              if(size!=NULL && toto!=NULL)
     2661                fwrite(toto->value,1,atoi(size->value)*sizeof(char),ofile);
     2662              else
     2663                if(toto!=NULL && toto->value!=NULL)
     2664                  fwrite(toto->value,1,strlen(toto->value)*sizeof(char),ofile);
     2665            }else{
     2666              printBoundingBoxDocument(m,tmpI,ofile);
     2667            }
     2668            fclose(ofile);
     2669
     2670          }
     2671          map *tmp2=getMapFromMaps(m,"main","tmpUrl");
     2672          map *tmp3=getMapFromMaps(m,"main","serverAddress");
     2673          char *file_url;
     2674          if(strncasecmp(tmp2->value,"http://",7)==0 ||
     2675             strncasecmp(tmp2->value,"https://",8)==0){
     2676            file_url=(char*)malloc((strlen(tmp2->value)+strlen(file_name)+2)*sizeof(char));
     2677            sprintf(file_url,"%s/%s",tmp2->value,file_name);
     2678          }else{
     2679            file_url=(char*)malloc((strlen(tmp3->value)+strlen(tmp2->value)+strlen(file_name)+3)*sizeof(char));
     2680            sprintf(file_url,"%s/%s/%s",tmp3->value,tmp2->value,file_name);
     2681          }
     2682          addToMap(tmpI->content,"Reference",file_url);
     2683          free(format);
    25752684          free(file_name);
    2576           free(file_path);
    2577           return;
    2578         }
    2579         free(file_path);
    2580         map *tmp2=getMapFromMaps(m,"main","tmpUrl");
    2581         map *tmp3=getMapFromMaps(m,"main","serverAddress");
    2582         char *file_url;
    2583         if(strncasecmp(tmp2->value,"http://",7)==0 ||
    2584            strncasecmp(tmp2->value,"https://",8)==0){
    2585           file_url=(char*)malloc((strlen(tmp2->value)+strlen(file_name)+2)*sizeof(char));
    2586           sprintf(file_url,"%s/%s",tmp2->value,file_name);
    2587         }else{
    2588           file_url=(char*)malloc((strlen(tmp3->value)+strlen(tmp2->value)+strlen(file_name)+3)*sizeof(char));
    2589           sprintf(file_url,"%s/%s/%s",tmp3->value,tmp2->value,file_name);
    2590         }
    2591         addToMap(tmpI->content,"Reference",file_url);
    2592         if(!hasExt){
    2593           freeMap(&ext);
    2594           free(ext);
    2595         }
    2596         toto=getMap(tmpI->content,"value");
    2597         if(strcasecmp(format,"BoundingBoxData")!=0){
    2598           map* size=getMap(tmpI->content,"size");
    2599           if(size!=NULL && toto!=NULL)
    2600             fwrite(toto->value,1,atoi(size->value)*sizeof(char),ofile);
    2601           else
    2602             if(toto!=NULL && toto->value!=NULL)
    2603               fwrite(toto->value,1,strlen(toto->value)*sizeof(char),ofile);
    2604         }else{
    2605           printBoundingBoxDocument(m,tmpI,ofile);
    2606         }
    2607         free(format);
    2608         fclose(ofile);
    2609         free(file_name);
    2610         free(file_url);
     2685          free(file_url);       
     2686         
    26112687        }
    26122688#ifdef USE_MS
     
    26282704                         request_inputs,
    26292705                         request_outputs);
    2630     }
    2631     else{
    2632       if(res==SERVICE_FAILED){
    2633         map * errormap;
    2634         map *lenv;
    2635         lenv=getMapFromMaps(m,"lenv","message");
    2636         char *tmp0;
    2637         if(lenv!=NULL){
    2638           tmp0=(char*)malloc((strlen(lenv->value)+strlen(_("Unable to run the Service. The message returned back by the Service was the following: "))+1)*sizeof(char));
    2639           sprintf(tmp0,_("Unable to run the Service. The message returned back by the Service was the following: %s"),lenv->value);
    2640         }
    2641         else{
    2642           tmp0=(char*)malloc((strlen(_("Unable to run the Service. No more information was returned back by the Service."))+1)*sizeof(char));
    2643           sprintf(tmp0,_("Unable to run the Service. No more information was returned back by the Service."));
    2644         }
    2645         errormap = createMap("text",tmp0);
    2646         free(tmp0);
    2647         addToMap(errormap,"code", "InternalError");
     2706  }
     2707  else{
     2708    /**
     2709     * We get the requested output or fallback to the first one if the
     2710     * requested one is not present in the resulting outputs maps.
     2711     */
     2712    maps* tmpI=NULL;
     2713    map* tmpIV=getMap(request_inputs1,"RawDataOutput");
     2714    if(tmpIV!=NULL){
     2715      tmpI=getMaps(request_outputs,tmpIV->value);
     2716    }
     2717    if(tmpI==NULL)
     2718      tmpI=request_outputs;
     2719    elements* e=getElements(s->outputs,tmpI->name);
     2720    if(e!=NULL && strcasecmp(e->format,"BoundingBoxData")==0){
     2721      printBoundingBoxDocument(m,tmpI,NULL);
     2722    }else{
     2723      map *gfile=getMap(tmpI->content,"generated_file");
     2724      if(gfile!=NULL){
     2725        readGeneratedFile(m,tmpI->content,gfile->value);
     2726      }
     2727      toto=getMap(tmpI->content,"value");
     2728      if(toto==NULL){
     2729        char tmpMsg[1024];
     2730        sprintf(tmpMsg,_("Wrong RawDataOutput parameter, unable to fetch any result for the name your provided : \"%s\"."),tmpI->name);
     2731        map * errormap = createMap("text",tmpMsg);
     2732        addToMap(errormap,"code", "InvalidParameterValue");
    26482733        printExceptionReportResponse(m,errormap);
    26492734        freeMap(&errormap);
     
    26512736        return;
    26522737      }
    2653       /**
    2654        * We get the requested output or fallback to the first one if the
    2655        * requested one is not present in the resulting outputs maps.
    2656        */
    2657       maps* tmpI=NULL;
    2658       map* tmpIV=getMap(request_inputs1,"RawDataOutput");
    2659       if(tmpIV!=NULL){
    2660         tmpI=getMaps(request_outputs,tmpIV->value);
    2661       }
    2662       if(tmpI==NULL)
    2663         tmpI=request_outputs;
    2664       elements* e=getElements(s->outputs,tmpI->name);
    2665       if(e!=NULL && strcasecmp(e->format,"BoundingBoxData")==0){
    2666         printBoundingBoxDocument(m,tmpI,NULL);
    2667       }else{
    2668         toto=getMap(tmpI->content,"value");
    2669         if(toto==NULL){
    2670           char tmpMsg[1024];
    2671           sprintf(tmpMsg,_("Wrong RawDataOutput parameter, unable to fetch any result for the name your provided : \"%s\"."),tmpI->name);
    2672           map * errormap = createMap("text",tmpMsg);
    2673           addToMap(errormap,"code", "InvalidParameterValue");
    2674           printExceptionReportResponse(m,errormap);
    2675           freeMap(&errormap);
    2676           free(errormap);
    2677           return;
    2678         }
    2679         map* fname=getMapFromMaps(tmpI,tmpI->name,"filename");
    2680         if(fname!=NULL)
    2681           printf("Content-Disposition: attachment; filename=\"%s\"\r\n",fname->value);
    2682         map* rs=getMapFromMaps(tmpI,tmpI->name,"size");
    2683         if(rs!=NULL)
    2684           printf("Content-Length: %s\r\n",rs->value);
    2685         printHeaders(m);
    2686         char mime[1024];
    2687         map* mi=getMap(tmpI->content,"mimeType");
    2688 #ifdef DEBUG
    2689         fprintf(stderr,"SERVICE OUTPUTS\n");
    2690         dumpMaps(request_outputs);
    2691         fprintf(stderr,"SERVICE OUTPUTS\n");
    2692 #endif
    2693         map* en=getMap(tmpI->content,"encoding");
    2694         if(mi!=NULL && en!=NULL)
     2738      map* fname=getMapFromMaps(tmpI,tmpI->name,"filename");
     2739      if(fname!=NULL)
     2740        printf("Content-Disposition: attachment; filename=\"%s\"\r\n",fname->value);
     2741      map* rs=getMapFromMaps(tmpI,tmpI->name,"size");
     2742      if(rs!=NULL)
     2743        printf("Content-Length: %s\r\n",rs->value);
     2744      printHeaders(m);
     2745      char mime[1024];
     2746      map* mi=getMap(tmpI->content,"mimeType");
     2747#ifdef DEBUG
     2748      fprintf(stderr,"SERVICE OUTPUTS\n");
     2749      dumpMaps(request_outputs);
     2750      fprintf(stderr,"SERVICE OUTPUTS\n");
     2751#endif
     2752      map* en=getMap(tmpI->content,"encoding");
     2753      if(mi!=NULL && en!=NULL)
     2754        sprintf(mime,
     2755                "Content-Type: %s; charset=%s\r\nStatus: 200 OK\r\n\r\n",
     2756                mi->value,en->value);
     2757      else
     2758        if(mi!=NULL)
    26952759          sprintf(mime,
    2696                   "Content-Type: %s; charset=%s\r\nStatus: 200 OK\r\n\r\n",
    2697                   mi->value,en->value);
     2760                  "Content-Type: %s; charset=UTF-8\r\nStatus: 200 OK\r\n\r\n",
     2761                  mi->value);
    26982762        else
    2699           if(mi!=NULL)
    2700             sprintf(mime,
    2701                     "Content-Type: %s; charset=UTF-8\r\nStatus: 200 OK\r\n\r\n",
    2702                     mi->value);
    2703           else
    2704             sprintf(mime,"Content-Type: text/plain; charset=utf-8\r\nStatus: 200 OK\r\n\r\n");
    2705         printf("%s",mime);
    2706         if(rs!=NULL)
    2707           fwrite(toto->value,1,atoi(rs->value),stdout);
    2708         else
    2709           fwrite(toto->value,1,strlen(toto->value),stdout);
    2710 #ifdef DEBUG
    2711         dumpMap(toto);
    2712 #endif
    2713       }
    2714     }
     2763          sprintf(mime,"Content-Type: text/plain; charset=utf-8\r\nStatus: 200 OK\r\n\r\n");
     2764      printf("%s",mime);
     2765      if(rs!=NULL)
     2766        fwrite(toto->value,1,atoi(rs->value),stdout);
     2767      else
     2768        fwrite(toto->value,1,strlen(toto->value),stdout);
     2769#ifdef DEBUG
     2770      dumpMap(toto);
     2771#endif
     2772    }
     2773  }
    27152774}
    27162775
     
    32203279    int index=0;
    32213280    while(content!=NULL){
    3222       if((tmp1=getMap(content->content,"href")) ||
    3223          (tmp1=getMap(content->content,"xlink:href"))){
    3224         if(getMap(content->content,"isCached")==NULL){
    3225           char* fcontent;
    3226           char *mimeType=NULL;
    3227           int fsize=0;
    3228 
    3229           fcontent=(char*)malloc((hInternet->ihandle[index].nDataLen+1)*sizeof(char));
    3230           if(fcontent == NULL){
    3231             return errorException(*m, _("Unable to allocate memory."), "InternalError",NULL);
     3281     
     3282      map* length=getMap(content->content,"length");
     3283      int shouldClean=-1;
     3284      if(length==NULL){
     3285        length=createMap("length","1");
     3286        shouldClean=1;
     3287      }
     3288      for(int i=0;i<atoi(length->value);i++){
     3289       
     3290        char* fcontent;
     3291        char *mimeType=NULL;
     3292        int fsize=0;
     3293        char cname[15];
     3294        char vname[11];
     3295        char vname1[11];
     3296        char sname[9];
     3297        char icname[14];
     3298        char xname[16];
     3299        if(index>0)
     3300          sprintf(vname1,"value_%d",index);
     3301        else
     3302          sprintf(vname1,"value");
     3303
     3304        if(i>0){
     3305          tmp1=getMap(content->content,cname);
     3306          sprintf(cname,"cache_file_%d",i);
     3307          sprintf(vname,"value_%d",i);
     3308          sprintf(sname,"size_%d",i);
     3309          sprintf(icname,"isCached_%d",i);
     3310          sprintf(xname,"Reference_%d",i);
     3311        }else{
     3312          sprintf(cname,"cache_file");
     3313          sprintf(vname,"value");
     3314          sprintf(icname,"isCached");
     3315          sprintf(sname,"size");
     3316          sprintf(xname,"Reference");
     3317        }
     3318
     3319        map* tmap=getMapFromMaps(*m,"orequests",vname1);
     3320        if((tmp1=getMap(content->content,xname))!=NULL && strcasecmp(tmap->value,tmp1->value)==0 ){
     3321          if(getMap(content->content,icname)==NULL){
     3322           
     3323            fcontent=(char*)malloc((hInternet->ihandle[index].nDataLen+1)*sizeof(char));
     3324            if(fcontent == NULL){
     3325              return errorException(*m, _("Unable to allocate memory."), "InternalError",NULL);
     3326            }
     3327            size_t dwRead;
     3328            InternetReadFile(hInternet->ihandle[index],
     3329                             (LPVOID)fcontent,
     3330                             hInternet->ihandle[index].nDataLen,
     3331                             &dwRead);
     3332            fcontent[hInternet->ihandle[index].nDataLen]=0;
     3333            fsize=hInternet->ihandle[index].nDataLen;
     3334            if(hInternet->ihandle[index].mimeType==NULL)
     3335              mimeType=strdup("none");
     3336            else
     3337              mimeType=strdup((char*)hInternet->ihandle[index].mimeType);
     3338           
     3339            map* tmpMap=getMapOrFill(&content->content,vname,"");
     3340            free(tmpMap->value);
     3341            tmpMap->value=(char*)malloc((fsize+1)*sizeof(char));
     3342            if(tmpMap->value==NULL){
     3343              return errorException(*m, _("Unable to allocate memory."), "InternalError",NULL);
     3344            }
     3345            memcpy(tmpMap->value,fcontent,(fsize+1)*sizeof(char));
     3346           
     3347            char ltmp1[256];
     3348            sprintf(ltmp1,"%d",fsize);
     3349            map* tmp=getMapFromMaps(*m,"main","cacheDir");
     3350            if(tmp!=NULL){
     3351              char* md5str=getMd5(tmp1->value);
     3352              char* fname=(char*)malloc(sizeof(char)*(strlen(tmp->value)+strlen(md5str)+6));
     3353              sprintf(fname,"%s/%s.zca",tmp->value,md5str);
     3354              addToMap(content->content,cname,fname);
     3355              free(fname);
     3356            }
     3357            addToMap(content->content,sname,ltmp1);
     3358            addToCache(*m,tmp1->value,fcontent,mimeType,fsize);
     3359            free(fcontent);
     3360            free(mimeType);
     3361            dumpMaps(content);
     3362            index++;
     3363
    32323364          }
    3233           size_t dwRead;
    3234           InternetReadFile(hInternet->ihandle[index],
    3235                            (LPVOID)fcontent,
    3236                            hInternet->ihandle[index].nDataLen,
    3237                            &dwRead);
    3238           fcontent[hInternet->ihandle[index].nDataLen]=0;
    3239           fsize=hInternet->ihandle[index].nDataLen;
    3240           if(hInternet->ihandle[index].mimeType==NULL)
    3241             mimeType=strdup("none");
    3242           else
    3243             mimeType=strdup((char*)hInternet->ihandle[index].mimeType);
    3244          
    3245           map* tmpMap=getMapOrFill(&content->content,"value","");
    3246           free(tmpMap->value);
    3247           tmpMap->value=(char*)malloc((fsize+1)*sizeof(char));
    3248           if(tmpMap->value==NULL){
    3249             return errorException(*m, _("Unable to allocate memory."), "InternalError",NULL);
    3250           }
    3251           memcpy(tmpMap->value,fcontent,(fsize+1)*sizeof(char));
    3252          
    3253           char ltmp1[256];
    3254           sprintf(ltmp1,"%d",fsize);
    3255           addToMap(content->content,"size",ltmp1);
    3256           addToCache(*m,tmp1->value,fcontent,mimeType,fsize);
    3257           free(fcontent);
    3258           free(mimeType);
    32593365        }
    3260         index++;
    3261       }
     3366      }
     3367      if(shouldClean>0){
     3368        freeMap(&length);
     3369        free(length);
     3370      }
     3371     
    32623372      content=content->next;
    32633373    }
     3374   
    32643375  }
    32653376}
     
    32743385  char *mimeType=NULL;
    32753386  int fsize=0;
     3387
     3388  map* t=getMap(*content,"xlink:href");
     3389  if(t==NULL){
     3390    t=getMap((*content),"href");
     3391    addToMap(*content,"xlink:href",url);
     3392  }
     3393
    32763394  if(cached!=NULL){
     3395
    32773396    struct stat f_status;
    32783397    int s=stat(cached, &f_status);
     
    32843403      fcontent[fsize]=0;
    32853404      fclose(f);
     3405      addToMap(*content,"cache_file",cached);
    32863406    }
    32873407    cached[strlen(cached)-1]='m';
     
    32943414      fclose(f);
    32953415    }
     3416
    32963417  }else{
    32973418    hInternet->waitingRequests[hInternet->nb]=strdup(url);
    32983419    InternetOpenUrl(hInternet,hInternet->waitingRequests[hInternet->nb],NULL,0,INTERNET_FLAG_NO_CACHE_WRITE,0);
     3420    maps *oreq=getMaps(*m,"orequests");
     3421    if(oreq==NULL){
     3422      oreq=(maps*)malloc(MAPS_SIZE);
     3423      oreq->name=zStrdup("orequests");
     3424      oreq->content=createMap("value",url);
     3425      oreq->next=NULL;
     3426      addMapsToMaps(m,oreq);
     3427      freeMaps(&oreq);
     3428      free(oreq);
     3429    }else{
     3430      setMapArray(oreq->content,"value",hInternet->nb-1,url);
     3431    }
    32993432    return 0;
    33003433  }
     
    33093442   
    33103443  free(tmpMap->value);
     3444
    33113445  tmpMap->value=(char*)malloc((fsize+1)*sizeof(char));
    33123446  if(tmpMap->value==NULL)
    33133447    return errorException(*m, _("Unable to allocate memory."), "InternalError",NULL);
    33143448  memcpy(tmpMap->value,fcontent,(fsize+1)*sizeof(char));
    3315  
     3449
    33163450  char ltmp1[256];
    33173451  sprintf(ltmp1,"%d",fsize);
    33183452  addToMap(*content,"size",ltmp1);
    3319   if(cached==NULL)
     3453  if(cached==NULL){
    33203454    addToCache(*m,url,fcontent,mimeType,fsize);
    3321   else
     3455  }
     3456  else{
    33223457    addToMap(*content,"isCached","true");
     3458
     3459    map* tmp=getMapFromMaps(*m,"main","cacheDir");
     3460    if(tmp!=NULL){
     3461      map *c=getMap((*content),"xlink:href");
     3462      char* md5str=getMd5(c->value);
     3463      char* fname=(char*)malloc(sizeof(char)*(strlen(tmp->value)+strlen(md5str)+6));
     3464      sprintf(fname,"%s/%s.zca",tmp->value,md5str);
     3465      addToMap(*content,"cache_file",fname);
     3466      free(fname);
     3467    }
     3468  }
    33233469  free(fcontent);
    33243470  free(mimeType);
  • trunk/zoo-project/zoo-kernel/service_internal.h

    r509 r550  
    120120#endif
    121121 
     122  void readGeneratedFile(maps*,map*,char*);
     123
    122124  void URLDecode(char *);
    123125  char *url_encode(char *);
  • trunk/zoo-project/zoo-kernel/service_internal_ms.c

    r492 r550  
    931931  sprintf(pszDataSource,"%s/ZOO_DATA_%s_%s.%s",tmpMap->value,outputs->name,sidMap->value,ext);
    932932  int f=zOpen(pszDataSource,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
     933  map *gfile=getMap(outputs->content,"generated_file");
     934  if(gfile!=NULL){
     935    readGeneratedFile(conf,outputs->content,gfile->value);         
     936  }
    933937  map* sizeMap=getMap(outputs->content,"size");
    934938  map* vData=getMap(outputs->content,"value");
  • trunk/zoo-project/zoo-kernel/zcfg2yaml.c

    r469 r550  
    2323 */
    2424
     25#include "service_internal.h"
    2526#include "service.h"
    26 #include "service_internal.h"
    2727
    2828extern   int getServiceFromFile(maps*,const char*,service**);
  • trunk/zoo-project/zoo-kernel/zoo_service_loader.c

    r541 r550  
    2323 */
    2424
    25 #define length(x) (sizeof(x) / sizeof(x[0]))
     25
    2626
    2727extern "C" int yylex ();
    2828extern "C" int crlex ();
     29
     30#ifdef USE_OTB
     31#include "service_internal_otb.h"
     32#else
     33#define length(x) (sizeof(x) / sizeof(x[0]))
     34#endif
    2935
    3036#include "cgic.h"
     
    177183          && atoi (testMap->value) > 1)
    178184        {
    179           if (addMapsArrayToMaps (&mo, mi, tmap->name) < 0)
     185          addMapsArrayToMaps (&mo, mi, tmap->name);
     186          map* nb=getMapFromMaps(mo,mi->name,"length");
     187          if (nb!=NULL && atoi(nb->value)>atoi(testMap->value))
    180188            {
    181189              char emsg[1024];
    182190              sprintf (emsg,
    183                        _
    184                        ("You set maximum occurences for <%s> as %i but you tried to use it more than the limit you set. Please correct your ZCFG file or your request."),
     191                       _("You set maximum occurences for <%s> as %i but you tried to use it more than the limit you set. Please correct your ZCFG file or your request."),
    185192                       mi->name, atoi (testMap->value));
    186193              errorException (m, emsg, "InternalError", NULL);
     
    609616    }
    610617  else
     618
     619#ifdef USE_OTB
     620  if (strncasecmp (r_inputs->value, "OTB", 6) == 0)
     621    {
     622      *eres =
     623        zoo_otb_support (&m, request_inputs, s1,
     624                            &request_input_real_format,
     625                            &request_output_real_format);
     626    }
     627  else
     628#endif
     629
    611630#ifdef USE_PYTHON
    612631  if (strncasecmp (r_inputs->value, "PYTHON", 6) == 0)
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