<?php
/**
 * Project:
 * Contenido Content Management System
 *
 * Description:
 * Contenido autoloader class map file generator.
 *
 * Parses Contenido classes folder and creates a class map file.
 *
 * Usage:
 * ------
 * 1. Modifiy settings to youre requriements
 * 2. Call this script from command line as follows:
 *     $ php create_autoloader_cfg.php
 * 3. Check created class map file
 *
 * Requirements:
 * @con_php_req 5.0
 *
 * @package    Contenido Autoloader
 * @version    0.0.1
 * @author     Murat Purc <murat@purc.de>
 * @copyright  four for business AG <www.4fb.de>
 * @license    http://www.contenido.org/license/LIZENZ.txt
 * @link       http://www.4fb.de
 * @link       http://www.contenido.org
 * @since      file available since contenido release 4.8.15
 *
 * {@internal
 *   created  2010-12-27
 *   modified 2010-12-29, Murat Purc, removed parsing of pear folder
 *   $Id$:
 * }}
 *
 */


// allow execution only thru cli mode
(substr(PHP_SAPI, 0, 3) == 'cli') or die('Illegal call');


// need to set/build environment var
if (!defined('CL_ENVIRONMENT')) {
    if (getenv('CONLITE_ENVIRONMENT')) {
        $sEnvironment = getenv('CONLITE_ENVIRONMENT');
    } elseif (getenv('CL_ENVIRONMENT')) {
        $sEnvironment = getenv('CL_ENVIRONMENT');
    } else {
        if(file_exists(dirname(dirname(__FILE__))."/environment.php")) {
            include_once dirname(dirname(__FILE__))."/environment.php";
        }
        
        if(!isset($sEnvironment) || empty($sEnvironment)) {
            $sEnvironment = 'production';
        }
    }
    define('CL_ENVIRONMENT', $sEnvironment);
    unset($sEnvironment);
}


################################################################################
##### Initialization/Settings

// create a page context class, better than spamming global scope
$context = new stdClass();

// current path
$context->currentPath = str_replace('\\', '/', realpath(dirname(__FILE__) . '/')) . '/';

// contenido installation path (folder which contains "cms", "conlib", "contenido", "docs", "pear", "setup", etc...)
$context->contenidoInstallPath = str_replace('\\', '/', realpath(dirname(__FILE__) . '/../../')) . '/';

// the destination file where the class map configuration should be written in
$context->destinationFile = $context->contenidoInstallPath . 'data/config/'.CL_ENVIRONMENT.'/config.autoloader.php';

// list of paths from where all class/interface names should be found
$context->pathsToParse = array(
    $context->contenidoInstallPath . 'conlite/classes/',
    $context->contenidoInstallPath . 'conlite/external/PHPMailer/'
);

// class type finder options
$context->options = array(
    // list of directories which are to exclude from parsing (case insensitive)
    'excludeDirs'       => array('.svn'),
    // list of files which are to exclude from parsing (case insensitive), also possible regex patterns like /^~*.\.php$/
    'excludeFiles'      => array(),
    // list of file extensions to parse (case insensitive)
    'extensionsToParse' => '.php',
    'enableDebug'       => false,
);

// list to collect class maps
$context->classMapList = array();


################################################################################
##### Proccess

// include required classes
include_once($context->currentPath . 'mpAutoloaderClassMap/mpClassTypeFinder.php');
include_once($context->currentPath . 'mpAutoloaderClassMap/mpClassMapFileCreatorContenido.php');

// collect all found class/interface names with their paths
$context->classTypeFinder = new mpClassTypeFinder($context->options);
foreach ($context->pathsToParse as $pos => $dir) {
    $classMap = $context->classTypeFinder->findInDir(new SplFileInfo($dir), true);
    if ($classMap) {
        $context->classMapList = array_merge($context->classMapList, $classMap);
    }
}

// uncomment following line to get some debug messages
#echo $context->classTypeFinder->getFormattedDebugMessages();

// write the class map configuration
$context->classMapCreator = new mpClassMapFileCreatorContenido($context->contenidoInstallPath);
$context->classMapCreator->create($context->classMapList, $context->destinationFile);


################################################################################
##### Shutdown

unset($context);