2009-06-18 01:14:40 +02:00
< ? php
/**
* Base class for URL access to development tools . Currently supports the
* ; and TaskRunner .
*
* @ todo documentation for how to add new unit tests and tasks
* @ package sapphire
* @ subpackage dev
*/
class DevelopmentAdmin extends Controller {
static $url_handlers = array (
'' => 'index' ,
2010-10-15 01:57:02 +02:00
'build/defaults' => 'buildDefaults' ,
2009-06-18 01:14:40 +02:00
'$Action' => '$Action' ,
'$Action//$Action/$ID' => 'handleAction' ,
);
2011-02-13 23:14:51 +01:00
static $allowed_actions = array (
'index' ,
'tests' ,
'jstests' ,
'tasks' ,
'viewmodel' ,
'build' ,
'reset' ,
'viewcode'
);
2009-06-18 01:14:40 +02:00
function init () {
parent :: init ();
2010-10-15 05:43:30 +02:00
// Special case for dev/build: Defer permission checks to DatabaseAdmin->init() (see #4957)
$requestedDevBuild = ( stripos ( $this -> request -> getURL (), 'dev/build' ) === 0 );
2009-06-18 01:14:40 +02:00
// We allow access to this controller regardless of live-status or ADMIN permission only
// if on CLI. Access to this controller is always allowed in "dev-mode", or of the user is ADMIN.
2010-10-15 05:43:30 +02:00
$canAccess = (
$requestedDevBuild
|| Director :: isDev ()
|| Director :: is_cli ()
// Its important that we don't run this check if dev/build was requested
|| Permission :: check ( " ADMIN " )
);
if ( ! $canAccess ) return Security :: permissionFailure ( $this );
2009-06-18 01:14:40 +02:00
// check for valid url mapping
// lacking this information can cause really nasty bugs,
// e.g. when running Director::test() from a FunctionalTest instance
global $_FILE_TO_URL_MAPPING ;
if ( Director :: is_cli ()) {
if ( isset ( $_FILE_TO_URL_MAPPING )) {
2010-04-13 01:15:04 +02:00
$fullPath = $testPath = BASE_PATH ;
2009-06-26 04:46:14 +02:00
while ( $testPath && $testPath != " / " && ! preg_match ( '/^[A-Z]:\\\\$/' , $testPath )) {
2009-06-18 01:14:40 +02:00
$matched = false ;
if ( isset ( $_FILE_TO_URL_MAPPING [ $testPath ])) {
$matched = true ;
break ;
}
$testPath = dirname ( $testPath );
}
if ( ! $matched ) {
echo 'Warning: You probably want to define ' .
'an entry in $_FILE_TO_URL_MAPPING that covers "' . Director :: baseFolder () . '"' . " \n " ;
}
}
else {
echo 'Warning: You probably want to define $_FILE_TO_URL_MAPPING in ' .
2009-11-06 04:35:07 +01:00
'your _ss_environment.php as instructed on the "sake" page of the doc.silverstripe.org wiki' . " \n " ;
2009-06-18 01:14:40 +02:00
}
}
}
function index () {
$actions = array (
2010-10-15 04:56:21 +02:00
" build " => " Build/rebuild this environment. Call this whenever you have updated your project sources " ,
2009-06-28 04:54:01 +02:00
" buildcache " => " Rebuild the static cache, if you're using StaticPublisher " ,
2009-06-18 01:14:40 +02:00
" tests " => " See a list of unit tests to run " ,
" tests/all " => " Run all tests " ,
2010-04-13 03:55:09 +02:00
" tests/startsession " => " Start a test session in your browser (gives you a temporary database with default content) " ,
" tests/endsession " => " Ends a test session " ,
2009-06-18 01:14:40 +02:00
" jstests " => " See a list of JavaScript tests to run " ,
" jstests/all " => " Run all JavaScript tests " ,
" tasks " => " See a list of build tasks to run " ,
" viewcode " => " Read source code in a literate programming style " ,
);
// Web mode
if ( ! Director :: is_cli ()) {
// This action is sake-only right now.
unset ( $actions [ " modules/add " ]);
2010-10-15 05:43:30 +02:00
$renderer = Object :: create ( 'DebugView' );
2009-06-18 01:14:40 +02:00
$renderer -> writeHeader ();
$renderer -> writeInfo ( " Sapphire Development Tools " , Director :: absoluteBaseURL ());
$base = Director :: baseURL ();
echo '<div class="options"><ul>' ;
foreach ( $actions as $action => $description ) {
echo " <li><a href= \" { $base } dev/ $action\ " >< b >/ dev / $action :</ b > $description </ a ></ li > \n " ;
}
$renderer -> writeFooter ();
// CLI mode
} else {
echo " SAPPHIRE DEVELOPMENT TOOLS \n -------------------------- \n \n " ;
echo " You can execute any of the following commands: \n \n " ;
foreach ( $actions as $action => $description ) {
echo " sake dev/ $action : $description\n " ;
}
echo " \n \n " ;
}
}
function tests ( $request ) {
2010-10-15 05:43:30 +02:00
return Object :: create ( 'TestRunner' );
2009-06-18 01:14:40 +02:00
}
function jstests ( $request ) {
2010-10-15 05:43:30 +02:00
return Object :: create ( 'JSTestRunner' );
2009-06-18 01:14:40 +02:00
}
function tasks () {
2010-10-15 05:43:30 +02:00
return Object :: create ( 'TaskRunner' );
2009-06-18 01:14:40 +02:00
}
function viewmodel () {
2010-10-15 05:43:30 +02:00
return Object :: create ( 'ModelViewer' );
2009-06-18 01:14:40 +02:00
}
2010-10-15 05:43:30 +02:00
function build ( $request ) {
2009-06-18 01:14:40 +02:00
if ( Director :: is_cli ()) {
2010-10-15 05:43:30 +02:00
$da = Object :: create ( 'DatabaseAdmin' );
return $da -> handleRequest ( $request );
2009-06-18 01:14:40 +02:00
} else {
2010-10-15 05:43:30 +02:00
$renderer = Object :: create ( 'DebugView' );
2009-06-18 01:14:40 +02:00
$renderer -> writeHeader ();
2010-10-15 04:56:21 +02:00
$renderer -> writeInfo ( " Environment Builder " , Director :: absoluteBaseURL ());
2009-06-18 01:14:40 +02:00
echo " <div style= \" margin: 0 2em \" > " ;
2010-12-11 06:43:08 +01:00
echo " <div class= \" status pending \" ><h2 class='buildProgress'>Database is building.... Check below for any errors</h2><h2 class='buildCompleted'>Database has been built successfully</h2></div> " ;
2009-06-18 01:14:40 +02:00
2010-10-15 05:43:30 +02:00
$da = Object :: create ( 'DatabaseAdmin' );
return $da -> handleRequest ( $request );
2009-06-18 01:14:40 +02:00
echo " </div> " ;
$renderer -> writeFooter ();
}
}
2010-10-15 01:57:02 +02:00
/**
* Build the default data , calling requireDefaultRecords on all
* DataObject classes
* Should match the $url_handlers rule :
* 'build/defaults' => 'buildDefaults' ,
*/
function buildDefaults () {
2010-10-15 05:43:30 +02:00
$da = Object :: create ( 'DatabaseAdmin' );
2010-10-15 01:57:02 +02:00
if ( ! Director :: is_cli ()) {
2010-10-15 05:43:30 +02:00
$renderer = Object :: create ( 'DebugView' );
2010-10-15 01:57:02 +02:00
$renderer -> writeHeader ();
$renderer -> writeInfo ( " Defaults Builder " , Director :: absoluteBaseURL ());
echo " <div style= \" margin: 0 2em \" > " ;
}
$da -> buildDefaults ();
if ( ! Director :: is_cli ()) {
echo " </div> " ;
$renderer -> writeFooter ();
}
}
2009-06-18 01:14:40 +02:00
function reset () {
2010-04-13 03:55:09 +02:00
$link = BASE_URL . '/dev/tests/startsession' ;
2009-06-18 01:14:40 +02:00
2010-04-13 03:55:09 +02:00
return " <p>The dev/reset feature has been removed. If you are trying to test your site " .
" with a clean datababase, we recommend that you use " .
" <a href= \" $link\ " > dev / test / startsession </ a > " .
" instead.</P> " ;
2009-06-18 01:14:40 +02:00
}
function errors () {
Director :: redirect ( " Debug_ " );
}
function viewcode ( $request ) {
2010-10-15 05:43:30 +02:00
return Object :: create ( 'CodeViewer' );
2009-06-18 01:14:40 +02:00
}
}