/**
  * Answer an TagInfoIterator that lists information on tags attached to an item.
  * 
  * @param object TaggedItem $item
  * @return object TagInfoIterator
  * @access public
  * @since 4/18/08
  */
 public function getTagInfoForItem(TaggedItem $item)
 {
     $query = new SelectQuery();
     $query->addTable('tag');
     $query->addColumn('value');
     $query->addColumn('user_id');
     $query->addColumn('tstamp');
     $query->addWhereEqual("fk_item", $item->getDatabaseId());
     $dbc = Services::getService("DatabaseManager");
     $result = $dbc->query($query, $this->getDatabaseIndex());
     $iterator = new HarmoniIterator(array());
     $idManager = Services::getService("Id");
     while ($result->hasNext()) {
         $row = $result->next();
         $iterator->add(new TagInfo(new Tag($row['value']), $item, $idManager->getId($row['user_id']), DateAndTime::fromString($row['tstamp'])));
     }
     return $iterator;
 }
 /**
  * Return the next Qualifier.
  *	
  * @return object Qualifier
  * 
  * @throws object HierarchyException An exception with one of
  *		   the following messages defined in
  *		   org.osid.hierarchy.HierarchyException may be thrown:	 {@link
  *		   org.osid.hierarchy.HierarchyException#OPERATION_FAILED
  *		   OPERATION_FAILED}, {@link
  *		   org.osid.hierarchy.HierarchyException#PERMISSION_DENIED
  *		   PERMISSION_DENIED}, {@link
  *		   org.osid.hierarchy.HierarchyException#CONFIGURATION_ERROR
  *		   CONFIGURATION_ERROR}, {@link
  *		   org.osid.hierarchy.HierarchyException#UNIMPLEMENTED
  *		   UNIMPLEMENTED}, {@link
  *		   org.osid.hierarchy.HierarchyException#NO_MORE_ITERATOR_ELEMENTS
  *		   NO_MORE_ITERATOR_ELEMENTS}
  * 
  * @access public
  */
 function next()
 {
     // If this is the first element access, inform our AZ cache that we are
     // working with this set of nodes so that it can fetch AZs for all of
     // them at once.
     if ($this->_i == -1) {
         $isAuthorizedCache = IsAuthorizedCache::instance();
         $isAuthorizedCache->queueAssetArray($this->_elements);
     }
     return parent::next();
 }
 /**
  * Answer an iterator of groups that contain the Id. If $includeSubgroups
  * is true then groups will be returned if any descendent group contains
  * the Id.
  *
  * @param object Id $id
  * @return object AgentIterator
  * @access public
  * @since 2/23/06
  */
 function getGroupsContainingGroup($id, $includeSubgroups)
 {
     $result = $this->_queryDirectory('get_group', array('id' => $id->getIdString(), 'include_membership' => 'true'));
     $groups = new HarmoniIterator(array());
     foreach ($result->getElementsByTagNameNS('http://www.yale.edu/tp/cas', 'attribute') as $element) {
         if ($element->getAttribute('name') == 'MemberOf') {
             $groups->add(new CASGroup(new HarmoniId($element->getAttribute('value')), $this));
         }
     }
     return $groups;
 }
 /**
  * Answer the replies in ascending or descending time.
  * 
  * @param string $order The constant ASC or DESC for ascending time (oldest 
  *			first) or decending time (recent first).
  * @return iterator
  * @access public
  * @since 7/3/07
  */
 function getReplies($order = ASC)
 {
     // Load the replies, their creation times into arrays for caching and
     // easy sorting.
     if (!isset($this->_replies)) {
         $this->_replyIds = array();
         $this->_replyTimes = array();
         $mediaFileType = new Type('segue', 'edu.middlebury', 'media_file', 'A file that is uploaded to Segue.');
         $children = $this->_asset->getAssets();
         while ($children->hasNext()) {
             $child = $children->next();
             if (!$mediaFileType->isEqual($child->getAssetType())) {
                 $dateTime = $child->getCreationDate();
                 $this->_replyIds[] = $child->getId();
                 $this->_replyTimes[] = $dateTime->asString();
             }
         }
     }
     // Sort the reply Ids based on time.
     array_multisort($this->_replyIds, $this->_replyTimes, $order == ASC ? SORT_ASC : SORT_DESC);
     $null = null;
     $replies = new HarmoniIterator($null);
     $commentManager = CommentManager::instance();
     foreach ($this->_replyIds as $id) {
         $replies->add($commentManager->getComment($id));
     }
     return $replies;
 }
 /**
  * Answer all of the comments attached to an asset
  * 
  * @param object $assetOrId An Asset object or an Id object
  * @param string $order The constant ASC or DESC for ascending time (oldest 
  *			first) or decending time (recent first).
  * @return object Iterator
  * @access public
  * @since 7/3/07
  */
 function getAllComments($assetOrId, $order = ASC)
 {
     ArgumentValidator::validate($assetOrId, OrValidatorRule::getRule(ExtendsValidatorRule::getRule('Asset'), ExtendsValidatorRule::getRule('Id')));
     if (method_exists($assetOrId, 'getId')) {
         $asset = $assetOrId;
         $assetId = $asset->getId();
     } else {
         $repositoryManager = Services::getService("Repository");
         $idManager = Services::getService("Id");
         $repository = $repositoryManager->getRepository($idManager->getId("edu.middlebury.segue.sites_repository"));
         $asset = $repository->getAsset($assetOrId);
         $assetId = $assetOrId;
     }
     // Load the replies, their creation times into arrays for caching and
     // easy sorting.
     $assetIdString = $assetId->getIdString();
     if (!isset($this->_allComments[$assetIdString])) {
         $this->_allComments[$assetIdString] = array();
         $this->_allComments[$assetIdString]['ids'] = array();
         $this->_allComments[$assetIdString]['times'] = array();
         $rootComments = $this->getRootComments($asset);
         $allComments = new MultiIteratorIterator();
         while ($rootComments->hasNext()) {
             $allComments->addIterator($this->_getDescendentComments($rootComments->next()));
         }
         while ($allComments->hasNext()) {
             $comment = $allComments->next();
             $dateTime = $comment->getCreationDate();
             $this->_allComments[$assetIdString]['ids'][] = $comment->getId();
             $this->_allComments[$assetIdString]['times'][] = $dateTime->asSeconds();
         }
     }
     // Sort the comment Ids based on time.
     array_multisort($this->_allComments[$assetIdString]['times'], SORT_NUMERIC, $order == ASC ? SORT_ASC : SORT_DESC, $this->_allComments[$assetIdString]['ids']);
     $null = null;
     $comments = new HarmoniIterator($null);
     foreach ($this->_allComments[$assetIdString]['ids'] as $id) {
         $comments->add($this->getComment($id));
     }
     return $comments;
 }