AmdaObjectMgr.php 10.6 KB
<?php
/**
 * @class AmdaObjectMgr 
 * @version $Id: AmdaObjectMgr.php 2891 2015-04-30 11:31:51Z elena $
 * 
 */

 class AmdaObjectMgr {

      protected $xmlName, $xp;      
      protected $attributes, $optionalAttributes;       
      protected $contentRootId, $objTagName;
      protected $descFileName, $resFileName;
      protected $id_prefix;
      protected $contentRootTag;
      protected $obj, $id;
      protected $types;

      public $contentDom; 
      public $objectDom;

      protected function __construct($xmlFile) {
// content XML
		$this->xmlName = USERWSDIR."/".$xmlFile;
		$this->contentDom = new DomDocument("1.0");
		$this->contentDom->preserveWhiteSpace = false;
		$this->contentDom->formatOutput = true;

		if (file_exists($this->xmlName)) {
		    $this->contentDom -> load($this->xmlName);	 
		    $this->xp = new domxpath($this->contentDom); 
		}
// object desc XML
//TODO not used in RequestMgr
		$this->objectDom = new DomDocument("1.0"); 
		$this->objectDom->preserveWhiteSpace = false;
		$this->objectDom->formatOutput = true;
      }
   
     private function getNewId() {                   
      //  Get all ID attributes
	   $elements = $this->xp->query("//".$this->objTagName."/@xml:id");

      // Now find New Valid ID  
		if ($elements->length  > 0) {
		      if($elements->length > 0) for ($i = 0; $i < $elements->length; $i++) {
							     $id =  explode('_',$elements->item($i)->nodeValue);
						             $idList[] = $id[1]; 
			}

			sort($idList);

			for ($i = 0; $i < count($idList); $i++) {
			      if ($idList[$i] > $i) { 
				      $newID = $i;
				      break;
				}  
			      $newID = $i+1;  
			    }                 
		  } else
			  $newID = 0;
	    return $newID;
      }

	protected function setId() { 
                $id_ = $this->getNewId();
		if ($id_ === false) return false;
		$this->id = $this->id_prefix.$id_;
		return $this->id;         
	} 
   
	protected function objectExistsByName($name){
                $this->obj = $this->xp->query("//".$this->objTagName."[@name='".$name."']");		 
		if ($this->obj->length != 0) return true;
		return false;
	} 

	protected function getObjectIdByName($name) {
		$this->obj = $this->xp->query("//".$this->objTagName."[@name='".$name."']");
                if ($this->obj->length == 0) return false; 
		    $id = $this->obj->item(0)->getAttribute('xml:id');
                if ($id) return $id;
		return false;           
	}
	
	protected function folderExistsByName($name){
                $this->obj = $this->xp->query("//".$this->contentRootTag."/folder[@name='".$name."']");		 
		if ($this->obj->length != 0) return true;
		return false;
	}  

	protected function objectExistsById($id){      
		$this->obj = $this->contentDom->getElementById($id); 
		if ($this->obj != null) return $this->obj;
		return false;
        } 
      
         protected function createObjectResource(){}
         protected function renameInResource(){}

/*
*  Write Object into desc file
*/
	protected function createObjectDescription($obj){
	      $root = $this->objectDom->createElement($this->objTagName); 
	      $root->setAttribute('xml:id',$this->id);
          
	      foreach($obj as $key => $value) {
		if ($key != 'id' && $key != 'leaf' && $key != 'nodeType') {	
		    $node =  $this->objectDom->createElement($key,htmlspecialchars($value)); 
		    $root -> appendChild($node);
		}
	      }      
// add Optional Attributes if they are undefined	      
              foreach ($this->optionalAttributes as $key => $value)   
		 if ($root->getElementsByTagName($key)->length == 0) {
                        $node =  $this->objectDom->createElement($key,htmlspecialchars($value));  
			$root -> appendChild($node);
                  }
 
	      $this->objectDom->appendChild($root);
	      $this->objectDom->save($this->descFileName);  
      }
/*
*    Just Save  Content XML
*/
     protected function saveContent() {
	      $this->contentDom->save($this->xmlName);
      }
    
/*
* Add Object to Content XML
*/
      protected function addToContent($obj, $folder) {
              
                $folderToAdd = null;

		$objList = $this->contentDom->getElementById($this->contentRootId); 		
                $newObj = $this->contentDom->createElement($this->objTagName);
                $newObj->setAttribute('xml:id',$this->id);
// object to mapped array
                $obj_arr = (array)$obj;
                foreach ($this->attributes as $key => $value) {
                          $newObj->setAttribute($key, $obj_arr[$key]);	 
                }              
	        if ($folder != null)  
                          $folderToAdd = $this->contentDom->getElementById($folder);

		if ($folderToAdd) $folderToAdd -> appendChild($newObj);
                else $objList -> appendChild($newObj);
		  

		$this->saveContent();
      }
     
/*
* Delete Object From Content XML
*/
      protected function deleteFromContent($obj) {
		$objList = $obj -> parentNode;// $this->contentDom->getElementById($this->contentRootId);
                $objList -> removeChild($obj);
		$this->saveContent();
      }

/*
*         Create Folder
*/
      protected function createFolder($obj){
                 if ($this -> folderExistsByName($obj->name)) return array('error' => NAME_EXISTS);
                 $newFolder = $this->contentDom->createElement('folder');
		 $id = $obj->name."_".$this->objTagName;
		 $newFolder -> setAttribute('xml:id',$id); 
                 $newFolder -> setAttribute('name',$obj->name);
		 $objList = $this->contentDom->getElementById($obj->parent);
                 $objList -> appendChild($newFolder);
		 $this -> saveContent();
		return array('id' => $id);          
      }
/*
*         Get Folder of the object 
*/
      protected function getObjectFolder($id) {

                if (!($obj = $this->objectExistsById($id))) return "NO_SUCH_ID";
		if ($obj->parentNode->tagName == 'folder') return $obj->parentNode->getAttribute('xml:id');
		return null;

      }
         
	protected function setAlias($chain) {

		$aliasMgr = new AliasMgr();		 
		$listeAlias = $aliasMgr->getList();

		foreach($listeAlias as $alias) {
			$chain = $aliasMgr->substrParamAlias($chain, $alias->getAttribute("xml:id"),$alias->getAttribute("name"));
		}
        	
		return $chain;
	}	

	protected function resetAlias($chain) {

		$aliasMgr = new AliasMgr();		 
		$listeAlias = $aliasMgr->getList();

		foreach($listeAlias as $alias) {
			$chain = $aliasMgr->substrAliasParam($chain, $alias->getAttribute("xml:id"),$alias->getAttribute("name"));
		}
        	
		return $chain;
	}	
	
	protected function createDom() {
		 
		$rootElement = $this->contentDom->createElement('ws');
                foreach ($this->types as $type) {
		    $contentId = $type.'-treeRootNode';
		    $contentTag = $type.'List';
		    $typeElement = $this->contentDom->createElement($contentTag);
		    $typeElement->setAttribute('xml:id', $contentId);
		    $rootElement->appendChild($typeElement);
		}
                $this->contentDom->appendChild($rootElement);
		$this->contentDom->save($this->xmlName);
        }

  
/*****************************************************************
*                           PUBLIC FUNCTIONS
*****************************************************************/  
	
/*
*        Create Parameter[TT...]/Folder
*        create object itself, add it to content DOM
*/   
      function createObject($p, $folder){

	      if ($p -> leaf) return $this->createParameter($p, $folder);
	//      else return $this->createFolder($p);
//TODO check if this is possible?
	      else return array('error' => 'createFolder should be called from RENAME');

      }

/*
*          Rename Parameter[TT...]/Folder
*/
      function renameObject($p){

		if (!($objToRename = $this -> objectExistsById($p->id))) {
// NO SUCH ID:  leaf -> error;
			   if ($p->leaf) return array('error' => NO_SUCH_ID);
// NO SUCH ID:  folder  -> create  
			    return  $this -> createFolder($p); 			    
                 }
// object was just DD in the tree : move tag in xml
		if ($p -> name == $p -> old_name) {
		    if (!($parentNode = $this->contentDom->getElementById($p -> parent))) return array('error' => NO_SUCH_PARENT_ID);   
		    $parentNode -> appendChild($objToRename);  
		    $this->saveContent();
		    return array('id' => $p->id);
		 }

//		if ($this -> objectExistsByName($p->name, $this->objTagName)) return array('error' => NAME_EXISTS);
//TODO  CHECK: With some PHP versions setAttribute ADD attribute
		if ($objToRename->hasAttribute('name')) $objToRename->removeAttribute('name');	
                $objToRename->setAttribute('name',$p->name);
		if (!$p->leaf) {		 
		    $objToRename->removeAttribute('xml:id');
		    $objToRename->setAttribute('xml:id', $p->name.'_'.$this->objTagName);
		  }
		else  
                    $this -> renameInResource($p->name, $p->id); 

		 $this->saveContent();
		 return array('id' => $p->id);		
	}
   
/*
*          Delete Parameter[TT...]/Folder
*    	   Delete object itself, delete from contentDOM, mark as undefined in depending objects		
*/
       function deleteObject($p){

		  if ($p->leaf) {       
//   if Parameter[TT...] - delete resources first
                         $isDeleted = $this->deleteParameter($p->id);
	 		 if (!($objToDelete = $this -> objectExistsById($p->id))) return array('error' => NO_SUCH_ID);		                         
                  }
		  else {
			if (!($objToDelete = $this -> objectExistsById($p->id))) return array('error' => NO_SUCH_ID); 
			$folderToDelete = $objToDelete->getElementsByTagName($this->objTagName);
// delete all parameters[TT..] in folder(s)
			foreach ($folderToDelete as $obj) {
			    $id = $obj->getAttribute('xml:id');
			    $this->deleteParameter($id);
                        }
		  }
		  $this -> deleteFromContent($objToDelete);

		if ($isDeleted) return array('id' => $p->id, 'maskDeleted' => true); 
		else return array('id' => $p->id);
      }

/*
*         Modify Parameter[TT...]/Folder
*/ 
     
      function modifyObject($p){ 
            if ($this->renameOnly($p)) { 
			$p->leaf = 1;
                        return $this->renameObject($p);
	      } 
	    $folder = $this->getObjectFolder($p->id);
            $this->deleteObject($p);	    	     
	    return 
		    $this->createObject($p, $folder);
         } 

      
      function validNameObject($p){
      	if (!isset($p->name) || ($p->name == ""))
      		return array('valid' => false, 'error' => 'Name is required');
      	if ($p->leaf)
      		$alreadyExist = $this -> objectExistsByName($p->name, $this->objTagName);
      	else
      		$alreadyExist = $this -> folderExistsByName($p->name);
      	if ($alreadyExist)
      		return array('valid' => false, 'error' => 'This name already exists in this subtree!');
      	return array('valid' => true);
      }
         
      function getObject($id){}
 
}
?>