wsdl-reader 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.idea/workspace.xml +0 -683
- data/lib/wsdl-reader.rb +1 -0
- data/lib/wsdl-reader/binding.rb +44 -21
- data/lib/wsdl-reader/error.rb +24 -0
- data/lib/wsdl-reader/message.rb +33 -3
- data/lib/wsdl-reader/operation.rb +85 -0
- data/lib/wsdl-reader/parser.rb +4 -2
- data/lib/wsdl-reader/port_type.rb +42 -10
- data/lib/wsdl-reader/version.rb +1 -1
- data/spec/binding_spec.rb +20 -20
- data/spec/fixtures/UserService.wsdl +24 -11
- data/spec/message_spec.rb +24 -5
- data/spec/operation_spec.rb +38 -0
- data/spec/parser_spec.rb +21 -16
- data/spec/port_type_spec.rb +34 -10
- metadata +11 -8
data/lib/wsdl-reader.rb
CHANGED
data/lib/wsdl-reader/binding.rb
CHANGED
@@ -20,7 +20,14 @@ module WSDL
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def all_operations
|
23
|
-
self.map { |_, binding| binding.operations.
|
23
|
+
self.map { |_, binding| binding.operations.values }.flatten
|
24
|
+
end
|
25
|
+
|
26
|
+
def operations(binding=nil)
|
27
|
+
bindings = binding.nil? ? self : ({ a: self[binding] })
|
28
|
+
bindings.inject({ }) do |hash, (_, b)|
|
29
|
+
hash.merge b.operations
|
30
|
+
end
|
24
31
|
end
|
25
32
|
|
26
33
|
def operation?(operation_name)
|
@@ -32,53 +39,63 @@ module WSDL
|
|
32
39
|
attr_reader :operations
|
33
40
|
attr_reader :name
|
34
41
|
attr_reader :type
|
42
|
+
attr_reader :type_nns
|
35
43
|
attr_reader :style
|
36
44
|
attr_reader :transport
|
37
45
|
|
38
46
|
def initialize(element)
|
39
|
-
@operations =
|
47
|
+
@operations = Operations.new
|
40
48
|
@name = element.attributes['name']
|
41
49
|
@type = element.attributes['type'] # because of Object#type
|
50
|
+
@type_nns = @type.split(':').last rescue @type
|
42
51
|
@style = nil
|
43
52
|
@transport = nil
|
44
53
|
|
45
54
|
# Process all binding and operation
|
46
|
-
element.find_all { |e| e.class == REXML::Element }.each
|
47
|
-
case
|
55
|
+
element.find_all { |e| e.class == REXML::Element }.each do |operation_element|
|
56
|
+
case operation_element.name
|
48
57
|
when "binding" # soap:binding
|
49
|
-
store_style_and_transport(
|
58
|
+
store_style_and_transport(operation_element)
|
50
59
|
|
51
60
|
when "operation"
|
52
|
-
|
53
|
-
|
54
|
-
operation.find_all { |e| e.class == REXML::Element }.each { |action|
|
55
|
-
store_action(action, element, operation)
|
56
|
-
}
|
61
|
+
append_operation(operation_element)
|
57
62
|
else
|
58
63
|
warn "Ignoring element `#{operation.name}' in binding `#{element.attributes['name']}'"
|
59
64
|
end
|
60
|
-
|
65
|
+
end
|
61
66
|
end
|
62
67
|
|
63
68
|
def operation?(name)
|
64
|
-
operations.include? name
|
69
|
+
operations.include? camelize_operation(name)
|
70
|
+
end
|
71
|
+
|
72
|
+
def lookup_port_type(port_types)
|
73
|
+
port_types[type.split(':').last]
|
65
74
|
end
|
66
75
|
|
67
76
|
protected
|
68
77
|
|
69
|
-
def
|
70
|
-
|
78
|
+
def append_operation(operation_element)
|
79
|
+
@operations << Operation.new(operation_element, self)
|
80
|
+
end
|
81
|
+
|
82
|
+
def store_style_and_transport(operation_element)
|
83
|
+
operation_element.attributes.each do |name, value|
|
71
84
|
case name
|
72
85
|
when 'style'
|
73
86
|
@style = value
|
74
87
|
when 'transport'
|
75
88
|
@transport = value
|
76
|
-
else
|
77
|
-
warn "Ignoring attribute `#{name}' for wsdlsoap:binding in binding `#{element.attributes['name']}'"
|
78
89
|
end
|
79
90
|
end
|
80
91
|
end
|
81
92
|
|
93
|
+
def camelize_operation(name)
|
94
|
+
name.to_s.tap do |name_string|
|
95
|
+
return name_string.camelize :lower if name_string.underscore == name_string
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
82
99
|
def store_operation_name(element, operation)
|
83
100
|
operation.attributes.each do |name, value|
|
84
101
|
case name
|
@@ -90,7 +107,7 @@ module WSDL
|
|
90
107
|
end
|
91
108
|
end
|
92
109
|
|
93
|
-
def fill_action(action, operation)
|
110
|
+
def fill_action(action, operation, element)
|
94
111
|
filling_action = { }
|
95
112
|
|
96
113
|
action.attributes.each do |name, value|
|
@@ -109,6 +126,12 @@ module WSDL
|
|
109
126
|
filling_action[:body] = { }
|
110
127
|
|
111
128
|
body.attributes.each { |name, value| filling_action[:body][name.to_sym] = value }
|
129
|
+
|
130
|
+
when "fault"
|
131
|
+
filling_action[:body] = { }
|
132
|
+
|
133
|
+
body.attributes.each { |name, value| filling_action[:body][name.to_sym] = value }
|
134
|
+
|
112
135
|
else
|
113
136
|
warn "Ignoring element `#{body.name}' in #{action.name} `#{action.attributes['name']}' in operation `#{operation.attributes['name']}' for binding `#{element.attributes['name']}'"
|
114
137
|
end
|
@@ -130,13 +153,13 @@ module WSDL
|
|
130
153
|
end
|
131
154
|
end
|
132
155
|
when "input"
|
133
|
-
current_operation(operation)[:input] = fill_action(action, operation)
|
156
|
+
current_operation(operation)[:input] = fill_action(action, operation, element)
|
134
157
|
|
135
158
|
when "output"
|
136
|
-
current_operation(operation)[:output] = fill_action(action, operation)
|
159
|
+
current_operation(operation)[:output] = fill_action(action, operation, element)
|
137
160
|
|
138
161
|
when "fault"
|
139
|
-
current_operation(operation)[:fault] = fill_action(action, operation)
|
162
|
+
current_operation(operation)[:fault] = fill_action(action, operation, element)
|
140
163
|
|
141
164
|
else
|
142
165
|
warn "Ignoring element `#{action.name}' in operation `#{operation.attributes['name']}' for binding `#{element.attributes['name']}'"
|
@@ -149,4 +172,4 @@ module WSDL
|
|
149
172
|
|
150
173
|
end
|
151
174
|
end
|
152
|
-
end
|
175
|
+
end
|
data/lib/wsdl-reader/error.rb
CHANGED
@@ -3,6 +3,30 @@ module WSDL
|
|
3
3
|
class ParserError < StandardError
|
4
4
|
end
|
5
5
|
|
6
|
+
class LookupError < StandardError
|
7
|
+
end
|
8
|
+
|
9
|
+
class ManyOperationsFoundError < LookupError
|
10
|
+
def initialize(type, element_name)
|
11
|
+
@type, @element_name = type, element_name
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
def message
|
16
|
+
"More than one operations found for element: [#@element_name]"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class OperationNotFoundError < LookupError
|
21
|
+
def initialize(type, element_name)
|
22
|
+
@type, @element_name = type, element_name
|
23
|
+
end
|
24
|
+
|
25
|
+
def message
|
26
|
+
"No operation matches for element: [#@element_name]"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
6
30
|
class FileOpenError < ParserError
|
7
31
|
end
|
8
32
|
end
|
data/lib/wsdl-reader/message.rb
CHANGED
@@ -1,6 +1,32 @@
|
|
1
1
|
module WSDL
|
2
2
|
module Reader
|
3
3
|
class Messages < Hash
|
4
|
+
|
5
|
+
def lookup_operations_by_element(type, element_name, port_types)
|
6
|
+
messages = lookup_messages_by_element(element_name)
|
7
|
+
messages.map do |message|
|
8
|
+
port_types.lookup_operations_by_message(type, message)
|
9
|
+
end.flatten
|
10
|
+
end
|
11
|
+
|
12
|
+
def lookup_operation_by_element! (type, element_name, port_types)
|
13
|
+
messages = lookup_operations_by_element type, element_name, port_types
|
14
|
+
case messages.size
|
15
|
+
when 1
|
16
|
+
messages.first
|
17
|
+
when 0
|
18
|
+
raise OperationNotFoundError.new type, element_name
|
19
|
+
else
|
20
|
+
raise ManyOperationsFoundError.new type, element_name
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def lookup_messages_by_element(element_name)
|
25
|
+
values.select do |message|
|
26
|
+
message.parts.values.find { |part| part[:element].split(':').last == element_name }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
4
30
|
end
|
5
31
|
|
6
32
|
class Message
|
@@ -9,11 +35,15 @@ module WSDL
|
|
9
35
|
|
10
36
|
def initialize(element)
|
11
37
|
@parts = Hash.new
|
12
|
-
@name
|
38
|
+
@name = element.attributes['name']
|
13
39
|
|
14
40
|
process_all_parts element
|
15
41
|
end
|
16
42
|
|
43
|
+
def element
|
44
|
+
parts.map { |_, hash| hash[:element] }.first
|
45
|
+
end
|
46
|
+
|
17
47
|
protected
|
18
48
|
|
19
49
|
def process_all_parts(element)
|
@@ -36,7 +66,7 @@ module WSDL
|
|
36
66
|
current_part[:name] = value
|
37
67
|
when 'element'
|
38
68
|
current_part[:element] = value
|
39
|
-
current_part[:mode]
|
69
|
+
current_part[:mode] = :element
|
40
70
|
when 'type'
|
41
71
|
current_part[:type] = value
|
42
72
|
current_part[:mode] = :type
|
@@ -47,4 +77,4 @@ module WSDL
|
|
47
77
|
end
|
48
78
|
end
|
49
79
|
end
|
50
|
-
end
|
80
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module WSDL
|
2
|
+
module Reader
|
3
|
+
|
4
|
+
class Operations < Hash
|
5
|
+
def <<(operation)
|
6
|
+
self[operation.name] = operation
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class Operation
|
11
|
+
attr_reader :soap_action, :style, :input, :output, :fault
|
12
|
+
attr_reader :name, :binding
|
13
|
+
|
14
|
+
def initialize(element, binding)
|
15
|
+
@name = element.attributes['name']
|
16
|
+
@binding = binding
|
17
|
+
|
18
|
+
parse! element
|
19
|
+
end
|
20
|
+
|
21
|
+
def method_name
|
22
|
+
@name.underscore
|
23
|
+
end
|
24
|
+
|
25
|
+
def message
|
26
|
+
@name
|
27
|
+
end
|
28
|
+
|
29
|
+
def lookup_element(port_types, messages)
|
30
|
+
message = port_types.lookup_operation_message :input, self, messages
|
31
|
+
message.element.split(':').last
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def parse!(operation_element)
|
37
|
+
operation_element.find_all { |e| e.class == REXML::Element }.each do |action_element|
|
38
|
+
store_action(action_element)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def store_action(action_element)
|
43
|
+
case action_element.name
|
44
|
+
when "operation" # soap:operation
|
45
|
+
action_element.attributes.each do |name, value|
|
46
|
+
case name
|
47
|
+
when 'soapAction'
|
48
|
+
@soap_action = value
|
49
|
+
when 'style'
|
50
|
+
@style = value
|
51
|
+
end
|
52
|
+
end
|
53
|
+
when "input"
|
54
|
+
@input = fill_action(action_element)
|
55
|
+
|
56
|
+
when "output"
|
57
|
+
@output = fill_action(action_element)
|
58
|
+
|
59
|
+
when "fault"
|
60
|
+
@fault = fill_action(action_element)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def fill_action(action_element)
|
65
|
+
filling_action = { }
|
66
|
+
|
67
|
+
filling_action[:name] = action_element.attributes['name']
|
68
|
+
|
69
|
+
# Store body
|
70
|
+
action_element.find_all { |e| e.class == REXML::Element }.each do |body|
|
71
|
+
if body.name = "body"
|
72
|
+
filling_action[:body] = { }
|
73
|
+
|
74
|
+
body.attributes.each do |name, value|
|
75
|
+
filling_action[:body][name.to_sym] = value
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
filling_action
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
data/lib/wsdl-reader/parser.rb
CHANGED
@@ -4,6 +4,7 @@ require 'rexml/document'
|
|
4
4
|
require 'wsdl-reader/message'
|
5
5
|
require 'wsdl-reader/port_type'
|
6
6
|
require 'wsdl-reader/binding'
|
7
|
+
require 'wsdl-reader/operation'
|
7
8
|
require 'wsdl-reader/service'
|
8
9
|
require 'wsdl-reader/xsd'
|
9
10
|
|
@@ -14,7 +15,8 @@ module WSDL
|
|
14
15
|
attr_reader :prefixes, :target_namespace
|
15
16
|
attr_reader :document, :uri
|
16
17
|
|
17
|
-
delegate :
|
18
|
+
delegate :operations, :operation?, to: :bindings
|
19
|
+
delegate :lookup_operation_by_element!, to: :messages
|
18
20
|
|
19
21
|
def initialize(uri)
|
20
22
|
@uri = uri
|
@@ -104,4 +106,4 @@ module WSDL
|
|
104
106
|
end
|
105
107
|
end
|
106
108
|
end
|
107
|
-
end
|
109
|
+
end
|
@@ -1,6 +1,18 @@
|
|
1
1
|
module WSDL
|
2
2
|
module Reader
|
3
3
|
class PortTypes < Hash
|
4
|
+
def lookup_operation_message(type, operation, messages) # TODO: lookup_message_by_operation
|
5
|
+
each do |_, port_type|
|
6
|
+
message = port_type.lookup_operation_message type, operation, messages
|
7
|
+
return message if message
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def lookup_operations_by_message(type, message)
|
12
|
+
inject([]) do |array, (_, port_type)|
|
13
|
+
array + port_type.lookup_operations_by_message(type, message)
|
14
|
+
end
|
15
|
+
end
|
4
16
|
end
|
5
17
|
|
6
18
|
class PortType
|
@@ -9,11 +21,31 @@ module WSDL
|
|
9
21
|
|
10
22
|
def initialize(element)
|
11
23
|
@operations = Hash.new
|
12
|
-
@name
|
24
|
+
@name = element.attributes['name']
|
13
25
|
|
14
26
|
process_all_operations(element)
|
15
27
|
end
|
16
28
|
|
29
|
+
def lookup_operation_message(type, operation, messages)
|
30
|
+
operation_name = operation.is_a?(Operation) ? operation.name : operation.to_s
|
31
|
+
messages[@operations[operation_name][type][:message].split(':').last]
|
32
|
+
end
|
33
|
+
|
34
|
+
def lookup_operations_by_message(type, message)
|
35
|
+
ops = @operations.values.select do |operation|
|
36
|
+
operation_message? type, operation, message
|
37
|
+
end
|
38
|
+
ops.map do |operation_hash|
|
39
|
+
operation_hash[:name]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def operation_message?(type, operation, message)
|
44
|
+
message_name = message.is_a?(Message) ? message.name : message.to_s
|
45
|
+
operation[type][:message] == message_name ||
|
46
|
+
operation[type][:message].split(':').last == message_name
|
47
|
+
end
|
48
|
+
|
17
49
|
protected
|
18
50
|
|
19
51
|
def store_attributes(element, operation)
|
@@ -79,17 +111,17 @@ module WSDL
|
|
79
111
|
|
80
112
|
operation.find_all { |e| e.class == REXML::Element }.each do |action|
|
81
113
|
case action.name
|
82
|
-
|
83
|
-
|
114
|
+
when "input"
|
115
|
+
store_input(action, element, operation)
|
84
116
|
|
85
|
-
|
86
|
-
|
117
|
+
when "output"
|
118
|
+
store_output(action, element, operation)
|
87
119
|
|
88
|
-
|
89
|
-
|
120
|
+
when "fault"
|
121
|
+
store_fault(action, element, operation)
|
90
122
|
|
91
|
-
|
92
|
-
|
123
|
+
else
|
124
|
+
warn "Ignoring element '#{action.name}' in operation '#{operation.attributes['name']}' for portType '#{element.attributes['name']}'"
|
93
125
|
end
|
94
126
|
end
|
95
127
|
else
|
@@ -103,4 +135,4 @@ module WSDL
|
|
103
135
|
end
|
104
136
|
end
|
105
137
|
end
|
106
|
-
end
|
138
|
+
end
|
data/lib/wsdl-reader/version.rb
CHANGED
data/spec/binding_spec.rb
CHANGED
@@ -12,25 +12,25 @@ describe "WSDL Binding" do
|
|
12
12
|
it "#get_operations with binding UserServicePortBinding" do
|
13
13
|
operations = subject.get_operations "UserServicePortBinding"
|
14
14
|
operations.should have(2).operation
|
15
|
-
operations.should eq %w{
|
15
|
+
operations.should eq %w{getFirstNameOperation getLastNameOperation}
|
16
16
|
end
|
17
17
|
|
18
18
|
it "#get_binding_for_operation_name with binding = UserServicePortBinding and operation = getFirstName" do
|
19
|
-
bindings_array = subject.get_binding_for_operation_name "UserServicePortBinding", "
|
19
|
+
bindings_array = subject.get_binding_for_operation_name "UserServicePortBinding", "getFirstNameOperation"
|
20
20
|
|
21
21
|
bindings_array.should have(1).binding
|
22
22
|
bindings_array.first.should be_a WSDL::Reader::Binding
|
23
23
|
bindings_array.first.name.should eq "UserServicePortBinding"
|
24
|
-
bindings_array.first.operations.keys.should include "
|
24
|
+
bindings_array.first.operations.keys.should include "getFirstNameOperation"
|
25
25
|
end
|
26
26
|
|
27
27
|
it "#get_binding_for_operation_name operation = getFirstName but without binding" do
|
28
|
-
bindings_array = subject.get_binding_for_operation_name "
|
28
|
+
bindings_array = subject.get_binding_for_operation_name "getFirstNameOperation"
|
29
29
|
|
30
|
-
bindings_array.should have(
|
30
|
+
bindings_array.should have(2).binding
|
31
31
|
bindings_array.first.should be_a WSDL::Reader::Binding
|
32
32
|
bindings_array.first.name.should eq "UserServicePortBinding"
|
33
|
-
bindings_array.first.operations.keys.should include "
|
33
|
+
bindings_array.first.operations.keys.should include "getFirstNameOperation"
|
34
34
|
end
|
35
35
|
|
36
36
|
it "#all_operations should eql to #get_operations(nil)" do
|
@@ -38,7 +38,7 @@ describe "WSDL Binding" do
|
|
38
38
|
end
|
39
39
|
|
40
40
|
it "#operation? should return true if any binding include is operation_name" do
|
41
|
-
subject.operation?("
|
41
|
+
subject.operation?("getFirstNameOperation").should be_true
|
42
42
|
end
|
43
43
|
|
44
44
|
it "#operation? should return false if all bindings dont include is operation_name" do
|
@@ -49,27 +49,27 @@ describe "WSDL Binding" do
|
|
49
49
|
context "WSDL::Reader::Binding" do
|
50
50
|
|
51
51
|
def operations
|
52
|
-
{
|
53
|
-
:soapAction => "",
|
54
|
-
:input => { :body => { :use => "literal" } },
|
55
|
-
:output => { :body => { :use => "literal" } } },
|
56
|
-
|
57
|
-
"getLastName" => { :name => "getLastName",
|
58
|
-
:soapAction => "",
|
59
|
-
:input => { :body => { :use => "literal" } },
|
60
|
-
:output => { :body => { :use => "literal" } } }
|
61
|
-
}
|
52
|
+
%w{getFirstNameOperation getLastNameOperation}
|
62
53
|
end
|
63
54
|
|
55
|
+
let(:parser) { WSDL::Reader::Parser.new('spec/fixtures/UserService.wsdl') }
|
64
56
|
subject do
|
65
|
-
|
57
|
+
parser.bindings.values.first
|
66
58
|
end
|
67
59
|
|
68
|
-
its(
|
60
|
+
its('operations.keys') { should eq operations }
|
69
61
|
its(:name) { should eq "UserServicePortBinding" }
|
70
62
|
its(:type) { should eq "tns:UserService" }
|
71
63
|
its(:style) { should eq "document" }
|
72
64
|
its(:transport) { should eq "http://schemas.xmlsoap.org/soap/http" }
|
65
|
+
|
66
|
+
it "#operation? should find for operation name" do
|
67
|
+
subject.operation?("getFirstNameOperation").should be_true
|
68
|
+
end
|
69
|
+
|
70
|
+
it "#lookup_port_type should lookup port_type from given port_types" do
|
71
|
+
subject.lookup_port_type(parser.port_types).name.should eq "UserService"
|
72
|
+
end
|
73
73
|
end
|
74
74
|
|
75
|
-
end
|
75
|
+
end
|