type = $type; $this->contentRootId = $type.'-treeRootNode'; $this->contentRootTag = $type.'List'; $this->objTagName = $type; $this->jobXmlName = USERDIR.'jobs.xml'; $this->jobXml = new DomDocument("1.0"); if (file_exists($this->jobXmlName)) { $this->jobXml->load($this->jobXmlName); } $this->attributes = array('name' => ''); $this->optionalAttributes = array(); if ($type == 'request' || $type == 'plottab') { $this->id_prefix = 'req_'; } else { $this->id_prefix = 'cond_'; } if (!file_exists($this->xmlName)) { $this->createDom(); $this->xp = new domxpath($this->contentDom); } putenv("USER_DATA_PATH=".USERDATADIR); putenv("USER_WS_PATH=".USERWSDIR); putenv("PHP_CLASSES_PATH=".CLASSPATH); } protected function setObject($obj) { $this->obj = $obj; } /* * Delete request/condition JSON file */ protected function deleteParameter($id) { if (file_exists(USERREQDIR.$id)) unlink(USERREQDIR.$id); } /* * TODO Check file JSON objects differ in names only */ protected function renameOnly($p) { return false; } public function validNameObject($p) { if ($this->type == 'plottab') { if (empty($p->name)) { return array('valid' => false, 'error' => 'Name is required'); } return array('valid' => true); } return parent::validNameObject($p); } public function renameObject($p) { if ($this->type == 'plottab') { //Rename a plot tab if (!isset($p->parent) || empty($p->parent)) { return array('error' => 'Missing parent definition'); } $plotObj = $this->getObject($p->parent); if (is_array($plotObj) && isset($plotObj['error'])) { return array('error' => $plotObj['error']); } if (!isset($plotObj->tabs)) { return array('error' => 'Cannot retrieve tab in plot request'); } $renameOK = FALSE; foreach ($plotObj->tabs as &$tab) { if ($tab->id == $p->id) { $tab->{'tab-name'} = $p->name; $renameOK = TRUE; break; } } if (!$renameOK) { return array('error' => 'Cannot retrieve tab in plot request 2'); } //Save modification $file = fopen(USERREQDIR.$p->parent, 'w'); fwrite($file, json_encode($plotObj)); fclose($file); return array('id' => $p->id); } return parent::renameObject($p); } /* Stop Time from StartTime and Interval*/ public function convertTime($obj) { $time = strtotime($obj->startDate); $interval = $obj->durationDay*86400 + $obj->durationHour*3600 + $obj->durationMin*60 + $obj->durationSec; $stopTime = gmdate("Y-m-d\TH:i:s", $time+$interval); $obj->stopDate = $stopTime; return $obj; } //TODO public function markAsUndefined($paramId) { $n_requests = 0; return $n_requests; } /* * Get Object JSON!!! (request or condition) into Edit */ public function getObject($id) { if (!file_exists(USERREQDIR.$id)) return array('error' => NO_OBJECT_FILE); if (!($objToGet = $this->contentDom->getElementById($id))) return array('error' => NO_SUCH_ID); $obj = json_decode(file_get_contents(USERREQDIR.$id)); //if alias exists, replace parameter name by alias name if (file_exists(USERWSDIR.'Alias.xml')) { if ($this->type == 'condition') { $obj->expression =$this->setAlias($obj->expression); } else if ($this->type == 'request') { for ($i=0; $i < count($obj->children); $i++) { for ($j=0; $j < count($obj->children[$i]->children); $j++) { $obj->children[$i]->children[$j]->name = $this->setAlias($obj->children[$i]->children[$j]->name); } } //TODO Ajout des SCATTER // if $obj->children[$i]->plotType == "SCATTER" //$obj->children[$i]->scatterParam->data->name pour 1 panel (bug si 2 panels devient $obj->children[$i]->scatterParam->data->data->name) } } //if Start Time - Stop Time if (!$obj->timeTables) $obj = $this->convertTime($obj); return $obj; } /* * Change NAME in JSON resource */ protected function renameInResource($name, $id) { $obj = json_decode(file_get_contents(USERREQDIR.$id)); $obj->name = $name; $file = fopen(USERREQDIR.$id, 'w'); fwrite($file, json_encode($obj)); fclose($file); } /* * Make new request/condition resource file (JSON!!) and add it to content file * ATTENTION : it is not DD parameter!!! */ protected function createParameter($p, $folder) { if ($this -> objectExistsByName($p->name)) { $p->id = $this->getObjectIdByName($p->name); $this -> deleteObject($p); } $this->id = $this->setId(); if (!$this->id) return array('error' => ID_CREATION_ERROR); //if alias exists, replace alias name by parameter name if (file_exists(USERWSDIR.'Alias.xml')) { if ($this->type == 'condition') { $p->expression = $this->resetAlias($p->expression); $info = $p->expression; } else if ($this->type == 'request') { $info = ''; for ($i=0; $i < count($p->children); $i++) { for ($j=0; $j < count($p->children[$i]->children); $j++) { $p->children[$i]->children[$j]->name = $this->resetAlias($p->children[$i]->children[$j]->name); $info = $info.' '.$p->children[$i]->children[$j]->name; } } } } $additional = array(); if ($this->type == 'request') { $additional['tabs'] = array(); if (isset($p->tabs)) { foreach ($p->tabs as $index => $tab) { $additional['tabs'][$index] = array( "name" => (!empty($tab->{'tab-name'})) ? $tab->{'tab-name'} : "Plot ".($index+1), "id" => $tab->id, ); } } } $this->descFileName = USERREQDIR.$this->id; $p->id = $this->id; // save request as json $file = fopen($this->descFileName, 'w'); fwrite($file, json_encode($p)); fclose($file); $this -> addToContent($p, $folder); return array('id' => $this->id, 'info' => $info) + $additional; } public static function checkRequest($obj) { if (!file_exists(orbitsAllXml)) return array('success' => false, 'message' => 'no orbits descriotion file'); //check for orbit templateArgs $args = array(); switch ($obj->nodeType) { case 'request' : foreach ($obj->tabs as $tab) { $timesrc = $tab->{'multi-plot-linked'} ? $obj->timesrc : $tab->timesrc; //TODO check TT as well (first start and last stop ?) if ($timesrc != 'Interval') continue; // select active tab if (!$tab->{'multi-plot-linked'} && $tab->id != $obj->{'last-plotted-tab'}) continue; $argsTab = array(); foreach ($tab->panels as $panel) { $params = array(); foreach ($panel->params as $param) { //TODO not in code spase___IMPEX_ !!! //TODO other models (tsyganenko etc) if (preg_match("#^spase___IMPEX_#", $param->paramid)) { if ($param->template_args->url_XYZ) $params[] = $param->template_args->url_XYZ; } } if (count($params) > 0) { $argsTab['param'] = array_unique($params); $argsTab['startTime'] = $tab->{'multi-plot-linked'} ? $obj->startDate : $tab->startDate; $argsTab['stopTime'] = $tab->{'multi-plot-linked'} ? $obj->stopDate : $tab->stopDate; } } if (count($argsTab) > 0) $args[] = $argsTab; } break; case 'condition' : //$argsTab = array(); if ($obj->timesrc != 'Interval') break; //TODO check for condition break; case 'download' : $argsTab = array(); if ($obj->timesrc != 'Interval') break; foreach ($obj->list as $param) { //TODO not in code spase___IMPEX_ !!! //TODO other models (tsyganenko etc) if (preg_match("#^spase___IMPEX_#", $param->paramid)) { if ($param->template_args->url_XYZ) $params[] = $param->template_args->url_XYZ; } } if (!empty($params)) { // tab is not defined, iterate over $obj->tabs? $argsTab['param'] = array_unique($params); $argsTab['startTime'] = $obj->startDate; $argsTab['stopTime'] = $obj->stopDate; } if (count($argsTab) > 0) $args[] = $argsTab; break; case 'statistics' : return array('success' => true); break; default : return array('success' => false, 'message' => "unknown action ".$obj->nodeType); } if (count($args) === 0) return array('success' => true); try { $client = new SoapClient(DD_WSDL); } catch (SoapFault $exception) { return array('success' => false, 'message' => $exception->faultstring); } $orbitsXml = new DomDocument("1.0"); $orbitsXml->load(orbitsAllXml); $tr = array('_' => ':'); foreach ($args as $tab) { $startTime = $tab['startTime']; $stopTime = $tab['stopTime']; foreach ($tab['param'] as $param) { $orbitNode = $orbitsXml->getElementById($param); $dsId = $orbitNode->getAttribute('dataset'); $mission = $orbitNode->getAttribute('mission'); $target = $orbitNode->getAttribute('target'); try { $res = $client->getStartStop(strtr($dsId,$tr)); $Time = explode("-",$res); $orbStartTime = CommonClass::DDTimeToIso($Time[0]); $orbStopTime = CommonClass::DDTimeToIso($Time[1]); } catch (SoapFault $exception) { return array('success' => false, 'message' => $exception->faultstring); } if (($startTime > $orbStopTime) || ($stopTime < $orbStartTime)) return array('success' => false, 'message' => "Invalid time settings : $mission $target orbiting
$orbStartTime - $orbStopTime"); if ( strtotime($stopTime) - strtotime($startTime) > IMPEX_INTERVAL_LIMIT ) return array('success' => false, 'message' => "Too big interval for IMPEX request : ".IMPEX_INTERVAL_LIMIT/86400.." day limit!"); } } return array('success' => true); } } ?>