function loadAppConfig()
 {
     if (jApp::config()) {
         return;
     }
     $xml = simplexml_load_file(jApp::appPath('project.xml'));
     $configFile = '';
     foreach ($xml->entrypoints->entry as $entrypoint) {
         $file = (string) $entrypoint['file'];
         if ($file == $this->entryPointName) {
             $configFile = (string) $entrypoint['config'];
             break;
         }
     }
     if ($configFile == '') {
         throw new Exception("Entry point is unknown");
     }
     require_once JELIX_LIB_PATH . "core/jConfigCompiler.class.php";
     jApp::setConfig(jConfigCompiler::read($configFile, true, true, $this->entryPointName));
 }
 /**
  * init jelix configuration.
  *
  * If you need to setup a full jelix environment with a coordinator,
  * prefer to call initClassicRequest
  * @param string $config the configuration file to use, as if you were inside an entry point
  * @param string $entryPoint the entrypoint name as indicated into project.xml
  */
 protected static function initJelixConfig($config = 'index/config.ini.php', $entryPoint = 'index.php')
 {
     $config = jConfigCompiler::read($config, true, true, $entryPoint);
     jApp::setConfig($config);
     jApp::setCoord(null);
 }
 public function run()
 {
     $this->loadAppConfig();
     $module = $this->getParam('module');
     $initialVersion = $this->getOption('-ver');
     if ($initialVersion === false) {
         $initialVersion = '0.1pre';
     }
     // note: since module name are used for name of generated name,
     // only this characters are allowed
     if ($module == null || preg_match('/([^a-zA-Z_0-9])/', $module)) {
         throw new Exception("'" . $module . "' is not a valid name for a module");
     }
     // check if the module already exist or not
     $path = '';
     try {
         $path = $this->getModulePath($module);
     } catch (Exception $e) {
     }
     if ($path != '') {
         throw new Exception("module '" . $module . "' already exists");
     }
     // verify the given repository
     $repository = $this->getParam('repository', 'app:modules/');
     if (substr($repository, -1) != '/') {
         $repository .= '/';
     }
     $repositoryPath = jFile::parseJelixPath($repository);
     $iniDefault = new jIniFileModifier(jApp::mainConfigFile());
     $this->updateModulePath($iniDefault, $iniDefault->getValue('modulesPath'), $repository, $repositoryPath);
     if ($this->verbose()) {
         echo "modulePath updated in the main configuration\n";
     }
     if (!$this->allEntryPoint) {
         $list = $this->getEntryPointsList();
         foreach ($list as $k => $entryPoint) {
             if ($entryPoint['file'] == $this->entryPointName) {
                 $ini = new jIniFileModifier(jApp::configPath($entryPoint['config']));
                 break;
             }
         }
         if (!$ini) {
             throw new Exception("entry point is unknown");
         }
         $this->updateModulePath($ini, jApp::config()->modulesPath, $repository, $repositoryPath);
         if ($this->verbose()) {
             echo "modulePath updated in the configuration " . $entryPoint['config'] . "\n";
         }
     }
     $path = $repositoryPath . $module . '/';
     $this->createDir($path);
     jApp::setConfig(null);
     if ($this->getOption('-admin')) {
         $this->removeOption('-nosubdir');
         $this->removeOption('-addinstallzone');
     }
     $param = array();
     $param['module'] = $module;
     $param['default_id'] = $module . $this->config->infoIDSuffix;
     $param['version'] = $initialVersion;
     $this->createFile($path . 'module.xml', 'module/module.xml.tpl', $param);
     // create all sub directories of a module
     if (!$this->getOption('-nosubdir')) {
         $this->createDir($path . 'classes/');
         $this->createDir($path . 'zones/');
         $this->createDir($path . 'controllers/');
         $this->createDir($path . 'templates/');
         $this->createDir($path . 'classes/');
         $this->createDir($path . 'daos/');
         $this->createDir($path . 'forms/');
         $this->createDir($path . 'locales/');
         $this->createDir($path . 'locales/en_US/');
         $this->createDir($path . 'locales/fr_FR/');
         $this->createDir($path . 'install/');
         if ($this->verbose()) {
             echo "Sub directories have been created in the new module {$module}.\n";
         }
         $this->createFile($path . 'install/install.php', 'module/install.tpl', $param);
         $this->createFile($path . 'urls.xml', 'module/urls.xml.tpl', array());
     }
     $isdefault = $this->getOption('-defaultmodule');
     // activate the module in the application
     if ($isdefault) {
         $iniDefault->setValue('startModule', $module);
         $iniDefault->setValue('startAction', 'default:index');
         if ($this->verbose()) {
             echo "The new module {$module} becomes the default module\n";
         }
     }
     $iniDefault->setValue($module . '.access', $this->allEntryPoint ? 2 : 1, 'modules');
     $iniDefault->save();
     $list = $this->getEntryPointsList();
     $install = new jIniFileModifier(jApp::configPath('installer.ini.php'));
     // install the module for all needed entry points
     foreach ($list as $k => $entryPoint) {
         $configFile = jApp::configPath($entryPoint['config']);
         $epconfig = new jIniFileModifier($configFile);
         if ($this->allEntryPoint) {
             $access = 2;
         } else {
             $access = $entryPoint['file'] == $this->entryPointName ? 2 : 0;
         }
         $epconfig->setValue($module . '.access', $access, 'modules');
         $epconfig->save();
         if ($this->allEntryPoint || $entryPoint['file'] == $this->entryPointName) {
             $install->setValue($module . '.installed', 1, $entryPoint['id']);
             $install->setValue($module . '.version', $initialVersion, $entryPoint['id']);
         }
         if ($isdefault) {
             // we set the module as default module for one or all entry points.
             // we set the startModule option for all entry points except
             // if an entry point is indicated on the command line
             if ($this->allEntryPoint || $entryPoint['file'] == $this->entryPointName) {
                 if ($epconfig->getValue('startModule') != '') {
                     $epconfig->setValue('startModule', $module);
                     $epconfig->setValue('startAction', 'default:index');
                     $epconfig->save();
                 }
             }
         }
         if ($this->verbose()) {
             echo "The module is initialized for the entry point " . $entryPoint['file'] . ".\n";
         }
     }
     $install->save();
     // create a default controller
     if (!$this->getOption('-nocontroller')) {
         $agcommand = JelixScript::getCommand('createctrl', $this->config);
         $options = $this->getCommonActiveOption();
         if ($this->getOption('-cmdline')) {
             $options['-cmdline'] = true;
         }
         if ($this->getOption('-addinstallzone')) {
             $options['-addinstallzone'] = true;
         }
         $agcommand->initOptParam($options, array('module' => $module, 'name' => 'default', 'method' => 'index'));
         $agcommand->run();
     }
     if ($this->getOption('-admin')) {
         $this->createFile($path . 'classes/admin' . $module . '.listener.php', 'module/admin.listener.php.tpl', $param, "Listener");
         $this->createFile($path . 'events.xml', 'module/events.xml.tpl', $param);
         file_put_contents($path . 'locales/en_US/interface.UTF-8.properties', 'menu.item=' . $module);
         file_put_contents($path . 'locales/fr_FR/interface.UTF-8.properties', 'menu.item=' . $module);
     }
 }
