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