1<?php 2 3//this script may only be included - so its better to die if called directly. 4if (strpos($_SERVER["SCRIPT_NAME"],basename(__FILE__)) !== false) { 5 header("location: index.php"); 6 exit; 7} 8 9/* 10This file is part of J4PHP - Ensembles de propriétés et méthodes permettant le developpment rapide d'application web modulaire 11Copyright (c) 2002-2004 @PICNet 12 13This program is free software; you can redistribute it and/or 14modify it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE 15as published by the Free Software Foundation. 16 17This program is distributed in the hope that it will be useful, 18but WITHOUT ANY WARRANTY; without even the implied warranty of 19MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20GNU LESSER GENERAL PUBLIC LICENSE for more details. 21 22You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE 23along with this program; if not, write to the Free Software 24Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 25*/ 26 27/** 28* Classe principal d'APICFrameWorks ; elle premet d'importer n'import quelle autre class 29* Ce code est tirer du projet jphp lib qui est malheureusement clos. 30* 31* Cette class ne s'instancie pas elle s'utilise de maniere static de cette facon : 32* require_once("conf/config.inc.php"); 33* $secure = APIC::loadClass('org.apicnet.security.Auth'); 34* $secure->secureIt(); <i> 35* ou require_once("conf/config.inc.php"); 36* APIC::import('org.apicnet.security.Auth'); 37* 38* 39* @update $Date: 2005-05-18 11:01:38 $ 40* @version 1.0 41* @author diogène MOULRON <logiciel@apicnet.net> 42* @package core 43*/ 44class APIClassRegistry extends ErrorManager{ 45 46 var $packages = NULL; 47 var $classes = NULL; 48 var $instances = NULL; 49 50 /** 51 * Class registry constructor 52 * @access private 53 */ 54 function __construct(){ 55 $this->packages = array(); 56 $this->classes = array(); 57 $this->instances = array(); 58 parent::__construct(); 59 } 60 61 62 /** 63 * create a singleton instance of APIClassRegistry 64 * @return APIClassRegistry a unique instance of a APIClassRegistry 65 * @access private static 66 */ 67 function & getInstance(){ 68 static $instance; 69 if (!isset($instance)){ 70 $instance = new APIClassRegistry(); 71 } 72 return $instance; 73 } 74 75 /** 76 * Try to register the class/package 77 * @param string $class_package package name 78 * @param string $class_package class name 79 * @return boolean TRUE if the class has been registered 80 * @access public static 81 */ 82 function register($class_package, $class_class=NULL){ 83 static $registry; 84 if (!isset($registry)) { 85 $registry =& APIClassRegistry::getInstance(); 86 } 87 if (isset($class_class)){ 88 $class_package.= '.'.$class_class; 89 } 90 91 $class_package = preg_replace_callback('/([À-Ý]|[A-Z])/', function ($match) { 92 return chr(ord($match[1])+32); 93 }, $class_package); 94 95 // determine is a class or is a package 96 if (APIClassRegistry::isClass($class_package)){ 97 $extractedClassName = APIClassRegistry::extractClassName($class_package); 98 $extractedPackageName = APIClassRegistry::extractPackageName($class_package); 99 $registry->classes[$extractedClassName] = $extractedPackageName; 100 $registry->instances[$extractedClassName] = NULL; 101 } 102 else if (APIClassRegistry::isPackage($class_package)){ 103 $registry->packages[$class_package] = $class_package; 104 } 105 return FALSE; 106 } 107 108 function registerClass($class_package, &$obj){ 109 static $registry; 110 if (!isset($registry)) { 111 $registry =& APIClassRegistry::getInstance(); 112 } 113 $extractedClassName = strtolower(APIClassRegistry::extractClassName($class_package)); 114 $registry->instances[$extractedClassName] = $obj; 115 } 116 117 function &loadClass($class_package, $parameters){ 118 static $registry; 119 if (!isset($registry)) { 120 $registry =& APIClassRegistry::getInstance(); 121 } 122 123 $class_package = preg_replace_callback('/([À-Ý]|[A-Z])/', function ($match) { 124 return chr(ord($match[1])+32); 125 }, $class_package); 126 127 $extractedClassName = strtolower(APIClassRegistry::extractClassName($class_package)); 128 if (isset($registry->instances[$extractedClassName])){ 129 // echo("OK "); 130 // echo(" chargement effectué avec succès de la class ".$registry->instances[$extractedClassName]->className()."<br>"); 131 return $registry->instances[$extractedClassName]; 132 } else { 133 // echo(" ...."); 134 return APIC::loadClass($class_package, $parameters, TRUE); 135 } 136 } 137 138 139 /** 140 * check if the parameter string is a package definition 141 * @param string|core.StringBuffer a class name or a package name 142 * @return boolean TRUE if it's a package definition 143 * @access public static 144 */ 145 function isPackage($package){ 146 return $package[strlen($package)-1]==='*' && $package[strlen($package)-2]==='.'; 147 } 148 149 /** 150 * check if the parameter string is a class definition 151 * @param string|core.StringBuffer a class name or a package name 152 * @return boolean TRUE if it's a package definition 153 * @access public static 154 */ 155 function isClass($package){ 156 return isset($package) ? $package[strlen($package)-1]!=='*' : FALSE; 157 } 158 159 /** 160 * try to extract a class name from a package call 161 * @param string|core.StringBuffer a class name or a package name 162 * @return string/core.StringBuffer the extracted class name if extraction is a success or NULL if fail to extract 163 * @access public static 164 */ 165 function extractClassName($package){ 166 $array = explode('.', $package); 167 return $array[count($array)-1]; 168 } 169 170 /** 171 * try to extract a package name from a package call 172 * @param string|core.StringBuffer a class name or a package name 173 * @return string/core.StringBuffer the extracted package name if extraction is a success or NULL if fail to extract 174 * @access public static 175 */ 176 function extractPackageName($package){ 177 if (APIClassRegistry::isPackage($package)){ 178 return substr($package, 0, strlen($package)-2); 179 }else{ 180 $pos = strrpos($package, '.'); 181 if ($pos>0){ 182 return substr($package, 0, $pos); 183 }else{ 184 return $package; 185 } 186 } 187 } 188 189 /** 190 * check if the class/package is already registered 191 * @param string|core.StringBuffer a class name or a package name 192 * @return boolean TRUE if the class/package is already registered 193 * @access public 194 */ 195 function isRegistered($class_package, $class_class=NULL){ 196 static $registry; 197 // get unique instance 198 if (!isset($registry)) { 199 $registry =& APIClassRegistry::getInstance(); 200 } 201 if (isset($class_class) || APIClassRegistry::isClass($class_package)){ 202 if (!isset($class_class)){ 203 $class_class = APIClassRegistry::extractClassName($class_package); 204 } 205 206 $class_class = preg_replace_callback('/([À-Ý]|[A-Z])/', function ($match) { 207 return chr(ord($match[1])+32); 208 }, $class_class); 209 210 return isset($registry->classes[$class_class]); 211 }else{ 212 $class_package = preg_replace_callback('/([À-Ý]|[A-Z])/', function ($match) { 213 return chr(ord($match[1])+32); 214 }, $class_package); 215 216 return isset($registry->packages[$class_package]); 217 } 218 } 219 220 /** 221 * Convert to real path 222 */ 223 // ajouter une variable permettant de distinguer les imports du core et ceux des modules en utilisant APIC_MODULE_PATH 224 function convertToPath($package_name, $modulePath=NULL, $class_name=NULL){ 225 $package_name = preg_replace('/(\*?)$/', '', $package_name); 226 $package_name = strtr($package_name, '*.',' /'); 227 $package_name = str_replace(str_repeat(DIRECTORY_SEPARATOR,2), '.'.DIRECTORY_SEPARATOR, $package_name); 228 if (isset($modulePath)) { 229 $package_name = APATH_MODULE_PATH . $modulePath ."/include/" . $package_name; 230 } else { 231 $package_name = APIC_LIBRARY_PATH . $package_name; 232 } 233 234 if (isset($class_name)){ 235 $package_name .= '/'.$class_name.'.php'; 236 } 237 238 return $package_name; 239 } 240 /** 241 * display all class and import that have been register 242 * @return void 243 * @access public static 244 */ 245 function _debug(){ 246 static $registry; 247 // get unique instance 248 if (!isset($registry)) { 249 $registry =& APIClassRegistry::getInstance(); 250 } 251 print("<font style='font-family: Courier New; font-size: 9pt; color:#0000ff'><strong>Packages importation :</strong><ol>"); 252 $keys = array_keys($registry->packages); 253 $len = count($keys); 254 if ($len>0){ 255 for ($i=0; $i<$len; $i++){ 256 $pos = strpos($keys[$i], 'core.'); 257 if ($pos!==FALSE && $pos===0){ 258 print("<li><font color=#ff3300><strong>".$keys[$i]."</strong></font>"); 259 } else{ 260 print("<li>".$keys[$i]); 261 } 262 } 263 } else { 264 print("<li> no existance of package import"); 265 } 266 print("</ol></font>"); 267 print("<font style='font-family: Courier New; font-size: 9pt; color:#0000ff'><strong>Classes importation :</strong><ol>"); 268 $keys = array_keys($registry->classes); 269 $len = count($keys); 270 if ($len>0){ 271 for ($i=0; $i<$len; $i++){ 272 $class = $registry->classes[$keys[$i]].".<b>".$keys[$i]."</b>"; 273 $pos = strpos($class, 'core.'); 274 if ($pos!==FALSE && $pos===0){ 275 print("<li><font color=#ff3300>".$class."</font>"); 276 } else { 277 print("<li>".$class); 278 } 279 } 280 } else { 281 print("<li> no existance of class import"); 282 } 283 print("</ol></font>"); 284 } 285} 286