type = $type; if ($type == 'derivedParam') { $this->contentRootId = 'derivedParam-treeRootNode'; $this->contentRootTag = 'paramList'; //node attributes and object XML tags $this->attributes = array('name' => '', 'buildchain' => '', 'timestep' => ''); // + tags in object XML $this->optionalAttributes = array('units' => 'undefined','description' => 'undefined', 'ytitle' => 'undefined'); $this->objTagName = 'param'; $this->id_prefix = 'ws_'; } else { $this->contentRootId = 'myDataParam-treeRootNode'; $this->contentRootTag = 'myDataList'; //node attributes and object XML tags $this->attributes = array( 'name' => '', 'size' => ' ', 'format' => '', 'desc' => '', 'mask' => '', 'plottype' => ''); $this->optionalAttributes = array('vi' => 'undefined', 'realvar' => '', 'fillvalue' => -1.e31, 'units' => 'undefined', 'ytitle' => 'undefined', 'file' => '', 'type' => '', 'size' => '', 'minsampling' => ''); $this->objTagName = 'mydata'; $this->id_prefix = 'wsd_'; $this->type = 'myDataParam'; } if (!file_exists($this->xmlName)) { $this->createDom(); $this->xp = new domxpath($this->contentDom); } } protected function param2dd($paramID) { $pairs = array(":" => "_"); return strtr($paramID, $pairs); } protected function createDom() { $types = array('param' => 'derived', 'mydata' => 'myData'); $rootElement = $this->contentDom->createElement('ws'); foreach ($types as $key => $value) { $contentId = $value.'Param-treeRootNode'; $contentTag = $key.'List'; $typeElement = $this->contentDom->createElement($contentTag); $typeElement->setAttribute('xml:id', $contentId); $rootElement->appendChild($typeElement); } $this->contentDom->appendChild($rootElement); $this->contentDom->save($this->xmlName); } /* * Rename PARAM in id.xml */ protected function renameInResource($name, $id) { if (!file_exists(USERWSDIR.$id.'.xml')) return false; $this->objectDom -> load(USERWSDIR.$id.'.xml'); if (!($objToRename = $this->objectDom->getElementById($id))) return false; $objToRename -> getElementsByTagName('name')->item(0)->nodeValue = $name; $this->objectDom ->save(USERWSDIR.$id.'.xml'); return true; } /* * Check file id.xml if difference is name only */ protected function renameOnly($p) { $oldObject = new DomDocument("1.0"); $oldObject -> load(USERWSDIR.$p->id.".xml"); foreach ($p as $key => $value) { if ($key != 'id') { if ($oldObject->getElementsByTagName($key)->length == 0) return false; if ($key != "name" && $oldObject->getElementsByTagName($key)->item(0)->nodeValue != $value) return false; } } return true; } /* * Create Parameter */ public function createParameter($p, $folder) { // overwritten 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); $this->descFileName = USERWSDIR.$this->id.'.xml'; $fileExists = -1; //if alias exists, replace alias name by parameter name if ($this->type == 'derivedParam') { if (file_exists(USERWSDIR.'Alias.xml')) { $p->buildchain = $this->resetAlias($p->buildchain); } // switch between myData and Derived $this->createObjectDescription($p); $this->addToContent($p, $folder); return array('id' => $this->id, 'info' => $p->buildchain); } // myData parameter else { $isSpectra = $p->plottype === 'Spectra'; $this->BaseManager = new BaseManager(); $oldMask = $this->BaseManager->getOldMask($p->mask); $myFileMgr = new FilesMgr(); if($oldMask) { $myFileMgr->delMask($oldMask); $this->BaseManager->delVI($oldMask); } // separate files without mask - check that file exists else { $fileExists = $this->BaseManager->getVI($p->mask); } if ($fileExists < 0) { $p->vi = $this->BaseManager->addVI($p->mask, $p->format); $p->desc = $this->BaseManager->getViDesc($p->vi); } else { if (!$oldMask) { $p->vi = $this->BaseManager->getVI($p->mask); $p->desc = $this->BaseManager->getViDesc($p->vi); } } if ($oldMask) { $this->updateMaskMydata($oldMask, $p->mask, $p->vi, $p->desc); } $this -> createObjectDescription($p); //Add table definition if (isset($p->tableDef)) { $tableNodes = $this->objectDom->getElementsByTagName('tableDef'); if ($tableNodes->length > 0) $tableNode = $tableNodes->item(0); else { $tableNode = $this->objectDom->createElement('tableDef'); $this->objectDom->documentElement->appendChild($tableNode); } //remove previous definition if exist while ($tableNode->firstChild) $tableNode->removeChild($tableNode->firstChild); //add definition $tableNode->setAttribute('tableDefType', $p->tableDef->tableDefType); $tableNode->setAttribute('channelsDefType', $p->tableDef->channelsDefType); if (isset($p->tableDef->data)) { foreach ($p->tableDef->data as $key => $value) { $tablePropNode = $this->objectDom->createElement($key); $tablePropNode->nodeValue = $value; $tableNode -> appendChild($tablePropNode); } } //save $this->objectDom->save($this->descFileName); } $this -> addToContent($p, $folder); $info = "Size: ".$p->size."
".$p->desc."
Mask: ".$p->mask; if ($myFileMgr -> addMask($p->mask)){ return array('id' => $this->id, 'size' => $p->size, 'mask' => $p->mask, 'info' => $info, 'isSpectra' => $isSpectra, 'updateMyData' => true); } return array('id' => $this->id, 'size' => $p->size, 'mask' => $p->mask, 'info' => $info, 'isSpectra' => $isSpectra); } } /* * Start-Stop was changed - update in in MyDataParam */ public function updateMydata($mask, $desc) { $mydatas = $this->xp->query("//mydata[@mask = '".$mask."']"); if ($mydatas->length > 0) foreach ($mydatas as $mydata) $mydata->setAttribute("desc", $desc); $this->contentDom->save($this->xmlName); } /* * Mask was changed - update in MyDataParam */ public function updateMaskMydata($oldMask, $newMask, $viId, $description) { $mydatas = $this->xp->query("//mydata[@mask = '".$oldMask."']"); if ($mydatas->length == 0) return; foreach ($mydatas as $mydata) { $id = $mydata->getAttribute('xml:id'); $mydata->setAttribute("mask", $newMask); $mydata->setAttribute("desc", $description); if (file_exists(USERWSDIR.$id.'.xml')) { $xml = new DomDocument("1.0"); $xml->load(USERWSDIR.$id.'.xml'); $mask = $xml->getElementsByTagName('mask'); $mask->item(0)->nodeValue = $newMask; $vi = $xml->getElementsByTagName('vi'); $vi->item(0)->nodeValue = $viId; $desc = $xml->getElementsByTagName('desc'); $desc->item(0)->nodeValue = $description; $xml->save(USERWSDIR.$id.'.xml'); } } } /* * Delete Description, Resource file, mark deleted parameter AS UNDEFINED in requests/ conditions/ aliases (?) */ //TODO return to client number of requests touches??? public function deleteParameter($id) { //delete VI if there is no params with this mask ?????? $isDeletedMask = false; if ($this->type == 'myDataParam') { if (file_exists(USERWSDIR.$id.'.xml')) { $xml = new DomDocument("1.0"); $xml->load(USERWSDIR.$id.'.xml'); $mask = $xml->getElementsByTagName('mask'); if (!$mask) return; $maskName = $mask->item(0)->nodeValue; $params = $this->xp->query("//mydata[@mask='".$maskName."']"); if ($params->length == 1) { $this->BaseManager = new BaseManager(); $this->BaseManager->delVI($maskName); $FilesMgr = new FilesMgr(); $FilesMgr->delMask($maskName); $isDeletedMask = true; } } } if (file_exists(USERWSDIR.$id.'.xml')) unlink(USERWSDIR.$id.'.xml'); $requestMgr = new RequestMgr(); $n_requests = $requestMgr -> markAsUndefined($id); return $isDeletedMask; } /* * Get Object into Edit */ public function getObject($id) { if (!file_exists(USERWSDIR.$id.'.xml')) return array('error' => NO_OBJECT_FILE); $this->objectDom -> load(USERWSDIR.$id.'.xml'); if (!($objToGet = $this->objectDom->getElementById($id))) return array('error' => NO_SUCH_ID); $attributesToReturn['id'] = $objToGet->getAttribute('xml:id'); $attributes = $objToGet -> childNodes; foreach($attributes as $attribute) { if ($attribute->tagName === "buildchain") $attributesToReturn[$attribute->tagName] = $this->setAlias($attribute->nodeValue); else if ($attribute->tagName === "tableDef") { //load table definition $tableDefType = $attribute->getAttribute('tableDefType'); $channelsDefType = $attribute->getAttribute('channelsDefType'); $tableData = array(); foreach ($attribute->childNodes as $tableDataNode) { if ($tableDataNode->nodeType != XML_ELEMENT_NODE) continue; $tableData[$tableDataNode->tagName] = $tableDataNode->nodeValue; } $attributesToReturn[$attribute->tagName] = array('tableDefType' => $tableDefType, 'channelsDefType' => $channelsDefType, 'data' => $tableData); } else $attributesToReturn[$attribute->tagName] = $attribute->nodeValue; } return $attributesToReturn; } public function getObjectByName($name) { if (!$this->objectExistsByName($name)) return array('error' => NO_SUCH_ID); $objId = $this->getObjectIdByName($name); return $this->getObject($objId); } public function validNameObject($p) { // overwritten $res = parent::validNameObject($p); if (!$res['valid']) return $res; //only low case if (strtolower($p->name) != $p->name) return array('valid' => false, 'error' => 'Use only low case'); return array('valid' => true); } } ?>