*/
function getInstance ($instanceKey);
}
+
+// [EOF]
+?>
interface Registerable extends FrameworkInterface {
}
-//
+// [EOF]
?>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+
+// Get config instance
+$cfg = FrameworkConfiguration::getInstance();
+
// Include the class loader function
-require(sprintf("%sinc/loader/class_ClassLoader%s", PATH, FrameworkConfiguration::getInstance()->readConfig('php_extension')));
+require(sprintf("%sinc/loader/class_ClassLoader%s", PATH, $cfg->readConfig('php_extension')));
+
+// Does the user has an application specified?
+if (!empty($_GET[$cfg->readConfig('app_selector_get')])) {
+ // Set the application from string
+ $application = (string) $_GET[$cfg->readConfig('app_selector_get')];
+} elseif (!empty($_SERVER['argv'][1])) {
+ // Set the application from string
+ $application = (string) $_SERVER['argv'][1];
+ $app = explode('=', trim($application));
+ if ($app[0] == $cfg->readConfig('app_selector_get')) {
+ // Application is valid!
+ $application = trim($app[1]);
+ } else {
+ // Invalid entry found, first must be "app"!
+ $application = $cfg->readConfig('default_application');
+ }
+} else {
+ // Set the "application selector" application
+ $application = $cfg->readConfig('default_application');
+}
+
+// Secure it, by keeping out tags
+$application = htmlentities(strip_tags($application), ENT_QUOTES);
+
+// Secure it a little more with a reg.exp.
+$application = preg_replace('/([^a-z_-])+/i', "", $application);
+
+// Set the application name for later usage
+$cfg->setConfigEntry('app_name', $application);
/**
* Autoload-function
* ----------------------------------
*/
class ClassLoader {
+ /**
+ * Instance of this class
+ */
+ private static $selfInstance = null;
+
/**
* Configuration array
*/
*/
private $classes = array();
+ /**
+ * List of loaded classes
+ */
+ private $loadedClasses = array();
+
/**
* Suffix with extension for all class files
*/
private $debug = false;
/**
- * Instance of this class
+ * Wether the file list is cached or not
*/
- private static $selfInstance = null;
+ private $listCached = false;
+
+ /**
+ * Wethe class content has been cached
+ */
+ private $classesCached = false;
+
+ /**
+ * Filename for the list cache
+ */
+ private $listCacheFQFN = "";
+
+ /**
+ * Cache for class content
+ */
+ private $classCacheFQFN = "";
/**
* The *public* constructor
* @return void
*/
public function __construct (FrameworkConfiguration $cfgInstance) {
+ // Set configuration instance
+ $this->cfgInstance = $cfgInstance;
+
+ // Construct the FQFN for the cache
+ if (!defined('DEVELOPER')) {
+ $this->listCacheFQFN = PATH . $this->cfgInstance->readConfig('local_db_path') . "list-" . $this->cfgInstance->readConfig('app_name') . ".cache";
+ $this->classCacheFQFN = PATH . $this->cfgInstance->readConfig('local_db_path') . "class-" . $this->cfgInstance->readConfig('app_name') . ".cache";
+ } // END - if
+
// Set suffix and prefix from configuration
$this->suffix = $cfgInstance->readConfig('class_suffix');
$this->prefix = $cfgInstance->readConfig('class_prefix');
$this->suffixLen = strlen($this->suffix);
$this->prefixLen = strlen($this->prefix);
- // Set configuration instance
- $this->cfgInstance = $cfgInstance;
-
// Set own instance
self::$selfInstance = $this;
+
+ // Skip here if no dev-mode
+ if (defined('DEVELOPER')) return;
+
+ // IS the cache there?
+ if (file_exists($this->listCacheFQFN)) {
+ // Get content
+ $cacheContent = file_get_contents($this->listCacheFQFN);
+
+ // And convert it
+ $this->classes = unserialize($cacheContent);
+
+ // List has been restored from cache!
+ $this->listCached = true;
+ } // END - if
+
+ // Does the class cache exist?
+ if (file_exists($this->classCacheFQFN)) {
+ // Then include it
+ require($this->classCacheFQFN);
+
+ // Mark the class cache as loaded
+ $this->classesCached = true;
+ } // END - if
+ }
+
+ /**
+ * The destructor makes it sure all caches got flushed
+ *
+ * @return void
+ */
+ public function __destruct () {
+ // Skip here if dev-mode
+ if (defined('DEVELOPER')) return;
+
+ // Skip here if already cached
+ if ($this->listCached === false) {
+ // Writes the cache file of our list away
+ $cacheContent = serialize($this->classes);
+ file_put_contents($this->listCacheFQFN, $cacheContent);
+ } // END - if
+
+ // Skip here if already cached
+ if ($this->classesCached === false) {
+ // Generate a full-cache of all classes
+ $cacheContent = "";
+ foreach ($this->loadedClasses as $fqfn) {
+ // Load the file
+ $cacheContent .= file_get_contents($fqfn);
+ } // END - foreach
+
+ // And write it away
+ file_put_contents($this->classCacheFQFN, $cacheContent);
+ } // END - if
}
/**
* @return void
*/
public function loadClasses ($basePath, $ignoreList = array() ) {
+ // Is a list has been restored from cache, don't read it again
+ if ($this->listCached === true) {
+ // Abort here
+ return;
+ }
+
// Convert string to array
if (!is_array($ignoreList)) $ignoreList = array($ignoreList);
$fqfn = $entry->getRealPath();
//* DEBUG: */ echo "ADD: {$fileName}<br />\n";
$this->classes[$fileName] = $fqfn;
- }
- }
+ } // END - if
+ } // END - foreach
}
/**
// Now look it up in our index
if (isset($this->classes[$fileName])) {
- if ($this->classes[$fileName] != "loaded") {
- // File is found so load it only once
- require($this->classes[$fileName]);
+ // File is found so load it only once
+ require($this->classes[$fileName]);
+
+ // Developer mode excludes caching (better debugging)
+ if (!defined('DEVELOPER')) {
+ // Mark this class as loaded
+ $this->loadedClasses[] = $this->classes[$fileName];
- // Mark it as loaded
- $this->classes[$fileName] = "loaded";
+ // Reset cache
+ $this->classesCached = false;
} // END - if
} // END - if
}
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-// Does the user has an application specified?
-if (!empty($_GET[FrameworkConfiguration::getInstance()->readConfig('app_selector_get')])) {
- // Set the application from string
- $application = (string) $_GET[FrameworkConfiguration::getInstance()->readConfig('app_selector_get')];
-} elseif (!empty($_SERVER['argv'][1])) {
- // Set the application from string
- $application = (string) $_SERVER['argv'][1];
- $app = explode('=', trim($application));
- if ($app[0] == FrameworkConfiguration::getInstance()->readConfig('app_selector_get')) {
- // Application is valid!
- $application = trim($app[1]);
- } else {
- // Invalid entry found, first must be "app"!
- $application = FrameworkConfiguration::getInstance()->readConfig('default_application');
- }
-} else {
- // Set the "application selector" application
- $application = FrameworkConfiguration::getInstance()->readConfig('default_application');
-}
-
-// Secure it, by keeping out tags
-$application = htmlentities(strip_tags($application), ENT_QUOTES);
-
-// Secure it a little more with a reg.exp.
-$application = preg_replace('/([^a-z_-])+/i', "", $application);
+// Get config instance
+$cfg = FrameworkConfiguration::getInstance();
// Try to load these includes in the given order
$configAppIncludes = array(
- sprintf("class_%s", FrameworkConfiguration::getInstance()->readConfig('app_helper_class')), // The ApplicationHelper class
+ sprintf("class_%s", $cfg->readConfig('app_helper_class')), // The ApplicationHelper class
"config", // The application's own configuration
"init", // The application initializer
"loader", // The application's class loader
// Generate a FQFN for the helper class
$fqfn = sprintf("%s%s/%s/%s%s",
PATH,
- FrameworkConfiguration::getInstance()->readConfig('application_path'),
- $application,
+ $cfg->readConfig('application_path'),
+ $cfg->readConfig('app_name'),
$inc,
- FrameworkConfiguration::getInstance()->readConfig('php_extension')
+ $cfg->readConfig('php_extension')
);
// Does the include file exists?
if ((file_exists($fqfn)) && (is_file($fqfn)) && (is_readable($fqfn))) {
// Load it
require_once($fqfn);
- } elseif (FrameworkConfiguration::getInstance()->readConfig('verbose_level') > 0) {
+ } elseif ($cfg->readConfig('verbose_level') > 0) {
// File is missing
trigger_error(sprintf("Cannot load application script %s! File is missing or read-protected.",
- $inc . FrameworkConfiguration::getInstance()->readConfig('php_extension')
+ $inc . $cfg->readConfig('php_extension')
));
}
}
<?php
+// Developer mode active? Comment out if no dev!
+define('DEVELOPER', true);
+
//xdebug_start_trace();
/**
* The main class with the entry point to the whole application. This class