source: trunk/zoo-project/zoo-services/utils/status/service.c @ 467

Last change on this file since 467 was 467, checked in by djay, 10 years ago

Various fixes for tickets #93, #94, #95, #95, #96.

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc
File size: 5.9 KB
Line 
1/**
2 * Author : Gérald FENOY
3 *
4 * Copyright 2008-2009 GeoLabs SARL. All rights reserved.
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.h"
26#include "service_internal.h"
27
28extern "C" {
29#include <libxml/tree.h>
30#include <libxml/parser.h>
31#include <libxml/xpath.h>
32#include <libxml/xpathInternals.h>
33
34#include <libxslt/xslt.h>
35#include <libxslt/xsltInternals.h>
36#include <libxslt/transform.h>
37#include <libxslt/xsltutils.h>
38
39#include <dirent.h>
40
41  /**
42   * GetStatus ZOO Service :
43   * This service is used in the ZOO-Project to get information about Services
44   * running as background tasks. The service will first get the XML document
45   * cached by the ZOO-Kernel before calling effectively the Service, then
46   * will access the shared memory space created by the Kernel to extract the
47   * current status of the running Service. Using a simple XSL file it will
48   * finally produce the final ExecuteResponse including the updated
49   * percentCompleted attribute of the ProcessStarted node of the cached
50   * document if any (so if the Service is currently running) else it will
51   * return the final ExecuteResponse stored on the Server file system.
52   */
53#ifdef WIN32
54  __declspec(dllexport)
55#endif
56  int GetStatus(maps*& conf,maps*& inputs,maps*& outputs){
57    const char *params[4 + 1];
58    int xmlLoadExtDtdDefaultValue;
59    map* tmpMap=NULL,*tmpMmap=NULL, *tmpTmap=NULL;
60
61    tmpMap=getMapFromMaps(inputs,"sid","value");
62    tmpTmap=getMapFromMaps(conf,"main","tmpPath");
63    tmpMmap=getMapFromMaps(conf,"main","dataPath");
64    xmlInitParser();
65    struct dirent *dp;
66    DIR *dirp = opendir(tmpTmap->value);
67    char fileName[1024],xslFileName[1024];
68    int hasFile=-1;
69    if(dirp!=NULL){
70      char tmp[128];
71      sprintf(tmp,"_%s.xml",tmpMap->value);
72      while ((dp = readdir(dirp)) != NULL){
73#ifdef DEBUG
74        fprintf(stderr,"File : %s searched : %s\n",dp->d_name,tmp);
75#endif
76        if(strstr(dp->d_name,"final_")==0 && strstr(dp->d_name,tmp)!=0){
77          sprintf(fileName,"%s/%s",tmpTmap->value,dp->d_name);
78          hasFile=1;
79          break;
80        }
81      }
82    }else{
83      char tmp[1024];
84      snprintf(tmp,1024,_ss("GetStatus was unable to use the tmpPath value set in main.cfg file as directory %s."),tmpTmap->value);
85      setMapInMaps(conf,"lenv","message",tmp);
86      return SERVICE_FAILED;
87    }
88    if(hasFile<0){
89      char tmp[1024];
90      snprintf(tmp,1024,_ss("GetStatus was unable to find any cache file for Service ID %s."),tmpMap->value);
91      setMapInMaps(conf,"lenv","message",tmp);
92      return SERVICE_FAILED;
93    }
94    sprintf(xslFileName,"%s/updateStatus.xsl",tmpMmap->value);
95    xmlSubstituteEntitiesDefault(1);
96    xmlLoadExtDtdDefaultValue = 0;
97    xsltStylesheetPtr cur = NULL;
98    xmlDocPtr doc, res;
99    cur = xsltParseStylesheetFile(BAD_CAST xslFileName);
100    doc = xmlParseFile(fileName);
101    if(cur!=NULL && doc!=NULL){
102      /**
103       * Parse Status to extract Status / Message
104       */
105      char *tmpStr=getStatus(atoi(tmpMap->value));
106      if(tmpStr!=NULL && strncmp(tmpStr,"-1",2)!=0){
107        char *tmpStr1=strdup(tmpStr);
108        char *tmpStr0=strdup(strstr(tmpStr,"|")+1);
109        tmpStr1[strlen(tmpStr1)-strlen(tmpStr0)-1]='\0';
110        char *tmpStrFinal=(char*)malloc((strlen(tmpStr0)+11)*sizeof(char));
111        sprintf(tmpStrFinal,"string(\"%s\")",tmpStr0);
112        params[0]="value";
113        params[1]=tmpStr1;
114        params[2]="message";
115        params[3]=tmpStrFinal;
116        params[4]=NULL;
117        res = xsltApplyStylesheet(cur, doc, params);
118        xmlChar *xmlbuff;
119        int buffersize;
120        xmlDocDumpFormatMemory(res, &xmlbuff, &buffersize, 1);
121        setMapInMaps(outputs,"Result","value",(char*)xmlbuff);
122        xmlFree(xmlbuff);
123        free(tmpStr);
124        free(tmpStr1);
125        free(tmpStr0);
126        free(tmpStrFinal);
127      }else{
128        xmlChar *xmlbuff;
129        int buffersize;
130        xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1);
131        setMapInMaps(outputs,"Result","value",(char*)xmlbuff);
132        xmlFree(xmlbuff);
133      }
134    }
135    else{
136      char tmp[1024];
137      sprintf(tmp,_ss("ZOO GetStatus Service was unable to parse the cache xml file available for the Service ID %s."),tmpMap->value);
138      setMapInMaps(conf,"lenv","message",tmp);
139      return SERVICE_FAILED;
140    }
141    return SERVICE_SUCCEEDED;
142  }
143
144
145  /**
146   * longProcess ZOO Service :
147   * Simple Service which just loop over 100 times then return a welcome message
148   * string, at each step the service will sleep for one second.
149   */
150#ifdef WIN32
151  __declspec(dllexport)
152#endif
153  int longProcess(maps*& conf,maps*& inputs,maps*& outputs){
154    int i=0;
155    while(i<100){
156      char tmp[4];
157      char message[10];
158      sprintf(tmp,"%i",i);
159      map* tmpMap=NULL;
160      tmpMap=getMapFromMaps(conf,"lenv","sid");
161      if(tmpMap!=NULL)
162        fprintf(stderr,"Status %s %s\n",tmpMap->value,tmp);
163      sprintf(message,"Step %d",i);
164      setMapInMaps(conf,"lenv","status",tmp);
165      setMapInMaps(conf,"lenv","message",message);
166      updateStatus(conf);
167#ifndef WIN32
168      sleep(1);
169#else
170      Sleep(1000);
171#endif
172      i+=5;
173    }
174    setMapInMaps(outputs,"Result","value","\"Running long process successfully\"");
175    return SERVICE_SUCCEEDED;
176  }
177
178}
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