function &getItemHierarchy($rootItem)
 {
     if (!isset($this->hierarchy[$rootItem->getId()])) {
         $itemFactory = new Docman_ItemFactory($rootItem->getGroupId());
         $this->hierarchy[$rootItem->getId()] =& $itemFactory->getItemTree($rootItem, $this->getUser(), false, true);
     }
     return $this->hierarchy[$rootItem->getId()];
 }
 /**
  * Copy a subtree.
  */
 function cloneItems($srcGroupId, $dstGroupId, $user, $metadataMapping, $ugroupsMapping, $dataRoot, $srcItemId = 0, $dstItemId = 0, $ordering = null)
 {
     $itemMapping = array();
     $itemFactory = new Docman_ItemFactory($srcGroupId);
     if ($srcItemId == 0) {
         $srcItem = $this->getRoot($srcGroupId);
     } else {
         $srcItem = $this->getItemFromDb($srcItemId);
     }
     $itemTree = $itemFactory->getItemTree($srcItem, $user, false, true);
     if ($itemTree) {
         $rank = null;
         if ($ordering !== null) {
             $dao =& $this->_getItemDao();
             $rank = $dao->_changeSiblingRanking($dstItemId, $ordering);
         }
         $cloneItemsVisitor = new Docman_CloneItemsVisitor($dstGroupId);
         $visitorParams = array('parentId' => $dstItemId, 'user' => $user, 'metadataMapping' => $metadataMapping, 'ugroupsMapping' => $ugroupsMapping, 'data_root' => $dataRoot, 'newRank' => $rank, 'srcRootId' => $srcItemId);
         $itemTree->accept($cloneItemsVisitor, $visitorParams);
         $itemMapping = $cloneItemsVisitor->getItemMapping();
     }
     return $itemMapping;
 }