/**
  * Generic implementation, triggers the update or the install method, depending on the parts already installed.
  * @return string
  */
 public function installOrUpdate()
 {
     $strReturn = "";
     $objModule = null;
     if ($this->objMetadata->getStrType() == class_module_packagemanager_manager::STR_TYPE_ELEMENT) {
         if (class_module_system_module::getModuleByName("pages") !== null && is_dir(class_resourceloader::getInstance()->getCorePathForModule("module_pages", true))) {
             $objModule = class_module_pages_element::getElement(uniStrReplace("element_", "", $this->objMetadata->getStrTitle()));
         }
     } else {
         $objModule = class_module_system_module::getModuleByName($this->objMetadata->getStrTitle());
     }
     if ($objModule === null) {
         class_logger::getInstance("triggering installation of " . $this->objMetadata->getStrTitle(), class_logger::$levelInfo);
         $strReturn .= $this->install();
     } else {
         $strVersionInstalled = $objModule->getStrVersion();
         $strVersionAvailable = $this->objMetadata->getStrVersion();
         if (version_compare($strVersionAvailable, $strVersionInstalled, ">")) {
             class_logger::getInstance("triggering update of " . $this->objMetadata->getStrTitle(), class_logger::$levelInfo);
             $strReturn .= $this->update();
         }
     }
     class_carrier::getInstance()->flushCache(class_carrier::INT_CACHE_TYPE_DBTABLES);
     return $strReturn;
 }
 /**
  * Queries the packagemanager for the resolved target path, so the folder to package will be located at
  * after installation (or is already located at since it's already installed.
  *
  * @return mixed
  */
 public function getStrTargetPath()
 {
     $strTarget = $this->objMetadata->getStrTarget();
     if ($strTarget == "") {
         $strTarget = uniStrtolower(createFilename($this->objMetadata->getStrTitle(), true));
     }
     return "/templates/" . $strTarget;
 }
 /**
  * Queries the packagemanager for the resolved target path, so the folder to package will be located at
  * after installation (or is already located at since it's already installed.
  *
  * @return mixed
  */
 public function getStrTargetPath()
 {
     $strTarget = $this->objMetadata->getStrTarget();
     if ($strTarget == "") {
         $strTarget = uniStrtolower($this->objMetadata->getStrType() . "_" . createFilename($this->objMetadata->getStrTitle(), true));
     }
     $arrModules = array_flip(class_resourceloader::getInstance()->getArrModules());
     if (isset($arrModules[$strTarget])) {
         return "/" . $arrModules[$strTarget];
     }
     return "/core/" . $strTarget;
 }
 public function testExtractAndMove()
 {
     $objFilesystem = new class_filesystem();
     $objFilesystem->folderCreate(_projectpath_ . "/temp/moduletest");
     file_put_contents(_realpath_ . _projectpath_ . "/temp/moduletest/metadata.xml", $this->getStrMetadata());
     $objFilesystem->folderCreate(_projectpath_ . "/temp/moduletest/system");
     file_put_contents(_realpath_ . _projectpath_ . "/temp/moduletest/system/test.txt", $this->getStrMetadata());
     $objZip = new class_zip();
     $objZip->openArchiveForWriting(_projectpath_ . "/temp/autotest.zip");
     $objZip->addFile(_projectpath_ . "/temp/moduletest/metadata.xml", "/metadata.xml");
     $objZip->addFile(_projectpath_ . "/temp/moduletest/system/test.txt", "/system/test.txt");
     $objZip->closeArchive();
     $objFilesystem->folderDeleteRecursive(_projectpath_ . "/temp/moduletest/");
     $objManager = new class_module_packagemanager_manager();
     $objPackageManager = $objManager->getPackageManagerForPath(_projectpath_ . "/temp/autotest.zip");
     $this->assertEquals(get_class($objPackageManager), "class_module_packagemanager_packagemanager_module");
     $objPackageManager = $objManager->extractPackage(_projectpath_ . "/temp/autotest.zip");
     $this->assertEquals(get_class($objPackageManager), "class_module_packagemanager_packagemanager_module");
     $objPackageManager->move2Filesystem();
     $this->assertFileExists(_realpath_ . "/core/module_autotest/metadata.xml");
     $this->assertFileExists(_realpath_ . "/core/module_autotest/system/test.txt");
     $objMetadata = new class_module_packagemanager_metadata();
     $objMetadata->autoInit("/core/module_autotest/");
     $this->assertEquals("Autotest", $objMetadata->getStrTitle());
     $this->assertEquals("", $objMetadata->getStrDescription());
     $this->assertEquals("3.9.1", $objMetadata->getStrVersion());
     $this->assertEquals("Kajona Team", $objMetadata->getStrAuthor());
     $this->assertEquals("module_autotest", $objMetadata->getStrTarget());
     $this->assertEquals(class_module_packagemanager_manager::STR_TYPE_MODULE, $objMetadata->getStrType());
     $this->assertEquals(false, $objMetadata->getBitProvidesInstaller());
     $arrRequired = $objMetadata->getArrRequiredModules();
     $arrModules = array_keys($arrRequired);
     $arrVersion = array_values($arrRequired);
     $this->assertEquals("system", $arrModules[0]);
     $this->assertEquals("3.4.1", $arrVersion[0]);
     $this->assertEquals("pages", $arrModules[1]);
     $this->assertEquals("3.4.2", $arrVersion[1]);
     $arrImages = $objMetadata->getArrScreenshots();
     $this->assertEquals(1, count($arrImages));
     $this->assertEquals("/test.jpg", $arrImages[0]);
     $objFilesystem->folderDeleteRecursive("/core/module_autotest");
     $objFilesystem->fileDelete(_projectpath_ . "/temp/autotest.zip");
 }
 /**
  * Copies the metadata.xml content into the files properties.
  * @permissions edit
  * @xml
  * @return string
  */
 protected function actionUpdateDataFromMetadata()
 {
     $objPackage = new class_module_mediamanager_file($this->getSystemid());
     $objZip = new class_zip();
     $strMetadata = $objZip->getFileFromArchive($objPackage->getStrFilename(), "/metadata.xml");
     if ($strMetadata !== false) {
         $objMetadata = new class_module_packagemanager_metadata();
         $objMetadata->autoInit($objPackage->getStrFilename());
         $objPackage->setStrName($objMetadata->getStrTitle());
         $objPackage->setStrDescription($objMetadata->getStrDescription());
         //updateObjectToDb triggers the update of the isPackage and the category flags
         $objPackage->updateObjectToDb();
         return "<message><success /></message>";
     }
     return "<message><error /></message>";
 }
 /**
  * Does an inverse-search for the package-requirements. This means that not the packages required to install the
  * passed package are returned, but the packages depending on the passed package.
  * Useful for consistency checks, e.g. before deleting a package.
  *
  * @param class_module_packagemanager_metadata $objMetadata
  *
  * @return string[]
  */
 public function getArrRequiredBy(class_module_packagemanager_metadata $objMetadata)
 {
     $arrReturn = array();
     foreach ($this->getAvailablePackages() as $objOnePackage) {
         foreach ($objOnePackage->getArrRequiredModules() as $strModule => $strVersion) {
             if ($strModule == $objMetadata->getStrTitle()) {
                 $arrReturn[] = $objOnePackage->getStrTitle();
             }
         }
     }
     return $arrReturn;
 }