/** * expects the directories passed via class constructor to be stored as autoloadable directories for preloading * see Xapp_Autoloader for explanations. * * @see Xapp_Autoloader * @error 10709 * @param null|string|array $dirs expects a directory path or multiple as array * @return void * @throws Xapp_Error */ protected function init($dirs = null) { $this->_dirs[self::hash(xapp_path(XAPP_PATH_XAPP))] = array(xapp_path(XAPP_PATH_XAPP), 'Xapp'); if (xapp_is_option(self::DIRECTORIES, $this)) { $dirs = array_merge((array) $dirs, xapp_get_option(self::DIRECTORIES, $this)); } if ($dirs !== null && (is_array($dirs) || is_string($dirs))) { if (is_string($dirs)) { $dirs = array(array($dirs)); } else { $dirs = (array) $dirs; foreach ($dirs as &$dir) { if (!is_array($dir)) { $dir = array($dir); } } } unset($dir); foreach ($dirs as $key => $dir) { $tmp = null; $dir = (array) $dir; $hash = self::hash($dir[0]); if (array_key_exists(1, $dir)) { $ns = array_slice($dir, 1); } else { if (!is_int($key) && is_string($key)) { $ns = array($key); } else { $ns = array(); } } if (is_dir($dir[0])) { if (!array_key_exists($hash, $this->_dirs)) { $this->_dirs[$hash] = array_merge(array(rtrim($dir[0], DS) . DS), $ns); continue; } } else { if (stripos($dir[0], xapp_path(XAPP_PATH_ROOT)) === false) { $tmp = (string) realpath(xapp_path(XAPP_PATH_ROOT) . $dir[0]); } if (!is_dir($tmp)) { $tmp = null; } if ($tmp === null && stripos($dir[0], xapp_path(XAPP_PATH_BASE)) === false) { $tmp = (string) realpath(xapp_path(XAPP_PATH_BASE) . $dir[0]); } if (!is_dir($tmp)) { $tmp = null; } if ($tmp === null && stripos($dir[0], xapp_path(XAPP_PATH_XAPP)) === false) { $tmp = (string) realpath(xapp_path(XAPP_PATH_XAPP) . $dir[0]); } if (!is_dir($tmp)) { $tmp = null; } if ($tmp !== null) { if (!array_key_exists($hash, $this->_dirs)) { $this->_dirs[$hash] = array_merge(array(rtrim($tmp, DS) . DS), $ns); } } else { throw new Xapp_Error(xapp_sprintf(_("relative dir: %s is not a valid dir"), $dir[0]), 1070901); } } } } if (xapp_is_option(self::INCLUDE_PATHS, $this)) { $paths = explode(PATH_SEPARATOR, get_include_path()); foreach ($paths as $path) { if (strpos($path, DS) !== false && is_readable($path)) { $this->_dirs[self::hash($path)] = (array) $path; } } } }
/** * xapp java style dot and wildcard class/package loader imports/requires class or packages from the default xapp base * path or paths passed as conf value defined by XAPP_CONF_IMPORT_PATH. the import $parameter can be: * * 1) absolute file like /var/www/app/foo.php - includes file directly * 2) relative file like /app/foo.php - tries to include file from known xapp paths * 3) java style class xapp.Xapp.Event - imports class * 4) java style package xapp.Xapp.* - imports packages * * this function can not import: * 3) absolute dirs like /var/www/app - not supported! * 4) relative dirs like /app - not supported! * * the function store all imported java style classes and packages into a global package cache to check if package has been * already imported and therefore does not execute any import code. the function does not throw any error but simply tries * to require the $import param with triggering php error when $import value require fails. * * The import function does have hidden additional parameters when using java style dotmnotation wildcard loading. the * hidden function arguments/parameters are: * 1 = either a custom base path from where to load the package or an array with regex exclude rules/patterns * 2 = an array with regex exclude rules if 1 is a custom base path. call like: * * <code> * xapp_import('xapp.Package.*, '/custom/path/'); * xapp_import('xapp.Package.*, array('/^regex1$/', '/regex2/i')); * xapp_import('xapp.Package.*, '/custom/path/', array('/^regex1$/', '/regex2/i')); * </code> * * NOTE: the regex syntax for the the path/name exclusion argument must be a valid and complete regex pattern! Also the * exclude argument MUST be an array! * * @param string $import expects a a valid import value as defined above * @return boolean */ function xapp_import($import) { $path = null; //if is php includable file with relative or absolute path with DS separator or . dot separator include directly trying to resolve absolute path if (preg_match('/(.*)\\.(php|php5|phps|phtml|inc)$/i', $import, $m)) { if (stripos($import, DS) === false) { $import = implode(DS, explode('.', trim($m[1], '.* '))) . '.' . trim($m[2], '.* '); } if (in_array($import, get_required_files())) { return; } if (is_file($import)) { require_once $import; return true; } $class = xapp_path(XAPP_PATH_XAPP) . trim($import, DS); if (in_array($class, get_required_files())) { return; } if (is_file($class)) { require_once $class; return true; } $class = xapp_path(XAPP_PATH_BASE) . trim($import, DS); if (in_array($class, get_required_files())) { return; } if (is_file($class)) { require_once $class; return true; } $class = xapp_path(XAPP_PATH_ROOT) . trim($import, DS); if (in_array($class, get_required_files())) { return; } if (is_file($class)) { require_once $class; return true; } require_once $import; //is java style import . dot notation with wildcard } else { $ns = substr($import, 0, strpos($import, '.')); $pk = substr(substr($import, strlen($ns) + 1), 0, strpos(substr($import, strlen($ns) + 1), '.')); //if ns is not xapp check if composer autoloader and package to import exists if (stripos($ns, 'xapp') === false) { $ns = substr($import, 0, strpos($import, '.')); $pk = substr(substr($import, strlen($ns) + 1), 0, strpos(substr($import, strlen($ns) + 1), '.')); //if ns is not xapp check if composer autoloader and package to import exists if (stripos($ns, 'xapp') === false) { $searchPath = xapp_path(XAPP_PATH_BASE) . 'xapp' . DIRECTORY_SEPARATOR; if (!in_array(xapp_path(XAPP_PATH_BASE) . 'autoload.php', get_required_files())) { /** * @Core-Hack */ if (is_file($searchPath . 'autoload.php')) { require_once $searchPath . 'autoload.php'; } else { trigger_error("unable to include composer vendor autoloader - please make sure composer is installed", E_USER_ERROR); } /* if(is_file(xapp_path(XAPP_PATH_BASE) . 'autoload.php')) { require_once xapp_path(XAPP_PATH_BASE) . 'autoload.php'; }else{ trigger_error("unable to include composer vendor autoloader - please make sure composer is installed", E_USER_ERROR); } */ } if (!is_dir($searchPath . str_replace('.', DS, substr($import, 0, strpos($import, '.', strpos($import, '.') + 1))))) { trigger_error("composer vendor package: {$import} does not exist - please make sure package is installed", E_USER_ERROR); } return true; } /* if(!in_array(xapp_path(XAPP_PATH_BASE) . 'autoload.php', get_required_files())) { if(is_file(xapp_path(XAPP_PATH_BASE) . 'autoload.php')) { require_once xapp_path(XAPP_PATH_BASE) . 'autoload.php'; }else{ trigger_error("unable to include composer vendor autoloader - please make sure composer is installed", E_USER_ERROR); } } if(!is_dir(xapp_path(XAPP_PATH_BASE) . str_replace('.', DS, substr($import, 0, strpos($import, '.', (strpos($import, '.') + 1)))))) { trigger_error("composer vendor package: $import does not exist - please make sure package is installed", E_USER_ERROR); } return true; */ } //if ns is xapp and xapp autoloader is loaded do nothing but only if package is not Ext if (stripos($ns, 'xapp') !== false && xapped('Xapp_Autoloader') && Xapp_Autoloader::hasInstance()) { if (stripos($pk, 'Ext') === false) { return true; } } //init global import array if (!isset($GLOBALS['XAPP_IMPORTS'])) { $GLOBALS['XAPP_IMPORTS'] = array(); } //if called class or package is already imported do nothing if (in_array($import, $GLOBALS['XAPP_IMPORTS'])) { return true; } //import single class if (substr($import, -1) !== '*') { $base = explode('.', trim($import, '. ')); $class = array_pop($base); if ($base[0] === 'xapp' && SOURCE_SEPARATOR !== '') { if (!array_key_exists(1, $base)) { array_push($base, $class, SOURCE_SEPARATOR); } else { $base = array_merge(array_slice($base, 0, 2), array(SOURCE_SEPARATOR), array_slice($base, 2)); } } $base = implode(DS, $base); $path = xapp_path(XAPP_PATH_BASE); $path = array_diff(array_merge((array) $path, (array) xapp_conf(XAPP_CONF_IMPORT_PATH)), array(''), array(1)); foreach ($path as $p) { $p = rtrim($p, DS) . DS; if (is_file($p . $base . DS . $class . XAPP_EXT)) { array_push($GLOBALS['XAPP_IMPORTS'], $import); require_once $p . $base . DS . $class . XAPP_EXT; return true; } if (is_file($p . $base . DS . $class . DS . $class . XAPP_EXT)) { array_push($GLOBALS['XAPP_IMPORTS'], $import); require_once $p . $base . DS . $class . DS . $class . XAPP_EXT; return true; } } trigger_error("unable to import: {$import} - class not found", E_USER_ERROR); //import package } else { $regex = null; if (func_num_args() >= 2) { $args = func_get_args(); if (array_key_exists(1, $args) && array_key_exists(2, $args) && !empty($args[2])) { $path = (array) $args[1]; $regex = (array) $args[2]; } else { if (is_array($args[1])) { $regex = $args[1]; } else { if (strpos($args[1], DS) !== false) { $path = (array) $args[1]; } } } } if ($path === null) { $path = xapp_path(XAPP_PATH_BASE); $path = array_diff(array_merge((array) $path, (array) xapp_conf(XAPP_CONF_IMPORT_PATH)), array(''), array(1)); } foreach ($path as $p) { $b = rtrim($p, DS) . DS; $p = $b . implode(DS, explode('.', trim($import, '.*'))) . DS; $found = false; if (($dir = @opendir($p)) !== false) { while (($file = readdir($dir)) !== false) { if ($file === '.' || $file === '..' || stripos($file, '.svn') !== false) { continue; } else { if ($regex !== null) { foreach ($regex as $r) { if ((bool) preg_match(trim($r), $file)) { continue; } } } else { if (is_dir($p . $file)) { xapp_import(trim($import, '.*') . '.' . $file . '.*', $b, $regex); } else { if (strpos($file, XAPP_EXT) !== false) { $i = trim($import, '.*') . '.' . substr($file, 0, strrpos($file, XAPP_EXT)); if (!in_array($i, $GLOBALS['XAPP_IMPORTS'])) { require_once $p . $file; array_push($GLOBALS['XAPP_IMPORTS'], $i); $found = true; } } } } } } if ($found) { break; } } } if (!in_array($import, $GLOBALS['XAPP_IMPORTS'])) { array_push($GLOBALS['XAPP_IMPORTS'], $import); } return true; } } return false; }