Welcome to the "trac"-ing site of soap4r!
[soap4r] [httpclient] [openpgp4u] [pkcs1] [logger] [csv] [vtr]

Changeset 186

Show
Ignore:
Timestamp:
07/05/01 20:51:47 (7 years ago)
Author:
nakahiro
Message:

XSDDate, XSDTime: Added.
Unknown method of XSD* is delegated to @data.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/lib/soap/XMLSchemaDatatypes.rb

    r178 r186  
    3434  DoubleLiteral = 'double' 
    3535  DateTimeLiteral = 'dateTime' 
     36  TimeLiteral = 'time' 
     37  DateLiteral = 'date' 
    3638  Base64BinaryLiteral = 'base64Binary' 
    3739  DecimalLiteral = 'decimal' 
     
    8284  def to_s() 
    8385    @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 
    8494  end 
    8595end 
     
    141151  def initialize( initDecimal = nil ) 
    142152    super( DecimalLiteral ) 
     153    @sign = '' 
     154    @integerP = 0 
     155    @fractionP = 0 
    143156    set( initDecimal ) if initDecimal 
    144157  end 
    145158 
    146159  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 
    148184  end 
    149185end 
     
    235271 
    236272require 'rational' 
     273require 'date3' 
     274require 'parsedate3' 
    237275class XSDDateTime < XSDBase 
    238   require 'date3' 
    239   require 'parsedate3' 
    240  
    241276public 
    242277 
     
    253288      @data = Date.new3( gt.year, gt.mon, gt.mday, gt.hour, gt.min, gt.sec ) 
    254289    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 
    257304      @data = Date.new3( year, mon, mday, hour, min, sec ) 
    258305 
    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 
     346end 
     347 
     348class XSDTime < XSDBase 
     349public 
     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 
    264376        if !zoneHour.zero? || !zoneMin.zero? 
    265           diffDay = 0 
     377          diffSec = 0 
    266378          case zoneSign 
    267379          when '+' 
    268             diffDay = +( zoneHour * 3600 + zoneMin * 60 ).to_r / 86400 
     380            diffSec = +( zoneHour * 3600 + zoneMin * 60 ) 
    269381          when '-' 
    270             diffDay = -( zoneHour * 3600 + zoneMin * 60 ).to_r / 86400 
     382            diffSec = -( zoneHour * 3600 + zoneMin * 60 ) 
    271383          when nil 
    272             raise ValueSpaceError.new( "TimeZone: #{ zone } is not acceptable." ) 
     384            raise ValueSpaceError.new( "TimeZone: #{ zoneHour }:#{ zoneMin } is not acceptable." ) 
    273385          else 
    274             raise ValueSpaceError.new( "TimeZone: #{ zone } is not acceptable." ) 
     386            raise ValueSpaceError.new( "TimeZone: #{ zoneHour }:#{ zoneMin } is not acceptable." ) 
    275387          end 
    276           jd = @data.jd 
    277           fr1 = @data.fr1 - diffDay 
    278           @data = Date.new0( Date.jd_to_rjd( jd, fr1 )) 
     388          @data += diffSec 
    279389        end 
    280390      end 
     
    283393 
    284394  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 
     401end 
     402 
     403class XSDDate < XSDBase 
     404public 
     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.*$/, '' ) 
    286435  end 
    287436end 
     
    327476    @data = newInteger.to_i 
    328477  end 
     478 
     479  def data 
     480    @data 
     481  end 
     482 
     483  def to_s() 
     484    @data.to_s 
     485  end 
    329486end 
    330487