/**
  * Implements response for OAI-PMH verb 'ListSets'.
  *
  * @param  array &$oaiRequest Contains full request information
  * @return void
  */
 private function __handleListSets()
 {
     $repIdentifier = $this->_configuration->getRepositoryIdentifier();
     $this->_proc->setParameter('', 'repIdentifier', $repIdentifier);
     $this->_xml->appendChild($this->_xml->createElement('Documents'));
     $sets = array('bibliography:true' => 'Set for bibliographic entries', 'bibliography:false' => 'Set for non-bibliographic entries');
     $logger = $this->getLogger();
     $setSpecPattern = '[A-Za-z0-9\\-_\\.!~\\*\'\\(\\)]+';
     $finder = new Opus_DocumentFinder();
     $finder->setServerState('published');
     foreach ($finder->groupedTypesPlusCount() as $doctype => $row) {
         if (0 == preg_match("/^{$setSpecPattern}\$/", $doctype)) {
             $msg = "Invalid SetSpec (doctype='" . $doctype . "')." . " Allowed characters are [{$setSpecPattern}].";
             $logger->err("OAI-PMH: {$msg}");
             continue;
         }
         $setSpec = 'doc-type:' . $doctype;
         // $count = $row['count'];
         $sets[$setSpec] = "Set for document type '{$doctype}'";
     }
     $oaiRolesSets = Opus_CollectionRole::fetchAllOaiEnabledRoles();
     foreach ($oaiRolesSets as $result) {
         if ($result['oai_name'] == 'doc-type') {
             continue;
         }
         if (0 == preg_match("/^{$setSpecPattern}\$/", $result['oai_name'])) {
             $msg = "Invalid SetSpec (oai_name='" . $result['oai_name'] . "'). " . " Please check collection role " . $result['id'] . ". " . " Allowed characters are {$setSpecPattern}.";
             $logger->err("OAI-PMH: {$msg}");
             continue;
         }
         $setSpec = $result['oai_name'];
         // $count = $result['count'];
         $sets[$setSpec] = "Set for collection '" . $result['oai_name'] . "'";
         $role = new Opus_CollectionRole($result['id']);
         foreach ($role->getOaiSetNames() as $subset) {
             $subSetSpec = "{$setSpec}:" . $subset['oai_subset'];
             // $subSetCount = $subset['count'];
             if (0 == preg_match("/^{$setSpecPattern}\$/", $subset['oai_subset'])) {
                 $msg = "Invalid SetSpec (oai_name='" . $subset['oai_subset'] . "')." . " Please check collection " . $subset['id'] . ". " . " Allowed characters are [{$setSpecPattern}].";
                 $logger->err("OAI-PMH: {$msg}");
                 continue;
             }
             $sets[$subSetSpec] = "Subset '" . $subset['oai_subset'] . "'" . " for collection '" . $result['oai_name'] . "'" . ': "' . trim($subset['name']) . '"';
         }
     }
     foreach ($sets as $type => $name) {
         $opusDoc = $this->_xml->createElement('Opus_Sets');
         $typeAttr = $this->_xml->createAttribute('Type');
         $typeValue = $this->_xml->createTextNode($type);
         $typeAttr->appendChild($typeValue);
         $opusDoc->appendChild($typeAttr);
         $nameAttr = $this->_xml->createAttribute('TypeName');
         $nameValue = $this->_xml->createTextNode($name);
         $nameAttr->appendChild($nameValue);
         $opusDoc->appendChild($nameAttr);
         $this->_xml->documentElement->appendChild($opusDoc);
     }
 }