DDsys = getenv("DDBASE")."/DDsys.xml"; $this->DDsysDoc = new DomDocument(); $this->DDsysDoc->preserveWhiteSpace = false; $this->DDsysDoc->formatOutput = true; $this->DDsysDoc->load($this->DDsys); } public function setViInfo($brief) { $this->brief = $brief; $this->times = $brief."_times.nc"; $this->info = $brief."_info.nc"; $this->info_xml = $brief."_info.xml"; $this->cache = $brief."_cache.nc"; } public function setViDir($ViDir) { $this->ViDir = $ViDir; } public function setViId($ViId) { $this->ViId = $ViId; } public function setViParentsInfo($base, $mission, $instrument) { $this->base = $base; $this->mission = $mission; $this->instrument = $instrument; } public function setViSampling($min_sampling, $max_sampling) { $this->min_sampling = $min_sampling; $this->max_sampling = $max_sampling; } public function setViLocation($mission_dir, $location) { $this->location = getenv("DDBASE")."/".$mission_dir."/".$location; $this->ViDir = $this->location; } // For Remote Data Centers public function setViInfoFromFile($base, $ds) { $infoXml = new DomDocument("1.0"); $infoXmlFile = getenv("DDBASE")."/../INFO/DDServer/$base/$ds.xml"; if (!file_exists($infoXmlFile)) return -100; if (!$infoXml->load($infoXmlFile)) return -10; $this->base = $base; $this->mission = $infoXml->getElementsByTagName("Mission")->item(0)->nodeValue; $this->instrument = $infoXml->getElementsByTagName("Instrument")->item(0)->nodeValue; $this->min_sampling = $infoXml->getElementsByTagName("MinSampling")->item(0)->nodeValue; $this->remoteViId = $ds; $this->globalStart = $infoXml->getElementsByTagName("GlobalStart")->item(0)->nodeValue; $this->globalStop = $infoXml->getElementsByTagName("GlobalStop")->item(0)->nodeValue; $fillValue = $infoXml->getElementsByTagName("FillValue"); if ($fillValue->length > 0) $this->fillValue = $fillValue->item(0)->nodeValue; $this->location = getenv("DDBASE")."/".$this->base."/".strtoupper($this->ViId)."/"; $this->ViDir = $this->location; //--------- Check if additional Info should be added to VI // $theFormat = $infoXml->getElementsByTagName("Format")->item(0); // if ($theFormat != NULL) // $AddInfo = ($theFormat->nodeValue == "Text"); // if (!$AddInfo) // $AddInfo = ($infoXml->getElementsByTagName("AdditionalInfoNeed")->item(0) != NULL); return 0; } public function viExists($ViId, $baseId) { $XPath = new DOMXpath($this->DDsysDoc); $dataSet = $XPath->query("//NAME[.='$ViId']"); if ($dataSet->item(0) != NULL) { if ($dataSet->item(0)->getAttribute("base") != $baseId) return false; else return true; } return false; } public function createVi() { $this->makeDDsys(); $this->makeAllInLocation(); } public function deleteVi($ViId, $baseId) { $XPath = new DOMXpath($this->DDsysDoc); $dataSet = $XPath->query("//NAME[.='$ViId']"); if ($dataSet->item(0)->getAttribute("base") != $baseId) return; $ViToDelete = $dataSet->item(0)->parentNode; $location = $ViToDelete->getElementsByTagName('LOCATION')->item(0)->nodeValue; $ViToDelete->parentNode->removeChild($ViToDelete); $this->DDsysDoc->save($this->DDsys); system("makeDDsys"); foreach (glob($location."/*") as $file) unlink($file); rmdir($location); } private function makeAllInLocation() { if (!is_dir($this->location)) mkdir($this->location, 0775, true); $currDir = getcwd(); chdir($this->location); if (!file_exists($this->times)) system("TimesUpdate -r ".$this->times." ".$this->brief."_[0-9]*.nc"); if (!file_exists($this->info_xml)) $this->makeInfoXml(); if (!file_exists($this->info)) system("infoLocal2nc ".$this->info_xml." ".$this->info); if (!file_exists("clean")) { copy(getenv("DDBASE")."/Cache.template", $this->cache); $SED = "sed 's/NAME/".$this->brief."/g' ".getenv("DDBASE")."/Clean.template > clean"; exec($SED); chmod("clean", 0755); } chdir($currDir); } private function makeInfoXml() { $xml_dom = new DomDocument("1.0"); $rootElement = $xml_dom->createElement("VI"); if ($this->base != "LOCAL") $rootElement->appendChild($xml_dom->createElement("DataBaseID",$this->base)); $rootElement->appendChild($xml_dom->createElement("Mission",$this->mission)); $rootElement->appendChild($xml_dom->createElement("Instrument",$this->instrument)); if ($this->base != "LOCAL") $rootElement->appendChild($xml_dom->createElement("DataSetID",$this->remoteViId)); $rootElement->appendChild($xml_dom->createElement("GlobalStart", $this->globalStart)); $rootElement->appendChild($xml_dom->createElement("GlobalStop", $this->globalStop)); $rootElement->appendChild($xml_dom->createElement("MinSampling", $this->min_sampling)); if ($this->max_sampling > $this->min_sampling) $rootElement->appendChild($xml_dom->createElement("MaxSampling", $this->max_sampling)); if ($this->fillValue) $rootElement->appendChild($xml_dom->createElement("FillValue", $this->fillValue)); $rootElement->appendChild($xml_dom->createElement("LocalStart")); $rootElement->appendChild($xml_dom->createElement("LocalStop")); $xml_dom->appendChild($rootElement); $xml_dom->save($this->location."/".$this->info_xml); } private function makeDDsys() { $newNode = $this->DDsysDoc->createElement("VI"); $name = $newNode->appendChild($this->DDsysDoc->createElement("NAME",$this->ViId)); $name->setAttribute('base', $this->base); $name->setAttribute('mission', $this->mission); $name->setAttribute('instrument', $this->instrument); if (substr($this->location, -1) !== "/") $newNode->appendChild($this->DDsysDoc->createElement("LOCATION",$this->location."/")); else $newNode->appendChild($this->DDsysDoc->createElement("LOCATION",$this->location)); $newNode->appendChild($this->DDsysDoc->createElement("TIMES", $this->times)); $newNode->appendChild($this->DDsysDoc->createElement("INFO", $this->info)); $newNode->appendChild($this->DDsysDoc->createElement("CACHE", $this->cache)); $this->DDsysDoc->documentElement->appendChild($newNode); $this->DDsysDoc->save($this->DDsys); system("makeDDsys"); } // public function getRemoteLocation($base, $remoteVi) // { // $XPath = new DOMXpath($this->DDsysDoc); // // $dataSet = $XPath->query("//NAME[.='$ViId']"); // $allVis = $this->DDsysDoc- // // } public function lockVi() { // Stamp -> this directory is being updated touch($this->ViDir."/LOCK"); // fprintf($STDERR,$ViDir." is LOCKED\n"); } public function unlockVi() { if (file_exists($this->ViDir."/LOCK")) unlink($this->ViDir."/LOCK"); // fprintf($STDERR,$ViDir." is UNLOCKED\n"); } public function addRemoteData($id, $ncFiles, $start, $stop) { $WORKING_DIR = getcwd(); chdir($this->ViDir); system("./clean"); foreach ($ncFiles as $ncFile) { //TODO errors //if (!file_exists($ncFile)) rename($WORKING_DIR."/".$ncFile,$this->ViDir."/".$ncFile); system("TimesUpdate -u ".$this->times." ".$ncFile); } system("TimesUpdateNoData ".$this->times." ".$start." ".$stop); chdir($WORKING_DIR); } public function setInfo($infoFile) { $fullInfoName = getenv("DDBASE")."/../INFO/bases/".$this->base."/$infoFile"; if (file_exists($fullInfoName)) unlink($fullInfoName); //TODO errors //if (!file_exists($infoFile)) $WORKING_DIR = getcwd(); rename("$WORKING_DIR/$infoFile", $fullInfoName); } public function updateRemoteStart() { $startStamp = shell_exec("GetStartTime ".$this->location.$this->times); $startIso = date("Y-m-d\TH:i:s", $startStamp).substr(number_format(fmod($startStamp,1),3, '.', ''),1,4)."Z"; $xml_dom = new DomDocument("1.0"); $xml_dom->load($this->location."/".$this->info_xml); $startNode = $xml_dom->getElementsByTagName("GlobalStart")->item(0); $startNode->nodeValue = $startIso; $xml_dom->save($this->location."/".$this->info_xml); $currDir = getcwd(); chdir($this->location); system("infoLocal2nc ".$this->info_xml." ".$this->info); chdir($currDir); } } ?>