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

root/branches/1_5/lib/wsdl/operation.rb

Revision 1824, 3.2 kB (checked in by nahi, 1 year ago)
  • Copyright notice updated. add '2000-2007' uniformly.
  • Property svn:eol-style set to native
  • Property svn:keywords set to author date id revision
Line 
1 # WSDL4R - WSDL operation 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
14
15 class Operation < Info
16   class NameInfo
17     attr_reader :op_name
18     attr_reader :optype_name
19     attr_reader :parts
20     def initialize(op_name, optype_name, parts)
21       @op_name = op_name
22       @optype_name = optype_name
23       @parts = parts
24     end
25   end
26
27   attr_reader :name             # required
28   attr_reader :parameter_order  # optional
29   attr_reader :input
30   attr_reader :output
31   attr_reader :fault
32   attr_reader :type             # required
33
34   def initialize
35     super
36     @name = nil
37     @type = nil
38     @parameter_order = nil
39     @input = nil
40     @output = nil
41     @fault = []
42   end
43
44   def targetnamespace
45     parent.targetnamespace
46   end
47
48   def operationname
49     as_operationname(@name)
50   end
51
52   def input_info
53     if message = input_message
54       typename = message.name
55     else
56       typename = nil
57     end
58     NameInfo.new(operationname, typename, inputparts)
59   end
60
61   def output_info
62     if message = output_message
63       typename = message.name
64     else
65       typename = nil
66     end
67     NameInfo.new(operationname, typename, outputparts)
68   end
69
70   EMPTY = [].freeze
71   def inputparts
72     if message = input_message
73       sort_parts(message.parts)
74     else
75       EMPTY
76     end
77   end
78
79   def inputname
80     if input
81       as_operationname(input.name ? input.name.name : @name)
82     else
83       nil
84     end
85   end
86
87   def outputparts
88     if message = output_message
89       sort_parts(message.parts)
90     else
91       EMPTY
92     end
93   end
94
95   def outputname
96     if output
97       as_operationname(output.name ? output.name.name : @name + 'Response')
98     else
99       nil
100     end
101   end
102
103   def parse_element(element)
104     case element
105     when InputName
106       o = Param.new
107       @input = o
108       o
109     when OutputName
110       o = Param.new
111       @output = o
112       o
113     when FaultName
114       o = Param.new
115       @fault << o
116       o
117     when DocumentationName
118       o = Documentation.new
119       o
120     else
121       nil
122     end
123   end
124
125   def parse_attr(attr, value)
126     case attr
127     when NameAttrName
128       @name = value.source
129     when TypeAttrName
130       @type = value
131     when ParameterOrderAttrName
132       @parameter_order = value.source.split(/\s+/)
133     else
134       nil
135     end
136   end
137
138 private
139
140   def input_message
141     if input and message = input.find_message
142       message
143     else
144       nil
145     end
146   end
147
148   def output_message
149     if output and message = output.find_message
150       message
151     else
152       nil
153     end
154   end
155
156   def sort_parts(parts)
157     return parts.dup unless parameter_order
158     result = []
159     parameter_order.each do |orderitem|
160       if (ele = parts.find { |part| part.name == orderitem })
161         result << ele
162       end
163     end
164     if result.length == 0
165       return parts.dup
166     end
167     # result length can be shorter than parts's.
168     # return part must not be a part of the parameterOrder.
169     result
170   end
171
172   def as_operationname(name)
173     XSD::QName.new(targetnamespace, name)
174   end
175 end
176
177
178 end
Note: See TracBrowser for help on using the browser.