Mercurial > repos > uga-galaxy-group > webservice_toolsuite_v1_1
comparison WebServiceExtensionsV1.1/WebServiceToolWorkflow_REST_SOAP/generateClient1.py~ @ 0:049760c677de default tip
Galaxy WSExtensions added successfully
author | uga-galaxy-group |
---|---|
date | Tue, 05 Jul 2011 19:34:18 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:049760c677de |
---|---|
1 ''' | |
2 @author Chaitanya Guttula, Sumedha Ganjoo | |
3 @see LICENSE (MIT style license file). | |
4 ''' | |
5 | |
6 import warnings | |
7 | |
8 with warnings.catch_warnings(): | |
9 warnings.simplefilter("ignore") | |
10 import platform | |
11 | |
12 from jpype._jpackage import JPackage | |
13 from jpype import * | |
14 import os.path | |
15 import sys | |
16 import string | |
17 from edit_tool_conf1 import * | |
18 from clientGenerator.msHandler import * | |
19 from clientGenerator.creatorEngineComplex import * | |
20 from clientGenerator.wsdl2path import * | |
21 from clientGenerator.paramConverter import * | |
22 | |
23 __author__="" | |
24 | |
25 #generates client for a web service to be used as standalone | |
26 class ClientGenerator1(object): | |
27 | |
28 def __init__(self,webservice,operation,outputfile,servicetype):#,url): | |
29 with warnings.catch_warnings(): | |
30 warnings.simplefilter("ignore") | |
31 self.webservice = webservice | |
32 self.operation = operation | |
33 self.inputs = outputfile | |
34 self.outputfile = outputfile | |
35 #self.url = url | |
36 | |
37 self.servicetype = servicetype | |
38 self.galaxyhome=os.environ.get('GALAXY_HOME') | |
39 self.clientfile = '' | |
40 if self.servicetype == 'SOAP': | |
41 wLoad=wsdlLoader() | |
42 sys.path.append(self.galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clientGenerator') | |
43 os.chdir(self.galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clientGenerator') | |
44 | |
45 a = str(self.webservice).split('/') | |
46 wsdlnamelist = a[len(a)-1].split(".") | |
47 if len(wsdlnamelist)==1: | |
48 wsdlnamelist=a[len(a)-1].split('?') | |
49 print wsdlnamelist | |
50 | |
51 foldername=wsdlnamelist[0] | |
52 | |
53 path =self.galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clientGenerator/'+foldername | |
54 | |
55 #creates the client stubs | |
56 self.clientfile = wLoad.wsdlUrl2path(str(self.webservice),foldername) | |
57 | |
58 print 'Client file : ',self.clientfile | |
59 self.paramelement = None | |
60 | |
61 | |
62 | |
63 ''' Replaces space (' ') with '**' in the given string ''' | |
64 def formatString(self,string): | |
65 l = string.split(' ') | |
66 return '**'.join(l) | |
67 | |
68 def isRequired(self,param): | |
69 #j=0 | |
70 #for param in inputl: | |
71 cc = ClientCreator() | |
72 self.msinstance = cc.opname2inputClassOb(self.operation,self.clientfile) | |
73 test = MessageHandler() | |
74 required = False | |
75 if (param.find('|$|')>-1): | |
76 plist = param.split('|') | |
77 #root = test.getParameter(self.msinstance(),plist[0]) | |
78 k = 0 | |
79 iparam = '' | |
80 for p in plist: | |
81 if(k<len(plist)-3): | |
82 if(k==0): | |
83 iparam = iparam+(p) | |
84 else: | |
85 iparam = iparam+'|'+p | |
86 k=k+1 | |
87 paramelement = test.getParameter(self.msinstance(),iparam) | |
88 else: | |
89 paramelement = test.getParameter(self.msinstance(),param) | |
90 self.paramelement = paramelement | |
91 if (param.find('|')>-1): | |
92 plist = param.split('|') | |
93 root = test.getParameter(self.msinstance(),plist[0]) | |
94 if not getattr(root,'nillable') and not getattr(paramelement,'nillable'): | |
95 required = True | |
96 return True | |
97 elif getattr(root,'nillable') or (not getattr(root,'nillable') and getattr(paramelement,'nillable')): | |
98 required = False | |
99 return False | |
100 else: | |
101 if not getattr(paramelement,'nillable'): | |
102 required = True | |
103 return True | |
104 elif getattr(paramelement,'nillable'): | |
105 required = False | |
106 return False | |
107 return required | |
108 | |
109 | |
110 #replace '**' with ' ' | |
111 def formatString(self,string): | |
112 l = string.split(' ') | |
113 return '**'.join(l) | |
114 | |
115 ''' | |
116 Checks if the tool(operation) is already addded to Galaxy. It opens the tool_conf.xml file and loops through the "Web Service Workflow Tools" sections | |
117 Then opens each and every tool (xml file) and looks for the description tag for the "Web Service" and "Client for Method" values and then checks | |
118 if it same as the opearation and web service. As the code is dependent on description of the toool xml fie, any change in the description | |
119 of the tool xml file can impact this function. | |
120 ''' | |
121 def isToolPresent(self): | |
122 | |
123 f = open(self.galaxyhome+'/tool_conf.xml','r') | |
124 line = f.readline() | |
125 linestripped = line.lstrip() | |
126 linestripped = linestripped.rstrip() | |
127 | |
128 while linestripped != '<section name="Select Web Service Tool" id="WebServices">': | |
129 line = f.readline() | |
130 linestripped = line.lstrip() | |
131 linestripped = linestripped.rstrip() | |
132 | |
133 line = f.readline() | |
134 linestripped = line.lstrip() | |
135 linestripped = linestripped.rstrip() | |
136 | |
137 while linestripped != '</section>': | |
138 if linestripped.find('<') >-1: | |
139 toolparts = linestripped.split('"') | |
140 print '\ntoolparts are : ',toolparts | |
141 f1 = open(self.galaxyhome+'/tools/'+toolparts[-2],'r') | |
142 line1 = f1.readline() | |
143 while not line1.find('<description>') >-1: | |
144 line1 = f1.readline() | |
145 | |
146 linestripped1 = line1.lstrip() | |
147 linestripped1 = linestripped1.rstrip() | |
148 descriptionparts=linestripped1.split(' ') | |
149 print '\nOperation : ',descriptionparts | |
150 service = '' | |
151 if(self.servicetype == 'SOAP'): | |
152 service = self.clientfile | |
153 elif self.servicetype == 'REST': | |
154 service = self.webservice | |
155 if(descriptionparts[5]==self.operation and descriptionparts[10] == service): | |
156 f.close() | |
157 f1.close() | |
158 return True | |
159 f1.close() | |
160 line = f.readline() | |
161 linestripped = line.lstrip() | |
162 linestripped = linestripped.rstrip() | |
163 | |
164 f.close() | |
165 return False | |
166 | |
167 | |
168 ''' | |
169 Creates a client file2 (xml file) for the given opertion in the SOAP web service | |
170 This operation is invokes standalone and is cannot be used in workflows | |
171 Then invokes another operation which adds this client file (tool) to the toolconfig.xml | |
172 under 'Web Service Tools' | |
173 | |
174 ''' | |
175 | |
176 def wsdlClient(self): | |
177 with warnings.catch_warnings(): | |
178 warnings.simplefilter("ignore") | |
179 wLoad=wsdlLoader() | |
180 galaxyhome=os.environ.get('GALAXY_HOME') | |
181 sys.path.append(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clientGenerator') | |
182 os.chdir(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clientGenerator') | |
183 | |
184 a= str(self.webservice).split('/') | |
185 wsdlnamelist = a[len(a)-1].split(".") | |
186 if len(wsdlnamelist)==1: | |
187 wsdlnamelist=a[len(a)-1].split('?') | |
188 print wsdlnamelist | |
189 | |
190 foldername=wsdlnamelist[0] | |
191 | |
192 path =galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clientGenerator/'+foldername | |
193 | |
194 #creates the client stubs | |
195 clientfile=wLoad.wsdlUrl2path(str(self.webservice),foldername) | |
196 | |
197 webservice = clientfile#sys.argv[4] | |
198 #operation = sys.argv[3] | |
199 outputfile=open(self.outputfile,'w') | |
200 test = ClientCreator() | |
201 inputs= test.opname2inputs(self.operation,webservice) | |
202 inputl = nested2flatDict(inputs) | |
203 inputlist = inputl.keys() | |
204 #noOfInputs=inputlist.count() | |
205 count =0 | |
206 if (len(inputs)==0): | |
207 inputs={' ':' '} | |
208 #inputlist=inputs.keys() | |
209 for i in inputlist: | |
210 if count==0: | |
211 outputfile.write(i+'\t'+webservice+'\t'+self.operation+'\n') | |
212 else: | |
213 outputfile.write(i+'\n') | |
214 count=count+1 | |
215 | |
216 | |
217 cc = ClientCreator() | |
218 self.msinstance = cc.opname2inputClassOb(self.operation,webservice) | |
219 | |
220 ##generate client's xml | |
221 galaxyhome=os.environ.get('GALAXY_HOME') | |
222 | |
223 #./clients/ClientCount.xml keeps the count of the clients/tools currently registered in Galaxy for Web service invocation. | |
224 #read the count and increment it. | |
225 | |
226 clientCountFile=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clients/ClientCount.xml','r') | |
227 clientCountFile.readline() | |
228 clientCountStr = clientCountFile.readline() | |
229 clientCount=string.atoi(clientCountStr) | |
230 clientCount=clientCount+1 | |
231 clientCountFile.close() | |
232 | |
233 clientCountFile=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clients/ClientCount.xml','w') | |
234 clientCountFile.write('<count> \n') | |
235 clientCountFile.write(str(clientCount)+'\n') | |
236 clientCountFile.write('</count> \n') | |
237 clientCountFile.close() | |
238 | |
239 clientName = 'WebServiceclient_'+ str(clientCount) | |
240 | |
241 clientXml=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clients/'+clientName+'.xml','w') | |
242 clientXml.seek(0,0) | |
243 | |
244 clientXml.write('<tool id="' + clientName+'" name="'+foldername+'.' + self.operation +'">\n') | |
245 clientXml.write(' <description> Client for operation : '+self.operation+' , Web service : '+webservice+' </description>\n') | |
246 | |
247 #Only Required parameters | |
248 clientXml.write(' <command interpreter="python">\n #if $cond_source.optional_param_source=="no" #client_1.py'+' $output $servicetype ' +webservice+' '+self.operation) | |
249 | |
250 #clientXml.write(' <command interpreter="python">\n client_1.py \n' +' $output \n ' +self.webservice+' \n '+self.operation+'\n') | |
251 ##write such that the parameters passed to client1.py(change name to clientName.py) are dependent on a for loop | |
252 test = MessageHandler() | |
253 j=0 | |
254 for param in inputl: | |
255 if self.isRequired(param): | |
256 clientXml.write(' "'+param+'"') | |
257 clientXml.write(' $param'+str(j)) | |
258 j=j+1 | |
259 | |
260 | |
261 #Both Required and optional paramters | |
262 clientXml.write(' #else #client_1.py'+' $output $servicetype ' +webservice+' '+self.operation+'\n') | |
263 | |
264 ''' | |
265 Required parameters - If the parameter is complex type (tree structure) then the the parameter is required | |
266 only if both the root node and the leaf node are required (i.e. both root and leaf have attribute nillable as false) | |
267 ''' | |
268 | |
269 j=0 | |
270 for param in inputl: | |
271 if self.isRequired(param): | |
272 clientXml.write(' "'+param+'"') | |
273 clientXml.write(' $param'+str(j)) | |
274 j=j+1 | |
275 | |
276 | |
277 ''' | |
278 Optional parameters - If the parameter is complex type (tree structure) then the the paramter is optional | |
279 if its root element is optional (i.e. root has attribute nillable as true) even if the leaf node (element) | |
280 is required (i.e. leaf element has attribute nillable as false) | |
281 ''' | |
282 for param in inputl: | |
283 if not self.isRequired(param): | |
284 clientXml.write(' "'+param+'"') | |
285 clientXml.write(' $param'+str(j)) | |
286 j=j+1 | |
287 | |
288 | |
289 #params for array type | |
290 # for param in self.inputs: | |
291 # paramelement = test.getParameter(self.msinstance(),param) | |
292 # if getattr(paramelement,'nillable')==True: | |
293 # if string.find(param,"|0|")>-1: | |
294 # ele = string(param,"|0|") | |
295 # for param in self.inputs: | |
296 | |
297 | |
298 # clientXml.write(' "'+param+'"') | |
299 # clientXml.write(' $cond_source.param' + str(j)) | |
300 # j=j+1 | |
301 | |
302 clientXml.write(' #end if \n</command>\n') | |
303 | |
304 | |
305 # for param in self.inputs: | |
306 # paramelement = test.getParameter(self.msinstance(),param) | |
307 # if getattr(paramelement,'nillable')==False or getattr(paramelement,'minOccurs')==1: | |
308 # clientXml.write(' "'+param+'"\n') | |
309 # clientXml.write(' $param'+str(j)+'\n') | |
310 # j=j+1 | |
311 | |
312 | |
313 #clientXml.write('</command>\n') | |
314 | |
315 #start writing inputs | |
316 ##write inputs depending on required or not. if not required den dont display | |
317 ##if required- den check default value, and if options exist.Depending on that | |
318 ##decide the type of parameter and options | |
319 ##The input servicetype tells what type of webservice it is wether SOAP or REST - Useful during invocation of the web servcie | |
320 clientXml.write(' <inputs>\n') | |
321 clientXml.write(' <param name="servicetype" type="hidden" value="SOAP" />\n') | |
322 | |
323 | |
324 j=0 | |
325 for param in inputl: | |
326 if self.isRequired(param): | |
327 pName = getattr(self.paramelement,'pname') | |
328 clientXml.write('<param format="text" size = "150" name = "param'+str(j)+'" ') | |
329 clientXml.write('type="text" label="Enter '+pName+'" help="see tip below" />\n') | |
330 j=j+1 | |
331 | |
332 clientXml.write('\n <conditional name="cond_source"> \n <param name="optional_param_source" type="select" label="Show Optional Parameters">\n <option value="no" selected="true">no</option> \n <option value="yes">yes</option> \n </param>\n') | |
333 clientXml.write('<when value="no"> \n </when>') | |
334 clientXml.write('<when value="yes"> \n') | |
335 | |
336 for param in inputl: | |
337 if not self.isRequired(param): | |
338 pName = getattr(self.paramelement,'pname') | |
339 clientXml.write('<param format="text" size = "150" name = "param'+str(j)+'" ') | |
340 clientXml.write('type="text" label="Enter '+pName+'" help="see tip below" />\n') | |
341 j=j+1 | |
342 | |
343 | |
344 clientXml.write('</when>\n</conditional>') | |
345 | |
346 # j=0 | |
347 # for param in self.inputs: | |
348 # paramelement = test.getParameter(self.msinstance(),param) | |
349 # if not getattr(paramelement,'nillable'): | |
350 # pName = getattr(paramelement,'pname')#param.getName() | |
351 # clientXml.write('<param format="text" size = "150" name = "param'+str(j)+'" ') | |
352 # clientXml.write('type="text" label="'+pName+'" help="see tip below" />\n') | |
353 # j=j+1 | |
354 | |
355 clientXml.write('</inputs>\n <outputs>\n <data format="tabular" name="output" />\n </outputs>\n') | |
356 | |
357 clientXml.write(' <help>\n') | |
358 paramtype = None | |
359 for param in inputl: | |
360 if self.isRequired(param): | |
361 if isinstance(self.paramelement,ZSI.TC.String): | |
362 paramtype = 'String' | |
363 elif isinstance(self.paramelement,ZSI.TCnumbers.FPfloat): | |
364 paramtype = 'Floating point' | |
365 elif isinstance(self.paramelement,ZSI.TC.Boolean): | |
366 paramtype = 'Boolean' | |
367 elif isinstance(self.paramelement,ZSI.TCnumbers.Iint): | |
368 paramtype = 'Integer' | |
369 clientXml.write('\n.. class:: infomark\n\n**TIP:** About '+ getattr(self.paramelement,'pname') +': type is ' + paramtype + '\n') | |
370 | |
371 | |
372 | |
373 | |
374 clientXml.write(' </help>\n</tool>') | |
375 | |
376 # clientXml.write(' <help>\n') | |
377 | |
378 # j=0 | |
379 # for param in params: | |
380 # clientXml.write('\n.. class:: infomark\n\n**TIP:** '+ param +' type is ' + paramTypes[j] +'\n') | |
381 | |
382 # clientXml.write(' </help>\n</tool>') | |
383 # clientXml.write('</tool>') | |
384 clientXml.close() | |
385 editor = editToolConfig1() | |
386 editor.addTool(clientName) | |
387 | |
388 ##later add help feature | |
389 | |
390 | |
391 def wadlClient(self): | |
392 ##parse wadl | |
393 pkg=JPackage('lsdis') | |
394 urlToPass=java.net.URL(self.webservice) | |
395 wadlUrl = self.webservice | |
396 | |
397 webserviceId = ''#self.operation | |
398 resUrl = self.operation | |
399 | |
400 urls = [] | |
401 methods = [] | |
402 params = [] | |
403 docs = [] | |
404 | |
405 WADLParserDriver=pkg.WADLParserDriver | |
406 wPD=WADLParserDriver() | |
407 wPD.parse(urlToPass) | |
408 urls = wPD.getUrl() | |
409 methods = wPD.getCompleteMethodList() | |
410 | |
411 #write into the output file information about the method and Web service to be invoked. | |
412 f=open(self.outputfile,'w') | |
413 f.write(self.webservice) | |
414 f.write('\n'+ resUrl) | |
415 | |
416 a= str(self.webservice).split('/') | |
417 wadlnamelist = a[len(a)-1].split(".") | |
418 if len(wadlnamelist)==1: | |
419 wadlnamelist=a[len(a)-1].split('?') | |
420 print wadlnamelist | |
421 | |
422 wadlname=wadlnamelist[0] | |
423 | |
424 | |
425 #get parameters for the selected method of the Web service | |
426 i=0 | |
427 for method in methods: | |
428 x = str(method.getId()) | |
429 y = str(urls.get(i)) | |
430 webserviceId = x | |
431 #if x==webserviceId: | |
432 if y == resUrl : | |
433 params = method.getRequest().getParams() | |
434 break | |
435 i=i+1 | |
436 | |
437 f.write('\n'+webserviceId) | |
438 galaxyhome=os.environ.get('GALAXY_HOME') | |
439 | |
440 methodname = resUrl.split('/') | |
441 | |
442 #./clients/ClientCount.xml keeps the count of the clients/tools currently registered in Galaxy for Web service invocation. | |
443 #read the count and increment it. | |
444 clientCountFile=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clients/ClientCount.xml','r') | |
445 clientCountFile.readline() | |
446 clientCountStr = clientCountFile.readline() | |
447 clientCount=string.atoi(clientCountStr) | |
448 clientCount=clientCount+1 | |
449 clientCountFile.close() | |
450 | |
451 clientCountFile=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clients/ClientCount.xml','w') | |
452 | |
453 clientCountFile.write('<count> \n') | |
454 clientCountFile.write(str(clientCount)+'\n') | |
455 clientCountFile.write('</count> \n') | |
456 | |
457 #include the count in the tool's name and id to uniquely identify it. | |
458 clientName = 'WebServiceclient_'+ str(clientCount) | |
459 | |
460 #create a new xml file under ./clients/ | |
461 clientXml=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clients/'+clientName+'.xml','w') | |
462 clientXml.seek(0,0) | |
463 | |
464 #write the tool id, name and description | |
465 clientXml.write('<tool id="' + clientName+'1" name="'+wadlname+'.' + methodname[-1] +' ">\n') | |
466 clientXml.write(' <description> Client for method : '+self.operation+' , Web service : '+self.webservice+' </description>\n') | |
467 | |
468 #the one-time invocation tool/client for a REST Web service invokes ./clients/client_1.py to invoke the Web service | |
469 #write the command tag to specify the arguments passed to this client_1.py | |
470 clientXml.write(' <command interpreter="python">\n #if $cond_source.optional_param_source=="no" #client_1.py'+' $output $servicetype ' +resUrl) | |
471 | |
472 j=0 | |
473 | |
474 for param in params: | |
475 if param.isRequired(): | |
476 clientXml.write(' '+self.formatString(param.getName())) | |
477 clientXml.write(' $param' + str(j)) | |
478 j=j+1 | |
479 clientXml.write(' #else #client_1.py'+' $output $servicetype ' +resUrl) | |
480 j=0 | |
481 for param in params: | |
482 if param.isRequired(): | |
483 clientXml.write(' '+self.formatString(param.getName())) | |
484 clientXml.write(' $param' + str(j)) | |
485 j=j+1 | |
486 | |
487 for param in params: | |
488 if not param.isRequired(): | |
489 clientXml.write(' '+self.formatString(param.getName())) | |
490 clientXml.write(' $cond_source.param' + str(j)) | |
491 j=j+1 | |
492 clientXml.write(' #end if \n</command>\n') | |
493 | |
494 #start writing inputs | |
495 ##write inputs depending on required or not. if not required den dont display | |
496 ##if required- den check default value, and if options exist.Depending on that | |
497 ##decide the type of parameter and options | |
498 ##The input servicetype tells what type of webservice it is wether SOAP or REST - Useful during invocation of the web servcie | |
499 clientXml.write(' <inputs>\n') | |
500 clientXml.write(' <param name="servicetype" type="hidden" value="REST" />') | |
501 | |
502 #create a param for each required parameter described in the WADL. Check if defaults and options are specified in the WADL | |
503 j=0 | |
504 for param in params: | |
505 if param.isRequired(): | |
506 pName = param.getName() | |
507 for doc in param.getDocs(): | |
508 if doc.getTitle()=="prompt" or doc.getTitle()=="Prompt" or doc.getTitle()=="PROMPT": | |
509 pName = doc.getInnerText() | |
510 if param.getOptions().size()==0: | |
511 clientXml.write('<param format="text" size = "150" name = "param'+str(j)+'" ') | |
512 if not param.getDefault1() == None: | |
513 clientXml.write('value="'+param.getDefault1()+'" ') | |
514 clientXml.write('type="text" label="Enter '+pName+'" help="see tip below" />\n') | |
515 j=j+1 | |
516 else: | |
517 clientXml.write('<param name="param'+str(j)+'" type="select" label="Select '+pName+'" help="see tip below">\n' ) | |
518 for option in param.getOptions(): | |
519 clientXml.write(' <option value="'+self.formatString(option.getName())+'" ') | |
520 if option.getName() == param.getDefault1(): | |
521 clientXml.write('selected="true"') | |
522 clientXml.write('>'+option.getName()+'</option>\n ') | |
523 clientXml.write(' </param> \n') | |
524 j=j+1 | |
525 | |
526 #create a conditional param for each optional parameter described in the WADL. | |
527 clientXml.write('\n <conditional name="cond_source"> \n <param name="optional_param_source" type="select" label="Show Optional Parameters">\n <option value="no" selected="true">no</option> \n <option value="yes">yes</option> \n </param>\n') | |
528 clientXml.write('<when value="no"> \n </when>') | |
529 clientXml.write('<when value="yes"> \n') | |
530 for param in params: | |
531 if not param.isRequired(): | |
532 pName = param.getName() | |
533 for doc in param.getDocs(): | |
534 if doc.getTitle()=="prompt" or doc.getTitle()=="Prompt" or doc.getTitle()=="PROMPT": | |
535 pName = doc.getInnerText() | |
536 if param.getOptions().size()==0: | |
537 clientXml.write('<param format="text" size = "150" name = "param'+str(j)+'" ') | |
538 if not param.getDefault1() == None: | |
539 clientXml.write('value="'+param.getDefault1()+'" ') | |
540 clientXml.write('type="text" label="Enter '+pName+'" help="see tip below" />\n') | |
541 j=j+1 | |
542 else: | |
543 clientXml.write('<param name="param'+str(j)+'" type="select" label="Select '+pName+'" help="see tip below">\n' ) | |
544 for option in param.getOptions(): | |
545 clientXml.write(' <option value="'+self.formatString(option.getName())+'" ') | |
546 if option.getName() == param.getDefault1(): | |
547 clientXml.write('selected="true"') | |
548 clientXml.write('>'+option.getName()+'</option>\n ') | |
549 clientXml.write(' </param> \n') | |
550 j=j+1 | |
551 | |
552 | |
553 clientXml.write('</when>\n</conditional>') | |
554 clientXml.write('</inputs>\n <outputs>\n <data format="tabular" name="output" />\n </outputs>\n') | |
555 | |
556 #write information about each parameter in the help section | |
557 clientXml.write(' <help>\n') | |
558 | |
559 clientXml.write('Replace white space with ** in all parameter values\n') | |
560 | |
561 for param in params: | |
562 if param.isRequired(): | |
563 pName = param.getName() | |
564 for doc in param.getDocs(): | |
565 if doc.getTitle()=="prompt" or doc.getTitle()=="Prompt" or doc.getTitle()=="PROMPT": | |
566 pName = doc.getInnerText() | |
567 clientXml.write('\n.. class:: infomark\n\n**TIP:** '+ pName +' type is ' + param.getType()+'\n') | |
568 | |
569 clientXml.write(' </help>\n</tool>') | |
570 | |
571 | |
572 #adds the newly created tool to tool_conf.xml in Galaxy under the 'Web Service Tools' section. | |
573 editor = editToolConfig1() | |
574 editor.addTool(clientName) | |
575 | |
576 ##later add help feature | |
577 | |
578 | |
579 def sawadlClient(self): | |
580 ##parse sawadl | |
581 javahome = os.environ.get('JAVA_HOME') | |
582 galaxyhome=os.environ.get('GALAXY_HOME') | |
583 classpath= galaxyhome + '/tools/WebServiceToolWorkflow_REST_SOAP/lib/SAWADLParser/bin' | |
584 jarpath = galaxyhome + '/tools/WebServiceToolWorkflow_REST_SOAP/lib/' | |
585 machine = platform.machine() | |
586 | |
587 #if machine == 'x86_64' : | |
588 # print 'a' | |
589 # startJVM("%s/jre/lib/amd64/server/libjvm.so" % javahome,"-ea", "-Djava.class.path=%s" % classpath,"-Djava.ext.dirs=%s" % jarpath) | |
590 #elif machine == 'i686' : | |
591 # print 'b' | |
592 # startJVM("%s/jre/lib/i386/server/libjvm.so" % javahome,"-ea", "-Djava.class.path=%s" % classpath,"-Djava.ext.dirs=%s" % jarpath) | |
593 #elif machine == 'sun4u' : | |
594 # startJVM("%s/jre/lib/sparc/server/libjvm.so" % javahome,"-ea", "-Djava.class.path=%s" % classpath,"-Djava.ext.dirs=%s" % jarpath) | |
595 #else : | |
596 # print 'c' | |
597 # System.exit("Could not identify machine, please specify path to libjvm.so") | |
598 | |
599 | |
600 pkg=JPackage('edu.uga.cs.lsdis.meteors.wadls') | |
601 pkgModel =JPackage('org.semanticweb.owlapi.model') | |
602 pkgApiBinding =JPackage('org.semanticweb.owlapi.apibinding') | |
603 pkgVocab = JPackage('org.semanticweb.owlapi.vocab') | |
604 | |
605 DOCUMENT_IRI = "http://cs.uga.edu/~ganjoo/galaxy/EDAM.owl" | |
606 | |
607 sawadlUrl = self.webservice | |
608 | |
609 webserviceId = ''#self.methodName | |
610 resUrl = self.operation | |
611 | |
612 urls = [] | |
613 methods = [] | |
614 params = [] | |
615 annotationSet = [] | |
616 | |
617 SAWADLParserDriver=pkg.SAWADLParserDriver | |
618 sawPD=SAWADLParserDriver() | |
619 sawPD.parse(sawadlUrl) | |
620 urls = sawPD.getUrl() | |
621 methods = sawPD.getCompleteMethodList() | |
622 | |
623 IRI = pkgModel.IRI | |
624 OWLRDFVocabulary = pkgVocab.OWLRDFVocabulary | |
625 OWLManager = pkgApiBinding.OWLManager | |
626 OWLLiteral = pkgModel.OWLLiteral | |
627 owlOntManager = OWLManager.createOWLOntologyManager() | |
628 ontology = owlOntManager.loadOntologyFromOntologyDocument(IRI.create(DOCUMENT_IRI)) | |
629 dataFactory = owlOntManager.getOWLDataFactory() | |
630 propertyComment = dataFactory.getOWLAnnotationProperty(OWLRDFVocabulary.RDFS_COMMENT.getIRI()) | |
631 | |
632 f=open(self.outputfile,'w') | |
633 f.write(sawadlUrl) | |
634 f.write(resUrl+'\t') | |
635 | |
636 | |
637 i=0 | |
638 for method in methods: | |
639 x = str(method.getName()) | |
640 y = str(urls.get(i)) | |
641 #if x == webserviceId : | |
642 webserviceId = x | |
643 if y == resUrl : | |
644 params = method.getRequest().getParamList() | |
645 break | |
646 i=i+1 | |
647 | |
648 f.write(webserviceId) | |
649 | |
650 | |
651 ##generate client's xml | |
652 galaxyhome=os.environ.get('GALAXY_HOME') | |
653 | |
654 #./clients/ClientCount.xml keeps the count of the clients/tools currently registered in Galaxy for Web service invocation. | |
655 #read the count and increment it. | |
656 | |
657 clientCountFile=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clients/ClientCount.xml','r') | |
658 clientCountFile.readline() | |
659 clientCountStr = clientCountFile.readline() | |
660 clientCount=string.atoi(clientCountStr) | |
661 clientCount=clientCount+1 | |
662 clientCountFile.close() | |
663 | |
664 clientCountFile=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clients/ClientCount.xml','w') | |
665 clientCountFile.write('<count> \n') | |
666 clientCountFile.write(str(clientCount)+'\n') | |
667 clientCountFile.write('</count> \n') | |
668 | |
669 clientName = 'WebServiceclient_'+ str(clientCount) | |
670 | |
671 clientXml=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clients/'+clientName+'.xml','w') | |
672 clientXml.seek(0,0) | |
673 | |
674 clientXml.write('<tool id="' + clientName+'1" name="' + webserviceId +'">\n') | |
675 clientXml.write(' <description> Client for method: '+webserviceId+' , Web service: '+self.webservice+' </description>\n') | |
676 | |
677 | |
678 clientXml.write(' <command interpreter="python">\n #if $cond_source.optional_param_source=="no" #client_1.py'+' $output $servicetype ' +resUrl) | |
679 ##write such that the parameters passed to client1.py(change name to clientName.py) are dependent on a for loop | |
680 | |
681 | |
682 j=0 | |
683 for param in params: | |
684 if param.getRequired()=='true' or param.getRequired()=='True' or param.getRequired()=='TRUE': | |
685 clientXml.write(' '+self.formatString(param.getName())+'\n') | |
686 clientXml.write(' $param' + str(j)+'\n') | |
687 j=j+1 | |
688 | |
689 clientXml.write(' #else #client_1.py'+' $output $servicetype ' +resUrl) | |
690 j=0 | |
691 for param in params: | |
692 if param.getRequired()=='true' or param.getRequired()=='True' or param.getRequired()=='TRUE': | |
693 clientXml.write(' '+self.formatString(param.getName())) | |
694 clientXml.write(' $param' + str(j)) | |
695 j=j+1 | |
696 | |
697 for param in params: | |
698 if not param.getRequired()=='true' and not param.getRequired()=='True' and not param.getRequired()=='TRUE': | |
699 clientXml.write(' '+self.formatString(param.getName())) | |
700 clientXml.write(' $cond_source.param' + str(j)) | |
701 j=j+1 | |
702 | |
703 clientXml.write('#end if \n </command>\n') | |
704 | |
705 #start writing inputs | |
706 ##write inputs depending on required or not. if not required den dont display | |
707 ##if required- den check default value, and if options exist.Depending on that | |
708 ##decide the type of parameter and options | |
709 ##The input param servicetype tells what type of webservice it is wether SOAP or REST - Useful during invocation of the web servcie | |
710 clientXml.write(' <inputs>\n') | |
711 cleintXml.write(' <param name="servicetype" type="hidden" value="REST"/>') | |
712 | |
713 j=0 | |
714 for param in params: | |
715 if param.getRequired()=='true' or param.getRequired()=='True' or param.getRequired()=='TRUE': | |
716 f.write('\n '+ param.getName() + ' options: '+str(param.getOptionvalue().size())) | |
717 if param.getOptionvalue().size()==0: | |
718 clientXml.write('<param format="text" size = "150" name = "param'+str(j)+'" ') | |
719 if not param.getDefault1() == None: | |
720 clientXml.write('value="'+param.getDefault1()+'" ') | |
721 clientXml.write('type="text" label="Enter '+param.getName()+'" help="see tip below" />\n') | |
722 j=j+1 | |
723 else: | |
724 clientXml.write('<param name="param'+str(j)+'" type="select" label="Select '+param.getName()+'" help="see tip below">\n' ) | |
725 for option in param.getOptionvalue(): | |
726 clientXml.write(' <option value="'+self.formatString(option)+'" ') | |
727 if option == param.getDefault1(): | |
728 clientXml.write('selected="true"') | |
729 clientXml.write('>'+option+'</option>\n ') | |
730 clientXml.write(' </param> \n') | |
731 j=j+1 | |
732 | |
733 | |
734 clientXml.write('\n <conditional name="cond_source"> \n <param name="optional_param_source" type="select" label="Display Optional Parameters">\n <option value="no" selected="true">no</option> \n <option value="yes">yes</option> \n </param>\n') | |
735 clientXml.write('<when value="no"> \n </when>') | |
736 clientXml.write('<when value="yes"> \n') | |
737 | |
738 for param in params: | |
739 if not param.getRequired()=='true' and not param.getRequired()=='True' and not param.getRequired()=='TRUE': | |
740 f.write('\n '+ param.getName() + ' options: '+str(param.getOptionvalue().size())) | |
741 if param.getOptionvalue().size()==0: | |
742 clientXml.write('<param format="text" size = "150" name = "param'+str(j)+'" ') | |
743 if not param.getDefault1() == None: | |
744 clientXml.write('value="'+param.getDefault1()+'" ') | |
745 clientXml.write('type="text" label="Enter '+param.getName()+'" help="see tip below" />\n') | |
746 j=j+1 | |
747 else: | |
748 clientXml.write('<param name="param'+str(j)+'" type="select" label="Select '+param.getName()+'" help="see tip below">\n' ) | |
749 for option in param.getOptionvalue(): | |
750 clientXml.write(' <option value="'+self.formatString(option)+'" ') | |
751 if option == param.getDefault1(): | |
752 clientXml.write('selected="true"') | |
753 clientXml.write('>'+option+'</option>\n ') | |
754 clientXml.write(' </param> \n') | |
755 j=j+1 | |
756 | |
757 clientXml.write('</when>\n</conditional>\n') | |
758 | |
759 clientXml.write('</inputs>\n <outputs>\n <data format="tabular" name="output" />\n </outputs>\n') | |
760 | |
761 clientXml.write(' <help>\n') | |
762 for param in params: | |
763 if param.getRequired()=='true' or param.getRequired()=='True' or param.getRequired()=='TRUE': | |
764 clientXml.write('\n.. class:: infomark\n\n**TIP:** About '+ param.getName() +': type is ' + param.getType()) | |
765 | |
766 modelRef = sawPD.getCompleteModelReference(param) | |
767 if not modelRef is None: | |
768 paramClass = dataFactory.getOWLClass(IRI.create(modelRef)); | |
769 annotationSet = paramClass.getAnnotations(ontology,propertyComment) | |
770 for annotation in annotationSet: | |
771 if isinstance(annotation.getValue(),OWLLiteral): | |
772 val = annotation.getValue() | |
773 if val.isOWLStringLiteral() and not val.isOWLTypedLiteral(): | |
774 print 'val.getLiteral()=' + val.getLiteral() | |
775 clientXml.write(', description from ontology is "' + val.getLiteral()+'"') | |
776 break | |
777 clientXml.write('\n') | |
778 clientXml.write(' </help>\n</tool>') | |
779 editor = editToolConfig1() | |
780 editor.addTool(clientName) | |
781 | |
782 ##later add help feature | |
783 | |
784 def wsdlRESTClient(self): | |
785 ##parse wadl | |
786 javahome = os.environ.get('JAVA_HOME') | |
787 galaxyhome=os.environ.get('GALAXY_HOME') | |
788 classpath= galaxyhome + '/tools/WebServiceToolWorkflow_REST_SOAP/WodenWSDLParser/bin' | |
789 jarpath = galaxyhome + '/tools/WebServiceToolWorkflow_REST_SOAP/WodenWSDLParser/lib/' | |
790 machine = platform.machine() | |
791 | |
792 if machine == 'x86_64' : | |
793 print 'a' | |
794 startJVM("%s/jre/lib/amd64/server/libjvm.so" % javahome,"-ea", "-Djava.class.path=%s" % classpath,"-Djava.ext.dirs=%s" % jarpath) | |
795 elif machine == 'i686' : | |
796 print 'b' | |
797 startJVM("%s/jre/lib/i386/server/libjvm.so" % javahome,"-ea", "-Djava.class.path=%s" % classpath,"-Djava.ext.dirs=%s" % jarpath) | |
798 elif machine == 'sun4u' : | |
799 startJVM("%s/jre/lib/sparc/server/libjvm.so" % javahome,"-ea", "-Djava.class.path=%s" % classpath,"-Djava.ext.dirs=%s" % jarpath) | |
800 else : | |
801 print 'c' | |
802 System.exit("Could not identify machine, please specify path to libjvm.so") | |
803 | |
804 | |
805 pkg=JPackage('lsdis') | |
806 wsdlUrl = self.webserviceId | |
807 | |
808 webserviceId = ''#self.methodName | |
809 resUrl = self.resourceName | |
810 | |
811 urls = [] | |
812 methods = [] | |
813 params = [] | |
814 paramTypes = [] | |
815 | |
816 WSDLParserDriver =pkg.WSDLParserDriver | |
817 wPD=WSDLParserDriver() | |
818 wPD.parse(wsdlUrl) | |
819 methods = wPD.getCompleteMethodList() | |
820 urls = wPD.getUrl() | |
821 | |
822 f=open(self.Ofile,'w') | |
823 f.write(wsdlUrl) | |
824 f.write('\n'+ resUrl) | |
825 f.write('\n'+webserviceId) | |
826 | |
827 | |
828 i=0 | |
829 for method in methods: | |
830 x = str(method.getName().getLocalPart()) | |
831 y = str(url.get(i)) | |
832 webserviceId = x | |
833 if y == resUrl : | |
834 wPD.getParameters(x) | |
835 f.write('method matched') | |
836 paramTypes = wPD.getParamTypeList() | |
837 params = wPD.getParamList() | |
838 break | |
839 i=i+1 | |
840 | |
841 | |
842 | |
843 | |
844 ##generate client's xml | |
845 galaxyhome=os.environ.get('GALAXY_HOME') | |
846 | |
847 clientCountFile=open(galaxyhome+'/tools/WebServiceTool/clients/ClientCount.xml','r') | |
848 clientCountFile.readline() | |
849 clientCountStr = clientCountFile.readline() | |
850 clientCount=string.atoi(clientCountStr) | |
851 clientCount=clientCount+1 | |
852 clientCountFile.close() | |
853 | |
854 clientCountFile=open(galaxyhome+'/tools/WebServiceTool/clients/ClientCount.xml','w') | |
855 clientCountFile.write('<count> \n') | |
856 clientCountFile.write(str(clientCount)+'\n') | |
857 clientCountFile.write('</count> \n') | |
858 | |
859 | |
860 | |
861 | |
862 clientName = 'WebServiceclient_'+ str(clientCount) | |
863 | |
864 clientXml=open(galaxyhome+'/tools/WebServiceTool/clients/'+clientName+'.xml','w') | |
865 clientXml.seek(0,0) | |
866 | |
867 clientXml.write('<tool id="' + clientName+'" name="' + webserviceId +'">\n') | |
868 clientXml.write(' <description> Client for method: '+webserviceId+' , Web service: '+self.webservice+' </description>\n') | |
869 | |
870 | |
871 clientXml.write(' <command interpreter="python">\n client_1.py \n'+' $output \n $servicetype\n ' +resUrl+'\n') | |
872 ##write such that the parameters passed to client1.py(change name to clientName.py) are dependent on a for loop | |
873 | |
874 j=0 | |
875 for param in params: | |
876 clientXml.write(' '+self.formatString(param)+'\n') | |
877 clientXml.write(' $param' + str(j)+'\n') | |
878 j=j+1 | |
879 clientXml.write('</command>\n') | |
880 | |
881 ##write inputs depending on required or not. if not required den dont display | |
882 ##if required- den check default value, and if options exist.Depending on that | |
883 ##decide the type of parameter and options | |
884 clientXml.write(' <inputs>\n') | |
885 cleintXml.write(' <param name="servicetype" type="hidden" value="REST"/>') | |
886 | |
887 j=0 | |
888 for param in params: | |
889 clientXml.write('<param format="text" size = "150" name = "param'+str(j)+'" ') | |
890 clientXml.write('type="text" label="'+param+'" help="see tip below" />\n') | |
891 j=j+1 | |
892 | |
893 | |
894 | |
895 clientXml.write('</inputs>\n <outputs>\n <data format="tabular" name="output" />\n </outputs>\n') | |
896 | |
897 clientXml.write(' <help>\n') | |
898 | |
899 clientXml.write('** Replace white with ** in all parameter values **\n') | |
900 | |
901 j=0 | |
902 for param in params: | |
903 clientXml.write('\n.. class:: infomark\n\n**TIP:** '+ param +' type is ' + paramTypes[j] +'\n') | |
904 | |
905 clientXml.write(' </help>\n</tool>') | |
906 editor = editToolConfig() | |
907 editor.addTool(clientName) | |
908 | |
909 ##later add help feature | |
910 | |
911 | |
912 # Addedfor testing purpose | |
913 | |
914 if __name__ == "__main__": | |
915 | |
916 test = ClientGenerator1('http://www.cs.uga.edu/~guttula/wublast.wsdl','run',None,'SOAP') | |
917 present = test.isToolPresent() | |
918 required = test.isRequired('_parameters|_sequence') | |
919 print 'required : ',required |