Changeset 186
- Timestamp:
- 07/05/01 20:51:47 (7 years ago)
- Files:
-
- trunk/lib/soap/XMLSchemaDatatypes.rb (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/lib/soap/XMLSchemaDatatypes.rb
r178 r186 34 34 DoubleLiteral = 'double' 35 35 DateTimeLiteral = 'dateTime' 36 TimeLiteral = 'time' 37 DateLiteral = 'date' 36 38 Base64BinaryLiteral = 'base64Binary' 37 39 DecimalLiteral = 'decimal' … … 82 84 def to_s() 83 85 @data.to_s 86 end 87 88 def method_missing( msg_id, *params ) 89 if @data 90 @data.send( msg_id, *params ) 91 else 92 nil 93 end 84 94 end 85 95 end … … 141 151 def initialize( initDecimal = nil ) 142 152 super( DecimalLiteral ) 153 @sign = '' 154 @integerP = 0 155 @fractionP = 0 143 156 set( initDecimal ) if initDecimal 144 157 end 145 158 146 159 def set( newDecimal ) 147 @data = newDecimal.to_f 160 /^([+-]?)(\d*)(?:\.(\d*)?)?$/ =~ newDecimal.to_s 161 unless Regexp.last_match 162 raise ValueSpaceError.new( "Decimal: #{ newDecimal } is not acceptable." ) 163 end 164 165 @sign = $1 || '+' 166 @integerP = $2.to_i 167 @fractionP = $3.to_i 168 169 # normalize 170 @sign = '' if @sign == '+' 171 end 172 173 def data 174 self.to_s 175 end 176 177 # 0.0 -> 0; right? 178 def to_s 179 str = @sign + @integerP.to_s 180 if @fractionP.nonzero? 181 str << '.' << @fractionP.to_s 182 end 183 str 148 184 end 149 185 end … … 235 271 236 272 require 'rational' 273 require 'date3' 274 require 'parsedate3' 237 275 class XSDDateTime < XSDBase 238 require 'date3'239 require 'parsedate3'240 241 276 public 242 277 … … 253 288 @data = Date.new3( gt.year, gt.mon, gt.mday, gt.hour, gt.min, gt.sec ) 254 289 else 255 tStr = t.to_s.sub( 'Z([-+]\d\d:?\d\d)?$' ) { $1 } 256 ( year, mon, mday, hour, min, sec, zone, wday ) = ParseDate.parsedate( tStr ) 290 /^([+-]?\d+)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d(?:\.(\d*))?)(Z|(?:[+-]\d\d:\d\d)?)?$/ =~ t.to_s 291 unless Regexp.last_match 292 raise ValueSpaceError.new( "DateTime: #{ t } is not acceptable." ) 293 end 294 295 year = $1.to_i 296 mon = $2.to_i 297 mday = $3.to_i 298 hour = $4.to_i 299 min = $5.to_i 300 sec = $6.to_i 301 usec = $7.to_i 302 zoneStr = $8 303 257 304 @data = Date.new3( year, mon, mday, hour, min, sec ) 258 305 259 if zone 260 /^([-+])(\d\d):(\d\d)$/ =~ zone 261 zoneSign = $1 262 zoneHour = $2.to_i 263 zoneMin = $3.to_i 306 if usec.nonzero? 307 diffDay = usec.to_r / ( 10 ** usec.size ) / 84600 308 jd = @data.jd 309 fr1 = @data.fr1 + diffDay 310 @data = Date.new0( Date.jd_to_rjd( jd, fr1 )) 311 end 312 313 @data = XSDDateTime.tzAdjust( @data, zoneStr ) if zoneStr 314 end 315 end 316 317 def to_s 318 @data.to_s.sub( /,.*$/, 'Z' ) 319 end 320 321 # Debt: collect syntax. 322 def self.tzAdjust( date, zoneStr ) 323 newDate = date 324 325 /^(?:Z|(?:([+-])(\d\d):(\d\d))?)$/ =~ zoneStr 326 zoneSign = $1 327 zoneHour = $2.to_i 328 zoneMin = $3.to_i 329 330 if zoneSign 331 if !zoneHour.zero? || !zoneMin.zero? 332 diffDay = 0.to_r 333 case zoneSign 334 when '+' 335 diffDay = +( zoneHour * 3600 + zoneMin * 60 ).to_r / 86400 336 when '-' 337 diffDay = -( zoneHour * 3600 + zoneMin * 60 ).to_r / 86400 338 end 339 jd = newDate.jd 340 fr1 = newDate.fr1 - diffDay 341 newDate = Date.new0( Date.jd_to_rjd( jd, fr1 )) 342 end 343 end 344 newDate 345 end 346 end 347 348 class XSDTime < XSDBase 349 public 350 351 def initialize( initTime = nil ) 352 super( TimeLiteral ) 353 set( initTime ) if initTime 354 end 355 356 def set( t ) 357 if ( t.is_a?( Time )) 358 @data = t 359 else 360 /^(\d\d):(\d\d):(\d\d(?:\.(\d*))?)(?:Z|(?:([+-])(\d\d):(\d\d))?)?$/ =~ t.to_s 361 unless Regexp.last_match 362 raise ValueSpaceError.new( "Time: #{ t } is not acceptable." ) 363 end 364 365 hour = $1.to_i 366 min = $2.to_i 367 sec = $3.to_i 368 usec = $4.to_i 369 zoneSign = $5 370 zoneHour = $6.to_i 371 zoneMin = $7.to_i 372 373 @data = Time.mktime( 2000, 1, 1, hour, min, sec, usec ) 374 375 if zoneSign 264 376 if !zoneHour.zero? || !zoneMin.zero? 265 diff Day= 0377 diffSec = 0 266 378 case zoneSign 267 379 when '+' 268 diff Day = +( zoneHour * 3600 + zoneMin * 60 ).to_r / 86400380 diffSec = +( zoneHour * 3600 + zoneMin * 60 ) 269 381 when '-' 270 diff Day = -( zoneHour * 3600 + zoneMin * 60 ).to_r / 86400382 diffSec = -( zoneHour * 3600 + zoneMin * 60 ) 271 383 when nil 272 raise ValueSpaceError.new( "TimeZone: #{ zone } is not acceptable." )384 raise ValueSpaceError.new( "TimeZone: #{ zoneHour }:#{ zoneMin } is not acceptable." ) 273 385 else 274 raise ValueSpaceError.new( "TimeZone: #{ zone } is not acceptable." )386 raise ValueSpaceError.new( "TimeZone: #{ zoneHour }:#{ zoneMin } is not acceptable." ) 275 387 end 276 jd = @data.jd 277 fr1 = @data.fr1 - diffDay 278 @data = Date.new0( Date.jd_to_rjd( jd, fr1 )) 388 @data += diffSec 279 389 end 280 390 end … … 283 393 284 394 def to_s 285 @data.to_s.sub( /,.*$/, 'Z' ) 395 if @data.usec.zero? 396 format( '%02d:%02d:%02d', @data.hour, @data.min, @data.sec ) 397 else 398 format( '%02d:%02d:%02d.%d', @data.hour, @data.min, @data.sec, @data.usec ) 399 end 400 end 401 end 402 403 class XSDDate < XSDBase 404 public 405 406 def initialize( initDate = nil ) 407 super( DateLiteral ) 408 set( initDate ) if initDate 409 end 410 411 def set( t ) 412 if ( t.is_a?( Date )) 413 @data = t.dup 414 elsif ( t.is_a?( Time )) 415 gt = t.dup.gmtime 416 @data = Date.new3( gt.year, gt.mon, gt.mday, gt.hour, gt.min, gt.sec ) 417 else 418 /^([+-]?\d+)-(\d\d)-(\d\d)(Z|(?:[+-]\d\d:\d\d)?)?$/ =~ t.to_s 419 unless Regexp.last_match 420 raise ValueSpaceError.new( "Time: #{ t } is not acceptable." ) 421 end 422 423 year = $1.to_i 424 mon = $2.to_i 425 mday = $3.to_i 426 zoneStr = $4 427 428 @data = Date.new3( year, mon, mday, 0, 0, 0 ) 429 @data = XSDDateTime.tzAdjust( @data, zoneStr ) if zoneStr 430 end 431 end 432 433 def to_s 434 @data.to_s.sub( /T.*$/, '' ) 286 435 end 287 436 end … … 327 476 @data = newInteger.to_i 328 477 end 478 479 def data 480 @data 481 end 482 483 def to_s() 484 @data.to_s 485 end 329 486 end 330 487