wsdl-reader 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. data/.gitignore +4 -0
  2. data/.idea/.name +1 -0
  3. data/.idea/.rakeTasks +7 -0
  4. data/.idea/encodings.xml +5 -0
  5. data/.idea/misc.xml +350 -0
  6. data/.idea/modules.xml +9 -0
  7. data/.idea/projectCodeStyle.xml +123 -0
  8. data/.idea/vcs.xml +7 -0
  9. data/.idea/workspace.xml +683 -0
  10. data/.idea/wsdl-reader.iml +25 -0
  11. data/.rspec +2 -0
  12. data/Gemfile +4 -0
  13. data/Guardfile +9 -0
  14. data/Rakefile +1 -0
  15. data/lib/wsdl-reader.rb +15 -0
  16. data/lib/wsdl-reader/binding.rb +148 -0
  17. data/lib/wsdl-reader/core_ext.rb +28 -0
  18. data/lib/wsdl-reader/error.rb +29 -0
  19. data/lib/wsdl-reader/message.rb +50 -0
  20. data/lib/wsdl-reader/parser.rb +105 -0
  21. data/lib/wsdl-reader/port_type.rb +106 -0
  22. data/lib/wsdl-reader/request.rb +213 -0
  23. data/lib/wsdl-reader/response.rb +72 -0
  24. data/lib/wsdl-reader/service.rb +56 -0
  25. data/lib/wsdl-reader/version.rb +5 -0
  26. data/lib/wsdl-reader/wsdl.rb +48 -0
  27. data/lib/wsdl-reader/xsd.rb +98 -0
  28. data/lib/wsdl-reader/xsd/complextype.rb +136 -0
  29. data/lib/wsdl-reader/xsd/convert.rb +142 -0
  30. data/lib/wsdl-reader/xsd/element.rb +168 -0
  31. data/lib/wsdl-reader/xsd/enumeration.rb +6 -0
  32. data/lib/wsdl-reader/xsd/restriction.rb +76 -0
  33. data/lib/wsdl-reader/xsd/sequence.rb +117 -0
  34. data/lib/wsdl-reader/xsd/simpletype.rb +83 -0
  35. data/spec/binding_spec.rb +67 -0
  36. data/spec/fixtures/OneFileUserService.wsdl +114 -0
  37. data/spec/fixtures/UserService.wsdl +63 -0
  38. data/spec/fixtures/UserService.xsd +56 -0
  39. data/spec/message_spec.rb +22 -0
  40. data/spec/parser_spec.rb +56 -0
  41. data/spec/port_type_spec.rb +32 -0
  42. data/spec/request_spec.rb +9 -0
  43. data/spec/spec_helper.rb +24 -0
  44. data/wsdl-reader.gemspec +27 -0
  45. metadata +122 -0
