Completed
Push — develop ( acf457...a68de9 )
by Mikaël
63:26 queued 35:59
created

addOperationMethodMetaInformation()   A

Complexity

Conditions 4
Paths 2

Size

Total Lines 20
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 19
CRAP Score 4

Importance

Changes 0
Metric Value
cc 4
eloc 16
nc 2
nop 1
dl 0
loc 20
ccs 19
cts 19
cp 1
crap 4
rs 9.7333
c 0
b 0
f 0
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 138
    public function addAnnotationBlockForOperationMethod(PhpAnnotationBlock $annotationBlock)
19
    {
20 138
        $this->addOperationMethodDeclaration($annotationBlock)
21 138
            ->addOperationMethodMetaInformation($annotationBlock)
22 138
            ->addOperationMethodUses($annotationBlock)
23 138
            ->addOperationMethodParam($annotationBlock)
24 138
            ->addOperationMethodReturn($annotationBlock);
25 138
        return $this;
26
    }
27
    /**
28
     * @param PhpAnnotationBlock $annotationBlock
29
     * @return OperationAnnotationBlock
30
     */
31 138
    protected function addOperationMethodDeclaration(PhpAnnotationBlock $annotationBlock)
32
    {
33 138
        $annotationBlock->addChild(sprintf('Method to call the operation originally named %s', $this->getMethod()->getName()));
34 138
        if (!$this->getMethod()->isUnique()) {
35
            $annotationBlock->addChild('This method has been renamed because it is defined several times but with different signature');
36
        }
37 138
        return $this;
38
    }
39
    /**
40
     * @param PhpAnnotationBlock $annotationBlock
41
     * @return OperationAnnotationBlock
42
     */
43 138
    protected function addOperationMethodMetaInformation(PhpAnnotationBlock $annotationBlock)
44
    {
45 138
        $soapHeaderNames = $this->getMethod()->getMetaValue(TagHeader::META_SOAP_HEADER_NAMES, []);
46 138
        $soapHeaderTypes = $this->getMethod()->getMetaValue(TagHeader::META_SOAP_HEADER_TYPES, []);
47 138
        $soapHeaderNamespaces = $this->getMethod()->getMetaValue(TagHeader::META_SOAP_HEADER_NAMESPACES, []);
48 138
        $soapHeaders = $this->getMethod()->getMetaValue(TagHeader::META_SOAP_HEADERS, []);
49 138
        if (!empty($soapHeaderNames) && !empty($soapHeaderTypes) && !empty($soapHeaderNamespaces)) {
50 36
            $annotationBlock->addChild('Meta information extracted from the WSDL')
51 36
                ->addChild(new PhpAnnotation(PhpAnnotation::NO_NAME, sprintf('- SOAPHeaderNames: %s', implode(', ', $soapHeaderNames)), AbstractModelFile::ANNOTATION_LONG_LENGTH))
0 ignored issues
show
Bug introduced by
It seems like $soapHeaderNames can also be of type string; however, parameter $pieces of implode() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

51
                ->addChild(new PhpAnnotation(PhpAnnotation::NO_NAME, sprintf('- SOAPHeaderNames: %s', implode(', ', /** @scrutinizer ignore-type */ $soapHeaderNames)), AbstractModelFile::ANNOTATION_LONG_LENGTH))
Loading history...
52 36
                ->addChild(new PhpAnnotation(PhpAnnotation::NO_NAME, sprintf('- SOAPHeaderNamespaces: %s', implode(', ', $soapHeaderNamespaces)), AbstractModelFile::ANNOTATION_LONG_LENGTH))
53 36
                ->addChild(new PhpAnnotation(PhpAnnotation::NO_NAME, sprintf('- SOAPHeaderTypes: %s', implode(', ', $this->getSoapHeaderTypesTypes($soapHeaderTypes))), AbstractModelFile::ANNOTATION_LONG_LENGTH))
0 ignored issues
show
Bug introduced by
It seems like $soapHeaderTypes can also be of type string; however, parameter $soapHeaderTypes of WsdlToPhp\PackageGenerat...tSoapHeaderTypesTypes() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

53
                ->addChild(new PhpAnnotation(PhpAnnotation::NO_NAME, sprintf('- SOAPHeaderTypes: %s', implode(', ', $this->getSoapHeaderTypesTypes(/** @scrutinizer ignore-type */ $soapHeaderTypes))), AbstractModelFile::ANNOTATION_LONG_LENGTH))
Loading history...
54 36
                ->addChild(new PhpAnnotation(PhpAnnotation::NO_NAME, sprintf('- SOAPHeaders: %s', implode(', ', $soapHeaders)), AbstractModelFile::ANNOTATION_LONG_LENGTH));
55 18
        }
56 138
        FileUtils::defineModelAnnotationsFromWsdl($annotationBlock, $this->getMethod(), [
57 138
            TagHeader::META_SOAP_HEADER_NAMES,
58 69
            TagHeader::META_SOAP_HEADER_NAMESPACES,
59 69
            TagHeader::META_SOAP_HEADER_TYPES,
60 69
            TagHeader::META_SOAP_HEADERS,
61 69
        ]);
62 138
        return $this;
63
    }
64
    /**
65
     * @param array $soapHeaderTypes
66
     * @return string[]
67
     */
68 36
    protected function getSoapHeaderTypesTypes(array $soapHeaderTypes)
