<?php
/* Do Away With This If I Dont Need It */
global $LOADER_FILE_DIR;
$LOADER_FILE_DIR = dirname ( __FILE__ );
class Sphere_Loader {
protected static $includeCache = array ();
protected static $includePathCache = array ();
/**
* Static function to resolve the qualified php filename to absolute path
*
* @global <String> $LOADER_FILE_DIR
* @param <String> $qualifiedName
* @return <String> Absolute File Name
*/
static function resolveNameToPath($qualifiedName, $fileExtension = 'php') {
global $LOADER_FILE_DIR;
$allowedExtensions = array (
'php',
'js',
'css',
'less'
);
$file = '';
if (! in_array ( $fileExtension, $allowedExtensions )) {
return '';
}
// TO handle loading vtiger files
if (strpos ( $qualifiedName, '~~' ) === 0) {
$file = str_replace ( '~~', '', $qualifiedName );
$file = $LOADER_FILE_DIR . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . $file;
}
else if (strpos ( $qualifiedName, '~' ) === 0) {
$file = str_replace ( '~', '', $qualifiedName );
//$file = $LOADER_FILE_DIR . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . $file;
$file = "." . $file;
}
else {
$file = str_replace ( '.', DIRECTORY_SEPARATOR, $qualifiedName ) . '.' . $fileExtension;
//$file = $LOADER_FILE_DIR . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . $file;
}
return $file;
}
/**
* Function to include a given php file through qualified file name
*
* @param <String> $qualifiedName
* @param <Boolean> $supressWarning
* @return <Boolean>
*/
static function includeOnce($qualifiedName, $supressWarning = false) {
if (isset ( self::$includeCache [$qualifiedName] )) {
return true;
}
$file = self::resolveNameToPath ( $qualifiedName );
if (! file_exists ( $file )) {
return false;
}
// Check file inclusion before including it
// check the file access is made within web root directory and whether it is not from unsafe directories
//checkFileAccessForInclusion ( $file );
$status = - 1;
if ($supressWarning) {
$status = @include_once $file;
}
else {
$status = include_once $file;
}
$success = ($status === 0) ? false : true;
if ($success) {
self::$includeCache [$qualifiedName] = $file;
}
return $success;
}
static function includePath($qualifiedName) {
// Already included?
if (isset ( self::$includePathCache [$qualifiedName] )) {
return true;
}
$path = realpath ( self::resolveNameToPath ( $qualifiedName ) );
self::$includePathCache [$qualifiedName] = $path;
// TODO Check if resolvedPath is already part of include path.
set_include_path ( $path . PATH_SEPARATOR . get_include_path () );
return true;
}
/**
* Function to get the class name of a given Component, of given Type, for a given Module
*
* @param <String> $componentType
* @param <String> $componentName
* @param <String> $moduleName
* @return <String> Required Class Name
* @throws AppException
*/
public static function getComponentClassName($componentType, $componentName, $moduleName = 'Sphere') {
print "[" . $componentType . "-" . $componentName . "-" . $moduleName . "]<br />\n";
// Change component type from view to views, action to actions to navigate to the right path.
$componentTypeDirectory = strtolower ( $componentType ) . 's';
// Fall Back Directory & Fall Back Class
$fallBackModuleDir = $fallBackModuleClassPath = 'Sphere';
// Intermediate Fall Back Directories & Classes, before relying on final fall back
$firstFallBackModuleDir = $firstFallBackModuleClassPath = '';
$secondFallBackDir = $secondFallBackClassPath = '';
// Default module directory & class name
$moduleDir = $moduleClassPath = $moduleName;
// Change the Module directory & class, along with intermediate fall back directory and class, if module names has submodule as well
if (strpos ( $moduleName, ':' ) > 0) {
$moduleHierarchyParts = explode ( ':', $moduleName );
$moduleDir = str_replace ( ':', '.', $moduleName );
$moduleClassPath = str_replace ( ':', '_', $moduleName );
$actualModule = $moduleHierarchyParts [count ( $moduleHierarchyParts ) - 1];
$secondFallBackModuleDir = $secondFallBackModuleClassPath = $actualModule;
print "[" . $actualModule . "]<br />\n";
if ($actualModule != 'Users') {
$baseModule = $moduleHierarchyParts [0];
if ($baseModule == 'Settings')
$baseModule = 'Settings:Sphere';
$firstFallBackDir = str_replace ( ':', '.', $baseModule );
$firstFallBackClassPath = str_replace ( ':', '_', $baseModule );
}
}
// Build module specific file path and class name
print "[" . 'modules.' . $moduleDir . '.' . $componentTypeDirectory . '.' . $componentName . "]<br />\n";
$moduleSpecificComponentFilePath = Sphere_Loader::resolveNameToPath ( 'modules.' . $moduleDir . '.' . $componentTypeDirectory . '.' . $componentName );
$moduleSpecificComponentClassName = $moduleClassPath . '_' . $componentName . '_' . $componentType;
print "(" . $moduleSpecificComponentFilePath . ")";
if (file_exists ( $moduleSpecificComponentFilePath )) {
return $moduleSpecificComponentClassName;
}
// Build first intermediate fall back file path and class name
if (! empty ( $firstFallBackDir ) && ! empty ( $firstFallBackClassPath )) {
$fallBackComponentFilePath = Sphere_Loader::resolveNameToPath ( 'modules.' . $firstFallBackDir . '.' . $componentTypeDirectory . '.' . $componentName );
$fallBackComponentClassName = $firstFallBackClassPath . '_' . $componentName . '_' . $componentType;
print "(" . $fallBackComponentFilePath . ")";
if (file_exists ( $fallBackComponentFilePath )) {
return $fallBackComponentClassName;
}
}
// Build intermediate fall back file path and class name
if (! empty ( $secondFallBackModuleDir ) && ! empty ( $secondFallBackModuleClassPath )) {
$fallBackComponentFilePath = Sphere_Loader::resolveNameToPath ( 'modules.' . $secondFallBackModuleDir . '.' . $componentTypeDirectory . '.' . $componentName );
$fallBackComponentClassName = $secondFallBackModuleClassPath . '_' . $componentName . '_' . $componentType;
print "(" . $fallBackComponentFilePath . ")";
if (file_exists ( $fallBackComponentFilePath )) {
return $fallBackComponentClassName;
}
}
// Build fall back file path and class name
$fallBackComponentFilePath = Sphere_Loader::resolveNameToPath ( 'modules.' . $fallBackModuleDir . '.' . $componentTypeDirectory . '.' . $componentName );
$fallBackComponentClassName = $fallBackModuleClassPath . '_' . $componentName . '_' . $componentType;
print "(" . $fallBackComponentFilePath . ")";
if (file_exists ( $fallBackComponentFilePath )) {
return $fallBackComponentClassName;
}
throw new AppException ( 'Handler not found.' );
}
/**
* Function to auto load the required class files matching the directory pattern modules/xyz/types/Abc.php for class xyz_Abc_Type
*
* @param <String> $className
* @return <Boolean>
*/
public static function autoLoad($className) {
$parts = explode ( '_', $className );
$noOfParts = count ( $parts );
if ($noOfParts > 2) {
$filePath = 'modules.';
// Append modules and sub modules names to the path
for($i = 0; $i < ($noOfParts - 2); ++ $i) {
$filePath .= $parts [$i] . '.';
}
$fileName = $parts [$noOfParts - 2];
$fileComponentName = strtolower ( $parts [$noOfParts - 1] ) . 's';
$filePath .= $fileComponentName . '.' . $fileName;
return Sphere_Loader::includeOnce ( $filePath );
}
return false;
}
}
function sphere_import($qualifiedName) {
return Sphere_Loader::includeOnce ( $qualifiedName );
}
function sphere_import_try($qualifiedName) {
return Sphere_Loader::includeOnce ( $qualifiedName, true );
}
function sphere_import_path($qualifiedName) {
return Sphere_Loader::includePath ( $qualifiedName );
}
spl_autoload_register('Sphere_Loader::autoLoad');
?>