soybean 1.0.0
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.
- data/.document +5 -0
- data/.rspec +1 -0
- data/Gemfile +15 -0
- data/Gemfile.lock +38 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +19 -0
- data/Rakefile +44 -0
- data/VERSION +1 -0
- data/bin/soybean +22 -0
- data/bin/xsd2ruby +90 -0
- data/lib/soybean.rb +11 -0
- data/lib/soybean/actions/generate_classes.rb +33 -0
- data/soybean.gemspec +236 -0
- data/spec/soybean_spec.rb +5 -0
- data/spec/spec_helper.rb +12 -0
- data/vendor/soap4r/soap/attachment.rb +109 -0
- data/vendor/soap4r/soap/attrproxy.rb +35 -0
- data/vendor/soap4r/soap/base_data.rb +1095 -0
- data/vendor/soap4r/soap/element.rb +278 -0
- data/vendor/soap4r/soap/encodingstyle/asp_dot_net_handler.rb +208 -0
- data/vendor/soap4r/soap/encodingstyle/handler.rb +121 -0
- data/vendor/soap4r/soap/encodingstyle/literal_handler.rb +196 -0
- data/vendor/soap4r/soap/encodingstyle/soap_handler.rb +560 -0
- data/vendor/soap4r/soap/filter.rb +14 -0
- data/vendor/soap4r/soap/filter/filterchain.rb +52 -0
- data/vendor/soap4r/soap/filter/handler.rb +32 -0
- data/vendor/soap4r/soap/filter/streamhandler.rb +30 -0
- data/vendor/soap4r/soap/generator.rb +299 -0
- data/vendor/soap4r/soap/header/handler.rb +62 -0
- data/vendor/soap4r/soap/header/handlerset.rb +71 -0
- data/vendor/soap4r/soap/header/mappinghandler.rb +48 -0
- data/vendor/soap4r/soap/header/simplehandler.rb +45 -0
- data/vendor/soap4r/soap/httpconfigloader.rb +140 -0
- data/vendor/soap4r/soap/mapping.rb +13 -0
- data/vendor/soap4r/soap/mapping/encodedregistry.rb +539 -0
- data/vendor/soap4r/soap/mapping/factory.rb +389 -0
- data/vendor/soap4r/soap/mapping/literalregistry.rb +392 -0
- data/vendor/soap4r/soap/mapping/mapping.rb +577 -0
- data/vendor/soap4r/soap/mapping/registry.rb +296 -0
- data/vendor/soap4r/soap/mapping/rubytype_factory.rb +446 -0
- data/vendor/soap4r/soap/mapping/schemadefinition.rb +171 -0
- data/vendor/soap4r/soap/mapping/type_map.rb +107 -0
- data/vendor/soap4r/soap/mapping/wsdlencodedregistry.rb +212 -0
- data/vendor/soap4r/soap/mapping/wsdlliteralregistry.rb +249 -0
- data/vendor/soap4r/soap/marshal.rb +60 -0
- data/vendor/soap4r/soap/mimemessage.rb +243 -0
- data/vendor/soap4r/soap/nestedexception.rb +43 -0
- data/vendor/soap4r/soap/net_http_client.rb +242 -0
- data/vendor/soap4r/soap/ns.rb +39 -0
- data/vendor/soap4r/soap/parser.rb +253 -0
- data/vendor/soap4r/soap/processor.rb +67 -0
- data/vendor/soap4r/soap/property.rb +340 -0
- data/vendor/soap4r/soap/proxy.rb +15 -0
- data/vendor/soap4r/soap/rpc/cgistub.rb +248 -0
- data/vendor/soap4r/soap/rpc/driver.rb +222 -0
- data/vendor/soap4r/soap/rpc/element.rb +375 -0
- data/vendor/soap4r/soap/rpc/httpserver.rb +143 -0
- data/vendor/soap4r/soap/rpc/method_def.rb +69 -0
- data/vendor/soap4r/soap/rpc/proxy.rb +573 -0
- data/vendor/soap4r/soap/rpc/router.rb +663 -0
- data/vendor/soap4r/soap/rpc/rpc.rb +26 -0
- data/vendor/soap4r/soap/rpc/soaplet.rb +201 -0
- data/vendor/soap4r/soap/rpc/standalone_server.rb +44 -0
- data/vendor/soap4r/soap/soap.rb +154 -0
- data/vendor/soap4r/soap/stream_handler.rb +302 -0
- data/vendor/soap4r/soap/version.rb +9 -0
- data/vendor/soap4r/soap/wsdl_driver.rb +165 -0
- data/vendor/soap4r/wsdl/binding.rb +66 -0
- data/vendor/soap4r/wsdl/data.rb +65 -0
- data/vendor/soap4r/wsdl/definitions.rb +237 -0
- data/vendor/soap4r/wsdl/documentation.rb +33 -0
- data/vendor/soap4r/wsdl/import.rb +81 -0
- data/vendor/soap4r/wsdl/importer.rb +39 -0
- data/vendor/soap4r/wsdl/info.rb +51 -0
- data/vendor/soap4r/wsdl/message.rb +55 -0
- data/vendor/soap4r/wsdl/operation.rb +152 -0
- data/vendor/soap4r/wsdl/operation_binding.rb +241 -0
- data/vendor/soap4r/wsdl/param.rb +94 -0
- data/vendor/soap4r/wsdl/parser.rb +165 -0
- data/vendor/soap4r/wsdl/part.rb +53 -0
- data/vendor/soap4r/wsdl/port.rb +67 -0
- data/vendor/soap4r/wsdl/port_type.rb +76 -0
- data/vendor/soap4r/wsdl/service.rb +62 -0
- data/vendor/soap4r/wsdl/soap/address.rb +41 -0
- data/vendor/soap4r/wsdl/soap/binding.rb +50 -0
- data/vendor/soap4r/wsdl/soap/body.rb +59 -0
- data/vendor/soap4r/wsdl/soap/cgi_stub_creator.rb +93 -0
- data/vendor/soap4r/wsdl/soap/class_def_creator.rb +437 -0
- data/vendor/soap4r/wsdl/soap/class_def_creator_support.rb +241 -0
- data/vendor/soap4r/wsdl/soap/class_name_creator.rb +55 -0
- data/vendor/soap4r/wsdl/soap/client_skelton_creator.rb +107 -0
- data/vendor/soap4r/wsdl/soap/complex_type.rb +174 -0
- data/vendor/soap4r/wsdl/soap/data.rb +43 -0
- data/vendor/soap4r/wsdl/soap/definitions.rb +201 -0
- data/vendor/soap4r/wsdl/soap/driver_creator.rb +121 -0
- data/vendor/soap4r/wsdl/soap/element.rb +34 -0
- data/vendor/soap4r/wsdl/soap/encoded_mapping_registry_creator.rb +74 -0
- data/vendor/soap4r/wsdl/soap/fault.rb +57 -0
- data/vendor/soap4r/wsdl/soap/header.rb +87 -0
- data/vendor/soap4r/wsdl/soap/headerfault.rb +57 -0
- data/vendor/soap4r/wsdl/soap/literal_mapping_registry_creator.rb +116 -0
- data/vendor/soap4r/wsdl/soap/mapping_registry_creator.rb +59 -0
- data/vendor/soap4r/wsdl/soap/mapping_registry_creator_support.rb +377 -0
- data/vendor/soap4r/wsdl/soap/method_def_creator.rb +200 -0
- data/vendor/soap4r/wsdl/soap/operation.rb +113 -0
- data/vendor/soap4r/wsdl/soap/servant_skelton_creator.rb +92 -0
- data/vendor/soap4r/wsdl/soap/servlet_stub_creator.rb +105 -0
- data/vendor/soap4r/wsdl/soap/standalone_server_stub_creator.rb +101 -0
- data/vendor/soap4r/wsdl/soap/wsdl2ruby.rb +226 -0
- data/vendor/soap4r/wsdl/types.rb +45 -0
- data/vendor/soap4r/wsdl/wsdl.rb +25 -0
- data/vendor/soap4r/wsdl/xml_schema/all.rb +25 -0
- data/vendor/soap4r/wsdl/xml_schema/annotation.rb +35 -0
- data/vendor/soap4r/wsdl/xml_schema/any.rb +62 -0
- data/vendor/soap4r/wsdl/xml_schema/any_attribute.rb +49 -0
- data/vendor/soap4r/wsdl/xml_schema/attribute.rb +105 -0
- data/vendor/soap4r/wsdl/xml_schema/attribute_group.rb +69 -0
- data/vendor/soap4r/wsdl/xml_schema/choice.rb +59 -0
- data/vendor/soap4r/wsdl/xml_schema/complex_content.rb +98 -0
- data/vendor/soap4r/wsdl/xml_schema/complex_extension.rb +120 -0
- data/vendor/soap4r/wsdl/xml_schema/complex_restriction.rb +105 -0
- data/vendor/soap4r/wsdl/xml_schema/complex_type.rb +194 -0
- data/vendor/soap4r/wsdl/xml_schema/content.rb +96 -0
- data/vendor/soap4r/wsdl/xml_schema/data.rb +117 -0
- data/vendor/soap4r/wsdl/xml_schema/element.rb +154 -0
- data/vendor/soap4r/wsdl/xml_schema/enumeration.rb +37 -0
- data/vendor/soap4r/wsdl/xml_schema/fractiondigits.rb +38 -0
- data/vendor/soap4r/wsdl/xml_schema/group.rb +101 -0
- data/vendor/soap4r/wsdl/xml_schema/import.rb +54 -0
- data/vendor/soap4r/wsdl/xml_schema/import_handler.rb +46 -0
- data/vendor/soap4r/wsdl/xml_schema/importer.rb +103 -0
- data/vendor/soap4r/wsdl/xml_schema/include.rb +49 -0
- data/vendor/soap4r/wsdl/xml_schema/length.rb +38 -0
- data/vendor/soap4r/wsdl/xml_schema/list.rb +49 -0
- data/vendor/soap4r/wsdl/xml_schema/maxexclusive.rb +38 -0
- data/vendor/soap4r/wsdl/xml_schema/maxinclusive.rb +38 -0
- data/vendor/soap4r/wsdl/xml_schema/maxlength.rb +38 -0
- data/vendor/soap4r/wsdl/xml_schema/minexclusive.rb +38 -0
- data/vendor/soap4r/wsdl/xml_schema/mininclusive.rb +38 -0
- data/vendor/soap4r/wsdl/xml_schema/minlength.rb +38 -0
- data/vendor/soap4r/wsdl/xml_schema/parser.rb +168 -0
- data/vendor/soap4r/wsdl/xml_schema/pattern.rb +37 -0
- data/vendor/soap4r/wsdl/xml_schema/ref.rb +34 -0
- data/vendor/soap4r/wsdl/xml_schema/schema.rb +179 -0
- data/vendor/soap4r/wsdl/xml_schema/sequence.rb +55 -0
- data/vendor/soap4r/wsdl/xml_schema/simple_content.rb +70 -0
- data/vendor/soap4r/wsdl/xml_schema/simple_extension.rb +63 -0
- data/vendor/soap4r/wsdl/xml_schema/simple_restriction.rb +133 -0
- data/vendor/soap4r/wsdl/xml_schema/simple_type.rb +88 -0
- data/vendor/soap4r/wsdl/xml_schema/totaldigits.rb +38 -0
- data/vendor/soap4r/wsdl/xml_schema/union.rb +36 -0
- data/vendor/soap4r/wsdl/xml_schema/unique.rb +35 -0
- data/vendor/soap4r/wsdl/xml_schema/whitespace.rb +38 -0
- data/vendor/soap4r/wsdl/xml_schema/xsd2ruby.rb +176 -0
- data/vendor/soap4r/xsd/charset.rb +190 -0
- data/vendor/soap4r/xsd/codegen.rb +13 -0
- data/vendor/soap4r/xsd/codegen/classdef.rb +209 -0
- data/vendor/soap4r/xsd/codegen/commentdef.rb +35 -0
- data/vendor/soap4r/xsd/codegen/gensupport.rb +277 -0
- data/vendor/soap4r/xsd/codegen/methoddef.rb +71 -0
- data/vendor/soap4r/xsd/codegen/moduledef.rb +209 -0
- data/vendor/soap4r/xsd/datatypes.rb +1466 -0
- data/vendor/soap4r/xsd/datatypes1999.rb +21 -0
- data/vendor/soap4r/xsd/iconvcharset.rb +34 -0
- data/vendor/soap4r/xsd/mapping.rb +69 -0
- data/vendor/soap4r/xsd/namedelements.rb +133 -0
- data/vendor/soap4r/xsd/ns.rb +183 -0
- data/vendor/soap4r/xsd/qname.rb +80 -0
- data/vendor/soap4r/xsd/xmlparser.rb +77 -0
- data/vendor/soap4r/xsd/xmlparser/libxmlparser.rb +116 -0
- data/vendor/soap4r/xsd/xmlparser/parser.rb +101 -0
- data/vendor/soap4r/xsd/xmlparser/rexmlparser.rb +59 -0
- data/vendor/soap4r/xsd/xmlparser/xmlparser.rb +51 -0
- data/vendor/soap4r/xsd/xmlparser/xmlscanner.rb +150 -0
- metadata +316 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
# encoding: ASCII-8BIT
|
|
2
|
+
# SOAP4R - WSDL literal mapping registry.
|
|
3
|
+
# Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
|
4
|
+
|
|
5
|
+
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
|
6
|
+
# redistribute it and/or modify it under the same terms of Ruby's license;
|
|
7
|
+
# either the dual license version in 2003, or any later version.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
require 'soap/base_data'
|
|
11
|
+
require 'soap/mapping/mapping'
|
|
12
|
+
require 'soap/mapping/literalregistry'
|
|
13
|
+
require 'soap/mapping/type_map'
|
|
14
|
+
require 'xsd/codegen/gensupport'
|
|
15
|
+
require 'xsd/namedelements'
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
module SOAP
|
|
19
|
+
module Mapping
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class WSDLLiteralRegistry < LiteralRegistry
|
|
23
|
+
attr_reader :definedelements
|
|
24
|
+
attr_reader :definedtypes
|
|
25
|
+
|
|
26
|
+
def initialize(definedtypes = XSD::NamedElements::Empty,
|
|
27
|
+
definedelements = XSD::NamedElements::Empty)
|
|
28
|
+
super()
|
|
29
|
+
@definedtypes = definedtypes
|
|
30
|
+
@definedelements = definedelements
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def obj2soap(obj, qname, obj_class = nil)
|
|
34
|
+
soap_obj = nil
|
|
35
|
+
if obj.is_a?(SOAPElement)
|
|
36
|
+
soap_obj = obj
|
|
37
|
+
elsif eledef = @definedelements[qname]
|
|
38
|
+
soap_obj = obj2elesoap(obj, eledef)
|
|
39
|
+
elsif type = @definedtypes[qname]
|
|
40
|
+
soap_obj = obj2typesoap(obj, type)
|
|
41
|
+
else
|
|
42
|
+
soap_obj = any2soap(obj, qname, obj_class)
|
|
43
|
+
end
|
|
44
|
+
return soap_obj if soap_obj
|
|
45
|
+
if @excn_handler_obj2soap
|
|
46
|
+
soap_obj = @excn_handler_obj2soap.call(obj) { |yield_obj|
|
|
47
|
+
Mapping.obj2soap(yield_obj, nil, nil, MAPPING_OPT)
|
|
48
|
+
}
|
|
49
|
+
return soap_obj if soap_obj
|
|
50
|
+
end
|
|
51
|
+
raise MappingError.new("cannot map #{obj.class.name} as #{qname}")
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# node should be a SOAPElement
|
|
55
|
+
def soap2obj(node, obj_class = nil)
|
|
56
|
+
cause = nil
|
|
57
|
+
begin
|
|
58
|
+
return any2obj(node, obj_class)
|
|
59
|
+
rescue MappingError
|
|
60
|
+
cause = $!
|
|
61
|
+
end
|
|
62
|
+
if @excn_handler_soap2obj
|
|
63
|
+
begin
|
|
64
|
+
return @excn_handler_soap2obj.call(node) { |yield_node|
|
|
65
|
+
Mapping.soap2obj(yield_node, nil, nil, MAPPING_OPT)
|
|
66
|
+
}
|
|
67
|
+
rescue Exception
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
if node.respond_to?(:type)
|
|
71
|
+
raise MappingError.new("cannot map #{node.type.name} to Ruby object", cause)
|
|
72
|
+
else
|
|
73
|
+
raise MappingError.new("cannot map #{node.elename.name} to Ruby object", cause)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
|
|
79
|
+
def obj2elesoap(obj, eledef)
|
|
80
|
+
ele = nil
|
|
81
|
+
qualified = (eledef.elementform == 'qualified')
|
|
82
|
+
if obj.is_a?(SOAPNil)
|
|
83
|
+
ele = obj
|
|
84
|
+
elsif eledef.type
|
|
85
|
+
if type = @definedtypes[eledef.type]
|
|
86
|
+
ele = obj2typesoap(obj, type)
|
|
87
|
+
elsif type = TypeMap[eledef.type]
|
|
88
|
+
ele = base2soap(obj, type)
|
|
89
|
+
else
|
|
90
|
+
raise MappingError.new("cannot find type #{eledef.type}")
|
|
91
|
+
end
|
|
92
|
+
elsif eledef.local_complextype
|
|
93
|
+
ele = obj2typesoap(obj, eledef.local_complextype)
|
|
94
|
+
elsif eledef.local_simpletype
|
|
95
|
+
ele = obj2typesoap(obj, eledef.local_simpletype)
|
|
96
|
+
else
|
|
97
|
+
raise MappingError.new('illegal schema?')
|
|
98
|
+
end
|
|
99
|
+
ele.elename = eledef.name
|
|
100
|
+
ele.qualified = qualified
|
|
101
|
+
ele
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def obj2typesoap(obj, type)
|
|
105
|
+
ele = nil
|
|
106
|
+
if type.is_a?(::WSDL::XMLSchema::SimpleType)
|
|
107
|
+
ele = simpleobj2soap(obj, type)
|
|
108
|
+
else # complexType
|
|
109
|
+
if type.simplecontent
|
|
110
|
+
ele = simpleobj2soap(obj, type.simplecontent)
|
|
111
|
+
else
|
|
112
|
+
ele = complexobj2soap(obj, type)
|
|
113
|
+
end
|
|
114
|
+
ele.type = type.name
|
|
115
|
+
if type.base or Mapping.root_type_hint
|
|
116
|
+
Mapping.reset_root_type_hint
|
|
117
|
+
ele.force_typed = true
|
|
118
|
+
end
|
|
119
|
+
add_definedattributes2soap(obj, ele, type)
|
|
120
|
+
end
|
|
121
|
+
ele
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def simpleobj2soap(obj, type)
|
|
125
|
+
type.check_lexical_format(obj)
|
|
126
|
+
return SOAPNil.new if obj.nil?
|
|
127
|
+
if type.base
|
|
128
|
+
ele = base2soap(obj, TypeMap[type.base])
|
|
129
|
+
elsif type.list
|
|
130
|
+
value = obj.is_a?(Array) ? obj.join(" ") : obj.to_s
|
|
131
|
+
ele = base2soap(value, SOAP::SOAPString)
|
|
132
|
+
else
|
|
133
|
+
raise MappingError.new("unsupported simpleType: #{type}")
|
|
134
|
+
end
|
|
135
|
+
ele
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def complexobj2soap(obj, type)
|
|
139
|
+
ele = SOAPElement.new(type.name)
|
|
140
|
+
complexobj2sequencesoap(obj, ele, type, type.choice?, type.choice?)
|
|
141
|
+
ele
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def complexobj2sequencesoap(obj, soap, type, nillable, is_choice)
|
|
145
|
+
added = false
|
|
146
|
+
type.elements.each do |child_ele|
|
|
147
|
+
case child_ele
|
|
148
|
+
when WSDL::XMLSchema::Any
|
|
149
|
+
any = Mapping.get_attributes_for_any(obj)
|
|
150
|
+
SOAPElement.from_objs(any).each do |child|
|
|
151
|
+
soap.add(child)
|
|
152
|
+
end
|
|
153
|
+
ele_added = true
|
|
154
|
+
when WSDL::XMLSchema::Element
|
|
155
|
+
ele_added = complexobj2soapchildren(obj, soap, child_ele, nillable)
|
|
156
|
+
when WSDL::XMLSchema::Sequence
|
|
157
|
+
ele_added = complexobj2sequencesoap(obj, soap, child_ele, nillable, false)
|
|
158
|
+
when WSDL::XMLSchema::Choice
|
|
159
|
+
ele_added = complexobj2sequencesoap(obj, soap, child_ele, true, true)
|
|
160
|
+
else
|
|
161
|
+
raise MappingError.new("unknown type: #{child_ele}")
|
|
162
|
+
end
|
|
163
|
+
added = true if ele_added
|
|
164
|
+
break if is_choice and ele_added
|
|
165
|
+
end
|
|
166
|
+
added
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def complexobj2soapchildren(obj, soap, child_ele, nillable = false)
|
|
170
|
+
if child_ele.map_as_array?
|
|
171
|
+
complexobj2soapchildren_array(obj, soap, child_ele, nillable)
|
|
172
|
+
else
|
|
173
|
+
complexobj2soapchildren_single(obj, soap, child_ele, nillable)
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def complexobj2soapchildren_array(obj, soap, child_ele, nillable)
|
|
178
|
+
child = Mapping.get_attribute(obj, child_ele.name.name)
|
|
179
|
+
if child.nil? and obj.is_a?(::Array)
|
|
180
|
+
child = obj
|
|
181
|
+
end
|
|
182
|
+
if child.nil?
|
|
183
|
+
return false if nillable
|
|
184
|
+
if child_soap = nil2soap(child_ele)
|
|
185
|
+
soap.add(child_soap)
|
|
186
|
+
return true
|
|
187
|
+
else
|
|
188
|
+
return false
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
unless child.respond_to?(:each)
|
|
192
|
+
return false
|
|
193
|
+
end
|
|
194
|
+
child.each do |item|
|
|
195
|
+
if item.is_a?(SOAPElement)
|
|
196
|
+
soap.add(item)
|
|
197
|
+
else
|
|
198
|
+
child_soap = obj2elesoap(item, child_ele)
|
|
199
|
+
soap.add(child_soap)
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
true
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def complexobj2soapchildren_single(obj, soap, child_ele, nillable)
|
|
206
|
+
child = Mapping.get_attribute(obj, child_ele.name.name)
|
|
207
|
+
case child
|
|
208
|
+
when NilClass
|
|
209
|
+
return false if nillable
|
|
210
|
+
if child_soap = nil2soap(child_ele)
|
|
211
|
+
soap.add(child_soap)
|
|
212
|
+
true
|
|
213
|
+
else
|
|
214
|
+
false
|
|
215
|
+
end
|
|
216
|
+
when SOAPElement
|
|
217
|
+
soap.add(child)
|
|
218
|
+
true
|
|
219
|
+
else
|
|
220
|
+
child_soap = obj2elesoap(child, child_ele)
|
|
221
|
+
soap.add(child_soap)
|
|
222
|
+
true
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def nil2soap(ele)
|
|
227
|
+
if ele.nillable
|
|
228
|
+
obj2elesoap(nil, ele) # add an empty element
|
|
229
|
+
elsif ele.minoccurs == 0
|
|
230
|
+
nil # intends no element
|
|
231
|
+
else
|
|
232
|
+
warn("nil not allowed: #{ele.name.name}")
|
|
233
|
+
nil
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
def add_definedattributes2soap(obj, ele, typedef)
|
|
238
|
+
if typedef.attributes
|
|
239
|
+
typedef.attributes.each do |at|
|
|
240
|
+
value = get_xmlattr_value(obj, at.name)
|
|
241
|
+
ele.extraattr[at.name] = value unless value.nil?
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
end
|
|
249
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# encoding: ASCII-8BIT
|
|
2
|
+
# SOAP4R - Marshalling/Unmarshalling Ruby's object using SOAP Encoding.
|
|
3
|
+
# Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
|
4
|
+
|
|
5
|
+
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
|
6
|
+
# redistribute it and/or modify it under the same terms of Ruby's license;
|
|
7
|
+
# either the dual license version in 2003, or any later version.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
require "soap/mapping"
|
|
11
|
+
require "soap/processor"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
module SOAP
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
module Marshal
|
|
18
|
+
# Trying xsd:dateTime data to be recovered as aTime.
|
|
19
|
+
MarshalMappingRegistry = Mapping::EncodedRegistry.new(
|
|
20
|
+
:allow_original_mapping => true)
|
|
21
|
+
MarshalMappingRegistry.add(
|
|
22
|
+
Time,
|
|
23
|
+
::SOAP::SOAPDateTime,
|
|
24
|
+
::SOAP::Mapping::EncodedRegistry::DateTimeFactory
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
class << self
|
|
28
|
+
public
|
|
29
|
+
def dump(obj, io = nil)
|
|
30
|
+
marshal(obj, MarshalMappingRegistry, io)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def load(stream)
|
|
34
|
+
unmarshal(stream, MarshalMappingRegistry)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def marshal(obj, mapping_registry = MarshalMappingRegistry, io = nil)
|
|
38
|
+
elename = Mapping.name2elename(obj.class.to_s)
|
|
39
|
+
soap_obj = Mapping.obj2soap(obj, mapping_registry)
|
|
40
|
+
body = SOAPBody.new
|
|
41
|
+
body.add(elename, soap_obj)
|
|
42
|
+
env = SOAPEnvelope.new(nil, body)
|
|
43
|
+
SOAP::Processor.marshal(env, {}, io)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def unmarshal(stream, mapping_registry = MarshalMappingRegistry)
|
|
47
|
+
env = SOAP::Processor.unmarshal(stream)
|
|
48
|
+
if env.nil?
|
|
49
|
+
raise ArgumentError.new("Illegal SOAP marshal format.")
|
|
50
|
+
end
|
|
51
|
+
Mapping.soap2obj(env.body.root_node, mapping_registry)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
SOAPMarshal = SOAP::Marshal
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
# encoding: ASCII-8BIT
|
|
2
|
+
# SOAP4R - MIME Message implementation.
|
|
3
|
+
# Copyright (C) 2002 Jamie Herre.
|
|
4
|
+
|
|
5
|
+
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
|
6
|
+
# redistribute it and/or modify it under the same terms of Ruby's license;
|
|
7
|
+
# either the dual license version in 2003, or any later version.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
require 'soap/attachment'
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
module SOAP
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# Classes for MIME message handling. Should be put somewhere else!
|
|
17
|
+
# Tried using the 'tmail' module but found that I needed something
|
|
18
|
+
# lighter in weight.
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class MIMEMessage
|
|
22
|
+
class MIMEMessageError < StandardError; end
|
|
23
|
+
|
|
24
|
+
MultipartContentType = 'multipart/\w+'
|
|
25
|
+
|
|
26
|
+
class Header
|
|
27
|
+
attr_accessor :str, :key, :root
|
|
28
|
+
|
|
29
|
+
def initialize
|
|
30
|
+
@attrs = {}
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def [](key)
|
|
34
|
+
@attrs[key]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def []=(key, value)
|
|
38
|
+
@attrs[key] = value
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def to_s
|
|
42
|
+
@key + ": " + @str
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
class Headers < Hash
|
|
47
|
+
def self.parse(str)
|
|
48
|
+
new.parse(str)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def parse(str)
|
|
52
|
+
header_cache = nil
|
|
53
|
+
str = str.lines if str.respond_to?(:lines) # RubyJedi: compatible with Ruby 1.8.6 and above
|
|
54
|
+
str.each do |line|
|
|
55
|
+
case line
|
|
56
|
+
when /^\A[^\: \t]+:\s*.+$/
|
|
57
|
+
parse_line(header_cache) if header_cache
|
|
58
|
+
header_cache = line.sub(/\r?\n\z/, '')
|
|
59
|
+
when /^\A\s+(.*)$/
|
|
60
|
+
# a continuous line at the beginning line crashes here.
|
|
61
|
+
header_cache << line
|
|
62
|
+
else
|
|
63
|
+
raise RuntimeError.new("unexpected header: #{line.inspect}")
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
parse_line(header_cache) if header_cache
|
|
67
|
+
self
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def parse_line(line)
|
|
71
|
+
if /^\A([^\: \t]+):\s*(.+)\z/ =~ line
|
|
72
|
+
header = parse_rhs($2.strip)
|
|
73
|
+
header.key = $1.strip
|
|
74
|
+
self[header.key.downcase] = header
|
|
75
|
+
else
|
|
76
|
+
raise RuntimeError.new("unexpected header line: #{line.inspect}")
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def parse_rhs(str)
|
|
81
|
+
a = str.split(/;+\s+/)
|
|
82
|
+
header = Header.new
|
|
83
|
+
header.str = str
|
|
84
|
+
header.root = a.shift
|
|
85
|
+
a.each do |pair|
|
|
86
|
+
if pair =~ /(\w+)\s*=\s*"?([^"]+)"?/
|
|
87
|
+
header[$1.downcase] = $2
|
|
88
|
+
else
|
|
89
|
+
raise RuntimeError.new("unexpected header component: #{pair.inspect}")
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
header
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def add(key, value)
|
|
96
|
+
if key != nil and value != nil
|
|
97
|
+
header = parse_rhs(value)
|
|
98
|
+
header.key = key
|
|
99
|
+
self[key.downcase] = header
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def to_s
|
|
104
|
+
self.values.collect { |hdr|
|
|
105
|
+
hdr.to_s
|
|
106
|
+
}.join("\r\n")
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
class Part
|
|
111
|
+
attr_accessor :headers, :body
|
|
112
|
+
|
|
113
|
+
def initialize
|
|
114
|
+
@headers = Headers.new
|
|
115
|
+
@headers.add("Content-Transfer-Encoding", "8bit")
|
|
116
|
+
@body = nil
|
|
117
|
+
@contentid = nil
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def self.parse(str)
|
|
121
|
+
new.parse(str)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def parse(str)
|
|
125
|
+
headers, body = str.split(/\r\n\r\n/, 2)
|
|
126
|
+
if headers != nil and body != nil
|
|
127
|
+
@headers = Headers.parse(headers)
|
|
128
|
+
@body = body.sub(/\r\n\z/, '')
|
|
129
|
+
else
|
|
130
|
+
raise RuntimeError.new("unexpected part: #{str.inspect}")
|
|
131
|
+
end
|
|
132
|
+
self
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def contentid
|
|
136
|
+
if @contentid == nil and @headers.key?('content-id')
|
|
137
|
+
@contentid = @headers['content-id'].str
|
|
138
|
+
@contentid = $1 if @contentid =~ /^<(.+)>$/
|
|
139
|
+
end
|
|
140
|
+
@contentid
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
alias content body
|
|
144
|
+
|
|
145
|
+
def to_s
|
|
146
|
+
@headers.to_s + "\r\n\r\n" + @body
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def initialize
|
|
151
|
+
@parts = []
|
|
152
|
+
@headers = Headers.new
|
|
153
|
+
@root = nil
|
|
154
|
+
@boundary = nil
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def self.parse(head, str)
|
|
158
|
+
new.parse(head, str)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
attr_reader :parts, :headers
|
|
162
|
+
|
|
163
|
+
def close
|
|
164
|
+
@headers.add(
|
|
165
|
+
"Content-Type",
|
|
166
|
+
"multipart/related; type=\"text/xml\"; boundary=\"#{boundary}\"; start=\"#{@parts[0].contentid}\""
|
|
167
|
+
)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def parse(head, str)
|
|
171
|
+
@headers = Headers.parse(head + "\r\n" + "From: jfh\r\n")
|
|
172
|
+
boundary = @headers['content-type']['boundary']
|
|
173
|
+
if boundary != nil
|
|
174
|
+
parts = str.split(/--#{Regexp.quote(boundary)}\s*(?:\r\n|--\r\n)/)
|
|
175
|
+
part = parts.shift # preamble must be ignored.
|
|
176
|
+
@parts = parts.collect { |part| Part.parse(part) }
|
|
177
|
+
else
|
|
178
|
+
@parts = [Part.parse(str)]
|
|
179
|
+
end
|
|
180
|
+
if @parts.length < 1
|
|
181
|
+
raise MIMEMessageError.new("This message contains no valid parts!")
|
|
182
|
+
end
|
|
183
|
+
self
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def root
|
|
187
|
+
if @root == nil
|
|
188
|
+
start = @headers['content-type']['start']
|
|
189
|
+
@root = (start && @parts.find { |prt| prt.contentid == start }) ||
|
|
190
|
+
@parts[0]
|
|
191
|
+
end
|
|
192
|
+
@root
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def boundary
|
|
196
|
+
if @boundary == nil
|
|
197
|
+
@boundary = "----=Part_" + __id__.to_s + rand.to_s
|
|
198
|
+
end
|
|
199
|
+
@boundary
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def add_part(content)
|
|
203
|
+
part = Part.new
|
|
204
|
+
part.headers.add("Content-Type",
|
|
205
|
+
"text/xml; charset=" + XSD::Charset.xml_encoding_label)
|
|
206
|
+
part.headers.add("Content-ID", Attachment.contentid(part))
|
|
207
|
+
part.body = content
|
|
208
|
+
@parts.unshift(part)
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
def add_attachment(attach)
|
|
212
|
+
part = Part.new
|
|
213
|
+
part.headers.add("Content-Type", attach.contenttype)
|
|
214
|
+
part.headers.add("Content-ID", attach.mime_contentid)
|
|
215
|
+
part.body = attach.content
|
|
216
|
+
@parts.unshift(part)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def has_parts?
|
|
220
|
+
(@parts.length > 0)
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def headers_str
|
|
224
|
+
@headers.to_s
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
def content_str
|
|
228
|
+
str = ''
|
|
229
|
+
@parts.each do |prt|
|
|
230
|
+
str << "--" + boundary + "\r\n"
|
|
231
|
+
str << prt.to_s + "\r\n"
|
|
232
|
+
end
|
|
233
|
+
str << '--' + boundary + "--\r\n"
|
|
234
|
+
str
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
def to_s
|
|
238
|
+
str = headers_str + "\r\n\r\n" + conent_str
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
end
|