diff options
author | nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-07-03 15:29:32 +0000 |
---|---|---|
committer | nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-07-03 15:29:32 +0000 |
commit | ab31bf0d4d44942e46d98d8848b788ac6df32a46 (patch) | |
tree | 303d964b43831f02c94f3970c9df2aca6e851edc /lib/xsd | |
parent | df2066555d03b919be6f25fb7569abde8296d2f5 (diff) |
* added files
* lib/soap/attachment.rb
* lib/soap/header
* lib/soap/mimemessage.rb
* lib/soap/rpc/httpserver.rb
* lib/wsdl/soap/cgiStubCreator.rb
* lib/wsdl/soap/classDefCreator.rb
* lib/wsdl/soap/classDefCreatorSupport.rb
* lib/wsdl/soap/clientSkeltonCreator.rb
* lib/wsdl/soap/driverCreator.rb
* lib/wsdl/soap/mappingRegistryCreator.rb
* lib/wsdl/soap/methodDefCreator.rb
* lib/wsdl/soap/servantSkeltonCreator.rb
* lib/wsdl/soap/standaloneServerStubCreator.rb
* lib/wsdl/xmlSchema/enumeration.rb
* lib/wsdl/xmlSchema/simpleRestriction.rb
* lib/wsdl/xmlSchema/simpleType.rb
* lib/xsd/codegen
* lib/xsd/codegen.rb
* sample/soap/authheader
* sample/soap/raa2.4
* sample/soap/ssl
* sample/soap/swa
* sample/soap/whois.rb
* sample/soap/calc/samplehttpd.conf
* sample/soap/exchange/samplehttpd.conf
* sample/soap/sampleStruct/samplehttpd.conf
* sample/wsdl/raa2.4
* sample/wsdl/googleSearch/samplehttpd.conf
* test/openssl/_test_ssl.rb
* test/soap/header
* test/soap/ssl
* test/soap/struct
* test/soap/swa
* test/soap/wsdlDriver
* test/wsdl/multiplefault.wsdl
* test/wsdl/simpletype
* test/wsdl/test_multiplefault.rb
* modified files
* lib/soap/baseData.rb
* lib/soap/element.rb
* lib/soap/generator.rb
* lib/soap/marshal.rb
* lib/soap/netHttpClient.rb
* lib/soap/parser.rb
* lib/soap/processor.rb
* lib/soap/property.rb
* lib/soap/soap.rb
* lib/soap/streamHandler.rb
* lib/soap/wsdlDriver.rb
* lib/soap/encodingstyle/handler.rb
* lib/soap/encodingstyle/literalHandler.rb
* lib/soap/encodingstyle/soapHandler.rb
* lib/soap/mapping/factory.rb
* lib/soap/mapping/mapping.rb
* lib/soap/mapping/registry.rb
* lib/soap/mapping/rubytypeFactory.rb
* lib/soap/mapping/wsdlRegistry.rb
* lib/soap/rpc/cgistub.rb
* lib/soap/rpc/driver.rb
* lib/soap/rpc/element.rb
* lib/soap/rpc/proxy.rb
* lib/soap/rpc/router.rb
* lib/soap/rpc/soaplet.rb
* lib/soap/rpc/standaloneServer.rb
* lib/wsdl/data.rb
* lib/wsdl/definitions.rb
* lib/wsdl/operation.rb
* lib/wsdl/parser.rb
* lib/wsdl/soap/definitions.rb
* lib/wsdl/xmlSchema/complexContent.rb
* lib/wsdl/xmlSchema/complexType.rb
* lib/wsdl/xmlSchema/data.rb
* lib/wsdl/xmlSchema/parser.rb
* lib/wsdl/xmlSchema/schema.rb
* lib/xsd/datatypes.rb
* lib/xsd/qname.rb
* sample/soap/calc/httpd.rb
* sample/soap/exchange/httpd.rb
* sample/soap/sampleStruct/httpd.rb
* sample/soap/sampleStruct/server.rb
* sample/wsdl/amazon/AmazonSearch.rb
* sample/wsdl/amazon/AmazonSearchDriver.rb
* sample/wsdl/googleSearch/httpd.rb
* test/soap/test_basetype.rb
* test/soap/test_property.rb
* test/soap/test_streamhandler.rb
* test/soap/calc/test_calc.rb
* test/soap/calc/test_calc2.rb
* test/soap/calc/test_calc_cgi.rb
* test/soap/helloworld/test_helloworld.rb
* test/wsdl/test_emptycomplextype.rb
* test/wsdl/axisArray/test_axisarray.rb
* test/wsdl/datetime/test_datetime.rb
* test/wsdl/raa/test_raa.rb
* test/xsd/test_xmlschemaparser.rb
* test/xsd/test_xsd.rb
* summary
* add SOAP Header mustUnderstand support.
* add HTTP client SSL configuration and Cookies support (works
completely with http-access2).
* add header handler for handling sending/receiving SOAP Header.
* map Ruby's anonymous Struct to common SOAP Struct in SOAP Object
Model. it caused error.
* add WSDL simpleType support to restrict lexical value space.
* add SOAP with Attachment support.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@6567 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/xsd')
-rw-r--r-- | lib/xsd/datatypes.rb | 296 | ||||
-rw-r--r-- | lib/xsd/qname.rb | 9 |
2 files changed, 149 insertions, 156 deletions
diff --git a/lib/xsd/datatypes.rb b/lib/xsd/datatypes.rb index 7223632b04..7173f52d65 100644 --- a/lib/xsd/datatypes.rb +++ b/lib/xsd/datatypes.rb @@ -103,6 +103,12 @@ class XSDAnySimpleType < NSDBase set(value) if value end + # true or raise + def check_lexical_format(value) + screen_data(value) + true + end + # set accepts a string which follows lexical space (ex. String: "+123"), or # an object which follows canonical space (ex. Integer: 123). def set(value) @@ -111,7 +117,7 @@ class XSDAnySimpleType < NSDBase @data = nil else @is_nil = false - _set(value) + _set(screen_data(value)) end end @@ -126,6 +132,11 @@ class XSDAnySimpleType < NSDBase private + # raises ValueSpaceError if check failed + def screen_data(value) + value + end + def _set(value) @data = value end @@ -144,12 +155,6 @@ class XSDNil < XSDAnySimpleType @type = Type set(value) end - -private - - def _set(value) - @data = value - end end @@ -167,11 +172,11 @@ class XSDString < XSDAnySimpleType private - def _set(value) + def screen_data(value) unless XSD::Charset.is_ces(value, XSD::Charset.encoding) raise ValueSpaceError.new("#{ type }: cannot accept '#{ value }'.") end - @data = value + value end end @@ -186,18 +191,18 @@ class XSDBoolean < XSDAnySimpleType private - def _set(value) + def screen_data(value) if value.is_a?(String) str = value.strip if str == 'true' || str == '1' - @data = true + true elsif str == 'false' || str == '0' - @data = false + false else raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.") end else - @data = value ? true : false + value ? true : false end end end @@ -220,38 +225,39 @@ class XSDDecimal < XSDAnySimpleType private - def _set(d) + def screen_data(d) if d.is_a?(String) # Integer("00012") => 10 in Ruby. d.sub!(/^([+\-]?)0*(?=\d)/, "\\1") end - set_str(d) + screen_data_str(d) end - def set_str(str) + def screen_data_str(str) /^([+\-]?)(\d*)(?:\.(\d*)?)?$/ =~ str.to_s.strip unless Regexp.last_match raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.") end - - @sign = $1 || '+' + sign = $1 || '+' int_part = $2 frac_part = $3 - int_part = '0' if int_part.empty? frac_part = frac_part ? frac_part.sub(/0+$/, '') : '' - @point = - frac_part.size - @number = int_part + frac_part - + point = - frac_part.size + number = int_part + frac_part # normalize - if @sign == '+' - @sign = '' - elsif @sign == '-' - if @number == '0' - @sign = '' + if sign == '+' + sign = '' + elsif sign == '-' + if number == '0' + sign = '' end end + [sign, point, number] + end + def _set(pair) + @sign, @point, @number = pair @data = _to_s @data.freeze end @@ -272,7 +278,7 @@ module FloatConstants NEGATIVE_INF = -1.0/0.0 POSITIVE_ZERO = +1.0/POSITIVE_INF NEGATIVE_ZERO = -1.0/POSITIVE_INF - MIN_POSITIVE_SINGLE = 2 ** -149 + MIN_POSITIVE_SINGLE = 2.0 ** -149 end class XSDFloat < XSDAnySimpleType @@ -287,20 +293,18 @@ class XSDFloat < XSDAnySimpleType private - def _set(value) + def screen_data(value) # "NaN".to_f => 0 in some environment. libc? if value.is_a?(Float) - @data = narrow32bit(value) - return + return narrow32bit(value) end - str = value.to_s.strip if str == 'NaN' - @data = NaN + NaN elsif str == 'INF' - @data = POSITIVE_INF + POSITIVE_INF elsif str == '-INF' - @data = NEGATIVE_INF + NEGATIVE_INF else if /^[+\-\.\deE]+$/ !~ str raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.") @@ -308,7 +312,7 @@ private # Float("-1.4E") might fail on some system. str << '0' if /e$/i =~ str begin - @data = narrow32bit(Float(str)) + return narrow32bit(Float(str)) rescue ArgumentError raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.") end @@ -357,28 +361,26 @@ class XSDDouble < XSDAnySimpleType private - def _set(value) + def screen_data(value) # "NaN".to_f => 0 in some environment. libc? if value.is_a?(Float) - @data = value - return + return value end - str = value.to_s.strip if str == 'NaN' - @data = NaN + NaN elsif str == 'INF' - @data = POSITIVE_INF + POSITIVE_INF elsif str == '-INF' - @data = NEGATIVE_INF + NEGATIVE_INF else begin - @data = Float(str) + return Float(str) rescue ArgumentError # '1.4e' cannot be parsed on some architecture. if /e\z/i =~ str begin - @data = Float(str + '0') + return Float(str + '0') rescue ArgumentError raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.") end @@ -429,24 +431,27 @@ class XSDDuration < XSDAnySimpleType private - def _set(value) + def screen_data(value) /^([+\-]?)P(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)D)?(T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+(?:\.\d+)?)S)?)?$/ =~ value.to_s.strip unless Regexp.last_match raise ValueSpaceError.new("#{ type }: cannot accept '#{ value }'.") end - if ($5 and ((!$2 and !$3 and !$4) or (!$6 and !$7 and !$8))) # Should we allow 'PT5S' here? raise ValueSpaceError.new("#{ type }: cannot accept '#{ value }'.") end + sign = $1 + year = $2.to_i + month = $3.to_i + day = $4.to_i + hour = $6.to_i + min = $7.to_i + sec = $8 ? XSDDecimal.new($8) : 0 + [sign, year, month, day, hour, min, sec] + end - @sign = $1 - @year = $2.to_i - @month = $3.to_i - @day = $4.to_i - @hour = $6.to_i - @min = $7.to_i - @sec = $8 ? XSDDecimal.new($8) : 0 + def _set(ary) + @sign, @year, @month, @day, @hour, @min, @sec = ary @data = _to_s @data.freeze end @@ -524,18 +529,18 @@ module XSDDateTimeImpl end end - def _set(t) - set_datetime_init(t) + def screen_data(t) if (t.is_a?(Date)) - @data = t + t elsif (t.is_a?(Time)) sec, min, hour, mday, month, year = t.to_a[0..5] diffday = t.usec.to_r / 1000000 / SecInDay of = t.utc_offset.to_r / SecInDay - @data = DateTime.civil(year, month, mday, hour, min, sec, of) - @data += diffday + data = DateTime.civil(year, month, mday, hour, min, sec, of) + data += diffday + data else - set_str(t) + screen_data_str(t) end end @@ -557,11 +562,7 @@ class XSDDateTime < XSDAnySimpleType private - def set_datetime_init(t) - @secfrac = nil - end - - def set_str(t) + def screen_data_str(t) /^([+\-]?\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d(?:\.(\d*))?)(Z|(?:[+\-]\d\d:\d\d)?)?$/ =~ t.to_s.strip unless Regexp.last_match raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.") @@ -569,7 +570,6 @@ private if $1 == '0000' raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.") end - year = $1.to_i if year < 0 year += 1 @@ -581,22 +581,18 @@ private sec = $6.to_i secfrac = $7 zonestr = $8 - - @data = DateTime.civil(year, mon, mday, hour, min, sec, tz2of(zonestr)) - @secfrac = secfrac - + data = DateTime.civil(year, mon, mday, hour, min, sec, tz2of(zonestr)) if secfrac diffday = secfrac.to_i.to_r / (10 ** secfrac.size) / SecInDay - # jd = @data.jd - # day_fraction = @data.day_fraction + diffday - # @data = DateTime.new0(DateTime.jd_to_rjd(jd, day_fraction, - # @data.offset), @data.offset) - # - # Thanks to Funaba-san, above code can be simply written as below. - @data += diffday + data += diffday # FYI: new0 and jd_to_rjd are not necessary to use if you don't have # exceptional reason. end + [data, secfrac] + end + + def _set(pair) + @data, @secfrac = pair end def _to_s @@ -607,7 +603,8 @@ private if @secfrac s << ".#{ @secfrac }" else - s << sprintf("%.16f", (@data.sec_fraction * SecInDay).to_f).sub(/^0/, '').sub(/0*$/, '') + s << sprintf("%.16f", + (@data.sec_fraction * SecInDay).to_f).sub(/^0/, '').sub(/0*$/, '') end end add_tz(s) @@ -627,29 +624,26 @@ class XSDTime < XSDAnySimpleType private - def set_datetime_init(t) - @secfrac = nil - end - - def set_str(t) + def screen_data_str(t) /^(\d\d):(\d\d):(\d\d(?:\.(\d*))?)(Z|(?:([+\-])(\d\d):(\d\d))?)?$/ =~ t.to_s.strip unless Regexp.last_match raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.") end - hour = $1.to_i min = $2.to_i sec = $3.to_i secfrac = $4 zonestr = $5 - - @data = DateTime.civil(1, 1, 1, hour, min, sec, tz2of(zonestr)) - @secfrac = secfrac - + data = DateTime.civil(1, 1, 1, hour, min, sec, tz2of(zonestr)) if secfrac diffday = secfrac.to_i.to_r / (10 ** secfrac.size) / SecInDay - @data += diffday + data += diffday end + [data, secfrac] + end + + def _set(pair) + @data, @secfrac = pair end def _to_s @@ -658,7 +652,8 @@ private if @secfrac s << ".#{ @secfrac }" else - s << sprintf("%.16f", (@data.sec_fraction * SecInDay).to_f).sub(/^0/, '').sub(/0*$/, '') + s << sprintf("%.16f", + (@data.sec_fraction * SecInDay).to_f).sub(/^0/, '').sub(/0*$/, '') end end add_tz(s) @@ -677,15 +672,11 @@ class XSDDate < XSDAnySimpleType private - def set_datetime_init(t) - end - - def set_str(t) + def screen_data_str(t) /^([+\-]?\d{4,})-(\d\d)-(\d\d)(Z|(?:([+\-])(\d\d):(\d\d))?)?$/ =~ t.to_s.strip unless Regexp.last_match raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.") end - year = $1.to_i if year < 0 year += 1 @@ -693,8 +684,7 @@ private mon = $2.to_i mday = $3.to_i zonestr = $4 - - @data = DateTime.civil(year, mon, mday, 0, 0, 0, tz2of(zonestr)) + DateTime.civil(year, mon, mday, 0, 0, 0, tz2of(zonestr)) end def _to_s @@ -716,23 +706,18 @@ class XSDGYearMonth < XSDAnySimpleType private - def set_datetime_init(t) - end - - def set_str(t) + def screen_data_str(t) /^([+\-]?\d{4,})-(\d\d)(Z|(?:([+\-])(\d\d):(\d\d))?)?$/ =~ t.to_s.strip unless Regexp.last_match raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.") end - year = $1.to_i if year < 0 year += 1 end mon = $2.to_i zonestr = $3 - - @data = DateTime.civil(year, mon, 1, 0, 0, 0, tz2of(zonestr)) + DateTime.civil(year, mon, 1, 0, 0, 0, tz2of(zonestr)) end def _to_s @@ -754,22 +739,17 @@ class XSDGYear < XSDAnySimpleType private - def set_datetime_init(t) - end - - def set_str(t) + def screen_data_str(t) /^([+\-]?\d{4,})(Z|(?:([+\-])(\d\d):(\d\d))?)?$/ =~ t.to_s.strip unless Regexp.last_match raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.") end - year = $1.to_i if year < 0 year += 1 end zonestr = $2 - - @data = DateTime.civil(year, 1, 1, 0, 0, 0, tz2of(zonestr)) + DateTime.civil(year, 1, 1, 0, 0, 0, tz2of(zonestr)) end def _to_s @@ -791,20 +771,15 @@ class XSDGMonthDay < XSDAnySimpleType private - def set_datetime_init(t) - end - - def set_str(t) + def screen_data_str(t) /^(\d\d)-(\d\d)(Z|(?:[+\-]\d\d:\d\d)?)?$/ =~ t.to_s.strip unless Regexp.last_match raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.") end - mon = $1.to_i mday = $2.to_i zonestr = $3 - - @data = DateTime.civil(1, mon, mday, 0, 0, 0, tz2of(zonestr)) + DateTime.civil(1, mon, mday, 0, 0, 0, tz2of(zonestr)) end def _to_s @@ -825,19 +800,14 @@ class XSDGDay < XSDAnySimpleType private - def set_datetime_init(t) - end - - def set_str(t) + def screen_data_str(t) /^(\d\d)(Z|(?:[+\-]\d\d:\d\d)?)?$/ =~ t.to_s.strip unless Regexp.last_match raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.") end - mday = $1.to_i zonestr = $2 - - @data = DateTime.civil(1, 1, mday, 0, 0, 0, tz2of(zonestr)) + DateTime.civil(1, 1, mday, 0, 0, 0, tz2of(zonestr)) end def _to_s @@ -858,19 +828,14 @@ class XSDGMonth < XSDAnySimpleType private - def set_datetime_init(t) - end - - def set_str(t) + def screen_data_str(t) /^(\d\d)(Z|(?:[+\-]\d\d:\d\d)?)?$/ =~ t.to_s.strip unless Regexp.last_match raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.") end - mon = $1.to_i zonestr = $2 - - @data = DateTime.civil(1, mon, 1, 0, 0, 0, tz2of(zonestr)) + DateTime.civil(1, mon, 1, 0, 0, 0, tz2of(zonestr)) end def _to_s @@ -903,9 +868,8 @@ class XSDHexBinary < XSDAnySimpleType private - def _set(value) - @data = value.unpack("H*")[0] - @data.tr!('a-f', 'A-F') + def screen_data(value) + value.unpack("H*")[0].tr('a-f', 'A-F') end end @@ -933,8 +897,8 @@ class XSDBase64Binary < XSDAnySimpleType private - def _set(value) - @data = [value].pack("m").strip + def screen_data(value) + [value].pack("m").strip end end @@ -949,9 +913,9 @@ class XSDAnyURI < XSDAnySimpleType private - def _set(value) + def screen_data(value) begin - @data = URI.parse(value.to_s.strip) + URI.parse(value.to_s.strip) rescue URI::InvalidURIError raise ValueSpaceError.new("#{ type }: cannot accept '#{ value }'.") end @@ -969,14 +933,18 @@ class XSDQName < XSDAnySimpleType private - def _set(value) + def screen_data(value) /^(?:([^:]+):)?([^:]+)$/ =~ value.to_s.strip unless Regexp.last_match raise ValueSpaceError.new("#{ type }: cannot accept '#{ value }'.") end + prefix = $1 + localpart = $2 + [prefix, localpart] + end - @prefix = $1 - @localpart = $2 + def _set(pair) + @prefix, @localpart = pair @data = _to_s @data.freeze end @@ -1005,7 +973,7 @@ class XSDNormalizedString < XSDString private - def _set(value) + def screen_data(value) if /[\t\r\n]/ =~ value raise ValueSpaceError.new("#{ type }: cannot accept '#{ value }'.") end @@ -1024,12 +992,17 @@ class XSDInteger < XSDDecimal private - def set_str(str) + def screen_data_str(str) begin - @data = Integer(str) + data = Integer(str) rescue ArgumentError raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.") end + data + end + + def _set(value) + @data = value end def _to_s() @@ -1048,15 +1021,20 @@ class XSDLong < XSDInteger private - def set_str(str) + def screen_data_str(str) begin - @data = Integer(str) + data = Integer(str) rescue ArgumentError raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.") end - unless validate(@data) + unless validate(data) raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.") end + data + end + + def _set(value) + @data = value end MaxInclusive = +9223372036854775807 @@ -1077,15 +1055,20 @@ class XSDInt < XSDLong private - def set_str(str) + def screen_data_str(str) begin - @data = Integer(str) + data = Integer(str) rescue ArgumentError raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.") end - unless validate(@data) + unless validate(data) raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.") end + data + end + + def _set(value) + @data = value end MaxInclusive = +2147483647 @@ -1106,15 +1089,20 @@ class XSDShort < XSDInt private - def set_str(str) + def screen_data_str(str) begin - @data = Integer(str) + data = Integer(str) rescue ArgumentError raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.") end - unless validate(@data) + unless validate(data) raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.") end + data + end + + def _set(value) + @data = value end MaxInclusive = +32767 diff --git a/lib/xsd/qname.rb b/lib/xsd/qname.rb index 9dce1340f8..7185fedf2d 100644 --- a/lib/xsd/qname.rb +++ b/lib/xsd/qname.rb @@ -1,5 +1,5 @@ # XSD4R - XML QName definition. -# Copyright (C) 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>. +# Copyright (C) 2002, 2003, 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>. # This program is copyrighted free software by NAKAMURA, Hiroshi. You can # redistribute it and/or modify it under the same terms of Ruby's license; @@ -19,7 +19,7 @@ class QName end def dup_name(name) - self.class.new(@namespace, name) + ::XSD::QName.new(@namespace, name) end def match(rhs) @@ -55,6 +55,11 @@ class QName "{#{ namespace }}#{ name }" end + def inspect + sprintf("#<%s:0x%x %s>", self.class.name, __id__, + "{#{ namespace }}#{ name }") + end + NormalizedNameRegexp = /^\{([^}]*)\}(.*)$/ def parse(str) NormalizedNameRegexp =~ str |