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 (DDHtmlLogin, DDCheckUser, 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->userID, $this->userPWD, $this->sessionID); $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') { $sharedObjMgr = new SharedObjectsMgr(); $loadDom = $dom->load($sharedObjMgr->getTreeFilePath()); } 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') { $sharedObjMgr = new SharedObjectsMgr(); $ttSrc = $sharedObjMgr->getDataFilePath('timeTable', $ttID); } 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); $missionTag = $dom->getElementById($mission); $params = $missionTag->getElementsByTagName('param'); $paramsList = array(); foreach ($params as $param) $paramsList[] = $param->getAttribute('name'); $requestObject = (Object)array( "nodeType" => "request", "file-format" => "PNG", "file-output" => "WS", "ws-result-file" => $resDirName . "/request.list.png", "last-plotted-tab" => 1, "timesrc" => "Interval", "startDate" => $vars["startTime"], "stopDate" => $vars["stopTime"], "tabs" => array() ); $pageObject = (Object)array( "id" => 1, "multi-plot-linked" => true, "page-margins-activated" => true, "page-margin-x" => 5, "page-margin-y" => 5, "page-orientation" => "portrait", "page-dimension" => "ISO A4", "page-layout-type" => "vertical", "page-layout-object" => (Object)array( "layout-panel-height" => 0.25, "layout-panel-spacing" => 0, "layout-expand" => false ), "panels" => array() ); foreach ($paramsList as $paramToPlot) { $panelObject = (Object)array( "panel-plot-type" => "timePlot", "axes" => array(), "params" => array() ); $timeAxisObject = (Object)array( "id" => "time", "axis-type" => "time", "axis-range-extend" => true ); $panelObject->{"axes"}[] = $timeAxisObject; $yAxisObject = (Object)array( "id" => "y-left", "axis-type" => "y-left", "axis-range-extend" => true ); $panelObject->{"axes"}[] = $yAxisObject; $paramObject = (Object)array( "id" => 1, "param-id" => $paramToPlot, "param-drawing-type" => "serie", "param-drawing-object" => (Object)array( "serie-yaxis" => "y-left", "serie-lines-activated" => true ) ); $panelObject->{"params"}[] = $paramObject; $pageObject->{"panels"}[] = $panelObject; } $requestObject->{"tabs"}[] = $pageObject; require_once(INTEGRATION_SRC_DIR . "RequestManager.php"); if (!isset($this->requestManager)) $this->requestManager = new RequestManagerClass(); try { $plotResult = $this->requestManager->runIHMRequest($this->userID, $this->getIPclient(), FunctionTypeEnumClass::PARAMS, $requestObject); } catch (Exception $e) { if ($this->isSoap) throw new SoapFault("plot01", 'Exception detected : ' . $e->getMessage()); else return array('success' => false, 'message' => 'Exception detected : ' . $e->getMessage()); } return array('success' => true, 'plotDirectoryURL' => $ID); } public function getResultPlot($data) { $res = $this->init($data); $vars = $res['vars']; $ID = $vars["plotDirectoryURL"]; $filename = WSRESULT . $ID . "/request.list.png"; if (file_exists($filename)) { $plotWSresult = WSRESULT . $ID . "/request.list.png"; return array('success' => true, 'plotFileURL' => 'http://' . str_replace(BASE_PATH, $_SERVER['SERVER_NAME'] . APACHE_ALIAS, $plotWSresult)); } else return array('success' => false); } public function getStatus($id) { $obj = (object)array( "username" => $this->userID, "password" => $this->userPWD, "sessionID" => $this->sessionID ); $aa = new AmdaAction(); $jobs = $aa->getJobs($obj); // job = // { // "success":true, // "id":"process_aiaoh7_1517403874_1372", // "name":"download_data_1517403886", // "status":"in_progress", // "jobType":"download", // "info":" ", // "start":"31-01-2018 13:04:34", // "stop":"unknown", // "folder":"DDpTDRrk_", // "result":"result_pTDRrk", // "format":"unknown", // "compression":"", // "sendToSamp":false // } if (intval($jobs['nInProgress']) > 0) { foreach ($jobs['jobsInProgress'] as $job) { if ($job['id'] == $id) { return ['success' => true, 'status' => 'in_progress']; } } } if (intval($jobs['nFinished']) > 0) { foreach ($jobs['jobsFinished'] as $job) { if ($job['id'] == $id) { $vars = $this->getVarsFromRunningPath($job['runningPath']); $resTempFilePath = USERPATH . $this->userID . '/RES/' . $job['folder'] . '/' . $job['result'] . $vars['kernelExtension']; $resOutputFilePath = WSRESULT.$vars['dataFileName'].$vars['wsExtension']; return $this->finishDownloadRequest($job['id'], $resTempFilePath, $resOutputFilePath); } } } return ['success' => false, 'message' => 'No job found for this id.']; } 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)); } public function getNewToken() { require_once(INTEGRATION_SRC_DIR."RequestManager.php"); $timeStamp = (new DateTime())->getTimestamp(); // generate token from timeStamp and some salt $newToken = md5(1321 * (int)($timeStamp / timeLimitQuery)); return array('success' => true, 'token' => $newToken); } ///////////////////////////////////////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"]; $sampling = key_exists("sampling", $vars) ? $vars["sampling"] : false; $gzip = key_exists("gzip", $vars) ? $vars["gzip"] : 0; $outputFormat = key_exists("outputFormat", $vars) ? $vars["outputFormat"] : false; $timeFormat = key_exists("timeFormat", $vars) ? $vars["timeFormat"] : "ISO8601"; $stream = key_exists("stream", $vars) ? $vars["stream"] : 0; $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" => $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"); } } private function getFormatInfo($fileFormat, $timeFormat, $gzip) { switch ($fileFormat) { case 'netCDF' : if ($this->isSoap) { throw new SoapFault("server01", "netCDF format not implemented"); } else { return array('success' => false, 'message' => "netCDF format not implemented"); } break; case 'VOTable' : $fileFormat = "vot"; $kernelExtension = ".vot"; $wsExtension = ".xml"; break; case 'ASCII' : default : $fileFormat = "ASCII"; $kernelExtension = ".txt"; $wsExtension = ".txt"; } switch ($timeFormat) { case 'unixtime' : $timeFormat = 'Timestamp'; break; default : $timeFormat = 'YYYY-MM-DDThh:mm:ss'; } if ($gzip == 1) { $compression = "gzip"; $kernelExtension .= ".gz"; $wsExtension .= ".gz"; } else $compression = ""; return ['success' => true, 'kernelExtension' => $kernelExtension, 'wsExtension' => $wsExtension, 'fileFormat' => $fileFormat, 'timeFormat' => $timeFormat, 'compression' => $compression]; } protected function doDownloadRequest($interval, $paramList, $user, $formatInfo, $dataFileName) { if ($interval['sampling']) $structure = 0;// sampling else $structure = 2; // not sampling $fileInfo = $this->getFormatInfo($formatInfo['format'], $formatInfo['timeFormat'], $formatInfo['gzip']); require_once(INTEGRATION_SRC_DIR . "RequestManager.php"); IHMConfigClass::setUserName($this->userID); if (!isset($this->paramLoader)) $this->paramLoader = new IHMUserParamLoaderClass(); //Build parameter list $params = array(); //TODO template arguments to implementer ? foreach ($paramList['params'] as $paramId) { $param = new stdClass; if (preg_match("#^ws_#", $paramId)) { $res = $this->paramLoader->getDerivedParameterNameFromId($paramId); if (!$res["success"]) { if ($this->isSoap) throw new SoapFault("server02", 'Not available derived parameter ' . $paramId); else return array('success' => false, 'message' => 'Not available derived parameter ' . $paramId); } $param->paramid = "ws_" . $res['name']; } else if (preg_match("#^wsd_#", $paramId)) { $res = $this->paramLoader->getUploadedParameterNameFromId($paramId); if (!$res["success"]) { if ($this->isSoap) throw new SoapFault("server02", 'Not available user parameter ' . $paramId); else return array('success' => false, 'message' => 'Not available user parameter ' . $paramId); } $param->paramid = "wsd_" . $res['name']; } else { $param->paramid = $paramId; } $params[] = $param; } $obj = (object)array( "nodeType" => "download", "downloadSrc" => "0", "structure" => $structure, "refparamSampling" => false, "sampling" => $interval['sampling'], "timesrc" => "Interval", "startDate" => $interval['startTime'], "stopDate" => $interval['stopTime'], "list" => $params, "fileformat" => $fileInfo['fileFormat'], "timeformat" => $fileInfo['timeFormat'], "compression" => $fileInfo['compression'], "extension" => $fileInfo['wsExtension'], "disablebatch" => false, "dataFileName" => $this->dataFileName ); if (!isset($this->requestManager)) $this->requestManager = new RequestManagerClass(); try { $downloadResult = $this->requestManager->runIHMRequest($this->userID, $this->getIPclient(), FunctionTypeEnumClass::PARAMS, $obj); } catch (Exception $e) { if ($this->isSoap) throw new SoapFault("server02", 'Exception detected : ' . $e->getMessage()); else return array('success' => false, 'message' => 'Exception detected : ' . $e->getMessage()); } if (!$downloadResult['success']) { if ($this->isSoap) throw new SoapFault("server03", $downloadResult['message']); else return array('success' => false, 'message' => $downloadResult['message']); } if($downloadResult['status'] == 'in_progress') { return ['success' => true, 'status' => 'in_progress', 'id' => $downloadResult['id']]; } elseif ($downloadResult['status'] == 'done') { $resTempFilePath = USERPATH . $this->userID . '/RES/' . $downloadResult['folder'] . '/' . $downloadResult['result'] . $fileInfo['kernelExtension']; $resOutputFilePath = WSRESULT.$this->dataFileName.$fileInfo['wsExtension']; return $this->finishDownloadRequest($downloadResult['id'], $resTempFilePath, $resOutputFilePath); } else { return ['success' => false, 'message' => 'Unknown status ' . $downloadResult['status'] . '.']; } } private function finishDownloadRequest($id, $resTempFilePath, $resOutputFilePath) { if (!file_exists($resTempFilePath)) { if ($this->isSoap) throw new SoapFault("server04", 'Cannot retrieve result file ' . $resTempFilePath); else return ['success' => false, 'message' => 'Cannot retrieve result file']; } rename($resTempFilePath, $resOutputFilePath); chmod($resOutputFilePath, 0664); $outputURL = 'http://' . str_replace(BASE_PATH, $_SERVER['SERVER_NAME'] . APACHE_ALIAS, $resOutputFilePath); $obj = (object)array( 'id' => $id ); require_once(INTEGRATION_SRC_DIR . "RequestManager.php"); if (!isset($this->requestManager)) $this->requestManager = new RequestManagerClass(); try { $downloadResult = $this->requestManager->runIHMRequest($this->userID, $this->getIPclient(), FunctionTypeEnumClass::PROCESSDELETE, $obj); } catch (Exception $e) { error_log("Can not delete file $resOutputFilePath: $e"); } return array('success' => true, 'status' => 'done', 'dataFileURLs' => $outputURL); } 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']); if (isset($vars['sampling']) && $vars['sampling'] != "" && $vars['sampling'] != 0) $fileName .= "-" . $vars['sampling']; return array('success' => true, 'fileName' => $fileName); } else if ($vars['startTime'] && $vars['stopTime'] && $vars['datasetID'] && $multiParam) { $datasetName = strtr($vars["datasetID"], array(":" => "_")); $fileName = $datasetName . "-" . strtotime($vars['startTime']) . "-" . strtotime($vars['stopTime']); if (isset($vars['sampling']) && $vars['sampling'] != "" && $vars['sampling'] != 0) $fileName .= "-" . $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 getVarsFromRunningPath($runningPath) { $filePath = $runningPath . "request_0.xml"; if (file_exists($filePath)) { $requestXml = new DOMDocument(); $requestXml->load($filePath); } else { return ['success' => false, 'message' => 'Failed to open request file.']; } $fileFormat = $requestXml->getElementsByTagName('fileFormat')->item(0)->nodeValue; $timeFormat = $requestXml->getElementsByTagName('timeFormat')->item(0)->nodeValue; $gzip = 0; // todo $requestXml->getElementsByTagName('gzip')->item(0)->nodeValue; // get kernelExtension, wsExtension, fileFormat, timeFormat, compression: $vars = $this->getFormatInfo($fileFormat, $timeFormat, $gzip); require_once(INTEGRATION_SRC_DIR . "InputOutput/IHMImpl/Tools/CommonClass.php"); $cc = new CommonClass(); $vars['parameterID'] = $requestXml->getElementsByTagName('param')->item(0)->getAttribute('id'); $ddStart = $requestXml->getElementsByTagName('startTime')->item(0)->nodeValue; $ddInterval = $requestXml->getElementsByTagName('timeInterval')->item(0)->nodeValue; $vars['startTime'] = $cc->DDTimeToIso($ddStart); $vars['stopTime'] = $cc->DDStartIntervalToStopIso($ddStart, $ddInterval); $sampling = $requestXml->getElementsByTagName('sampling')->item(0); if (!is_null($sampling)) $vars['sampling'] = $sampling->nodeValue; if (in_array(null, $vars, true)) { return ['success' => false, 'message' => 'Can not create data file name because a value is missing in the request file.']; } $getDataFileName = $this->getDataFileName($vars, false); if (!$getDataFileName['success']) { return $getDataFileName; } $vars['dataFileName'] = $getDataFileName['fileName']; return $vars; } 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); } } ?>