From bae6f5dad7efba2b2c64c4389bd7c47ccbe8a19a Mon Sep 17 00:00:00 2001 From: Nathanaƫl Jourdane Date: Fri, 9 Feb 2018 18:15:40 +0100 Subject: [PATCH] bugFix fileName for webservice batch mode --- php/classes/AmdaAction.php | 6 +++--- php/classes/WebServer.php | 210 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------ php/rest/getStatus.php | 2 +- 3 files changed, 136 insertions(+), 82 deletions(-) diff --git a/php/classes/AmdaAction.php b/php/classes/AmdaAction.php index 8342efa..6c5399f 100644 --- a/php/classes/AmdaAction.php +++ b/php/classes/AmdaAction.php @@ -842,9 +842,9 @@ class AmdaAction } /* -* Get Jobs en cours +* Get running jobs */ - public function getJobs($obj = null) + public function getJobs($obj = null) { require_once(INTEGRATION_SRC_DIR."RequestManager.php"); return $this->executeRequest($obj, FunctionTypeEnumClass::PROCESSRUNNINGINFO); @@ -866,7 +866,7 @@ class AmdaAction if (isset($obj->username) && isset($obj->password) && isset($obj->sessionID)) { $dd = new WSUserMgr(); - $dd->init($obj->username,$obj->password,$obj->sessionID); + $dd->init($obj->username,$obj->password,$obj->sessionID, false); // return array('success' => false, "message" => "AKKA-KERNEL-INT - WS support not implemented"); } else diff --git a/php/classes/WebServer.php b/php/classes/WebServer.php index e243aea..105b403 100644 --- a/php/classes/WebServer.php +++ b/php/classes/WebServer.php @@ -113,8 +113,6 @@ class WebServer else $this->userPWD = 'impexfp7'; -// - return array('success' => true, 'vars' => $vars); } @@ -495,7 +493,7 @@ class WebServer } - public function getStatus($data) { + public function getStatus($id) { $obj = (object)array( "username" => $this->userID, "password" => $this->userPWD, @@ -522,17 +520,23 @@ class WebServer // "sendToSamp":false // } - foreach ($jobs['jobsInProgress'] as $job) { - if ($job['id'] == $data['id']) { - return ['success' => true, 'status' => 'in_progress']; - } - } - foreach ($jobs['jobsFinished'] as $job) { - if ($job['id'] == $data['id']) { - return $this->finishDownloadRequest($job); + 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.']; } @@ -597,7 +601,9 @@ class WebServer public function getNewToken() { - $timeStamp = (new DateTime())->getTimestamp(); + 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); @@ -838,7 +844,6 @@ class WebServer 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']); @@ -880,6 +885,49 @@ class WebServer } } + 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) { @@ -888,40 +936,7 @@ class WebServer else $structure = 2; // not sampling - $fileExtension = ""; - switch ($formatInfo['format']) { - case 'netCDF' : - if (!$jobMgr) { - 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 ($formatInfo['timeFormat']) { - case 'unixtime' : - $timeformat = 'Timestamp'; - break; - default : - $timeformat = 'YYYY-MM-DDThh:mm:ss'; - } - - if ($formatInfo['gzip'] == 1) { - $compression = "gzip"; - $kernelExtension .= ".gz"; - $wsExtension .= ".gz"; - } else - $compression = ""; + $fileInfo = $this->getFormatInfo($formatInfo['format'], $formatInfo['timeFormat'], $formatInfo['gzip']); require_once(INTEGRATION_SRC_DIR . "RequestManager.php"); IHMConfigClass::setUserName($this->userID); @@ -966,18 +981,19 @@ class WebServer "startDate" => $interval['startTime'], "stopDate" => $interval['stopTime'], "list" => $params, - "fileformat" => $fileformat, - "timeformat" => $timeformat, - "compression" => $compression, - "extension" => $wsExtension, - "disablebatch" => false + "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); + $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()); @@ -991,43 +1007,37 @@ class WebServer if($downloadResult['status'] == 'in_progress') { return ['success' => true, 'status' => 'in_progress', 'id' => $downloadResult['id']]; } elseif ($downloadResult['status'] == 'done') { - return $this->finishDownloadRequest($downloadResult); + $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($downloadResult) + private function finishDownloadRequest($id, $resTempFilePath, $resOutputFilePath) { - require_once(INTEGRATION_SRC_DIR . "RequestManager.php"); - IHMConfigClass::setUserName($this->userID); - if (!isset($this->paramLoader)) - $this->paramLoader = new IHMUserParamLoaderClass(); - if (!isset($this->requestManager)) - $this->requestManager = new RequestManagerClass(); - - $kernelExtension = '.txt'; // TODO: handle other formats - $wsExtension = '.txt'; - $resultFile = USERPATH . $this->userID . '/RES/' . $downloadResult['folder'] . '/' . $downloadResult['result'] . $kernelExtension; - $outputFile = WSRESULT . $this->dataFileName . $wsExtension; - - if (!file_exists($resultFile)) { - if ($this->isSoap) throw new SoapFault("server04", 'Cannot retrieve result file ' . $resultFile); + 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($resultFile, $outputFile); - chmod($outputFile, 0664); - $outputURL = 'http://' . str_replace(BASE_PATH, $_SERVER['SERVER_NAME'] . APACHE_ALIAS, $outputFile); + rename($resTempFilePath, $resOutputFilePath); + chmod($resOutputFilePath, 0664); + $outputURL = 'http://' . str_replace(BASE_PATH, $_SERVER['SERVER_NAME'] . APACHE_ALIAS, $resOutputFilePath); - $obj = (object)array( - 'id' => $downloadResult['id'] + $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) { - //Nothing to do + error_log("Can not delete file $resOutputFilePath: $e"); } return array('success' => true, 'status' => 'done', 'dataFileURLs' => $outputURL); @@ -1035,7 +1045,6 @@ class WebServer protected function timeIntervalToDuration($startTime, $stopTime) { - $duration = strtotime($stopTime) - strtotime($startTime); $durationDay = intval($duration / (86400)); $duration = $duration - $durationDay * 86400; @@ -1077,7 +1086,52 @@ class WebServer } } - private function compress($srcName, $dstName) + 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"); diff --git a/php/rest/getStatus.php b/php/rest/getStatus.php index f146e43..c74f3cd 100644 --- a/php/rest/getStatus.php +++ b/php/rest/getStatus.php @@ -13,6 +13,6 @@ if (!key_exists("id", $_GET)) { $result = array('success' => false, 'message' => "You must provide a job id."); } else { $amda_ws = new WebServer(); - $result = $amda_ws->getStatus($_GET); + $result = $amda_ws->getStatus($_GET['id']); } echo json_encode($result); \ No newline at end of file -- libgit2 0.21.2