Completed
Push — 1.x ( d5da2a...9204c0 )
by Mikaël
76:43 queued 56:16
created

Utils::getStreamContextOptions()   B

Complexity

Conditions 5
Paths 4

Size

Total Lines 24
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 16
CRAP Score 5

Importance

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