示例#4
0
 protected function handleCustomTestSuite()
 {
     $modulesTests = -1;
     /*
     $this->options[0] is an array of all options '--xxx'.
       each values is an array(0=>'optionname', 1=>'value if given')
     $this->options[1] is a list of parameters given after options
       it can be array(0=>'test name', 1=>'filename')
     */
     foreach ($this->options[0] as $option) {
         switch ($option[0]) {
             case '--entrypoint':
                 $this->entryPoint = $option[1];
                 break;
             case '--all-modules':
                 $modulesTests = 0;
                 break;
             case '--module':
                 $modulesTests = 1;
                 // test is the module name
                 // testFile is the test file inside the module
                 break;
             case '--testtype':
                 $this->testType = $option[1];
                 break;
         }
     }
     if (isset($this->options[1][1]) && $modulesTests != 0) {
         // a specifique test file
         $this->arguments['testFile'] = $this->options[1][1];
     } else {
         $this->arguments['testFile'] = '';
     }
     $appInstaller = new jInstallerApplication();
     $this->epInfo = $appInstaller->getEntryPointInfo($this->entryPoint);
     // let's load configuration now, and coordinator. it could be needed by tests
     // (during load of their php files or during execution)
     jApp::setConfig(jConfigCompiler::readAndCache($this->epInfo->configFile, null, $this->entryPoint));
     jApp::setCoord(new jCoordinator('', false));
     if ($modulesTests == 0) {
         // we add all modules in the test list
         $suite = $this->getAllModulesTestSuites();
         if (count($suite)) {
             $this->arguments['test'] = $suite;
             unset($this->arguments['testFile']);
         } else {
             $this->showMessage("Error: no tests in modules\n");
             exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT);
         }
     } else {
         if ($modulesTests == 1 && !$this->version36) {
             $suite = $this->getModuleTestSuite($this->options[1][0]);
             if (count($suite)) {
                 $this->arguments['test'] = $suite;
                 if (isset($this->options[1][1])) {
                     // a specifique test file
                     $this->arguments['testFile'] = $this->options[1][1];
                 } else {
                     $this->arguments['testFile'] = '';
                 }
             } else {
                 $this->showMessage("Error: no tests in the module\n");
                 exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT);
             }
         } else {
             if ($modulesTests == 1) {
                 if (isset($this->options[1][1])) {
                     // a specifique test file
                     $suite = $this->getModuleTestSuite($this->options[1][0], $this->options[1][1]);
                 } else {
                     $suite = $this->getModuleTestSuite($this->options[1][0]);
                 }
                 if (count($suite)) {
                     $this->arguments['test'] = $suite;
                 } else {
                     $this->showMessage("Error: no tests in the module\n");
                     exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT);
                 }
             }
         }
     }
 }
