Completed
Push — develop ( d8a7e0...b191c3 )
by Mikaël
31:58
created

OperationAnnotationBlock   A

Complexity

Total Complexity 24

Size/Duplication

Total Lines 161
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 8

Test Coverage

Coverage 97.44%

Importance

Changes 0
Metric Value
wmc 24
lcom 1
cbo 8
dl 0
loc 161
ccs 76
cts 78
cp 0.9744
rs 10
c 0
b 0
f 0

13 Methods

Rating   Name   Duplication   Size   Complexity  
A addAnnotationBlockForOperationMethod() 0 9 1
A addOperationMethodDeclaration() 0 8 2
A addOperationMethodMetaInformations() 0 21 4
A getSoapHeaderTypesTypes() 0 8 2
A getSoapHeaderTypeType() 0 9 2
A addOperationMethodUses() 0 8 1
A addOperationMethodParam() 0 5 1
A addOperationMethodParamFromArray() 0 9 3
A addOperationMethodParamFromModel() 0 7 2
A getOperationMethodParam() 0 4 1
A addOperationMethodParamFromString() 0 7 3
A addOperationMethodReturn() 0 5 1
A getOperationMethodReturnType() 0 4 1
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())));
0 ignored issues
show
Bug introduced by
It seems like $this->getMethod()->getParameterType() targeting WsdlToPhp\PackageGenerat...hod::getParameterType() can also be of type array<integer,string>; however, WsdlToPhp\PackageGenerat...tOperationMethodParam() does only seem to accept string, maybe add an additional type check?

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.

Loading history...
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