diff --git a/library/log4php/LoggerReflectionUtils.php b/library/log4php/LoggerReflectionUtils.php new file mode 100644 --- /dev/null +++ b/library/log4php/LoggerReflectionUtils.php @@ -0,0 +1,152 @@ +<?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; + } + } + +}