示例#5
0
 protected function _installModules(&$modules, $epId, $installWholeApp, $flags = 3)
 {
     $this->notice('install.entrypoint.start', $epId);
     $ep = $this->entryPoints[$epId];
     jApp::setConfig($ep->config);
     if ($ep->config->disableInstallers) {
         $this->notice('install.entrypoint.installers.disabled');
     }
     $result = $this->checkDependencies($modules, $epId);
     if (!$result) {
         $this->error('install.bad.dependencies');
         $this->ok('install.entrypoint.bad.end', $epId);
         return false;
     }
     $this->ok('install.dependencies.ok');
     $componentsToInstall = array();
     foreach ($this->_componentsToInstall as $item) {
         list($component, $toInstall) = $item;
         try {
             if ($flags == self::FLAG_MIGRATION_11X) {
                 $this->installerIni->setValue($component->getName() . '.installed', 1, $epId);
                 $this->installerIni->setValue($component->getName() . '.version', $component->getSourceVersion(), $epId);
                 if ($ep->config->disableInstallers) {
                     $upgraders = array();
                 } else {
                     $upgraders = $component->getUpgraders($ep);
                     foreach ($upgraders as $upgrader) {
                         $upgrader->preInstall();
                     }
                 }
                 $componentsToInstall[] = array($upgraders, $component, false);
             } else {
                 if ($toInstall) {
                     if ($ep->config->disableInstallers) {
                         $installer = null;
                     } else {
                         $installer = $component->getInstaller($ep, $installWholeApp);
                     }
                     $componentsToInstall[] = array($installer, $component, $toInstall);
                     if ($flags & self::FLAG_INSTALL_MODULE && $installer) {
                         $installer->preInstall();
                     }
                 } else {
                     if ($ep->config->disableInstallers) {
                         $upgraders = array();
                     } else {
                         $upgraders = $component->getUpgraders($ep);
                     }
                     if ($flags & self::FLAG_UPGRADE_MODULE && count($upgraders)) {
                         foreach ($upgraders as $upgrader) {
                             $upgrader->preInstall();
                         }
                     }
                     $componentsToInstall[] = array($upgraders, $component, $toInstall);
                 }
             }
         } catch (jInstallerException $e) {
             $result = false;
             $this->error($e->getLocaleKey(), $e->getLocaleParameters());
         } catch (Exception $e) {
             $result = false;
             $this->error('install.module.error', array($component->getName(), $e->getMessage()));
         }
     }
     if (!$result) {
         $this->warning('install.entrypoint.bad.end', $epId);
         return false;
     }
     $installedModules = array();
     try {
         foreach ($componentsToInstall as $item) {
             list($installer, $component, $toInstall) = $item;
             if ($toInstall) {
                 if ($installer && $flags & self::FLAG_INSTALL_MODULE) {
                     $installer->install();
                 }
                 $this->installerIni->setValue($component->getName() . '.installed', 1, $epId);
                 $this->installerIni->setValue($component->getName() . '.version', $component->getSourceVersion(), $epId);
                 $this->installerIni->setValue($component->getName() . '.version.date', $component->getSourceDate(), $epId);
                 $this->installerIni->setValue($component->getName() . '.firstversion', $component->getSourceVersion(), $epId);
                 $this->installerIni->setValue($component->getName() . '.firstversion.date', $component->getSourceDate(), $epId);
                 $this->ok('install.module.installed', $component->getName());
                 $installedModules[] = array($installer, $component, true);
             } else {
                 $lastversion = '';
                 foreach ($installer as $upgrader) {
                     if ($flags & self::FLAG_UPGRADE_MODULE) {
                         $upgrader->install();
                     }
                     $this->installerIni->setValue($component->getName() . '.version', $upgrader->version, $epId);
                     $this->installerIni->setValue($component->getName() . '.version.date', $upgrader->date, $epId);
                     $this->ok('install.module.upgraded', array($component->getName(), $upgrader->version));
                     $lastversion = $upgrader->version;
                 }
                 if ($lastversion != $component->getSourceVersion()) {
                     $this->installerIni->setValue($component->getName() . '.version', $component->getSourceVersion(), $epId);
                     $this->installerIni->setValue($component->getName() . '.version.date', $component->getSourceDate(), $epId);
                     $this->ok('install.module.upgraded', array($component->getName(), $component->getSourceVersion()));
                 }
                 $installedModules[] = array($installer, $component, false);
             }
             $ep->configIni->save();
             $ep->config = jConfigCompiler::read($ep->configFile, true, $ep->isCliScript, $ep->scriptName);
             jApp::setConfig($ep->config);
         }
     } catch (jInstallerException $e) {
         $result = false;
         $this->error($e->getLocaleKey(), $e->getLocaleParameters());
     } catch (Exception $e) {
         $result = false;
         $this->error('install.module.error', array($component->getName(), $e->getMessage()));
     }
     if (!$result) {
         $this->warning('install.entrypoint.bad.end', $epId);
         return false;
     }
     foreach ($installedModules as $item) {
         try {
             list($installer, $component, $toInstall) = $item;
             if ($toInstall) {
                 if ($installer && $flags & self::FLAG_INSTALL_MODULE) {
                     $installer->postInstall();
                     $component->installFinished($ep);
                 }
             } else {
                 if ($flags & self::FLAG_UPGRADE_MODULE) {
                     foreach ($installer as $upgrader) {
                         $upgrader->postInstall();
                         $component->upgradeFinished($ep, $upgrader);
                     }
                 }
             }
             $ep->configIni->save();
             $ep->config = jConfigCompiler::read($ep->configFile, true, $ep->isCliScript, $ep->scriptName);
             jApp::setConfig($ep->config);
         } catch (jInstallerException $e) {
             $result = false;
             $this->error($e->getLocaleKey(), $e->getLocaleParameters());
         } catch (Exception $e) {
             $result = false;
             $this->error('install.module.error', array($component->getName(), $e->getMessage()));
         }
     }
     $this->ok('install.entrypoint.end', $epId);
     return $result;
 }
