Newer
Older
ubFramework / Portal / docroot / include / utils / Loader.php
@Christopher W. Olsen Christopher W. Olsen on 10 Dec 2017 8 KB Cleaning Up Making It A Sub Module
<?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');

?>