source: branches/branch-1.2/zoo-services/utils/status/service.c @ 245

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

Merge trunk r111:r216 into branch-1.2

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