source: trunk/src/inc/KMLFile.class.php@ 7642

Last change on this file since 7642 was 7642, checked in by Pieter Naber, 15 years ago

Application reads the node location file and the node status file and creates a KML file!

File size: 7.4 KB
Line 
1<?
2/*
3 * Project: NodeMap2.0
4 * File: KMLHandler.class.php
5 * Purpose: Creating of editing KML files
6 */
7
8define('PLACEMARK_GREEN', 'http://www.google.com/intl/en_us/mapfiles/ms/micons/green-dot.png');
9define('PLACEMARK_ORANGE', 'http://www.google.com/intl/en_us/mapfiles/ms/micons/orange-dot.png');
10define('PLACEMARK_RED', 'http://www.google.com/intl/en_us/mapfiles/ms/micons/red-dot.png');
11
12class KMLFile {
13 private $template = '
14 <?xml version="1.0" encoding="UTF-8"?>
15 <kml xmlns="http://www.opengis.net/kml/2.2">
16 <Document>
17 <name>Wireless Leiden Interactive Nodemap 2.0</name>
18 <open>1</open>
19 <description>Wireless Leiden Interactive Nodemap 2.0</description>
20 <Style id="greenArrowIcon">
21 <IconStyle>
22 <Icon>
23 <href>%PLACEMARK_GREEN%</href>
24 </Icon>
25 </IconStyle>
26 </Style>
27 <Style id="orangeArrowIcon">
28 <IconStyle>
29 <Icon>
30 <href>%PLACEMARK_ORANGE%</href>
31 </Icon>
32 </IconStyle>
33 </Style>
34 <Style id="redArrowIcon">
35 <IconStyle>
36 <Icon>
37 <href>%PLACEMARK_RED%</href>
38 </Icon>
39 </IconStyle>
40 </Style>
41 <Folder>
42 <name>Nodes</name>
43 <description>Nodes from the Wireless Leiden network</description>
44 <LookAt>
45 <longitude>52.161087</longitude>
46 <latitude>4.490153</latitude>
47 <altitude>0</altitude>
48 <heading>0</heading>
49 <tilt>0</tilt>
50 <range>500</range>
51 </LookAt>
52 %CONTENT%
53 </Folder>
54 </Document>
55 </kml>';
56
57 static $fileFirst = 'type,host_name,has_been_checked,check_execution_time,current_state,last_hard_state,last_check,problem_has_been_acknowledged';
58 private $fileContent = array('string', 'string', 'integer', 'double', 'integer', 'integer', 'integer', 'integer');
59
60 private $KMLPlacemarks = array();
61
62 /*
63 * Function: __construct (constructor)
64 * Parameters: -
65 * Function: Creating a new KMLFile
66 */
67 public function __construct() {
68 }
69
70 public function addPlacemark(KMLPlacemark $placemark) {
71 $this->KMLPlacemarks[] = $placemark;
72 }
73
74 public function toString() {
75 $toString = $this->template;
76
77 $placemarkString = '';
78 $placemarkCount = count($this->KMLPlacemarks);
79 for ($i = 0; $i < $placemarkCount; $i++) {
80 $placemarkString .= $this->KMLPlacemarks[$i]->toString();
81 }
82
83 $toString = str_replace('%PLACEMARK_GREEN%', PLACEMARK_GREEN, $toString);
84 $toString = str_replace('%PLACEMARK_ORANGE%', PLACEMARK_ORANGE, $toString);
85 $toString = str_replace('%PLACEMARK_RED%', PLACEMARK_RED, $toString);
86 $toString = str_replace('%CONTENT%', $placemarkString, $toString);
87
88 return $toString;
89 }
90
91 public function write($filename) {
92 // TODO: Write KMLFile to a KML file
93 }
94
95 /*
96 * Function: getPlacemarkByName
97 * Parameters: string $name
98 * Function: Find the first KMLPlacemark with the name $name and return its position. If not found, return false
99 */
100 public function getPlacemarkByName($name) {
101 $nodesCount = count($this->KMLPlacemarks);
102 for ($i = 0; $i < $nodesCount; $i++) {
103 if ($this->KMLPlacemarks[$i]->getName() == $name) {
104 return $i;
105 }
106 }
107 return false;
108 }
109
110 /*
111 * Function: parseLocationFile
112 * Parameters: string $file
113 * Function: Parse the node location file updating or adding KMLPlacemark objects to the current KMLFile object
114 */
115 public function parseLocationFile($file) {
116 $nodesCount = preg_match_all('/\[[a-zA-Z0-9]*\]/i', $file, $nodes, PREG_OFFSET_CAPTURE);
117 for ($i = 0; $i < $nodesCount; $i++) {
118 // TODO: Needs checking for parsing errors
119 $location = $this->findInLocationFile($file, 'location', $nodes[0][$i][1]);
120 $status = $this->findInLocationFile($file, 'status', $nodes[0][$i][1]);
121 $latitude = $this->findInLocationFile($file, 'latitude', $nodes[0][$i][1]);
122 $longitude = $this->findInLocationFile($file, 'longitude', $nodes[0][$i][1]);
123 $interfaces = $this->findInLocationFile($file, 'interfaces', $nodes[0][$i][1]);
124 $masterip = $this->findInLocationFile($file, 'masterip', $nodes[0][$i][1]);
125 $nodetype = $this->findInLocationFile($file, 'nodetype', $nodes[0][$i][1]);
126 $name = $this->findInLocationFile($file, 'name', $nodes[0][$i][1]);
127
128 $descriptionLocation = 'Naam: ' . $name . '<br/>Locatie: ' . $location . '<br/>Status: ' . $status . '<br/>Latitude: ' . $latitude . '<br/>Longitude: ' . $longitude . '<br/>Interfaces: ' . $interfaces . '<br/>Master IP: ' . $masterip . '<br/>Node type: ' . $nodetype . '<br/><br/>';
129
130 if ($placemarkPosition = $this->getPlacemarkByName($name)) {
131 $this->KMLPlacemarks[$placemarkPosition]->setDescriptionLocation($descriptionLocation);
132 $this->KMLPlacemarks[$placemarkPosition]->setLongitude($longitude);
133 $this->KMLPlacemarks[$placemarkPosition]->setLatitude($latitude);
134 } else {
135 $placemark = new KMLPlacemark();
136 $placemark->setName($name);
137 $placemark->setDescriptionLocation($descriptionLocation);
138 $placemark->setLongitude($longitude);
139 $placemark->setLatitude($latitude);
140 $this->addPlacemark($placemark);
141 }
142 }
143 }
144
145 /*
146 * Function: findInLocationFile
147 * Parameters: string $file, string $keyword, integer $offset
148 * Function: Find the $keyword in $file and return the value of $keyword, starting at $offset, on error return false
149 */
150 private function findInLocationFile($file, $keyword, $offset) {
151 $start = strpos($file, $keyword, $offset) + strlen($keyword . ' = ');
152 $end = strpos($file, "\n", $start);
153
154 if ($start && $end && ($start < $end)) {
155 return substr($file, $start, $end - $start);
156 } else {
157 return false;
158 }
159 }
160
161 /*
162 * Function: parseStatusFile
163 * Parameters: string $file
164 * Function: Parse the node status file updating or adding KMLPlacemark objects to the current KMLFile object
165 */
166 public function parseStatusFile($file) {
167 $fileContents = explode("\r\n", $file);
168
169 if ($fileContents[0] != KMLFile::$fileFirst) {
170 trigger_log(LOG_WARNING, 'Contents of file do not match with template of first line', __FILE__, __LINE__);
171 }
172
173 $linesCount = count($fileContents);
174 for ($i = 1; $i < $linesCount - 1; $i++) {
175 $lineContent = explode(',', $fileContents[$i]);
176
177 if (count($lineContent) != count($this->fileContent)) {
178 trigger_log(LOG_WARNING, 'Contents of file do not match with template of lines', __FILE__, __LINE__);
179 }
180
181 // TODO: Process all lines and update KMLPlacemark objects we already have in the current object
182 $type = $lineContent[0];
183 $host_name = str_replace('CNode', '', $lineContent[1]);
184 $has_been_checked = $lineContent[2];
185 $check_execution_time = $lineContent[3];
186 $current_state = $lineContent[4];
187 $last_hard_state = $lineContent[5];
188 $last_check = $lineContent[6];
189 $problem_has_been_acknowledged = $lineContent[7];
190
191 $descriptionStatus = 'Type: ' . $type . '<br/>Host name: ' . $host_name . '<br/>Has been checked: ' . $has_been_checked . '<br/>Check execution time: ' . $check_execution_time . '<br/>Currenr state: ' . $current_state . '<br/>Last hard state: ' . $last_hard_state . '<br/>Last check: ' . $last_check . '<br/>Problem has been acknowledged: ' . $problem_has_been_acknowledged . '<br/><br/>';
192
193 if ($placemarkPosition = $this->getPlacemarkByName($host_name)) {
194 $this->KMLPlacemarks[$placemarkPosition]->setDescriptionStatus($descriptionStatus);
195 } else {
196 $placemark = new KMLPlacemark();
197 $placemark->setName($host_name);
198 $placemark->setDescriptionStatus($descriptionStatus);
199 $this->addPlacemark($placemark);
200 }
201 }
202 }
203}
204?>
Note: See TracBrowser for help on using the repository browser.