ILIAS  trunk Revision v11.0_alpha-1744-gb0451eebef4
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
Harvester.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 
32 
33 class Harvester
34 {
36  protected ObjectHandler $object_handler;
37  protected ExportHandler $export_handler;
38  protected StatusRepository $status_repository;
42  protected SimpleDCXMLWriter $xml_writer;
43  protected \ilLogger $logger;
44 
45  public function __construct(
46  SettingsInterface $settings,
47  ObjectHandler $object_handler,
48  ExportHandler $export_handler,
49  StatusRepository $status_repository,
50  ExposedRecordRepository $exposed_record_repository,
51  CopyrightSearchFactory $copyright_search_factory,
52  LOMRepository $lom_repository,
53  SimpleDCXMLWriter $xml_writer,
54  \ilLogger $logger
55  ) {
56  $this->settings = $settings;
57  $this->object_handler = $object_handler;
58  $this->export_handler = $export_handler;
59  $this->status_repository = $status_repository;
60  $this->exposed_record_repository = $exposed_record_repository;
61  $this->copyright_search_factory = $copyright_search_factory;
62  $this->lom_repository = $lom_repository;
63  $this->xml_writer = $xml_writer;
64  $this->logger = $logger;
65  }
66 
67  public function run(Result $result): Result
68  {
69  try {
70  $messages = [];
71 
72  $harvestable_obj_ids = $this->findHarvestableObjectIDs();
73  $currently_harvested_obj_ids = iterator_to_array($this->status_repository->getAllHarvestedObjIDs());
74 
75  $deletion_count = $this->deleteDeprecatedReferences(
76  $harvestable_obj_ids,
77  $currently_harvested_obj_ids
78  );
79  $messages[] = 'Deleted ' . $deletion_count . ' deprecated references.';
80  $harvest_count = $this->harvestObjects(
81  $harvestable_obj_ids,
82  $currently_harvested_obj_ids
83  );
84  $messages[] = 'Created ' . $harvest_count . ' new references.';
85  $exposure_count = $this->updateExposedRecords(
86  $harvestable_obj_ids
87  );
88  $messages[] = 'Created, updated, or deleted ' . $exposure_count . ' exposed records.';
89 
90  if ($deletion_count !== 0 || $harvest_count !== 0 || $exposure_count !== 0) {
91  $result = $result->withStatus(\ILIAS\Cron\Job\JobResult::STATUS_OK);
92  } else {
93  $result = $result->withStatus(\ILIAS\Cron\Job\JobResult::STATUS_NO_ACTION);
94  }
95  return $result->withMessage(implode('<br>', $messages));
96  } catch (\Exception $e) {
97  return $result->withStatus(\ILIAS\Cron\Job\JobResult::STATUS_FAIL)
98  ->withMessage($e->getMessage());
99  }
100  }
101 
102  protected function findHarvestableObjectIDs(): array
103  {
104  $searcher = $this->copyright_search_factory->get()
105  ->withRestrictionToRepositoryObjects(true);
106  foreach ($this->settings->getObjectTypesSelectedForHarvesting() as $type) {
107  $searcher = $searcher->withAdditionalTypeFilter($type);
108  }
109  $search_results = [];
110  foreach ($searcher->search(
111  $this->lom_repository,
112  ...$this->settings->getCopyrightEntryIDsSelectedForHarvesting()
113  ) as $ressource_id) {
114  $search_results[] = $ressource_id->objID();
115  }
116 
117  $unblocked = $this->status_repository->filterOutBlockedObjects(...$search_results);
118  $results = [];
119  foreach ($unblocked as $obj_id) {
120  if ($this->object_handler->isObjectDeleted($obj_id)) {
121  continue;
122  }
123  $results[] = $obj_id;
124  }
125  return $results;
126  }
127 
133  protected function deleteDeprecatedReferences(
134  array $harvestable_obj_ids,
135  array $currently_harvested_obj_ids
136  ): int {
137  $count = 0;
138  foreach ($currently_harvested_obj_ids as $obj_id) {
139  if (in_array($obj_id, $harvestable_obj_ids)) {
140  continue;
141  }
142 
143  $ref_id = $this->status_repository->getHarvestRefID($obj_id);
144  $this->logDebug('Deleting deprecated object with ref_id: ' . $ref_id);
145  try {
146  $this->object_handler->deleteReference($ref_id);
147  } catch (\Exception $e) {
148  $this->logError(
149  'Error when deleting harvested reference with ref_id ' .
150  $ref_id . ': ' . $e->getMessage()
151  );
152  continue;
153  }
154  $this->status_repository->deleteHarvestRefID($obj_id);
155  $count++;
156  }
157  return $count;
158  }
159 
165  protected function harvestObjects(
166  array $harvestable_obj_ids,
167  array $currently_harvested_obj_ids
168  ): int {
169  $count = 0;
170 
171  $target_ref_id = $this->settings->getContainerRefIDForHarvesting();
172  if (!$target_ref_id) {
173  return 0;
174  }
175 
176  foreach ($harvestable_obj_ids as $obj_id) {
177  if (in_array($obj_id, $currently_harvested_obj_ids)) {
178  continue;
179  }
180 
181  $this->logDebug('Creating new reference for object with obj_id: ' . $obj_id);
182  try {
183  $new_ref_id = $this->object_handler->referenceObjectInTargetContainer(
184  $obj_id,
185  $target_ref_id
186  );
187  } catch (\Exception $e) {
188  $this->logError(
189  'Error when creating reference for object with obj_id ' .
190  $obj_id . ': ' . $e->getMessage()
191  );
192  continue;
193  }
194  $this->status_repository->setHarvestRefID($obj_id, $new_ref_id);
195 
196  try {
197  if (!$this->export_handler->hasPublicAccessExport($obj_id)) {
198  $this->export_handler->createPublicAccessExport($obj_id);
199  }
200  } catch (\Exception $e) {
201  $this->logError(
202  'Error when creating export for object with obj_id ' .
203  $obj_id . ': ' . $e->getMessage()
204  );
205  }
206 
207  $count++;
208  }
209  return $count;
210  }
211 
216  protected function updateExposedRecords(
217  array $harvestable_obj_ids,
218  ): int {
219  $count = 0;
220 
221  $source_ref_id = $this->settings->getContainerRefIDForExposing();
222  if (!$source_ref_id) {
223  return 0;
224  }
225 
226  $already_exposed = [];
227  foreach ($this->exposed_record_repository->getRecords() as $record) {
228  $obj_id = $record->infos()->objID();
229  $already_exposed[] = $obj_id;
230 
231  $ref_id = $this->object_handler->getObjectReferenceIDInContainer($obj_id, $source_ref_id);
232 
233  if (!in_array($obj_id, $harvestable_obj_ids) || is_null($ref_id)) {
234  $this->logDebug('Deleting exposed record for object with obj_id: ' . $obj_id);
235  $this->exposed_record_repository->deleteRecord($obj_id);
236  $count++;
237  continue;
238  }
239 
240  $simple_dc_xml = $this->xml_writer->writeSimpleDCMetaData(
241  $obj_id,
242  $ref_id,
243  $this->object_handler->getTypeOfReferencedObject($ref_id)
244  );
245 
246  if ($simple_dc_xml->saveXML() !== $record->metadata()->saveXML()) {
247  $this->logDebug('Updating exposed record for object with obj_id: ' . $obj_id);
248  $this->exposed_record_repository->updateRecord($obj_id, $simple_dc_xml);
249  $count++;
250  }
251  }
252 
253  foreach ($harvestable_obj_ids as $obj_id) {
254  if (in_array($obj_id, $already_exposed)) {
255  continue;
256  }
257 
258  $ref_id = $this->object_handler->getObjectReferenceIDInContainer($obj_id, $source_ref_id);
259  if (is_null($ref_id)) {
260  continue;
261  }
262 
263  $type = $this->object_handler->getTypeOfReferencedObject($ref_id);
264 
265  $simple_dc_xml = $this->xml_writer->writeSimpleDCMetaData(
266  $obj_id,
267  $ref_id,
268  $type
269  );
270 
271  $this->logDebug('Creating exposed record for object with obj_id: ' . $obj_id);
272  $this->exposed_record_repository->createRecord(
273  $obj_id,
274  $this->buildIdentifier($obj_id, $type),
275  $simple_dc_xml
276  );
277  $count++;
278  }
279 
280  return $count;
281  }
282 
283  protected function logDebug(string $message): void
284  {
285  $this->logger->debug($message);
286  }
287 
288  protected function logError(string $message): void
289  {
290  $this->logger->error($message);
291  }
292 
293  protected function buildIdentifier(int $obj_id, string $type): string
294  {
295  return 'il__' . $type . '_' . $obj_id;
296  }
297 }
buildIdentifier(int $obj_id, string $type)
Definition: Harvester.php:293
ExposedRecordRepository $exposed_record_repository
Definition: Harvester.php:39
Interface Observer Contains several chained tasks and infos about them.
deleteDeprecatedReferences(array $harvestable_obj_ids, array $currently_harvested_obj_ids)
Returns number of deletions.
Definition: Harvester.php:133
$messages
Definition: xapiexit.php:21
$ref_id
Definition: ltiauth.php:65
harvestObjects(array $harvestable_obj_ids, array $currently_harvested_obj_ids)
Returns number of harvested objects.
Definition: Harvester.php:165
__construct(SettingsInterface $settings, ObjectHandler $object_handler, ExportHandler $export_handler, StatusRepository $status_repository, ExposedRecordRepository $exposed_record_repository, CopyrightSearchFactory $copyright_search_factory, LOMRepository $lom_repository, SimpleDCXMLWriter $xml_writer, \ilLogger $logger)
Definition: Harvester.php:45
$results
updateExposedRecords(array $harvestable_obj_ids,)
Returns number of changed exposed records.
Definition: Harvester.php:216
CopyrightSearchFactory $copyright_search_factory
Definition: Harvester.php:40
$message
Definition: xapiexit.php:31