resDOM = new DOMDocument("1.0"); $this->resDOM->formatOutput = TRUE; $this->resDOM->preserveWhiteSpace = FALSE; if (!file_exists(wsResultsXml)) { $this->rootEl = $this->resDOM->createElement('wsresults'); $this->resDOM->appendChild($this->rootEl); $this->resDOM->save(wsResultsXml); } $this->resDOM->load(wsResultsXml); $this->resXP = new DOMXPath($this->resDOM); $this->rootEl = $this->resDOM->documentElement; } public function addResult($function_name,$vars,$user,$IP,$output){ $nodes = $this->rootEl->getElementsByTagName($function_name); if($nodes->length < 1){ $funcNode = $this->resDOM->createElement($function_name); $this->rootEl->appendChild($funcNode); } else $funcNode = $nodes->item(0); $oldOutput = $this->resXP->query('//'.$function_name.'/result[@output="'.$output.'"]'); if ($oldOutput->length > 0) $funcNode->removeChild($oldOutput->item(0)); $resNode = $this->resDOM->createElement('result'); $resNode->setAttribute('date',time()); $resNode->setAttribute('user',$user); // $resNode->setAttribute('IP',$IP); $resNode->setAttribute('input',json_encode($vars)); $resNode->setAttribute('output',$output); $funcNode->appendChild($resNode); $this->resDOM->save(wsResultsXml); return $resNode; } public function getResOutputName($function_name,$user,$suffixe,$extension) { $outputFile = WSRESULT.$function_name."_".$user; if (isset($suffixe)) $outputFile .= ("_".$suffixe); if (isset($extension)) $outputFile .= (".".$extension); else $outputFile .= ".xml"; return $outputFile; } } class WebServer { private $isSoap = false; private $userID, $userPWD, $sessionID; private $wsUserMgr; private $resultMgr, $myParamsInfoMgr; private $dataFileName; function __construct() { $this->userID = 'impex'; $this->userPWD = 'impexfp7'; $this->sessionID = $this->userID; $this->myParamsInfoMgr = new ParamsInfoMgr(); $this->resultMgr = new WebResultMgr(); } protected function init($data) { if(is_object($data)) { $vars = get_object_vars($data); $this->isSoap = true; } else $vars = $data; if (isset($vars['userID'])) { $this->userID = $vars['userID']; $this->sessionID = $this->userID; } else { $this->userID = 'impex'; $this->sessionID = $this->userID; } if (isset($vars['password'])) $this->userPWD = $vars['password']; else $this->userPWD = 'impexfp7'; return array('success' => true, 'vars' => $vars); } private function setID(){ $nb_min = 10000; $nb_max = 99999; $nombre = mt_rand($nb_min,$nb_max); $this->IP = $this->getIPclient(); return "PP".$nombre; } /** * Function getIPclient return the IP client sent a request for needs DD scripts (DD_htmllogin, Check_User, DD_Search) * * @param void * @return string */ private function getIPclient(){ if (getenv('REMOTE_ADDR')) { $realIP = getenv('REMOTE_ADDR'); } else { //get local IP $command="hostname -i"; $realIP = exec($command); } return $realIP; } private function timeInterval2Days($TimeInterval){ $divDays = 60*60*24; $nbDays = floor($TimeInterval / $divDays); $divHours = 60*60; $nbHours = floor(($TimeInterval - $divDays*$nbDays)/$divHours); $nbMin = floor(($TimeInterval - $divDays*$nbDays - $divHours*$nbHours)/60); $nbSec = $TimeInterval - $divDays*$nbDays - $divHours*$nbHours - $nbMin*60; $DD = sprintf("%03d", $nbDays); // format ex. 005 not 5 $HH = sprintf("%02d", $nbHours); // format ex. 25 $MM = sprintf("%02d", $nbMin); // format ex. 03 not 3 $SS = sprintf("%02d", $nbSec); // format ex. 02 not 2 return $DD.':'.$HH.':'.$MM.':'.$SS; } /* Start Time into AMDA format YYYY:DOY-1:HH:MM:SS */ private function startTime2Days($startTime){ $ddStart = getdate($startTime); $date_start = sprintf("%04d",$ddStart["year"]).":".sprintf("%03d", $ddStart["yday"]).":" .sprintf("%02d",$ddStart["hours"]).":".sprintf("%02d",$ddStart["minutes"]).":" .sprintf("%02d",$ddStart["seconds"]); return $date_start; } private function rrmdir($dir){ if (is_dir($dir)) { $objects = scandir($dir); foreach ($objects as $object) { // Recursively delete a directory that is not empty and directorys in directory if ($object != "." && $object != "..") { // If object isn't a directory recall recursively this function if (filetype($dir."/".$object) == "dir") $this->rrmdir($dir."/".$object); else unlink($dir."/".$object); } } reset($objects); rmdir($dir); } } protected function initUserMgr() { if (isset($this->wsUserMgr)) return array('success' => true); $this->wsUserMgr = new WSUserMgr(); $this->wsUserMgr->init($this->userID,$this->userPWD,$this->sessionID, $this->isSoap); return array('success' => true); } public function getTimeTablesList($data) { if(is_object($data)) { $vars = get_object_vars($data); $this->isSoap = true; } else $vars = $data; if (isset($vars['userID']) && $vars['userID'] == 'impex'){ if ($this->isSoap) throw new SoapFault("server00","Server Error: AMDA Login procedure failed"); else return array("error" => "Server Error: AMDA Login procedure failed"); } $res = $this->init($data); $vars = $res['vars']; $ttListWSresult = $this->resultMgr->getResOutputName(__FUNCTION__,$this->userID); $dom = new DOMDocument("1.0"); if ($this->userID == 'impex') $loadDom = $dom->load(SHAREDPATH.'WS/Tt.xml'); else $loadDom = $dom->load(USERPATH.$this->userID.'/WS/Tt.xml'); if ($loadDom == FALSE){ if ($this->isSoap) throw new SoapFault("server00","Server Error: AMDA Login procedure failed"); else return array("error" => "Server Error: AMDA Login procedure failed"); } $timetabNode = $dom->documentElement->getElementsByTagName('timetabList'); if ($timetabNode->length < 1){ if ($this->isSoap) throw new SoapFault("server03","Cannot reach TT list"); else return array('success' => false, 'message' => "Server Error: Cannot reach TT list"); } $outDOM = new DOMDocument("1.0"); $outDOM->formatOutput = TRUE; $outDOM->preserveWhiteSpace = FALSE; $newNode = $outDOM->importNode($timetabNode->item(0),TRUE); $outDOM->appendChild($newNode); $outXP = new domxpath($outDOM); $ttNodes = $outXP->query('//timetab'); $outDOM->save($ttListWSresult); $wsres = $this->resultMgr->addResult(__FUNCTION__,$vars,$this->userID,$ttListWSresult); $ttListResult = 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$ttListWSresult); $timeTablesList = array('success' => true, 'TimeTablesList' => $ttListResult); return $timeTablesList; } public function getTimeTable($data) { $res = $this->init($data); $vars = $res['vars']; $ttID = $vars['ttID']; if ($this->userID == 'impex') $ttSrc = SHAREDPATH.'TT/'.$ttID.'.xml'; else $ttSrc = USERPATH.$this->userID.'/TT/'.$ttID.'.xml'; if (!file_exists($ttSrc)) { if ($this->isSoap) throw new SoapFault("server03","Cannot reach time table"); else return array('success' => false, 'message' => "Cannot reach time table"); } $ttWSresult = $this->resultMgr->getResOutputName(__FUNCTION__,$this->userID,$ttID); if (!copy($ttSrc,$ttWSresult)){ if ($this->isSoap) throw new SoapFault("server04","Cannot copy time table"); else return array('success' => false, 'message' => "Cannot copy time table"); } $wsres = $this->resultMgr->addResult(__FUNCTION__,$vars,$this->userID, $ttWSresult); $myTimeTableMgr = new TimeTableMgr($this->userID); $ttWSresultVot = $myTimeTableMgr->xsl2vot($ttWSresult); if( file_exists ( $ttWSresultVot)){ copy($ttWSresultVot, $ttWSresult); unlink( $ttWSresultVot ) ; } return array('success' => true, 'ttFileURL' => 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$ttWSresult)); } public function isAlive(){ $res = $this->init($data); return true; } public function getObsDataTree() { $res = $this->init(); $resMgr = $this->initUserMgr(); $vars = $res['vars']; $locParamSrc = USERPATH.$this->userID.'/WS/LocalParams.xml'; // $remoteParamSrc = USERPATH.$this->userID.'/WS/RemoteParams.xml'; $wsParamSrc = USERPATH.$this->userID.'/WS/WsParams.xml'; $locParamResult = $this->resultMgr->getResOutputName(__FUNCTION__,$this->userID.'_'.'LocalParams'); // $remoteParamResult = $this->resultMgr->getResOutputName(__FUNCTION__,'RemoteParams'); $wsParamResult = $this->resultMgr->getResOutputName(__FUNCTION__,$this->userID.'_'.'WsParams'); if (!copy($locParamSrc,$locParamResult)) $locParamResult = ''; else { $piBase = new DomDocument("1.0"); $piBase->formatOutput = true; $piBase->preserveWhiteSpace = false; $dom = new DomDocument("1.0"); $dom->load($locParamResult); $xsl = new DomDocument("1.0"); $xsl->load(XMLPATH.'dd2WStree.xsl'); $xslt = new XSLTProcessor(); $xslt->importStylesheet($xsl); $dom->loadXML($xslt->transformToXML($dom)); $dom->formatOutput = true; $dom->preserveWhiteSpace = false; $chum_ger = $dom->getElementById("Rosetta@C-G : Plot Only!"); if ($chum_ger != NULL) $chum_ger->setAttribute("target","Churyumov-Gerasimenko"); $dom->save($locParamResult); } // if (!copy($remoteParamSrc,$remoteParamResult)) // $remoteParamResult = ''; if (!copy($wsParamSrc,$wsParamResult)) $wsParamResult = ''; if ($locParamResult !='') $locParamResult = 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$locParamResult); // if ($remoteParamResult !='') $remoteParamResult = 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$remoteParamResult); if ($wsParamResult !='') $wsParamResult = 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$wsParamResult); if (($locParamResult =='') && ($remoteParamResult =='') && ($wsParamResult =='')){ if ($this->isSoap) throw new SoapFault("server05","No params descriptions .xml files for ".$this->userID." user"); else return array('success' => false, 'message' => "No params descriptions .xml files for ".$this->userID." user"); } $wsres = $this->resultMgr->addResult(__FUNCTION__,$vars,$this->userID,$wsParamResult.";".$locParamResult.";".$remoteParamResult); return array('success' => true,'WorkSpace' => array("LocalDataBaseParameters"=>$locParamResult, "RemoteDataBaseParameters"=>$remoteParamResult)); } public function getPlot($data) { $res = $this->init($data); $resMgr = $this->initUserMgr(); $vars = $res['vars']; $mission = $vars["missionID"]; $ID = $this->setID(); // unique JobID $resDirName = WSRESULT.$ID; // Define a temporary directory for results if (is_dir($resDirName)) $this->rrmdir($resDirName); mkdir($resDirName); chmod($resDirName,0775); $dom = new DomDocument("1.0"); $dom->load(plotsXml); chdir($resDirName); // Down to working directory $fileS = fopen("request.list", "w"); $missionTag = $dom->getElementById($mission); $params = $missionTag->getElementsByTagName('param'); $yStart = 0.1; fwrite($fileS,$params->length.PHP_EOL); foreach ($params as $param) { $yStop = $yStart + 0.15; fwrite($fileS,$param->getAttribute('name').' 0 '.$yStart.' 0.95 '.$yStop.' 0 0 0 0'.PHP_EOL); $yStart += 0.15; } $startTime = strtotime($vars["startTime"]); $endTime = strtotime($vars["stopTime"]); $TIMEINTERVAL = $this->timeInterval2Days($endTime - $startTime); $STARTTIME = $this->startTime2Days($startTime); fwrite($fileS, $STARTTIME.PHP_EOL.$TIMEINTERVAL.PHP_EOL); fclose($fileS); $myParamBuilder = new ParamBuilder(); // Process Local Params without codes if they exist if (file_exists(Param."LocalParamsList.xml")) { $localParams = new DomDocument('1.0'); $localParams->load(Param."LocalParamsList.xml"); $xp = new domxpath($localParams); foreach ($params as $param) { $var = $param->getAttribute('name'); $paramTag = $xp->query('//PARAM[.="'.$var.'"]'); if ($paramTag -> length !== 0) { $myParamBuilder->paramLocalBuild($var); } } } // Run command $cmd = DDBIN."DD_Plot request.list ".$this->userID." ".$this->IP." ".DDPROJECT." ".DDPROJLIB; $reqMgr = new RequestMgr(); $pid = $reqMgr->background($cmd); sleep(1); $plotWSresult=WSRESULT.$ID."/request.list.png"; return array('success' => true, 'plotFileURL' => 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$plotWSresult)); } public function getParameterList($data) { $res = $this->init($data); $resMgr = $this->initUserMgr(); $vars = $res['vars']; $locParamSrc = USERPATH.$this->userID.'/WS/LocalParams.xml'; // $remoteParamSrc = USERPATH.$this->userID.'/WS/RemoteParams.xml'; $wsParamSrc = USERPATH.$this->userID.'/WS/WsParams.xml'; $locParamResult = $this->resultMgr->getResOutputName(__FUNCTION__,$this->userID.'_'.'LocalParams'); // $remoteParamResult = $this->resultMgr->getResOutputName(__FUNCTION__,'RemoteParams'); $wsParamResult = $this->resultMgr->getResOutputName(__FUNCTION__,$this->userID.'_'.'WsParams'); if (!copy($locParamSrc,$locParamResult)) $locParamResult = ''; else { $piBase = new DomDocument("1.0"); $piBase->formatOutput = true; $piBase->preserveWhiteSpace = false; $dom = new DomDocument("1.0"); $dom->load($locParamResult); $xsl = new DomDocument("1.0"); $xsl->load(XMLPATH.'dd2WStree.xsl'); $xslt = new XSLTProcessor(); $xslt->importStylesheet($xsl); $dom->loadXML($xslt->transformToXML($dom)); $dom->formatOutput = true; $dom->preserveWhiteSpace = false; $chum_ger = $dom->getElementById("Rosetta@C-G : Plot Only!"); if ($chum_ger != NULL) $chum_ger->setAttribute("target","Churyumov-Gerasimenko"); $dom->save($locParamResult); } // if (!copy($remoteParamSrc,$remoteParamResult)) // $remoteParamResult = ''; if (!copy($wsParamSrc,$wsParamResult)) $wsParamResult = ''; if ($locParamResult !='') $locParamResult = 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$locParamResult); // if ($remoteParamResult !='') $remoteParamResult = 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$remoteParamResult); if ($wsParamResult !='') $wsParamResult = 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$wsParamResult); if (($locParamResult =='') && ($remoteParamResult =='') && ($wsParamResult =='')){ if ($this->isSoap) throw new SoapFault("server05","No params descriptions .xml files for ".$this->userID." user"); else return array('success' => false, 'message' => "No params descriptions .xml files for ".$this->userID." user"); } $wsres = $this->resultMgr->addResult(__FUNCTION__,$vars,$this->userID,$wsParamResult.";".$locParamResult.";".$remoteParamResult); return array('success' => true,'ParameterList' => array("UserDefinedParameters"=>$wsParamResult, "LocalDataBaseParameters"=>$locParamResult, "RemoteDataBaseParameters"=>$remoteParamResult)); } ///////////////////////////////////////START GET DATASET /////////////////////////////// public function getParameter($data) { $multiParam = false; $res = $this->init($data); $resMgr = $this->initUserMgr(); if (!$res['success']){ if ($this->isSoap) throw new SoapFault("server01","Cannot init user manager"); else return array('success' => false, 'message' => "Cannot init user manager"); } $vars = $res['vars']; if ((strtotime($vars["stopTime"]) - strtotime($vars["startTime"])) < 0){ if ($this->isSoap) throw new SoapFault("request01","Start time must be higher than stop time"); else return array('success' => false, 'message' => "Start time must be higher than stop time"); } elseif ((strtotime($vars["stopTime"]) - strtotime($vars["startTime"])) == 0){ if ($this->isSoap) throw new SoapFault("request02","You time interval equal 0 start is ".$vars["stopTime"]." stop is ".$vars["startTime"]); else return array('success' => false, 'message' => "You time interval equal 0"); } $dataFileName = $this->getDataFileName($vars, $multiParam); if ($dataFileName['success']) $this->dataFileName = $dataFileName['fileName']; else { if ($this->isSoap) throw new SoapFault("request03",$dataFileName['message']); else return array('success' => false, 'message' => $dataFileName['message']); } $paramId = array(); array_push($paramId, $vars["parameterID"]); // $paramId[] = $vars["parameterID"]; if (!$vars["timeFormat"]) $timeFormat = "ISO8601"; else $timeFormat = $vars["timeFormat"]; if (!$vars["gzip"]) $gzip = 0; else $gzip = $vars["gzip"]; /* if (!$vars["stream"]) $stream = 0; else $stream = $vars["stream"];*/ $res = $this->doDownloadRequest( array("startTime" => $vars["startTime"], "stopTime" => $vars["stopTime"], "sampling" => $vars["sampling"]), array("params" => $paramId), array("userName" => $this->userID, "userPwd" => $this->userPWD, "sessionID" => $this->sessionID), array("format" => $vars["outputFormat"], "timeFormat"=> $timeFormat, "gzip"=>$gzip, "stream"=>$stream), $dataFileName); if ($res['success']) return $res; else { if ($this->isSoap) throw new SoapFault("request03",$res['message']); else return array('success' => false, 'message' => $res['message']); } } ///////////////////////////////////////START GET ORBITES /////////////////////////////// public function getOrbites($data) { $multiParam = false; $res = $this->init($data); $resMgr = $this->initUserMgr(); if (!$resMgr['success']){ if ($this->isSoap) throw new SoapFault("server01","Cannot init user manager"); else return array('success' => false, 'message' => "Cannot init user manager"); } $vars = $res['vars']; if ((strtotime($vars["stopTime"]) - strtotime($vars["startTime"])) < 0){ if ($this->isSoap) throw new SoapFault("request01","Start time must be higher than stop time"); else return array('success' => false, 'message' => "Start time must be higher than stop time"); } elseif ((strtotime($vars["stopTime"]) - strtotime($vars["startTime"])) == 0){ if ($this->isSoap) throw new SoapFault("request02","You time interval equal 0 start is ".$vars["stopTime"]." stop is ".$vars["startTime"]); else return array('success' => false, 'message' => "You time interval equal 0"); } $spacecraft = $vars["spacecraft"]; $coordinateSystem = $vars["coordinateSystem"]; if ($spacecraft == "GALILEO") $spacecraft = ucfirst(strtolower($spacecraft)); if (!$vars["units"]) $units = "km"; else $units = $vars["units"]; $paramId = array(); $orbitRequest = array("startTime" => $vars["startTime"], "stopTime" => $vars["stopTime"], "spacecraft" => $spacecraft, "coordinateSystem" => $coordinateSystem, "units" => $units ); $orbitesParam = $this->getOrbitesParameter($orbitRequest); if ($orbitesParam['success']) $orbParam = $orbitesParam['parameterID']; else { $orbParam = 'successEstfalse'; if ($this->isSoap) throw new SoapFault("request03",$orbitesParam['message']); else return array('success' => false, 'message' => $orbitesParam['message']); } $dataFileName = $this->getDataFileName($orbitesParam, $multiParam); if ($dataFileName['success']) $this->dataFileName = $dataFileName['fileName']; else { if ($this->isSoap) throw new SoapFault("request03",$dataFileName['message']); else return array('success' => false, 'message' => $dataFileName['message']); } array_push($paramId, $orbParam); // $paramId[] = $vars["parameterID"]; if (!$vars["timeFormat"]) $timeFormat = "ISO8601"; else $timeFormat = $vars["timeFormat"]; if (!$vars["gzip"]) $gzip = 0; else $gzip = $vars["gzip"]; $res = $this->doDownloadRequest( array("startTime" => $vars["startTime"], "stopTime" => $vars["stopTime"], "sampling" => $vars["sampling"]), array("params" => $paramId), array("userName" => $this->userID, "userPwd" => $this->userPWD, "sessionID" => $this->sessionID), array("format" => $vars["outputFormat"], "timeFormat"=> $timeFormat, "gzip"=>$gzip, "stream"=>$stream), $dataFileName); if ($res['success']) return $res; else { if ($this->isSoap) throw new SoapFault("request03",$res['message']); else return array('success' => false, 'message' => $res['message']); } } ///////////////////////////////////////START GET DATASET /////////////////////////////// public function getDataset($data) { $multiParam = true; $res = $this->init($data); $resMgr = $this->initUserMgr(); $vars = $res['vars']; if ((strtotime($vars["stopTime"]) - strtotime($vars["startTime"])) < 0){ if ($this->isSoap) throw new SoapFault("request01","Start time must be higher than stop time"); else return array('success' => false, 'message' => "Start time must be higher than stop time"); } elseif ((strtotime($vars["stopTime"]) - strtotime($vars["startTime"])) == 0){ if ($this->isSoap) throw new SoapFault("request02","You time interval equal 0"); else return array('success' => false, 'message' => "You time interval equal 0"); } $dataFileName = $this->getDataFileName($vars, $multiParam); if ($dataFileName['success']) $this->dataFileName = $dataFileName['fileName']; else { if ($this->isSoap) throw new SoapFault("request03",$dataFileName['message']); else return array('success' => false, 'message' => $dataFileName['message']); } $paramId = array(); $localData = simplexml_load_file(USERPATH.$this->userID.'/WS/LocalParams.xml'); if (!$vars["sampling"]){ $xpath = "//dataset[@xml:id='".$vars['datasetID']."']/@sampling"; $tmp = $localData->xpath($xpath); $vars["sampling"] = (string)$tmp[0]; $matches=array(); preg_match("/([a-z])$/", $vars["sampling"], $matches); $dataFileName = $this->getDataFileName($vars, $multiParam); if ($dataFileName['success']) $this->dataFileName = $dataFileName['fileName']; else { if ($this->isSoap) throw new SoapFault("request03",$dataFileName['message']); else return array('success' => false, 'message' => $dataFileName['message']); } $vars["sampling"] = strtr($vars["sampling"], array($matches[1] => "")); switch ($matches[1]) { case 's': $sampling = floatval($vars["sampling"]); break; case 'm': $sampling = floatval($vars["sampling"])*60; break; case 'h': $sampling = floatval($vars["sampling"])*60*60; break; default: } } $xpath = "//dataset[@xml:id='".$vars['datasetID']."']/parameter/@*[namespace-uri()='http://www.w3.org/XML/1998/namespace' and local-name()='id']"; $pars = $localData->xpath($xpath); foreach ($pars as $p) $paramId[] = (string)$p[0]; if (!$vars["timeFormat"]) $timeFormat = "ISO8601"; else $timeFormat = $vars["timeFormat"]; if (!$vars["gzip"]) $gzip = 0; else $gzip = $vars["gzip"]; $res = $this->doDownloadRequest( array("startTime" => $vars["startTime"], "stopTime" => $vars["stopTime"], "sampling" => $sampling), array("params" => $paramId), array("userName" => $this->userID, "userPwd" => $this->userPWD, "sessionID" => $this->sessionID), array("format" => $vars["outputFormat"], "timeFormat"=> $timeFormat, "gzip"=>$gzip, "stream"=>$stream), $dataFileName); if ($res['success']) return $res; else { if ($this->isSoap) throw new SoapFault("request03",$res['message']); else return array('success' => false, 'message' => $res['message']); } } ////////////////////////////////////////END GET PARAMETERS ///////////////////////////////// protected function getOrbitesParameter($orbitRequest) { $orbitesXml = new DomDocument(); if (file_exists(orbitesXml)) { $orbitesXml -> load(orbitesXml); $xpath = new DOMXpath($orbitesXml); $path = '//orbites[@mission="'.$orbitRequest['spacecraft'].'" and @coordinate_system="'.$orbitRequest['coordinateSystem'].'" and @units="'.$orbitRequest['units'].'" ] '; $orbites = $xpath->query($path); foreach ($orbites as $orbite){ $paramInfo = $this->myParamsInfoMgr->GetDDInfoFromParameterID($orbite->getAttribute('xml:id')); $paramStart = $paramInfo['dataset']['starttime']; $paramStop = $paramInfo['dataset']['stoptime']; if((strtotime($paramStart) <= strtotime($orbitRequest['startTime']) && (strtotime($orbitRequest['stopTime'])) <= strtotime($paramStop))) { return array('success' => true, 'parameterID' => $orbite->getAttribute('xml:id'), 'startTime' => $orbitRequest['startTime'], 'stopTime' => $orbitRequest['stopTime'] ); } } return array('success' => false, 'message' => "Cannot find orbites for ".$orbitRequest['spacecraft']." between ".$orbitRequest['startTime']." in ".$orbitRequest['units']." ".$orbitRequest['coordinateSystem']." and ".$orbitRequest['stopTime']." ($paramStart - $paramStop) "); } else { return array('success' => false, 'message' => "Orbits file doesn't exist"); } } protected function doDownloadRequest($interval,$paramList,$user,$formatInfo,$dataFileName) { $duration = $this->timeIntervalToDuration($interval['startTime'],$interval['stopTime']); if ($interval['sampling']) $structure = 0;// sampling else $structure = 2; // not sampling $obj = (object)array( "nodeType" => "download", "type" => "Download", "downloadSrc" => "0", "structure" => $structure, "sampling" => $interval['sampling'], "output" => "", "header" => "0", "timesrc" => "Interval", "startDate" => $interval['startTime'], "durationDay" => $duration["days"], "durationHour" => $duration["hours"], "durationMin" => $duration["mins"], "durationSec" => $duration["secs"], "list" => $paramList['params'], "milli" => true, "fileformat" => "ASCII", "timeformat" => "YYYY-MM-DDThh:mm:ss", "compression" => "tar+gzip", "leaf" => true, //ToChange "username" => $user['userName'], "password" => $user['userPwd'], "sessionID" => $user['sessionID'] ); $objectMgr = new RequestMgr('download'); if (!$objectMgr){ if ($this->isSoap) throw new SoapFault("server01","Cannot init request manager"); else return array('success' => false, 'message' => "Cannot init request manager"); } // $res = $objectMgr->execute($obj); $downloadResult = $objectMgr->execute($obj); $error = $downloadResult['error']; $pid = $downloadResult['pid']; $bach= false; if ( $downloadResult['pid'] != 0) $bach= true; $jobMgr = new JobsMgr(); if ($bach){ if (!$jobMgr){ if ($this->isSoap) throw new SoapFault("server06","Cannot init job manager"); else return array('success' => false, 'message' => "Cannot init job manager"); } while (!($jobMgr->isFinished($pid))){ sleep(JOBTIMEOUT); } $newName='result_'.$objectMgr->cachekiller(); $objectMgr->postProcessing($downloadResult['rawname'], $newName); $downloadResult['id']= $downloadResult['rawname']; $downloadResult['name'] = $newName; $downloadResult['pid'] = 0; } $from_path = USERPATH.$this->userID.'/RES/'.$downloadResult['id'].'_/'; if (!file_exists($from_path)){ if ($this->isSoap) throw new SoapFault("server07","User result folder doesn't exist $from_path ERROR $error "); else return array('success' => false, 'message' => "User result folder doesn't exist"); } $from_file = $from_path.$downloadResult['name'].'.tar.gz'; if (!file_exists($from_file)){ if ($this->isSoap) throw new SoapFault("server08","Impossible find result file"); else return array('success' => false, 'message' => "Impossible find result file"); } if(($downloadResult['pid'] == 0) && file_exists($from_file)){ if ($formatInfo['format'] == "VOTable"){ $res = $objectMgr->generateVOTableFromDownloadResult($downloadResult['id'], $downloadResult['name']); if ($res['success']){ $outputFile = $res['files'][0]; rename($res['files'][0], WSRESULT.$this->dataFileName.".xml"); $outputFile = WSRESULT.$this->dataFileName.".xml"; } else { if ($this->isSoap) throw new SoapFault("server08",$res['message']); else return array('success' => false, 'message' => $res['message']); } } elseif ($formatInfo['format'] == "netCDF"){ $formatNc = true; if ($this->isSoap) throw new SoapFault("server09","netCDF format not implemented yet"); else return array('success' => false, 'message' => "netCDF format not implemented yet"); } else { exec("tar zxvf $from_file"); exec("mv $from_path*.txt ".WSRESULT."'".$this->dataFileName.".txt'"); $outputFile = WSRESULT.$this->dataFileName.".txt"; chmod ($outputFile, 0664); } } if ($formatInfo['gzip'] == 1){ $zipFile = $outputFile.".gz"; $this->compress($outputFile, $zipFile); $outputFile = $zipFile; } if ($outputFile) { if ($formatInfo['format'] == "VOTable"){ $dom = new DOMDocument; $dom->load($outputFile); $tds = $dom->getElementsByTagName('TD'); if ($tds->length < 1){ if ($this->isSoap) throw new SoapFault("server10","No data"); else return array('success' => false, 'message' => "No data"); } } $outputFile = 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$outputFile); } if ($bach){ $obj = (object)array( "id" => "bkgrd_down_".$pid, "leaf" => true, "nodeType"=>"bkgWorks"); $jobMgr->deleteObject($obj); } else $jobMgr->deleteTmp(); return array('success' => true, 'dataFileURLs' => $outputFile); } protected function timeIntervalToDuration($startTime,$stopTime) { $duration = strtotime($stopTime) - strtotime($startTime); $durationDay = intval($duration/(86400)); $duration = $duration - $durationDay*86400; $durationHour = intval($duration/(3600)); $duration = $duration - $durationHour*3600; $durationMin = intval($duration/(60)); $durationSec = $duration - $durationMin*60; return array("success" => true, "days" => sprintf("%04s", strval($durationDay)), "hours" => sprintf("%02s", strval($durationHour)), "mins" => sprintf("%02s", strval($durationMin)), "secs" => sprintf("%02s", strval($durationSec)) ); } protected function getDataFileName($vars, $multiParam){ if ($vars['startTime'] && $vars['stopTime'] && $vars['parameterID'] && !$multiParam){ $fileName = $vars['parameterID']."-".strtotime($vars['startTime'])."-".strtotime($vars['stopTime'])."-".$vars['sampling']; return array('success' => true, 'fileName' => $fileName); } elseif ($vars['startTime'] && $vars['stopTime'] && $vars['datasetID'] && $multiParam){ $datasetName = strtr($vars["datasetID"], array(":" => "_")); $fileName = $datasetName."-".strtotime($vars['startTime'])."-".strtotime($vars['stopTime'])."-".$vars['sampling']; return array('success' => true, 'fileName' => $fileName); } else { if (!$vars['startTime']) $message="Start time not specified"; if (!$vars['stopTime']) $message="Stop time not specified"; if (!$vars['parameterID'] && !$multiParam) $message="Parameter not specified"; if (!$vars['datasetID'] && $multiParam) $message="DataSet not specified"; return array('success' => false, 'message' => $message); } } private function compress($srcName, $dstName) { $fp = fopen($srcName, "r"); $data = fread ($fp, filesize($srcName)); fclose($fp); $zp = gzopen($dstName, "w9"); gzwrite($zp, $data); gzclose($zp); } } ?>