basesDom = new DomDocument("1.0");
if (!is_dir(RemoteData."/PARAMS"))
mkdir(RemoteData."/PARAMS", 0775, true);
chmod(RemoteData."/PARAMS",0775);
if (!is_dir(RemoteData."/PARAMS_INFO"))
mkdir(RemoteData."/PARAMS_INFO", 0775, true);
chmod(RemoteData."/PARAMS_INFO",0775);
$this->xmlName = USERWSDIR."RemoteParams.xml";
$this->xmlDom = new DomDocument("1.0");
}
public function init() {
if (!file_exists(RemoteData."Bases.xml"))
return array("err" => "No Remote Data Bases");
if (!$this->basesDom->load(RemoteData."Bases.xml"))
return array("err" => "Can not load Remote Data Bases definitions");
$bases = $this->basesDom->getElementsByTagName('dataCenter');
foreach ($bases as $base)
$this->Bases[] = $base->getAttribute('xml:id');
if (!file_exists(USERWSDIR."RemoteParams.xml"))
return array("err" => "RemoteParams file error");
if (!$this->xmlDom->load($this->xmlName))
return array("err" => "RemoteParams file error");
return array("success" => true);
}
/*
* get baseId from parameter descriptor
*/
protected function setBaseId($id)
{
foreach ($this->Bases as $base) {
// Special Themis case
if (substr($id,0,2) == "th") {
$baseId = "THEMIS";
break;
}
if (strncmp($id, $base, strlen($base)) === 0)
{
$baseId = $base;
break;
}
}
$this->center = new $baseId();
}
//
//
// imf
// b_gse
// bx,by,bz
// nT
// GSE
//
// 1e-9>T
// -1.0E31
// phys.magField
// ace-imf-all
// ACE_MAG
//
//
//
//
//
//
//
//
//
public function makeInternalParamXml()
{
if (!$this->center->ViId) return false;
if (!$this->center->ParamId) return false;
// $this->paramId = strtolower($this->center->baseID."_".$this->center->ViId."_".$this->center->ParamId);
$xmlNameRemote = RemoteData."/PARAMS/".$this->paramId.".xml";
$xmlNameTemp = PARAMS_LOCALDB_DIR."/".$this->paramId.".xml";
if (file_exists($xmlNameTemp)) {
return true;
}
if (file_exists($xmlNameRemote)) {
return copy($xmlNameRemote, $xmlNameTemp);
}
$xml = new DomDocument("1.0");
$paramNode = $xml->createElement("param");
$xml->appendChild($paramNode);
$paramNode->setAttribute("xml:id", $this->paramId);
$infoNode = $xml->createElement("info");
$infoNode->appendChild($xml->createElement("name",strtolower($this->center->ParamId)));
$infoNode->appendChild($xml->createElement("short_name",strtolower($this->center->ParamId)));
$size = $this->center->getParamSize();
//TODO spectra components
if ($size > 1)
{
$components = strtolower($this->center->getParamComponents());
}
else {
$components = null;
}
$fillValue = $this->center->getParamFillValue();
if (!$fillValue)
$fillValue = null;
$infoNode->appendChild($xml->createElement("components",$components));
$infoNode->appendChild($xml->createElement("units",$this->center->getParamUnits()));
$infoNode->appendChild($xml->createElement("coordinates_system"));
$infoNode->appendChild($xml->createElement("tensor_order"));
$infoNode->appendChild($xml->createElement("si_conversion"));
$infoNode->appendChild($xml->createElement("fill_value", $fillValue));
$infoNode->appendChild($xml->createElement("ucd"));
$infoNode->appendChild($xml->createElement("dataset_id",strtolower($this->center->ViId)));
$infoNode->appendChild($xml->createElement("instrument_id",strtolower($this->center->baseID." ".$this->center->ViId)));
$getNode = $xml->createElement("get");
$viNode = $xml->createElement("vi");
$baseParamNode = $xml->createElement("baseParam");
$baseParamNode->setAttribute("name", $this->center->ParamId);
$viNode->setAttribute("name", strtolower(strtr($this->center->ViId,"_", ":")));
$viNode->appendChild($baseParamNode);
$getNode->appendChild($viNode);
$paramNode->appendChild($infoNode);
$paramNode->appendChild($getNode);
$paramNode->appendChild($xml->createElement("process"));
$paramNode->appendChild($xml->createElement("output"));
$res = $xml->save($xmlNameRemote);
if ($res)
return copy($xmlNameRemote, $xmlNameTemp);
return $res;
}
protected function makeComponents($node, $size, $components)
{
$compArray = explode(",",$components);
for ($i = 0; $i < $size; $i++)
{
$compNode = $this->xmlDom->createElement("component");
$compNode->setAttribute('xml:id',$this->paramId."($i)");
$compNode->setAttribute('name',strtolower($compArray[$i])); // LABEL
$node->appendChild($compNode);
}
}
protected function addNode($id)
{
// Node exists already
$this->paramId = strtr(strtolower($id),":","_");
if ($this->xmlDom->getElementById($this->paramId)) return true;
// Node to be added
$nodeRemote = $this->center->baseDom->getElementById($id);
// No such node in base.xml
if (!$nodeRemote) return false;
if ($nodeRemote->tagName == 'dataset')
{
$this->center->setViId($nodeRemote->getAttribute('name'));
$status = $this->center->addViToDD();
if (!$status) return false;
$remoteDatasetInfo = DDSERVICE."/BASE/INFO/bases/".$this->center->baseID."/".$this->center->infoFile;
$localDatasetInfo = RemoteData.$this->center->baseID."/".$this->center->infoFile;
if (!copy($remoteDatasetInfo,$localDatasetInfo)) return false;
}
$node = $this->xmlDom->importNode($nodeRemote);
if ($nodeRemote->tagName == 'parameter')
{
$this->center->setParamId($nodeRemote->getAttribute('name'));
$this->center->setViId($nodeRemote->parentNode->getAttribute('name'));
$this->center->setInfoFile();
if (!$this->makeInternalParamXml()) return false;
if (($size = $this->center->getParamSize()) > 1)
{
// make components and args
$components = $this->center->getParamComponents();
$this->makeComponents($node, $size, $components); // return false;
}
// convert remote paramID into AMDA paramID
$node->setAttribute("xml:id", strtr(strtolower($node->getAttribute("xml:id")), ":","_"));
}
$parentRemote= $nodeRemote->parentNode;
$parentRemoteId = $parentRemote->getAttribute('xml:id');
$parent = $this->xmlDom->getElementById($parentRemoteId);
if (!$parent)
{
$parent = $this->xmlDom->importNode($parentRemote);
}
$parent->appendChild($node);
$toAddDataCentertToDoc = false;
while ($parent->tagName != 'dataCenter')
{
$node = $parent;
$parentRemote = $parentRemote->parentNode;
$parentRemoteId = $parentRemote->getAttribute('xml:id');
$parent = $this->xmlDom->getElementById($parentRemoteId);
if (!$parent)
{
if ($parentRemote->tagName == 'dataCenter')
$toAddDataCenterToDoc = true;
$parent = $this->xmlDom->importNode($parentRemote);
$parent->appendChild($node);
}
}
if ($toAddDataCenterToDoc)
{
//TODO if this is necessary ???
// special bases 'hand-made' descriptions
$basesDom = new DomDocument("1.0");
$basesDom -> load(RemoteData.'Bases.xml');
$theBase = $basesDom->getElementById($parent->getAttribute('xml:id'));
if ($theBase) $parent -> setAttribute('name', $theBase->getAttribute('name'));
$this->xmlDom->documentElement->appendChild($parent);
}
return true;
}
/*
* PUBLIC FUNCTIONS
*/
public function saveTree($obj)
{
if (count($obj) == 1)
{
$id = $obj->id;
if ($id == 'root') return array('res' => 'ok');
$this->setBaseId($id);
$res = $this->addNode($id);
if ($res === false) return array("err" => "Cannot add node : $id");
}
else
{
foreach ($obj as $o)
{
$id = $o->id;
if ($id == 'root') continue;
if (!$this->baseId) $this->setBaseId($id);
$res = $this->addNode($id);
if ($res === false) return array("err" => "Cannot add node : $id");
}
}
if (!$this->xmlDom->save($this->xmlName))
return array("err" => "Cannot save RemoteParams.xml");
return array('res' => 'ok');
}
public function deleteFromTree($obj)
{
$id = $obj->id;
$nodeToDelete = $this->xmlDom->getElementById($id);
if (!$nodeToDelete)
return array("err" => "No such id : $id");
$tagName = $nodeToDelete->tagName;
$topTag = "dataCenter"; //"dataRoot";
if ($obj->nodeType && $obj->nodeType == "remoteSimuParam") // FMI_GUMICS case
$topTag = "simulationRegion";
while ( $tagName != $topTag ) // "dataCenter" ?
{
$parentNode = $nodeToDelete->parentNode;
$parentNode->removeChild($nodeToDelete);
$otherChildren = $parentNode->getElementsByTagName($tagName);
if ( $otherChildren->length > 0 )
break;
$nodeToDelete = $parentNode;
$tagName = $nodeToDelete->tagName;
}
$this->xmlDom->save($this->xmlName);
return array('res'=> $obj->id);
}
public function getInfoName($datasetId) {
// if ($this->baseId == 'CDAWEB')
// return strtolower($datasetId)."_00000000_v01.cdf";
return $datasetId.'.xml';
}
}
?>