From b529f3d4ccb2f959a737fb5622191d25ec4abc90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eric=20Espi=C3=A9?= Date: Fri, 20 Apr 2018 15:56:53 +0000 Subject: [PATCH] Setup: Display the XML errors on the screen SVN:trunk[5716] --- setup/compiler.class.inc.php | 112 ++++++++++++++++++++++++++----- setup/modelfactory.class.inc.php | 22 ++++-- setup/parameters.class.inc.php | 2 +- setup/wizardsteps.class.inc.php | 1 + 4 files changed, 115 insertions(+), 22 deletions(-) diff --git a/setup/compiler.class.inc.php b/setup/compiler.class.inc.php index 9a900c8f0..7d6c36a85 100644 --- a/setup/compiler.class.inc.php +++ b/setup/compiler.class.inc.php @@ -28,8 +28,8 @@ class DOMFormatException extends Exception * Overrides the Exception default constructor to automatically add informations about the concerned node (path and line number) * * @param string $message - * @param type $code - * @param type $previous + * @param $code + * @param $previous * @param DOMNode $node [Optionnal] DOMNode causing the DOMFormatException */ public function __construct($message, $code = null, $previous = null, DOMNode $node = null) @@ -160,7 +160,6 @@ class MFCompiler * @param Page $oP * @param bool $bUseSymbolicLinks * @throws Exception - * @return string void */ protected function DoCompile($sTempTargetDir, $sFinalTargetDir, $oP = null, $bUseSymbolicLinks = false) { @@ -441,7 +440,6 @@ EOF; // Compile the module into a single file // - $sId = $sModuleName; $sCurrDate = date(DATE_ISO8601); $sAuthor = 'iTop compiler'; $sLicence = 'http://opensource.org/licenses/AGPL-3.0'; @@ -653,9 +651,12 @@ EOF /** * Helper to format the tracking level for linkset (direct or indirect attributes) + * * @param string $sTrackingLevel Value set from within the XML * Returns string PHP flag - */ + * + * @throws \DOMFormatException + */ protected function TrackingLevelToPHP($sAttType, $sTrackingLevel) { static $aXmlToPHP_Links = array( @@ -690,9 +691,12 @@ EOF /** * Helper to format the edit-mode for direct linkset + * * @param string $sEditMode Value set from within the XML * Returns string PHP flag - */ + * + * @throws \DOMFormatException + */ protected function EditModeToPHP($sEditMode) { static $aXmlToPHP = array( @@ -768,7 +772,14 @@ EOF } return "'".str_replace("'", "\\'", $val)."'"; } - + + /** + * @param $oNode + * @param $sTag + * + * @return string + * @throws \DOMFormatException + */ protected function GetMandatoryPropString($oNode, $sTag) { $val = $oNode->GetChildText($sTag); @@ -799,6 +810,13 @@ EOF return $val == 'true' ? 'true' : 'false'; } + /** + * @param $oNode + * @param $sTag + * + * @return string + * @throws \DOMFormatException + */ protected function GetMandatoryPropBoolean($oNode, $sTag) { $val = $oNode->GetChildText($sTag); @@ -826,6 +844,13 @@ EOF return (string)$val; } + /** + * @param $oNode + * @param $sTag + * + * @return string + * @throws \DOMFormatException + */ protected function GetMandatoryPropNumber($oNode, $sTag) { $val = $oNode->GetChildText($sTag); @@ -906,6 +931,17 @@ EOF return $sPHPDefine; } + /** + * @param $oClass + * @param $sTempTargetDir + * @param $sFinalTargetDir + * @param $sModuleRelativeDir + * @param $oP + * + * @return string + * @throws \DOMFormatException + * @throws \Exception + */ protected function CompileClass($oClass, $sTempTargetDir, $sFinalTargetDir, $sModuleRelativeDir, $oP) { $sClass = $oClass->getAttribute('id'); @@ -1172,14 +1208,14 @@ EOF elseif ($sAttType == 'AttributeExternalField') { $aParameters['allowed_values'] = 'null'; - $aParameters['extkey_attcode'] = $this->GetMandatoryPropString($oField, 'extkey_attcode', ''); - $aParameters['target_attcode'] = $this->GetMandatoryPropString($oField, 'target_attcode', ''); + $aParameters['extkey_attcode'] = $this->GetMandatoryPropString($oField, 'extkey_attcode'); + $aParameters['target_attcode'] = $this->GetMandatoryPropString($oField, 'target_attcode'); } elseif ($sAttType == 'AttributeURL') { $aParameters['target'] = $this->GetPropString($oField, 'target', ''); $aParameters['allowed_values'] = 'null'; - $aParameters['sql'] = $this->GetMandatoryPropString($oField, 'sql', ''); + $aParameters['sql'] = $this->GetMandatoryPropString($oField, 'sql'); $aParameters['default_value'] = $this->GetPropString($oField, 'default_value', ''); $aParameters['is_null_allowed'] = $this->GetPropBoolean($oField, 'is_null_allowed', false); $aParameters['depends_on'] = $sDependencies; @@ -1198,7 +1234,7 @@ EOF $sValues = '"'.implode(',', $aValues).'"'; $aParameters['allowed_values'] = "new ValueSetEnum($sValues)"; $aParameters['display_style'] = $this->GetPropString($oField, 'display_style', 'list'); - $aParameters['sql'] = $this->GetMandatoryPropString($oField, 'sql', ''); + $aParameters['sql'] = $this->GetMandatoryPropString($oField, 'sql'); $aParameters['default_value'] = $this->GetPropString($oField, 'default_value', ''); $aParameters['is_null_allowed'] = $this->GetPropBoolean($oField, 'is_null_allowed', false); $aParameters['depends_on'] = $sDependencies; @@ -1216,7 +1252,7 @@ EOF // new style... $sValues = 'array('.implode(', ', $aValues).')'; $sValues = '"'.implode(',', $aValues).'"'; $aParameters['allowed_values'] = "new ValueSetEnum($sValues)"; - $aParameters['sql'] = $this->GetMandatoryPropString($oField, 'sql', ''); + $aParameters['sql'] = $this->GetMandatoryPropString($oField, 'sql'); $aParameters['default_value'] = $this->GetPropString($oField, 'default_value', ''); $oMappings = $oField->GetUniqueElement('mappings'); @@ -1744,7 +1780,6 @@ EOF // Let's make the whole class declaration // $sPHP = "\n\n$sCodeComment\n"; - $sParentClass = $oClass->GetChildText('php_parent'); $oPhpParent = $oClass->GetUniqueElement('php_parent', false); if ($oPhpParent) { @@ -1802,6 +1837,16 @@ EOF; }// function CompileClass() + /** + * @param $oMenu + * @param $sTempTargetDir + * @param $sFinalTargetDir + * @param $sModuleRelativeDir + * @param $oP + * + * @return array + * @throws \DOMFormatException + */ protected function CompileMenu($oMenu, $sTempTargetDir, $sFinalTargetDir, $sModuleRelativeDir, $oP) { $this->CompileFiles($oMenu, $sTempTargetDir.'/'.$sModuleRelativeDir, $sFinalTargetDir.'/'.$sModuleRelativeDir, $sModuleRelativeDir); @@ -1820,7 +1865,6 @@ EOF; } $fRank = (float) $oMenu->GetChildText('rank'); - $sEnablePermission = 'UR_ALLOWED_YES'; if ($sEnableClass = $oMenu->GetChildText('enable_class')) { $sEnableAction = $oMenu->GetChildText('enable_action', 'UR_ACTION_MODIFY'); @@ -2039,7 +2083,6 @@ EOF; { $sGroupId = $oGroup->getAttribute("id"); - $aActions = array(); $oActions = $oGroup->GetUniqueElement('actions'); foreach($oActions->getElementsByTagName('action') as $oAction) { @@ -2307,6 +2350,15 @@ EOF; // Transform the file references into the corresponding filename (and create the file in the relevant directory) // + /** + * @param $oNode + * @param $sTempTargetDir + * @param $sFinalTargetDir + * @param $sRelativePath + * + * @throws \DOMFormatException + * @throws \Exception + */ protected function CompileFiles($oNode, $sTempTargetDir, $sFinalTargetDir, $sRelativePath) { $oFileRefs = $oNode->GetNodes(".//fileref"); @@ -2342,6 +2394,15 @@ EOF; } + /** + * @param $oBrandingNode + * @param $sTempTargetDir + * @param $sFinalTargetDir + * @param $sNodeName + * @param $sTargetFile + * + * @throws \Exception + */ protected function CompileLogo($oBrandingNode, $sTempTargetDir, $sFinalTargetDir, $sNodeName, $sTargetFile) { if (($sIcon = $oBrandingNode->GetChildText($sNodeName)) && (strlen($sIcon) > 0)) @@ -2358,6 +2419,14 @@ EOF; } } + /** + * @param $oBrandingNode + * @param $sTempTargetDir + * @param $sFinalTargetDir + * + * @throws \DOMFormatException + * @throws \Exception + */ protected function CompileBranding($oBrandingNode, $sTempTargetDir, $sFinalTargetDir) { // Enable relative paths @@ -2467,7 +2536,15 @@ EOF; $this->sMainPHPCode .= "}\n"; } } - + + /** + * @param $oDesigns + * @param $sTempTargetDir + * @param $sFinalTargetDir + * + * @throws \DOMFormatException + * @throws \Exception + */ protected function CompileModuleDesigns($oDesigns, $sTempTargetDir, $sFinalTargetDir) { if ($oDesigns) @@ -2484,6 +2561,9 @@ EOF; } } + /** + * @throws \DOMFormatException + */ protected function LoadSnippets() { $oSnippets = $this->oFactory->GetNodes('/itop_design/snippets/snippet'); diff --git a/setup/modelfactory.class.inc.php b/setup/modelfactory.class.inc.php index d3bf56f5c..2498e7459 100644 --- a/setup/modelfactory.class.inc.php +++ b/setup/modelfactory.class.inc.php @@ -619,8 +619,11 @@ class ModelFactory /** * Loads the definitions corresponding to the given Module + * * @param MFModule $oModule - * @param Array $aLanguages The list of languages to process (for the dictionaries). If empty all languages are kept + * @param array $aLanguages The list of languages to process (for the dictionaries). If empty all languages are kept + * + * @throws \Exception */ public function LoadModule(MFModule $oModule, $aLanguages = array()) { @@ -628,7 +631,6 @@ class ModelFactory { $aDataModels = $oModule->GetDataModelFiles(); $sModuleName = $oModule->GetName(); - $aClasses = array(); self::$aLoadedModules[] = $oModule; // For persistence in the cache @@ -644,12 +646,10 @@ class ModelFactory $oDocument = new MFDocument(); libxml_clear_errors(); $oDocument->load($sXmlFile); - //$bValidated = $oDocument->schemaValidate(APPROOT.'setup/itop_design.xsd'); $aErrors = libxml_get_errors(); if (count($aErrors) > 0) { - self::$aLoadErrors[$sModuleName] = $aErrors; - return; + throw new Exception($this->GetXMLErrorMessage($aErrors)); } $oXPath = new DOMXPath($oDocument); @@ -826,11 +826,23 @@ class ModelFactory { return (count(self::$aLoadErrors) > 0); } + function GetLoadErrors() { return self::$aLoadErrors; } + function GetXMLErrorMessage($aErrors) + { + $sMessage = "Data model source file ({$aErrors[0]->file}) could not be loaded : \n"; + foreach($aErrors as $oXmlError) + { + // XML messages already ends with \n + $sMessage .= $oXmlError->message; + } + return $sMessage; + } + function GetLoadedModules($bExcludeWorkspace = true) { if ($bExcludeWorkspace) diff --git a/setup/parameters.class.inc.php b/setup/parameters.class.inc.php index 6cf86bedd..6e237069a 100644 --- a/setup/parameters.class.inc.php +++ b/setup/parameters.class.inc.php @@ -5,7 +5,7 @@ class InvalidParameterException extends Exception abstract class Parameters { - protected $aData = null; + public $aData = null; public function __construct() { diff --git a/setup/wizardsteps.class.inc.php b/setup/wizardsteps.class.inc.php index 81f2b1da4..1802ca637 100644 --- a/setup/wizardsteps.class.inc.php +++ b/setup/wizardsteps.class.inc.php @@ -2396,6 +2396,7 @@ EOF else { $sMessage = addslashes(htmlentities($aRes['message'], ENT_QUOTES, 'UTF-8')); + $sMessage = str_replace("\n", '
', $sMessage); $oPage->add_ready_script( <<