aliroExtensionInstaller Class Reference

Inheritance diagram for aliroExtensionInstaller:

aliroFriendlyBase

List of all members.

Public Member Functions

 __construct ($xmlfile)
 install ()
 removeComponent ($handler, $extension)

Protected Member Functions

 extensionExists ($extension)
 doPackageCode ($extension, $file, $class, $retro)
 createExtension ()
 getXML ($properties)
 handleClasses ($extension)
 handleClassFiles ($classfiles, $extension, $side, $classRequired=false)
 putFilesInPlace ($extension)
 moveFiles ($files, $path, $subdir='')
 doQueries ($queries)
 doJQueries ($jqueries)
 createComponentMenu ($item, $name, $parent, $toplevel=false)
 install_component ($isUpgrade, $extension)
 install_module ($isUpgrade, $extension)
 install_mambot ($isUpgrade, $extension)

Protected Attributes

 $xmlfile = ''
 $xmlobject = null
 $here = ''
 $purifier = null
 $handler = null


Detailed Description

Definition at line 96 of file aliroExtensionInstaller.php.


Constructor & Destructor Documentation

aliroExtensionInstaller::__construct ( xmlfile  ) 

Definition at line 108 of file aliroExtensionInstaller.php.

References $xmlfile, and aliroRequest::getInstance().

00108                                            {
00109         $this->xmlfile = $xmlfile;
00110         $this->xmlobject = new aliroXML;
00111         try {
00112             $this->xmlobject->loadFile($xmlfile);
00113         } catch (aliroXMLException $exception) {
00114                 aliroRequest::getInstance()->setErrorMessage ($exception->getMessage(), _ALIRO_ERROR_FATAL);
00115                 $this->xmlobject = null;
00116         }
00117         if ($this->xmlobject) {
00118             $this->here = dirname($xmlfile).'/';
00119             $this->purifier = new HTMLPurifier;
00120         }
00121     }


Member Function Documentation

aliroExtensionInstaller::install (  ) 

Definition at line 123 of file aliroExtensionInstaller.php.

References createExtension(), doJQueries(), doPackageCode(), doQueries(), extensionExists(), aliroExtensionHandler::getExtensionTypeHandler(), aliroErrorRecorder::getInstance(), aliroRequest::getInstance(), aliroExtensionHandler::getInstance(), aliroFriendlyBase::getParam(), getXML(), handleClasses(), putFilesInPlace(), and T_().

