Changeset 1812
- Timestamp:
- 05/27/07 11:19:19 (2 years ago)
- Files:
-
- trunk/lib/soap/encodingstyle/literalHandler.rb (modified) (1 diff)
- trunk/lib/soap/mapping/literalregistry.rb (modified) (4 diffs)
- trunk/lib/soap/mapping/registry.rb (modified) (1 diff)
- trunk/lib/soap/parser.rb (modified) (10 diffs)
- trunk/lib/wsdl/parser.rb (modified) (2 diffs)
- trunk/lib/wsdl/xmlSchema/parser.rb (modified) (2 diffs)
- trunk/lib/xsd/datatypes.rb (modified) (7 diffs)
- trunk/lib/xsd/xmlparser.rb (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/lib/soap/encodingstyle/literalHandler.rb
r1805 r1812 169 169 o = node.node 170 170 if o.is_a?(SOAPUnknown) 171 if /\A\s*\z/ =~ textbufstr 172 newnode = o.as_element 173 else 174 newnode = o.as_string 175 end 171 newnode = o.as_element 176 172 node.replace_node(newnode) 177 173 o = node.node trunk/lib/soap/mapping/literalregistry.rb
r1810 r1812 199 199 return elesoap2stubobj(node, obj_class, definition) 200 200 else 201 # SOAPArray for literal?202 201 return elesoap2plainobj(node) 203 202 end … … 209 208 210 209 def elesoap2stubobj(node, obj_class, definition) 211 obj = Mapping.create_empty_object(obj_class) 212 add_elesoap2stubobj(node, obj, definition) 210 obj = nil 211 if obj_class < ::String 212 obj = node.text 213 else 214 obj = Mapping.create_empty_object(obj_class) 215 add_elesoap2stubobj(node, obj, definition) 216 end 213 217 add_attributes2stubobj(node, obj, definition) 214 218 obj … … 216 220 217 221 def elesoap2plainobj(node) 218 obj = anytype2obj(node) 219 add_elesoap2plainobj(node, obj) 222 obj = nil 223 if node.members.empty? 224 obj = base2obj(node, ::SOAP::SOAPString) 225 else 226 obj = anytype2obj(node) 227 add_elesoap2plainobj(node, obj) 228 end 220 229 add_attributes2obj(node, obj) 221 230 obj … … 261 270 base2obj(value, eledef.mapped_class) 262 271 else 263 child_definition = schema_definition_from_class(eledef.mapped_class) 264 if child_definition 265 any2obj(value, child_definition.class_for) 266 else 267 any2obj(value, eledef.mapped_class) 268 end 272 any2obj(value, eledef.mapped_class) 269 273 end 270 274 else trunk/lib/soap/mapping/registry.rb
r1804 r1812 259 259 nil 260 260 end 261 klass.new(v).data 261 if value.is_a?(klass) 262 v 263 else 264 klass.new(v).data 265 end 262 266 end 263 267 trunk/lib/soap/parser.rb
r1765 r1812 29 29 attr_reader :node 30 30 attr_reader :name 31 attr_reader :ns, :encodingstyle 31 attr_reader :ns 32 attr_reader :encodingstyle 33 attr_reader :handler 32 34 33 35 class NodeContainer … … 47 49 public 48 50 49 def initialize(ns, name, node, encodingstyle )51 def initialize(ns, name, node, encodingstyle, handler) 50 52 @ns = ns 51 53 @name = name 52 self.node = node54 @node = NodeContainer.new(node) 53 55 @encodingstyle = encodingstyle 54 end 55 56 def node=(node) 57 @node = NodeContainer.new(node) 56 @handler = handler 57 end 58 59 # to avoid memory consumption 60 def update(ns, name, node, encodingstyle, handler) 61 @ns = ns 62 @name = name 63 @node.replace_node(node) 64 @encodingstyle = encodingstyle 65 @handler = handler 66 self 58 67 end 59 68 end … … 70 79 @parser = XSD::XMLParser.create_parser(self, opt) 71 80 @parsestack = nil 81 @recycleframe = nil 72 82 @lastnode = nil 73 83 @handlers = {} … … 107 117 ns = parent = parent_encodingstyle = nil 108 118 if lastframe 109 ns = lastframe.ns .clone_ns119 ns = lastframe.ns 110 120 parent = lastframe.node 111 121 parent_encodingstyle = lastframe.encodingstyle … … 115 125 parent_encodingstyle = nil 116 126 end 117 118 attrs = XSD::XMLParser.filter_ns(ns, attrs)127 # ns might be the same 128 ns, attrs = XSD::XMLParser.filter_ns(ns, attrs) 119 129 encodingstyle = find_encodingstyle(ns, attrs) 120 121 130 # Children's encodingstyle is derived from its parent. 122 131 if encodingstyle.nil? … … 127 136 end 128 137 end 129 130 node = decode_tag(ns, name, attrs, parent, encodingstyle) 131 132 @parsestack << ParseFrame.new(ns, name, node, encodingstyle) 138 handler = find_handler(encodingstyle) 139 unless handler 140 raise FormatDecodeError.new("Unknown encodingStyle: #{ encodingstyle }.") 141 end 142 node = decode_tag(ns, name, attrs, parent, handler) 143 if @recycleframe 144 @parsestack << @recycleframe.update(ns, name, node, encodingstyle, handler) 145 @recycleframe = nil 146 else 147 @parsestack << ParseFrame.new(ns, name, node, encodingstyle, handler) 148 end 133 149 end 134 150 … … 137 153 if lastframe 138 154 # Need not to be cloned because character does not have attr. 139 decode_text(lastframe.ns, text, lastframe. encodingstyle)155 decode_text(lastframe.ns, text, lastframe.handler) 140 156 else 141 157 # Ignore Text outside of SOAP Envelope. … … 149 165 raise UnexpectedElementError.new("Closing element name '#{ name }' does not match with opening element '#{ lastframe.name }'.") 150 166 end 151 decode_tag_end(lastframe.ns, lastframe.node, lastframe. encodingstyle)167 decode_tag_end(lastframe.ns, lastframe.node, lastframe.handler) 152 168 @lastnode = lastframe.node.node 169 @recycleframe = lastframe 153 170 end 154 171 … … 164 181 end 165 182 166 def decode_tag(ns, name, attrs, parent, encodingstyle)183 def decode_tag(ns, name, attrs, parent, handler) 167 184 ele = ns.parse(name) 168 169 185 # Envelope based parsing. 170 186 if ((ele.namespace == @envelopenamespace) || … … 173 189 return o if o 174 190 end 175 176 191 # Encoding based parsing. 177 handler = find_handler(encodingstyle) 178 if handler 179 return handler.decode_tag(ns, ele, attrs, parent) 180 else 181 raise FormatDecodeError.new("Unknown encodingStyle: #{ encodingstyle }.") 182 end 183 end 184 185 def decode_tag_end(ns, node, encodingstyle) 186 return unless encodingstyle 187 188 handler = find_handler(encodingstyle) 189 if handler 190 return handler.decode_tag_end(ns, node) 191 else 192 raise FormatDecodeError.new("Unknown encodingStyle: #{ encodingstyle }.") 193 end 194 end 195 196 def decode_text(ns, text, encodingstyle) 197 handler = find_handler(encodingstyle) 198 199 if handler 200 handler.decode_text(ns, text) 201 else 202 # How should I do? 203 end 192 return handler.decode_tag(ns, ele, attrs, parent) 193 end 194 195 def decode_tag_end(ns, node, handler) 196 return handler.decode_tag_end(ns, node) 197 end 198 199 def decode_text(ns, text, handler) 200 handler.decode_text(ns, text) 204 201 end 205 202 trunk/lib/wsdl/parser.rb
r1700 r1812 75 75 ns = parent = nil 76 76 if lastframe 77 ns = lastframe.ns .clone_ns77 ns = lastframe.ns 78 78 parent = lastframe.node 79 79 else … … 81 81 parent = nil 82 82 end 83 attrs = XSD::XMLParser.filter_ns(ns, attrs) 83 # ns might be the same 84 ns, attrs = XSD::XMLParser.filter_ns(ns, attrs) 84 85 node = decode_tag(ns, name, attrs, parent) 85 86 @parsestack << ParseFrame.new(ns, name, node) trunk/lib/wsdl/xmlSchema/parser.rb
r1700 r1812 73 73 ns = parent = nil 74 74 if lastframe 75 ns = lastframe.ns .clone_ns75 ns = lastframe.ns 76 76 parent = lastframe.node 77 77 else … … 79 79 parent = nil 80 80 end 81 attrs = XSD::XMLParser.filter_ns(ns, attrs) 81 # ns might be the same 82 ns, attrs = XSD::XMLParser.filter_ns(ns, attrs) 82 83 node = decode_tag(ns, name, attrs, parent) 83 84 @parsestack << ParseFrame.new(ns, name, node) trunk/lib/xsd/datatypes.rb
r1776 r1812 507 507 508 508 module XSDDateTimeImpl 509 SecInDay = 86400 # 24 * 60 * 60 509 DayInSec = 86400 # 24 * 60 * 60 510 DayInMicro = 86400_000_000 510 511 511 512 def to_obj(klass) … … 523 524 def to_time 524 525 begin 525 if @data.offset * SecInDay== Time.now.utc_offset526 if @data.offset * DayInSec == Time.now.utc_offset 526 527 d = @data 527 usec = (d.sec_fraction * SecInDay * 1000000).round528 usec = (d.sec_fraction * DayInMicro).round 528 529 Time.local(d.year, d.month, d.mday, d.hour, d.min, d.sec, usec) 529 530 else 530 531 d = @data.newof 531 usec = (d.sec_fraction * SecInDay * 1000000).round532 usec = (d.sec_fraction * DayInMicro).round 532 533 Time.gm(d.year, d.month, d.mday, d.hour, d.min, d.sec, usec) 533 534 end … … 585 586 jd = DateTime.civil_to_jd(t.year, t.mon, t.mday, DateTime::ITALY) 586 587 fr = DateTime.time_to_day_fraction(t.hour, t.min, [t.sec, 59].min) + 587 t.usec.to_r / 1000000 / SecInDay588 of = t.utc_offset.to_r / SecInDay588 t.usec.to_r / DayInMicro 589 of = t.utc_offset.to_r / DayInSec 589 590 DateTime.new!(DateTime.jd_to_ajd(jd, fr, of), of, DateTime::ITALY) 590 591 else … … 629 630 data = DateTime.civil(year, mon, mday, hour, min, sec, tz2of(zonestr)) 630 631 if secfrac 631 diffday = secfrac.to_i.to_r / (10 ** secfrac.size) / SecInDay632 diffday = secfrac.to_i.to_r / (10 ** secfrac.size) / DayInSec 632 633 data += diffday 633 634 # FYI: new0 and jd_to_rjd are not necessary to use if you don't have … … 654 655 else 655 656 s << sprintf("%.16f", 656 (@data.sec_fraction * SecInDay).to_f).sub(/^0/, '').sub(/0*$/, '')657 (@data.sec_fraction * DayInSec).to_f).sub(/^0/, '').sub(/0*$/, '') 657 658 end 658 659 end … … 683 684 data = DateTime.civil(1, 1, 1, hour, min, sec, tz2of(zonestr)) 684 685 if secfrac 685 diffday = secfrac.to_i.to_r / (10 ** secfrac.size) / SecInDay686 diffday = secfrac.to_i.to_r / (10 ** secfrac.size) / DayInSec 686 687 data += diffday 687 688 end … … 704 705 else 705 706 s << sprintf("%.16f", 706 (@data.sec_fraction * SecInDay).to_f).sub(/^0/, '').sub(/0*$/, '')707 (@data.sec_fraction * DayInSec).to_f).sub(/^0/, '').sub(/0*$/, '') 707 708 end 708 709 end trunk/lib/xsd/xmlparser.rb
r1747 r1812 23 23 24 24 def filter_ns(ns, attrs) 25 return attrs if attrs.nil? or attrs.empty? 25 ns_updated = false 26 if attrs.nil? or attrs.empty? 27 return [ns, attrs] 28 end 26 29 newattrs = {} 27 30 attrs.each do |key, value| 28 31 if (NSParseRegexp =~ key) 32 unless ns_updated 33 ns = ns.clone_ns 34 ns_updated = true 35 end 29 36 # '' means 'default namespace'. 30 37 tag = $1 || '' … … 34 41 end 35 42 end 36 newattrs43 return [ns, newattrs] 37 44 end 38 45 module_function :filter_ns