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,663 @@
|
|
|
1
|
+
# encoding: ASCII-8BIT
|
|
2
|
+
# SOAP4R - RPC Routing library
|
|
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/soap'
|
|
11
|
+
require 'soap/processor'
|
|
12
|
+
require 'soap/mapping'
|
|
13
|
+
require 'soap/mapping/literalregistry'
|
|
14
|
+
require 'soap/rpc/rpc'
|
|
15
|
+
require 'soap/rpc/element'
|
|
16
|
+
require 'soap/header/handlerset'
|
|
17
|
+
require 'soap/filter'
|
|
18
|
+
require 'soap/streamHandler'
|
|
19
|
+
require 'soap/mimemessage'
|
|
20
|
+
require 'soap/header/handlerset'
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
module SOAP
|
|
24
|
+
module RPC
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class Router
|
|
28
|
+
include SOAP
|
|
29
|
+
|
|
30
|
+
attr_reader :actor
|
|
31
|
+
attr_accessor :mapping_registry
|
|
32
|
+
attr_accessor :literal_mapping_registry
|
|
33
|
+
attr_accessor :generate_explicit_type
|
|
34
|
+
attr_accessor :use_default_namespace
|
|
35
|
+
attr_accessor :external_ces
|
|
36
|
+
attr_reader :filterchain
|
|
37
|
+
|
|
38
|
+
def initialize(actor)
|
|
39
|
+
@actor = actor
|
|
40
|
+
@mapping_registry = nil
|
|
41
|
+
@headerhandler = Header::HandlerSet.new
|
|
42
|
+
@literal_mapping_registry = ::SOAP::Mapping::LiteralRegistry.new
|
|
43
|
+
@generate_explicit_type = true
|
|
44
|
+
@use_default_namespace = false
|
|
45
|
+
@external_ces = nil
|
|
46
|
+
@operation_by_soapaction = {}
|
|
47
|
+
@operation_by_qname = {}
|
|
48
|
+
@headerhandlerfactory = []
|
|
49
|
+
@filterchain = Filter::FilterChain.new
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
###
|
|
53
|
+
## header handler interface
|
|
54
|
+
#
|
|
55
|
+
def add_request_headerhandler(factory)
|
|
56
|
+
unless factory.respond_to?(:create)
|
|
57
|
+
raise TypeError.new("factory must respond to 'create'")
|
|
58
|
+
end
|
|
59
|
+
@headerhandlerfactory << factory
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def add_headerhandler(handler)
|
|
63
|
+
@headerhandler.add(handler)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
###
|
|
67
|
+
## servant definition interface
|
|
68
|
+
#
|
|
69
|
+
def add_rpc_request_servant(factory, namespace)
|
|
70
|
+
unless factory.respond_to?(:create)
|
|
71
|
+
raise TypeError.new("factory must respond to 'create'")
|
|
72
|
+
end
|
|
73
|
+
obj = factory.create # a dummy instance for introspection
|
|
74
|
+
::SOAP::RPC.defined_methods(obj).each do |name|
|
|
75
|
+
begin
|
|
76
|
+
qname = XSD::QName.new(namespace, name)
|
|
77
|
+
param_def = ::SOAP::RPC::SOAPMethod.derive_rpc_param_def(obj, name)
|
|
78
|
+
opt = create_styleuse_option(:rpc, :encoded)
|
|
79
|
+
add_rpc_request_operation(factory, qname, nil, name, param_def, opt)
|
|
80
|
+
rescue SOAP::RPC::MethodDefinitionError => e
|
|
81
|
+
p e if $DEBUG
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def add_rpc_servant(obj, namespace)
|
|
87
|
+
::SOAP::RPC.defined_methods(obj).each do |name|
|
|
88
|
+
begin
|
|
89
|
+
qname = XSD::QName.new(namespace, name)
|
|
90
|
+
param_def = ::SOAP::RPC::SOAPMethod.derive_rpc_param_def(obj, name)
|
|
91
|
+
opt = create_styleuse_option(:rpc, :encoded)
|
|
92
|
+
add_rpc_operation(obj, qname, nil, name, param_def, opt)
|
|
93
|
+
rescue SOAP::RPC::MethodDefinitionError => e
|
|
94
|
+
p e if $DEBUG
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
alias add_servant add_rpc_servant
|
|
99
|
+
|
|
100
|
+
###
|
|
101
|
+
## operation definition interface
|
|
102
|
+
#
|
|
103
|
+
def add_rpc_operation(receiver, qname, soapaction, name, param_def, opt = {})
|
|
104
|
+
ensure_styleuse_option(opt, :rpc, :encoded)
|
|
105
|
+
opt[:request_qname] = qname
|
|
106
|
+
op = ApplicationScopeOperation.new(soapaction, receiver, name, param_def,
|
|
107
|
+
opt)
|
|
108
|
+
if opt[:request_style] != :rpc
|
|
109
|
+
raise RPCRoutingError.new("illegal request_style given")
|
|
110
|
+
end
|
|
111
|
+
assign_operation(soapaction, qname, op)
|
|
112
|
+
end
|
|
113
|
+
alias add_method add_rpc_operation
|
|
114
|
+
alias add_rpc_method add_rpc_operation
|
|
115
|
+
|
|
116
|
+
def add_rpc_request_operation(factory, qname, soapaction, name, param_def, opt = {})
|
|
117
|
+
ensure_styleuse_option(opt, :rpc, :encoded)
|
|
118
|
+
opt[:request_qname] = qname
|
|
119
|
+
op = RequestScopeOperation.new(soapaction, factory, name, param_def, opt)
|
|
120
|
+
if opt[:request_style] != :rpc
|
|
121
|
+
raise RPCRoutingError.new("illegal request_style given")
|
|
122
|
+
end
|
|
123
|
+
assign_operation(soapaction, qname, op)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def add_document_operation(receiver, soapaction, name, param_def, opt = {})
|
|
127
|
+
#
|
|
128
|
+
# adopt workaround for doc/lit wrapper method
|
|
129
|
+
# (you should consider to simply use rpc/lit service)
|
|
130
|
+
#
|
|
131
|
+
#unless soapaction
|
|
132
|
+
# raise RPCRoutingError.new("soapaction is a must for document method")
|
|
133
|
+
#end
|
|
134
|
+
ensure_styleuse_option(opt, :document, :literal)
|
|
135
|
+
op = ApplicationScopeOperation.new(soapaction, receiver, name, param_def,
|
|
136
|
+
opt)
|
|
137
|
+
if opt[:request_style] != :document
|
|
138
|
+
raise RPCRoutingError.new("illegal request_style given")
|
|
139
|
+
end
|
|
140
|
+
assign_operation(soapaction, first_input_part_qname(param_def), op)
|
|
141
|
+
end
|
|
142
|
+
alias add_document_method add_document_operation
|
|
143
|
+
|
|
144
|
+
def add_document_request_operation(factory, soapaction, name, param_def, opt = {})
|
|
145
|
+
#
|
|
146
|
+
# adopt workaround for doc/lit wrapper method
|
|
147
|
+
# (you should consider to simply use rpc/lit service)
|
|
148
|
+
#
|
|
149
|
+
#unless soapaction
|
|
150
|
+
# raise RPCRoutingError.new("soapaction is a must for document method")
|
|
151
|
+
#end
|
|
152
|
+
ensure_styleuse_option(opt, :document, :literal)
|
|
153
|
+
op = RequestScopeOperation.new(soapaction, receiver, name, param_def, opt)
|
|
154
|
+
if opt[:request_style] != :document
|
|
155
|
+
raise RPCRoutingError.new("illegal request_style given")
|
|
156
|
+
end
|
|
157
|
+
assign_operation(soapaction, first_input_part_qname(param_def), op)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def route(conn_data)
|
|
161
|
+
# we cannot set request_default_encodingsyle before parsing the content.
|
|
162
|
+
env = unmarshal(conn_data)
|
|
163
|
+
if env.nil?
|
|
164
|
+
raise ArgumentError.new("illegal SOAP marshal format")
|
|
165
|
+
end
|
|
166
|
+
op = lookup_operation(conn_data.soapaction, env.body)
|
|
167
|
+
headerhandler = @headerhandler.dup
|
|
168
|
+
@headerhandlerfactory.each do |f|
|
|
169
|
+
headerhandler.add(f.create)
|
|
170
|
+
end
|
|
171
|
+
soap_response = default_encodingstyle = nil
|
|
172
|
+
begin
|
|
173
|
+
receive_headers(headerhandler, env.header)
|
|
174
|
+
soap_response =
|
|
175
|
+
op.call(env.body, @mapping_registry, @literal_mapping_registry,
|
|
176
|
+
create_mapping_opt)
|
|
177
|
+
conn_data.is_fault = true if soap_response.is_a?(SOAPFault)
|
|
178
|
+
default_encodingstyle = op.response_default_encodingstyle
|
|
179
|
+
rescue Exception => e
|
|
180
|
+
# If a wsdl fault was raised by service, the fault declaration details
|
|
181
|
+
# is kept in wsdl_fault. Otherwise (exception is a program fault)
|
|
182
|
+
# wsdl_fault is nil
|
|
183
|
+
wsdl_fault_details = op.faults && op.faults[e.class.name]
|
|
184
|
+
soap_response = fault(e, wsdl_fault_details)
|
|
185
|
+
conn_data.is_fault = true
|
|
186
|
+
default_encodingstyle = nil
|
|
187
|
+
end
|
|
188
|
+
header = call_headers(headerhandler)
|
|
189
|
+
if op.response_use.nil?
|
|
190
|
+
conn_data.send_string = ''
|
|
191
|
+
conn_data.is_nocontent = true
|
|
192
|
+
conn_data
|
|
193
|
+
else
|
|
194
|
+
body = SOAPBody.new(soap_response, conn_data.is_fault)
|
|
195
|
+
env = SOAPEnvelope.new(header, body)
|
|
196
|
+
marshal(conn_data, env, default_encodingstyle)
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# Create fault response string.
|
|
201
|
+
def create_fault_response(e)
|
|
202
|
+
env = SOAPEnvelope.new(SOAPHeader.new, SOAPBody.new(fault(e, nil), true))
|
|
203
|
+
opt = {}
|
|
204
|
+
opt[:external_content] = nil
|
|
205
|
+
@filterchain.reverse_each do |filter|
|
|
206
|
+
env = filter.on_outbound(env, opt)
|
|
207
|
+
break unless env
|
|
208
|
+
end
|
|
209
|
+
response_string = Processor.marshal(env, opt)
|
|
210
|
+
conn_data = StreamHandler::ConnectionData.new(response_string)
|
|
211
|
+
conn_data.is_fault = true
|
|
212
|
+
if ext = opt[:external_content]
|
|
213
|
+
mimeize(conn_data, ext)
|
|
214
|
+
end
|
|
215
|
+
conn_data
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
private
|
|
219
|
+
|
|
220
|
+
def first_input_part_qname(param_def)
|
|
221
|
+
param_def.each do |param|
|
|
222
|
+
param = MethodDef.to_param(param)
|
|
223
|
+
if param.io_type == SOAPMethod::IN
|
|
224
|
+
return param.qname
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
nil
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def create_styleuse_option(style, use)
|
|
231
|
+
opt = {}
|
|
232
|
+
opt[:request_style] = opt[:response_style] = style
|
|
233
|
+
opt[:request_use] = opt[:response_use] = use
|
|
234
|
+
opt
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
def ensure_styleuse_option(opt, style, use)
|
|
238
|
+
if opt[:request_style] || opt[:response_style] || opt[:request_use] || opt[:response_use]
|
|
239
|
+
# do not edit
|
|
240
|
+
else
|
|
241
|
+
opt[:request_style] ||= style
|
|
242
|
+
opt[:response_style] ||= style
|
|
243
|
+
opt[:request_use] ||= use
|
|
244
|
+
opt[:response_use] ||= use
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def assign_operation(soapaction, qname, op)
|
|
249
|
+
assigned = false
|
|
250
|
+
if soapaction and !soapaction.empty?
|
|
251
|
+
@operation_by_soapaction[soapaction] = op
|
|
252
|
+
assigned = true
|
|
253
|
+
end
|
|
254
|
+
if qname
|
|
255
|
+
@operation_by_qname[qname] = op
|
|
256
|
+
assigned = true
|
|
257
|
+
end
|
|
258
|
+
unless assigned
|
|
259
|
+
raise RPCRoutingError.new("cannot assign operation")
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def lookup_operation(soapaction, body)
|
|
264
|
+
if op = @operation_by_soapaction[soapaction]
|
|
265
|
+
return op
|
|
266
|
+
end
|
|
267
|
+
qname = body.root_node.elename
|
|
268
|
+
if op = @operation_by_qname[qname]
|
|
269
|
+
return op
|
|
270
|
+
end
|
|
271
|
+
if soapaction
|
|
272
|
+
raise RPCRoutingError.new(
|
|
273
|
+
"operation: #{soapaction} #{qname} not supported")
|
|
274
|
+
else
|
|
275
|
+
raise RPCRoutingError.new("operation: #{qname} not supported")
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def call_headers(headerhandler)
|
|
280
|
+
header = ::SOAP::SOAPHeader.new
|
|
281
|
+
items = headerhandler.on_outbound(header)
|
|
282
|
+
items.each do |item|
|
|
283
|
+
header.add(item.elename.name, item)
|
|
284
|
+
end
|
|
285
|
+
header
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
def receive_headers(headerhandler, header)
|
|
289
|
+
headerhandler.on_inbound(header) if header
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
def unmarshal(conn_data)
|
|
293
|
+
xml = nil
|
|
294
|
+
opt = {}
|
|
295
|
+
contenttype = conn_data.receive_contenttype
|
|
296
|
+
if /#{MIMEMessage::MultipartContentType}/i =~ contenttype
|
|
297
|
+
opt[:external_content] = {}
|
|
298
|
+
mime = MIMEMessage.parse("Content-Type: " + contenttype,
|
|
299
|
+
conn_data.receive_string)
|
|
300
|
+
mime.parts.each do |part|
|
|
301
|
+
value = Attachment.new(part.content)
|
|
302
|
+
value.contentid = part.contentid
|
|
303
|
+
obj = SOAPAttachment.new(value)
|
|
304
|
+
opt[:external_content][value.contentid] = obj if value.contentid
|
|
305
|
+
end
|
|
306
|
+
opt[:charset] =
|
|
307
|
+
StreamHandler.parse_media_type(mime.root.headers['content-type'].str)
|
|
308
|
+
xml = mime.root.content
|
|
309
|
+
else
|
|
310
|
+
opt[:charset] = ::SOAP::StreamHandler.parse_media_type(contenttype)
|
|
311
|
+
xml = conn_data.receive_string
|
|
312
|
+
end
|
|
313
|
+
@filterchain.each do |filter|
|
|
314
|
+
xml = filter.on_inbound(xml, opt)
|
|
315
|
+
break unless xml
|
|
316
|
+
end
|
|
317
|
+
env = Processor.unmarshal(xml, opt)
|
|
318
|
+
charset = opt[:charset]
|
|
319
|
+
conn_data.send_contenttype = "text/xml; charset=\"#{charset}\""
|
|
320
|
+
env
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
def marshal(conn_data, env, default_encodingstyle = nil)
|
|
324
|
+
opt = {}
|
|
325
|
+
opt[:external_content] = nil
|
|
326
|
+
opt[:default_encodingstyle] = default_encodingstyle
|
|
327
|
+
opt[:generate_explicit_type] = @generate_explicit_type
|
|
328
|
+
opt[:use_default_namespace] = @use_default_namespace
|
|
329
|
+
@filterchain.reverse_each do |filter|
|
|
330
|
+
env = filter.on_outbound(env, opt)
|
|
331
|
+
break unless env
|
|
332
|
+
end
|
|
333
|
+
response_string = Processor.marshal(env, opt)
|
|
334
|
+
conn_data.send_string = response_string
|
|
335
|
+
if ext = opt[:external_content]
|
|
336
|
+
mimeize(conn_data, ext)
|
|
337
|
+
end
|
|
338
|
+
conn_data
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
def mimeize(conn_data, ext)
|
|
342
|
+
mime = MIMEMessage.new
|
|
343
|
+
ext.each do |k, v|
|
|
344
|
+
mime.add_attachment(v.data)
|
|
345
|
+
end
|
|
346
|
+
mime.add_part(conn_data.send_string + "\r\n")
|
|
347
|
+
mime.close
|
|
348
|
+
conn_data.send_string = mime.content_str
|
|
349
|
+
conn_data.send_contenttype = mime.headers['content-type'].str
|
|
350
|
+
conn_data
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
# Create fault response.
|
|
354
|
+
def fault(e, wsdl_fault_details)
|
|
355
|
+
if e.is_a?(UnhandledMustUnderstandHeaderError)
|
|
356
|
+
faultcode = FaultCode::MustUnderstand
|
|
357
|
+
else
|
|
358
|
+
faultcode = FaultCode::Server
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
# If the exception represents a WSDL fault, the fault element should
|
|
362
|
+
# be added as the SOAP fault <detail> element. If the exception is a
|
|
363
|
+
# normal program exception, it is wrapped inside a custom SOAP4R
|
|
364
|
+
# SOAP exception element.
|
|
365
|
+
detail = nil
|
|
366
|
+
begin
|
|
367
|
+
if (wsdl_fault_details)
|
|
368
|
+
registry = wsdl_fault_details[:use] == "literal" ?
|
|
369
|
+
@literal_mapping_registry : @mapping_registry
|
|
370
|
+
faultQName = XSD::QName.new(
|
|
371
|
+
wsdl_fault_details[:ns], wsdl_fault_details[:name]
|
|
372
|
+
)
|
|
373
|
+
detail = Mapping.obj2soap(e, registry, faultQName)
|
|
374
|
+
# wrap fault element (SOAPFault swallows top-level element)
|
|
375
|
+
wrapper = SOAP::SOAPElement.new(faultQName)
|
|
376
|
+
wrapper.add(detail)
|
|
377
|
+
detail = wrapper
|
|
378
|
+
else
|
|
379
|
+
# Exception is a normal program exception. Wrap it.
|
|
380
|
+
detail = Mapping.obj2soap(Mapping::SOAPException.new(e),
|
|
381
|
+
@mapping_registry)
|
|
382
|
+
detail.elename ||= XSD::QName::EMPTY # for literal mappingregstry
|
|
383
|
+
end
|
|
384
|
+
rescue
|
|
385
|
+
detail = SOAPString.new("failed to serialize detail object: #{$!}")
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
SOAPFault.new(
|
|
389
|
+
SOAPElement.new(nil, faultcode),
|
|
390
|
+
SOAPString.new(e.to_s),
|
|
391
|
+
SOAPString.new(@actor),
|
|
392
|
+
detail)
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
def create_mapping_opt
|
|
396
|
+
{ :external_ces => @external_ces }
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
class Operation
|
|
400
|
+
attr_reader :name
|
|
401
|
+
attr_reader :soapaction
|
|
402
|
+
attr_reader :request_style
|
|
403
|
+
attr_reader :response_style
|
|
404
|
+
attr_reader :request_use
|
|
405
|
+
attr_reader :response_use
|
|
406
|
+
attr_reader :faults
|
|
407
|
+
|
|
408
|
+
def initialize(soapaction, name, param_def, opt)
|
|
409
|
+
@soapaction = soapaction
|
|
410
|
+
@name = name
|
|
411
|
+
@request_style = opt[:request_style]
|
|
412
|
+
@response_style = opt[:response_style]
|
|
413
|
+
@request_use = opt[:request_use]
|
|
414
|
+
@response_use = opt[:response_use]
|
|
415
|
+
@faults = opt[:faults]
|
|
416
|
+
check_style(@request_style)
|
|
417
|
+
check_style(@response_style)
|
|
418
|
+
check_use(@request_use)
|
|
419
|
+
check_use(@response_use)
|
|
420
|
+
if @response_style == :rpc
|
|
421
|
+
request_qname = opt[:request_qname] or raise
|
|
422
|
+
@rpc_method_factory =
|
|
423
|
+
RPC::SOAPMethodRequest.new(request_qname, param_def, @soapaction)
|
|
424
|
+
@rpc_response_qname = opt[:response_qname]
|
|
425
|
+
else
|
|
426
|
+
@doc_request_qnames = []
|
|
427
|
+
@doc_response_qnames = []
|
|
428
|
+
param_def.each do |param|
|
|
429
|
+
param = MethodDef.to_param(param)
|
|
430
|
+
case param.io_type
|
|
431
|
+
when SOAPMethod::IN
|
|
432
|
+
@doc_request_qnames << param.qname
|
|
433
|
+
when SOAPMethod::OUT
|
|
434
|
+
@doc_response_qnames << param.qname
|
|
435
|
+
else
|
|
436
|
+
raise ArgumentError.new(
|
|
437
|
+
"illegal inout definition for document style: #{param.io_type}")
|
|
438
|
+
end
|
|
439
|
+
end
|
|
440
|
+
end
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
def request_default_encodingstyle
|
|
444
|
+
(@request_use == :encoded) ? EncodingNamespace : LiteralNamespace
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
def response_default_encodingstyle
|
|
448
|
+
(@response_use == :encoded) ? EncodingNamespace : LiteralNamespace
|
|
449
|
+
end
|
|
450
|
+
|
|
451
|
+
def call(body, mapping_registry, literal_mapping_registry, opt)
|
|
452
|
+
if @request_style == :rpc
|
|
453
|
+
values = request_rpc(body, mapping_registry, literal_mapping_registry,
|
|
454
|
+
opt)
|
|
455
|
+
else
|
|
456
|
+
values = request_document(body, mapping_registry,
|
|
457
|
+
literal_mapping_registry, opt)
|
|
458
|
+
end
|
|
459
|
+
result = receiver.method(@name.intern).call(*values)
|
|
460
|
+
return result if result.is_a?(SOAPFault)
|
|
461
|
+
if @response_style == :rpc
|
|
462
|
+
response_rpc(result, mapping_registry, literal_mapping_registry, opt)
|
|
463
|
+
elsif @doc_response_qnames.empty?
|
|
464
|
+
# nothing to do
|
|
465
|
+
else
|
|
466
|
+
response_doc(result, mapping_registry, literal_mapping_registry, opt)
|
|
467
|
+
end
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
private
|
|
471
|
+
|
|
472
|
+
def receiver
|
|
473
|
+
raise NotImplementedError.new('must be defined in derived class')
|
|
474
|
+
end
|
|
475
|
+
|
|
476
|
+
def request_rpc(body, mapping_registry, literal_mapping_registry, opt)
|
|
477
|
+
request = body.request
|
|
478
|
+
unless request.is_a?(SOAPNameAccessible)
|
|
479
|
+
if request.is_a?(SOAPNil)
|
|
480
|
+
# SOAP::Lite/0.69 seems to send xsi:nil="true" element as a request.
|
|
481
|
+
request = SOAPStruct.new(request.elename)
|
|
482
|
+
else
|
|
483
|
+
raise RPCRoutingError.new("not an RPC style")
|
|
484
|
+
end
|
|
485
|
+
end
|
|
486
|
+
if @request_use == :encoded
|
|
487
|
+
request_rpc_enc(request, mapping_registry, opt)
|
|
488
|
+
else
|
|
489
|
+
request_rpc_lit(request, literal_mapping_registry, opt)
|
|
490
|
+
end
|
|
491
|
+
end
|
|
492
|
+
|
|
493
|
+
def request_document(body, mapping_registry, literal_mapping_registry, opt)
|
|
494
|
+
# ToDo: compare names with @doc_request_qnames
|
|
495
|
+
if @request_use == :encoded
|
|
496
|
+
request_doc_enc(body, mapping_registry, opt)
|
|
497
|
+
else
|
|
498
|
+
request_doc_lit(body, literal_mapping_registry, opt)
|
|
499
|
+
end
|
|
500
|
+
end
|
|
501
|
+
|
|
502
|
+
def request_rpc_enc(request, mapping_registry, opt)
|
|
503
|
+
param = Mapping.soap2obj(request, mapping_registry, nil, opt)
|
|
504
|
+
request.collect { |key, value|
|
|
505
|
+
param[key]
|
|
506
|
+
}
|
|
507
|
+
end
|
|
508
|
+
|
|
509
|
+
def request_rpc_lit(request, mapping_registry, opt)
|
|
510
|
+
request.collect { |key, value|
|
|
511
|
+
Mapping.soap2obj(value, mapping_registry, nil, opt)
|
|
512
|
+
}
|
|
513
|
+
end
|
|
514
|
+
|
|
515
|
+
def request_doc_enc(body, mapping_registry, opt)
|
|
516
|
+
body.collect { |key, value|
|
|
517
|
+
Mapping.soap2obj(value, mapping_registry, nil, opt)
|
|
518
|
+
}
|
|
519
|
+
end
|
|
520
|
+
|
|
521
|
+
def request_doc_lit(body, mapping_registry, opt)
|
|
522
|
+
body.collect { |key, value|
|
|
523
|
+
Mapping.soap2obj(value, mapping_registry, nil, opt)
|
|
524
|
+
}
|
|
525
|
+
end
|
|
526
|
+
|
|
527
|
+
def response_rpc(result, mapping_registry, literal_mapping_registry, opt)
|
|
528
|
+
if @response_use == :encoded
|
|
529
|
+
response_rpc_enc(result, mapping_registry, opt)
|
|
530
|
+
else
|
|
531
|
+
response_rpc_lit(result, literal_mapping_registry, opt)
|
|
532
|
+
end
|
|
533
|
+
end
|
|
534
|
+
|
|
535
|
+
def response_doc(result, mapping_registry, literal_mapping_registry, opt)
|
|
536
|
+
if @doc_response_qnames.size == 0
|
|
537
|
+
result = []
|
|
538
|
+
elsif @doc_response_qnames.size == 1
|
|
539
|
+
result = [result]
|
|
540
|
+
end
|
|
541
|
+
if result.size != @doc_response_qnames.size
|
|
542
|
+
raise "required #{@doc_response_qnames.size} responses " +
|
|
543
|
+
"but #{result.size} given"
|
|
544
|
+
end
|
|
545
|
+
if @response_use == :encoded
|
|
546
|
+
response_doc_enc(result, mapping_registry, opt)
|
|
547
|
+
else
|
|
548
|
+
response_doc_lit(result, literal_mapping_registry, opt)
|
|
549
|
+
end
|
|
550
|
+
end
|
|
551
|
+
|
|
552
|
+
def response_rpc_enc(result, mapping_registry, opt)
|
|
553
|
+
soap_response =
|
|
554
|
+
@rpc_method_factory.create_method_response(@rpc_response_qname)
|
|
555
|
+
if soap_response.have_outparam?
|
|
556
|
+
unless result.is_a?(Array)
|
|
557
|
+
raise RPCRoutingError.new("out parameter was not returned")
|
|
558
|
+
end
|
|
559
|
+
outparams = {}
|
|
560
|
+
i = 1
|
|
561
|
+
soap_response.output_params.each do |outparam|
|
|
562
|
+
outparams[outparam] = Mapping.obj2soap(result[i], mapping_registry,
|
|
563
|
+
nil, opt)
|
|
564
|
+
i += 1
|
|
565
|
+
end
|
|
566
|
+
soap_response.set_outparam(outparams)
|
|
567
|
+
soap_response.retval = Mapping.obj2soap(result[0], mapping_registry,
|
|
568
|
+
nil, opt)
|
|
569
|
+
else
|
|
570
|
+
soap_response.retval = Mapping.obj2soap(result, mapping_registry, nil,
|
|
571
|
+
opt)
|
|
572
|
+
end
|
|
573
|
+
soap_response
|
|
574
|
+
end
|
|
575
|
+
|
|
576
|
+
def response_rpc_lit(result, mapping_registry, opt)
|
|
577
|
+
soap_response =
|
|
578
|
+
@rpc_method_factory.create_method_response(@rpc_response_qname)
|
|
579
|
+
if soap_response.have_outparam?
|
|
580
|
+
unless result.is_a?(Array)
|
|
581
|
+
raise RPCRoutingError.new("out parameter was not returned")
|
|
582
|
+
end
|
|
583
|
+
outparams = {}
|
|
584
|
+
i = 1
|
|
585
|
+
soap_response.output_params.each do |outparam|
|
|
586
|
+
outparams[outparam] = Mapping.obj2soap(result[i], mapping_registry,
|
|
587
|
+
XSD::QName.new(nil, outparam), opt)
|
|
588
|
+
i += 1
|
|
589
|
+
end
|
|
590
|
+
soap_response.set_outparam(outparams)
|
|
591
|
+
soap_response.retval = Mapping.obj2soap(result[0], mapping_registry,
|
|
592
|
+
soap_response.elename, opt)
|
|
593
|
+
else
|
|
594
|
+
soap_response.retval = Mapping.obj2soap(result, mapping_registry,
|
|
595
|
+
soap_response.elename, opt)
|
|
596
|
+
end
|
|
597
|
+
soap_response
|
|
598
|
+
end
|
|
599
|
+
|
|
600
|
+
def response_doc_enc(result, mapping_registry, opt)
|
|
601
|
+
(0...result.size).collect { |idx|
|
|
602
|
+
ele = Mapping.obj2soap(result[idx], mapping_registry, nil, opt)
|
|
603
|
+
ele.elename = @doc_response_qnames[idx]
|
|
604
|
+
ele
|
|
605
|
+
}
|
|
606
|
+
end
|
|
607
|
+
|
|
608
|
+
def response_doc_lit(result, mapping_registry, opt)
|
|
609
|
+
(0...result.size).collect { |idx|
|
|
610
|
+
ele = Mapping.obj2soap(result[idx], mapping_registry,
|
|
611
|
+
@doc_response_qnames[idx])
|
|
612
|
+
ele.encodingstyle = LiteralNamespace
|
|
613
|
+
ele
|
|
614
|
+
}
|
|
615
|
+
end
|
|
616
|
+
|
|
617
|
+
def check_style(style)
|
|
618
|
+
unless [:rpc, :document].include?(style)
|
|
619
|
+
raise ArgumentError.new("unknown style: #{style}")
|
|
620
|
+
end
|
|
621
|
+
end
|
|
622
|
+
|
|
623
|
+
# nil means oneway
|
|
624
|
+
def check_use(use)
|
|
625
|
+
unless [:encoded, :literal, nil].include?(use)
|
|
626
|
+
raise ArgumentError.new("unknown use: #{use}")
|
|
627
|
+
end
|
|
628
|
+
end
|
|
629
|
+
end
|
|
630
|
+
|
|
631
|
+
class ApplicationScopeOperation < Operation
|
|
632
|
+
def initialize(soapaction, receiver, name, param_def, opt)
|
|
633
|
+
super(soapaction, name, param_def, opt)
|
|
634
|
+
@receiver = receiver
|
|
635
|
+
end
|
|
636
|
+
|
|
637
|
+
private
|
|
638
|
+
|
|
639
|
+
def receiver
|
|
640
|
+
@receiver
|
|
641
|
+
end
|
|
642
|
+
end
|
|
643
|
+
|
|
644
|
+
class RequestScopeOperation < Operation
|
|
645
|
+
def initialize(soapaction, receiver_factory, name, param_def, opt)
|
|
646
|
+
super(soapaction, name, param_def, opt)
|
|
647
|
+
unless receiver_factory.respond_to?(:create)
|
|
648
|
+
raise TypeError.new("factory must respond to 'create'")
|
|
649
|
+
end
|
|
650
|
+
@receiver_factory = receiver_factory
|
|
651
|
+
end
|
|
652
|
+
|
|
653
|
+
private
|
|
654
|
+
|
|
655
|
+
def receiver
|
|
656
|
+
@receiver_factory.create
|
|
657
|
+
end
|
|
658
|
+
end
|
|
659
|
+
end
|
|
660
|
+
|
|
661
|
+
|
|
662
|
+
end
|
|
663
|
+
end
|