parameters.class.inc.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <?php
  2. class InvalidParameterException extends Exception
  3. {
  4. }
  5. abstract class Parameters
  6. {
  7. protected $aData = null;
  8. public function __construct()
  9. {
  10. $this->aData = null;
  11. }
  12. public function Get($sCode, $default = '')
  13. {
  14. if (array_key_exists($sCode, $this->aData))
  15. {
  16. return $this->aData[$sCode];
  17. }
  18. return $default;
  19. }
  20. }
  21. class PHPParameters extends Parameters
  22. {
  23. public function LoadFromHash($aData)
  24. {
  25. $this->aData = $aData;
  26. }
  27. public function LoadFromFile($sParametersFile)
  28. {
  29. if ($this->aData == null)
  30. {
  31. require_once($sParametersFile);
  32. $this->aData = $ITOP_PARAMS;
  33. }
  34. }
  35. public function ToXML(DOMNode $oRoot, $data = null, $sNodeName = null)
  36. {
  37. if ($data === null)
  38. {
  39. $data = $this->aData;
  40. }
  41. if (is_array($data))
  42. {
  43. if ($oRoot instanceof DOMDocument)
  44. {
  45. $oNode = $oRoot->createElement($sNodeName);
  46. }
  47. else
  48. {
  49. $oNode = $oRoot->ownerDocument->createElement($sNodeName);
  50. }
  51. $oRoot->appendChild($oNode);
  52. $aKeys = array_keys($data);
  53. $bNumericKeys = true;
  54. foreach($aKeys as $idx => $subkey)
  55. {
  56. if(((int)$subkey) !== $subkey)
  57. {
  58. $bNumericKeys = false;
  59. break;
  60. }
  61. }
  62. if ($bNumericKeys)
  63. {
  64. $oNode->setAttribute("type", "array");
  65. foreach($data as $key => $value)
  66. {
  67. $this->ToXML($oNode, $value , 'item');
  68. }
  69. }
  70. else
  71. {
  72. foreach($data as $key => $value)
  73. {
  74. $this->ToXML($oNode, $value , $key);
  75. }
  76. }
  77. }
  78. else
  79. {
  80. $oNode = $oRoot->ownerDocument->createElement($sNodeName, $data);
  81. $oRoot->appendChild($oNode);
  82. }
  83. return $oNode;
  84. }
  85. }
  86. class XMLParameters extends Parameters
  87. {
  88. protected $sParametersFile;
  89. public function __construct($sParametersFile)
  90. {
  91. parent::__construct();
  92. $this->LoadFromFile($sParametersFile);
  93. }
  94. public function LoadFromFile($sParametersFile)
  95. {
  96. $this->sParametersFile = $sParametersFile;
  97. if ($this->aData == null)
  98. {
  99. libxml_use_internal_errors(true);
  100. $oXML = @simplexml_load_file($this->sParametersFile);
  101. if (!$oXML)
  102. {
  103. $aMessage = array();
  104. foreach(libxml_get_errors() as $oError)
  105. {
  106. $aMessage[] = "(line: {$oError->line}) ".$oError->message; // Beware: $oError->columns sometimes returns wrong (misleading) value
  107. }
  108. libxml_clear_errors();
  109. throw new InvalidParameterException("Invalid Parameters file '{$this->sParametersFile}': ".implode(' ', $aMessage));
  110. }
  111. $this->aData = array();
  112. foreach($oXML as $key => $oElement)
  113. {
  114. $this->aData[(string)$key] = $this->ReadElement($oElement);
  115. }
  116. }
  117. }
  118. protected function ReadElement(SimpleXMLElement $oElement)
  119. {
  120. $sDefaultNodeType = (count($oElement->children()) > 0) ? 'hash' : 'string';
  121. $sNodeType = $this->GetAttribute('type', $oElement, $sDefaultNodeType);
  122. switch($sNodeType)
  123. {
  124. case 'array':
  125. $value = array();
  126. // Treat the current element as zero based array, child tag names are NOT meaningful
  127. $sFirstTagName = null;
  128. foreach($oElement->children() as $oChildElement)
  129. {
  130. if ($sFirstTagName == null)
  131. {
  132. $sFirstTagName = $oChildElement->getName();
  133. }
  134. else if ($sFirstTagName != $oChildElement->getName())
  135. {
  136. throw new InvalidParameterException("Invalid Parameters file '{$this->sParametersFile}': mixed tags ('$sFirstTagName' and '".$oChildElement->getName()."') inside array '".$oElement->getName()."'");
  137. }
  138. $val = $this->ReadElement($oChildElement);
  139. $value[] = $val;
  140. }
  141. break;
  142. case 'hash':
  143. $value = array();
  144. // Treat the current element as a hash, child tag names are keys
  145. foreach($oElement->children() as $oChildElement)
  146. {
  147. if (array_key_exists($oChildElement->getName(), $value))
  148. {
  149. throw new InvalidParameterException("Invalid Parameters file '{$this->sParametersFile}': duplicate tags '".$oChildElement->getName()."' inside hash '".$oElement->getName()."'");
  150. }
  151. $val = $this->ReadElement($oChildElement);
  152. $value[$oChildElement->getName()] = $val;
  153. }
  154. break;
  155. case 'int':
  156. case 'integer':
  157. $value = (int)$oElement;
  158. break;
  159. case 'string':
  160. default:
  161. $value = (string)$oElement;
  162. }
  163. return $value;
  164. }
  165. protected function GetAttribute($sAttName, $oElement, $sDefaultValue)
  166. {
  167. $sRet = $sDefaultValue;
  168. foreach($oElement->attributes() as $sKey => $oChildElement)
  169. {
  170. if ((string)$sKey == $sAttName)
  171. {
  172. $sRet = (string)$oChildElement;
  173. break;
  174. }
  175. }
  176. return $sRet;
  177. }
  178. }