69
    {
70 36
        $soapHeaderTypesTypes = [];
71 36
        foreach ($soapHeaderTypes as $soapHeaderType) {
72 36
            $soapHeaderTypesTypes[] = $this->getSoapHeaderTypeType($soapHeaderType, true);
73 18
        }
74 36
        return $soapHeaderTypesTypes;
75
    }
76
    /**
77
     * @param string $soapHeaderType
78
     * @param bool $namespaced
79
     * @return string
80
     */
81 36
    protected function getSoapHeaderTypeType($soapHeaderType, $namespaced = false)
82
    {
83 36
        $type = $soapHeaderType;
84 36
        $model = $this->getModelByName($soapHeaderType);
85 36
        if ($model instanceof AbstractModel) {
86 36
            $type = $model->getPackagedName($namespaced);
87 18
        }
88 36
        return $type;
89
    }
90
    /**
91
     * @param PhpAnnotationBlock $annotationBlock
92
     * @return OperationAnnotationBlock
93
     */
94 138
    protected function addOperationMethodUses(PhpAnnotationBlock $annotationBlock)
95
    {
96 138
        $annotationBlock->addChild(new PhpAnnotation(AbstractModelFile::ANNOTATION_USES, sprintf('%s::getSoapClient()', $this->getMethod()->getOwner()->getExtends(true))))
97 138
            ->addChild(new PhpAnnotation(AbstractModelFile::ANNOTATION_USES, sprintf('%s::setResult()', $this->getMethod()->getOwner()->getExtends(true))))
98 138
            ->addChild(new PhpAnnotation(AbstractModelFile::ANNOTATION_USES, sprintf('%s::getResult()', $this->getMethod()->getOwner()->getExtends(true))))
99 138
            ->addChild(new PhpAnnotation(AbstractModelFile::ANNOTATION_USES, sprintf('%s::saveLastError()', $this->getMethod()->getOwner()->getExtends(true))));
100 138
        return $this;
101
    }
102
    /**
103
     * @param PhpAnnotationBlock $annotationBlock
104
     * @return OperationAnnotationBlock
105
     */
106 138
    protected function addOperationMethodParam(PhpAnnotationBlock $annotationBlock)
107
    {
108 138
        $this->addOperationMethodParamFromArray($annotationBlock)->addOperationMethodParamFromModel($annotationBlock)->addOperationMethodParamFromString($annotationBlock);
109 138
        return $this;
110
    }
111
    /**
112
     * @param PhpAnnotationBlock $annotationBlock
113
     * @return OperationAnnotationBlock
114
     */
115 138
    protected function addOperationMethodParamFromArray(PhpAnnotationBlock $annotationBlock)
116
    {
117 138
        if ($this->isParameterTypeAnArray()) {
118 126
            foreach ($this->getParameterTypeArrayTypes() as $parameterName => $parameterType) {
119 126
                $annotationBlock->addChild($this->getOperationMethodParam($parameterType, $this->getParameterName($parameterName)));
120 63
            }
121 63
        }
122 138
        return $this;
123
    }
124
    /**
125
     * @param PhpAnnotationBlock $annotationBlock
126
     * @return OperationAnnotationBlock
127
     */
128 138
    protected function addOperationMethodParamFromModel(PhpAnnotationBlock $annotationBlock)
129
    {
130 138
        if ($this->isParameterTypeAModel()) {
131 6
            $annotationBlock->addChild($this->getOperationMethodParam($this->getParameterTypeModel()->getPackagedName(true), $this->getParameterName($this->getParameterTypeModel()->getPackagedName())));
132 3
        }
133 138
        return $this;
134
    }
135
    /**
136
     * @param string $type
137
     * @param string $name
138
     * @return PhpAnnotation
139
     */
140 138
    protected function getOperationMethodParam($type, $name)
141
    {
142 138
        return new PhpAnnotation(AbstractModelFile::ANNOTATION_PARAM, sprintf('%s $%s', $type, $name));
143
    }
144
    /**
145
     * @param PhpAnnotationBlock $annotationBlock
146
     * @return OperationAnnotationBlock
147
     */
148 138
    protected function addOperationMethodParamFromString(PhpAnnotationBlock $annotationBlock)
149
    {
150 138
        if ($this->isParameterTypeAString() && !$this->isParameterTypeAModel()) {
151 6
            $annotationBlock->addChild($this->getOperationMethodParam($this->getMethod()->getParameterType(), lcfirst($this->getMethod()->getParameterType())));
152 3
        }
153 138
        return $this;
154
    }
155
    /**
156
     * @param PhpAnnotationBlock $annotationBlock
157
     * @return OperationAnnotationBlock
158
     */
159 138
    protected function addOperationMethodReturn(PhpAnnotationBlock $annotationBlock)
160
    {
161 138
        $annotationBlock->addChild(new PhpAnnotation(AbstractModelFile::ANNOTATION_RETURN, sprintf('%s|bool', $this->getOperationMethodReturnType($this->getMethod()))));
162 138
        return $this;
163
    }
164
    /**
165
     * @param MethodModel $method
166
     * @return string
167
     */
168 138
    protected function getOperationMethodReturnType(MethodModel $method)
169
    {
170 138
        return Service::getOperationMethodReturnType($method, $this->getGenerator());
171
    }
172
}
173