00123                                {
00124         if (!$this->xmlobject) return;
00125         try {
00126             $extension = $this->createExtension();
00127             $isUpgrade = $this->getParam($_POST, 'upgrade') ? true : false;
00128             if ($this->extensionExists($extension)) {
00129                 if (!$isUpgrade) throw new installerException (T_('cannot be installed - already present'), $extension);
00130                 // Must be an upgrade, and $isUpgrade must be true
00131                 aliroExtensionHandler::getInstance()->removeExtensions($extension->formalname, $isUpgrade);
00132             }
00133             elseif ($isUpgrade) throw new installerException (T_('cannot be upgraded - not presently installed'), $extension);
00134             $this->handler = aliroExtensionHandler::getExtensionTypeHandler($extension->type);
00135             if (!$this->handler) throw new installerException (sprintf(T_('cannot be installed - no handler for type %s'), $extension->type), $extension);
00136             if ('component' == $extension->type) $this->admin = 1;
00137             else $this->admin = $extension->admin;
00138             $extension->store();
00139             $method = 'install_'.$extension->type;
00140             $this->putFilesInPlace($extension);
00141             $this->handleClasses($extension);
00142             if (!$isUpgrade) {
00143                 $queries = $this->getXML('install->queries->query');
00144                 if ($queries) $this->doQueries($queries);
00145                 $jqueries = $this->getXML('install->sql->file');
00146                 if ($jqueries) $this->doJQueries($jqueries);
00147             }
00148             if (method_exists($this, $method)) $this->$method($isUpgrade, $extension);
00149             if ($isUpgrade) {
00150                 if ($upgradefile = $this->getXML('upgradefile')) {
00151                     $this->doPackageCode ($extension, (string) $upgradefile, (string) $upgradefile['class'], 'com_upgrade');
00152                 }
00153             }
00154             else {
00155                 if ($installfile = $this->getXML('installfile')) {
00156                     $this->doPackageCode ($extension, (string) $installfile, (string) $installfile['class'], 'com_install');
00157                 }
00158             }
00159             $this->handler->clearCache(('component' != $extension->type));
00160             aliroRequest::getInstance()->setErrorMessage (T_('Installation completed: ').$extension->description, _ALIRO_ERROR_INFORM);
00161             return true;
00162         }
00163         catch (installerException $exception) {
00164             aliroRequest::getInstance()->setErrorMessage (sprintf($exception->getMessage(), basename($this->xmlfile), $exception->extension->formalname), _ALIRO_ERROR_FATAL);
00165         }
00166         catch (databaseException $exception) {
00167             $message = sprintf(T_('Extension XML %s database error on %s at %s'), $this->xmlfile, date('Y-M-d'), date('H:i:s'));
00168             $errorkey = "SQL/{$exception->getCode()}/installer/$exception->dbname/{$exception->getMessage()}/$exception->sql";
00169             aliroErrorRecorder::getInstance()->recordError($message, $errorkey, $message, $exception);
00170             aliroRequest::getInstance()->setErrorMessage ($message, _ALIRO_ERROR_SEVERE);
00171         }
00172         catch (xmlException $exception) {
00173             $message = $exception->getMessage();
00174             aliroErrorRecorder::getInstance()->recordError($message, $message, $message, $exception);
00175             aliroRequest::getInstance()->setErrorMessage ($message, _ALIRO_ERROR_FATAL);
00176         }
00177         return false;
00178     }

aliroExtensionInstaller::extensionExists ( extension  )  [protected]

Definition at line 180 of file aliroExtensionInstaller.php.

References aliroExtensionHandler::getInstance().

Referenced by install().

00180                                                     {
00181         return (aliroExtensionHandler::getInstance()->getExtensionByName($extension->formalname)) ? true : false;
00182     }

aliroExtensionInstaller::doPackageCode ( extension,
file,
class,
retro 
) [protected]

Definition at line 184 of file aliroExtensionInstaller.php.

References aliroErrorRecorder::getInstance(), aliroRequest::getInstance(), and T_().

Referenced by install(), and removeComponent().

00184                                                                          {
00185         if (false !== strpos($file, '..')) throw new installerException (sprintf(T_('file %s contains illegal ".."'), $file), $extension);
00186         $dofile = $this->handler->getClassPath($extension->formalname, 2).'/'.$file;
00187         if (is_file($dofile)) {
00188             try {
00189                 if ($class) {
00190                     require_once($dofile);
00191                     new $class();
00192                 }
00193                 else aliroRequest::getInstance()->invokeRetroCode($dofile, $retro);
00194             }
00195             catch (databaseException $exception) {
00196                 $message = sprintf(T_('Extension XML %s database error on %s at %s'), $this->xmlfile, date('Y-M-d'), date('H:i:s'));
00197                 $errorkey = "SQL/{$exception->getCode()}/installer/$exception->dbname/{$exception->getMessage()}/$exception->sql";
00198                 aliroErrorRecorder::getInstance()->recordError($message, $errorkey, $message, $exception);
00199             }
00200         }
00201     }

aliroExtensionInstaller::createExtension (  )  [protected]

Definition at line 203 of file aliroExtensionInstaller.php.

Referenced by install().

