| <?php |
| /** |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| * @package log4php |
| */ |
| |
| /** |
| * Provides methods for reflective use on php objects |
| * @package log4php |
| */ |
| class LoggerReflectionUtils { |
| /** the target object */ |
| private $obj; |
| |
| /** |
| * Create a new LoggerReflectionUtils for the specified Object. |
| * This is done in prepartion for invoking {@link setProperty()} |
| * one or more times. |
| * @param object &$obj the object for which to set properties |
| */ |
| public function __construct($obj) { |
| $this->obj = $obj; |
| } |
| |
| /** |
| * Set the properties of an object passed as a parameter in one |
| * go. The <code>properties</code> are parsed relative to a |
| * <code>prefix</code>. |
| * |
| * @param object $obj The object to configure. |
| * @param array $properties An array containing keys and values. |
| * @param string $prefix Only keys having the specified prefix will be set. |
| */ |
| // TODO: check, if this is really useful |
| public static function setPropertiesByObject($obj, $properties, $prefix) { |
| $pSetter = new LoggerReflectionUtils($obj); |
| return $pSetter->setProperties($properties, $prefix); |
| } |
| |
| |
| /** |
| * Set the properites for the object that match the |
| * <code>prefix</code> passed as parameter. |
| * |
| * Example: |
| * |
| * $arr['xxxname'] = 'Joe'; |
| * $arr['xxxmale'] = true; |
| * and prefix xxx causes setName and setMale. |
| * |
| * @param array $properties An array containing keys and values. |
| * @param string $prefix Only keys having the specified prefix will be set. |
| */ |
| public function setProperties($properties, $prefix) { |
| $len = strlen($prefix); |
| reset($properties); |
| while(list($key,) = each($properties)) { |
| if(strpos($key, $prefix) === 0) { |
| if(strpos($key, '.', ($len + 1)) > 0) { |
| continue; |
| } |
| $value = $properties[$key]; |
| $key = substr($key, $len); |
| if($key == 'layout' and ($this->obj instanceof LoggerAppender)) { |
| continue; |
| } |
| $this->setProperty($key, $value); |
| } |
| } |
| $this->activate(); |
| } |
| |
| /** |
| * Set a property on this PropertySetter's Object. If successful, this |
| * method will invoke a setter method on the underlying Object. The |
| * setter is the one for the specified property name and the value is |
| * determined partly from the setter argument type and partly from the |
| * value specified in the call to this method. |
| * |
| * <p>If the setter expects a String no conversion is necessary. |
| * If it expects an int, then an attempt is made to convert 'value' |
| * to an int using new Integer(value). If the setter expects a boolean, |
| * the conversion is by new Boolean(value). |
| * |
| * @param string $name name of the property |
| * @param string $value String value of the property |
| */ |
| public function setProperty($name, $value) { |
| if($value === null) { |
| return; |
| } |
| |
| $method = "set" . ucfirst($name); |
| |
| if(!method_exists($this->obj, $method)) { |
| throw new Exception("Error setting log4php property $name to $value: no method $method in class ".get_class($this->obj)."!"); |
| } else { |
| return call_user_func(array($this->obj, $method), $value); |
| } |
| } |
| |
| public function activate() { |
| if(method_exists($this->obj, 'activateoptions')) { |
| return call_user_func(array($this->obj, 'activateoptions')); |
| } |
| } |
| |
| /** |
| * Creates an instances from the given class name. |
| * |
| * @param string $classname |
| * @return an object from the class with the given classname |
| */ |
| public static function createObject($class) { |
| if(!empty($class)) { |
| return new $class(); |
| } |
| return null; |
| } |
| |
| /** |
| * @param object $object |
| * @param string $name |
| * @param mixed $value |
| */ |
| public static function setter($object, $name, $value) { |
| if (empty($name)) { |
| return false; |
| } |
| $methodName = 'set'.ucfirst($name); |
| if (method_exists($object, $methodName)) { |
| return call_user_func(array($object, $methodName), $value); |
| } else { |
| return false; |
| } |
| } |
| |
| } |