WfsBiAudit.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. class Route_WfsBiAudit extends RouteBase {
  4. const maxResolveDepth = 3;
  5. private $dom, $path = [], $relations = [], $tablesUsed = [];
  6. private static function output($output) {
  7. header("Content-Type: application/xml");
  8. header("Content-Transfer-Encoding: binary");
  9. header("Content-Length: " . strlen($output));
  10. echo $output;
  11. }
  12. private static function throwServiceException($message) {
  13. $xml = <<<EOT
  14. <?xml version="1.0" encoding="UTF-8"?>
  15. <ServiceExceptionReport xmlns="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/wfs/1.0.0/OGC-exception.xsd" version="1.2.0">
  16. <ServiceException>{$message}</ServiceException>
  17. </ServiceExceptionReport>
  18. EOT;
  19. self::output($xml);
  20. die();
  21. }
  22. private function addChild($node, $name, $value = null) {
  23. $child = $this->dom->createElement($name, $value);
  24. $node->appendChild($child);
  25. return $child;
  26. }
  27. private function addAttribute($node, $name, $value) {
  28. $attr = $this->dom->createAttribute($name);
  29. $attr->value = $value;
  30. $node->appendChild($attr);
  31. }
  32. private function relationName($ID) {
  33. if (!isset($this->relations[$ID])) {
  34. $query = "select `RELATION` from `BI_audit_ALL_ref_RELATIONS` where `ID` & {$ID} order by `ID`";
  35. $result = DB::getPDO()->fetchAll($query);
  36. $rels = array_map('reset', $result);
  37. $this->relations[$ID] = implode(", ", $rels);
  38. }
  39. return $this->relations[$ID];
  40. }
  41. private function findRelations($node, $ID, $resolveDepth, $relation = null) {
  42. if (in_array($ID, $this->path)) return;
  43. $this->path[] = $ID;
  44. $query = "select `REMOTE_TABLE`, `REMOTE_ID` from `BI_audit_ALL` where `ID` = {$ID}";
  45. if (!($row = DB::getPDO()->fetchFirst($query))) self::throwServiceException("Błąd danych");
  46. if (!in_array($row['REMOTE_TABLE'], $this->tablesUsed)) $this->tablesUsed[] = $row['REMOTE_TABLE'];
  47. if ($resolveDepth) {
  48. $feature = $this->addChild($node, "default_db__x3A__{$row['REMOTE_TABLE']}:{$row['REMOTE_TABLE']}");
  49. $this->addAttribute($feature, 'fid', "{$row['REMOTE_TABLE']}.{$row['REMOTE_ID']}");
  50. $this->addChild($feature, "default_db__x3A__{$row['REMOTE_TABLE']}:ID", $row['REMOTE_ID']);
  51. if ($relation) $this->addChild($feature, "relation_from", $this->relationName($relation));
  52. //$query = "select `ID2` from `BI_audit_ALL_ref` where `ID1` = {$ID}";
  53. $where = $relation ? "and ({$relation} & `RELATION_ID`) != {$relation}" : "";
  54. $query = "select `ID2`, `RELATION_ID` from `BI_audit_ALL_ref` where `ID1` = {$ID} {$where}";
  55. $result = DB::getPDO()->fetchAll($query);
  56. foreach ($result as $row) $this->findRelations($feature, $row['ID2'], $resolveDepth - 1, $row['RELATION_ID']);
  57. } else {
  58. $xlink = $this->addChild($node, "default_db__x3A__{$row['REMOTE_TABLE']}:{$row['REMOTE_TABLE']}");
  59. $this->addAttribute($xlink, 'xlink:href', "https://biuro.biall-net.pl/wfs/default_db/{$row['REMOTE_TABLE']}?BI_audit_ALL_ref_RELATIONS={$relation}#{$row['REMOTE_TABLE']}.{$row['REMOTE_ID']}");
  60. }
  61. array_pop($this->path);
  62. }
  63. public function defaultAction() {
  64. $TYPENAME = V::get('TYPENAME', '', $_GET);
  65. $primaryKey = V::get('primaryKey', 0, $_GET, 'int');
  66. $resolveDepth = V::get('resolveDepth', 1, $_GET, 'int');
  67. $TYPENAME_exploded = explode(":", $TYPENAME);
  68. if (!(count($TYPENAME_exploded) == 2 && $primaryKey && $resolveDepth >= 1 && $resolveDepth <= self::maxResolveDepth)) self::throwServiceException("WFS request error");
  69. $table = $TYPENAME_exploded[1];
  70. try {
  71. $this->dom = new DOMDocument('1.0', 'UTF-8');
  72. $this->dom->preserveWhiteSpace = false;
  73. $this->dom->formatOutput = true;
  74. $attrs = [
  75. 'xmlns:wfs' => 'http://www.opengis.net/wfs',
  76. 'xmlns' => 'http://www.opengis.net/wfs',
  77. 'xmlns:gml' => 'http://www.opengis.net/gml',
  78. 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
  79. 'xmlns:xlink' => 'http://www.w3.org/1999/xlink',
  80. ];
  81. $wfs = $this->addChild($this->dom, 'wfs:FeatureCollection');
  82. foreach ($attrs as $name => $value) $this->addAttribute($wfs, $name, $value);
  83. $gml = $this->addChild($wfs, 'gml:featureMember');
  84. $query = "select `ID` from `BI_audit_ALL` where `REMOTE_TABLE` = " . DB::getPDO()->quote($table) . " and `REMOTE_ID` = {$primaryKey}";
  85. if (!($ID = DB::getPDO()->fetchValue($query))) self::throwServiceException("Błąd danych");
  86. $this->findRelations($gml, $ID, $resolveDepth);
  87. foreach ($this->tablesUsed as $table) $this->addAttribute($wfs, "xmlns:default_db__x3A__{$table}", "https://biuro.biall-net.pl/wfs/default_db/{$table}");
  88. $attrs = [
  89. 'numberMatched' => 'unknown',
  90. 'numberReturned' => '1',
  91. ];
  92. foreach ($attrs as $name => $value) $this->addAttribute($wfs, $name, $value);
  93. $xml = $this->dom->saveXML();
  94. self::output($xml);
  95. } catch (Exception $e) {
  96. self::throwServiceException($e->getMessage());
  97. }
  98. }
  99. }