Skip to content

Commit

Permalink
Working on reflector. Fixed same-table joins and relationships. Other…
Browse files Browse the repository at this point in the history
… minor fixes.
  • Loading branch information
KrisJordan committed Nov 17, 2008
1 parent 8e4a58e commit e495024
Show file tree
Hide file tree
Showing 24 changed files with 460 additions and 131 deletions.
3 changes: 3 additions & 0 deletions apps/blog/controllers/PostsController.class.php
@@ -1,4 +1,7 @@
<?php
Library::import('blog.models.Post');
Library::import('blog.models.Comment');


/** !View Native, Prefix: home/ */
class PostsController extends Controller {
Expand Down
11 changes: 10 additions & 1 deletion apps/blog/models/Post.class.php
Expand Up @@ -2,8 +2,17 @@
Library::import('blog.models.Comment');

/**
* !HasMany comments
* !HasMany comments, OnDelete: Cascade
* !BelongsTo author, Class: User
* !HasMany tags, Through: PostsTags
*/
class Post extends Model { }

class BlogController extends Controller {
/** !Route GET, /posts/ */
function showPosts() {
$this->posts = Make::a('Post')->all();
}
}

?>
Expand Up @@ -3,27 +3,86 @@
Library::import('recess.http.responses.NotFoundResponse');
Library::import('recess.http.responses.OkResponse');

Library::import('recess.apps.ide.models.RecessReflectorClass');
Library::import('recess.apps.ide.models.RecessReflectorPackage');
Library::import('recess.apps.ide.models.RecessReflectorProperty');
Library::import('recess.apps.ide.models.RecessReflectorMethod');

/**
* !View Smarty, Prefix: reflector/
* !View Native, Prefix: reflector/
*/
class RecessReflectorController extends Controller {

/** !Route GET, reflector/model/$fullyQualifiedModel */
public function model($fullyQualifiedModel) {
if(!Library::classExists($fullyQualifiedModel)) {
return new NotFoundResponse($this->request);
/** !Route GET, reflector/index/ */
public function index() {
$this->recursiveIndex($_ENV['dir.apps']);
$this->recursiveIndex($_ENV['dir.lib']);
exit;
}

private function recursiveIndex($base, $dir = '') {
$dirInfo = scandir($base . $dir);
foreach($dirInfo as $item) {
$location = $base . $dir . '/' . $item;
if(is_dir($location) && $item[0] != '.') {
$this->recursiveIndex($base, $dir . '/' . $item);
} else {
if($item[0] == '.' || strrpos($item, '.class.php') === false) { continue; }
$fullyQualified = str_replace('/', '.', $dir . '/' . $item);
if($fullyQualified[0] == '.') {
$fullyQualified = substr($fullyQualified, 1);
}
$fullyQualified = str_replace('..', '.', $fullyQualified);
$fullyQualified = str_replace('.class.php','',$fullyQualified);

$this->indexClass($fullyQualified, $dir . '/' . $item);
}
}
}

private function indexClass($fullyQualifiedClassName, $dir) {
if(!Library::classExists($fullyQualifiedClassName)) {
return false;
}

$model = Library::getClassName($fullyQualifiedClassName);
$reflectorClass = new RecessReflectorClass();
$reflectorClass->name = $model;
if(!$reflectorClass->exists()) {
$reflectorClass->fromClass($model, $dir);
}

return $reflectorClass;
}

/** !Route GET, reflector/class/$fullyQualifiedModel */
public function classInfo($fullyQualifiedModel) {
$result = $this->indexClass($fullyQualifiedModel, '');

if($result === false) {
return new NotFoundResponse($this->request);
}

$model = Library::getClassName($fullyQualifiedModel);
$reflection = new RecessReflectionClass($model);

$this->reflection = $reflection;
$this->relationships = Model::getRelationships($model);
$this->columns = Model::getColumns($model);
$this->table = Model::tableFor($model);

return $this->ok();
$this->source = Model::sourceNameFor($model);
$this->reflector = $result;
}

/** !Route GET, reflector/package/$package */
function packageInfo ($package) {

Library::import('recess.apps.ide.models.RecessReflectorPackage');
$package = new RecessReflectorPackage($package);
$this->package = $package->find()->first();

}


/** !Route GET, reflector/model/$fullyQualifiedModel/create */
function createTable ($fullyQualifiedModel) {
Expand All @@ -45,11 +104,23 @@ function createTable ($fullyQualifiedModel) {
foreach($props as $prop) {
if($first) { $first = false; }
else { $this->sql .= ', '; }

$this->sql .= $prop->name . ' ' . $prop->type;

if($prop->isPrimaryKey) {
$this->sql .= ' PRIMARY KEY';
if($prop->autoincrement) {
$this->sql .= ' AUTOINCREMENT';
}
}
}

$this->sql .= ' );';

$source = Model::sourceFor($class);

$source->executeStatement($this->sql, array());

}

}
Expand Down
57 changes: 55 additions & 2 deletions lib/recess/apps/ide/models/RecessReflectorClass.class.php
@@ -1,11 +1,14 @@
<?php
Library::import('recess.sources.db.orm.Model');
Library::import('recess.apps.ide.models.RecessReflectorClassProperties');
Library::import('recess.apps.ide.models.RecessReflectorClassMethods');

/**
* !HasMany properties, Class: RecessReflectorProperty, Through: ClassProperties, ForeignKey: propertyId
* !HasMany methods, Class: RecessReflectorMethod, Through: ClassMethods, ForeignKey: methodId
* !HasMany properties, Class: RecessReflectorProperty, Through: RecessReflectorClassProperties, ForeignKey: propertyId, OnDelete: Delete
* !HasMany methods, Class: RecessReflectorMethod, Through: RecessReflectorClassMethods, ForeignKey: methodId, OnDelete: Delete
* !BelongsTo package, Class: RecessReflectorPackage, ForeignKey: packageId
* !BelongsTo parent, Class: RecessReflectorClass, ForeignKey: parentId
* !HasMany children, Class: RecessReflectorClass, ForeignKey: parentId
* !Table classes
* !Source reflector
*/
Expand Down Expand Up @@ -38,5 +41,55 @@ class RecessReflectorClass extends Model {
/** !Type integer */
public $lastModified;

public function fromClass($class, $dir = '') {

$classInfo = new RecessReflectionClass($class);

$this->docComment = $classInfo->getDocComment();

$this->file = $classInfo->getFileName();

$this->lastModified = filemtime($this->file);

$package = Library::getPackage($class);

if($dir != '') {
if(strpos($dir, '/' . str_replace('.','/',$package)) !== 0) {
throw new RecessException('The class: ' . $class . ' has been imported incorectly with ' . $package . '.' . $class . '. The real location is: ' . $dir, get_defined_vars());
}
}

if($package != '') {
$packageReflector = new RecessReflectorPackage();
$packageReflector->name = $package;
$packageInstance = $packageReflector->find()->first();

if($packageReflector->exists()) {
$this->setPackage($packageReflector->find()->first());
} else {
$packageReflector->insert();
$this->setPackage($packageReflector);
}
}

$this->save();

$parent = $classInfo->getParentClass();

if($parent != null) {
$parentReflectorClass = new RecessReflectorClass();
$parentReflectorClass->name = $parent->name;
$exists = $parentReflectorClass->find()->first();
if(!$exists) {
$parentReflectorClass->fromClass($parent->name);
$this->setParent($parentReflectorClass);
} else {
$this->setParent($exists);
}
}


}

}
?>
12 changes: 12 additions & 0 deletions lib/recess/apps/ide/models/RecessReflectorClassMethods.class.php
@@ -0,0 +1,12 @@
<?php

/**
* !BelongsTo class, Class: RecessReflectorClass
* !BelongsTo method, Class: RecessReflectorMethod
* !Table classMethods
*/
class RecessReflectorClassMethods extends Model {

}

?>
@@ -0,0 +1,12 @@
<?php

/**
* !BelongsTo class, Class: RecessReflectorClass
* !BelongsTo property, Class: RecessReflectorProperty
* !Table classProperties
*/
class RecessReflectorClassProperties extends Model {

}

?>
28 changes: 26 additions & 2 deletions lib/recess/apps/ide/models/RecessReflectorPackage.class.php
Expand Up @@ -2,9 +2,9 @@
Library::import('recess.sources.db.orm.Model');

/**
* !HasMany recessReflectorClasses, Class: RecessReflectorClass
* !HasMany classes, Class: RecessReflectorClass, ForeignKey: packageId
* !HasMany children, Class: RecessReflectorPackage, ForeignKey: parentId
* !BelongsTo parent, Class: RecessReflectorPackage
* !BelongsTo parent, Class: RecessReflectorPackage, ForeignKey: parentId
* !Table packages
*/
class RecessReflectorPackage extends Model {
Expand All @@ -30,6 +30,30 @@ function childrenAlphabetically() {
return $this->children()->orderBy('name ASC');
}

function __construct($name = '') {
if($name != '') {
$this->name = $name;
}
}

function insert() {
echo 'Inserting package: ' . $this->name . '<br />';
parent::insert();

$dotPosition = strrpos($this->name, Library::dotSeparator);

if($dotPosition !== false) {
$parentName = substr($this->name, 0, $dotPosition);

$parent = new RecessReflectorPackage($parentName);

if(!$parent->exists()) {
$parent->insert();
}
$this->setParent($parent);
}
}

}

?>
3 changes: 0 additions & 3 deletions lib/recess/apps/ide/views/model.php

This file was deleted.

0 comments on commit e495024

Please sign in to comment.