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
+