Changeset 1012
- Timestamp:
- 10/14/03 01:07:13 (5 years ago)
- Files:
-
- trunk/lib/soap/baseData.rb (modified) (4 diffs)
- trunk/lib/soap/element.rb (modified) (6 diffs)
- trunk/lib/soap/encodingstyle/aspDotNetHandler.rb (modified) (5 diffs)
- trunk/lib/soap/encodingstyle/handler.rb (modified) (1 diff)
- trunk/lib/soap/encodingstyle/literalHandler.rb (modified) (6 diffs)
- trunk/lib/soap/encodingstyle/soapHandler.rb (modified) (9 diffs)
- trunk/lib/soap/generator.rb (modified) (8 diffs)
- trunk/lib/soap/marshal.rb (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/lib/soap/baseData.rb
r972 r1012 42 42 43 43 ### 44 ## Marker of SOAP/DM types. 45 # 46 module SOAPType; end 47 48 49 ### 44 50 ## Mix-in module for SOAP base type instances. 45 51 # 46 52 module SOAPBasetype 53 include SOAPType 47 54 include SOAP 48 55 … … 76 83 # 77 84 module SOAPCompoundtype 85 include SOAPType 78 86 include SOAP 79 87 … … 169 177 end 170 178 171 def SOAPReference.create_refid(obj)179 def self.create_refid(obj) 172 180 'id' << obj.__id__.to_s 173 181 end … … 598 606 data[idxary.last] = value 599 607 600 if value.is_a?(SOAP Basetype) || value.is_a?(SOAPCompoundtype)608 if value.is_a?(SOAPType) 601 609 value.elename = value.elename.dup_name('item') 602 610 trunk/lib/soap/element.rb
r950 r1012 85 85 end 86 86 87 def encode( buf, ns, attrs = {}, indent = '')87 def encode(generator, ns, attrs = {}) 88 88 SOAPGenerator.assign_ns(attrs, ns, EnvelopeNamespace) 89 89 SOAPGenerator.assign_ns(attrs, ns, EncodingNamespace) 90 90 attrs[ns.name(AttrEncodingStyleName)] = EncodingNamespace 91 91 name = ns.name(@elename) 92 SOAPGenerator.encode_tag(buf, name, attrs, indent)92 generator.encode_tag(name, attrs) 93 93 yield(self.faultcode, false) 94 94 yield(self.faultstring, false) 95 95 yield(self.faultactor, false) 96 96 yield(self.detail, false) if self.detail 97 SOAPGenerator.encode_tag_end(buf, name, indent, true)97 generator.encode_tag_end(name, true) 98 98 end 99 99 end … … 113 113 end 114 114 115 def encode( buf, ns, attrs = {}, indent = '')116 name = ns.name(@elename) 117 SOAPGenerator.encode_tag(buf, name, attrs, indent)115 def encode(generator, ns, attrs = {}) 116 name = ns.name(@elename) 117 generator.encode_tag(name, attrs) 118 118 if @is_fault 119 119 yield(@data, true) … … 123 123 end 124 124 end 125 SOAPGenerator.encode_tag_end(buf, name, indent, true)125 generator.encode_tag_end(name, true) 126 126 end 127 127 … … 161 161 end 162 162 163 def encode( buf, ns, attrs = {}, indent = '')163 def encode(generator, ns, attrs = {}) 164 164 attrs.each do |key, value| 165 165 @content.attr[key] = value … … 186 186 end 187 187 188 def encode( buf, ns, attrs = {}, indent = '')189 name = ns.name(@elename) 190 SOAPGenerator.encode_tag(buf, name, attrs, indent)188 def encode(generator, ns, attrs = {}) 189 name = ns.name(@elename) 190 generator.encode_tag(name, attrs) 191 191 @data.each do |data| 192 192 yield(data, true) 193 193 end 194 SOAPGenerator.encode_tag_end(buf, name, indent, true)194 generator.encode_tag_end(name, true) 195 195 end 196 196 … … 216 216 end 217 217 218 def encode( buf, ns, attrs = {}, indent = '')218 def encode(generator, ns, attrs = {}) 219 219 SOAPGenerator.assign_ns(attrs, ns, EnvelopeNamespace, 220 220 SOAPNamespaceTag) 221 221 name = ns.name(@elename) 222 SOAPGenerator.encode_tag(buf, name, attrs, indent)222 generator.encode_tag(name, attrs) 223 223 224 224 yield(@header, true) if @header and @header.length > 0 225 225 yield(@body, true) 226 226 227 SOAPGenerator.encode_tag_end(buf, name, indent, true)228 end 229 end 230 231 232 end 227 generator.encode_tag_end(name, true) 228 end 229 end 230 231 232 end trunk/lib/soap/encodingstyle/aspDotNetHandler.rb
r959 r1012 39 39 ## encode interface. 40 40 # 41 def encode_data( buf, ns, qualified, data, parent, indent = '')41 def encode_data(generator, ns, qualified, data, parent) 42 42 attrs = {} 43 43 name = if qualified and data.elename.namespace … … 50 50 case data 51 51 when SOAPRawString 52 SOAPGenerator.encode_tag(buf, name, attrs, indent)53 buf << data.to_s52 generator.encode_tag(name, attrs) 53 generator.encode_rawstring(data.to_s) 54 54 when XSD::XSDString 55 SOAPGenerator.encode_tag(buf, name, attrs, indent) 56 buf << SOAPGenerator.encode_str(@charset ? 57 XSD::Charset.encoding_to_xml(data.to_s, @charset) : data.to_s) 55 generator.encode_tag(name, attrs) 56 generator.encode_string(@charset ? XSD::Charset.encoding_to_xml(data.to_s, @charset) : data.to_s) 58 57 when XSD::XSDAnySimpleType 59 SOAPGenerator.encode_tag(buf, name, attrs, indent)60 buf << SOAPGenerator.encode_str(data.to_s)58 generator.encode_tag(name, attrs) 59 generator.encode_string(data.to_s) 61 60 when SOAPStruct 62 SOAPGenerator.encode_tag(buf, name, attrs, indent)61 generator.encode_tag(name, attrs) 63 62 data.each do |key, value| 64 63 if !value.elename.namespace … … 68 67 end 69 68 when SOAPArray 70 SOAPGenerator.encode_tag(buf, name, attrs, indent)69 generator.encode_tag(name, attrs) 71 70 data.traverse do |child, *rank| 72 71 data.position = nil … … 79 78 end 80 79 81 def encode_data_end( buf, ns, qualified, data, parent, indent = "")80 def encode_data_end(generator, ns, qualified, data, parent) 82 81 name = if qualified and data.elename.namespace 83 82 ns.name(data.elename) … … 86 85 end 87 86 cr = data.is_a?(SOAPCompoundtype) 88 SOAPGenerator.encode_tag_end(buf, name, indent, cr)87 generator.encode_tag_end(name, cr) 89 88 end 90 89 trunk/lib/soap/encodingstyle/handler.rb
r959 r1012 70 70 # 71 71 # Returns a XML instance as a string. 72 def encode_data( buf, ns, qualified, data, parent, indent)72 def encode_data(generator, ns, qualified, data, parent) 73 73 raise NotImplementError.new('Method encode_data must be defined in derived class.') 74 74 end 75 75 76 def encode_data_end( buf, ns, qualified, data, parent, indent)76 def encode_data_end(generator, ns, qualified, data, parent) 77 77 raise NotImplementError.new('Method encode_data must be defined in derived class.') 78 78 end trunk/lib/soap/encodingstyle/literalHandler.rb
r959 r1012 38 38 ## encode interface. 39 39 # 40 def encode_data( buf, ns, qualified, data, parent, indent = '')40 def encode_data(generator, ns, qualified, data, parent) 41 41 attrs = {} 42 42 name = if qualified and data.elename.namespace … … 49 49 case data 50 50 when SOAPRawString 51 SOAPGenerator.encode_tag(buf, name, attrs, indent)52 buf << data.to_s51 generator.encode_tag(name, attrs) 52 generator.encode_rawstring(data.to_s) 53 53 when XSD::XSDString 54 SOAPGenerator.encode_tag(buf, name, attrs, indent) 55 buf << SOAPGenerator.encode_str(@charset ? 56 XSD::Charset.encoding_to_xml(data.to_s, @charset) : data.to_s) 54 generator.encode_tag(name, attrs) 55 generator.encode_string(@charset ? XSD::Charset.encoding_to_xml(data.to_s, @charset) : data.to_s) 57 56 when XSD::XSDAnySimpleType 58 SOAPGenerator.encode_tag(buf, name, attrs, indent)59 buf << SOAPGenerator.encode_str(data.to_s)57 generator.encode_tag(name, attrs) 58 generator.encode_string(data.to_s) 60 59 when SOAPStruct 61 SOAPGenerator.encode_tag(buf, name, attrs, indent)60 generator.encode_tag(name, attrs) 62 61 data.each do |key, value| 63 62 value.elename.namespace = data.elename.namespace if !value.elename.namespace … … 65 64 end 66 65 when SOAPArray 67 SOAPGenerator.encode_tag(buf, name, attrs, indent)66 generator.encode_tag(name, attrs) 68 67 data.traverse do |child, *rank| 69 68 data.position = nil … … 71 70 end 72 71 when SOAPElement 73 SOAPGenerator.encode_tag(buf, name, attrs.update(data.extraattr), 74 indent) 75 buf << data.text if data.text 72 generator.encode_tag(name, attrs.update(data.extraattr)) 73 generator.encode_rawstring(data.text) if data.text 76 74 data.each do |key, value| 77 75 value.elename.namespace = data.elename.namespace if !value.elename.namespace … … 84 82 end 85 83 86 def encode_data_end( buf, ns, qualified, data, parent, indent)84 def encode_data_end(generator, ns, qualified, data, parent) 87 85 name = if qualified and data.elename.namespace 88 86 ns.name(data.elename) … … 90 88 data.elename.name 91 89 end 92 SOAPGenerator.encode_tag_end(buf, name, indent)90 generator.encode_tag_end(name) 93 91 end 94 92 trunk/lib/soap/encodingstyle/soapHandler.rb
r1005 r1012 41 41 ## encode interface. 42 42 # 43 def encode_data( buf, ns, qualified, data, parent, indent = '')44 attrs = encode_attrs( ns, qualified, data, parent)43 def encode_data(generator, ns, qualified, data, parent) 44 attrs = encode_attrs(generator, ns, data, parent) 45 45 46 46 if parent && parent.is_a?(SOAPArray) && parent.position … … 56 56 end 57 57 58 if data.respond_to?(:encode)59 SOAPGenerator.encode_tag(buf, name, attrs, indent)60 return data.encode(buf, ns, attrs, indent)61 end62 63 58 case data 64 59 when SOAPReference 65 60 attrs['href'] = '#' << data.refid 66 SOAPGenerator.encode_tag(buf, name, attrs, indent)61 generator.encode_tag(name, attrs) 67 62 when SOAPRawString 68 SOAPGenerator.encode_tag(buf, name, attrs, indent)69 buf << data.to_s63 generator.encode_tag(name, attrs) 64 generator.encode_rawstring(data.to_s) 70 65 when XSD::XSDString 71 SOAPGenerator.encode_tag(buf, name, attrs, indent) 72 buf << SOAPGenerator.encode_str(@charset ? 73 XSD::Charset.encoding_to_xml(data.to_s, @charset) : data.to_s) 66 generator.encode_tag(name, attrs) 67 generator.encode_string(@charset ? XSD::Charset.encoding_to_xml(data.to_s, @charset) : data.to_s) 74 68 when XSD::XSDAnySimpleType 75 SOAPGenerator.encode_tag(buf, name, attrs, indent)76 buf << SOAPGenerator.encode_str(data.to_s)69 generator.encode_tag(name, attrs) 70 generator.encode_string(data.to_s) 77 71 when SOAPStruct 78 SOAPGenerator.encode_tag(buf, name, attrs, indent)72 generator.encode_tag(name, attrs) 79 73 data.each do |key, value| 80 74 yield(value, false) 81 75 end 82 76 when SOAPArray 83 SOAPGenerator.encode_tag(buf, name, attrs, indent)77 generator.encode_tag(name, attrs) 84 78 data.traverse do |child, *rank| 85 79 data.position = data.sparse ? rank : nil … … 92 86 end 93 87 94 def encode_data_end( buf, ns, qualified, data, parent, indent = '')88 def encode_data_end(generator, ns, qualified, data, parent) 95 89 name = if qualified and data.elename.namespace 96 90 ns.name(data.elename) … … 99 93 end 100 94 cr = data.is_a?(SOAPCompoundtype) 101 SOAPGenerator.encode_tag_end(buf, name, indent, cr)95 generator.encode_tag_end(name, cr) 102 96 end 103 97 … … 293 287 end 294 288 295 def encode_attrs( ns, qualified, data, parent)289 def encode_attrs(generator, ns, data, parent) 296 290 return {} if data.is_a?(SOAPReference) 297 291 attrs = {} … … 331 325 data.extraattr.each do |key, value| 332 326 SOAPGenerator.assign_ns(attrs, ns, key.namespace) 333 attrs[ns.name(key)] = value # ns.name(value) ?327 attrs[ns.name(key)] = encode_attr_value(generator, ns, key, value) 334 328 end 335 329 if data.id … … 337 331 end 338 332 attrs 333 end 334 335 def encode_attr_value(generator, ns, qname, value) 336 if value.is_a?(SOAPType) 337 refid = SOAPReference.create_refid(value) 338 value.id = refid 339 generator.add_reftarget(qname.name, value) 340 '#' + refid 341 else 342 value.to_s 343 end 339 344 end 340 345 … … 511 516 next 512 517 end 513 extraattr[qname] = value518 extraattr[qname] = decode_attr_value(ns, qname, value) 514 519 end 515 520 516 521 return is_nil, type, arytype, root, offset, position, href, id, extraattr 522 end 523 524 def decode_attr_value(ns, qname, value) 525 if /\A#/ =~ value 526 o = SOAPReference.new(value) 527 @refpool << o 528 o 529 else 530 value 531 end 517 532 end 518 533 … … 527 542 @refpool = @refpool.find_all { |ref| 528 543 o = @idpool.find { |item| 529 ('#' << item.id == ref.refid)544 '#' + item.id == ref.refid 530 545 } 531 546 unless o trunk/lib/soap/generator.rb
r1006 r1012 40 40 attr_accessor :default_encodingstyle 41 41 attr_accessor :generate_explicit_type 42 attr_accessor :pretty43 42 44 43 def initialize(opt = {}) … … 49 48 @generate_explicit_type = 50 49 opt.key?(:generate_explicit_type) ? opt[:generate_explicit_type] : true 51 @ pretty = true # opt[:pretty]50 @buf = @indent = @curr = nil 52 51 end 53 52 54 53 def generate(obj, io = nil) 54 @buf = io || '' 55 @indent = '' 56 55 57 prologue 56 58 @handlers.each do |uri, handler| … … 58 60 end 59 61 60 io = '' if io.nil?61 62 62 ns = XSD::NS.new 63 io<< xmldecl64 encode_data( io, ns, true, obj, nil, 0)63 @buf << xmldecl 64 encode_data(ns, true, obj, nil) 65 65 66 66 @handlers.each do |uri, handler| … … 69 69 epilogue 70 70 71 io72 end 73 74 def encode_data( buf, ns, qualified, obj, parent, indent)71 @buf 72 end 73 74 def encode_data(ns, qualified, obj, parent) 75 75 if obj.is_a?(SOAPEnvelopeElement) 76 encode_element( buf, ns, qualified, obj, parent, indent)76 encode_element(ns, qualified, obj, parent) 77 77 return 78 78 end 79 79 80 80 if @reftarget && !obj.precedents.empty? 81 @reftarget.add(obj.elename.name, obj)81 add_reftarget(obj.elename.name, obj) 82 82 ref = SOAPReference.new 83 83 ref.elename.name = obj.elename.name … … 103 103 end 104 104 105 indent_str = ' ' * indent 106 child_indent = @pretty ? indent + 2 : indent 107 handler.encode_data(buf, ns, qualified, obj, parent, indent_str) do |child, child_q| 108 encode_data(buf, ns.clone_ns, child_q, child, obj, child_indent) 109 end 110 handler.encode_data_end(buf, ns, qualified, obj, parent, indent_str) 111 end 112 113 def encode_element(buf, ns, qualified, obj, parent, indent) 114 indent_str = ' ' * indent 115 child_indent = @pretty ? indent + 2 : indent 105 handler.encode_data(self, ns, qualified, obj, parent) do |child, child_q| 106 indent_backup, @indent = @indent, @indent + ' ' 107 encode_data(ns.clone_ns, child_q, child, obj) 108 @indent = indent_backup 109 end 110 handler.encode_data_end(self, ns, qualified, obj, parent) 111 end 112 113 def add_reftarget(name, node) 114 unless @reftarget 115 raise FormatEncodeError.new("Reftarget is not defined.") 116 end 117 @reftarget.add(name, node) 118 end 119 120 def encode_element(ns, qualified, obj, parent) 116 121 attrs = {} 117 122 if obj.is_a?(SOAPBody) 118 123 @reftarget = obj 119 obj.encode(buf, ns, attrs, indent_str) do |child, child_q| 120 encode_data(buf, ns.clone_ns, child_q, child, obj, child_indent) 124 obj.encode(self, ns, attrs) do |child, child_q| 125 indent_backup, @indent = @indent, @indent + ' ' 126 encode_data(ns.clone_ns, child_q, child, obj) 127 @indent = indent_backup 121 128 end 122 129 @reftarget = nil … … 130 137 end 131 138 end 132 obj.encode(buf, ns, attrs, indent_str) do |child, child_q| 133 encode_data(buf, ns.clone_ns, child_q, child, obj, child_indent) 139 obj.encode(self, ns, attrs) do |child, child_q| 140 indent_backup, @indent = @indent, @indent + ' ' 141 encode_data(ns.clone_ns, child_q, child, obj) 142 @indent = indent_backup 134 143 end 135 144 end 136 145 end 137 146 138 def self.assign_ns(attrs, ns, namespace, tag = nil) 139 if namespace and !ns.assigned?(namespace) 140 tag = ns.assign(namespace, tag) 141 attrs['xmlns:' << tag] = namespace 142 end 143 end 144 145 def self.encode_tag(buf, elename, attrs = nil, indent = '') 147 def encode_tag(elename, attrs = nil) 146 148 if attrs 147 buf << "\n#{indent }<#{ elename }" <<149 @buf << "\n#{ @indent }<#{ elename }" << 148 150 attrs.collect { |key, value| 149 151 %Q[ #{ key }="#{ value }"] … … 151 153 '>' 152 154 else 153 buf << "\n#{indent }<#{ elename }>"154 end 155 end 156 157 def self.encode_tag_end(buf, elename, indent = '', cr = nil)155 @buf << "\n#{ @indent }<#{ elename }>" 156 end 157 end 158 159 def encode_tag_end(elename, cr = nil) 158 160 if cr 159 buf << "\n#{ indent }</#{ elename }>" 160 else 161 buf << "</#{ elename }>" 162 end 161 @buf << "\n#{ @indent }</#{ elename }>" 162 else 163 @buf << "</#{ elename }>" 164 end 165 end 166 167 def encode_rawstring(str) 168 @buf << str 163 169 end 164 170 … … 172 178 } 173 179 EncodeCharRegexp = Regexp.new("[#{EncodeMap.keys.join}]") 174 def self.encode_str(str) 175 str.gsub(EncodeCharRegexp) { |c| EncodeMap[c] } 180 def encode_string(str) 181 @buf << str.gsub(EncodeCharRegexp) { |c| EncodeMap[c] } 182 end 183 184 def self.assign_ns(attrs, ns, namespace, tag = nil) 185 if namespace and !ns.assigned?(namespace) 186 tag = ns.assign(namespace, tag) 187 attrs['xmlns:' << tag] = namespace 188 end 176 189 end 177 190 trunk/lib/soap/marshal.rb
r981 r1012 59 59 def unmarshal(stream, mapping_registry = MarshalMappingRegistry) 60 60 header, body = SOAP::Processor.unmarshal(stream) 61 #Mapping.soap2obj(body.root_node, mapping_registry) 61 62 Mapping.soap2obj(body.root_node, mapping_registry) 62 63 end 63 64 end 64 65 65 end 66 66