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