public function dbStatusAction() { $yupp = new Yupp(); $appNames = $yupp->getAppNames(); $appModelClasses = array(); // [appName][class][tablename,creada o no] // Incluye todas las clases del modelo de todas las apps YuppLoader::loadModel(); // Para saber si se crearon las tablas para todas las // clases del modelo de todas las aplicaciones. $allTablesCreated = true; $fn = new FileNames(); // http://code.google.com/p/yupp/issues/detail?id=123 $createDatabaseForApps = array(); // Aplicaciones a las que se sugiere que se cree su base de datos foreach ($appNames as $appName) { $app = new App($appName); $modelClassFileNames = $app->getModel(); // no incluye las clases, solo obtiene los nombres //print_r($modelClassFileNames); // Necesito que sea plano el array, si no, tengo que hacer recorrida recursiva. // Esto no seria necesario si modifico la recorrida en la vista, para mostrar // la estructura interna de paquetes del modelo de la aplicacion. $modelClassFileNames = $this->array_flatten($modelClassFileNames); //print_r($modelClassFileNames); // Toda la informacion de las clases y tablas creadas para esta app $appModelClasses[$appName] = array(); // http://code.google.com/p/yupp/issues/detail?id=123 try { $dal = new DAL($appName); // Falla sino existe la base para la app $appName } catch (Exception $e) { if ($e->getCode() == 666) { $createDatabaseForApps[] = $appName; } continue; // Para el for appNames } foreach ($modelClassFileNames as $classFileName) { $fileInfo = $fn->getFileNameInfo($classFileName); $className = $fileInfo['name']; // Para incluir las clases (por si no estan incluidas) // Ticket: http://code.google.com/p/yupp/issues/detail?id=71 YuppLoader::load($fileInfo['package'], $className); $tableName = YuppConventions::tableName($className); if ($dal->tableExists($tableName)) { $appModelClasses[$appName][$className] = array('tableName' => $tableName, 'created' => "CREADA"); } else { $appModelClasses[$appName][$className] = array('tableName' => $tableName, 'created' => "NO CREADA"); $allTablesCreated = false; } } } $this->params['allTablesCreated'] = $allTablesCreated; $this->params['appModelClasses'] = $appModelClasses; $this->params['createDatabaseForApps'] = $createDatabaseForApps; return $this->render("dbStatus"); }
/** * clazz es el nombre de una clase de modelo (tambien puede ser PersistentObject). * Devuelve una estructura multiple con los nombres de todas las clases que heredan de clazz (hijas, nietas, etc) */ public static function getAllSubclassesOf($clazz) { //echo "<h1>ModelUtils.getAllSubclassesOf $clazz</h1>"; //Logger::struct( get_declared_classes(), "Declared classes ".__FILE__." ".__LINE__ ); // Esto en realidad se deberia hacer con getLoadedModelClasses // porque ModelUtils es para resolver temas de las clases del modelo. //$loadedClasses = YuppLoader::getLoadedClasses(); // Como las clases cargadas dependen de la aplicacion, // me ancargo de cargar todas las clases de la aplicacion // actual para obtener correctamente las subclases. // Mismo codigo que getSubclassesOf. $ctx = YuppContext::getInstance(); $appName = $ctx->getApp(); if ($appName == 'core') { // Si no se cargaron todas las clases y no se pasa el nombre de la app, no devuelve realmente todas las subclases, solo las que estan cargadas. YuppLoader::loadModel(); // Carga el modelo de todas las aplicaciones } else { // TODO: metodo para cargar todas las clases del modelo de una aplicacion. $classes = array(); // FIXME: Mismo codigo que CoreController.dbStatus YuppLoader::load('core.app', 'App'); // Puede no estar cargada $app = new App($appName); $modelClassFileNames = $app->getModel(); // Logger::struct( $modelClassFileNames, "modelClassFileNames ".__FILE__." ".__LINE__ ); $modelClassFileNames = self::array_flatten($modelClassFileNames); $fn = new FileNames(); foreach ($modelClassFileNames as $classFileName) { $fileInfo = $fn->getFileNameInfo($classFileName); YuppLoader::load($fileInfo['package'], $fileInfo['name']); } } $loadedClasses = YuppLoader::getLoadedModelClasses(); $res = array(); foreach ($loadedClasses as $loadedClass) { if (class_exists($loadedClass) && is_subclass_of($loadedClass, $clazz)) { $res[] = $loadedClass; } } return $res; }
/** * Genera una TestSuite con los TestCase definidos para esta aplicacion. */ public function loadTests() { $dir = dir($this->path . '/tests'); $testCases = array(); // Recorre directorio de la aplicacion while (false !== ($test = $dir->read())) { //echo $test.'<br/>'; // Se queda solo con los nombres de los directorios if (is_file($this->path . '/tests/' . $test) && String::endsWith($test, 'class.php')) { $testCases[] = $test; } } // Crea instancias de las clases testcase $suite = new TestSuite(); foreach ($testCases as $testCaseFile) { $fi = FileNames::getFilenameInfo($testCaseFile); $clazz = $fi['name']; //print_r($fi); YuppLoader::load($fi['package'], $clazz); $suite->addTestCase(new $clazz($suite)); } return $suite; }
public static function isLoadedClass($package, $clazz) { $cl = YuppLoader::getInstance(); $filename = FileNames::getClassFilename($package, $clazz); $path = "."; if (PackageNames::isModelPackage($package)) { $path = YuppConventions::getModelPath($package); } else { $path = strtr($package, ".", "/"); } $incPath = $path . "/" . $filename; return array_key_exists($incPath, self::getLoadedClasses()); }