summaryrefslogtreecommitdiff
path: root/lib/soap/baseData.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/soap/baseData.rb')
-rw-r--r--lib/soap/baseData.rb168
1 files changed, 102 insertions, 66 deletions
diff --git a/lib/soap/baseData.rb b/lib/soap/baseData.rb
index 91f5a0433f..49c1d2d1f4 100644
--- a/lib/soap/baseData.rb
+++ b/lib/soap/baseData.rb
@@ -1,5 +1,5 @@
# soap/baseData.rb: SOAP4R - Base type library
-# Copyright (C) 2000, 2001, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+# Copyright (C) 2000, 2001, 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;
@@ -30,20 +30,10 @@ end
###
-## Marker of SOAP/DM types.
+## for SOAP type(base and compound)
#
-module SOAPType; end
-
-
-###
-## Mix-in module for SOAP base type instances.
-#
-module SOAPBasetype
- include SOAPType
- include SOAP
-
+module SOAPType
attr_accessor :encodingstyle
-
attr_accessor :elename
attr_accessor :id
attr_reader :precedents
@@ -51,55 +41,53 @@ module SOAPBasetype
attr_accessor :parent
attr_accessor :position
attr_reader :extraattr
+ attr_accessor :definedtype
-public
-
- def initialize(*vars)
- super(*vars)
+ def initialize(*arg)
+ super(*arg)
@encodingstyle = nil
@elename = XSD::QName.new
@id = nil
@precedents = []
+ @root = false
@parent = nil
@position = nil
+ @definedtype = nil
@extraattr = {}
end
+
+ def rootnode
+ node = self
+ while node = node.parent
+ break if SOAPEnvelope === node
+ end
+ node
+ end
end
###
-## Mix-in module for SOAP compound type instances.
+## for SOAP base type
#
-module SOAPCompoundtype
+module SOAPBasetype
include SOAPType
include SOAP
- attr_accessor :encodingstyle
-
- attr_accessor :elename
- attr_accessor :id
- attr_reader :precedents
- attr_accessor :root
- attr_accessor :parent
- attr_accessor :position
- attr_reader :extraattr
+ def initialize(*arg)
+ super(*arg)
+ end
+end
- attr_accessor :definedtype
-public
+###
+## for SOAP compound type
+#
+module SOAPCompoundtype
+ include SOAPType
+ include SOAP
- def initialize(type)
- super()
- @type = type
- @encodingstyle = nil
- @elename = XSD::QName.new
- @id = nil
- @precedents = []
- @root = false
- @parent = nil
- @position = nil
- @definedtype = nil
- @extraattr = {}
+ def initialize(*arg)
+ super(*arg)
end
end
@@ -114,20 +102,14 @@ class SOAPReference < XSD::NSDBase
public
attr_accessor :refid
- attr_accessor :elename
# Override the definition in SOAPBasetype.
- def initialize(refid = nil)
+ def initialize(obj = nil)
super()
@type = XSD::QName.new
- @encodingstyle = nil
- @elename = XSD::QName.new
- @id = nil
- @precedents = []
- @root = false
- @parent = nil
- @refid = refid
+ @refid = nil
@obj = nil
+ __setobj__(obj) if obj
end
def __getobj__
@@ -136,7 +118,7 @@ public
def __setobj__(obj)
@obj = obj
- @refid = SOAPReference.create_refid(@obj)
+ @refid = @obj.id || SOAPReference.create_refid(@obj)
@obj.id = @refid unless @obj.id
@obj.precedents << self
# Copies NSDBase information
@@ -159,17 +141,54 @@ public
end
end
- def self.decode(elename, refid)
+ def refidstr
+ '#' + @refid
+ end
+
+ def self.create_refid(obj)
+ 'id' + obj.__id__.to_s
+ end
+
+ def self.decode(elename, refidstr)
+ if /\A#(.*)\z/ =~ refidstr
+ refid = $1
+ elsif /\Acid:(.*)\z/ =~ refidstr
+ refid = $1
+ else
+ raise ArgumentError.new("illegal refid #{refidstr}")
+ end
d = super(elename)
d.refid = refid
d
end
+end
- def self.create_refid(obj)
- 'id' << obj.__id__.to_s
+
+class SOAPExternalReference < XSD::NSDBase
+ include SOAPBasetype
+ extend SOAPModuleUtils
+
+ def initialize
+ super()
+ @type = XSD::QName.new
+ end
+
+ def referred
+ rootnode.external_content[external_contentid] = self
+ end
+
+ def refidstr
+ 'cid:' + external_contentid
+ end
+
+private
+
+ def external_contentid
+ raise NotImplementedError.new
end
end
+
class SOAPNil < XSD::XSDNil
include SOAPBasetype
extend SOAPModuleUtils
@@ -326,7 +345,8 @@ class SOAPStruct < XSD::NSDBase
public
def initialize(type = nil)
- super(type || XSD::QName.new)
+ super()
+ @type = type || XSD::QName.new
@array = []
@data = []
end
@@ -362,6 +382,7 @@ public
def []=(idx, data)
if @array.include?(idx)
+ data.parent = self if data.respond_to?(:parent=)
@data[@array.index(idx)] = data
else
add(idx, data)
@@ -401,31 +422,42 @@ private
@array.push(name)
value.elename = value.elename.dup_name(name)
@data.push(value)
+ value.parent = self if value.respond_to?(:parent=)
+ value
end
end
-# SOAPElement is not typed so it does not derive NSDBase.
+# SOAPElement is not typed so it is not derived from NSDBase.
class SOAPElement
include Enumerable
attr_accessor :encodingstyle
- attr_accessor :extraattr
+
+ attr_accessor :elename
+ attr_accessor :id
attr_reader :precedents
+ attr_accessor :root
+ attr_accessor :parent
+ attr_accessor :position
+ attr_accessor :extraattr
attr_accessor :qualified
- attr_accessor :elename
def initialize(elename, text = nil)
if !elename.is_a?(XSD::QName)
elename = XSD::QName.new(nil, elename)
end
@encodingstyle = LiteralNamespace
- @extraattr = {}
+ @elename = elename
+ @id = nil
@precedents = []
+ @root = false
+ @parent = nil
+ @position = nil
+ @extraattr = {}
@qualified = false
- @elename = elename
@array = []
@data = []
@@ -450,6 +482,7 @@ class SOAPElement
def []=(idx, data)
if @array.include?(idx)
+ data.parent = self if data.respond_to?(:parent=)
@data[@array.index(idx)] = data
else
add(data)
@@ -470,7 +503,7 @@ class SOAPElement
else
hash = {}
each do |k, v|
- hash[k] = v.to_obj
+ hash[k] = v.is_a?(SOAPElement) ? v.to_obj : v.to_s
end
hash
end
@@ -483,8 +516,7 @@ class SOAPElement
end
def self.decode(elename)
- o = SOAPElement.new
- o.elename = elename
+ o = SOAPElement.new(elename)
o
end
@@ -493,7 +525,7 @@ class SOAPElement
if hash_or_string.is_a?(Hash)
hash_or_string.each do |k, v|
child = self.from_obj(v)
- child.elename = XSD::QName.new(nil, k)
+ child.elename = k.is_a?(XSD::QName) ? k : XSD::QName.new(nil, k.to_s)
o.add(child)
end
else
@@ -508,6 +540,8 @@ private
add_accessor(name)
@array.push(name)
@data.push(value)
+ value.parent = self if value.respond_to?(:parent=)
+ value
end
def add_accessor(name)
@@ -550,7 +584,8 @@ public
attr_reader :arytype
def initialize(type = nil, rank = 1, arytype = nil)
- super(type || XSD::QName.new)
+ super()
+ @type = type || XSD::QName.new
@rank = rank
@data = Array.new
@sparse = false
@@ -609,6 +644,7 @@ public
end
@offset = idxary
+ value.parent = self if value.respond_to?(:parent=)
offsetnext
end