Mercurial > repos > uga-galaxy-group > webservice_toolsuite_v1_1
diff WebServiceExtensionsV1.1/WebServiceToolWorkflow_REST_SOAP/generateClient.py~ @ 0:049760c677de default tip
Galaxy WSExtensions added successfully
author | uga-galaxy-group |
---|---|
date | Tue, 05 Jul 2011 19:34:18 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebServiceExtensionsV1.1/WebServiceToolWorkflow_REST_SOAP/generateClient.py~ Tue Jul 05 19:34:18 2011 -0400 @@ -0,0 +1,864 @@ +''' +@author Chaitanya Guttula, Sumedha Ganjoo +@see LICENSE (MIT style license file). +''' + +import warnings + +with warnings.catch_warnings(): + warnings.simplefilter("ignore") + import platform + + from jpype._jpackage import JPackage + from jpype import * + import os.path + import sys + import string + from edit_tool_conf import * + from clientGenerator.msHandler import * + from clientGenerator.creatorEngineComplex import * + from clientGenerator.wsdl2path import * + from clientGenerator.paramConverter import * + + +class ClientGenerator(object): + + #instantiate a client for invocation of the selected method of a Web service in workflows + def __init__(self,webservice,operation,outputfile,servicetype): + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + self.operation = operation + self.webservice = webservice + #self.inputs = outputfile + self.outputfile = outputfile + self.galaxyhome=os.environ.get('GALAXY_HOME') + self.clientfile = '' + self.servicetype = servicetype + if self.servicetype == 'SOAP': + wLoad=wsdlLoader() + sys.path.append(self.galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clientGenerator') + os.chdir(self.galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clientGenerator') + + a = str(self.webservice).split('/') + wsdlnamelist = a[len(a)-1].split(".") + if len(wsdlnamelist)==1: + wsdlnamelist=a[len(a)-1].split('?') + print wsdlnamelist + + foldername=wsdlnamelist[0] + + path =self.galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clientGenerator/'+foldername + + #creates the client stubs + self.clientfile = wLoad.wsdlUrl2path(str(self.webservice),foldername) + + print 'Client file : ',self.clientfile + self.paramelement = None + + #replace '__tilda__' with '~' + #if(url.find('__tilda__')>-1): + # ulist = url.split('__tilda__') + #url = '~'.join(ulist) + #self.url = url + + ''' + Checks if a particular paramter is reuired or not. This is used only for soap web services. + ''' + def isRequired(self,param): + #j=0 + #for param in inputl: + cc = ClientCreator() + self.msinstance = cc.opname2inputClassOb(self.operation,self.clientfile) + test = MessageHandler() + required = False + if (param.find('|$|')>-1): + plist = param.split('|') + #root = test.getParameter(self.msinstance(),plist[0]) + k = 0 + iparam = '' + for p in plist: + if(k<len(plist)-3): + if(k==0): + iparam = iparam+(p) + else: + iparam = iparam+'|'+p + k=k+1 + paramelement = test.getParameter(self.msinstance(),iparam) + else: + paramelement = test.getParameter(self.msinstance(),param) + self.paramelement = paramelement + if (param.find('|')>-1): + plist = param.split('|') + root = test.getParameter(self.msinstance(),plist[0]) + if not getattr(root,'nillable') and not getattr(paramelement,'nillable'): + required = True + return True + elif getattr(root,'nillable') or (not getattr(root,'nillable') and getattr(paramelement,'nillable')): + required = False + return False + else: + if not getattr(paramelement,'nillable'): + required = True + return True + elif getattr(paramelement,'nillable'): + required = False + return False + return required + + + #replace '**' with ' ' + def formatString(self,string): + l = string.split(' ') + return '**'.join(l) + + ''' + 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 + 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 + 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 + of the tool xml file can impact this function. + ''' + def isToolPresent(self): + + f = open(self.galaxyhome+'/tool_conf.xml','r') + line = f.readline() + linestripped = line.lstrip() + linestripped = linestripped.rstrip() + + while linestripped != '<section name="Select Web Service Workflow Tool" id="WebServiceWorkflow">': + line = f.readline() + linestripped = line.lstrip() + linestripped = linestripped.rstrip() + + line = f.readline() + linestripped = line.lstrip() + linestripped = linestripped.rstrip() + + while linestripped != '</section>': + if linestripped.find('<') >-1: + toolparts = linestripped.split('"') + print '\ntoolparts are : ',toolparts + f1 = open(self.galaxyhome+'/tools/'+toolparts[-2],'r') + line1 = f1.readline() + while not line1.find('<description>') >-1: + line1 = f1.readline() + + linestripped1 = line1.lstrip() + linestripped1 = linestripped1.rstrip() + descriptionparts=linestripped1.split(' ') + print '\nOperation : ',descriptionparts + service = '' + if(self.servicetype == 'SOAP'): + service = self.clientfile + elif self.servicetype == 'REST': + service = self.webservice + print 'Service : ',service + print 'operation : ',self.operation + if(descriptionparts[5]==self.operation and descriptionparts[10] == service): + f.close() + f1.close() + return True + f1.close() + line = f.readline() + linestripped = line.lstrip() + linestripped = linestripped.rstrip() + + f.close() + return False + + + + def wsdlClient(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + + wLoad=wsdlLoader() + galaxyhome=os.environ.get('GALAXY_HOME') + sys.path.append(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clientGenerator') + os.chdir(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clientGenerator') + + a = str(self.webservice).split('/') + wsdlnamelist = a[len(a)-1].split(".") + if len(wsdlnamelist)==1: + wsdlnamelist=a[len(a)-1].split('?') + print wsdlnamelist + + foldername=wsdlnamelist[0] + + path =galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clientGenerator/'+foldername + + #creates the client stubs + clientfile=wLoad.wsdlUrl2path(str(self.webservice),foldername) + + webservice = clientfile + outputfile=open(self.outputfile,'w') + test = ClientCreator() + print 'inputs of '+self.operation+':\n' + inputs= test.opname2inputs(self.operation,webservice) + inputl = nested2flatDict(inputs) + inputlist = inputl.keys() + #noOfInputs=inputlist.count() + print '*',inputs,'\n' + count =0 + if (len(inputs)==0): + inputs={' ':' '} + #inputlist=inputs.keys() + for i in inputlist: + if count==0: + outputfile.write(i+'\t'+webservice+'\t'+self.operation+'\n') + else: + outputfile.write(i+'\n') + count=count+1 + + cc = ClientCreator() + self.msinstance = cc.opname2inputClassOb(self.operation,webservice) + galaxyhome=os.environ.get('GALAXY_HOME') + + clientCountFile=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/workflowclients/ClientCount.xml','r') + clientCountFile.readline() + clientCountStr = clientCountFile.readline() + + clientCount=string.atoi(clientCountStr) + clientCount=clientCount+1 + clientCountFile.close() + + clientCountFile=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/workflowclients/ClientCount.xml','w') + clientCountFile.write('<count> \n') + clientCountFile.write(str(clientCount)+'\n') + clientCountFile.write('</count> \n') + clientCountFile.close() + + + + + clientName = 'workflowclient_'+ str(clientCount) + + clientXml=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/workflowclients/'+clientName+'.xml','w') + clientXml.seek(0,0) + + clientXml.write('<tool id="' + clientName+'" name="'+foldername+'.' + self.operation +'">\n') + clientXml.write(' <description> Client for operation : '+self.operation+' , Web service : '+webservice+' </description>\n') + + + #clientXml.write(' <command interpreter="python">\n client_1.py \n' +' $output \n ' +self.webservice+' \n '+self.operation+'\n') + + test = MessageHandler() + + #the workflow tool/client for a REST Web service invokes ./workflowclients/client_1.py to invoke the Web service + #write the command tag to specify the arguments passed to this client_1.py + + 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') + ##write such that the parameters passed to client_1.py(change name to clientName.py) are dependent on a for loop + + # The paramter having |$| means that it has an elemnet with maxoccurs='unbounded' (i.e. array of strings) + + j=0 + for param in inputl: + if self.isRequired(param): + 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') + j=j+1 + + clientXml.write(' #else:\n $output\n $servicetype\n $url\n $method\n' +webservice+' '+self.operation+'\n') + + j=0 + for param in inputl: + if self.isRequired(param): + 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') + j=j+1 + + for param in inputl: + if not self.isRequired(param): + 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') + j=j+1 + + + clientXml.write(' #end if\n') + + clientXml.write('</command>\n') + + #start writing inputs + ##write inputs depending on required or not. if not required den dont display + ##if required- den check default value, and if options exist.Depending on that + ##decide the type of parameter and options + ##The input servicetype tells what type of webservice it is wether SOAP or REST - Useful during invocation of the web servcie + clientXml.write(' <inputs>\n') + clientXml.write(' <param name="servicetype" type="hidden" value="SOAP" />\n') + clientXml.write(' <param name="url" type="hidden" value="'+self.webservice+'" />\n') + clientXml.write(' <param name="method" type="hidden" value="'+self.operation+'" />\n') + + j=0 + for param in inputl: + if self.isRequired(param): + pName = getattr(self.paramelement,'pname') + + 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') + clientXml.write(' <param format="text" size = "150" name = "user_param'+str(j)+'" ') + clientXml.write('type="text" label="Enter '+pName+'" help="see tip below" />\n') + # clientXml.write(' </param> \n') + clientXml.write(' </when>\n') + clientXml.write(' <when value="cached">\n <param name = "cached_param'+ str(j)+'" type="data" label="' + pName + '"/> \n </when>\n </conditional>') + j=j+1 + + + 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') + + for param in inputl: + if not self.isRequired(param): + pName = getattr(self.paramelement,'pname') + + 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">') + clientXml.write('<param format="text" size = "150" name = "user_param'+str(j)+'" ') + clientXml.write('type="text" label="Enter '+pName+'" help="see tip below" />\n') + clientXml.write(' </when>\n') + clientXml.write('<when value="cached">\n <param name = "cached_param'+ str(j)+'" type="data" label="' + pName + '"/> \n </when>\n </conditional>\n') + j=j+1 + + + clientXml.write(' </when>\n </conditional>\n') + + clientXml.write('</inputs>\n <outputs>\n <data format="tabular" name="output" />\n </outputs>\n') + clientXml.write(' <help>\n') + paramtype = None + for param in inputl: + if self.isRequired(param): + if isinstance(self.paramelement,ZSI.TC.String): + paramtype = 'String' + elif isinstance(self.paramelement,ZSI.TCnumbers.FPfloat): + paramtype = 'Floating point' + elif isinstance(self.paramelement,ZSI.TC.Boolean): + paramtype = 'Boolean' + elif isinstance(self.paramelement,ZSI.TCnumbers.Iint): + paramtype = 'Integer' + clientXml.write('\n.. class:: infomark\n\n**TIP:** About '+ getattr(self.paramelement,'pname') +': type is ' + paramtype + '\n') + + + clientXml.write(' </help>\n</tool>') + +# clientXml.write(' <help>\n') + + # j=0 + # for param in params: + # clientXml.write('\n.. class:: infomark\n\n**TIP:** '+ param +' type is ' + paramTypes[j] +'\n') + + # clientXml.write(' </help>\n</tool>') + # clientXml.write('</tool>') + clientXml.close() + editor = editToolConfig() + editor.addTool(clientName) + + ##later add help feature + + + + def wadlClient(self): + + ##parse wadl + pkg=JPackage('lsdis') + urlToPass=java.net.URL(self.webservice) + wadlUrl = self.webservice + + webserviceId = ''#self.operation + resUrl = self.operation + + urls = [] + methods = [] + params = [] + + #invoke the WADL parser packaged with this tool. + WADLParserDriver=pkg.WADLParserDriver + wPD=WADLParserDriver() + wPD.parse(urlToPass) + urls = wPD.getUrl() + methods = wPD.getCompleteMethodList() + + a= str(self.webservice).split('/') + wadlnamelist = a[len(a)-1].split(".") + if len(wadlnamelist)==1: + wadlnamelist=a[len(a)-1].split('?') + print wadlnamelist + + wadlname=wadlnamelist[0] + + #write into the output file information about the method and Web service to be invoked. + f=open(self.outputfile,'w') + f.write(self.webservice+'\t') + f.write(resUrl+'\t') + + #get parameters for the selected method of the Web service + i=0 + for method in methods: + x = str(method.getId()) + y = str(urls.get(i)) + webserviceId = x + if y == resUrl : + params = method.getRequest().getParams() + break + i=i+1 + + f.write(webserviceId) + + galaxyhome=os.environ.get('GALAXY_HOME') + + methodname = resUrl.split('/') + + #./workflowclients/ClientCount.xml keeps the count of the clients/tools currently registered in Galaxy for Web service invocation. + #read the count and increment it. + clientCountFile=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/workflowclients/ClientCount.xml','r') + clientCountFile.readline() + clientCountStr = clientCountFile.readline() + clientCount=string.atoi(clientCountStr) + clientCount=clientCount+1 + clientCountFile.close() + + clientCountFile=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/workflowclients/ClientCount.xml','w') + clientCountFile.write('<count> \n') + clientCountFile.write(str(clientCount)+'\n') + clientCountFile.write('</count> \n') + + #include the count in the tool's name and id to uniquely identify it. + clientName = 'workflowclient_'+ str(clientCount) + + #create a new xml file under ./workflowclients/ + clientXml=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/workflowclients/'+clientName+'.xml','w') + clientXml.seek(0,0) + + #write the tool id, name and description + clientXml.write('<tool id="' + clientName+'" name="' + wadlname + '.' + methodname[-1] +'">\n') + clientXml.write(' <description> Client for method : '+self.operation+' , Web service : '+self.webservice+' </description>\n') + + #the workflow tool/client for a REST Web service invokes ./workflowclients/client_1.py to invoke the Web service + #write the command tag to specify the arguments passed to this client_1.py + 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') + + + j=0 + for param in params: + if param.isRequired(): + 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') + j=j+1 + + clientXml.write(' #else:\n $output\n $servicetype\n $url\n $method\n' +resUrl+'\n') + j=0 + for param in params: + if param.isRequired(): + 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') + j=j+1 + + for param in params: + if not param.isRequired(): + 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') + j=j+1 + + clientXml.write(' #end if\n') + clientXml.write('</command>\n') + + #start writing inputs + ##write inputs depending on required or not. if not required den dont display + ##if required- den check default value, and if options exist.Depending on that + ##decide the type of parameter and options + ##The input servicetype tells what type of webservice it is wether SOAP or REST - Useful during invocation of the web servcie + + clientXml.write(' <inputs>\n') + clientXml.write(' <param name="servicetype" type="hidden" value="REST"/>\n') + clientXml.write(' <param name="url" type="hidden" value="'+self.webservice+'" />\n') + clientXml.write(' <param name="method" type="hidden" value="'+self.operation+'" />\n') + + + #create a param for each required parameter described in the WADL. Check if defaults are specified. Create param such that + #it can either be given a value manually or the value can be taken from a previous step. + j=0 + for param in params: + if param.isRequired(): + pName = param.getName() + for doc in param.getDocs(): + if doc.getTitle()=="prompt" or doc.getTitle()=="Prompt" or doc.getTitle()=="PROMPT": + pName = doc.getInnerText() + + 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') + if param.getOptions().size()==0: + clientXml.write(' <param format="text" size = "150" name = "user_param'+str(j)+'" ') + if not param.getDefault1() == None: + clientXml.write('value="'+param.getDefault1()+'" ') + clientXml.write('type="text" label="Enter '+pName+'" help="see tip below" />\n') + else: + clientXml.write(' <param name="user_param'+str(j)+'" type="select" label="Select '+pName+'" help="see tip below">\n' ) + for option in param.getOptions(): + clientXml.write(' <option value="'+self.formatString(option.getName())+'" ') + if option.getName() == param.getDefault1(): + clientXml.write('selected="true"') + clientXml.write('>'+option.getName()+'</option>\n ') + clientXml.write(' </param> \n') + clientXml.write(' </when>\n') + clientXml.write(' <when value="cached">\n <param name = "cached_param'+ str(j)+'" type="data" label="' + pName + '"/> \n </when></conditional>') + j=j+1 + + #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 + #a previous step. + 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') + + for param in params: + if not param.isRequired(): + pName = param.getName() + for doc in param.getDocs(): + if doc.getTitle()=="prompt" or doc.getTitle()=="Prompt" or doc.getTitle()=="PROMPT": + pName = doc.getInnerText() + + 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">') + if param.getOptions().size()==0: + clientXml.write('<param format="text" size = "150" name = "user_param'+str(j)+'" ') + if not param.getDefault1() == None: + clientXml.write('value="'+param.getDefault1()+'" ') + clientXml.write('type="text" label="Enter '+pName+'" help="see tip below" />\n') + else: + clientXml.write('<param name="user_param'+str(j)+'" type="select" label="Select '+pName+'" help="see tip below">\n' ) + for option in param.getOptions(): + clientXml.write(' <option value="'+self.formatString(option.getName())+'" ') + if option.getName() == param.getDefault1(): + clientXml.write('selected="true"') + clientXml.write('>'+option.getName()+'</option>\n ') + clientXml.write(' </param> \n') + clientXml.write(' </when>\n') + clientXml.write('<when value="cached">\n <param name = "cached_param'+ str(j)+'" type="data" label="' + pName + '"/> \n </when></conditional>\n') + j=j+1 + + + + clientXml.write(' </when>\n </conditional>\n</inputs>\n <outputs>\n <data format="tabular" name="output" />\n </outputs>\n') + + #write information about each parameter in the help section + clientXml.write(' <help>\n') + clientXml.write('Replace white space with ** in all parameter values\n') + + for param in params: + if param.isRequired(): + pName = param.getName() + for doc in param.getDocs(): + if doc.getTitle()=="prompt" or doc.getTitle()=="Prompt" or doc.getTitle()=="PROMPT": + pName = doc.getInnerText() + clientXml.write('\n.. class:: infomark\n\n**TIP:** '+ pName +' type is ' + param.getType()+'\n') + + clientXml.write(' </help>\n</tool>') + + #adds the newly created tool to tool_conf.xml in Galaxy under the 'Web Service Workflow Tools' section. + editor = editToolConfig() + editor.addTool(clientName) + + + + + def sawadlClient(self): + ##parse sawadl + + pkg=JPackage('edu.uga.cs.lsdis.meteors.wadls') + pkgModel =JPackage('org.semanticweb.owlapi.model') + pkgApiBinding =JPackage('org.semanticweb.owlapi.apibinding') + pkgVocab = JPackage('org.semanticweb.owlapi.vocab') + + DOCUMENT_IRI = "http://cs.uga.edu/~ganjoo/galaxy/EDAM.owl" + + sawadlUrl = self.webservice + + webserviceId = ''#self.inputs + resUrl = self.operation + + urls = [] + methods = [] + params = [] + annotationSet = [] + + SAWADLParserDriver=pkg.SAWADLParserDriver + sawPD=SAWADLParserDriver() + sawPD.parse(sawadlUrl) + urls = sawPD.getUrl() + methods = sawPD.getCompleteMethodList() + + IRI = pkgModel.IRI + OWLRDFVocabulary = pkgVocab.OWLRDFVocabulary + OWLManager = pkgApiBinding.OWLManager + OWLLiteral = pkgModel.OWLLiteral + owlOntManager = OWLManager.createOWLOntologyManager() + ontology = owlOntManager.loadOntologyFromOntologyDocument(IRI.create(DOCUMENT_IRI)) + dataFactory = owlOntManager.getOWLDataFactory() + propertyComment = dataFactory.getOWLAnnotationProperty(OWLRDFVocabulary.RDFS_COMMENT.getIRI()) + + #write into the output file information about the method and Web service to be invoked. + f=open(self.outputfile,'w') + f.write(self.webservice+'\t') + f.write(resUrl+'\t') + + i=0 + for method in methods: + x = str(method.getName()) + y = str(urls.get(i)) + webserviceId = x + #if x == webserviceId : + if y == resUrl : + params = method.getRequest().getParamList() + break + i=i+1 + + + f.write(webserviceId) + + ##generate client's xml + galaxyhome=os.environ.get('GALAXY_HOME') + + clientCountFile=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/workflowclients/ClientCount.xml','r') + clientCountFile.readline() + clientCountStr = clientCountFile.readline() + clientCount=string.atoi(clientCountStr) + clientCount=clientCount+1 + clientCountFile.close() + + clientCountFile=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/workflowclients/ClientCount.xml','w') + clientCountFile.write('<count> \n') + clientCountFile.write(str(clientCount)+'\n') + clientCountFile.write('</count> \n') + + + + + clientName = 'workflowclient_'+ str(clientCount) + + clientXml=open(galaxyhome+'/tools/WebServiceToolWorkflow/workflowclients/'+clientName+'.xml','w') + clientXml.seek(0,0) + + clientXml.write('<tool id="' + clientName+'" name="' + webserviceId +'">\n') + clientXml.write(' <description> Client for method: '+webserviceId+' , Web service: '+self.webservice+' </description>\n') + + + clientXml.write(' <command interpreter="python">\n #client_1.py \n'+' $output \n $servicetype\n $url\n $method\n ' +resUrl+'\n') + ##write such that the parameters passed to client1.py(change name to clientName.py) are dependent on a for loop + + + j=0 + for param in params: + if param.getRequired()=='true' or param.getRequired()=='True' or param.getRequired()=='TRUE': + 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') + j=j+1 + clientXml.write('#if $cond_source.optional_param_source=="yes"') + + for param in params: + if not param.getRequired()=='true' and not param.getRequired()=='True' and not param.getRequired()=='TRUE': + 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') + j=j+1 + + clientXml.write('#else \n#end if\n') + clientXml.write('</command>\n') + + ##write inputs depending on required or not. if not required den dont display + ##if required- den check default value, and if options exist.Depending on that + ##decide the type of parameter and options + ##The input servicetype tells what type of webservice it is wether SOAP or REST - Useful during invocation of the web servcie + + clientXml.write(' <inputs>\n') + clientXml.write(' <param name="servicetype" type="hidden" value="REST" />') + clientXml.write(' <param name="url" type="hidden" value="'+self.webservice+'" />\n') + clientXml.write(' <param name="method" type="hidden" value="'+self.operation+'" />\n') + + + j=0 + for param in params: + if param.getRequired()=='true' or param.getRequired()=='True' or param.getRequired()=='TRUE': + 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') + if param.getOptionvalue().size()==0: + clientXml.write(' <param format="text" size = "150" name = "user_param'+str(j)+'" ') + if not param.getDefault1() == None: + clientXml.write('value="'+param.getDefault1()+'" ') + clientXml.write('type="text" label="Enter '+param.getName()+'" help="see tip below" />\n') + j=j+1 + else: + clientXml.write(' <param name="user_param'+str(j)+'" type="select" label="Select '+param.getName()+'" help="see tip below">\n' ) + for option in param.getOptionvalue(): + clientXml.write(' <option value="'+self.formatString(option)+'" ') + if option == param.getDefault1(): + clientXml.write('selected="true"') + clientXml.write('>'+option+'</option>\n ') + clientXml.write(' </param> \n') + j=j+1 + clientXml.write(' </when>\n') + clientXml.write(' <when value="cached">\n <param name = "cached_param'+ str(j)+'" type="data" label="' + param.getName() + '"/> \n </when></conditional>') + + 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') + + for param in params: + if not param.getRequired()=='true' and not param.getRequired()=='True' and not param.getRequired()=='TRUE': + 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') + if param.getOptionvalue().size()==0: + clientXml.write(' <param format="text" size = "150" name = "user_param'+str(j)+'" ') + if not param.getDefault1() == None: + clientXml.write('value="'+param.getDefault1()+'" ') + clientXml.write('type="text" label="Enter '+param.getName()+'" help="see tip below" />\n') + j=j+1 + else: + clientXml.write(' <param name="user_param'+str(j)+'" type="select" label="Select'+param.getName()+'" help="see tip below">\n' ) + for option in param.getOptionvalue(): + clientXml.write(' <option value="'+self.formatString(option)+'" ') + if option == param.getDefault1(): + clientXml.write('selected="true"') + clientXml.write('>'+option+'</option>\n ') + clientXml.write(' </param> \n') + j=j+1 + clientXml.write(' </when>\n') + clientXml.write(' <when value="cached">\n <param name = "cached_param'+ str(j)+'" type="data" label="' + param.getName() + '"/> \n </when></conditional>') + + clientXml.write(' </when>\n </conditional>\n') + + clientXml.write('</inputs>\n <outputs>\n <data format="tabular" name="output" />\n </outputs>\n') + + clientXml.write(' <help>\n') + for param in params: + if param.getRequired()=='true' or param.getRequired()=='True' or param.getRequired()=='TRUE': + clientXml.write('\n.. class:: infomark\n\n**TIP:** About '+ param.getName() +': type is ' + param.getType()) + + modelRef = sawPD.getCompleteModelReference(param) + if not modelRef is None: + paramClass = dataFactory.getOWLClass(IRI.create(modelRef)); + annotationSet = paramClass.getAnnotations(ontology,propertyComment) + for annotation in annotationSet: + if isinstance(annotation.getValue(),OWLLiteral): + val = annotation.getValue() + if val.isOWLStringLiteral() and not val.isOWLTypedLiteral(): + print 'val.getLiteral()=' + val.getLiteral() + clientXml.write(', description from ontology is "' + val.getLiteral()+'"') + break + clientXml.write('\n') + clientXml.write(' </help>\n</tool>') + editor = editToolConfig() + editor.addTool(clientName) + + + def wsdlRestClient(self): + ##parse wadl + javahome = os.environ.get('JAVA_HOME') + galaxyhome=os.environ.get('GALAXY_HOME') + classpath= galaxyhome + '/tools/WebServiceToolWorkflow_REST_SOAP/WodenWSDLParser/bin' + jarpath = galaxyhome + '/tools/WebServiceToolWorkflow_REST_SOAP/WodenWSDLParser/lib/' + machine = platform.machine() + + if machine == 'x86_64' : + print 'a' + startJVM("%s/jre/lib/amd64/server/libjvm.so" % javahome,"-ea", "-Djava.class.path=%s" % classpath,"-Djava.ext.dirs=%s" % jarpath) + elif machine == 'i686' : + print 'b' + startJVM("%s/jre/lib/i386/server/libjvm.so" % javahome,"-ea", "-Djava.class.path=%s" % classpath,"-Djava.ext.dirs=%s" % jarpath) + elif machine == 'sun4u' : + startJVM("%s/jre/lib/sparc/server/libjvm.so" % javahome,"-ea", "-Djava.class.path=%s" % classpath,"-Djava.ext.dirs=%s" % jarpath) + else : + print 'c' + System.exit("Could not identify machine, please specify path to libjvm.so") + + + pkg=JPackage('lsdis') + wsdlUrl = self.webservice + + webserviceId = ''#self.methodName + resUrl = self.operation + + urls = [] + methods = [] + params = [] + paramTypes = [] + + WSDLParserDriver =pkg.WSDLParserDriver + wPD=WSDLParserDriver() + wPD.parse(wsdlUrl) + methods = wPD.getCompleteMethodList() + urls = wPD.getUrl() + + f=open(self.outputfile,'w') + f.write(wsdlUrl+'\t') + f.write(resUrl+'\t') + + + i=0 + for method in methods: + x = str(method.getName().getLocalPart()) + y = str(url.get(i)) + webserviceId = x + if y == resUrl : + wPD.getParameters(x) + f.write('method matched') + paramTypes = wPD.getParamTypeList() + params = wPD.getParamList() + break + i=i+1 + + f.write(webserviceId) + + + + ##generate client's xml + galaxyhome=os.environ.get('GALAXY_HOME') + + clientCountFile=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/workflowclients/ClientCount.xml','r') + clientCountFile.readline() + clientCountStr = clientCountFile.readline() + clientCount=string.atoi(clientCountStr) + clientCount=clientCount+1 + clientCountFile.close() + + clientCountFile=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/workflowclients/ClientCount.xml','w') + clientCountFile.write('<count> \n') + clientCountFile.write(str(clientCount)+'\n') + clientCountFile.write('</count> \n') + + + + + clientName = 'workflowclient_'+ str(clientCount) + + clientXml=open(galaxyhome+'/tools/WebServiceToolWorkflow_RESTSOAP/workflowclients/'+clientName+'.xml','w') + clientXml.seek(0,0) + + clientXml.write('<tool id="' + clientName+'" name="' + webserviceId +'">\n') + clientXml.write(' <description> Client for method: '+webserviceId+' , Web service: '+self.webservice+' </description>\n') + + + clientXml.write(' <command interpreter="python">\n client_1.py \n'+' $output \n $servicetype\n $url \n $method' +resUrl+'\n') + ##write such that the parameters passed to client1.py(change name to clientName.py) are dependent on a for loop + + j=0 + for param in params: + clientXml.write(' '+self.formatString(param)+'\n') + clientXml.write(' $param' + str(j)+'\n') + j=j+1 + clientXml.write('</command>\n') + + ##write inputs depending on required or not. if not required den dont display + ##if required- den check default value, and if options exist.Depending on that + ##decide the type of parameter and options + clientXml.write(' <inputs>\n') + clientXml.write(' <param name="servicetype" type="hidden" value="REST" />') + clientXml.write(' <param name="url" type="hidden" value="'+self.webservice+'" />\n') + clientXml.write(' <param name="method" type="hidden" value="'+self.operation+'" />\n') + + + j=0 + for param in params: + clientXml.write('<param format="text" size = "150" name = "param'+str(j)+'" ') + clientXml.write('type="text" label="'+param+'" help="see tip below" />\n') + j=j+1 + + + + clientXml.write('</inputs>\n <outputs>\n <data format="tabular" name="output" />\n </outputs>\n') + + clientXml.write(' <help>\n') + + j=0 + for param in params: + clientXml.write('\n.. class:: infomark\n\n**TIP:** '+ param +' type is ' + paramTypes[j] +'\n') + + clientXml.write(' </help>\n</tool>') + editor = editToolConfig() + editor.addTool(clientName) + + ##later add help feature + +if __name__ == "__main__": + + test = ClientGenerator('http://eupathdb.org/eupathdb/webservices/GeneQuestions/GenesByGeneType.wadl','genesbygenetype',None,'REST') + present = test.isToolPresent() +# required = test.isRequired('_parameters|_sequence') + print 'Tool is present : ',present +