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' ) { $this->id_prefix = 'req_'; } else if ($type == 'download' ) { $this->id_prefix = 'down_'; } else if ($type == 'statistic') { $this->id_prefix = 'stat_'; } 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); } 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) { return parent::validNameObject($p); } public function renameObject($p) { 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); if (empty($obj->last_update)) $obj->last_update = filemtime(USERREQDIR.$id); 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); } else if ($this->type == 'request') { 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); } } } } $additional = array(); $this->descFileName = USERREQDIR.$this->id; $p->id = $this->id; $p->last_update = time(); // 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' => $this->getObjectInfo($p->id), 'last_update' => $p->last_update) + $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' : //TODO check TT as well (first start and last stop ?) if ($obj->timesrc != 'Interval') break; $argsTab = array(); foreach ($obj->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'] = $obj->startDate; $argsTab['stopTime'] = $obj->stopDate; } } if (count($argsTab) > 0) $args[] = $argsTab; break; case 'multiplot': if ($obj->timesrc != 'Interval') break; $argsTab = array(); foreach ($obj->plots as $plot) { foreach ($plot->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'] = $obj->startDate; $argsTab['stopTime'] = $obj->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 'statistic' : 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); } public function getObjectInfo($id) { $info = "Request ID: ".$id."
"; if (!file_exists(USERREQDIR.$id)) { $info .= "ERROR: Cannot retrieve request definition file"; return $info; } $obj = json_decode(file_get_contents(USERREQDIR.$id)); if (empty($obj)) { $info .= "ERROR: Cannot load request definition file"; return $info; } switch ($this->type) { case 'request': $info .= "Plot: "; $panels_list = array(); if (!empty($obj->panels)) { foreach ($obj->panels as $p) { $panel_info = "Panel #".$p->{"panel-index"}.": "; if (empty($p->params)) { $panel_info .= "Empty"; } else { $params_list = array(); if (!empty($p->params)) { foreach ($p->params as $p) { if (!in_array($p->paramid, $params_list)) $params_list[] = $p->paramid; } } if (!empty($params_list)) { $panel_info .= implode(', ', $params_list); } else { $panel_info .= "Empty"; } } $panels_list[] = $panel_info; } } if (!empty($panels_list)) { $info .= '
'.implode('
', $panels_list); } else { $info .= "Empty"; } break; case 'condition': $info .= "Data Mining: ".htmlspecialchars($obj->expression); break; case 'download': $info .= "Download: "; $params_list = array(); if (!empty($obj->list)) { foreach ($obj->list as $p) { if (!in_array($p->paramid, $params_list)) $params_list[] = $p->paramid; } } if (!empty($params_list)) { $info .= implode(', ',$params_list); } else { $info .= "Empty"; } break; case 'statistic': $info .= "Statistic: "; $functions_list = array(); if (!empty($obj->parameter)) { foreach ($obj->parameter as $param) { if (!array_key_exists($param->function, $functions_list)) { $functions_list[$param->function] = array(); } if (!in_array($param->paramid, $functions_list[$param->function])) { $functions_list[$param->function][] = $param->paramid; } } if (!empty($functions_list)) { foreach ($functions_list as $func => $params) { $info .= "
"; $info .= "" . $func . ": " . implode(', ', $params); } } else { $info .= "Empty"; } } else { $info .= "Empty"; } break; default: $info .= "ERROR: Unknown request type"; } return $info; } function modifyObject($p) { $result = parent::modifyObject($p); $result["info"] = $this->getObjectInfo($p->id); return $result; } } ?>