示例#6
0
 /**
  * core of the installation
  * @param array $modules list of jInstallerComponentModule
  * @param string $epId  the entrypoint id
  * @param boolean $installWholeApp true if the installation is done during app installation
  * @param integer $flags to know what to do
  * @return boolean true if the installation is ok
  */
 protected function _installModules(&$modules, $epId, $installWholeApp, $flags = 3)
 {
     $this->notice('install.entrypoint.start', $epId);
     $ep = $this->entryPoints[$epId];
     jApp::setConfig($ep->config);
     if ($ep->config->disableInstallers) {
         $this->notice('install.entrypoint.installers.disabled');
     }
     // first, check dependencies of the component, to have the list of component
     // we should really install. It fills $this->_componentsToInstall, in the right
     // order
     $result = $this->checkDependencies($modules, $epId);
     if (!$result) {
         $this->error('install.bad.dependencies');
         $this->ok('install.entrypoint.bad.end', $epId);
         return false;
     }
     $this->ok('install.dependencies.ok');
     // ----------- pre install
     // put also available installers into $componentsToInstall for
     // the next step
     $componentsToInstall = array();
     foreach ($this->_componentsToInstall as $item) {
         list($component, $toInstall) = $item;
         try {
             if ($flags == self::FLAG_MIGRATION_11X) {
                 $this->installerIni->setValue($component->getName() . '.installed', 1, $epId);
                 $this->installerIni->setValue($component->getName() . '.version', $component->getSourceVersion(), $epId);
                 if ($ep->config->disableInstallers) {
                     $upgraders = array();
                 } else {
                     $upgraders = $component->getUpgraders($ep);
                     foreach ($upgraders as $upgrader) {
                         $upgrader->preInstall();
                     }
                 }
                 $componentsToInstall[] = array($upgraders, $component, false);
             } else {
                 if ($toInstall) {
                     if ($ep->config->disableInstallers) {
                         $installer = null;
                     } else {
                         $installer = $component->getInstaller($ep, $installWholeApp);
                     }
                     $componentsToInstall[] = array($installer, $component, $toInstall);
                     if ($flags & self::FLAG_INSTALL_MODULE && $installer) {
                         $installer->preInstall();
                     }
                 } else {
                     if ($ep->config->disableInstallers) {
                         $upgraders = array();
                     } else {
                         $upgraders = $component->getUpgraders($ep);
                     }
                     if ($flags & self::FLAG_UPGRADE_MODULE && count($upgraders)) {
                         foreach ($upgraders as $upgrader) {
                             $upgrader->preInstall();
                         }
                     }
                     $componentsToInstall[] = array($upgraders, $component, $toInstall);
                 }
             }
         } catch (jInstallerException $e) {
             $result = false;
             $this->error($e->getLocaleKey(), $e->getLocaleParameters());
         } catch (Exception $e) {
             $result = false;
             $this->error('install.module.error', array($component->getName(), $e->getMessage()));
         }
     }
     if (!$result) {
         $this->warning('install.entrypoint.bad.end', $epId);
         return false;
     }
     $installedModules = array();
     // -----  installation process
     try {
         foreach ($componentsToInstall as $item) {
             list($installer, $component, $toInstall) = $item;
             if ($toInstall) {
                 if ($installer && $flags & self::FLAG_INSTALL_MODULE) {
                     $installer->install();
                 }
                 $this->installerIni->setValue($component->getName() . '.installed', 1, $epId);
                 $this->installerIni->setValue($component->getName() . '.version', $component->getSourceVersion(), $epId);
                 $this->installerIni->setValue($component->getName() . '.version.date', $component->getSourceDate(), $epId);
                 $this->installerIni->setValue($component->getName() . '.firstversion', $component->getSourceVersion(), $epId);
                 $this->installerIni->setValue($component->getName() . '.firstversion.date', $component->getSourceDate(), $epId);
                 $this->ok('install.module.installed', $component->getName());
                 $installedModules[] = array($installer, $component, true);
             } else {
                 $lastversion = '';
                 foreach ($installer as $upgrader) {
                     if ($flags & self::FLAG_UPGRADE_MODULE) {
                         $upgrader->install();
                     }
                     // we set the version of the upgrade, so if an error occurs in
                     // the next upgrader, we won't have to re-run this current upgrader
                     // during a future update
                     $this->installerIni->setValue($component->getName() . '.version', $upgrader->version, $epId);
                     $this->installerIni->setValue($component->getName() . '.version.date', $upgrader->date, $epId);
                     $this->ok('install.module.upgraded', array($component->getName(), $upgrader->version));
                     $lastversion = $upgrader->version;
                 }
                 // we set the version to the component version, because the version
                 // of the last upgrader could not correspond to the component version.
                 if ($lastversion != $component->getSourceVersion()) {
                     $this->installerIni->setValue($component->getName() . '.version', $component->getSourceVersion(), $epId);
                     $this->installerIni->setValue($component->getName() . '.version.date', $component->getSourceDate(), $epId);
                     $this->ok('install.module.upgraded', array($component->getName(), $component->getSourceVersion()));
                 }
                 $installedModules[] = array($installer, $component, false);
             }
             // we always save the configuration, so it invalidates the cache
             $ep->configIni->save();
             // we re-load configuration file for each module because
             // previous module installer could have modify it.
             $ep->config = jConfigCompiler::read($ep->configFile, true, $ep->isCliScript, $ep->scriptName);
             jApp::setConfig($ep->config);
         }
     } catch (jInstallerException $e) {
         $result = false;
         $this->error($e->getLocaleKey(), $e->getLocaleParameters());
     } catch (Exception $e) {
         $result = false;
         $this->error('install.module.error', array($component->getName(), $e->getMessage()));
     }
     if (!$result) {
         $this->warning('install.entrypoint.bad.end', $epId);
         return false;
     }
     // post install
     foreach ($installedModules as $item) {
         try {
             list($installer, $component, $toInstall) = $item;
             if ($toInstall) {
                 if ($installer && $flags & self::FLAG_INSTALL_MODULE) {
                     $installer->postInstall();
                     $component->installFinished($ep);
                 }
             } else {
                 if ($flags & self::FLAG_UPGRADE_MODULE) {
                     foreach ($installer as $upgrader) {
                         $upgrader->postInstall();
                         $component->upgradeFinished($ep, $upgrader);
                     }
                 }
             }
             // we always save the configuration, so it invalidates the cache
             $ep->configIni->save();
             // we re-load configuration file for each module because
             // previous module installer could have modify it.
             $ep->config = jConfigCompiler::read($ep->configFile, true, $ep->isCliScript, $ep->scriptName);
             jApp::setConfig($ep->config);
         } catch (jInstallerException $e) {
             $result = false;
             $this->error($e->getLocaleKey(), $e->getLocaleParameters());
         } catch (Exception $e) {
             $result = false;
             $this->error('install.module.error', array($component->getName(), $e->getMessage()));
         }
     }
     $this->ok('install.entrypoint.end', $epId);
     return $result;
 }
 function loadAppConfig()
 {
     if (jApp::config()) {
         return;
     }
     $xml = simplexml_load_file(jApp::appPath('project.xml'));
     $configFile = '';
     foreach ($xml->entrypoints->entry as $entrypoint) {
         $file = (string) $entrypoint['file'];
         if ($file == $this->entryPointName) {
             $configFile = (string) $entrypoint['config'];
             break;
         }
     }
     if ($configFile == '') {
         throw new Exception($this->name . ": Entry point is unknown");
     }
     jApp::setConfig(jConfigCompiler::read($configFile, true, true, $this->entryPointName));
 }