00203                                           {
00204         $extension = new aliroExtension;
00205         $message = $extension->populateFromXML($this->xmlobject);
00206         if ($message) throw new installerException ($message, $extension);
00207         /*
00208         $extension->name = $this->purifier->purify((string) $this->getXML('name'));
00209         $extension->type = $this->xmlobject->baseAttribute('type');
00210         if (!in_array($extension->type, $this->legalTypes)) throw new installerException (T_('has no valid type'), $extension);
00211         if ('plugin' == $extension->type) $extension->type = 'mambot';
00212         $extension->formalname = $this->purifier->purify((string) $this->getXML('formalname'));;
00213         if (!$extension->formalname AND 'component' == strtolower($extension->type)) $extension->formalname = 'com_'.str_replace(' ', '', strtolower($extension->name));
00214         if (!$extension->formalname) throw new installerException (T_('has no formal name'), $extension);
00215         // validate formalname
00216         $extension->admin = ('administrator' == $this->xmlobject->baseAttribute('client')) ? 2 : 1;
00217         if ('template' == $extension->type) {
00218             $currentDefault = aliroTemplateHandler::getInstance()->getDefaultTemplateProperty('formalname', $extension->admin);
00219             if (!$currentDefault OR $currentDefault == $extension->formalname) {
00220                 $extension->default_template = '1';
00221             }
00222         }
00223         $extension->author = $this->purifier->purify((string) $this->getXML('author'));
00224         $extension->version = $this->purifier->purify((string) $this->getXML('version'));
00225         $extension->date = $this->purifier->purify((string) $this->getXML('creationdate'));
00226         $extension->authoremail = $this->purifier->purify((string) $this->getXML('authoremail'));
00227         $extension->authorurl = $this->purifier->purify((string) $this->getXML('authorurl'));
00228         $extension->description = $this->purifier->purify((string) $this->getXML('description'));
00229         $extension->class = $this->xmlobject->baseAttribute('userclass');
00230         $extension->adminclass = $this->xmlobject->baseAttribute('adminclass');
00231         $extension->menuclass = $this->xmlobject->baseAttribute('menuclass');
00232         $extension->timestamp = date('Y-m-d');
00233         */
00234         return $extension;
00235     }

aliroExtensionInstaller::getXML ( properties  )  [protected]

Definition at line 237 of file aliroExtensionInstaller.php.

Referenced by doJQueries(), handleClasses(), install(), install_component(), putFilesInPlace(), and removeComponent().

00237                                             {
00238         return is_null($this->xmlobject) ? null : $this->xmlobject->getXML($properties);
00239     }

aliroExtensionInstaller::handleClasses ( extension  )  [protected]

Definition at line 241 of file aliroExtensionInstaller.php.

References smartClassMapper::getInstance(), smartAdminClassMapper::getInstance(), getXML(), and handleClassFiles().

Referenced by install().

00241                                                   {
00242         $side = $extension->admin & 2 ? 'admin' : 'user';
00243         $classfiles = $this->getXML('files->filename');
00244         $this->handleClassFiles ($classfiles, $extension, $side);
00245         $classfiles = $this->getXML('classfiles->filename');
00246         $this->handleClassFiles ($classfiles, $extension, $side, true);
00247         if ('component' == $extension->type) {
00248             $classfiles = $this->getXML('administration->files->filename');
00249             $this->handleClassFiles ($classfiles, $extension, 'admin');
00250             $classfiles = $this->getXML('administration->classfiles->filename');
00251             $this->handleClassFiles ($classfiles, $extension, 'admin', true);
00252         }
00253         smartAdminClassMapper::getInstance()->clearCache();
00254         smartClassMapper::getInstance()->clearCache();
00255     }

aliroExtensionInstaller::handleClassFiles ( classfiles,
extension,
side,
classRequired = false 
) [protected]

Definition at line 257 of file aliroExtensionInstaller.php.

References aliroRequest::getInstance(), aliroCoreDatabase::getInstance(), and T_().

Referenced by handleClasses().

