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

Changeset 10

Show
Ignore:
Timestamp:
07/27/00 16:04:42 (8 years ago)
Author:
nakahiro
Message:

Use 'def self.foo' instead of 'module_function'.
Removed parameter 'namespace' from 'encode'. Misunderstanding of namespace

specification...

Added SOAPInt.
Handles SOAP/1.1 array. Be carefull there still be many restrictions...

Files:

Legend:

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

    r2 r10  
    4141    elsif ( name == '' ) 
    4242      @defaultNamespace = namespace 
     43      name 
     44    elsif ( @namespaceTag.has_value?( name )) 
     45      # Already assigned.  Should raise Error? 
     46      name = SOAPNS.assign( namespace ) 
     47      @namespaceTag[ namespace ] = name 
     48      name 
    4349    else 
    4450      name ||= SOAPNS.assign( namespace ) 
     
    109115  AssigningName = [ 0 ] 
    110116 
    111   def SOAPNS.assign( namespace ) 
     117  def self.assign( namespace ) 
    112118    AssigningName[ 0 ] += 1 
    113119    'n' << AssigningName[ 0 ].to_s 
    114120  end 
    115121 
    116   def SOAPNS.reset() 
     122  def self.reset() 
    117123    AssigningName[ 0 ] = 0 
    118124  end 
     
    149155 
    150156    case getType( ns, elem ) 
     157    when 'int' 
     158      SOAPInt.decode( ns, elem ) 
     159    when 'integer' 
     160      SOAPInteger.decode( ns, elem ) 
    151161    when 'boolean' 
    152162      SOAPBoolean.decode( ns, elem ) 
     
    155165    when 'timeInstant' 
    156166      SOAPTimeInstant.decode( ns, elem ) 
    157     when 'integer' 
    158       SOAPInteger.decode( ns, elem ) 
    159167    when /\[\d*\]$/ 
    160168      SOAPArray.decode( ns, elem ) 
     
    219227  public 
    220228 
    221   attr_reader :attrs 
    222  
    223229  def initialize( *vars ) 
    224230    super( *vars ) 
     
    229235  end 
    230236 
    231   def encode( ns, namespace, name
     237  def encode( ns, name
    232238    attrs = [] 
     239    getExtraNSAttr( attrs, ns ) 
     240    getDatatypeAttr( attrs, ns ) 
     241 
     242    if ( self.to_s.empty? ) 
     243      Element.new( name, attrs ) 
     244    else 
     245      Element.new( name, attrs, Text.new( self.to_s )) 
     246    end 
     247  end 
     248 
     249  def ==( rhs ) 
     250    self.data == rhs 
     251  end 
     252 
     253  private 
     254 
     255  def getDatatypeAttr( attrs, ns ) 
     256    attrs.push( Attr.new( ns.name( XSD::InstanceNamespace, 'type' ), ns.name( @namespace, @typeName ))) 
     257  end 
     258 
     259  def getExtraNSAttr( attrs, ns ) 
    233260    unless ns[ XSD::Namespace ] 
    234261      tag = ns.assign( XSD::Namespace ) 
    235262      attrs.push( Attr.new( 'xmlns:' << tag, XSD::Namespace )) 
    236263    end 
    237  
    238     # @typeName is in XSDBase 
    239     attrs.push( datatypeAttr( ns )) 
    240  
    241     if ( self.to_s.empty? ) 
    242       #Element.new( ns.name( namespace, name ), attrs ) 
    243       Element.new( name, attrs ) 
    244     else 
    245       #Element.new( ns.name( namespace, name ), attrs, Text.new( self.to_s )) 
    246       Element.new( name, attrs, Text.new( self.to_s )) 
    247     end 
    248   end 
    249  
    250   def ==( rhs ) 
    251     self.data == rhs 
    252   end 
    253  
    254   private 
    255  
    256   def datatypeAttr( ns ) 
    257     Attr.new( ns.name( XSD::InstanceNamespace, 'type' ), ns.name( @namespace, @typeName )) 
    258264  end 
    259265end 
     
    270276 
    271277  # Override the definition in SOAPBasetypeUtils. 
    272   def datatypeAttr( ns ) 
     278  def getDatatypeAttr( ns ) 
    273279    Attr.new( ns.name( XSD::Namespace, 'null' ), '1' ) 
    274280  end 
     
    297303end 
    298304 
     305class SOAPInt < XSDInt 
     306  extend SOAPModuleUtils 
     307  include SOAPBasetypeUtils 
     308end 
     309 
    299310class SOAPTimeInstant < XSDTimeInstant 
    300311  extend SOAPModuleUtils 
     
    360371  end 
    361372 
    362   def encode( ns, namespace, name
     373  def encode( ns, name
    363374    attrs = [] 
    364     unless ns[ @namespace ] 
    365       tag = ns.assign( @namespace ) 
    366       attrs.push( Attr.new( 'xmlns:' << tag, @namespace )) 
    367     end 
    368  
    369     attrs.push( Attr.new( ns.name( XSD::InstanceNamespace, 'type' ), ns.name( @namespace, @typeName ))) 
     375    getExtraNSAttr( attrs, ns ) 
     376    getDatatypeAttr( attrs, ns ) 
    370377 
    371378    children = @array.collect { | child | 
    372       @data[ child ].encode( ns.clone, namespace, child ) 
     379      @data[ child ].encode( ns.clone, child ) 
    373380    } 
    374381 
    375     #Element.new( ns.name( namespace, name ), attrs, children ) 
    376382    Element.new( name, attrs, children ) 
    377383  end 
    378384 
    379   def decode( ns, elem ) 
     385  def self.decode( ns, elem ) 
    380386    namespace, name = ns.parse( elem.nodeName ) 
    381387    s = SOAPStruct.new( name ) 
     
    391397    s 
    392398  end 
    393   module_function :decode 
    394  
    395   private 
     399 
     400  private 
     401 
     402  def getDatatypeAttr( attrs, ns ) 
     403    attrs.push( Attr.new( ns.name( XSD::InstanceNamespace, 'type' ), ns.name( @namespace, @typeName ))) 
     404  end 
     405 
     406  def getExtraNSAttr( attrs, ns ) 
     407    unless ns[ @namespace ] 
     408      tag = ns.assign( @namespace ) 
     409      attrs.push( Attr.new( 'xmlns:' << tag, @namespace )) 
     410    end 
     411  end 
    396412 
    397413  def addMember( name, initMember = nil ) 
     
    422438  def initialize( typeName = nil ) 
    423439    super( typeName ) 
    424     @data = [
     440    @data = [ []
    425441    @variant = false 
     442    @rank = 1 
    426443  end 
    427444 
     
    431448 
    432449  def add( newMember ) 
    433     if ( @data.empty? and !@typeName ) 
    434       @typeName = newMember.typeName 
     450    if ( @rank != 1 ) 
     451      raise NotImplementError.new( 'Rank must be 1' ) 
     452    end 
     453    if ( @data[ 0 ].empty? and !@typeName ) 
     454      @typeName = SOAPArray.getAtype( newMember.typeName, @rank ) 
     455      @namespace = newMember.namespace # ?? 
    435456    end 
    436457    if ( @typeName != newMember.typeName ) 
    437458      @variant = true 
    438459    end 
    439     @data << newMember 
     460    @data[ 0 ] << newMember 
    440461  end 
    441462 
    442463  def []( idx ) 
    443     if ( idx > @data.size ) 
     464    if ( @rank != 1 ) 
     465      raise NotImplementError.new( 'Rank must be 1' ) 
     466    end 
     467    if ( idx > @data[ 0 ].size ) 
    444468      raise ArrayIndexOutOfBoundsError.new( 'In ' << @typeName ) 
    445469    end 
    446     @data[ idx ] 
     470    @data[ 0 ][ idx ] 
    447471  end 
    448472 
    449473  def each 
    450     @data.each do | datum | 
     474    if ( @rank != 1 ) 
     475      raise NotImplementError.new( 'Rank must be 1' ) 
     476    end 
     477    @data[ 0 ].each do | datum | 
    451478      yield( datum ) 
    452479    end 
    453480  end 
    454481 
    455   def encode( ns, namespace, name ) 
    456     children = @data.collect { | child | 
    457       child.encode( ns.clone, namespace, @typeName ) 
     482  def encode( ns, name ) 
     483    attrs = [] 
     484    getExtraNSAttr( attrs, ns ) 
     485    getDatatypeAttr( attrs, ns ) 
     486 
     487    children = @data[ 0 ].collect { | child | 
     488      childTypeName = contentsTypeName().gsub( /\[,*\]/, 'Array' ) 
     489      child.encode( ns.clone, childTypeName ) 
    458490    } 
    459     attr = Attr.new( ns.name( XSD::InstanceNamespace, 'type' ), 
    460       ns.name( namespace, createType( @typeName, @data.size ))) 
    461     #Element.new( ns.name( namespace, name ), attr, children ) 
    462     Element.new( name, attr, children ) 
     491    Element.new( name, attrs, children ) 
    463492  end 
    464493 
     
    467496  end 
    468497 
     498  private 
     499 
     500  def getDatatypeAttr( attrs, ns ) 
     501    attrs.push( Attr.new( ns.name( EncodingNamespace, 'arrayType' ), ns.name( @namespace, arrayTypeValue() ))) 
     502  end 
     503 
     504  def getExtraNSAttr( attrs, ns ) 
     505    unless ns[ @namespace ] 
     506      tag = ns.assign( @namespace ) 
     507      attrs.push( Attr.new( 'xmlns:' << tag, @namespace )) 
     508    end 
     509    unless ns[ EncodingNamespace ] 
     510      tag = ns.assign( EncodingNamespace ) 
     511      attrs.push( Attr.new( 'xmlns:' << tag, EncodingNamespace )) 
     512    end 
     513  end 
     514 
     515  def contentsTypeName() 
     516    @typeName.dup.sub( /\[,*\]$/, '' ) 
     517  end 
     518 
     519  def arrayTypeValue() 
     520    contentsTypeName << '[' << @data.collect { |i| i.size }.join( ',' ) << ']' 
     521  end 
     522 
    469523  # Module function 
    470524 
    471525  public 
    472526 
    473   def decode( ns, elem ) 
     527  def self.decode( ns, elem ) 
    474528    typeNamespace, typeNameString = ns.parse( getType( ns, elem )) 
    475529    typeName, nofArray = parseType( typeNameString ) 
     
    490544    s 
    491545  end 
    492   module_function :decode 
    493  
    494   private 
    495  
    496   def createType( typeName, length = nil ) 
    497     "#{ typeName }[#{ length }]" 
    498   end 
    499   module_function :createType 
     546 
     547  private 
     548 
     549  def self.getAtype( typeName, rank ) 
     550    "#{ typeName }[" << ',' * ( rank - 1 ) << ']' 
     551  end 
    500552 
    501553  TypeParseRegexp = Regexp.new( '^(.+)\[(\d*)\]$' ) 
    502554 
    503   def parseType( string ) 
     555  def self.parseType( string ) 
    504556    TypeParseRegexp =~ string 
    505557    return $1, $2 
    506558  end 
    507   module_function :parseType 
    508 end 
     559end