1<?php 2/* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */ 3 4require_once 'Modules/Test/classes/class.ilTestRandomQuestionCollectionSubsetApplication.php'; 5 6/** 7 * @author Björn Heyser <bheyser@databay.de> 8 * @version $Id$ 9 * 10 * @package Modules/Test 11 */ 12class ilTestRandomQuestionCollectionSubsetApplicationList implements Iterator 13{ 14 /** 15 * @var ilTestRandomQuestionCollectionSubsetApplication[] 16 */ 17 protected $collectionSubsetApplications = array(); 18 19 /** 20 * @var ilTestRandomQuestionSetQuestionCollection 21 */ 22 protected $reservedQuestionCollection; 23 24 /** 25 * ilTestRandomQuestionCollectionSubsetApplicantList constructor. 26 */ 27 public function __construct() 28 { 29 $this->setReservedQuestionCollection(new ilTestRandomQuestionSetQuestionCollection()); 30 } 31 32 /** 33 * @param integer $applicantId 34 * @return ilTestRandomQuestionCollectionSubsetApplication 35 */ 36 public function getCollectionSubsetApplication($applicantId) 37 { 38 if (!isset($this->collectionSubsetApplications[$applicantId])) { 39 return null; 40 } 41 42 return $this->collectionSubsetApplications[$applicantId]; 43 } 44 45 /** 46 * @return ilTestRandomQuestionCollectionSubsetApplication[] 47 */ 48 public function getCollectionSubsetApplications() 49 { 50 return $this->collectionSubsetApplications; 51 } 52 53 /** 54 * @param ilTestRandomQuestionCollectionSubsetApplicant $collectionSubsetApplicant 55 */ 56 public function addCollectionSubsetApplication(ilTestRandomQuestionCollectionSubsetApplication $collectionSubsetApplication) 57 { 58 $this->collectionSubsetApplications[$collectionSubsetApplication->getApplicantId()] = $collectionSubsetApplication; 59 } 60 61 /** 62 * @param ilTestRandomQuestionCollectionSubsetApplication[] $collectionSubsetApplications 63 */ 64 public function setCollectionSubsetApplications($collectionSubsetApplications) 65 { 66 $this->collectionSubsetApplications = $collectionSubsetApplications; 67 } 68 69 /** 70 * resetter for collectionSubsetApplicants 71 */ 72 public function resetCollectionSubsetApplicants() 73 { 74 $this->setCollectionSubsetApplications(array()); 75 } 76 77 /** 78 * @return ilTestRandomQuestionSetQuestionCollection 79 */ 80 public function getReservedQuestionCollection() 81 { 82 return $this->reservedQuestionCollection; 83 } 84 85 /** 86 * @param ilTestRandomQuestionSetQuestionCollection $reservedQuestionCollection 87 */ 88 public function setReservedQuestionCollection($reservedQuestionCollection) 89 { 90 $this->reservedQuestionCollection = $reservedQuestionCollection; 91 } 92 93 /** 94 * @param ilTestRandomQuestionSetQuestion $question 95 */ 96 public function addReservedQuestion(ilTestRandomQuestionSetQuestion $reservedQuestion) 97 { 98 $this->getReservedQuestionCollection()->addQuestion($reservedQuestion); 99 } 100 101 /* @return ilTestRandomQuestionCollectionSubsetApplication */ 102 public function current() 103 { 104 return current($this->collectionSubsetApplications); 105 } 106 /* @return ilTestRandomQuestionCollectionSubsetApplication */ 107 public function next() 108 { 109 return next($this->collectionSubsetApplications); 110 } 111 /* @return string */ 112 public function key() 113 { 114 return key($this->collectionSubsetApplications); 115 } 116 /* @return bool */ 117 public function valid() 118 { 119 return key($this->collectionSubsetApplications) !== null; 120 } 121 /* @return ilTestRandomQuestionCollectionSubsetApplication */ 122 public function rewind() 123 { 124 return reset($this->collectionSubsetApplications); 125 } 126 127 /** 128 * @param ilTestRandomQuestionSetQuestion $question 129 */ 130 public function handleQuestionRequest(ilTestRandomQuestionSetQuestion $question) 131 { 132 $questionReservationRequired = false; 133 134 foreach ($this as $collectionSubsetApplication) { 135 if (!$collectionSubsetApplication->hasQuestion($question->getQuestionId())) { 136 continue; 137 } 138 139 if ($collectionSubsetApplication->hasRequiredAmountLeft()) { 140 $questionReservationRequired = true; 141 $collectionSubsetApplication->decrementRequiredAmount(); 142 } 143 } 144 145 if ($questionReservationRequired) { 146 $this->addReservedQuestion($question); 147 } 148 } 149 150 /** 151 * @return int 152 */ 153 public function getNonReservedQuestionAmount() 154 { 155 $availableQuestionCollection = new ilTestRandomQuestionSetQuestionCollection(); 156 157 foreach ($this as $collectionSubsetApplication) { 158 $applicationsNonReservedQstCollection = $collectionSubsetApplication->getRelativeComplementCollection( 159 $this->getReservedQuestionCollection() 160 ); 161 162 $availableQuestionCollection->mergeQuestionCollection($applicationsNonReservedQstCollection); 163 } 164 165 $nonReservedQuestionCollection = $availableQuestionCollection->getUniqueQuestionCollection(); 166 167 return $nonReservedQuestionCollection->getQuestionAmount(); 168 } 169} 170