Ignore:
Timestamp:
Jul 26, 2011, 5:37:58 PM (13 years ago)
Author:
djay
Message:

Base of SOAP Envelope support. Primitive cache system. Solving bugs #45, #46, #47, #48, #50

File:
1 edited

Legend:

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

    r279 r280  
    371371#endif
    372372  int currId=-1;
     373  int currNode=-1;
    373374  if(nbNs==0){
    374375    nbNs++;
     
    403404  }
    404405  nbNs=0;
     406}
     407
     408xmlNodePtr soapEnvelope(maps* conf,xmlNodePtr n){
     409  map* soap=getMapFromMaps(conf,"main","isSoap");
     410  if(soap!=NULL && strcasecmp(soap->value,"true")==0){
     411    int lNbNs=nbNs;
     412    nsName[lNbNs]=strdup("soap");
     413    usedNs[lNbNs]=xmlNewNs(NULL,BAD_CAST "http://www.w3.org/2003/05/soap-envelope",BAD_CAST "soap");
     414    nbNs++;
     415    xmlNodePtr nr = xmlNewNode(usedNs[lNbNs], BAD_CAST "Envelope");
     416    nsName[nbNs]=strdup("soap");
     417    usedNs[nbNs]=xmlNewNs(nr,BAD_CAST "http://www.w3.org/2003/05/soap-envelope",BAD_CAST "soap");
     418    nbNs++;
     419    nsName[nbNs]=strdup("xsi");
     420    usedNs[nbNs]=xmlNewNs(nr,BAD_CAST "http://www.w3.org/2001/XMLSchema-instance",BAD_CAST "xsi");
     421    nbNs++;
     422    xmlNsPtr ns_xsi=usedNs[nbNs-1];
     423    xmlNewNsProp(nr,ns_xsi,BAD_CAST "schemaLocation",BAD_CAST "http://www.w3.org/2003/05/soap-envelope http://www.w3.org/2003/05/soap-envelope");
     424    xmlNodePtr nr1 = xmlNewNode(usedNs[lNbNs], BAD_CAST "Body");
     425    xmlAddChild(nr1,n);
     426    xmlAddChild(nr,nr1);
     427    return nr;
     428  }else
     429    return n;
    405430}
    406431
     
    719744  xmlAddChild(n,nc1);
    720745 
    721   xmlDocSetRootElement(doc, n);
     746  xmlNodePtr fn=soapEnvelope(m,n);
     747  xmlDocSetRootElement(doc, fn);
    722748  //xmlFreeNs(ns);
    723749  free(SERVICE_URL);
     
    779805  addLangAttr(n,m);
    780806
    781   xmlDocSetRootElement(doc, n);
     807  xmlNodePtr fn=soapEnvelope(m,n);
     808  xmlDocSetRootElement(doc, fn);
    782809
    783810  return n;
     
    10071034        }
    10081035    }
     1036
    10091037    _tmp=e->supported;
     1038    if(_tmp==NULL && datatype==0)
     1039      _tmp=e->defaults;
     1040
    10101041    int hasSupported=-1;
    10111042    while(_tmp!=NULL){
     
    10971128
    10981129void printProcessResponse(maps* m,map* request, int pid,service* serv,const char* service,int status,maps* inputs,maps* outputs){
    1099   xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
     1130  xmlNsPtr ns,ns1,ns_ows,ns_xlink,ns_xsi;
    11001131  xmlNodePtr nr,n,nc,nc1,nc2,nc3,pseudor;
    11011132  xmlDocPtr doc;
     
    11041135  time_t time1; 
    11051136  time(&time1);
     1137  nr=NULL;
    11061138  /**
    11071139   * Create the document and its temporary root.
     
    11101142  int wpsId=zooXmlAddNs(NULL,"http://www.opengis.net/wps/1.0.0","wps");
    11111143  ns=usedNs[wpsId];
    1112  
     1144
    11131145  n = xmlNewNode(ns, BAD_CAST "ExecuteResponse");
     1146  xmlNewNs(n,BAD_CAST "http://www.opengis.net/wps/1.0.0",BAD_CAST "wps");
    11141147  int owsId=zooXmlAddNs(n,"http://www.opengis.net/ows/1.1","ows");
    11151148  ns_ows=usedNs[owsId];
     
    11181151  int xsiId=zooXmlAddNs(n,"http://www.w3.org/2001/XMLSchema-instance","xsi");
    11191152  ns_xsi=usedNs[xsiId];
    1120   xmlNewNs(n,BAD_CAST "http://www.opengis.net/wps/1.0.0",BAD_CAST "wps");
    1121 
     1153 
    11221154  xmlNewNsProp(n,ns_xsi,BAD_CAST "schemaLocation",BAD_CAST "http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsExecute_response.xsd");
    11231155 
     
    11631195        sprintf(currentSid,"%s",tmp_lenv->value);
    11641196      if(tmpm==NULL || strcasecmp(tmpm->value,"false")==0){
    1165         sprintf(url,"%s/?request=Execute&service=WPS&version=1.0.0&Identifier=GetStatus&DataInputs=sid=%s&RawDataOutput=Result",tmpm1->value,currentSid);
     1197        sprintf(url,"%s?request=Execute&service=WPS&version=1.0.0&Identifier=GetStatus&DataInputs=sid=%s&RawDataOutput=Result",tmpm1->value,currentSid);
    11661198      }else{
    11671199        if(strlen(tmpm->value)>0)
     
    11801212    }
    11811213    if(tmpm1!=NULL)
    1182       sprintf(tmp,"%s/",tmpm1->value);
     1214      sprintf(tmp,"%s",tmpm1->value);
    11831215    tmpm1=getMapFromMaps(m,"main","TmpPath");
    11841216    sprintf(stored_path,"%s/%s_%i.xml",tmpm1->value,service,pid);
     
    13161348    while(mcursor!=NULL){
    13171349      scursor=getElements(serv->outputs,mcursor->name);
    1318       printIOType(doc,nc,ns,ns_ows,ns_xlink,scursor,mcursor,"Output");
     1350      if(scursor!=NULL){
     1351        printIOType(doc,nc,ns,ns_ows,ns_xlink,scursor,mcursor,"Output");
     1352      }
    13191353      mcursor=mcursor->next;
    13201354    }
     
    13241358  fprintf(stderr,"printProcessResponse 1 202\n");
    13251359#endif
    1326   xmlDocSetRootElement(doc, n);
     1360  nr=soapEnvelope(m,n);
     1361  xmlDocSetRootElement(doc, nr);
     1362
    13271363  if(hasStoredExecuteResponse==true){
    13281364    /* We need to write the ExecuteResponse Document somewhere */
     
    15371573          char tmp1[1024];
    15381574          sprintf(tmp1,"%d",strlen(toto->value));
    1539           rs=createMap("z",tmp1);
     1575          rs=createMap("size",tmp1);
    15401576          isSized=false;
    15411577        }
     
    15471583        }
    15481584      }
    1549       else if(tmp!=NULL){
    1550         if(strncmp(tmp->value,"text/js",4)==0 ||
    1551            strncmp(tmp->value,"application/js",14)==0)
     1585      else if(tmp2!=NULL){
     1586        if(strncmp(tmp2->value,"text/js",7)==0 ||
     1587           strncmp(tmp2->value,"application/json",16)==0)
    15521588          xmlAddChild(nc3,xmlNewCDataBlock(doc,BAD_CAST toto->value,strlen(toto->value)));
    1553         else
    1554           xmlAddChild(nc3,xmlNewText(BAD_CAST toto->value));
     1589        else{
     1590          if(strncmp(tmp2->value,"text/xml",8)==0 ||
     1591             strncmp(tmp2->value,"application/vnd.google-earth.kml",32)!=0){
     1592            xmlDocPtr doc =
     1593              xmlParseMemory(BAD_CAST toto->value,strlen(BAD_CAST toto->value));
     1594            xmlNodePtr ir = xmlDocGetRootElement(doc);
     1595            xmlAddChild(nc3,ir);
     1596          }
     1597          else
     1598            xmlAddChild(nc3,xmlNewText(BAD_CAST toto->value));
     1599        }
    15551600        xmlAddChild(nc2,nc3);
    15561601      }
     
    19612006  elements* tmpInputs=in;
    19622007  maps* out1=*out;
     2008  if(type==1){
     2009    while(out1!=NULL){
     2010      if(getElements(in,out1->name)==NULL)
     2011        return out1->name;
     2012      out1=out1->next;
     2013    }
     2014    out1=*out;
     2015  }
    19632016  while(tmpInputs!=NULL){
    19642017    maps *tmpMaps=getMaps(out1,tmpInputs->name);
     
    20902143      else
    20912144        addToMap(tmpMaps->content,"inRequest","true");
     2145
    20922146    }
    20932147    tmpInputs=tmpInputs->next;
     
    22442298 
    22452299}
     2300
     2301/**
     2302 * Cache a file for a given request
     2303 */
     2304void addToCache(maps* conf,char* request,char* content,int length){
     2305  map* tmp=getMapFromMaps(conf,"main","cacheDir");
     2306  if(tmp!=NULL){
     2307    char* fname=(char*)malloc(sizeof(char)*(strlen(tmp->value)+6));
     2308    sprintf(fname,"%s/list",tmp->value);
     2309    fprintf(stderr,"Cache list : %s\n",fname);
     2310    fflush(stderr);
     2311    struct stat f_status;
     2312    int s=stat(fname, &f_status);
     2313    /**
     2314     * If the file does not exist, create it
     2315     */
     2316    if(s<0){
     2317      FILE* f=fopen(fname,"w+");
     2318      if(f)
     2319        fclose(f);
     2320      s=stat(fname, &f_status);
     2321    }
     2322    if(f_status.st_size>=0){
     2323      FILE* f=fopen(fname,"a+");
     2324      char* foname=(char*)malloc(sizeof(char)*(strlen(tmp->value)+64));
     2325      sprintf(foname,"%s/%d.zca",tmp->value,f_status.st_size);
     2326      fprintf(stderr,"Cache file : %s\n",foname);
     2327      fflush(stderr);
     2328      FILE* fo=fopen(foname,"w+");
     2329      char *fcontent=(char*)malloc(sizeof(char)*(strlen(foname)+strlen(request)+3));
     2330      sprintf(fcontent,"%s|%s\n",request,foname);
     2331
     2332      fwrite(fcontent,sizeof(char),strlen(fcontent),f);
     2333      fwrite(content,sizeof(char),length,fo);
     2334      fclose(f);
     2335      fclose(fo);
     2336    }
     2337  }
     2338}
     2339
     2340char* isInCache(maps* conf,char* request){
     2341  map* tmp=getMapFromMaps(conf,"main","cacheDir");
     2342  if(tmp!=NULL){
     2343    char* fname=(char*)malloc(sizeof(char)*(strlen(tmp->value)+6));
     2344    sprintf(fname,"%s/list",tmp->value);
     2345    struct stat f_status;
     2346    int s=stat(fname, &f_status);
     2347    if(s==0){
     2348      char* fcontent=(char*)malloc(sizeof(char)*(f_status.st_size+1));
     2349      FILE* f=fopen(fname,"r");
     2350      fread(fcontent,sizeof(char),f_status.st_size,f);
     2351      char *tmp,*svt;
     2352      tmp=strtok_r(fcontent,"\n",&svt);
     2353      int lin=0;
     2354      while(tmp!=NULL){
     2355        char *tmp1,*svt1;
     2356        tmp1=strtok_r(tmp,"|",&svt1);
     2357        int hv=-1;
     2358        while(tmp1!=NULL){
     2359          fprintf(stderr,"%s %s\n",tmp1,request);
     2360          if(hv>0)
     2361            return tmp1;
     2362          if(strcasecmp(tmp1,request)==0)
     2363            hv=1;
     2364          tmp1=strtok_r(NULL,"|",&svt1);
     2365        }
     2366        lin++;
     2367        tmp = strtok_r(NULL,"\n",&svt);
     2368      }
     2369      fclose(f);
     2370    }
     2371  }
     2372  return NULL;
     2373}
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