| Code Coverage
| Classes and Traits | Functions and Methods | Lines
Total |  | 0.00% | 0 / 1 |  | 37.50% | 3 / 8 | CRAP |  | 70.31% | 45 / 64
LoggerOptionConverter |  | 0.00% | 0 / 1 |  | 37.50% | 3 / 8 | 75.78 |  | 70.31% | 45 / 64
getSystemProperty($key, $def) |  | 0.00% | 0 / 1 | 20 |  | 0.00% | 0 / 7
toBooleanEx($value) |  | 100.00% | 1 / 1 | 5 |  | 100.00% | 10 / 10
toIntegerEx($value) |  | 100.00% | 1 / 1 | 4 |  | 100.00% | 5 / 5
toPositiveIntegerEx($value) |  | 0.00% | 0 / 1 | 13.78 |  | 40.00% | 2 / 5
toLevelEx($value) |  | 0.00% | 0 / 1 | 3.04 |  | 83.33% | 5 / 6
toFileSizeEx($value) |  | 0.00% | 0 / 1 | 8.42 |  | 81.25% | 13 / 16
toStringEx($value) |  | 0.00% | 0 / 1 | 14.11 |  | 28.57% | 2 / 7
substConstants($string) |  | 100.00% | 1 / 1 | 3 |  | 100.00% | 8 / 8

