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;
}
}
?>