00257                                                                                                {
00258         if ($classfiles) {
00259             $database = aliroCoreDatabase::getInstance();
00260             foreach ($classfiles as $classfile) {
00261                 $classes = explode(',', (string) $classfile['classes']);
00262                 $filename = (string) $classfile;
00263                 $filedir = dirname($filename);
00264                 $filemap = ('.' == $filedir ? '' : $filedir.'/').basename($filename, '.php');
00265                 foreach ($classes as $class) {
00266                     $class = trim($class);
00267                     if (!$class) {
00268                         if ($classRequired) aliroRequest::getInstance()->setErrorMessage (sprintf(T_('Installer error: XML file %s for extension %s - filename %s has no valid classes attribute'), basename($this->xmlfile), $extension->formalname, $filename), _ALIRO_ERROR_SEVERE);
00269                         continue;
00270                     }
00271                     $database->doSQL("INSERT INTO #__classmap VALUES (0, '$extension->type', '$extension->formalname', '$side', '$filemap', '$class')");
00272                 }
00273             }
00274         }
00275     }

aliroExtensionInstaller::putFilesInPlace ( extension  )  [protected]

Definition at line 277 of file aliroExtensionInstaller.php.

References aliroCoreDatabase::getInstance(), getXML(), moveFiles(), and T_().

Referenced by install().

00277                                                     {
00278         $xmlfilename = basename($this->xmlfile);
00279         if (!$this->handler->createDirectory($extension->formalname, $extension->admin)) {
00280             throw new installerException (sprintf(T_('unable to create user directory for %s %s'), $extension->type, $extension->formalname), $extension);
00281         }
00282         $side = ($extension->admin & 2) ? 'admin' : 'user';
00283         $dirpath = $this->handler->getPath($extension->formalname, $extension->admin);
00284         $classpath = $this->handler->getClassPath($extension->formalname, $extension->admin);
00285         $this->moveFiles($this->getXML('classfiles->filename'), $classpath);
00286         $this->moveFiles($this->getXML('files->filename'), $dirpath, $this->getXML('files->[folder]'));
00287         $this->moveFiles($this->getXML('images->filename'), $dirpath);
00288         $this->moveFiles($this->getXML('css->filename'), $dirpath);
00289         $this->moveFiles($this->getXML('media->filename'), $this->absolute_path.'/images/stories/');
00290         if ('component' == $extension->type) {
00291             if (!$this->handler->createDirectory($extension->formalname, 2)) {
00292                 throw new installerException (sprintf(T_('unable to create user directory for %s %s'), $extension->type, $extension->formalname), $extension);
00293             }
00294             $dirpath = $this->handler->getPath($extension->formalname, 2);
00295             $classpath = $this->handler->getClassPath($extension->formalname, 2);
00296             $this->moveFiles($this->getXML('administration->files->filename'), $dirpath, $this->getXML('administration->files->[folder]'));
00297             $this->moveFiles($this->getXML('administration->classfiles->filename'), $classpath);
00298             $this->moveFiles($this->getXML('administration->images->filename'), $dirpath);
00299             $this->moveFiles(array($this->getXML('installfile')), $classpath);
00300             $this->moveFiles(array($this->getXML('uninstallfile')), $classpath);
00301             $this->moveFiles(array($this->getXML('upgradefile')), $classpath);
00302             $this->moveFiles(array($xmlfilename), $this->handler->getXMLPath($extension->formalname, 2));
00303         }
00304         $this->moveFiles(array($xmlfilename), $this->handler->getXMLPath($extension->formalname, $extension->admin));
00305         aliroCoreDatabase::getInstance()->doSQL("UPDATE #__extensions SET xmlfile = '{$this->handler->getXMLRelativePath($extension->formalname, $extension->admin)}/{$xmlfilename}' WHERE formalname = '$extension->formalname'");
00306     }

aliroExtensionInstaller::moveFiles ( files,
path,
subdir = '' 
) [protected]

Definition at line 308 of file aliroExtensionInstaller.php.

References aliroFileManager::getInstance(), and T_().

Referenced by putFilesInPlace().