1 | <?php
2 | /**
3 | * Licensed to the Apache Software Foundation (ASF) under one or more
4 | * contributor license agreements. See the NOTICE file distributed with
5 | * this work for additional information regarding copyright ownership.
6 | * The ASF licenses this file to You under the Apache License, Version 2.0
7 | * (the "License"); you may not use this file except in compliance with
8 | * the License. You may obtain a copy of the License at
9 | *
10 | * http://www.apache.org/licenses/LICENSE-2.0
11 | *
12 | * Unless required by applicable law or agreed to in writing, software
13 | * distributed under the License is distributed on an "AS IS" BASIS,
14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | * See the License for the specific language governing permissions and
16 | * limitations under the License.
17 | *
18 | * @package log4php
19 | */
20 |
21 | /**
22 | * A convenience class to convert property values to specific types.
23 | *
24 | * @version $Revision: 1374617 $
25 | * @package log4php
26 | * @subpackage helpers
27 | * @since 0.5
28 | */
29 | class LoggerOptionConverter {
30 |
31 | /** String values which are converted to boolean TRUE. */
32 | private static $trueValues = array('1', 'true', 'yes', 'on');
33 |
34 | /**
35 | * String values which are converted to boolean FALSE.
36 | *
37 | * Note that an empty string must convert to false, because
38 | * parse_ini_file() which is used for parsing configuration
39 | * converts the value _false_ to an empty string.
40 | */
41 | private static $falseValues = array('0', 'false', 'no', 'off', '');
42 |
43 | /**
44 | * Read a predefined var.
45 | *
46 | * It returns a value referenced by <var>$key</var> using this search criteria:
47 | * - if <var>$key</var> is a constant then return it. Else
48 | * - if <var>$key</var> is set in <var>$_ENV</var> then return it. Else
49 | * - return <var>$def</var>.
50 | *
51 | * @param string $key The key to search for.
52 | * @param string $def The default value to return.
53 | * @return string the string value of the system property, or the default
54 | * value if there is no property with that key.
55 | */
56 | public static function getSystemProperty($key, $def) {
57 | if(defined($key)) {
58 | return (string)constant($key);
59 | } else if(isset($_SERVER[$key])) {
60 | return (string)$_SERVER[$key];
61 | } else if(isset($_ENV[$key])) {
62 | return (string)$_ENV[$key];
63 | } else {
64 | return $def;
65 | }
66 | }
67 |
68 | /** Converts $value to boolean, or throws an exception if not possible. */
69 | public static function toBooleanEx($value) {
70 | if (isset($value)) {
71 | if (is_bool($value)) {
72 | return $value;
73 | }
74 | $value = strtolower(trim($value));
75 | if (in_array($value, self::$trueValues)) {
76 | return true;
77 | }
78 | if (in_array($value, self::$falseValues)) {
79 | return false;
80 | }
81 | }
82 |
83 | throw new LoggerException("Given value [" . var_export($value, true) . "] cannot be converted to boolean.");
84 | }
85 |
86 | /**
87 | * Converts $value to integer, or throws an exception if not possible.
88 | * Floats cannot be converted to integer.
89 | */
90 | public static function toIntegerEx($value) {
91 | if (is_integer($value)) {
92 | return $value;
93 | }
94 | if (is_numeric($value) && ($value == (integer) $value)) {
95 | return (integer) $value;
96 | }
97 |
98 | throw new LoggerException("Given value [" . var_export($value, true) . "] cannot be converted to integer.");
99 | }
100 |
101 | /**
102 | * Converts $value to integer, or throws an exception if not possible.
103 | * Floats cannot be converted to integer.
104 | */
105 | public static function toPositiveIntegerEx($value) {
106 | if (is_integer($value) && $value > 0) {
107 | return $value;
108 | }
109 | if (is_numeric($value) && ($value == (integer) $value) && $value > 0) {
110 | return (integer) $value;
111 | }
112 |
113 | throw new LoggerException("Given value [" . var_export($value, true) . "] cannot be converted to a positive integer.");
114 | }
115 |
116 | /** Converts the value to a level. Throws an exception if not possible. */
117 | public static function toLevelEx($value) {
118 | if ($value instanceof LoggerLevel) {
119 | return $value;
120 | }
121 | $level = LoggerLevel::toLevel($value);
122 | if ($level === null) {
123 | throw new LoggerException("Given value [" . var_export($value, true) . "] cannot be converted to a logger level.");
124 | }
125 | return $level;
126 | }
127 |
128 | /**
129 | * Converts a value to a valid file size (integer).
130 | *
131 | * Supports 'KB', 'MB' and 'GB' suffixes, where KB = 1024 B etc.
132 | *
133 | * The final value will be rounded to the nearest integer.
134 | *
135 | * Examples:
136 | * - '100' => 100
137 | * - '100.12' => 100
138 | * - '100KB' => 102400
139 | * - '1.5MB' => 1572864
140 | *
141 | * @param mixed $value File size (optionally with suffix).
142 | * @return integer Parsed file size.
143 | */
144 | public static function toFileSizeEx($value) {
145 |
146 | if (empty($value)) {
147 | throw new LoggerException("Empty value cannot be converted to a file size.");
148 | }
149 |
150 | if (is_numeric($value)) {
151 | return (integer) $value;
152 | }
153 |
154 | if (!is_string($value)) {
155 | throw new LoggerException("Given value [" . var_export($value, true) . "] cannot be converted to a file size.");
156 | }
157 |
158 | $str = strtoupper(trim($value));
159 | $count = preg_match('/^([0-9.]+)(KB|MB|GB)?$/', $str, $matches);
160 |
161 | if ($count > 0) {
162 | $size = $matches[1];
163 | $unit = $matches[2];
164 |
165 | switch($unit) {
166 | case 'KB': $size *= pow(1024, 1); break;
167 | case 'MB': $size *= pow(1024, 2); break;
168 | case 'GB': $size *= pow(1024, 3); break;
169 | }
170 |
171 | return (integer) $size;
172 | }
173 |
174 | throw new LoggerException("Given value [$value] cannot be converted to a file size.");
175 | }
176 |
177 | /**
178 | * Converts a value to string, or throws an exception if not possible.
179 | *
180 | * Objects can be converted to string if they implement the magic
181 | * __toString() method.
182 | *
183 | */
184 | public static function toStringEx($value) {
185 | if (is_string($value)) {
186 | return $value;
187 | }
188 | if (is_numeric($value)) {
189 | return (string) $value;
190 | }
191 | if (is_object($value) && method_exists($value, '__toString')) {
192 | return (string) $value;
193 | }
194 |
195 | throw new LoggerException("Given value [" . var_export($value, true) . "] cannot be converted to string.");
196 | }
197 |
198 | /**
199 | * Performs value substitution for string options.
200 | *
201 | * An option can contain PHP constants delimited by '${' and '}'.
202 | *
203 | * E.g. for input string "some ${FOO} value", the method will attempt
204 | * to substitute ${FOO} with the value of constant FOO if it exists.
205 | *
206 | * Therefore, if FOO is a constant, and it has value "bar", the resulting
207 | * string will be "some bar value".
208 | *
209 | * If the constant is not defined, it will be replaced by an empty string,
210 | * and the resulting string will be "some value".
211 | *
212 | * @param string $string String on which to perform substitution.
213 | * @return string
214 | */
215 | public static function substConstants($string) {
216 | preg_match_all('/\${([^}]+)}/', $string, $matches);
217 |
218 | foreach($matches[1] as $key => $match) {
219 | $match = trim($match);
220 | $search = $matches[0][$key];
221 | $replacement = defined($match) ? constant($match) : '';
222 | $string = str_replace($search, $replacement, $string);
223 | }
224 | return $string;
225 | }
226 | }