File Coverage

blib/lib/Pod/WSDL/Method.pm
Criterion Covered Total %
statement 37 167 22.1
branch 6 56 10.7
condition 6 21 28.5
subroutine 14 22 63.6
pod 8 9 88.8
total 71 275 25.8


line stmt bran cond sub pod time code
1             package Pod::WSDL::Method;
2              
3 7     7   15022 use strict;
  7         12  
  7         247  
4 7     7   32 use warnings;
  7         8  
  7         222  
5 7     7   2256 use Pod::WSDL::Param;
  7         9  
  7         162  
6 7     7   2335 use Pod::WSDL::Fault;
  7         15  
  7         169  
7 7     7   2492 use Pod::WSDL::Return;
  7         12  
  7         169  
8 7     7   2385 use Pod::WSDL::Doc;
  7         11  
  7         154  
9 7     7   2404 use Pod::WSDL::Writer;
  7         16  
  7         206  
10 7     7   30 use Pod::WSDL::Utils qw(:writexml :namespaces :messages);
  7         8  
  7         1242  
11 7     7   32 use Pod::WSDL::AUTOLOAD;
  7         9  
  7         11761  
12              
13             our $VERSION = "0.05";
14             our @ISA = qw/Pod::WSDL::AUTOLOAD/;
15              
16             our $EMPTY_MESSAGE_NAME = 'empty';
17             our $REQUEST_SUFFIX_NAME = 'Request';
18             our $RESPONSE_SUFFIX_NAME = 'Response';
19             our $RETURN_SUFFIX_NAME = 'Return';
20             our $TARGET_NS_DECL = 'tns1';
21              
22             our %FORBIDDEN_METHODS = (
23             name => {get => 1, set => 0},
24             params => {get => 1, set => 0},
25             doc => {get => 1, set => 1},
26             return => {get => 1, set => 1},
27             faults => {get => 1, set => 0},
28             oneway => {get => 1, set => 1},
29             writer => {get => 0, set => 0},
30             );
31              
32             sub new {
33 3     3 1 610 my ($pkg, %data) = @_;
34            
35 3 100       17 die "A method needs a name, died" unless defined $data{name};
36 2 100 66     19 die "A method needs a writer, died" unless defined $data{writer} and ref $data{writer} eq 'Pod::WSDL::Writer';
37            
38 1   50     29 bless {
      33        
      50        
      50        
39             _name => $data{name},
40             _params => $data{params} || [],
41             _return => $data{return},
42             _doc => $data{doc} || new Pod::WSDL::Doc('_DOC'),
43             _faults => $data{faults} || [],
44             _oneway => $data{oneWay} || 0,
45             _writer => $data{writer},
46             _emptyMessageWritten => 0,
47             }, $pkg;
48             }
49              
50             sub addParam {
51 1 50   1 1 4 push @{$_[0]->{_params}}, $_[1] if defined $_[1];
  1         4  
52             }
53              
54             sub addFault {
55 1 50   1 1 2 push @{$_[0]->{_faults}}, $_[1] if defined $_[1];
  1         3  
56             }
57              
58             sub requestName {
59 1     1 1 331 return $_[0]->name . $REQUEST_SUFFIX_NAME;
60             }
61              
62             sub responseName {
63 1     1 1 7 return $_[0]->name . $RESPONSE_SUFFIX_NAME;
64             }
65              
66             sub writeMessages {
67 0     0 1   my $me = shift;
68 0           my $types = shift;
69 0           my $style = shift;
70 0           my $wrapped = shift;
71            
72 0           $me->_writeMessageRequestElem($types, $style, $wrapped);
73 0           $me->writer->wrNewLine;
74              
75 0 0         unless ($me->oneway) {
76 0 0         if ($me->return) {
77 0           $me->_writeMessageResponseElem($types, $style, $wrapped);
78 0           $me->writer->wrNewLine;
79             } else {
80 0 0         unless ($me->writer->emptyMessageWritten) {
81 0           $me->writer->wrElem($EMPTY_PREFIX_NAME, 'wsdl:message', name => $EMPTY_MESSAGE_NAME);
82 0           $me->writer->registerWrittenEmptyMessage;
83 0           $me->writer->wrNewLine;
84             }
85             }
86             }
87            
88 0           for my $fault (@{$me->faults}) {
  0            
89 0 0         next if $me->writer->faultMessageWritten($fault->wsdlName);
90            
91 0           $me->_writeMessageFaultElem($fault->wsdlName, $style, $wrapped);
92 0           $me->writer->registerWrittenFaultMessage($fault->wsdlName);
93 0           $me->writer->wrNewLine;
94             }
95             }
96              
97             sub writePortTypeOperation {
98 0     0 1   my $me = shift;
99            
100 0           my $name = $me->name;
101 0           my $paramOrder = '';
102            
103 0           for my $param (@{$me->params}) {
  0            
104 0           $paramOrder .= $param->name . ' ';
105             }
106              
107 0           $paramOrder =~ s/\s+$//;
108            
109 0           my $inputName = $name . $REQUEST_SUFFIX_NAME;
110 0           my $outputName = $name . $RESPONSE_SUFFIX_NAME;
111              
112             # maintain param order, name always first
113             # if no params, don't send and element with that name
114 0 0         my @p_order = $paramOrder ? ('parameterOrder', $paramOrder) : () ;
115              
116 0           $me->writer->wrElem($START_PREFIX_NAME, 'wsdl:operation', name => $name, @p_order);
117 0           $me->writer->wrDoc($me->doc->descr);
118 0           $me->writer->wrElem($EMPTY_PREFIX_NAME, 'wsdl:input', message => "$IMPL_NS_DECL:$inputName", name => $inputName);
119            
120             # if method has no return, we treat it as one-way operation
121 0 0         unless ($me->oneway) {
122 0 0         if ($me->return) {
123 0           $me->writer->wrElem($EMPTY_PREFIX_NAME, 'wsdl:output', message => "$IMPL_NS_DECL:$outputName", name => $outputName);
124             } else {
125 0           $me->writer->wrElem($EMPTY_PREFIX_NAME, 'wsdl:output', message => "$IMPL_NS_DECL:$EMPTY_MESSAGE_NAME");
126             }
127             }
128              
129 0           my $elemType;
130              
131             # write methods faults
132 0           for my $fault (@{$me->faults}) {
  0            
133            
134             # if we want documentation and have some documentation ...
135 0 0 0       if ($fault->descr and $me->writer->withDocumentation) {
136 0           $elemType = $START_PREFIX_NAME;
137             } else {
138 0           $elemType = $EMPTY_PREFIX_NAME;
139             }
140            
141 0           $me->writer->wrElem($elemType, "wsdl:fault", message => "$IMPL_NS_DECL:" . $fault->wsdlName, name => $fault->wsdlName);
142            
143             # only, if with documentation
144 0 0         if ($elemType eq $START_PREFIX_NAME) {
145 0           $me->writer->wrDoc($fault->descr);
146 0           $me->writer->wrElem($END_PREFIX_NAME, "wsdl:fault");
147             }
148             }
149              
150 0           $me->writer->wrElem($END_PREFIX_NAME, 'wsdl:operation');
151             }
152              
153             sub _writeMessageRequestElem {
154 0     0     my $me = shift;
155 0           my $types = shift;
156 0           my $style = shift;
157 0           my $wrapped = shift;
158              
159 0           $me->writer->wrElem($START_PREFIX_NAME, 'wsdl:message', name => $me->requestName);
160            
161 0 0         if ($wrapped) {
162 0           $me->writer->wrElem($EMPTY_PREFIX_NAME, 'wsdl:part', name => 'parameters', element => $me->requestName);
163             } else {
164 0           for my $param (@{$me->params}) {
  0            
165 0 0         $me->_writePartElem($param->name, $param->type, $param->array, $param->descr, $style, 0, $types->{$param->type}) if $param->paramType =~ /^(INOUT|OUT|IN)$/;
166             }
167             }
168            
169 0           $me->writer->wrElem($END_PREFIX_NAME, 'wsdl:message');
170             }
171              
172             sub _writeMessageResponseElem {
173 0     0     my $me = shift;
174 0           my $types = shift;
175 0           my $style = shift;
176 0           my $wrapped = shift;
177              
178 0           $me->writer->wrElem($START_PREFIX_NAME, 'wsdl:message', name => $me->responseName);
179              
180 0 0         if ($wrapped) {
181 0           $me->writer->wrElem($EMPTY_PREFIX_NAME, 'wsdl:part', name => 'parameters', element => $me->responseName);
182             } else {
183 0           for my $param (@{$me->params}) {
  0            
184 0 0         $me->_writePartElem($param->name, $param->type, $param->array, $param->descr, $style, 0, $types->{$param->type}) if $param->paramType =~ /^(INOUT|OUT)?$/;
185             }
186            
187 0 0         if (defined $me->return) {
188 0           $me->_writePartElem($me->name . $RETURN_SUFFIX_NAME, $me->return->type, $me->return->array, $me->return->descr, $style, 1, $types->{$me->return->type});
189             }
190             }
191            
192 0           $me->writer->wrElem($END_PREFIX_NAME, 'wsdl:message');
193             }
194              
195             sub _writeMessageFaultElem {
196 0     0     my $me = shift;
197 0           my $name = shift;
198 0           my $style = shift;
199 0           my $wrapped = shift;
200              
201 0           my %attrs = (name => $FAULT_NAME);
202            
203 0 0         if ($style eq $RPC_STYLE) {
    0          
204 0           $attrs{type} = "$TARGET_NS_DECL:$name";
205             } elsif ($style eq $DOCUMENT_STYLE) {
206 0           $attrs{element} = $name . $MESSAGE_PART;
207             }
208              
209 0           $me->writer->wrElem($START_PREFIX_NAME, 'wsdl:message', name => $name);
210 0           $me->writer->wrElem($EMPTY_PREFIX_NAME, 'wsdl:part', %attrs);
211 0           $me->writer->wrElem($END_PREFIX_NAME, 'wsdl:message');
212             }
213              
214             sub _writePartElem {
215 0     0     my $me = shift;
216 0           my $name = shift;
217 0           my $type = shift;
218 0           my $array = shift;
219 0           my $descr = shift;
220 0           my $style = shift;
221 0           my $isReturn = shift;
222 0           my $ownType = shift;
223              
224 0           my %attrs = (name => $name);
225            
226 0 0         if ($style eq $RPC_STYLE) {
    0          
227 0           $attrs{type} = Pod::WSDL::Utils::getTypeDescr($type, $array, $ownType);
228             } elsif ($style eq $DOCUMENT_STYLE) {
229 0 0         $attrs{element} = ($isReturn ? lcfirst $RETURN_SUFFIX_NAME : $name) . $PART_IN . ucfirst $me->requestName
230             }
231            
232 0 0 0       if ($descr and $me->writer->withDocumentation) {
233 0           $me->writer->wrElem($START_PREFIX_NAME, 'wsdl:part', %attrs);
234 0           $me->writer->wrDoc($descr);
235 0           $me->writer->wrElem($END_PREFIX_NAME, 'wsdl:part');
236            
237             } else {
238 0           $me->writer->wrElem($EMPTY_PREFIX_NAME, 'wsdl:part', %attrs);
239             }
240             }
241              
242             sub writeBindingOperation {
243 0     0 1   my $me = shift;
244 0           my $location = shift;
245 0           my $use = shift;
246              
247 0           $me->writer->wrElem($START_PREFIX_NAME, "wsdl:operation", name => $me->name);
248 0           $me->writer->wrElem($EMPTY_PREFIX_NAME, "wsdlsoap:operation", soapAction => "");
249 0           $me->writer->wrElem($START_PREFIX_NAME, "wsdl:input", name => $me->requestName);
250 0           $me->writer->wrElem($EMPTY_PREFIX_NAME, "wsdlsoap:body", encodingStyle => "http://schemas.xmlsoap.org/soap/encoding/", namespace => $location, use => $use);
251 0           $me->writer->wrElem($END_PREFIX_NAME, "wsdl:input");
252            
253 0 0         unless ($me->oneway) {
254 0 0         $me->writer->wrElem($START_PREFIX_NAME, "wsdl:output", name => $me->return ? $me->responseName : $EMPTY_MESSAGE_NAME);
255 0           $me->writer->wrElem($EMPTY_PREFIX_NAME, "wsdlsoap:body", encodingStyle => "http://schemas.xmlsoap.org/soap/encoding/", namespace => $location, use => $use);
256 0           $me->writer->wrElem($END_PREFIX_NAME, "wsdl:output");
257             }
258            
259 0           for my $fault (@{$me->faults}) {
  0            
260 0           $me->writer->wrElem($START_PREFIX_NAME, "wsdl:fault", name => $fault->wsdlName);
261 0           $me->writer->wrElem($EMPTY_PREFIX_NAME, "wsdlsoap:fault", name => $fault->wsdlName, encodingStyle => "http://schemas.xmlsoap.org/soap/encoding/", namespace => $location, use => $use);
262 0           $me->writer->wrElem($END_PREFIX_NAME, "wsdl:fault");
263             }
264              
265 0           $me->writer->wrElem($END_PREFIX_NAME, "wsdl:operation");
266             }
267              
268             sub writeDocumentStyleSchemaElements {
269 0     0 0   my $me = shift;
270 0           my $types = shift;
271            
272 0           for my $param (@{$me->params}) {
  0            
273 0           $me->writer->wrElem($EMPTY_PREFIX_NAME, 'element',
274             name => $param->name . $PART_IN . ucfirst $me->requestName,
275             type => Pod::WSDL::Utils::getTypeDescr($param->type, $param->array, $types->{$param->type}));
276             }
277              
278 0           for my $fault (@{$me->faults}) {
  0            
279 0 0         next if $me->writer->faultMessageWritten($fault->wsdlName . $MESSAGE_PART);
280            
281 0           $me->writer->registerWrittenFaultMessage($fault->wsdlName . $MESSAGE_PART);
282              
283 0           $me->writer->wrElem($EMPTY_PREFIX_NAME, 'element',
284             name => $fault->wsdlName . $MESSAGE_PART,
285             type => Pod::WSDL::Utils::getTypeDescr($fault->type, 0, $types->{$fault->type}));
286             }
287              
288 0 0 0       if (!$me->oneway and $me->return) {
289 0           $me->writer->wrElem($EMPTY_PREFIX_NAME, 'element',
290             name => lcfirst $RETURN_SUFFIX_NAME . $PART_IN . ucfirst $me->requestName,
291             type => Pod::WSDL::Utils::getTypeDescr($me->return->type, $me->return->array, $types->{$me->return->type}));
292             }
293             }
294             1;
295             __END__