@@ -0,0 +1,136 @@
1
+ module SOAP
2
+ class XSD
3
+ class ComplexType < Hash
4
+ def initialize( type )
5
+ type.attributes.each { |name, value|
6
+ self[name.to_sym] = value
7
+ }
8
+
9
+ type.find_all{ |e| e.class == REXML::Element }.each { |content|
10
+ case content.name
11
+ when "simpleContent"
12
+ raise SOAP::LCElementError, "Malformated complexType `#{type.attributes['name']}'" unless self[:type].nil?
13
+ self[:type] = :simpleContent
14
+ ###############################################################################
15
+ warn "xsd:simpleContent in xsd:complexType (global definition) is not yet supported!"
16
+ ###############################################################################
17
+ when "complexContent"
18
+ raise SOAP::LCElementError, "Malformated complexType `#{type.attributes['name']}'" unless self[:type].nil?
19
+ self[:type] = :complexContent
20
+ ###############################################################################
21
+ warn "xsd:complexContent in xsd:complexType (global definition) is not yet supported!"
22
+ ###############################################################################
23
+ when "group"
24
+ raise SOAP::LCElementError, "Malformated complexType `#{type.attributes['name']}'" unless self[:type].nil?
25
+ self[:type] = :group
26
+ ###############################################################################
27
+ warn "xsd:group in xsd:complexType (global definition) is not yet supported!"
28
+ ###############################################################################
29
+ when "all"
30
+ raise SOAP::LCElementError, "Malformated complexType `#{type.attributes['name']}'" unless self[:type].nil?
31
+ self[:type] = :all
32
+ ###############################################################################
33
+ warn "xsd:all in xsd:complexType (global definition) is not yet supported!"
34
+ ###############################################################################
35
+ when "choise"
36
+ raise SOAP::LCElementError, "Malformated complexType `#{type.attributes['name']}'" unless self[:type].nil?
37
+ self[:type] = :choise
38
+ ###############################################################################
39
+ warn "xsd:choise in xsd:complexType (global definition) is not yet supported!"
40
+ ###############################################################################
41
+ when "sequence"
42
+ raise SOAP::LCElementError, "Malformated complexType `#{type.attributes['name']}'" unless self[:type].nil?
43
+ self[:type] = :sequence
44
+ self[:sequence] = SOAP::XSD::Sequence.new( content )
45
+ when "attribute"
46
+ raise SOAP::LCElementError, "Malformated complexType `#{type.attributes['name']}'" if (not(self[:attributes_type].nil?) and self[:attributes_type] != :attribute) or [:simpleContent, :complexContent].include?(self[:type])
47
+ self[:attributes_type] = :attribute
48
+ ###############################################################################
49
+ warn "xsd:attribute in xsd:complexType (global definition) is not yet supported!"
50
+ ###############################################################################
51
+ when "attributeGroup"
52
+ raise SOAP::LCElementError, "Malformated complexType `#{type.attributes['name']}'" if (not(self[:attributes_type].nil?) and self[:attributes_type] != :attributeGroup) or [:simpleContent, :complexContent].include?(self[:type])
53
+ self[:attributes_type] = :attributeGroup
54
+ ###############################################################################
55
+ warn "xsd:attributeGroup in xsd:complexType (global definition) is not yet supported!"
56
+ ###############################################################################
57
+ when "anyAttribute"
58
+ raise SOAP::LCElementError, "Malformated complexType `#{type.attributes['name']}'" if not(self[:any_attributes].nil?) or [:simpleContent, :complexContent].include?(self[:type])
59
+ self[:any_attributes] = :anyAttribute
60
+ ###############################################################################
61
+ warn "xsd:anyAttribute in xsd:complexType (global definition) is not yet supported!"
62
+ ###############################################################################
63
+ when "annotation"
64
+ ###############################################################################
65
+ warn "xsd:annotation in xsd:complexType (global definition) (global definition) is not yet supported!"
66
+ ###############################################################################
67
+ else
68
+ raise SOAP::LCElementError, "Invalid element `#{content.name}' in xsd:complexType `#{type.attributes['name']}'"
69
+ end
70
+ }
71
+ end
72
+
73
+ def display( types, args )
74
+ r = ""
75
+
76
+ case self[:type]
77
+ when :simpleContent
78
+ ###############################################################################
79
+ warn "xsd:simpleContent in xsd:complexType (global definition) is not yet supported!"
80
+ ###############################################################################
81
+ when :complexContent
82
+ ###############################################################################
83
+ warn "xsd:complexContent in xsd:complexType (global definition) is not yet supported!"
84
+ ###############################################################################
85
+ when :group
86
+ ###############################################################################
87
+ warn "xsd:group in xsd:complexType (global definition) is not yet supported!"
88
+ ###############################################################################
89
+ when :all
90
+ ###############################################################################
91
+ warn "xsd:all in xsd:complexType (global definition) is not yet supported!"
92
+ ###############################################################################
93
+ when :choise
94
+ ###############################################################################
95
+ warn "xsd:choise in xsd:complexType (global definition) is not yet supported!"
96
+ ###############################################################################
97
+ when :sequence
98
+ r << self[:sequence].display( types, args )
99
+ #else
100
+ # raise SOAP::LCWSDLError, "Malformated complexType `#{self[:name]}'"
101
+ end
102
+
103
+ return r
104
+ end
105
+
106
+ def responseToHash( xml, types )
107
+ r = {}
108
+ case self[:type]
109
+ when :simpleContent
110
+ ###############################################################################
111
+ warn "xsd:simpleContent in xsd:complexType (global definition) is not yet supported!"
112
+ ###############################################################################
113
+ when :complexContent
114
+ ###############################################################################
115
+ warn "xsd:complexContent in xsd:complexType (global definition) is not yet supported!"
116
+ ###############################################################################
117
+ when :group
118
+ ###############################################################################
119
+ warn "xsd:group in xsd:complexType (global definition) is not yet supported!"
120
+ ###############################################################################
121
+ when :all
122
+ ###############################################################################
123
+ warn "xsd:all in xsd:complexType (global definition) is not yet supported!"
124
+ ###############################################################################
125
+ when :choise
126
+ ###############################################################################
127
+ warn "xsd:choise in xsd:complexType (global definition) is not yet supported!"
128
+ ###############################################################################
129
+ when :sequence
130
+ r = self[:sequence].responseToHash( xml, types )
131
+ end
132
+ return r
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,142 @@
1
+ module SOAP
2
+ class XSD
3
+ class Convert
4
+
5
+ def self.to_ruby( t, v )
6
+ new().c( t.gsub( /.*:/, "xsd_" ), v )
7
+ end
8
+
9
+ def c( t, v )
10
+ self.method( t ).call( v )
11
+ end
12
+
13
+ def xsd_int( x )
14
+ x.to_i
15
+ end
16
+ alias_method :xsd_long, :xsd_int
17
+ alias_method :xsd_integer, :xsd_int
18
+
19
+ def xsd_float( x )
20
+ x.to_f
21
+ end
22
+ alias_method :xsd_double, :xsd_float
23
+ alias_method :xsd_decimal, :xsd_float
24
+
25
+ def xsd_string( x )
26
+ x
27
+ end
28
+ alias_method :xsd_normalizedString, :xsd_string
29
+
30
+ def xsd_boolean( x )
31
+ (x == "true")
32
+ end
33
+
34
+ def xsd_duration( x )
35
+ x
36
+ end
37
+ def xsd_dateTime( x )
38
+ x
39
+ end
40
+ def xsd_time( x )
41
+ x
42
+ end
43
+ def xsd_date( x )
44
+ x
45
+ end
46
+ def xsd_gYearMonth( x )
47
+ x
48
+ end
49
+ def xsd_gYear( x )
50
+ x
51
+ end
52
+ def xsd_gMonthDay( x )
53
+ x
54
+ end
55
+ def xsd_gDay( x )
56
+ x
57
+ end
58
+ def xsd_gMonth( x )
59
+ x
60
+ end
61
+ def xsd_base64Binary( x )
62
+ x
63
+ end
64
+ def xsd_hexBinary( x )
65
+ x
66
+ end
67
+ def xsd_anyURI( x )
68
+ x
69
+ end
70
+ def xsd_QName( x )
71
+ x
72
+ end
73
+ def xsd_NOTATION( x )
74
+ x
75
+ end
76
+ def xsd_token( x )
77
+ x
78
+ end
79
+ def xsd_language( x )
80
+ x
81
+ end
82
+ def xsd_Name( x )
83
+ x
84
+ end
85
+ def xsd_NMTOKEN( x )
86
+ x
87
+ end
88
+ def xsd_NCName( x )
89
+ x
90
+ end
91
+ def xsd_NMTOKENS( x )
92
+ x
93
+ end
94
+ def xsd_ID( x )
95
+ x
96
+ end
97
+ def xsd_IDREF( x )
98
+ x
99
+ end
100
+ def xsd_ENTITY( x )
101
+ x
102
+ end
103
+ def xsd_IDREFS( x )
104
+ x
105
+ end
106
+ def xsd_ENTITIES( x )
107
+ x
108
+ end
109
+ def xsd_nonPositiveInteger( x )
110
+ x
111
+ end
112
+ def xsd_nonNegativeInteger( x )
113
+ x
114
+ end
115
+ def xsd_negativeInteger( x )
116
+ x
117
+ end
118
+ def xsd_unsignedLong( x )
119
+ x
120
+ end
121
+ def xsd_positiveInteger( x )
122
+ x
123
+ end
124
+ def xsd_short( x )
125
+ x
126
+ end
127
+ def xsd_unsignedInt( x )
128
+ x
129
+ end
130
+ def xsd_byte( x )
131
+ x
132
+ end
133
+ def xsd_unsignedShort( x )
134
+ x
135
+ end
136
+ def xsd_unsignedByte( x )
137
+ x
138
+ end
139
+ end
140
+ end
141
+ end
142
+
@@ -0,0 +1,168 @@
1
+ module SOAP
2
+ class XSD
3
+ class Element < Hash
4
+ def initialize( type )
5
+ type.attributes.each { |name, value|
6
+ self[name.to_sym] = value
7
+ }
8
+
9
+ type.find_all{ |e| e.class == REXML::Element }.each { |content|
10
+ case content.name
11
+ when "simpleType"
12
+ raise SOAP::LCElementError, "Malformated element `#{type.attributes['name']}'" unless self[:type].nil?
13
+ self[:type] = :simpleType
14
+ ###############################################################################
15
+ warn "xsd:simpleType in xsd:element is not yet supported!"
16
+ ###############################################################################
17
+ when "complexType"
18
+ raise SOAP::LCElementError, "Malformated element `#{type.attributes['name']}'" unless self[:type].nil?
19
+ self[:type] = :complexType
20
+ self[:complexType] = SOAP::XSD::ComplexType.new( content )
21
+ when "unique"
22
+ raise SOAP::LCElementError, "Malformated element `#{type.attributes['name']}'" unless self[:key].nil?
23
+ self[:key] = :unique
24
+ ###############################################################################
25
+ warn "xsd:unique in xsd:element is not yet supported!"
26
+ ###############################################################################
27
+ when "key"
28
+ raise SOAP::LCElementError, "Malformated element `#{type.attributes['name']}'" unless self[:key].nil?
29
+ self[:key] = :key
30
+ ###############################################################################
31
+ warn "xsd:unique in xsd:element is not yet supported!"
32
+ ###############################################################################
33
+ when "keyref"
34
+ raise SOAP::LCElementError, "Malformated element `#{type.attributes['name']}'" unless self[:key].nil?
35
+ self[:key] = :keyref
36
+ ###############################################################################
37
+ warn "xsd:unique in xsd:element is not yet supported!"
38
+ ###############################################################################
39
+ when "annotation"
40
+ ###############################################################################
41
+ warn "xsd:annotation in xsd:complexType (global definition) (global definition) is not yet supported!"
42
+ ###############################################################################
43
+ else
44
+ raise SOAP::LCElementError, "Invalid element `#{content.name}' in xsd:element `#{type.attributes['name']}'"
45
+ end
46
+ }
47
+ end
48
+
49
+ def display( types, args )
50
+ r = ""
51
+
52
+ min, max = getOccures( args )
53
+
54
+ if self[:type].is_a?(String) && SOAP::XSD::ANY_SIMPLE_TYPE.include?( self[:type].nns )
55
+ r << SOAP::XSD.displayBuiltinType( self[:name], args, min, max )
56
+ else
57
+ case types[self[:type].nns][:type]
58
+ when :simpleType
59
+ if args.keys.include?( self[:name].to_sym )
60
+ args[self[:name].to_sym] = [args[self[:name].to_sym]] unless args[self[:name].to_sym].class == Array
61
+ if args[self[:name].to_sym].size < min or args[self[:name].to_sym].size > max
62
+ raise SOAP::LCArgumentError, "Wrong number or values for parameter `#{name}'"
63
+ end
64
+ args[self[:name].to_sym].each { |v|
65
+ r << "<#{self[:name]}>"
66
+ r << "#{v}" ############ CHECK !!!
67
+ r << "</#{self[:name]}>\n"
68
+ }
69
+ elsif min > 0
70
+ raise SOAP::LCArgumentError, "Missing parameter `#{name}'" if min > 0
71
+ end
72
+ when :complexType
73
+ if args.keys.include?( self[:name].to_sym )
74
+ if args.keys.include?( self[:name].to_sym )
75
+ args[self[:name].to_sym] = [args[self[:name].to_sym]] unless args[self[:name].to_sym].class == Array
76
+ if args[self[:name].to_sym].size < min or args[self[:name].to_sym].size > max
77
+ raise SOAP::LCArgumentError, "Wrong number or values for parameter `#{name}'"
78
+ end
79
+ args[self[:name].to_sym].each { |v|
80
+ r << "<#{self[:name]}>"
81
+ r << types[self[:type].nns][:value].display( types, v )
82
+ r << "</#{self[:name]}>\n"
83
+ }
84
+ elsif min > 0
85
+ raise SOAP::LCArgumentError, "Missing parameter `#{name}'" if min > 0
86
+ end
87
+ else
88
+ r << "<#{self[:name]}>\n"
89
+ r << types[self[:type].nns][:value].display( types, args )
90
+ r << "</#{self[:name]}>\n"
91
+ end
92
+ else
93
+ raise SOAL::LCWSDLError, "Malformated element `#{self[:name]}'"
94
+ end
95
+ end
96
+
97
+ return r
98
+ end
99
+
100
+ def getOccures( args )
101
+ element_min = self[:minOccurs].to_i || 1
102
+ element_max = self[:maxOccurs] || "1"
103
+ if element_max == "unbounded"
104
+ if args.keys.include?(self[:name].to_sym)
105
+ if args[self[:name].to_sym].class == Array
106
+ element_max = args[self[:name].to_sym].size
107
+ else
108
+ element_max = 1
109
+ end
110
+ else
111
+ element_max = 1
112
+ end
113
+ else
114
+ element_max = element_max.to_i
115
+ end
116
+
117
+ return( [element_min, element_max] )
118
+ end
119
+
120
+ def responseToHash( xml, types )
121
+ r = {}
122
+
123
+ if SOAP::XSD::ANY_SIMPLE_TYPE.include?( self[:type].to_s.nns )
124
+ xml.each { |e|
125
+ if e.name == self[:name]
126
+ r[self[:name]] = SOAP::XSD::Convert.to_ruby( self[:type].to_s, e.text )
127
+ end
128
+ }
129
+ else
130
+ case self[:type]
131
+ when :simpleType
132
+ # **************************** TODO ************************************
133
+ when :complexType
134
+ # **************************** NEED TO BE VERIFIED ************************************
135
+ r = self[:complexType].responseToHash( xml, types )
136
+ else
137
+ xml.each { |e|
138
+ if e.name == self[:name]
139
+ case types[self[:type].to_s.nns][:type]
140
+ when :simpleType
141
+ if r.keys.include?(self[:name])
142
+ unless r[self[:name]].class == Array
143
+ r[self[:name]] = [r[self[:name]]]
144
+ end
145
+ r[self[:name]] << types[self[:type].to_s.nns][:value].responseToHash( e.text, types )
146
+ else
147
+ r[self[:name]] = types[self[:type].to_s.nns][:value].responseToHash( e.text, types )
148
+ end
149
+ else
150
+ if r.keys.include?(self[:name])
151
+ unless r[self[:name]].class == Array
152
+ r[self[:name]] = [r[self[:name]]]
153
+ end
154
+ r[self[:name]] << types[self[:type].to_s.nns][:value].responseToHash( e, types )
155
+ else
156
+ r[self[:name]] = types[self[:type].to_s.nns][:value].responseToHash( e, types )
157
+ end
158
+ end
159
+ end
160
+ }
161
+ end
162
+ end
163
+
164
+ return r
165
+ end
166
+ end
167
+ end
168
+ end
@@ -0,0 +1,6 @@
1
+ module SOAP
2
+ class XSD
3
+ class Enumeration < Array
4
+ end
5
+ end
6
+ end