ws = new DomDocument("1.0");
$this->wsDir = OLDUSERPATH.TRANSFERUSER.'/WS/';
$this->ws_deleted = array();
}
public function checkWS() {
// old ws
if (!is_dir(OLDUSERPATH.TRANSFERUSER)) {
error_log('no '.TRANSFERUSER.' at old AMDA',1,email);
return array('success' => false, 'error' => 'Sorry, it seems you have no account at old AMDA');
}
if (!file_exists($this->wsDir.'ws.xml')) {
error_log('no ws.xml for '.TRANSFERUSER,1,email);
return array('success' => false, 'error' => 'Sorry, we failed to find your workspace at old AMDA');
}
if (!$this->ws->load($this->wsDir.'ws.xml')) {
error_log('cannot load ws.xml for '.TRANSFERUSER,1,email);
return array('success' => false, 'error' => 'Sorry, we failed to access your workspace at old AMDA');
}
return array('success' => true);
}
public function hasAlias($expression) {
return (strpos($expression, "#") !== false);
}
public function replaceAliases($expression){
$aliasXML = new DomDocument("1.0");
$aliasXML->load($this->wsDir.'alias.xml');
$aliases_ = $aliasXML->getElementsByTagName('alias');
if ($aliases_->length == 0) return $expression;
$aliases = array();
foreach ($aliases_ as $alias) {
$aliases["#".$alias->getAttribute("name")] = $alias->nodeValue;
}
// sort in desc order by key (alias itself)
krsort($aliases, SORT_NATURAL);
foreach ($aliases as $alias => $param) {
if (!$this->hasAlias($expression))
break;
if (strpos($expression, $alias) !== false) {
$newExp = str_replace($alias, $param, $expression);
$expression = $newExp;
}
}
return $expression;
}
//duplication of FilesMgr method
public function getSampling($fileName, $format) {
if ($format === 'cdf') {
copy($fileName, "temp.cdf");
exec('cdfsamplingfromdata ', $result);
unlink("temp.cdf");
$minSamp = $result[count($result)-1];
}
else if ($format === 'cef') {
exec('cefsampling '.$fileName, $result);
$minSamp = $result[count($result)-1];
}
else $minSamp = null;
//TODO if min & max
return $minSamp;
}
public function deleteParam($exp, $isPlot) {
$deletedXML = new DomDocument("1.0");
if ($isPlot) $deletedXML->load(CONVERSIONDIR.'Plot_Deleted.xml');
else $deletedXML->load(CONVERSIONDIR.'Deleted.xml');
$deletedNodes = $deletedXML->getElementsByTagName('deleted');
$toDelete = false;
if (strpos($exp, "CDAWEB") !== false)
return true;
foreach ($deletedNodes as $item) {
if (strpos($exp, $item->getAttribute('xml:id')) !== false) {
$toDelete = true;
break;
}
}
return $toDelete;
}
public function updateParams($expression, $isPlot){
$convertXML = new DomDocument("1.0");
if ($isPlot) $fileNames = glob(CONVERSIONDIR.'*_convertPlot.xml');
else $fileNames = glob(CONVERSIONDIR.'*_convert.xml');
foreach ($fileNames as $file) {
if (!$convertXML->load($file))
error_log('ERROR loading '.$file,1,email);
$convertedNodes = $convertXML->getElementsByTagName('param_convert');
foreach ($convertedNodes as $item) {
$pairs[$item->getAttribute('oldid')] = $item->getAttribute('xml:id');
}
krsort($pairs, SORT_NATURAL);
$newExp = strtr($expression, $pairs);
$expression = $newExp;
}
return $expression;
}
public function convertArgs($parId, $args){
//TODO arguments.php via Ext.Direct call
$cmd = 'php '.BASE_PATH.'php/arguments.php "'.$parId.'"';
$arguments = explode(",", $args);
$newArgs = array();
$res = exec($cmd);
//TODO just main arguments....
foreach ($arguments as $item) {
if (strpos($item, "/") !== false)
$arg = substr($item,1,strlen($item));
switch ($arg) {
case "black" :
case "blue" :
case "green" :
case "red" :
$newArgs[] = "Color=".$arg;
break;
case "gsm" :
case "sm" : if (strpos($res, $arg) !== false)
$newArgs[] = "RefFrame=".strtoupper($arg);
break;
case "log" :
case "lin" : if (strpos($res, $arg) !== false)
$newArgs[] = "Scale=".$arg;
break;
case "cyl" :
$newArgs[] = "OrbitPresentation=".strtoupper($arg);
break;
default :
}
}
if (count($arguments) === 0) return "select...";
if (count($arguments) > 1) return implode("&",$newArgs);
return $newArgs;
}
public function createFolders($listName, $nodeType){
// create folders
$folders = $this->ws->getElementsByTagName($listName)->item(0)->getElementsByTagName('level1');
$obj = new stdClass();
foreach ($folders as $folder) {
$obj->leaf = false;
$obj->old_name = "new Folder";
$obj->name = $folder->getAttribute('name');
$obj->parent = $nodeType."-treeRootNode";
$obj->nodeType = $nodeType;
$this->Mgr->renameObject($obj);
}
}
public function transferDerived() {
$msg = 'WS (Derived) Params:
';
// derived parameters
$this->Mgr = new DerivedParamMgr('derivedParam');
$this->createFolders('paramList','derivedParam');
// get old params
$wsParams = $this->ws->getElementsByTagName('param');
if ($wsParams->length == 0) {
return array('success' => true, 'msg' => 'No parameters');
}
$obj = new stdClass();
foreach ($wsParams as $param) {
$obj->name = $param->getElementsByTagName('name')->item(0)->nodeValue;
$expression = $param->getElementsByTagName('buildchain')->item(0)->nodeValue;
if ($this->hasAlias($expression)) {
$newExp = $this->replaceAliases($expression);
$expression = $newExp;
}
if ($this->deleteParam($expression)) {
$msg .= 'deleted name:'.$obj->name.'; expression: '.$expression.'
';
// error_log( 'For INFO : DELETED '.$expression,1,email);
$this->ws_deleted[] = $obj->name;
continue;
}
$obj->buildchain = $this->updateParams($expression);
$obj->timestep = $param->getElementsByTagName('timestep')->item(0)->nodeValue;
$obj->units = $param->getElementsByTagName('units')->item(0)->nodeValue;
$obj->description = $param->getElementsByTagName('description')->item(0)->nodeValue;
$obj->ytitle = "";
$obj->nodeType = "derivedParam";
$obj->leaf = true;
$this->Mgr->objectDom = new DomDocument("1.0");
if ($param->parentNode->tagName === 'level1') {
$folder_id = $param->parentNode->getAttribute('id');
$this->Mgr->createObject($obj, $folder_id);
}
else {
$this->Mgr->createObject($obj);
}
}
$msg .= ' ok
';
return array('success' => true, 'msg' => $msg);
}
public function transferTimeTables() {
$msg = 'Time Tables:
';
// time tables
$this->Mgr = new TimeTableMgr();
$this->createFolders('timetabList','timeTable');
$TTdir = OLDUSERPATH.TRANSFERUSER."/TT/";
// get old time tabs
$timeTabs = $this->ws->getElementsByTagName('timetab');
if ($timeTabs->length == 0) {
return array('success' => true, 'msg' => 'No time tables');
}
$obj = new stdClass();
$ttXML = new DomDocument("1.0");
foreach ($timeTabs as $item) {
$obj->name = $item->getElementsByTagName('name')->item(0)->nodeValue;
$obj->created = $item->getElementsByTagName('created')->item(0)->nodeValue;
$obj->description = $item->getElementsByTagName('condition')->item(0)->nodeValue;
$obj->history = 'From old AMDA';
$obj->nodeType = "timeTable";
$obj->leaf = true;
// intervals
if (!$ttXML->load($TTdir.$obj->name.".xml")) {
$msg .= 'failed to copy '.$obj->name.'
';
continue;
}
$intervals = $ttXML->getElementsByTagName("Interval");
$ints = array();
foreach ($intervals as $interval){
$int = new stdClass();
$int->start = $interval->getElementsByTagName("Start")->item(0)->nodeValue;
$int->stop = $interval->getElementsByTagName("Stop")->item(0)->nodeValue;
$ints[] = $int;
}
$obj->nbIntervals = $intervals->length;
$this->Mgr->objectDom = new DomDocument("1.0");
if ($item->parentNode->tagName === 'level1') {
$folder_id = $item->parentNode->getAttribute('id');
$res = $this->Mgr->createObject($obj, $folder_id);
}
else {
$res = $this->Mgr->createObject($obj);
}
if ($res['id']) {
$res = $this->Mgr->saveIntervals($res['id'],$ints,'create');
if (!$res['success'])
$msg .= 'failed copy Time Table '. $obj->name.'
';
}
else {
$msg .= 'failed copy Time Table '. $obj->name.'
';
}
}
$msg .= ' ok
';
return array('success' => true, 'msg' => $msg);
}
public function transferConditions() {
$msg = 'Conditions:
';
// conditons
$this->Mgr = new RequestMgr('condition');
$condDir = OLDUSERPATH.TRANSFERUSER."/REQ/";
// get old conditions
$conditions = glob($condDir."*.cond");
if (count($conditions) == 0) {
return array('success' => true, 'msg' => 'No conditions');
}
$obj = new stdClass();
foreach ($conditions as $item) {
$cond = file($item, FILE_IGNORE_NEW_LINES);
$obj->name = substr(basename($item), 0, -5);
$expression = $cond[0];
if ($this->hasAlias($expression)) {
$newExp = $this->replaceAliases($expression);
$expression = $newExp;
}
if ($this->deleteParam($expression)) {
$msg .= 'deleted name:'.$obj->name.'; expression:'.$expression.'
';
continue;
}
$obj->expression = $this->updateParams($expression);
$obj->sampling = $cond[1];
$obj->gap = $cond[2];
$obj->description = "From old AMDA";
$obj->timesrc = "Interval";
if ($cond[3]) {
$obj->startDate = str_replace(":", "-", substr($cond[3],0,10))."T".substr($cond[3],11,8);
$obj->durationDay = "0".substr($cond[4],0,3);
$obj->durationHour = substr($cond[4],4,2);
$obj->durationMin = substr($cond[4],7,2);
$obj->durationSec = substr($cond[4],10,2);
}
else {
$timestamp = mktime(0, 0, 0, date("m"), date("d")-1, date("Y"));
$obj->startDate = date('Y-m-d\TH:i:s',$timestamp);
$obj->durationDay = "0001";
$obj->durationHour = "00";
$obj->durationMin = "00";
$obj->durationSec = "00";
}
$obj->nodeType = "condition";
$obj->leaf = true;
$this->Mgr->createObject($obj);
}
$msg .= ' ok
';
return array('success' => true, 'msg' => $msg);
}
public function transferRequests() {
$msg = 'Requests:
';
// requests
$this->Mgr = new RequestMgr('request');
$reqDir = OLDUSERPATH.TRANSFERUSER."/REQ/";
// get old requests
$requests = glob($reqDir."*.xml");
if (count($requests) == 0) {
return array('success' => true, 'msg' => 'No requests');
}
$reqXML = new DomDocument("1.0");
$obj = new stdClass();
foreach ($requests as $item) {
if (!$reqXML->load($item)) {
$msg .= 'failed to copy '.substr(basename($item), 0, -4).'
';
}
$obj->name = substr(basename($item), 0, -4);
$obj->tabId = 1;
$obj->outputName = '';
$obj->orientation = strtoupper($reqXML->getElementsByTagName('orientation')->item(0)->nodeValue);
$obj->format = 'PNG';
$obj->title = '';
$obj->description = 'From old AMDA';
$obj->charSize = 1.3;
$obj->thickness = 1;
$obj->ppp = 3000;
$obj->forcedLayout = false;
$obj->forcedMulti = false;
$obj->timesrc = 'Interval';
$start = $reqXML->getElementsByTagName('StartTime')->item(0)->nodeValue;
$obj->startDate = str_replace(":", "-", substr($start,0,10))."T".substr($start,11,8);
$tint = $reqXML->getElementsByTagName('TimeInt')->item(0)->nodeValue;
$obj->durationDay = "0".substr($tint,0,3);
$obj->durationHour = substr($tint,4,2);
$obj->durationMin = substr($tint,7,2);
$obj->durationSec = substr($tint,10,2);
// Panels
$obj->children = array();
$panels = array();
$params = $reqXML->getElementsByTagName('param');
foreach ($params as $param) {
$parId = $param->getAttribute('xml:id');
//check deleted ws_
if ($this->ws_deleted && strtolower(substr($parId,0,3) == "ws_")) {
foreach ($this->ws_deleted as $item) {
if ($item === $parId) {
$msg .= 'ws param deleted '.$parId.'
';
continue 2;
}
}
}
if (substr($parId,0,3) == "WS_")
$parId = strtolower($parId);
if ($this->deleteParam($parId, true)) {
$msg .= 'param deleted '.$parId.'
';
continue;
}
$newParId = $this->updateParams($parId, true);
$panelNumber = $param->getAttribute('panel');
//print_r($obj->name." ".$panelNumber.PHP_EOL);
// no such panel -> create
if (!$panels[$panelNumber]) {
$aPanel = new stdClass();
$aPanel->name = 'Panel '.$panelNumber;
$aPanel->leaf = false;
$aPanel->text = 'Panel '.$panelNumber;
$aPanel->width = $param->getAttribute('width');
$aPanel->height = $param->getAttribute('height');
$aPanel->xTitle = "";
$aPanel->xRangeMin = $param->getAttribute('xmin');
$aPanel->xRangeMax = $param->getAttribute('xmax');
$aPanel->y1Title = "";
$aPanel->y1RangeMin = $param->getAttribute('ymin');
$aPanel->y1RangeMax = $param->getAttribute('ymax');
$aPanel->y2Title = "";
$aPanel->y2RangeMin = 0;
$aPanel->y2RangeMax = 0;
$aPanel->plotType = "TIME";
$panels[$panelNumber] = $aPanel;
$panels[$panelNumber]->children = array();
}
// add parameter to the panel
$aParameter = new stdClass();
$aParameter->name = $newParId;
$aParameter->text = $newParId;
$aParameter->leaf = true;
$aParameter->yaxe = false;
//TODO if we need to check this reallY???
$aParameter->isScatter = false;
$aParameter->needsArgs = false;
if ($param->getAttribute('args') === "")
$aParameter->paramArgs = "select...";
else
$aParameter->paramArgs = $this->convertArgs($newParId, $param->getAttribute('args'));
$panels[$panelNumber]->children[] = $aParameter;
}
// if there are unordered keys json_encode interprate array as object....
$obj->children = array_values($panels);
$obj->nodeType = "request";
$obj->leaf = true;
$this->Mgr->createObject($obj).PHP_EOL;
}
$msg .= ' ok
';
return array('success' => true, 'msg' => $msg);
}
public function transferMyData() {
$msg = 'My Data:
';
// start with copying DATA dir as it is
foreach (glob(OLDUSERPATH.TRANSFERUSER.'/DATA/*') as $item) {
if (!copy($item, USERDATADIR.basename($item))) {
error_log('can\'t copy '.$item,1,email);
$msg .= 'failed copy file '.basename($item).'
';
}
}
$filesXml = new DomDocument("1.0");
if (!$filesXml->load($this->wsDir.'files.xml')) $msg .= 'no files.xml
';
else {
$fileMgr = new FilesMgr();
$filesXmlNew = new DomDocument("1.0");
$root = $filesXmlNew->createElement('ws');
$filesXmlNew->appendChild($root);
$list = $filesXmlNew->createElement("fileList");
$list->setAttribute("xml:id", "myData-treeRootNode");
$root->appendChild($list);
$files = $filesXml->getElementsByTagName("file");
$folders = $filesXml->getElementsByTagName("level1");
if ($folders->length > 0)
foreach ($folders as $folder) {
$newFolder = $filesXmlNew->createElement("folder");
$newFolder->setAttribute("xml:id", $folder->getAttribute("id"));
$newFolder->setAttribute("name", $folder->getAttribute("id"));
$list->appendChild($newFolder);
}
foreach ($files as $file) {
$newFile = $filesXmlNew->createElement("file", $file->getAttribute("title"));
$newFile->setAttribute("xml:id", $file->getAttribute("id"));
$newFile->setAttribute("name", $file->getAttribute("id"));
$format = $file->getElementsByTagName("format")->item(0)->nodeValue;
$newFile->setAttribute("format", $format);
$newFile->setAttribute("uploaded", $file->getElementsByTagName("uploaded")->item(0)->nodeValue);
$newFile->setAttribute("start", $file->getAttribute("start"));
$newFile->setAttribute("stop", $file->getAttribute("stop"));
// no sampling for cdf in old amda
$minSampling = $file->getAttribute("sampling");
$maxSampling = $file->getAttribute("maxsampling");
if (!$minSampling) {
$minSampling = $this->getSampling(USERDATADIR.$file->getAttribute("id"), $format);
$maxSampling = $minSampling;
}
$newFile->setAttribute("minsampling", $minSampling);
$newFile->setAttribute("maxsampling", $maxSampling);
//TODO check mask
$newFile->setAttribute("mask", $file->getAttribute("id"));
if ($file->parentNode->tagName == 'level1')
$filesXmlNew->getElementById($file->parentNode->getAttribute("id"))->appendChild($newFile);
else
$list->appendChild($newFile);
}
$filesXmlNew->save(USERWSDIR."Files.xml");
}
// mydata parameters
$this->Mgr = new DerivedParamMgr('mydataParam');
$this->createFolders('mydataList','mydataParam');
//TODO folders are they OK?
// get old params
$wsdParams = $this->ws->getElementsByTagName('mydata');
//TODO vi ??
// $obj = new stdClass();
foreach ($wsdParams as $item) {
$obj = new stdClass();
$obj->name = $item->getElementsByTagName('name')->item(0)->nodeValue;
$obj->nodeType = "myDataParam";
$obj->leaf = true;
$obj->desc = $item->getAttribute('desc');
$obj->file = $item->getAttribute('fileOrig');
$obj->mask = $item->getAttribute('fileMask');
$obj->fillvalue = $item->getAttribute('dataFillValue');
$obj->minsampling = $item->getAttribute('dataSampling');
$obj->maxsampling = $item->getAttribute('maxSampling');
$obj->format = $item->getAttribute('fileFormat');
$obj->type = $item->getAttribute('dataType');
$obj->size = $item->getAttribute('dataSize');
$obj->ytitle = $item->getAttribute('yTitle');
$obj->realvar = $item->getAttribute('realName');
$obj->units = $item->getAttribute('dataUnits');
$obj->legend = $item->getAttribute('dataLegend');
$this->Mgr->objectDom = new DomDocument("1.0");
if ($item->parentNode->tagName === 'level1') {
$folder_id = $item->parentNode->getAttribute('id');
$this->Mgr->createObject($obj, $folder_id);
}
else {
$this->Mgr->createObject($obj);
}
}
$msg .= ' ok
';
return array('success' => true, 'msg' => $msg);
}
}
?>