1<?php 2 3/* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */ 4 5/** 6 * Cron job for definition for oer harvesting 7 * 8 * @author Stefan Meyer <smeyer.ilias@gmx.de> 9 * 10 */ 11class ilOerHarvester 12{ 13 /** 14 * @var \ilLogger 15 */ 16 private $logger = null; 17 18 /** 19 * @var \ilCronJobResult 20 */ 21 private $cronresult = null; 22 23 24 /** 25 * @var ilOerHarvesterSettings 26 */ 27 private $settings = null; 28 29 /** 30 * ilOerHarvester constructor. 31 * @param \ilCronJobResult $result 32 */ 33 public function __construct(ilCronJobResult $result) 34 { 35 global $DIC; 36 37 $this->logger = $DIC->logger()->meta(); 38 $this->cronresult = $result; 39 $this->settings = ilOerHarvesterSettings::getInstance(); 40 } 41 42 /** 43 * run harvester 44 * @return ilCronJobResult 45 */ 46 public function run() 47 { 48 try { 49 $obj_ids = $this->collect(); 50 $obj_ids = $this->filter($obj_ids); 51 $num = $this->harvest($obj_ids); 52 53 $message = 'Created ' . $num . ' new objects. <br />'; 54 55 $deleted = $this->deleteDeprecated(); 56 57 $message .= 'Deleted ' . $deleted . ' deprecated objects.'; 58 59 if (!$deleted && !$num) { 60 $this->cronresult->setStatus(ilCronJobResult::STATUS_NO_ACTION); 61 } else { 62 $this->cronresult->setStatus(ilCronJobResult::STATUS_OK); 63 } 64 $this->cronresult->setMessage($message); 65 return $this->cronresult; 66 } catch (Exception $e) { 67 $this->cronresult->setStatus(ilCronJobResult::STATUS_FAIL); 68 $this->cronresult->setMessage($e->getMessage()); 69 return $this->cronresult; 70 } 71 } 72 73 /** 74 * Collect all obj_ids with copyright settings which are collectable. 75 * @return int[] 76 */ 77 protected function collect() 78 { 79 $collectable_types = $this->settings->getHarvestingTypes(); 80 $copyright_ids = $this->settings->getCopyRightTemplatesInLomFormat(); 81 82 $collectable_obj_ids = ilMDRights::lookupRightsByTypeAndCopyright( 83 $collectable_types, 84 $copyright_ids 85 ); 86 87 $this->logger->debug('Found ' . count($collectable_types) . ' collectable objects.'); 88 $this->logger->dump($collectable_obj_ids, ilLogLevel::DEBUG); 89 90 return $collectable_obj_ids; 91 } 92 93 /** 94 * @param int[] $a_collectable_obj_ids 95 */ 96 protected function filter($a_collectable_obj_ids) 97 { 98 global $DIC; 99 100 $tree = $DIC->repositoryTree(); 101 102 $filtered = []; 103 foreach ($a_collectable_obj_ids as $obj_id) { 104 $status = new ilOerHarvesterObjectStatus($obj_id); 105 if ($status->isCreated()) { 106 $this->logger->debug('Object already created: ' . $obj_id); 107 continue; 108 } 109 if ($status->isBlocked()) { 110 $this->logger->debug('Object creation is blocked: ' . $obj_id); 111 continue; 112 } 113 114 $exists = false; 115 foreach (ilObject::_getAllReferences($obj_id) as $ref_id => $tmp) { 116 if (!$tree->isDeleted($ref_id)) { 117 $exists = true; 118 } 119 } 120 if (!$exists) { 121 $this->logger->notice('Ignoring deleted object: ' . $obj_id); 122 continue; 123 } 124 $filtered[] = $obj_id; 125 } 126 127 $this->logger->debug('Result after filtering.'); 128 $this->logger->dump($filtered, ilLogLevel::DEBUG); 129 130 return $filtered; 131 } 132 133 /** 134 * @param int[] $a_collectable_obj_ids 135 * @return bool 136 */ 137 protected function harvest($a_collectable_obj_ids) 138 { 139 $num = 0; 140 foreach ($a_collectable_obj_ids as $obj_id) { 141 $ref_ids = ilObject::_getAllReferences($obj_id); 142 $ref_id = end($ref_ids); 143 144 $object = ilObjectFactory::getInstanceByRefId($ref_id, false); 145 146 if (!$object instanceof ilObject) { 147 $this->logger->warning('Found invalid reference: ' . $ref_id); 148 } 149 $this->logger->debug('Creating new reference for object: ' . $obj_id); 150 $this->harvestObject($object); 151 $num++; 152 } 153 return $num; 154 } 155 156 /** 157 * Harvest object 158 * @param $ref_id 159 */ 160 protected function harvestObject(ilObject $object) 161 { 162 $this->logger->debug('Create new reference'); 163 $new_ref_id = $object->createReference(); 164 $this->logger->debug('Put in tree'); 165 $object->putInTree($this->settings->getTarget()); 166 $this->logger->debug('Set pernissions'); 167 $object->setPermissions($this->settings->getTarget()); 168 169 $this->logger->debug('Set status'); 170 $status = new ilOerHarvesterObjectStatus($object->getId()); 171 $status->setHarvestRefId($new_ref_id); 172 $status->setBlocked(false); 173 $status->save(); 174 175 return true; 176 } 177 178 /** 179 * Delete object 180 */ 181 protected function deleteObject($a_ref_id) 182 { 183 $object = ilObjectFactory::getInstanceByRefId($a_ref_id, false); 184 185 if (!$object instanceof ilObject) { 186 $this->logger->warning('Found invalid reference: ' . $a_ref_id); 187 return false; 188 } 189 $this->logger->debug('Deleting reference...'); 190 $object->delete(); 191 192 193 $status = new ilOerHarvesterObjectStatus( 194 ilOerHarvesterObjectStatus::lookupObjIdByHarvestingId($a_ref_id) 195 ); 196 $status->delete(); 197 } 198 199 /** 200 * Delete deprecated 201 */ 202 protected function deleteDeprecated() 203 { 204 $num_deleted = 0; 205 foreach (ilOerHarvesterObjectStatus::lookupHarvested() as $ref_id) { 206 $obj_id = ilObject::_lookupObjId($ref_id); 207 208 // blocked items are always deleted 209 $status = new ilOerHarvesterObjectStatus($obj_id); 210 if ($status->isBlocked()) { 211 $this->logger->debug('Deleting blocked object ressource.'); 212 $this->deleteObject($ref_id); 213 $num_deleted++; 214 continue; 215 } 216 217 $copyright = ilMDRights::_lookupDescription($obj_id, $obj_id); 218 $is_valid = false; 219 foreach ($this->settings->getCopyRightTemplatesInLomFormat() as $cp) { 220 if (strcmp($copyright, $cp) === 0) { 221 $is_valid = true; 222 } 223 } 224 225 if (!$is_valid) { 226 $this->logger->debug('Deleting deprecated object with ref_id: ' . $ref_id); 227 $this->deleteObject($ref_id); 228 $num_deleted++; 229 } 230 } 231 return $num_deleted; 232 } 233} 234