-
Notifications
You must be signed in to change notification settings - Fork 3
/
wsdlparser.lua
executable file
·174 lines (150 loc) · 5.62 KB
/
wsdlparser.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
---Aplicação de linha de comando para PC, para fazer o parser de um arquivo WSDL
--e mostrar dados necessários para montar uma requisição SOAP em uma aplicação de TVD usando a biblioteca NCLua SOAP.
--Assim, a aplicação deve ser executada fora do Ginga, em um computador com o interpretador Lua 5.x ou superior instalado.
--É necessária a biblioteca luasocket, que pode ser intalada via apt-get no Linux,
--ou via luarocks em qualquer SO. As bibliotecas util e LuaXML, também necessárias, já estão dentro do diretório.
--Pode-se passar a URL do WSDL via linha de comando.
--Licença: <a href="http://creativecommons.org/licenses/by-nc-sa/2.5/br/">http://creativecommons.org/licenses/by-nc-sa/2.5/br/</a>
--@author Manoel Campos da Silva Filho - <a href="http://manoelcampos.com">http://manoelcampos.com</a>
package.path = package.path .. ';lib/?.lua'
local http = require("socket.http")
require("util")
dofile("lib/LuaXML/xml.lua")
dofile("lib/LuaXML/handler.lua")
local main, osutil, wsdl = {}, {}, {nsPrefix = ""}
-- -----------------------------------------------------------
---Verifica se o Sistema Operacional é Unix/Linux
--@return Retorna true se o SO for Unix/Linux, senão, retorna false.
function osutil:isUnix()
--Se existe a variável de ambiente HOME, é um sistema Unix/Linux
return os.getenv('HOME')
end
---Executa comando de limpar tela, de acordo com o sistema operacional
--em execução.
function osutil:clear()
if self:isUnix() then
os.execute("clear")
else --senão, considera que é Windows
os.execute("cls")
end
end
-- -----------------------------------------------------------
---Realiza o parse do WSDL, convertendo o mesmo para uma tabela Lua
--@param wsdlContent String com o conteúdo do arquivo WSDL
--@return Retorna uma tabela Lua, gerada a partir do conteúdo do WSDL
function wsdl:parseWsdl(wsdlContent)
local xmlhandler = simpleTreeHandler()
local xmlparser = xmlParser(xmlhandler)
xmlparser:parse(wsdlContent, true)
if xmlhandler and xmlhandler.root then
if xmlhandler.root["wsdl:definitions"] then
self.nsPrefix = "wsdl:"
else
self.nsPrefix = ""
end
--util.printable(xmlhandler.root)
return xmlhandler.root
else
error("Não foi possível converter o WSDL para uma tabela Lua")
end
end
---Salva o WSDL para um arquivo em disco
--@param wsdlContent String com o conteúdo do arquivo WSDL
--@param fileName Nome do arquivo a ser gerado
function wsdl:saveWsdl(wsdlContent, fileName)
k = io.open(fileName, "w+")
k:write(wsdlContent)
k:close()
end
---Verifica se o WSDL é de um Web Service PHP
--@param wsdlUrl URL do arquivo WSDL
--@return Se a URL for de um WSDL de Web Service em PHP, retorna true,
--senão, retorna false.
function wsdl:phpWS(wsdlUrl)
return string.find(wsdlUrl, ".php")
end
---Obtém a versão do SOAP suportada pelo Web Service
--@param wsdlTable Tabela lua gerada a partir do parse do conteúdo do WSDL
--@param includeDot Se true, inclui o ponto no número da versão.
--O parâmetro é opcional e o valor padrão é true.
--@return Retorna 1.1 para SOAP 1.1 ou 1.2 para SOAP 1.2
function wsdl:soapVersion(wsdlTable, includeDot)
if includeDot == nil then
includeDot = true
end
if wsdlTable[self.nsPrefix.."definitions"]._attr["xmlns:soap12"] then
if includeDot then
return "1.2"
else
return "12"
end
else
if includeDot then
return "1.1"
else
return "11"
end
end
end
---Obtém o namespace do Web Service
--@param wsdlTable Tabela lua gerada a partir do parse do conteúdo do WSDL
--@return Retorna o namespace obtido
function wsdl:getNamespace(wsdlTable)
return wsdlTable[self.nsPrefix.."definitions"]._attr.targetnamespace
end
---Obtém o endereço do serviço a partir do WSDL
--@param wsdlUrl URL do arquivo WSDL
--@return Retorna o endereço do serviço
function wsdl:getServiceUrl(wsdlUrl)
return string.sub(wsdlUrl, 1, #wsdlUrl -5)
end
--Obtém a lista de métodos do Web Service
--@param wsdlTable Tabela lua gerada a partir do parse do conteúdo do WSDL
--@return Retorna uma tabela com a lista de métodos obtidos
function wsdl:getMethods(wsdlTable)
local methods, bindings = {}, wsdlTable[self.nsPrefix.."definitions"][self.nsPrefix.."binding"]
--util.printable(bindings)
local soapVersion = self:soapVersion(wsdlTable, false)
for i, v in ipairs(bindings) do
table.insert(methods,
{
bindingName=bindings[i]._attr.name,
operationName=bindings[i][self.nsPrefix.."operation"]._attr.name
}
)
end
return methods
end
-- -----------------------------------------------------------
---Inicia a aplicação
function main:start()
osutil:clear()
local wsdlUrl = ""
if #arg >= 1 then
wsdlUrl = arg[1]
else
--WSDL's de exemplo:
--PHP: http://manoelcampos.com/estadosws/server.php?wsdl
--ASP.NET: http://www.webservicex.net/CurrencyConvertor.asmx?WSDL
io.write("WSDL URL: ")
wsdlUrl = io.read()
end
if wsdl:phpWS(wsdlUrl) then
print("Accessing PHP Web Service WSDL")
end
print("Downloading WSDL "..wsdlUrl..". Please wait...")
local wsdlContent = http.request(wsdlUrl)
wsdl:saveWsdl(wsdlContent, "ws.wsdl")
local wsdlTable = wsdl:parseWsdl(wsdlContent)
print()
print("Service URL: ", wsdl:getServiceUrl(wsdlUrl))
print("SOAP Version:", wsdl:soapVersion(wsdlTable))
print("Namespace:", wsdl:getNamespace(wsdlTable))
--print("Methods (choose a method by number):")
print("Methods:")
--local methodNumber = io.read()
util.printable(wsdl:getMethods(wsdlTable))
print()
end
-- -----------------------------------------------------------
main:start()