Mercurial > repos > uga-galaxy-group > webservice_toolsuite_v1_1
view 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 |
line wrap: on
line source
''' @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_conf1 import * from clientGenerator.msHandler import * from clientGenerator.creatorEngineComplex import * from clientGenerator.wsdl2path import * from clientGenerator.paramConverter import * __author__="" #generates client for a web service to be used as standalone class ClientGenerator1(object): def __init__(self,webservice,operation,outputfile,servicetype):#,url): with warnings.catch_warnings(): warnings.simplefilter("ignore") self.webservice = webservice self.operation = operation self.inputs = outputfile self.outputfile = outputfile #self.url = url self.servicetype = servicetype self.galaxyhome=os.environ.get('GALAXY_HOME') self.clientfile = '' 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 ''' Replaces space (' ') with '**' in the given string ''' def formatString(self,string): l = string.split(' ') return '**'.join(l) 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 fie, any change in the description 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 Tool" id="WebServices">': 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 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 ''' Creates a client file2 (xml file) for the given opertion in the SOAP web service This operation is invokes standalone and is cannot be used in workflows Then invokes another operation which adds this client file (tool) to the toolconfig.xml under 'Web Service Tools' ''' 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#sys.argv[4] #operation = sys.argv[3] outputfile=open(self.outputfile,'w') test = ClientCreator() inputs= test.opname2inputs(self.operation,webservice) inputl = nested2flatDict(inputs) inputlist = inputl.keys() #noOfInputs=inputlist.count() 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) ##generate client's xml galaxyhome=os.environ.get('GALAXY_HOME') #./clients/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/clients/ClientCount.xml','r') clientCountFile.readline() clientCountStr = clientCountFile.readline() clientCount=string.atoi(clientCountStr) clientCount=clientCount+1 clientCountFile.close() clientCountFile=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clients/ClientCount.xml','w') clientCountFile.write('<count> \n') clientCountFile.write(str(clientCount)+'\n') clientCountFile.write('</count> \n') clientCountFile.close() clientName = 'WebServiceclient_'+ str(clientCount) clientXml=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clients/'+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') #Only Required parameters clientXml.write(' <command interpreter="python">\n #if $cond_source.optional_param_source=="no" #client_1.py'+' $output $servicetype ' +webservice+' '+self.operation) #clientXml.write(' <command interpreter="python">\n client_1.py \n' +' $output \n ' +self.webservice+' \n '+self.operation+'\n') ##write such that the parameters passed to client1.py(change name to clientName.py) are dependent on a for loop test = MessageHandler() j=0 for param in inputl: if self.isRequired(param): clientXml.write(' "'+param+'"') clientXml.write(' $param'+str(j)) j=j+1 #Both Required and optional paramters clientXml.write(' #else #client_1.py'+' $output $servicetype ' +webservice+' '+self.operation+'\n') ''' Required parameters - If the parameter is complex type (tree structure) then the the parameter is required only if both the root node and the leaf node are required (i.e. both root and leaf have attribute nillable as false) ''' j=0 for param in inputl: if self.isRequired(param): clientXml.write(' "'+param+'"') clientXml.write(' $param'+str(j)) j=j+1 ''' Optional parameters - If the parameter is complex type (tree structure) then the the paramter is optional if its root element is optional (i.e. root has attribute nillable as true) even if the leaf node (element) is required (i.e. leaf element has attribute nillable as false) ''' for param in inputl: if not self.isRequired(param): clientXml.write(' "'+param+'"') clientXml.write(' $param'+str(j)) j=j+1 #params for array type # for param in self.inputs: # paramelement = test.getParameter(self.msinstance(),param) # if getattr(paramelement,'nillable')==True: # if string.find(param,"|0|")>-1: # ele = string(param,"|0|") # for param in self.inputs: # clientXml.write(' "'+param+'"') # clientXml.write(' $cond_source.param' + str(j)) # j=j+1 clientXml.write(' #end if \n</command>\n') # for param in self.inputs: # paramelement = test.getParameter(self.msinstance(),param) # if getattr(paramelement,'nillable')==False or getattr(paramelement,'minOccurs')==1: # clientXml.write(' "'+param+'"\n') # clientXml.write(' $param'+str(j)+'\n') # j=j+1 #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') j=0 for param in inputl: if self.isRequired(param): pName = getattr(self.paramelement,'pname') clientXml.write('<param format="text" size = "150" name = "param'+str(j)+'" ') clientXml.write('type="text" label="Enter '+pName+'" help="see tip below" />\n') j=j+1 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') clientXml.write('<when value="no"> \n </when>') clientXml.write('<when value="yes"> \n') for param in inputl: if not self.isRequired(param): pName = getattr(self.paramelement,'pname') clientXml.write('<param format="text" size = "150" name = "param'+str(j)+'" ') clientXml.write('type="text" label="Enter '+pName+'" help="see tip below" />\n') j=j+1 clientXml.write('</when>\n</conditional>') # j=0 # for param in self.inputs: # paramelement = test.getParameter(self.msinstance(),param) # if not getattr(paramelement,'nillable'): # pName = getattr(paramelement,'pname')#param.getName() # clientXml.write('<param format="text" size = "150" name = "param'+str(j)+'" ') # clientXml.write('type="text" label="'+pName+'" 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') 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 = editToolConfig1() 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 = [] docs = [] WADLParserDriver=pkg.WADLParserDriver wPD=WADLParserDriver() wPD.parse(urlToPass) urls = wPD.getUrl() methods = wPD.getCompleteMethodList() #write into the output file information about the method and Web service to be invoked. f=open(self.outputfile,'w') f.write(self.webservice) f.write('\n'+ resUrl) 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] #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 x==webserviceId: if y == resUrl : params = method.getRequest().getParams() break i=i+1 f.write('\n'+webserviceId) galaxyhome=os.environ.get('GALAXY_HOME') methodname = resUrl.split('/') #./clients/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/clients/ClientCount.xml','r') clientCountFile.readline() clientCountStr = clientCountFile.readline() clientCount=string.atoi(clientCountStr) clientCount=clientCount+1 clientCountFile.close() clientCountFile=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clients/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 = 'WebServiceclient_'+ str(clientCount) #create a new xml file under ./clients/ clientXml=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clients/'+clientName+'.xml','w') clientXml.seek(0,0) #write the tool id, name and description clientXml.write('<tool id="' + clientName+'1" name="'+wadlname+'.' + methodname[-1] +' ">\n') clientXml.write(' <description> Client for method : '+self.operation+' , Web service : '+self.webservice+' </description>\n') #the one-time invocation tool/client for a REST Web service invokes ./clients/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 #if $cond_source.optional_param_source=="no" #client_1.py'+' $output $servicetype ' +resUrl) j=0 for param in params: if param.isRequired(): clientXml.write(' '+self.formatString(param.getName())) clientXml.write(' $param' + str(j)) j=j+1 clientXml.write(' #else #client_1.py'+' $output $servicetype ' +resUrl) j=0 for param in params: if param.isRequired(): clientXml.write(' '+self.formatString(param.getName())) clientXml.write(' $param' + str(j)) j=j+1 for param in params: if not param.isRequired(): clientXml.write(' '+self.formatString(param.getName())) clientXml.write(' $cond_source.param' + str(j)) j=j+1 clientXml.write(' #end if \n</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" />') #create a param for each required parameter described in the WADL. Check if defaults and options are specified in the WADL 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() if param.getOptions().size()==0: clientXml.write('<param format="text" size = "150" name = "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') j=j+1 else: clientXml.write('<param name="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') j=j+1 #create a conditional param for each optional parameter described in the WADL. 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') clientXml.write('<when value="no"> \n </when>') clientXml.write('<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() if param.getOptions().size()==0: clientXml.write('<param format="text" size = "150" name = "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') j=j+1 else: clientXml.write('<param name="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') j=j+1 clientXml.write('</when>\n</conditional>') clientXml.write('</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 Tools' section. editor = editToolConfig1() editor.addTool(clientName) ##later add help feature def sawadlClient(self): ##parse sawadl javahome = os.environ.get('JAVA_HOME') galaxyhome=os.environ.get('GALAXY_HOME') classpath= galaxyhome + '/tools/WebServiceToolWorkflow_REST_SOAP/lib/SAWADLParser/bin' jarpath = galaxyhome + '/tools/WebServiceToolWorkflow_REST_SOAP/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('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.methodName 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()) f=open(self.outputfile,'w') f.write(sawadlUrl) f.write(resUrl+'\t') i=0 for method in methods: x = str(method.getName()) y = str(urls.get(i)) #if x == webserviceId : webserviceId = x if y == resUrl : params = method.getRequest().getParamList() break i=i+1 f.write(webserviceId) ##generate client's xml galaxyhome=os.environ.get('GALAXY_HOME') #./clients/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/clients/ClientCount.xml','r') clientCountFile.readline() clientCountStr = clientCountFile.readline() clientCount=string.atoi(clientCountStr) clientCount=clientCount+1 clientCountFile.close() clientCountFile=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clients/ClientCount.xml','w') clientCountFile.write('<count> \n') clientCountFile.write(str(clientCount)+'\n') clientCountFile.write('</count> \n') clientName = 'WebServiceclient_'+ str(clientCount) clientXml=open(galaxyhome+'/tools/WebServiceToolWorkflow_REST_SOAP/clients/'+clientName+'.xml','w') clientXml.seek(0,0) clientXml.write('<tool id="' + clientName+'1" name="' + webserviceId +'">\n') clientXml.write(' <description> Client for method: '+webserviceId+' , Web service: '+self.webservice+' </description>\n') clientXml.write(' <command interpreter="python">\n #if $cond_source.optional_param_source=="no" #client_1.py'+' $output $servicetype ' +resUrl) ##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') clientXml.write(' $param' + str(j)+'\n') j=j+1 clientXml.write(' #else #client_1.py'+' $output $servicetype ' +resUrl) j=0 for param in params: if param.getRequired()=='true' or param.getRequired()=='True' or param.getRequired()=='TRUE': clientXml.write(' '+self.formatString(param.getName())) clientXml.write(' $param' + str(j)) j=j+1 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())) clientXml.write(' $cond_source.param' + str(j)) j=j+1 clientXml.write('#end if \n </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 param servicetype tells what type of webservice it is wether SOAP or REST - Useful during invocation of the web servcie clientXml.write(' <inputs>\n') cleintXml.write(' <param name="servicetype" type="hidden" value="REST"/>') j=0 for param in params: if param.getRequired()=='true' or param.getRequired()=='True' or param.getRequired()=='TRUE': f.write('\n '+ param.getName() + ' options: '+str(param.getOptionvalue().size())) if param.getOptionvalue().size()==0: clientXml.write('<param format="text" size = "150" name = "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="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('\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') clientXml.write('<when value="no"> \n </when>') clientXml.write('<when value="yes"> \n') for param in params: if not param.getRequired()=='true' and not param.getRequired()=='True' and not param.getRequired()=='TRUE': f.write('\n '+ param.getName() + ' options: '+str(param.getOptionvalue().size())) if param.getOptionvalue().size()==0: clientXml.write('<param format="text" size = "150" name = "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="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</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 = editToolConfig1() editor.addTool(clientName) ##later add help feature 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.webserviceId webserviceId = ''#self.methodName resUrl = self.resourceName urls = [] methods = [] params = [] paramTypes = [] WSDLParserDriver =pkg.WSDLParserDriver wPD=WSDLParserDriver() wPD.parse(wsdlUrl) methods = wPD.getCompleteMethodList() urls = wPD.getUrl() f=open(self.Ofile,'w') f.write(wsdlUrl) f.write('\n'+ resUrl) f.write('\n'+webserviceId) 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 ##generate client's xml galaxyhome=os.environ.get('GALAXY_HOME') clientCountFile=open(galaxyhome+'/tools/WebServiceTool/clients/ClientCount.xml','r') clientCountFile.readline() clientCountStr = clientCountFile.readline() clientCount=string.atoi(clientCountStr) clientCount=clientCount+1 clientCountFile.close() clientCountFile=open(galaxyhome+'/tools/WebServiceTool/clients/ClientCount.xml','w') clientCountFile.write('<count> \n') clientCountFile.write(str(clientCount)+'\n') clientCountFile.write('</count> \n') clientName = 'WebServiceclient_'+ str(clientCount) clientXml=open(galaxyhome+'/tools/WebServiceTool/clients/'+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 ' +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') cleintXml.write(' <param name="servicetype" type="hidden" value="REST"/>') 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') clientXml.write('** Replace white with ** in all parameter values **\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 # Addedfor testing purpose if __name__ == "__main__": test = ClientGenerator1('http://www.cs.uga.edu/~guttula/wublast.wsdl','run',None,'SOAP') present = test.isToolPresent() required = test.isRequired('_parameters|_sequence') print 'required : ',required