Changeset 10
- Timestamp:
- 07/27/00 16:04:42 (8 years ago)
- Files:
-
- trunk/lib/SOAPData.rb (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/lib/SOAPData.rb
r2 r10 41 41 elsif ( name == '' ) 42 42 @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 43 49 else 44 50 name ||= SOAPNS.assign( namespace ) … … 109 115 AssigningName = [ 0 ] 110 116 111 def SOAPNS.assign( namespace )117 def self.assign( namespace ) 112 118 AssigningName[ 0 ] += 1 113 119 'n' << AssigningName[ 0 ].to_s 114 120 end 115 121 116 def SOAPNS.reset()122 def self.reset() 117 123 AssigningName[ 0 ] = 0 118 124 end … … 149 155 150 156 case getType( ns, elem ) 157 when 'int' 158 SOAPInt.decode( ns, elem ) 159 when 'integer' 160 SOAPInteger.decode( ns, elem ) 151 161 when 'boolean' 152 162 SOAPBoolean.decode( ns, elem ) … … 155 165 when 'timeInstant' 156 166 SOAPTimeInstant.decode( ns, elem ) 157 when 'integer'158 SOAPInteger.decode( ns, elem )159 167 when /\[\d*\]$/ 160 168 SOAPArray.decode( ns, elem ) … … 219 227 public 220 228 221 attr_reader :attrs222 223 229 def initialize( *vars ) 224 230 super( *vars ) … … 229 235 end 230 236 231 def encode( ns, name space, name)237 def encode( ns, name ) 232 238 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 ) 233 260 unless ns[ XSD::Namespace ] 234 261 tag = ns.assign( XSD::Namespace ) 235 262 attrs.push( Attr.new( 'xmlns:' << tag, XSD::Namespace )) 236 263 end 237 238 # @typeName is in XSDBase239 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 else245 #Element.new( ns.name( namespace, name ), attrs, Text.new( self.to_s ))246 Element.new( name, attrs, Text.new( self.to_s ))247 end248 end249 250 def ==( rhs )251 self.data == rhs252 end253 254 private255 256 def datatypeAttr( ns )257 Attr.new( ns.name( XSD::InstanceNamespace, 'type' ), ns.name( @namespace, @typeName ))258 264 end 259 265 end … … 270 276 271 277 # Override the definition in SOAPBasetypeUtils. 272 def datatypeAttr( ns )278 def getDatatypeAttr( ns ) 273 279 Attr.new( ns.name( XSD::Namespace, 'null' ), '1' ) 274 280 end … … 297 303 end 298 304 305 class SOAPInt < XSDInt 306 extend SOAPModuleUtils 307 include SOAPBasetypeUtils 308 end 309 299 310 class SOAPTimeInstant < XSDTimeInstant 300 311 extend SOAPModuleUtils … … 360 371 end 361 372 362 def encode( ns, name space, name)373 def encode( ns, name ) 363 374 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 ) 370 377 371 378 children = @array.collect { | child | 372 @data[ child ].encode( ns.clone, namespace,child )379 @data[ child ].encode( ns.clone, child ) 373 380 } 374 381 375 #Element.new( ns.name( namespace, name ), attrs, children )376 382 Element.new( name, attrs, children ) 377 383 end 378 384 379 def decode( ns, elem )385 def self.decode( ns, elem ) 380 386 namespace, name = ns.parse( elem.nodeName ) 381 387 s = SOAPStruct.new( name ) … … 391 397 s 392 398 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 396 412 397 413 def addMember( name, initMember = nil ) … … 422 438 def initialize( typeName = nil ) 423 439 super( typeName ) 424 @data = [ ]440 @data = [ [] ] 425 441 @variant = false 442 @rank = 1 426 443 end 427 444 … … 431 448 432 449 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 # ?? 435 456 end 436 457 if ( @typeName != newMember.typeName ) 437 458 @variant = true 438 459 end 439 @data << newMember460 @data[ 0 ] << newMember 440 461 end 441 462 442 463 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 ) 444 468 raise ArrayIndexOutOfBoundsError.new( 'In ' << @typeName ) 445 469 end 446 @data[ idx ]470 @data[ 0 ][ idx ] 447 471 end 448 472 449 473 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 | 451 478 yield( datum ) 452 479 end 453 480 end 454 481 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 ) 458 490 } 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 ) 463 492 end 464 493 … … 467 496 end 468 497 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 469 523 # Module function 470 524 471 525 public 472 526 473 def decode( ns, elem )527 def self.decode( ns, elem ) 474 528 typeNamespace, typeNameString = ns.parse( getType( ns, elem )) 475 529 typeName, nofArray = parseType( typeNameString ) … … 490 544 s 491 545 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 500 552 501 553 TypeParseRegexp = Regexp.new( '^(.+)\[(\d*)\]$' ) 502 554 503 def parseType( string )555 def self.parseType( string ) 504 556 TypeParseRegexp =~ string 505 557 return $1, $2 506 558 end 507 module_function :parseType 508 end 559 end