oldWs = new DomDocument("1.0"); $this->newWs = new DomDocument("1.0"); $this->oldWsDir = OLDUSERPATH.TRANSFERUSER.'/WS/'; $this->newWsDir = NEWUSERPATH.TRANSFERUSER.'/WS/'; if (!is_dir(NEWUSERPATH.TRANSFERUSER.'/WS')) mkdir(NEWUSERPATH.TRANSFERUSER.'/WS', 0775); $this->ws_deleted = array(); $this->wsd_deleted = array(); $this->getModified(); $this->getReprocessed(); $this->getSpectra(); } private function getObsolete() { $deletedXML = new DomDocument("1.0"); $deletedXML->load(CONVERSIONDIR."Deleted.xml"); $deletedNodes = $deletedXML->getElementsByTagName('deleted'); $deleted = array(); foreach ($deletedNodes as $node) $deleted[] = $node->getAttribute('xml:id'); return $deleted; } private function getNotreadyFunctions() { $deletedXML = new DomDocument("1.0"); $deletedXML->load(CONVERSIONDIR."Functions.xml"); $deletedNodes = $deletedXML->getElementsByTagName('deleted'); $notready = array(); foreach ($deletedNodes as $node) $notready[] = $node->getAttribute('xml:id'); return $notready; } private function getNotready() { $deletedXML = new DomDocument("1.0"); $deletedXML->load(CONVERSIONDIR."NotReady.xml"); $deletedNodes = $deletedXML->getElementsByTagName('deleted'); $notready = array(); foreach ($deletedNodes as $node) $notready[] = $node->getAttribute('xml:id'); return $notready; } private function deleteParam($exp, $deleted) { $toDelete = false; if (count($deleted) > 0) foreach ($deleted as $item) { if (strpos($exp, $item) !== false) { $toDelete = true; break; } } return $toDelete; } private function getWs($exp) { $ws = array(); if (strpos($exp, 'ws_') !== false) { $arr = $this->delimitIt($exp); foreach ($arr as $item) { if (strpos($item, 'ws_') !== false) $ws[] = substr($item,3); } return $ws; } return false; } private function delimitIt($chain) { $delimiter = '[]+,/*()^<>&|=[-]+'; $array = split($delimiter,$chain); if (trim(end($array)) == "") array_pop($array); return $array; } private function getModified() { $convertXML = new DomDocument("1.0"); $modifiedFile = CONVERSIONDIR.'Modified.xml'; if (!$convertXML->load($modifiedFile)) error_log('ERROR loading '.$modifiedFile,1,email); $convertedNodes = $convertXML->getElementsByTagName('param_convert'); foreach ($convertedNodes as $item) { $pairs[$item->getAttribute('oldid')] = $item->getAttribute('xml:id'); } krsort($pairs, SORT_NATURAL); $this->pairs = $pairs; } private function getReprocessed() { $convertXML = new DomDocument("1.0"); $modifiedFile = CONVERSIONDIR.'PostProcess.xml'; if (!$convertXML->load($modifiedFile)) error_log('ERROR loading '.$modifiedFile,1,email); $convertedNodes = $convertXML->getElementsByTagName('param_convert'); foreach ($convertedNodes as $item) { $pairs[$item->getAttribute('oldid')] = $item->getAttribute('xml:id'); } krsort($pairs, SORT_NATURAL); $this->postPairs = $pairs; } private function getSpectra() { $convertXML = new DomDocument("1.0"); $modifiedFile = CONVERSIONDIR.'SpectraModifs.xml'; if (!$convertXML->load($modifiedFile)) error_log('ERROR loading '.$modifiedFile,1,email); $convertedNodes = $convertXML->getElementsByTagName('deleted'); foreach ($convertedNodes as $item) { $this->specParams[] = $item->getAttribute('xml:id'); } } private function updateParams($expression) { $newExp = strtr($expression, $this->pairs); if (!empty($this->postPairs)) $expFinal = strtr($newExp, $this->postPairs); return $expFinal; } protected function createDom() { $types = array('param' => 'derived', 'mydata' => 'myData'); $rootElement = $this->newWs->createElement('ws'); foreach ($types as $key => $value) { $contentId = $value.'Param-treeRootNode'; $contentTag = $key.'List'; $typeElement = $this->newWs->createElement($contentTag); $typeElement->setAttribute('xml:id', $contentId); $rootElement->appendChild($typeElement); } $this->newWs->appendChild($rootElement); $this->newWs->save($this->newWsDir.'WsParams.xml'); } public function urlExists($url) { $handle = curl_init($url); curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE); $response = curl_exec($handle); $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE); curl_close($handle); if($httpCode >= 200 && $httpCode <= 400 || $httpCode == 403) { return true; } else { return false; } } public function checkWS() { // old ws if (!$this->urlExists(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 (!$this->urlExists($this->oldWsDir)) { error_log('no ws.xml for '.TRANSFERUSER,1,email); return array('success' => false, 'error' => 'Sorry, we failed to find your workspace at old AMDA'); } return array('success' => true); } public function transferDerived() { $msg = '

Derived Params:

'; $msg .= 'Note : Parameters made from Remote Base parameters are not copied

'; if (!$this->oldWs->load($this->oldWsDir.'WsParams.xml')) { error_log('cannot load WsParams.xml for '.TRANSFERUSER,1,email); return array('success' => false, 'error' => 'Sorry, we failed to get your Derived Params from old AMDA'); } if (!file_exists($this->newWsDir.'WsParams.xml')) $this->createDom(); else $this->newWs->load($this->newWsDir.'WsParams.xml'); $deleted = $this->getObsolete(); $notready = $this->getNotready(); $notreadyFunctions = $this->getNotreadyFunctions(); $wsParamNode = $this->newWs->getElementsByTagName('paramList')->item(0); $wsParamsOld = $this->oldWs->getElementsByTagName('param'); if ($wsParamsOld->length == 0) { return array('success' => true, 'msg' => 'No parameters'); } $paramXml = new DomDocument("1.0"); $msg .= 'Some expressions could have problems while being processed by new kernel
- Please send us feedback in this case.

Not copied derived parameters :
'; foreach ($wsParamsOld as $param) { $id = $param->getAttribute('xml:id'); $name = $param->getAttribute('name'); $expression = $param->getAttribute('buildchain'); if ($this->deleteParam($expression,$deleted)) { $msg .= '
  • '.$name.' : uses obsolete param
    '.$expression.'
    '; // error_log( 'For INFO : DELETED '.$expression,1,email); $this->ws_deleted[] = $name; continue; } if ($this->deleteParam($expression,$notready)) { $msg .= '
  • '.$name.' : uses param not ready yet
    '.$expression.'
    '; // error_log( 'For INFO : DELETED '.$expression,1,email); $this->ws_deleted[] = $name; continue; } if ($this->deleteParam($expression,$notreadyFunctions)) { $msg .= '
  • '.$name.' : uses function not ready yet
    '.$expression.'
    '; // error_log( 'For INFO : DELETED '.$expression,1,email); $this->ws_deleted[] = $name; continue; } if (!empty($this->wsd_deleted)) if ($this->deleteParam($expression,$this->wsd_deleted)) { $msg .= '
  • '.$name.' : uses obsolete myData param
    '.$expression.'
    '; // error_log( 'For INFO : DELETED '.$expression,1,email); $this->ws_deleted[] = $name; continue; } if ($this->deleteParam($expression,array("CDAWEB","MAPSKP","VEXGRAZ","IMPEX"))) { $msg .= '
  • '.$name.' : uses remote params
    '.$expression.'
    '; $this->ws_deleted[] = $name; continue; } if ($this->deleteParam($expression,$this->specParams)) { $msg .= '
  • '.$name.' : too much difference
    '.$expression.'
    '; $this->ws_deleted[] = $name; continue; } $expressionUpdated = $this->updateParams($expression); $wsParamNode->appendChild($this->newWs->importNode($param)); $paramXml->load($this->oldWsDir.$id.'.xml'); $expressionNode = $paramXml->getElementsByTagName('buildchain')->item(0); $expressionNode->nodeValue = $expressionUpdated; $paramXml->save($this->newWsDir.$id.'.xml'); $nodeInWS = $this->newWs->getElementById($id); if ($nodeInWS) { $buildchain = $nodeInWS->getAttribute('buildchain'); $buildchainUpdated = $this->updateParams($buildchain); $nodeInWS->setAttribute('buildchain',$buildchainUpdated); } } // check of 'ws bricks' were deleted $newParams = $this->newWs->getElementsByTagName('param'); $xp = new domxpath($this->newWs); $paramsToRemove = array(); foreach ($newParams as $param) { $id = $param->getAttribute('xml:id'); $name = $param->getAttribute('name'); $expression = $param->getAttribute('buildchain'); if ($wsParams = $this->getWs($expression)) { foreach ($wsParams as $wsParam) { $res = $xp->query("//param[@name='".trim($wsParam)."']"); if ($res->length == 0) { if (file_exists($this->newWsDir.$id.'.xml')) { // Delete only once unlink($this->newWsDir.$id.'.xml'); $paramsToRemove[] = $param; $this->ws_deleted[] = $name; $msg .= '
  • '.$name.' : uses obsolete / not ready ws param :
    '.$expression.'
    '; } } } } } if (count($paramsToRemove) > 0) foreach ($paramsToRemove as $paramToRemove) { $paramToRemove->parentNode->removeChild($paramToRemove); } $this->newWs->save($this->newWsDir.'WsParams.xml'); $copied = $newParams->length - count($paramsToRemove); $msg .= '
    Copied : '.$copied.' derived parameters


    '; return array('success' => true, 'msg' => $msg); } public function transferTimeTables() { $msg = 'Time Tables:

    '; // get old time tab list $this->newWs->load($this->oldWsDir.'Tt.xml'); $timeTabs = $this->newWs->getElementsByTagName('timetab'); if ($timeTabs->length == 0) { $msg .= 'No time tables'; return array('success' => true, 'msg' => $msg); } $oldTtDir = OLDUSERPATH.TRANSFERUSER."/TT/"; $newTtDir = NEWUSERPATH.TRANSFERUSER."/TT/"; foreach ($timeTabs as $tab) { $id = $tab->getAttribute('xml:id'); copy($oldTtDir.$id.'.xml', $newTtDir.$id.'.xml'); } $this->newWs->save($this->newWsDir.'Tt.xml'); $msg .= 'Copied : '.$timeTabs->length.' time tables


    '; return array('success' => true, 'msg' => $msg); } public function transferConditions() { $msg = 'Requests

    '; $msg .= 'Note : Plot requests are not copied : too much difference between new and old AMDA versions

    '; $oldRequestXml = new DomDocument("1.0"); $newRequestXml = new DomDocument("1.0"); if (!@$oldRequestXml->load($this->oldWsDir.'Request.xml')){ $msg .= ' No Requests File
    '; return array('success' => true, 'msg' => $msg); } $condNodes = $oldRequestXml->getElementsByTagName('condition'); if ($condNodes->length == 0) { $msg .= ' no DataMining requests to copy
    '; return array('success' => true, 'msg' => $msg); } if (!file_exists($this->newWsDir.'Request.xml')) { $types = array('request', 'condition'); $rootElement = $newRequestXml->createElement('ws'); foreach ($types as $type) { $contentId = $type.'-treeRootNode'; $contentTag = $type.'List'; $typeElement = $newRequestXml->createElement($contentTag); $typeElement->setAttribute('xml:id', $contentId); $rootElement->appendChild($typeElement); } $newRequestXml->appendChild($rootElement); } else $newRequestXml->load($this->newWsDir.'Request.xml'); $conditionRoot = $newRequestXml->getElementsByTagName('conditionList')->item(0); $condDir = OLDUSERPATH.TRANSFERUSER."/REQ/"; $deleted = $this->getObsolete(); $notready = $this->getNotready(); $msg .= 'Some expressions could have problems while being processed by new kernel
    - Please send us feedback in this case.

    Not copied DataMining requests :
    '; foreach ($condNodes as $condNode) { $id = $condNode->getAttribute('xml:id'); $name = $condNode->getAttribute('name'); $cond = file($condDir.$id, FILE_IGNORE_NEW_LINES); $condObj = json_decode($cond[0]); $expression = $condObj->expression; if ($this->deleteParam($expression, $deleted)) { $msg .= '
  • '.$name.' : uses obsolete parameters
    '.$expression.'
    '; $cond_deleted[] = $name; continue; } if ($this->deleteParam($expression,$notready)) { $msg .= '
  • '.$name.' : uses param not ready yet
    '.$expression.'
    '; // error_log( 'For INFO : DELETED '.$expression,1,email); $cond_deleted[] = $name; continue; } if (!empty($this->wsd_deleted)) if ($this->deleteParam($expression,$this->wsd_deleted)) { $msg .= '
  • '.$name.' : uses obsolete myData parameters
    '.$expression.'
    '; // error_log( 'For INFO : DELETED '.$expression,1,email); $cond_deleted[] = $name; continue; } if (!empty($this->ws_deleted)) if ($this->deleteParam($expression,$this->ws_deleted)) { $msg .= '
  • '.$name.' : uses obsolete derived parameters
    '.$expression.'
    '; // error_log( 'For INFO : DELETED '.$expression,1,email); $cond_deleted[] = $name; continue; } if ($this->deleteParam($expression,array("CDAWEB","MAPSKP","VEXGRAZ","IMPEX"))) { $msg .= '
  • '.$name.' : uses remote params
    '.$expression.'
    '; $cond_deleted[] = $name; continue; } if ($this->deleteParam($expression,$this->specParams)) { $msg .= '
  • '.$name.' : too much difference
    '.$expression.'
    '; $cond_deleted[] = $name; continue; } $expressionUpdated = $this->updateParams($expression); $condObj->expression = $expressionUpdated; file_put_contents(NEWUSERPATH.TRANSFERUSER."/REQ/".$id, json_encode($condObj)); $conditionRoot->appendChild($newRequestXml->importNode($condNode)); } $newRequestXml->save($this->newWsDir.'Request.xml'); return array('success' => true, 'msg' => $msg); } public function transferMyData() { $msg = '
    MyData Parameters / My Files:

    '; $msg.= 'Note : CEF format is not implemented

    '; if (!$this->oldWs->load($this->oldWsDir.'WsParams.xml')) { error_log('cannot load WsParams.xml for '.TRANSFERUSER,1,email); return array('success' => false, 'error' => 'Sorry, we failed to get your MyData Params from old AMDA'); } if (!file_exists($this->newWsDir.'WsParams.xml')) $this->createDom(); else $this->newWs->load($this->newWsDir.'WsParams.xml'); $BaseXml = new DomDocument("1.0"); $FilesXml = new DomDocument("1.0"); // get old params $wsdParamsOld = $this->oldWs->getElementsByTagName('mydata'); if ($wsdParamsOld->length == 0) { return array('success' => true, 'msg' => 'You have no MyData parameters'); } if (!$BaseXml->load(OLDUSERPATH.TRANSFERUSER.'/DATA/base.xml')) { return array('success' => false, 'msg' => 'base description corrupted'); } if (!$FilesXml->load($this->oldWsDir.'Files.xml')) { return array('success' => false, 'msg' => 'files description corrupted'); } $this->newWs->load($this->newWsDir.'WsParams.xml'); $paramDom = new DomDocument("1.0"); $msg.= ' Not copied parameters :
    '; foreach ($wsdParamsOld as $wsdParamOld) { $format = $wsdParamOld->getAttribute('format'); $name = $wsdParamOld->getAttribute('name'); $id = $wsdParamOld->getAttribute('xml:id'); $mask = $wsdParamOld->getAttribute('mask'); if ($format == 'cef') { $deletedVi[] = $mask; $msg .= '
  • '.$name.'
    '; $this->wsd_deleted[] = 'wsd_'.$name; } else { $desc = $wsdParamOld->getAttribute('desc'); $start = substr($desc,0,16).':00'; $stop = substr($desc,17).':00'; $wsdParamOld->setAttribute('desc', $start.'-'.$stop); $this->newWs->getElementsByTagName('mydataList')->item(0)->appendChild($this->newWs->importNode($wsdParamOld)); $paramDom->load($this->oldWsDir.$id.'.xml'); $descNode = $paramDom->getElementsByTagName('desc')->item(0); $descNode->nodeValue = $start.'-'.$stop; $paramDom->save($this->newWsDir.$id.'.xml'); $fileFormat[$mask] = $format === 'txt' ? 'ASCII' : strtoupper($format); } } $this->newWs->save($this->newWsDir.'WsParams.xml'); // First delete CEF files $xpBase = new domxpath($BaseXml); if (count($deletedVi) > 0) foreach ($deletedVi as $vi) { $maskNode = $xpBase->query("//mask[.='".$vi."']"); if ( $maskNode->length == 0 ) error_log('No '.$vi.' in '.TRANSFERUSER.'/DATA/base.xml',1,email); else { $viNode = $maskNode->item(0)->parentNode; $viNode->parentNode->removeChild($viNode); } } // Then modify base.xml : xml:id => id $viNodes = $BaseXml->getElementsByTagName('vi'); foreach ($viNodes as $viNode) { $id = $viNode->getAttribute('xml:id'); $viNode->removeAttribute('xml:id'); $viNode->setAttribute('id',$id); $mask = $viNode->getElementsByTagName('mask')->item(0)->nodeValue; $viNode->setAttribute('format', $fileFormat[$mask]); } $BaseXml->save(NEWUSERPATH.TRANSFERUSER.'/DATA/base.xml'); $msg .= 'Not copied files :
    '; $filesNodes = $FilesXml->getElementsByTagName('file'); foreach ($filesNodes as $file) { $fileName = $file->getAttribute('name'); $format = $file->getAttribute('format'); if ($format == 'cef') { $deletedFiles[] = $file->getAttribute('xml:id'); } else { if (!@copy(OLDUSERPATH.TRANSFERUSER.'/DATA/'.$fileName,NEWUSERPATH.TRANSFERUSER.'/DATA/'.$fileName)) $msg .= $fileName.'
    '; } } if (count($deletedVi) > 0) foreach ($deletedVi as $vi) { $node = $BaseXml->getElementById($vi); if ($node) { $node->parentNode->removeChild($node); } } if (count($deletedFiles) > 0) foreach ($deletedFiles as $vi) { $node = $FilesXml->getElementById($vi); if ($node) { $msg .= '
  • '.$vi.'
    '; $node->parentNode->removeChild($node); } } $FilesXml->save($this->newWsDir.'Files.xml'); return array('success' => true, 'msg' => $msg); } public function transferFilters() { $msg = '


    Filters:

    '; if (!curl_init($this->oldWsDir.'Filters.xml')) { return array('success' => true, 'msg' => 'No filters at old AMDA'); } $filterXml = new DomDocument("1.0"); if (!$filterXml->load($this->oldWsDir.'Filters.xml')) { return array('success' => false, 'error' => 'Cannot load filters from old AMDA'); } $filterXml->save($this->newWsDir.'Filters.xml'); $msg .= 'Filters have been copied
    '; return array('success' => true, 'msg' => $msg); } function sendMail($email, $msg) { $subject = 'Your workspace has been copied to new AMDA'; $headers = "From: amda@irap.omp.eu " . "\r\n". "Reply-To: amda@irap.omp.eu " . "\r\n". "Content-type: text/html\r\n"; $msg = "Your Workspace has been copied to new AMDA

    ".$msg.""; mail($email, $subject, $msg, $headers); } } ?>