Completed
Push — release/3.0.0 ( f549c4...0d47aa )
by Mikaël
114:39 queued 110:45
created

Utils::getPart()   C

Complexity

Conditions 12
Paths 9

Size

Total Lines 46
Code Lines 36

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 40
CRAP Score 12

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 46
ccs 40
cts 40
cp 1
rs 5.15
cc 12
eloc 36
nc 9
nop 2
crap 12

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace WsdlToPhp\PackageGenerator\Generator;
4
5
use WsdlToPhp\PackageGenerator\ConfigurationReader\GeneratorOptions;
6
7
class Utils
8
{
9
    /**
10
     * Gets upper case word among a string from the end or from the beginning part
11
     * @param string $optionValue
12
     * @param string $string the string from which we can extract the part
13
     * @return string
14
     */
15 395
    public static function getPart($optionValue, $string)
16
    {
17 395
        $elementType = '';
18 395
        $string = str_replace('_', '', $string);
19 395
        $string = preg_replace('/([0-9])/', '', $string);
20 395
        if (!empty($string)) {
21 79
            switch ($optionValue) {
22 316
                case GeneratorOptions::VALUE_END:
23 25
                    $parts = preg_split('/[A-Z]/', ucfirst($string));
24 25
                    $partsCount = count($parts);
25 25
                    if (!empty($parts[$partsCount - 1])) {
26 20
                        $elementType = substr($string, strrpos($string, implode('', array_slice($parts, -1))) - 1);
27 12
                    } else {
28 10
                        for ($i = $partsCount - 1; $i >= 0; $i--) {
29 10
                            $part = trim($parts[$i]);
30 10
                            if (!empty($part)) {
31 5
                                break;
32
                            }
33 6
                        }
34 10
                        $elementType = substr($string, ((count($parts) - 2 - $i) + 1) * -1);
35
                    }
36 25
                    break;
37 296
                case GeneratorOptions::VALUE_START:
38 345
                    $parts = preg_split('/[A-Z]/', ucfirst($string));
39 345
                    $partsCount = count($parts);
40 345
                    if (empty($parts[0]) && !empty($parts[1])) {
41 345
                        $elementType = substr($string, 0, strlen($parts[1]) + 1);
42 207
                    } else {
43 15
                        for ($i = 0; $i < $partsCount; $i++) {
44 15
                            $part = trim($parts[$i]);
45 15
                            if (!empty($part)) {
46 15
                                break;
47
                            }
48 9
                        }
49 15
                        $elementType = substr($string, 0, $i);
50
                    }
51 345
                    break;
52 20
                case GeneratorOptions::VALUE_NONE:
53 20
                    $elementType = $string;
54 20
                    break;
55 3
                default:
56 5
                    break;
57 3
            }
58 237
        }
59 395
        return $elementType;
60
    }
61
    /**
62
     * Get content from url using a proxy or not
63
     * @param string $url
64
     * @param string $basicAuthLogin
65
     * @param string $basicAuthPassword
66
     * @param string $proxyHost
67
     * @param string $proxyPort
68
     * @param string $proxyLogin
69
     * @param string $proxyPassword
70
     * @param array $contextOptions
71
     * @return string
72
     */
73 3
    public static function getContentFromUrl($url, $basicAuthLogin = null, $basicAuthPassword = null, $proxyHost = null, $proxyPort = null, $proxyLogin = null, $proxyPassword = null, array $contextOptions = [])
74
    {
75 3
        $context = null;
76 3
        $options = self::getStreamContextOptions($basicAuthLogin, $basicAuthPassword, $proxyHost, $proxyPort, $proxyLogin, $proxyPassword, $contextOptions);
77 3
        if (!empty($options)) {
78
            $context = stream_context_create($options);
79
        }
80 3
        return file_get_contents($url, false, $context);
81
    }
82
    /**
83
     * @param string $basicAuthLogin
84
     * @param string $basicAuthPassword
85
     * @param string $proxyHost
86
     * @param string $proxyPort
87
     * @param string $proxyLogin
88
     * @param string $proxyPassword
89
     * @param array $contextOptions
90
     * @return string[]
91
     */
92 23
    public static function getStreamContextOptions($basicAuthLogin = null, $basicAuthPassword = null, $proxyHost = null, $proxyPort = null, $proxyLogin = null, $proxyPassword = null, array $contextOptions = [])
93
    {
94 23
        $proxyOptions = $basicAuthOptions = [];
95 23
        if (!empty($basicAuthLogin) && !empty($basicAuthPassword)) {
96
            $basicAuthOptions = [
97
                'http' => [
98
                    'header' => [
99 15
                        sprintf('Authorization: Basic %s', base64_encode(sprintf('%s:%s', $basicAuthLogin, $basicAuthPassword))),
100 9
                    ],
101 9
                ],
102 9
            ];
103 9
        }
104 23
        if (!empty($proxyHost)) {
105
            $proxyOptions = [
106
                'http' => [
107 15
                    'proxy' => sprintf('tcp://%s%s', $proxyHost, empty($proxyPort) ? '' : sprintf(':%s', $proxyPort)),
108
                    'header' => [
109 15
                        sprintf('Proxy-Authorization: Basic %s', base64_encode(sprintf('%s:%s', $proxyLogin, $proxyPassword))),
110 9
                    ],
111 9
                ],
112 9
            ];
113 9
        }
114 23
        return array_merge_recursive($contextOptions, $proxyOptions, $basicAuthOptions);
115
    }
116
    /**
117
     * Returns the value with good type
118
     * @param mixed $value the value
119
     * @param string $knownType the value
120
     * @return mixed
121
     */
122 170
    public static function getValueWithinItsType($value, $knownType = null)
123
    {
124 170
        if (is_int($value) || (!is_null($value) && in_array($knownType, [
125 80
            'time',
126 48
            'positiveInteger',
127 48
            'unsignedLong',
128 48
            'unsignedInt',
129 48
            'short',
130 48
            'long',
131 48
            'int',
132 48
            'integer',
133 170
        ], true))) {
134 15
            return intval($value);
135 170
        } elseif (is_float($value) || (!is_null($value) && in_array($knownType, [
136 80
            'float',
137 48
            'double',
138 48
            'decimal',
139 170
        ], true))) {
140 5
            return floatval($value);
141 170
        } elseif (is_bool($value) || (!is_null($value) && in_array($knownType, [
142 80
            'bool',
143 48
            'boolean',
144 170
        ], true))) {
145 5
            return ($value === 'true' || $value === true || $value === 1 || $value === '1');
146
        }
147 170
        return $value;
148
    }
149
    /**
150
     * @param string $origin
151
     * @param string $destination
152
     * @return string
153
     */
154 160
    public static function resolveCompletePath($origin, $destination)
155
    {
156 160
        $resolvedPath = $destination;
157 160
        if (!empty($destination) && strpos($destination, 'http://') === false && strpos($destination, 'https://') === false && !empty($origin)) {
158 160
            if (substr($destination, 0, 2) === './') {
159 10
                $destination = substr($destination, 2);
160 6
            }
161 160
            $destinationParts = explode('/', $destination);
162 160
            $fileParts = pathinfo($origin);
163 160
            $fileBasename = (is_array($fileParts) && array_key_exists('basename', $fileParts)) ? $fileParts['basename'] : '';
164 160
            $parts = parse_url(str_replace('/' . $fileBasename, '', $origin));
165 160
            $scheme = (is_array($parts) && array_key_exists('scheme', $parts)) ? $parts['scheme'] : '';
166 160
            $host = (is_array($parts) && array_key_exists('host', $parts)) ? $parts['host'] : '';
167 160
            $path = (is_array($parts) && array_key_exists('path', $parts)) ? $parts['path'] : '';
168 160
            $path = str_replace('/' . $fileBasename, '', $path);
169 160
            $pathParts = explode('/', $path);
170 160
            $finalPath = implode('/', $pathParts);
171 160
            foreach ($destinationParts as $locationPart) {
172 160
                if ($locationPart == '..') {
173 10
                    $finalPath = substr($finalPath, 0, strrpos($finalPath, '/', 0));
174 6
                } else {
175 160
                    $finalPath .= '/' . $locationPart;
176
                }
177 96
            }
178 160
            $port = (is_array($parts) && array_key_exists('port', $parts)) ? $parts['port'] : '';
179
            /**
180
             * Remote file
181
             */
182 160
            if (!empty($scheme) && !empty($host)) {
183 5
                $resolvedPath = str_replace('urn', 'http', $scheme) . '://' . $host . (!empty($port) ? ':' . $port : '') . str_replace('//', '/', $finalPath);
184 158
            } elseif (empty($scheme) && empty($host) && count($pathParts)) {
185
                /**
186
                 * Local file
187
                 */
188 155
                if (is_file($finalPath)) {
189 155
                    $resolvedPath = $finalPath;
190 93
                }
191 93
            }
192 96
        }
193 160
        return $resolvedPath;
194
    }
195
    /**
196
     * Clean comment
197
     * @param string $comment the comment to clean
198
     * @param string $glueSeparator ths string to use when gathering values
199
     * @param bool $uniqueValues indicates if comment values must be unique or not
200
     * @return string
201
     */
202 200
    public static function cleanComment($comment, $glueSeparator = ',', $uniqueValues = true)
203
    {
204 200
        if (!is_scalar($comment) && !is_array($comment)) {
205 5
            return '';
206
        }
207 195
        return trim(str_replace('*/', '*[:slash:]', is_scalar($comment) ? $comment : implode($glueSeparator, $uniqueValues ? array_unique($comment) : $comment)));
208
    }
209
    /**
210
     * Clean a string to make it valid as PHP variable
211
     * See more about the used regular expression at {@link http://www.regular-expressions.info/unicode.html}:
212
     * - \p{L} for any valid letter
213
     * - \p{N} for any valid number
214
     * - /u for supporting unicode
215
     * @param string $string the string to clean
216
     * @param bool $keepMultipleUnderscores optional, allows to keep the multiple consecutive underscores
217
     * @return string
218
     */
219 790
    public static function cleanString($string, $keepMultipleUnderscores = true)
220
    {
221 790
        $cleanedString = preg_replace('/[^\p{L}\p{N}_]/u', '_', $string);
222 790
        if (!$keepMultipleUnderscores) {
223 140
            $cleanedString = preg_replace('/[_]+/', '_', $cleanedString);
224 84
        }
225 790
        return $cleanedString;
226
    }
227
    /**
228
     * @param string $namespacedClassName
229
     * @return string
230
     */
231 280
    public static function removeNamespace($namespacedClassName)
232
    {
233 280
        $elements = explode('\\', $namespacedClassName);
234 280
        return (string) array_pop($elements);
235
    }
236
    /**
237
     * @param string $directory
238
     * @param int $permissions
239
     * @return bool
240
     */
241 318
    public static function createDirectory($directory, $permissions = 0775)
242
    {
243 318
        if (!is_dir($directory)) {
244 43
            mkdir($directory, $permissions, true);
245 27
        }
246 318
        return true;
247
    }
248
    /**
249
     * Save schemas to schemasFolder
250
     * Filename will be extracted from schemasUrl or default schema.wsdl will be used
251
     * @param string $destinationFolder
252
     * @param string $schemasFolder
253
     * @param string $schemasUrl
254
     * @param string $content
255
     * @return string
256
     */
257 8
    public static function saveSchemas($destinationFolder, $schemasFolder, $schemasUrl, $content)
258
    {
259 8
        if (($schemasFolder === null) || empty($schemasFolder)) {
260
            // if null or empty schemas folder was provided
261
            // default schemas folder will be wsdl
262 5
            $schemasFolder = 'wsdl';
263 3
        }
264 8
        $schemasPath = rtrim($destinationFolder, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . rtrim($schemasFolder, DIRECTORY_SEPARATOR);
265
        // Here we must cover all possible variants
266 8
        if ((strpos(strtolower($schemasUrl), '.wsdl') !== false) || (strpos(strtolower($schemasUrl), '.xsd') !== false) || (strpos(strtolower($schemasUrl), '.xml') !== false)) {
267 8
            $filename = basename($schemasUrl);
268 6
        } else {
269
            // if $url is like http://example.com/index.php?WSDL default filename will be schema.wsdl
270 5
            $filename = 'schema.wsdl';
271
        }
272 8
        self::createDirectory($schemasPath);
273 8
        file_put_contents($schemasPath . DIRECTORY_SEPARATOR . $filename, $content);
274 8
        return $schemasPath . DIRECTORY_SEPARATOR . $filename;
275
    }
276
}
277