From d039c03a31f4223ba124c69aed9a58f2dccefdb6 Mon Sep 17 00:00:00 2001 From: Roland Haeder Date: Thu, 23 Feb 2017 22:00:39 +0100 Subject: [PATCH] Continued with debugging: - added exception InvalidClassNameException which is only being thrown by ObjectFactory when the given class name is not following naming convention. This is now strictly applied to all objects being created by that factory. - introduced stripNamespaceFromClassName() MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Roland Häder --- .../classes/class_BaseFrameworkSystem.php | 3 ++ .../factories/objects/class_ObjectFactory.php | 28 ++++++++++- .../main/class_InvalidClassNameException.php | 50 +++++++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 inc/main/exceptions/main/class_InvalidClassNameException.php diff --git a/inc/main/classes/class_BaseFrameworkSystem.php b/inc/main/classes/class_BaseFrameworkSystem.php index 4ad02eda..f5e05104 100644 --- a/inc/main/classes/class_BaseFrameworkSystem.php +++ b/inc/main/classes/class_BaseFrameworkSystem.php @@ -507,6 +507,9 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * @return void */ public static final function __callStatic ($methodName, $args) { + // Trace message + //* PRINT-DEBUG: */ printf('[%s:%d]: methodName=%s,args[]=%s - CALLED!' . PHP_EOL, __METHOD__, __LINE__, $methodName, gettype($args)); + // Init argument string $argsString = ''; diff --git a/inc/main/classes/factories/objects/class_ObjectFactory.php b/inc/main/classes/factories/objects/class_ObjectFactory.php index 2a5a46ef..a77c3e17 100644 --- a/inc/main/classes/factories/objects/class_ObjectFactory.php +++ b/inc/main/classes/factories/objects/class_ObjectFactory.php @@ -64,7 +64,7 @@ class ObjectFactory extends BaseFactory { } // Create method name - $methodName = sprintf('create%s', $className); + $methodName = sprintf('create%s', self::stripNamespaceFromClassName($className)); // Run the user function $objectInstance = call_user_func_array(array($className, $methodName), $args); @@ -94,4 +94,30 @@ class ObjectFactory extends BaseFactory { return $objectInstance; } + /** + * Strips of namespace from given class name. An exception is thrown when + * there is no namespace found as this is the now the norm for any objects + * being created with this object factory. + * + * @param $fullClassName Class name with namespace + * @return $shortClassName Stripped class name (no namespace) + * @throws InvalidClassNameException If the class name does not follow naming convention + */ + private static function stripNamespaceFromClassName ($fullClassName) { + // The class name should contain at least 2 back-slashes, so split at them + $classNameParts = explode("\\", $fullClassName); + + // At least 3 parts should be there + if (count($classNameParts) < 3) { + // Namespace scheme is: Project\Package[\SubPackage...] + throw new InvalidClassNameException($fullClassName, self::EXCEPTION_INVALID_CLASS_NAME); + } // END - if + + // Get last element + $shortClassName = array_pop($classNameParts); + + // Return it + return $shortClassName; + } + } diff --git a/inc/main/exceptions/main/class_InvalidClassNameException.php b/inc/main/exceptions/main/class_InvalidClassNameException.php new file mode 100644 index 00000000..40202ed1 --- /dev/null +++ b/inc/main/exceptions/main/class_InvalidClassNameException.php @@ -0,0 +1,50 @@ + + * @version 0.0.0 + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2017 Core Developer Team + * @license GNU GPL 3.0 or any newer version + * @link http://www.shipsimu.org + * @deprecated Don't use this anymore + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +class InvalidObjectException extends FrameworkException { + /** + * The constructor + * + * @param $className Class name that is invalid + * @param $code Code number for the exception + * @return void + */ + public function __construct ($className, $code) { + // Add a message around the missing class + $message = sprintf('[%d]: Class name "%s" is not conform to naming-convention: Project\Package[\SubPackage...]\SomeFooBar', + $this->getLine(), + $className + ); + + // Call parent constructor + parent::__construct($message, $code); + } + +} -- 2.30.2