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

root/branches/1_5/lib/wsdl/xmlSchema/element.rb

Revision 1906, 3.8 kB (checked in by nahi, 1 year ago)
  • added <xsd:group> support. closes #391.
  • Property svn:eol-style set to native
  • Property svn:keywords set to author date id revision
Line 
1 # WSDL4R - XMLSchema element definition.
2 # Copyright (C) 2000-2007  NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
4 # This program is copyrighted free software by NAKAMURA, Hiroshi.  You can
5 # redistribute it and/or modify it under the same terms of Ruby's license;
6 # either the dual license version in 2003, or any later version.
7
8
9 require 'wsdl/info'
10
11
12 module WSDL
13 module XMLSchema
14
15
16 class Element < Info
17   class << self
18     if RUBY_VERSION > "1.7.0"
19       def attr_reader_ref(symbol)
20         name = symbol.to_s
21         define_method(name) {
22           instance_variable_get("@#{name}") ||
23             (refelement ? refelement.__send__(name) : nil)
24         }
25       end
26     else
27       def attr_reader_ref(symbol)
28         name = symbol.to_s
29         module_eval <<-EOS
30           def #{name}
31             @#{name} || (refelement ? refelement.#{name} : nil)
32           end
33         EOS
34       end
35     end
36   end
37
38   attr_writer :name     # required
39   attr_writer :form
40   attr_writer :type
41   attr_writer :local_simpletype
42   attr_writer :local_complextype
43   attr_writer :constraint
44   attr_accessor :maxoccurs
45   attr_accessor :minoccurs
46   attr_writer :nillable
47
48   attr_reader_ref :name
49   attr_reader_ref :form
50   attr_reader_ref :type
51   attr_reader_ref :local_simpletype
52   attr_reader_ref :local_complextype
53   attr_reader_ref :constraint
54   attr_reader_ref :nillable
55   attr_reader_ref :default
56   attr_reader_ref :abstract
57
58   attr_accessor :ref
59
60   def initialize(name = nil, type = nil)
61     super()
62     @name = name
63     @form = nil
64     @type = type
65     @local_simpletype = @local_complextype = nil
66     @constraint = nil
67     @maxoccurs = 1
68     @minoccurs = 1
69     @nillable = nil
70     @default = nil
71     @abstract = false
72     @ref = nil
73     @refelement = nil
74   end
75
76   def empty?
77     !(local_simpletype || local_complextype || constraint || type)
78   end
79
80   def refelement
81     @refelement ||= (@ref ? root.collect_elements[@ref] : nil)
82   end
83
84   def targetnamespace
85     parent.targetnamespace
86   end
87
88   def elementformdefault
89     parent.elementformdefault
90   end
91
92   def elementform
93     self.form.nil? ? parent.elementformdefault : self.form
94   end
95
96   def parse_element(element)
97     case element
98     when SimpleTypeName
99       @local_simpletype = SimpleType.new
100       @local_simpletype
101     when ComplexTypeName
102       @type = nil
103       @local_complextype = ComplexType.new
104       @local_complextype
105     when UniqueName
106       @constraint = Unique.new
107       @constraint
108     else
109       nil
110     end
111   end
112
113   def parse_attr(attr, value)
114     case attr
115     when NameAttrName
116       # namespace may be nil
117       if directelement? or elementform == 'qualified'
118         @name = XSD::QName.new(targetnamespace, value.source)
119       else
120         @name = XSD::QName.new(nil, value.source)
121       end
122     when FormAttrName
123       @form = value.source
124       if @form != 'qualified' and @name.namespace
125         @name = XSD::QName.new(nil, @name.name)
126       end
127       @form
128     when TypeAttrName
129       @type = value
130     when RefAttrName
131       @ref = value
132     when MaxOccursAttrName
133       if parent.is_a?(All)
134         if value.source != '1'
135           raise Parser::AttributeConstraintError.new(
136             "cannot parse #{value} for #{attr}")
137         end
138       end
139       if value.source == 'unbounded'
140         @maxoccurs = nil
141       else
142         @maxoccurs = Integer(value.source)
143       end
144       value.source
145     when MinOccursAttrName
146       if parent.is_a?(All)
147         unless ['0', '1'].include?(value.source)
148           raise Parser::AttributeConstraintError.new(
149             "cannot parse #{value} for #{attr}")
150         end
151       end
152       @minoccurs = Integer(value.source)
153     when NillableAttrName
154       @nillable = to_boolean(value)
155     when DefaultAttrName
156       @default = value.source
157     when AbstractAttrName
158       @abstract = to_boolean(value)
159     else
160       nil
161     end
162   end
163
164 private
165
166   def directelement?
167     parent.is_a?(Schema)
168   end
169 end
170
171
172 end
173 end
Note: See TracBrowser for help on using the browser.