Changeset 1975
- Timestamp:
- 09/19/07 11:29:44 (10 months ago)
- Files:
-
- trunk/lib/soap/encodingstyle/handler.rb (modified) (1 diff)
- trunk/lib/soap/encodingstyle/literalHandler.rb (modified) (1 diff)
- trunk/lib/soap/encodingstyle/soapHandler.rb (modified) (1 diff)
- trunk/lib/soap/generator.rb (modified) (5 diffs)
- trunk/lib/soap/rpc/proxy.rb (modified) (3 diffs)
- trunk/lib/soap/wsdlDriver.rb (modified) (1 diff)
- trunk/lib/xsd/ns.rb (modified) (3 diffs)
- trunk/test/soap/test_custom_ns.rb (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/lib/soap/encodingstyle/handler.rb
r1936 r1975 95 95 end 96 96 97 def encode_attr_key(attrs, ns, qname) 98 if qname.namespace.nil? 99 qname.name 100 else 101 unless ns.assigned_as_tagged?(qname.namespace) 102 Generator.assign_ns!(attrs, ns, qname.namespace) 103 end 104 ns.name_attr(qname) 105 end 106 end 107 97 108 def encode_qname(attrs, ns, qname) 98 unless qname.namespace.nil? 109 if qname.namespace.nil? 110 qname.name 111 else 99 112 Generator.assign_ns(attrs, ns, qname.namespace) 100 113 ns.name(qname) 101 else102 qname.name103 114 end 104 115 end trunk/lib/soap/encodingstyle/literalHandler.rb
r1974 r1975 32 32 data.extraattr.each do |key, value| 33 33 next if !@generate_explicit_type and key == XSD::AttrTypeName 34 # ToDo: check generator.attributeformdefault here35 34 keytag = key 36 35 if key.is_a?(XSD::QName) 37 keytag = encode_ qname(attrs, ns, key)36 keytag = encode_attr_key(attrs, ns, key) 38 37 end 39 38 if value.is_a?(XSD::QName) trunk/lib/soap/encodingstyle/soapHandler.rb
r1970 r1975 302 302 keytag = key 303 303 if key.is_a?(XSD::QName) 304 keytag = encode_ qname(attrs, ns, key)304 keytag = encode_attr_key(attrs, ns, key) 305 305 end 306 306 if value.is_a?(XSD::QName) trunk/lib/soap/generator.rb
r1974 r1975 41 41 @generate_explicit_type = 42 42 opt.key?(:generate_explicit_type) ? opt[:generate_explicit_type] : true 43 # ':elementformdefault' is for backward compatibility44 43 @use_default_namespace = opt[:use_default_namespace] 45 44 @attributeformdefault = opt[:attributeformdefault] … … 54 53 @buf = io || '' 55 54 @indent = '' 56 @encode_char_regexp = 57 ENCODE_CHAR_REGEXP[XSD::Charset.encoding] ||= 58 Regexp.new("[#{EncodeMap.keys.join}]", nil, XSD::Charset.encoding) 55 @encode_char_regexp = get_encode_char_regexp() 59 56 60 57 prologue … … 213 210 end 214 211 212 def encode_string(str) 213 @buf << get_encoded(str) 214 end 215 216 def element_local?(element) 217 element.elename.namespace.nil? 218 end 219 220 def self.assign_ns(attrs, ns, namespace, tag = nil) 221 if namespace.nil? 222 raise FormatEncodeError.new("empty namespace") 223 end 224 override_default_ns = (tag == '' and namespace != ns.default_namespace) 225 if override_default_ns or !ns.assigned?(namespace) 226 assign_ns!(attrs, ns, namespace, tag) 227 end 228 end 229 230 def self.assign_ns!(attrs, ns, namespace, tag = nil) 231 tag = ns.assign(namespace, tag) 232 if tag == '' 233 attr = 'xmlns' 234 else 235 attr = "xmlns:#{tag}" 236 end 237 attrs[attr] = namespace 238 end 239 240 private 241 242 def prologue 243 end 244 245 def epilogue 246 end 247 215 248 ENCODE_CHAR_REGEXP = {} 216 249 … … 223 256 "\r" => '
' 224 257 } 225 226 def encode_string(str)227 @buf << get_encoded(str)228 end229 258 230 259 def get_encoded(str) … … 243 272 end 244 273 245 def element_local?(element) 246 element.elename.namespace.nil? 247 end 248 249 def self.assign_ns(attrs, ns, namespace, tag = nil) 250 if namespace.nil? 251 raise FormatEncodeError.new("empty namespace") 252 end 253 override_default_ns = (tag == '' and namespace != ns.default_namespace) 254 if override_default_ns or !ns.assigned?(namespace) 255 tag = ns.assign(namespace, tag) 256 if tag == '' 257 attr = 'xmlns' 258 else 259 attr = "xmlns:#{tag}" 260 end 261 attrs[attr] = namespace 262 end 263 end 264 265 private 266 267 def prologue 268 end 269 270 def epilogue 274 def get_encode_char_regexp 275 ENCODE_CHAR_REGEXP[XSD::Charset.encoding] ||= 276 Regexp.new("[#{EncodeMap.keys.join}]", nil, XSD::Charset.encoding) 271 277 end 272 278 trunk/lib/soap/rpc/proxy.rb
r1974 r1975 132 132 :default_encodingstyle => 133 133 @default_encodingstyle || op_info.request_default_encodingstyle, 134 :use_default_namespace => @use_default_namespace, 135 :elementformdefault => op_info.elementformdefault, 136 :attributeformdefault => op_info.attributeformdefault 134 :use_default_namespace => 135 op_info.use_default_namespace || @use_default_namespace 137 136 ) 138 137 resopt = create_encoding_opt( 139 138 :envelopenamespace => @options["soap.envelope.responsenamespace"], 140 139 :default_encodingstyle => 141 @default_encodingstyle || op_info.response_default_encodingstyle, 142 :use_default_namespace => @use_default_namespace, 143 :elementformdefault => op_info.elementformdefault, 144 :attributeformdefault => op_info.attributeformdefault 140 @default_encodingstyle || op_info.response_default_encodingstyle 145 141 ) 146 142 env = route(req_header, req_body, reqopt, resopt) … … 355 351 attr_reader :request_use 356 352 attr_reader :response_use 357 attr_reader :elementformdefault 358 attr_reader :attributeformdefault 353 attr_reader :use_default_namespace 359 354 360 355 def initialize(soapaction, param_def, opt) … … 364 359 @request_use = opt[:request_use] 365 360 @response_use = opt[:response_use] 366 # set nil(unqualified) by default 367 @elementformdefault = opt[:elementformdefault] 368 @attributeformdefault = opt[:attributeformdefault] 361 @use_default_namespace = 362 opt[:use_default_namespace] || opt[:elementformdefault] 363 if opt.key?(:elementformdefault) 364 warn("option :elementformdefault is deprecated. use :use_default_namespace instead") 365 end 369 366 check_style(@request_style) 370 367 check_style(@response_style) trunk/lib/soap/wsdlDriver.rb
r1953 r1975 128 128 :response_style => op_bind.soapoperation_style, 129 129 :request_use => op_bind.soapbody_use_input, 130 :response_use => op_bind.soapbody_use_output, 131 :elementformdefault => false, 132 :attributeformdefault => false 130 :response_use => op_bind.soapbody_use_output 133 131 } 134 132 if op_bind.soapoperation_style == :rpc trunk/lib/xsd/ns.rb
r1956 r1975 25 25 26 26 def initialize(known_tag) 27 @known_tag = known_tag 27 @known_tag = known_tag.dup 28 28 @count = 0 29 29 end … … 77 77 end 78 78 79 def assigned_as_tagged?(ns) 80 @ns2tag.key?(ns) 81 end 82 79 83 def assigned_tag?(tag) 80 84 @tag2ns.key?(tag) … … 88 92 end 89 93 90 def name( name)91 if (name.namespace == @default_namespace)92 name.name93 elsif tag = @ns2tag[ name.namespace]94 "#{tag}:#{ name.name}"94 def name(qname) 95 if qname.namespace == @default_namespace 96 qname.name 97 elsif tag = @ns2tag[qname.namespace] 98 "#{tag}:#{qname.name}" 95 99 else 96 raise FormatError.new("namespace: #{name.namespace} not defined yet") 100 raise FormatError.new("namespace: #{qname.namespace} not defined yet") 101 end 102 end 103 104 # no default namespace 105 def name_attr(qname) 106 if tag = @ns2tag[qname.namespace] 107 "#{tag}:#{qname.name}" 108 else 109 raise FormatError.new("namespace: #{qname.namespace} not defined yet") 97 110 end 98 111 end trunk/test/soap/test_custom_ns.rb
r1973 r1975 39 39 __XML__ 40 40 41 XML_WITH_DEFAULT_NS = <<__XML__.chomp 42 <?xml version="1.0" encoding="utf-8" ?> 43 <env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" 44 xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" 45 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 46 <env:Header> 47 <headeritem xmlns="my:foo">hi</headeritem> 48 </env:Header> 49 <env:Body> 50 <test xmlns:n1="my:bar" 51 xmlns:n2="my:foo" 52 n1:baz="qux" 53 n2:quxx="quxxx" 54 xmlns="my:foo">bi</test> 55 </env:Body> 56 </env:Envelope> 57 __XML__ 58 41 59 def test_custom_ns 42 60 # create test env … … 65 83 assert_equal(CUSTOM_NS_XML, result) 66 84 end 85 86 def test_default_namespace 87 # create test env 88 header = SOAP::SOAPHeader.new() 89 hi = SOAP::SOAPElement.new(XSD::QName.new("my:foo", "headeritem"), 'hi') 90 header.add("test", hi) 91 body = SOAP::SOAPBody.new() 92 bi = SOAP::SOAPElement.new(XSD::QName.new("my:foo", "bodyitem"), 'bi') 93 bi.extraattr[XSD::QName.new('my:bar', 'baz')] = 'qux' 94 bi.extraattr[XSD::QName.new('my:foo', 'quxx')] = 'quxxx' 95 body.add("test", bi) 96 env = SOAP::SOAPEnvelope.new(header, body) 97 # normal 98 opt = {:use_default_namespace => true} 99 result = SOAP::Processor.marshal(env, opt) 100 assert_equal(XML_WITH_DEFAULT_NS, result) 101 end 67 102 end 68 103