parameters.class.inc.php 4.5 KB

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