parameters.class.inc.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <?php
  2. class InvalidParameterException extends Exception
  3. {
  4. }
  5. abstract class Parameters
  6. {
  7. protected $aData = null;
  8. protected $sParametersFile = null;
  9. public function __construct($sParametersFile)
  10. {
  11. $this->aData = null;
  12. $this->sParametersFile = $sParametersFile;
  13. $this->Load($sParametersFile);
  14. }
  15. abstract public function Load($sParametersFile);
  16. public function Get($sCode, $default = '')
  17. {
  18. if (array_key_exists($sCode, $this->aData))
  19. {
  20. return $this->aData[$sCode];
  21. }
  22. return $default;
  23. }
  24. }
  25. class PHPParameters extends Parameters
  26. {
  27. public function Load($sParametersFile)
  28. {
  29. if ($this->aData == null)
  30. {
  31. require_once($sParametersFile);
  32. $this->aData = $ITOP_PARAMS;
  33. }
  34. }
  35. }
  36. class XMLParameters extends Parameters
  37. {
  38. protected $aData = null;
  39. public function Load($sParametersFile)
  40. {
  41. if ($this->aData == null)
  42. {
  43. libxml_use_internal_errors(true);
  44. $oXML = @simplexml_load_file($sParametersFile);
  45. if (!$oXML)
  46. {
  47. $aMessage = array();
  48. foreach(libxml_get_errors() as $oError)
  49. {
  50. $aMessage[] = "(line: {$oError->line}) ".$oError->message; // Beware: $oError->columns sometimes returns wrong (misleading) value
  51. }
  52. libxml_clear_errors();
  53. throw new InvalidParameterException("Invalid Parameters file '{$this->sParametersFile}': ".implode(' ', $aMessage));
  54. }
  55. $this->aData = array();
  56. foreach($oXML as $key => $oElement)
  57. {
  58. $this->aData[(string)$key] = $this->ReadElement($oElement);
  59. }
  60. }
  61. }
  62. protected function ReadElement(SimpleXMLElement $oElement)
  63. {
  64. $sDefaultNodeType = (count($oElement->children()) > 0) ? 'hash' : 'string';
  65. $sNodeType = $this->GetAttribute('type', $oElement, $sDefaultNodeType);
  66. switch($sNodeType)
  67. {
  68. case 'array':
  69. $value = array();
  70. // Treat the current element as zero based array, child tag names are NOT meaningful
  71. $sFirstTagName = null;
  72. foreach($oElement->children() as $oChildElement)
  73. {
  74. if ($sFirstTagName == null)
  75. {
  76. $sFirstTagName = $oChildElement->getName();
  77. }
  78. else if ($sFirstTagName != $oChildElement->getName())
  79. {
  80. throw new InvalidParameterException("Invalid Parameters file '{$this->sParametersFile}': mixed tags ('$sFirstTagName' and '".$oChildElement->getName()."') inside array '".$oElement->getName()."'");
  81. }
  82. $val = $this->ReadElement($oChildElement);
  83. $value[] = $val;
  84. }
  85. break;
  86. case 'hash':
  87. $value = array();
  88. // Treat the current element as a hash, child tag names are keys
  89. foreach($oElement->children() as $oChildElement)
  90. {
  91. if (array_key_exists($oChildElement->getName(), $value))
  92. {
  93. throw new InvalidParameterException("Invalid Parameters file '{$this->sParametersFile}': duplicate tags '".$oChildElement->getName()."' inside hash '".$oElement->getName()."'");
  94. }
  95. $val = $this->ReadElement($oChildElement);
  96. $value[$oChildElement->getName()] = $val;
  97. }
  98. break;
  99. case 'int':
  100. case 'integer':
  101. $value = (int)$oElement;
  102. break;
  103. case 'string':
  104. default:
  105. $value = (string)$oElement;
  106. }
  107. return $value;
  108. }
  109. protected function GetAttribute($sAttName, $oElement, $sDefaultValue)
  110. {
  111. $sRet = $sDefaultValue;
  112. foreach($oElement->attributes() as $sKey => $oChildElement)
  113. {
  114. if ((string)$sKey == $sAttName)
  115. {
  116. $sRet = (string)$oChildElement;
  117. break;
  118. }
  119. }
  120. return $sRet;
  121. }
  122. }