00308                                                              {
00309         $fromdir = $subdir ? $this->here.$subdir.'/' : $this->here;
00310         if ($files) {
00311             $fmanager = aliroFileManager::getInstance();
00312             foreach ($files as $file) {
00313                 $filename = trim((string) $file);
00314                 if ($filename) {
00315                     if (false !== strpos($filename, '..')) {
00316                         throw new installerException (sprintf(T_('file %s contains illegal ".."'), $filename), $extension);
00317                     }
00318                     else $fmanager->forceCopy($fromdir.$filename, $path.'/'.$filename, true);
00319                 }
00320             }
00321         }
00322     }

aliroExtensionInstaller::doQueries ( queries  )  [protected]

Definition at line 324 of file aliroExtensionInstaller.php.

References aliroDatabase::getInstance().

Referenced by install().

00324                                             {
00325         $database = aliroDatabase::getInstance();
00326         foreach ($queries as $query) if ($query = trim((string)$query)) $database->doSQL($query);
00327     }

aliroExtensionInstaller::doJQueries ( jqueries  )  [protected]

Definition at line 329 of file aliroExtensionInstaller.php.

References aliroDatabase::getInstance(), and getXML().

Referenced by install().

00329                                               {
00330         $database = aliroDatabase::getInstance();
00331         $subdir = $this->getXML('administration->files->[folder]').'/';
00332         foreach ($jqueries as $query) {
00333             if ($query = trim((string)$query)) {
00334                 $realquery = @file_get_contents($this->here.$subdir.$query);
00335                 if ($realquery) {
00336                     $database->setQuery($realquery);
00337                     $database->query_batch();
00338                 }
00339             }
00340         }
00341     }

aliroExtensionInstaller::createComponentMenu ( item,
name,
parent,
toplevel = false 
) [protected]

Definition at line 343 of file aliroExtensionInstaller.php.

Referenced by install_component().

00343                                                                                     {
00344         $menuitem = new aliroAdminMenu();
00345         $menuitem->name = $this->purifier->purify((string) $item);
00346         $menuitem->parent = $toplevel;
00347         $link = "index.php?option=$name";
00348         if ($toplevel AND ($linkdetail = (string) $item['link'])) {
00349             if ('&' == $linkdetail[0]) $link .= $linkdetail;
00350             else $link = 'index.php?'.$linkdetail;
00351         }
00352         elseif ($toplevel AND ($task = (string) $item['task'])) $link .= '&task='.$task;
00353         $menuitem->link = $link;
00354         $menuitem->type = 'components';
00355         $menuitem->published = 1;
00356         $menuitem->parent = $parent;
00357         $menuitem->component = $name;
00358         $menuitem->ordering = $toplevel ? $this->submenuordering++ : 0;
00359         $menuitem->store();
00360         return $menuitem->id;
00361     }

aliroExtensionInstaller::install_component ( isUpgrade,
extension 
) [protected]

Definition at line 363 of file aliroExtensionInstaller.php.

References aliroComponent, createComponentMenu(), aliroAdminMenuHandler::getInstance(), and getXML().

00363                                                                   {
00364         $mainmenu = $this->getXML('administration->menu');
00365         $component = new aliroComponent();
00366         $component->name = ($mainmenu ? $this->purifier->purify((string) $mainmenu) : $extension->name);
00367         $component->option = $component->extformalname = $extension->formalname;
00368         $component->ordering = 0;
00369         $component->class = $this->xmlobject->baseAttribute('userclass');
00370         $component->adminclass = $this->xmlobject->baseAttribute('adminclass');
00371         $component->menuclass = $this->xmlobject->baseAttribute('menuclass');
00372         $component->params = '';
00373         $component->store();
00374         if ($mainmenu) {
00375             $topid = $this->createComponentMenu ($mainmenu, $extension->formalname, aliroAdminMenuHandler::getInstance()->baseComponentMenu());
00376             $submenus = $this->getXML('administration->submenu->menu');
00377             $this->submenuordering = 1;
00378             if ($submenus) foreach ($submenus as $submenu) {
00379                 $this->createComponentMenu ($submenu, $extension->formalname, $topid, true);
00380             }
00381         }
00382         aliroAdminMenuHandler::getInstance()->clearCache(true);
00383     }

