1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace WsdlToPhp\PackageGenerator\File; |
4
|
|
|
|
5
|
|
|
use WsdlToPhp\PackageGenerator\Parser\Wsdl\TagHeader; |
6
|
|
|
use WsdlToPhp\PackageGenerator\Model\AbstractModel; |
7
|
|
|
use WsdlToPhp\PackageGenerator\Model\Method as MethodModel; |
8
|
|
|
use WsdlToPhp\PhpGenerator\Element\PhpAnnotation; |
9
|
|
|
use WsdlToPhp\PhpGenerator\Element\PhpAnnotationBlock; |
10
|
|
|
use WsdlToPhp\PackageGenerator\File\Utils as FileUtils; |
11
|
|
|
|
12
|
|
|
class OperationAnnotationBlock extends AbstractOperation |
13
|
|
|
{ |
14
|
|
|
/** |
15
|
|
|
* @param PhpAnnotationBlock $annotationBlock |
16
|
|
|
* @return OperationAnnotationBlock |
17
|
|
|
*/ |
18
|
84 |
|
public function addAnnotationBlockForOperationMethod(PhpAnnotationBlock $annotationBlock) |
19
|
|
|
{ |
20
|
84 |
|
$this->addOperationMethodDeclaration($annotationBlock) |
21
|
84 |
|
->addOperationMethodMetaInformations($annotationBlock) |
22
|
84 |
|
->addOperationMethodUses($annotationBlock) |
23
|
84 |
|
->addOperationMethodParam($annotationBlock) |
24
|
84 |
|
->addOperationMethodReturn($annotationBlock); |
25
|
84 |
|
return $this; |
26
|
|
|
} |
27
|
|
|
/** |
28
|
|
|
* @param PhpAnnotationBlock $annotationBlock |
29
|
|
|
* @return OperationAnnotationBlock |
30
|
|
|
*/ |
31
|
84 |
|
protected function addOperationMethodDeclaration(PhpAnnotationBlock $annotationBlock) |
32
|
|
|
{ |
33
|
84 |
|
$annotationBlock->addChild(sprintf('Method to call the operation originally named %s', $this->getMethod()->getName())); |
34
|
84 |
|
if (!$this->getMethod()->getIsUnique()) { |
35
|
|
|
$annotationBlock->addChild('This method has been renamed because it is defined several times but with different signature'); |
36
|
|
|
} |
37
|
84 |
|
return $this; |
38
|
|
|
} |
39
|
|
|
/** |
40
|
|
|
* @param PhpAnnotationBlock $annotationBlock |
41
|
|
|
* @return OperationAnnotationBlock |
42
|
|
|
*/ |
43
|
84 |
|
protected function addOperationMethodMetaInformations(PhpAnnotationBlock $annotationBlock) |
44
|
|
|
{ |
45
|
84 |
|
$soapHeaderNames = $this->getMethod()->getMetaValue(TagHeader::META_SOAP_HEADER_NAMES, array()); |
46
|
84 |
|
$soapHeaderTypes = $this->getMethod()->getMetaValue(TagHeader::META_SOAP_HEADER_TYPES, array()); |
47
|
84 |
|
$soapHeaderNamespaces = $this->getMethod()->getMetaValue(TagHeader::META_SOAP_HEADER_NAMESPACES, array()); |
48
|
84 |
|
$soapHeaders = $this->getMethod()->getMetaValue(TagHeader::META_SOAP_HEADERS, array()); |
49
|
84 |
|
if (!empty($soapHeaderNames) && !empty($soapHeaderTypes) && !empty($soapHeaderNamespaces)) { |
50
|
20 |
|
$annotationBlock->addChild('Meta informations extracted from the WSDL') |
51
|
20 |
|
->addChild(new PhpAnnotation(PhpAnnotation::NO_NAME, sprintf('- SOAPHeaderNames : %s', implode(', ', $soapHeaderNames)), AbstractModelFile::ANNOTATION_LONG_LENGTH)) |
52
|
20 |
|
->addChild(new PhpAnnotation(PhpAnnotation::NO_NAME, sprintf('- SOAPHeaderNamespaces : %s', implode(', ', $soapHeaderNamespaces)), AbstractModelFile::ANNOTATION_LONG_LENGTH)) |
53
|
20 |
|
->addChild(new PhpAnnotation(PhpAnnotation::NO_NAME, sprintf('- SOAPHeaderTypes : %s', implode(', ', $this->getSoapHeaderTypesTypes($soapHeaderTypes))), AbstractModelFile::ANNOTATION_LONG_LENGTH)) |
54
|
20 |
|
->addChild(new PhpAnnotation(PhpAnnotation::NO_NAME, sprintf('- SOAPHeaders : %s', implode(', ', $soapHeaders)), AbstractModelFile::ANNOTATION_LONG_LENGTH)); |
55
|
15 |
|
} |
56
|
84 |
|
FileUtils::defineModelAnnotationsFromWsdl($annotationBlock, $this->getMethod(), array( |
57
|
84 |
|
TagHeader::META_SOAP_HEADER_NAMES, |
58
|
63 |
|
TagHeader::META_SOAP_HEADER_NAMESPACES, |
59
|
63 |
|
TagHeader::META_SOAP_HEADER_TYPES, |
60
|
63 |
|
TagHeader::META_SOAP_HEADERS, |
61
|
63 |
|
)); |
62
|
84 |
|
return $this; |
63
|
|
|
} |
64
|
|
|
/** |
65
|
|
|
* @param array $soapHeaderTypes |
66
|
|
|
* @return string[] |
67
|
|
|
*/ |
68
|
20 |
|
protected function getSoapHeaderTypesTypes(array $soapHeaderTypes) |
69
|
|
|
{ |
70
|
20 |
|
$soapHeaderTypesTypes = array(); |
71
|
20 |
|
foreach ($soapHeaderTypes as $soapHeaderType) { |
72
|
20 |
|
$soapHeaderTypesTypes[] = $this->getSoapHeaderTypeType($soapHeaderType, true); |
73
|
15 |
|
} |
74
|
20 |
|
return $soapHeaderTypesTypes; |
75
|
|
|
} |
76
|
|
|
/** |
77
|
|
|
* @param string $soapHeaderType |
78
|
|
|
* @param bool $namespaced |
79
|
|
|
* @return string |
80
|
|
|
*/ |
81
|
20 |
|
protected function getSoapHeaderTypeType($soapHeaderType, $namespaced = false) |
82
|
|
|
{ |
83
|
20 |
|
$type = $soapHeaderType; |
84
|
20 |
|
$model = $this->getModelByName($soapHeaderType); |
85
|
20 |
|
if ($model instanceof AbstractModel) { |
86
|
20 |
|
$type = $model->getPackagedName($namespaced); |
87
|
15 |
|
} |
88
|
20 |
|
return $type; |
89
|
|
|
} |
90
|
|
|
/** |
91
|
|
|
* @param PhpAnnotationBlock $annotationBlock |
92
|
|
|
* @return OperationAnnotationBlock |
93
|
|
|
*/ |
94
|
84 |
|
protected function addOperationMethodUses(PhpAnnotationBlock $annotationBlock) |
95
|
|
|
{ |
96
|
84 |
|
$annotationBlock->addChild(new PhpAnnotation(AbstractModelFile::ANNOTATION_USES, sprintf('%s::getSoapClient()', $this->getMethod()->getOwner()->getExtends(true)))) |
97
|
84 |
|
->addChild(new PhpAnnotation(AbstractModelFile::ANNOTATION_USES, sprintf('%s::setResult()', $this->getMethod()->getOwner()->getExtends(true)))) |
98
|
84 |
|
->addChild(new PhpAnnotation(AbstractModelFile::ANNOTATION_USES, sprintf('%s::getResult()', $this->getMethod()->getOwner()->getExtends(true)))) |
99
|
84 |
|
->addChild(new PhpAnnotation(AbstractModelFile::ANNOTATION_USES, sprintf('%s::saveLastError()', $this->getMethod()->getOwner()->getExtends(true)))); |
100
|
84 |
|
return $this; |
101
|
|
|
} |
102
|
|
|
/** |
103
|
|
|
* @param PhpAnnotationBlock $annotationBlock |
104
|
|
|
* @return OperationAnnotationBlock |
105
|
|
|
*/ |
106
|
84 |
|
protected function addOperationMethodParam(PhpAnnotationBlock $annotationBlock) |
107
|
|
|
{ |
108
|
84 |
|
$this->addOperationMethodParamFromArray($annotationBlock)->addOperationMethodParamFromModel($annotationBlock)->addOperationMethodParamFromString($annotationBlock); |
109
|
84 |
|
return $this; |
110
|
|
|
} |
111
|
|
|
/** |
112
|
|
|
* @param PhpAnnotationBlock $annotationBlock |
113
|
|
|
* @return OperationAnnotationBlock |
114
|
|
|
*/ |
115
|
84 |
|
protected function addOperationMethodParamFromArray(PhpAnnotationBlock $annotationBlock) |
116
|
|
|
{ |
117
|
84 |
|
if ($this->isParameterTypeAnArray()) { |
118
|
76 |
|
foreach ($this->getParameterTypeArrayTypes() as $parameterName => $parameterType) { |
119
|
76 |
|
$annotationBlock->addChild($this->getOperationMethodParam($parameterType, $this->getParameterName($parameterName))); |
120
|
57 |
|
} |
121
|
57 |
|
} |
122
|
84 |
|
return $this; |
123
|
|
|
} |
124
|
|
|
/** |
125
|
|
|
* @param PhpAnnotationBlock $annotationBlock |
126
|
|
|
* @return OperationAnnotationBlock |
127
|
|
|
*/ |
128
|
84 |
|
protected function addOperationMethodParamFromModel(PhpAnnotationBlock $annotationBlock) |
129
|
|
|
{ |
130
|
84 |
|
if ($this->isParameterTypeAModel()) { |
131
|
4 |
|
$annotationBlock->addChild($this->getOperationMethodParam($this->getParameterTypeModel()->getPackagedName(true), $this->getParameterName($this->getParameterTypeModel()->getPackagedName()))); |
132
|
3 |
|
} |
133
|
84 |
|
return $this; |
134
|
|
|
} |
135
|
|
|
/** |
136
|
|
|
* @param string $type |
137
|
|
|
* @param string $name |
138
|
|
|
* @return PhpAnnotation |
139
|
|
|
*/ |
140
|
84 |
|
protected function getOperationMethodParam($type, $name) |
141
|
|
|
{ |
142
|
84 |
|
return new PhpAnnotation(AbstractModelFile::ANNOTATION_PARAM, sprintf('%s $%s', $type, $name)); |
143
|
|
|
} |
144
|
|
|
/** |
145
|
|
|
* @param PhpAnnotationBlock $annotationBlock |
146
|
|
|
* @return OperationAnnotationBlock |
147
|
|
|
*/ |
148
|
84 |
|
protected function addOperationMethodParamFromString(PhpAnnotationBlock $annotationBlock) |
149
|
|
|
{ |
150
|
84 |
|
if ($this->isParameterTypeAString() && !$this->isParameterTypeAModel()) { |
151
|
4 |
|
$annotationBlock->addChild($this->getOperationMethodParam($this->getMethod()->getParameterType(), lcfirst($this->getMethod()->getParameterType()))); |
|
|
|
|
152
|
3 |
|
} |
153
|
84 |
|
return $this; |
154
|
|
|
} |
155
|
|
|
/** |
156
|
|
|
* @param PhpAnnotationBlock $annotationBlock |
157
|
|
|
* @return OperationAnnotationBlock |
158
|
|
|
*/ |
159
|
84 |
|
protected function addOperationMethodReturn(PhpAnnotationBlock $annotationBlock) |
160
|
|
|
{ |
161
|
84 |
|
$annotationBlock->addChild(new PhpAnnotation(AbstractModelFile::ANNOTATION_RETURN, sprintf('%s|bool', $this->getOperationMethodReturnType($this->getMethod())))); |
162
|
84 |
|
return $this; |
163
|
|
|
} |
164
|
|
|
/** |
165
|
|
|
* @param MethodModel $method |
166
|
|
|
* @return string |
167
|
|
|
*/ |
168
|
84 |
|
protected function getOperationMethodReturnType(MethodModel $method) |
169
|
|
|
{ |
170
|
84 |
|
return Service::getOperationMethodReturnType($method, $this->getGenerator()); |
171
|
|
|
} |
172
|
|
|
} |
173
|
|
|
|
This check looks at variables that are passed out again to other methods.
If the outgoing method call has stricter type requirements than the method itself, an issue is raised.
An additional type check may prevent trouble.