egroupware/doc/fix_api.php

235 lines
7.5 KiB
PHP
Raw Normal View History

#!/usr/bin/env php -qC
<?php
/**
* EGroupware - check namespace usage in converted code
*
* @link http://www.egroupware.org
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @author Ralf Becker <rb@stylite.de>
* @copyright 2016 by Ralf Becker <rb@stylite.de>
* @version $Id$
*/
if (php_sapi_name() !== 'cli') // security precaution: forbit calling as web-page
{
die('<h1>fix_api.php must NOT be called as web-page --> exiting !!!</h1>');
}
// raw replacements
$replace = array(
"#use EGroupware\\Api;#" => '', // remove evtl. use EGroupware\Api, as we add it again below
"#<\?php\n/\*\*.*\*/#msU" => "\$0\n\nuse EGroupware\\Api;",
'#egw_framework::csp_connect_src_attrs\(#' => "Api\\Header\\ContentSecurityPolicy::add('connect-src', ",
'#egw_framework::csp_frame_src_attrs\(#' => "Api\\Header\\ContentSecurityPolicy::add('frame-src', ",
'#egw_framework::csp_script_src_attrs\(#' => "Api\\Header\\ContentSecurityPolicy::add('script-src', ",
'#egw_framework::csp_style_src_attrs\(#' => "Api\\Header\\ContentSecurityPolicy::add('style-src', ",
"#egw_session::appsession\(([^,]+),\s*('[^']+')\)#" => 'Api\\Cache::getSession($2, $1)',
"#egw_session::appsession\(([^,]+),\s*('[^']+'),\s*#" => 'Api\\Cache::setSession($2, $1, ',
"#\\\$GLOBALS\['egw'\]->session->appsession\(([^,]+),\s*('[^']+')\)#" => 'Api\\Cache::getSession($2, $1)',
"#\\\$GLOBALS\['egw'\]->session->appsession\(([^,]+),\s*('[^']+'),\s*#" => 'Api\\Cache::setSession($2, $1, ',
"#\\\$GLOBALS\['egw'\]->common->#" => 'common::',
);
// enclose class-names and static methods with some syntax check
$class_start = '#([\[\s,;(])';
$class_end = '(::|\\(|;|\?|:|\\s|$)#';
foreach(array(
'accounts' => 'Api\\Accounts',
//'acl' => 'Api\Acl',
//'applications' => 'Api\Applications',
//'asyncservice' => 'Api\AsyncService',
'auth' => 'Api\\Auth',
'categories' => 'Api\\Categories',
'config::get_customfields' => 'Api\\Storage\\Customfields::get',
'config' => 'Api\\Config',
'common::image' => 'Api\\Image::find',
'common::egw_exit' => 'exit',
//'common' list single methods like
//'country' => 'Api\\Country',
//'egw' =>
'egw_cache' => 'Api\\Cache',
'egw_ckeditor_config' => 'Api\\Html\\CkEditorConfig',
'egw_customfields' => 'Api\\Storage\\Customfields',
'egw_db' => 'Api\\Db',
'egw_digest_auth' => 'Api\\Header\\Authentication',
'egw_exception' => 'Api\\Exception',
'egw_exception_no_permission' => 'Api\\Exception\\NoPermission',
'egw_exception_no_permission_app' => 'Api\\Exception\\NoPermission\\App',
'egw_exception_no_permission_admin' => 'Api\\Exception\\NoPermission\\Admin',
'egw_exception_no_permission_record' => 'Api\\Exception\\NoPermission\\Record',
'egw_exception_not_found' => 'Api\\Exception\\NotFound',
'egw_exception_assertion_failed' => 'Api\\Exception\\AssertionFailed',
'egw_exception_wrong_parameter' => 'Api\\Exception\\WrongParameter',
'egw_exception_wrong_userinput' => 'Api\\Exception\\WrongUserinput',
'egw_exception_db' => 'Api\\Db\\Exception',
'egw_exception_db_invalid_sql' => 'Api\\Db\\Exception\\InvalidSql',
'egw_exception_redirect' => 'Api\\Exception\\Redirect',
//'egw_favorites' =>
//'egw_framework' =>
//'egw_ical_iterator' =>
'egw_json_request' => 'Api\\Json\\Request',
'egw_json_response' => 'Api\\Json\\Response',
'egw_link' => 'Api\\Link',
//'egw_mailer' =>
'egw_session' => 'Api\\Session',
//'egw_tail' =>
'egw_time' => 'Api\\DateTime',
'egw_vfs' => 'Api\\Vfs',
//'groupdav*' =>
'historylog' => 'Api\\Storage\\History',
//'hooks' =>
'html::\$user_agent' => 'Api\\Header\\UserAgent::type()',
'html::\$ua_version' => 'Api\\Header\\UserAgent::version()',
'html::\$ua_mobile' => 'Api\\Header\\UserAgent::mobile()',
'html::safe_content_header' => 'Api\\Header\\Content::safe',
'html::content_header' => 'Api\\Header\\Content::type',
'html::content_disposition_header' => 'Api\\Header\\Content::disposition',
'html' => 'Api\\Html',
'iface_stream_wrapper' => 'Api\\Vfs\\StreamWrapperIface',
'mime_magic' => 'Api\\MimeMagic',
'preferences' => 'Api\\Preferences',
'solink' => 'Api\\Link\\Storage',
'sqlfs_stream_wrapper' => 'Api\\Vfs\\Sqlfs\\StreamWrapper',
'sqlfs_utils' => 'Api\\Vfs\\Sqlfs\\Utils',
// todo translation mail specific stuff
'translation' => 'Api\\Translation',
// etemplate2
'etemplate_new' => 'Api\\Etemplate',
'etemplate_widget' => 'Api\\Etemplate\\Widget',
'etemplate_widget_entry' => 'Api\\Etemplate\\Widget\\Entry',
'etemplate_widget_tree' => 'Api\\Etemplate\\Widget\\Tree',
'etemplate_widget_select' => 'Api\\Etemplate\\Widget\\Select',
'etemplate_widget_link' => 'Api\\Etemplate\\Widget\\Link',
'etemplate_widget_nextmatch' => 'Api\\Etemplate\\Widget\\Nextmatch',
'etemplate_widget_taglist' => 'Api\\Etemplate\\Widget\\Taglist',
'etemplate_widget_file' => 'Api\\Etemplate\\Widget\\File',
'etemplate_widget_vfs' => 'Api\\Etemplate\\Widget\\Vfs',
'etemplate_request' => 'Api\\Etemplate\\Request',
'nextmatch_widget::category_action' => 'Api\\Etemplate\\Widget\\Nextmatch::category_action',
// so_sql and friends
'so_sql' => 'Api\\Storage\\Base',
'so_sql_cf' => 'Api\\Storage',
'so_sql2' => 'Api\\Storage\\Base2',
'bo_tracking' => 'Api\\Storage\\Tracking',
//'bo_merge' =>
// addressbook backend
'addressbook_bo' => 'Api\\Contacts',
'addressbook_so' => 'Api\\Contacts\\Storage',
) as $from => $to)
{
$replace[$class_start.$from.$class_end] = '$1'.$to.'$2';
}
//print_r($replace);
/**
* Check namespace usage in converted code
*
* @param string $file filename
* @return boolean false on error
*/
function fix_api($file)
{
global $prog, $replace;
if (basename($file) == $prog) return true; // dont fix ourself ;-)
if (($content = file_get_contents($file)) === false) return false;
if (!preg_match("|<\?php\n/\*\*.*\*/|msU", $content))
{
error_log("No file-level phpDoc block found in $file to add 'use EGroupware\\Api;'\n");
return;
}
$content = preg_replace(array_keys($replace), array_values($replace), $content);
// shorten some classes, if used, with further use declarations
foreach(array('Api\\Etemplate', 'Api\\Vfs') as $namespace)
{
if (strpos($content, $namespace) !== false && strpos($content, 'use EGroupware\\'.$namespace) === false)
{
$content = strtr($content, array(
$namespace => str_replace('Api\\', '', $namespace),
"use EGroupware\\Api;" => "use EGroupware\\Api;\nuse EGroupware\\$namespace;"
));
}
}
die($content);
//print_r($use);
return true;
}
/**
* Loop recursive through directory and call fix_api for each php file
*
* @param string $dir
* @return boolean false on error
*/
function fix_api_recursive($dir)
{
if (!is_dir($dir)) return false;
foreach(scandir($dir) as $file)
{
if ($file == '.' || $file == '..') continue;
if (is_dir($dir.'/'.$file))
{
fix_api_recursive($dir.'/'.$file);
}
elseif(substr($file,-4) == '.php')
{
echo "\r".str_repeat(' ',100)."\r".$dir.'/'.$file.': ';
fix_api($dir.'/'.$file);
}
}
echo "\r".str_repeat(' ',100)."\r";
return true;
}
/**
* Give usage
*
* @param string $error =null
*/
function usage($error=null)
{
global $prog;
echo "Usage: $prog [-h|--help] file or dir\n\n";
if ($error) echo $error."\n\n";
exit($error ? 1 : 0);
}
$args = $_SERVER['argv'];
$prog = basename(array_shift($args));
if (!$args) usage();
$replace_file = false;
while(($arg = array_shift($args)))
{
switch($arg)
{
case '-h':
case '--help':
usage();
break;
default:
if ($args) // not last argument
{
usage("Unknown argument '$arg'!");
}
break 2;
}
}
if (!file_exists($arg)) usage("Error: $arg not found!");
if (!is_dir($arg))
{
fix_api($arg,$replace_file);
}
else
{
fix_api_recursive($arg,$replace_file);
}