public function updateStops()
 {
     $routeArray = Route::getRoutes($this->agency);
     $stopArray = array();
     //Final list of Stop objects
     $bartApiKey = $this->appConfig['BART_API_KEY'];
     //Platform mapping
     $xmlStr = '<?xml version="1.0"?><agency title="BART" shortTitle="bart"></agency>';
     $platformXml = new SimpleXMLElement($xmlStr);
     foreach ($this->xml->stations->station as $s) {
         $stationTag = (string) $s->abbr;
         //Fetch the station details
         $apiURL = str_replace(BartApiEndPoints::ORIG, $stationTag, BartApiEndPoints::STATION_INFO . $bartApiKey);
         $stationInfoXmlBuilder = new XmlObjBuilder($apiURL);
         $stationInfoXml = $stationInfoXmlBuilder->getXmlObj();
         $stopObj = new Stop();
         $stopObj->setAgency($this->agency);
         $stopObj->setTag($stationTag);
         $stopObj->setTitle((string) $stationInfoXml->stations->station->name);
         $stopObj->setLatitude((string) $stationInfoXml->stations->station->gtfs_latitude);
         $stopObj->setLongitude((string) $stationInfoXml->stations->station->gtfs_longitude);
         $stopArray[$stationTag] = $stopObj;
         /************* Add to platform XML object ****************/
         //Add stop node
         $stopNode = $platformXml->addChild("stop");
         $stopNode->addAttribute("tag", $stationTag);
         //Add platform node as a child of the stop node (north)
         $platformNode = $stopNode->addChild("platform");
         $northPlatforms = array();
         foreach ($stationInfoXml->stations->station->north_platforms as $p) {
             foreach ($p as $pNum) {
                 $northPlatforms[] = trim((string) $pNum);
             }
         }
         $platformNode->addAttribute("number", implode(",", $northPlatforms));
         //Add directions as a children of the platform node
         foreach ($stationInfoXml->stations->station->north_routes as $r) {
             foreach ($r->route as $direction) {
                 $dirStr = trim((string) $direction);
                 $dirTagArray = explode(" ", $dirStr);
                 $dirTag = $dirTagArray[1];
                 $platformNode->addChild("direction", $dirTag);
             }
         }
         //Add platform node as a child of the stop node (south)
         $platformNode = $stopNode->addChild("platform");
         $southPlatforms = array();
         foreach ($stationInfoXml->stations->station->south_platforms as $p) {
             foreach ($p as $pNum) {
                 $southPlatforms[] = trim((string) $pNum);
             }
         }
         $platformNode->addAttribute("number", implode(",", $southPlatforms));
         //Add directions as a children of the platform node
         foreach ($stationInfoXml->stations->station->south_routes as $r) {
             foreach ($r as $direction) {
                 $dirStr = trim((string) $direction);
                 $dirTagArray = explode(" ", $dirStr);
                 $dirTag = $dirTagArray[1];
                 $platformNode->addChild("direction", $dirTag);
             }
         }
     }
     //Write platform mapping XML to file
     $fileName = Util::getBaseDirectoryPath(Util::XML_FILE) . "bart-platforms.xml";
     Util::prettyPrintXml($platformXml, $fileName);
     //Write the stops to the database
     try {
         //Pass it to the base RouteUpdate class
         $stopUpdate = new StopUpdate($this->agency, $stopArray);
         $stopUpdate->updateDB();
     } catch (Exception $ex) {
         throw new Exception($ex->getMessage());
     }
 }
 public function updateStops()
 {
     $routeArray = Route::getRoutes($this->agency);
     $flipStopMap = $this->getFlipStopOverrides();
     $stopTitleMap = array();
     $stopLatLonMap = array();
     $uniqueStopsAcrossRoutes = array();
     //Generate maps of stopTag => StopTitle and stopTag => [lat, lon] for
     //later look up
     foreach ($this->xml->route as $r) {
         foreach ($r->stop as $s) {
             $stopTag = (string) $s['tag'];
             $stopTitle = html_entity_decode((string) $s['title']);
             $lat = (string) $s['lat'];
             $lon = (string) $s['lon'];
             $stopTitleMap[$stopTag] = $stopTitle;
             $stopLatLonMap[$stopTag] = array("lat" => $lat, "lon" => $lon);
             $uniqueStopsAcrossRoutes[] = $stopTag;
         }
         //Stops
     }
     //Routes
     //We'll only consider the stops in the directions with show=true
     foreach ($this->xml->route as $r) {
         $routeTag = (string) $r['tag'];
         //if($routeTag != "25") {continue;}
         $routeObj = $routeArray[$routeTag];
         $dirArray = Direction::getDirections($routeObj);
         $agencyName = $routeObj->getAgency()->getShortTitle();
         $trackDuplicatesInDir = array();
         /**
          * @var Array $routeDirDetails - Array representation of the
          * directions and stops in a route
          */
         $routeDirDetails = array();
         foreach ($r->direction as $d) {
             $dirTag = (string) $d['tag'];
             $dirObj = $dirArray[$dirTag];
             $dirStops = array();
             //if ($dirObj->getShow()) {
             foreach ($d->stop as $s) {
                 $stopTag = (string) $s['tag'];
                 $stopTitle = $stopTitleMap[$stopTag];
                 $dirStops[$stopTag] = $stopTitle;
             }
             //Stops
             $routeDirDetails[$dirObj->getTag()] = $dirStops;
             //} //Check for show=true
         }
         //Directions
         //Now that we have the details of the directions for this group,
         //let's find the flip stops
         foreach ($routeDirDetails as $fDirTag => $fDirStops) {
             foreach ($routeDirDetails as $fDirTagDiffDir => $fDirStopsDiffDir) {
                 if ($fDirTag == $fDirTagDiffDir) {
                     continue;
                 }
                 foreach ($fDirStops as $fStopTag => $fStopTitle) {
                     //Check if we have one or more matching flip stops in the
                     //direction we are checking against
                     $fFlipStopInOppDir = $this->getFlipStopsInOppDir($fStopTag, $fStopTitle, $fDirStopsDiffDir);
                     //If we don't have any flip stops continue to the next stop
                     if (count($fFlipStopInOppDir) == 0) {
                         continue;
                     }
                     if (count($fFlipStopInOppDir) > 1) {
                         //We have encountered more than one stop at the
                         //same intersection in a different direction
                         //TODO: This has to go in the e-mail report
                         //Generate the (stopTag, lat, lon) string
                         $fstopLatLonMap = array();
                         $fstopLatLonMap[] = "{$fStopTag}," . implode(",", $stopLatLonMap[$fStopTag]);
                         foreach ($fFlipStopInOppDir as $tempStopForOppDir) {
                             $fstopLatLonMap[] = "{$tempStopForOppDir}," . implode(",", $stopLatLonMap[$tempStopForOppDir]);
                         }
                         $logStr = "More than one stop in diff. direction [agency: " . $agencyName . "] [route: " . $routeTag . "] [current stop|dir: {$fStopTag}|{$fDirTag}] [other stops|dir: " . implode(",", $fFlipStopInOppDir) . "|{$fDirTagDiffDir}] [stop title: " . $fStopTitle . "] [" . implode("|", $fstopLatLonMap) . "]";
                         //$this->logger->log($logStr, Logger::WARN, NxtbusStop::PACKAGE);
                     } else {
                         if (!array_key_exists($fStopTag, $flipStopMap)) {
                             $tempFlipStopTag = $fFlipStopInOppDir[0];
                             $flipStopMap[$fStopTag] = $tempFlipStopTag;
                             $flipStopMap[$tempFlipStopTag] = $fStopTag;
                         }
                     }
                 }
             }
             // Inner loop
         }
         //Find flip stops
     }
     //Routes
     //Check if any of the stops don't have a flip stop
     $uniqueStopsAcrossRoutes = array_unique($uniqueStopsAcrossRoutes);
     foreach ($uniqueStopsAcrossRoutes as $finalCheckStopTag) {
         if (!array_key_exists($finalCheckStopTag, $flipStopMap)) {
             $flipStopMap[$finalCheckStopTag] = "";
         }
     }
     //Create the Stop objects
     $stopArray = array();
     foreach ($this->xml->route as $r) {
         foreach ($r->stop as $s) {
             $stopTag = (string) $s['tag'];
             $stopTitle = html_entity_decode($s['title']);
             if (array_key_exists($stopTag, $flipStopMap) && !array_key_exists($stopTag, $stopArray)) {
                 $stopObj = new Stop();
                 $stopObj->setAgency($this->agency);
                 $stopObj->setTag($stopTag);
                 $stopObj->setTitle((string) $stopTitle);
                 $stopObj->setFlipStopTag($flipStopMap[$stopTag]);
                 $stopObj->setLatitude((string) $s['lat']);
                 $stopObj->setLongitude((string) $s['lon']);
                 $stopArray[$stopTag] = $stopObj;
             }
         }
         //Stops
     }
     //Routes
     try {
         //Pass it to the base RouteUpdate class
         $stopUpdate = new StopUpdate($this->agency, $stopArray);
         $stopUpdate->updateDB();
     } catch (Exception $ex) {
         throw new Exception($ex->getMessage());
     }
 }