aliroExtensionInstaller::removeComponent ( handler,
extension 
)

Definition at line 385 of file aliroExtensionInstaller.php.

References $handler, doPackageCode(), aliroDatabase::getInstance(), and getXML().

00385                                                            {
00386         try {
00387             $classpath = $handler->getClassPath($extension->formalname, 2);
00388             if ($uninstallfile = $this->getXML('uninstallfile')) {
00389                 $this->handler = $handler;
00390                 $this->doPackageCode ($extension, (string) $uninstallfile, (string) $uninstallfile['class'], 'com_uninstall');
00391             }
00392             $queries = $this->getXML('uninstall->queries->query');
00393             if ($queries) foreach ($queries as $query) {
00394                 aliroDatabase::getInstance()->doSQL((string) $query);
00395             }
00396         }
00397         catch (databaseException $exception) {
00398 
00399         }
00400     }

aliroExtensionInstaller::install_module ( isUpgrade,
extension 
) [protected]

Definition at line 402 of file aliroExtensionInstaller.php.

References aliroModule, aliroCoreDatabase::getInstance(), and aliroTemplateHandler::getInstance().

00402                                                                {
00403         $module = new aliroModule();
00404         $module->title = $extension->name;
00405         $module->ordering = 99;
00406         $module->position = call_user_func(array(aliroTemplateHandler::getInstance()->getDefaultUserTemplateClass(), 'defaultModulePosition'));
00407         $module->showtitle = 1;
00408         $module->admin = $extension->admin;
00409         $module->module = $extension->formalname;
00410         $module->class = $this->xmlobject->baseAttribute('userclass');
00411         $module->adminclass = $this->xmlobject->baseAttribute('adminclass');
00412         $module->published = ('yes' == $this->xmlobject->baseAttribute('published')) ? 1 : 0;
00413         $module->store();
00414         aliroCoreDatabase::getInstance()->doSQL("INSERT INTO #__modules_menu VALUES ('$module->id', 0)");
00415     }

aliroExtensionInstaller::install_mambot ( isUpgrade,
extension 
) [protected]

Definition at line 417 of file aliroExtensionInstaller.php.

References aliroMambot, and T_().

00417                                                                {
00418         $mambot = new aliroMambot();
00419         $mambot->name = $extension->name;
00420         $mambot->ordering = 99;
00421         $mambot->element = $extension->formalname;
00422         $mambot->class = $this->xmlobject->baseAttribute('userclass');
00423         $mambot->published = ('yes' == $this->xmlobject->baseAttribute('published')) ? 1 : 0;
00424         if ($triggers = $this->xmlobject->baseAttribute('triggers')) {
00425             $mambot->triggers = $triggers;
00426             $mambot->store();
00427         }
00428         else throw new installerException (T_('is plugin but has no triggers'), $extension);
00429     }


Member Data Documentation

aliroExtensionInstaller::$xmlfile = '' [protected]

Definition at line 100 of file aliroExtensionInstaller.php.

Referenced by __construct().

aliroExtensionInstaller::$xmlobject = null [protected]

Definition at line 101 of file aliroExtensionInstaller.php.

aliroExtensionInstaller::$here = '' [protected]

Definition at line 102 of file aliroExtensionInstaller.php.

aliroExtensionInstaller::$purifier = null [protected]

Definition at line 103 of file aliroExtensionInstaller.php.

aliroExtensionInstaller::$handler = null [protected]

Definition at line 106 of file aliroExtensionInstaller.php.

Referenced by removeComponent().


The documentation for this class was generated from the following file:

Generated on Wed May 14 13:01:58 2008 for ALIRO by  doxygen 1.5.5