Passed
Push — feature/issue-246 ( 79981d )
by Mikaël
14:50
created

Utils::cleanString()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 2
dl 0
loc 7
ccs 5
cts 5
cp 1
crap 2
rs 10
c 0
b 0
f 0
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 172
    public static function getPart($optionValue, $string)
16
    {
17 172
        $elementType = '';
18 172
        $string = str_replace('_', '', $string);
19 172
        $string = preg_replace('/([0-9])/', '', $string);
20 172
        if (!empty($string)) {
21
            switch ($optionValue) {
22 172
                case GeneratorOptions::VALUE_END:
23 10
                    $parts = preg_split('/[A-Z]/', ucfirst($string));
24 10
                    $partsCount = count($parts);
25 10
                    if (!empty($parts[$partsCount - 1])) {
26 8
                        $elementType = mb_substr($string, mb_strrpos($string, implode('', array_slice($parts, -1))) - 1);
27
                    } else {
28 2
                        for ($i = $partsCount - 1; $i >= 0; $i--) {
29 2
                            $part = trim($parts[$i]);
30 2
                            if (!empty($part)) {
31
                                break;
32
                            }
33
                        }
34 2
                        $elementType = mb_substr($string, ((count($parts) - 2 - $i) + 1) * -1);
35
                    }
36 10
                    break;
37 162
                case GeneratorOptions::VALUE_START:
38 152
                    $parts = preg_split('/[A-Z]/', ucfirst($string));
39 152
                    $partsCount = count($parts);
40 152
                    if (empty($parts[0]) && !empty($parts[1])) {
41 152
                        $elementType = mb_substr($string, 0, mb_strlen($parts[1]) + 1);
42
                    } else {
43 6
                        for ($i = 0; $i < $partsCount; $i++) {
44 6
                            $part = trim($parts[$i]);
45 6
                            if (!empty($part)) {
46 6
                                break;
47
                            }
48
                        }
49 6
                        $elementType = mb_substr($string, 0, $i);
50
                    }
51 152
                    break;
52 10
                case GeneratorOptions::VALUE_NONE:
53 8
                    $elementType = $string;
54 8
                    break;
55
                default:
56 2
                    break;
57
            }
58
        }
59 172
        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 4
    public static function getContentFromUrl($url, $basicAuthLogin = null, $basicAuthPassword = null, $proxyHost = null, $proxyPort = null, $proxyLogin = null, $proxyPassword = null, array $contextOptions = [])
74
    {
75 4
        $context = null;
76 4
        $options = self::getStreamContextOptions($basicAuthLogin, $basicAuthPassword, $proxyHost, $proxyPort, $proxyLogin, $proxyPassword, $contextOptions);
77 4
        if (!empty($options)) {
78 4
            $context = stream_context_create($options);
79
        }
80 4
        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 12
    public static function getStreamContextOptions($basicAuthLogin = null, $basicAuthPassword = null, $proxyHost = null, $proxyPort = null, $proxyLogin = null, $proxyPassword = null, array $contextOptions = [])
93
    {
94 12
        $proxyOptions = $basicAuthOptions = [];
95 12
        if (!empty($basicAuthLogin) && !empty($basicAuthPassword)) {
96
            $basicAuthOptions = [
97
                'http' => [
98
                    'header' => [
99 6
                        sprintf('Authorization: Basic %s', base64_encode(sprintf('%s:%s', $basicAuthLogin, $basicAuthPassword))),
100
                    ],
101
                ],
102
            ];
103
        }
104 12
        if (!empty($proxyHost)) {
105
            $proxyOptions = [
106
                'http' => [
107 6
                    'proxy' => sprintf('tcp://%s%s', $proxyHost, empty($proxyPort) ? '' : sprintf(':%s', $proxyPort)),
108
                    'header' => [
109 6
                        sprintf('Proxy-Authorization: Basic %s', base64_encode(sprintf('%s:%s', $proxyLogin, $proxyPassword))),
110
                    ],
111
                ],
112
            ];
113
        }
114 12
        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 104
    public static function getValueWithinItsType($value, $knownType = null)
123
    {
124 104
        if (is_int($value) || (!is_null($value) && in_array($knownType, [
125 52
            'time',
126
            'positiveInteger',
127
            'unsignedLong',
128
            'unsignedInt',
129
            'short',
130
            'long',
131
            'int',
132
            'integer',
133 104
        ], true))) {
134 6
            return intval($value);
135 104
        } elseif (is_float($value) || (!is_null($value) && in_array($knownType, [
136 52
            'float',
137
            'double',
138
            'decimal',
139 104
        ], true))) {
140 2
            return floatval($value);
141 104
        } elseif (is_bool($value) || (!is_null($value) && in_array($knownType, [
142 52
            'bool',
143
            'boolean',
144 104
        ], true))) {
145 6
            return ($value === 'true' || $value === true || $value === 1 || $value === '1');
146
        }
147 100
        return $value;
148
    }
149
    /**
150
     * @param string $origin
151
     * @param string $destination
152
     * @return string
153
     */
154 70
    public static function resolveCompletePath($origin, $destination)
155
    {
156 70
        $resolvedPath = $destination;
157 70
        if (!empty($destination) && mb_strpos($destination, 'http://') === false && mb_strpos($destination, 'https://') === false && !empty($origin)) {
158 70
            if (mb_substr($destination, 0, 2) === './') {
159 4
                $destination = mb_substr($destination, 2);
160
            }
161 70
            $destinationParts = explode('/', $destination);
162 70
            $fileParts = pathinfo($origin);
163 70
            $fileBasename = (is_array($fileParts) && array_key_exists('basename', $fileParts)) ? $fileParts['basename'] : '';
164 70
            $parts = parse_url(str_replace('/' . $fileBasename, '', $origin));
165 70
            $scheme = (is_array($parts) && array_key_exists('scheme', $parts)) ? $parts['scheme'] : '';
166 70
            $host = (is_array($parts) && array_key_exists('host', $parts)) ? $parts['host'] : '';
167 70
            $path = (is_array($parts) && array_key_exists('path', $parts)) ? $parts['path'] : '';
168 70
            $path = str_replace('/' . $fileBasename, '', $path);
169 70
            $pathParts = explode('/', $path);
170 70
            $finalPath = implode('/', $pathParts);
171 70
            foreach ($destinationParts as $locationPart) {
172 70
                if ($locationPart == '..') {
173 4
                    $finalPath = mb_substr($finalPath, 0, mb_strrpos($finalPath, '/', 0));
174
                } else {
175 70
                    $finalPath .= '/' . $locationPart;
176
                }
177
            }
178 70
            $port = (is_array($parts) && array_key_exists('port', $parts)) ? $parts['port'] : '';
179
            /**
180
             * Remote file
181
             */
182 70
            if (!empty($scheme) && !empty($host)) {
183 2
                $resolvedPath = str_replace('urn', 'http', $scheme) . '://' . $host . (!empty($port) ? ':' . $port : '') . str_replace('//', '/', $finalPath);
184 68
            } elseif (empty($scheme) && empty($host) && count($pathParts)) {
185
                /**
186
                 * Local file
187
                 */
188 68
                if (is_file($finalPath)) {
189 68
                    $resolvedPath = $finalPath;
190
                }
191
            }
192
        }
193 70
        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 118
    public static function cleanComment($comment, $glueSeparator = ',', $uniqueValues = true)
203
    {
204 118
        if (!is_scalar($comment) && !is_array($comment)) {
0 ignored issues
show
introduced by
The condition is_scalar($comment) is always true.
Loading history...
205 2
            return '';
206
        }
207 116
        return trim(str_replace('*/', '*[:slash:]', is_scalar($comment) ? $comment : implode($glueSeparator, $uniqueValues ? array_unique($comment) : $comment)));
0 ignored issues
show
introduced by
The condition is_scalar($comment) is always true.
Loading history...
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 406
    public static function cleanString($string, $keepMultipleUnderscores = true)
220
    {
221 406
        $cleanedString = preg_replace('/[^\p{L}\p{N}_]/u', '_', $string);
222 406
        if (!$keepMultipleUnderscores) {
223 82
            $cleanedString = preg_replace('/[_]+/', '_', $cleanedString);
224
        }
225 406
        return $cleanedString;
226
    }
227
    /**
228
     * @param string $namespacedClassName
229
     * @return string
230
     */
231 144
    public static function removeNamespace($namespacedClassName)
232
    {
233 144
        $elements = explode('\\', $namespacedClassName);
234 144
        return (string) array_pop($elements);
235
    }
236
    /**
237
     * @param string $directory
238
     * @param int $permissions
239
     * @return bool
240
     */
241 170
    public static function createDirectory($directory, $permissions = 0775)
242
    {
243 170
        if (!is_dir($directory)) {
244 18
            mkdir($directory, $permissions, true);
245
        }
246 170
        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 4
    public static function saveSchemas($destinationFolder, $schemasFolder, $schemasUrl, $content)
258
    {
259 4
        if (($schemasFolder === null) || empty($schemasFolder)) {
260
            // if null or empty schemas folder was provided
261
            // default schemas folder will be wsdl
262 2
            $schemasFolder = 'wsdl';
263
        }
264 4
        $schemasPath = rtrim($destinationFolder, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . rtrim($schemasFolder, DIRECTORY_SEPARATOR);
265
        // Here we must cover all possible variants
266 4
        if ((mb_strpos(mb_strtolower($schemasUrl), '.wsdl') !== false) || (mb_strpos(mb_strtolower($schemasUrl), '.xsd') !== false) || (mb_strpos(mb_strtolower($schemasUrl), '.xml') !== false)) {
267 4
            $filename = basename($schemasUrl);
268
        } else {
269
            // if $url is like http://example.com/index.php?WSDL default filename will be schema.wsdl
270 2
            $filename = 'schema.wsdl';
271
        }
272 4
        self::createDirectory($schemasPath);
273 4
        file_put_contents($schemasPath . DIRECTORY_SEPARATOR . $filename, $content);
274 4
        return $schemasPath . DIRECTORY_SEPARATOR . $filename;
275
    }
276
}
277