ILIAS  release_8 Revision v8.19
All Data Structures Namespaces Files Functions Variables Modules Pages
class.ilOerHarvester.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
6 
14 {
15  private ilLogger $logger;
16 
18 
20 
21  protected ilTree $tree;
22 
23  public function __construct(ilCronJobResult $result)
24  {
25  global $DIC;
26 
27  $this->tree = $DIC->repositoryTree();
28  $this->logger = $DIC->logger()->meta();
29  $this->cronresult = $result;
31  }
32 
33  public function run(): ilCronJobResult
34  {
35  try {
36  $obj_ids = $this->collect();
37  $obj_ids = $this->filter($obj_ids);
38  $num = $this->harvest($obj_ids);
39 
40  $message = 'Created ' . $num . ' new objects. <br />';
41 
42  $deleted = $this->deleteDeprecated();
43 
44  $message .= 'Deleted ' . $deleted . ' deprecated objects.';
45 
46  if (!$deleted && !$num) {
47  $this->cronresult->setStatus(ilCronJobResult::STATUS_NO_ACTION);
48  } else {
49  $this->cronresult->setStatus(ilCronJobResult::STATUS_OK);
50  }
51  $this->cronresult->setMessage($message);
52  return $this->cronresult;
53  } catch (Exception $e) {
54  $this->cronresult->setStatus(ilCronJobResult::STATUS_FAIL);
55  $this->cronresult->setMessage($e->getMessage());
56  return $this->cronresult;
57  }
58  }
59 
64  protected function collect(): array
65  {
66  $collectable_types = $this->settings->getHarvestingTypes();
67  $copyright_ids = $this->settings->getCopyRightTemplatesInLomFormat();
68 
69  $collectable_obj_ids = ilMDRights::lookupRightsByTypeAndCopyright(
70  $collectable_types,
71  $copyright_ids
72  );
73 
74  $this->logger->debug('Found ' . count($collectable_types) . ' collectable objects.');
75  $this->logger->dump($collectable_obj_ids, ilLogLevel::DEBUG);
76 
77  return $collectable_obj_ids;
78  }
79 
84  protected function filter(array $a_collectable_obj_ids): array
85  {
86  $filtered = [];
87  foreach ($a_collectable_obj_ids as $obj_id) {
88  $status = new ilOerHarvesterObjectStatus($obj_id);
89  if ($status->isCreated()) {
90  $this->logger->debug('Object already created: ' . $obj_id);
91  continue;
92  }
93  if ($status->isBlocked()) {
94  $this->logger->debug('Object creation is blocked: ' . $obj_id);
95  continue;
96  }
97 
98  $exists = false;
99  foreach (ilObject::_getAllReferences($obj_id) as $ref_id => $tmp) {
100  if (!$this->tree->isDeleted($ref_id)) {
101  $exists = true;
102  }
103  }
104  if (!$exists) {
105  $this->logger->notice('Ignoring deleted object: ' . $obj_id);
106  continue;
107  }
108  $filtered[] = $obj_id;
109  }
110 
111  $this->logger->debug('Result after filtering.');
112  $this->logger->dump($filtered, ilLogLevel::DEBUG);
113 
114  return $filtered;
115  }
116 
120  protected function harvest(array $a_collectable_obj_ids): int
121  {
122  $num = 0;
123  foreach ($a_collectable_obj_ids as $obj_id) {
124  $ref_ids = ilObject::_getAllReferences($obj_id);
125  $ref_id = end($ref_ids);
126 
128 
129  if (!$object instanceof ilObject) {
130  $this->logger->warning('Found invalid reference: ' . $ref_id);
131  }
132  $this->logger->debug('Creating new reference for object: ' . $obj_id);
133  $this->harvestObject($object);
134  $num++;
135  }
136  return $num;
137  }
138 
139  protected function harvestObject(ilObject $object): bool
140  {
141  $this->logger->debug('Create new reference');
142  $new_ref_id = $object->createReference();
143  $this->logger->debug('Put in tree');
144  $object->putInTree($this->settings->getTarget());
145  $this->logger->debug('Set pernissions');
146  $object->setPermissions($this->settings->getTarget());
147 
148  $this->logger->debug('Set status');
149  $status = new ilOerHarvesterObjectStatus($object->getId());
150  $status->setHarvestRefId($new_ref_id);
151  $status->setBlocked(false);
152  $status->save();
153 
154  return true;
155  }
156 
157  protected function deleteObject(int $a_ref_id): bool
158  {
159  $object = ilObjectFactory::getInstanceByRefId($a_ref_id, false);
160 
161  if (!$object instanceof ilObject) {
162  $this->logger->warning('Found invalid reference: ' . $a_ref_id);
163  return false;
164  }
165  $this->logger->debug('Deleting reference...');
166  $object->delete();
167 
168  $status = new ilOerHarvesterObjectStatus(
170  );
171  $status->delete();
172  return true;
173  }
174 
175  protected function deleteDeprecated(): int
176  {
177  $num_deleted = 0;
179  $obj_id = ilObject::_lookupObjId($ref_id);
180 
181  // blocked items are always deleted
182  $status = new ilOerHarvesterObjectStatus($obj_id);
183  if ($status->isBlocked()) {
184  $this->logger->debug('Deleting blocked object ressource.');
185  $this->deleteObject($ref_id);
186  $num_deleted++;
187  continue;
188  }
189 
190  $copyright = ilMDRights::_lookupDescription($obj_id, $obj_id);
191  $is_valid = false;
192  foreach ($this->settings->getCopyRightTemplatesInLomFormat() as $cp) {
193  if (strcmp($copyright, $cp) === 0) {
194  $is_valid = true;
195  }
196  }
197 
198  if (!$is_valid) {
199  $this->logger->debug('Deleting deprecated object with ref_id: ' . $ref_id);
200  $this->deleteObject($ref_id);
201  $num_deleted++;
202  }
203  }
204  return $num_deleted;
205  }
206 }
static _getAllReferences(int $id)
get all reference ids for object ID
deleteObject(int $a_ref_id)
Cron job for definition for oer harvesting.
static _lookupDescription(int $a_rbac_id, int $a_obj_id)
setPermissions(int $parent_ref_id)
static _lookupObjId(int $ref_id)
global $DIC
Definition: feed.php:28
createReference()
creates reference for object
collect()
Collect all obj_ids with copyright settings which are collectable.
$ref_id
Definition: ltiauth.php:67
__construct(ilCronJobResult $result)
static getInstanceByRefId(int $ref_id, bool $stop_on_error=true)
get an instance of an Ilias object by reference id
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Cron job for definition for oer harvesting.
ilOerHarvesterSettings $settings
harvest(array $a_collectable_obj_ids)
putInTree(int $parent_ref_id)
maybe this method should be in tree object!?
filter(array $a_collectable_obj_ids)
harvestObject(ilObject $object)
$message
Definition: xapiexit.php:32
ilCronJobResult $cronresult
static lookupRightsByTypeAndCopyright(array $a_types, array $a_copyright)