Skip to content

Commit 86b6926

Browse files
authored
[FINNA-3708] Convert SolrQdc and SolrMarc to use finna-xml. (#3428)
The getFilteredXMLElement method required changes to be made also in SolrAipa and other classes, but the changes were kept minimal (to be changed in follow-ups).
1 parent bf2f6e9 commit 86b6926

File tree

20 files changed

+782
-429
lines changed

20 files changed

+782
-429
lines changed

composer.local.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"league/mime-type-detection": "1.9.0",
2222
"natlibfi/besimple-soap": "3.0.1",
2323
"natlibfi/finna-code-sets": "0.5.2",
24-
"natlibfi/finna-xml": "1.2.0",
24+
"natlibfi/finna-xml": "1.6.0",
2525
"natlibfi/php-html-parser": "4.0.1",
2626
"phpoffice/phpspreadsheet": "^2.0",
2727
"picqer/php-barcode-generator": "2.0.1",

composer.lock

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

module/Finna/src/Finna/RecordDriver/AipaLrmi.php

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@
3333
use Finna\RecordDriver\Feature\ContainerFormatTrait;
3434
use Finna\RecordDriver\Feature\EncapsulatedRecordInterface;
3535
use Finna\RecordDriver\Feature\EncapsulatedRecordTrait;
36+
use FinnaXml\XmlDoc;
3637
use NatLibFi\FinnaCodeSets\FinnaCodeSets;
3738

39+
use function in_array;
3840
use function is_callable;
3941

4042
/**
@@ -60,6 +62,23 @@ class AipaLrmi extends SolrLrmi implements
6062
*/
6163
protected FinnaCodeSets $codeSets;
6264

65+
/**
66+
* Fields filtered from the record by getFilteredXmlElement method.
67+
*
68+
* @var array
69+
*/
70+
protected $filterFields = [
71+
'abstract',
72+
'description',
73+
'assignmentIdeas',
74+
'learningResource/studyObjectives',
75+
'learningResource/educationalLevel/name',
76+
'learningResource/educationalLevel/inDefinedTermSet/name',
77+
'learningResource/educationalAlignment/educationalSubject/educationalFramework',
78+
'learningResource/educationalAlignment/educationalSubject/targetName',
79+
'learningResource/teaches/name',
80+
];
81+
6382
/**
6483
* Attach Finna Code Sets library instance.
6584
*
@@ -267,7 +286,7 @@ public function getType(): string
267286
*/
268287
protected function getEncapsulatedRecordElementTagName(): string
269288
{
270-
return 'material';
289+
return "{{$this->lrmiNs}}material";
271290
}
272291

273292
/**
@@ -283,53 +302,40 @@ protected function getEncapsulatedRecordFormat($item): string
283302
}
284303

285304
/**
286-
* Return full record as a filtered SimpleXMLElement for public APIs.
305+
* Return full record as a filtered XmlDoc for public APIs.
287306
*
288-
* @return \SimpleXMLElement
307+
* @return XmlDoc
289308
*/
290-
public function getFilteredXMLElement(): \SimpleXMLElement
309+
public function getFilteredXmlElement(): XmlDoc
291310
{
292-
$record = parent::getFilteredXMLElement();
293-
$this->doFilterFields($record, ['abstract', 'description', 'assignmentIdeas']);
294-
foreach ($record->learningResource as $learningResource) {
295-
$this->doFilterFields($learningResource, ['studyObjectives']);
296-
foreach ($learningResource->educationalLevel as $educationalLevel) {
297-
$this->doFilterFields($educationalLevel, ['name']);
298-
foreach ($educationalLevel->inDefinedTermSet as $inDefinedTermSet) {
299-
$this->doFilterFields($inDefinedTermSet, ['name']);
300-
}
301-
}
302-
foreach ($learningResource->educationalAlignment as $educationalAlignment) {
303-
foreach ($educationalAlignment->educationalSubject as $educationalSubject) {
304-
$this->doFilterFields(
305-
$educationalSubject,
306-
['educationalFramework', 'targetName']
307-
);
308-
}
309-
}
310-
foreach ($learningResource->teaches as $teaches) {
311-
$this->doFilterFields($teaches, ['name']);
311+
$record = parent::getFilteredXmlElement();
312+
$record->filter(
313+
function (array $node, string $path) use ($record): bool {
314+
$path = implode(
315+
'/',
316+
array_map(
317+
[$record, 'localName'],
318+
explode('/', $path)
319+
)
320+
);
321+
return in_array($path, $this->filterFields);
312322
}
313-
}
323+
);
324+
314325
return $this->filterEncapsulatedRecords($record);
315326
}
316327

317328
/**
318329
* Helper method for filtering fields.
319330
*
320-
* @param \SimpleXMLElement $baseElement Base element
321-
* @param array $filterFields Fields to filter
331+
* @param XmlDoc $xmlDoc Document
332+
* @param array $filterFields Fields to filter (paths with local names of nodes)
322333
*
323334
* @return void
324335
*/
325336
protected function doFilterFields(
326-
\SimpleXMLElement $baseElement,
337+
XmlDoc $xmlDoc,
327338
array $filterFields
328339
): void {
329-
foreach ($filterFields as $filterField) {
330-
while ($baseElement->{$filterField}) {
331-
unset($baseElement->{$filterField}[0]);
332-
}
333-
}
334340
}
335341
}

module/Finna/src/Finna/RecordDriver/CuratedRecord.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
use Finna\RecordDriver\Feature\EncapsulatedRecordInterface;
3535
use Finna\RecordDriver\Feature\EncapsulatedRecordTrait;
3636
use Finna\RecordDriver\Feature\FinnaXmlReaderTrait;
37+
use FinnaXml\XmlDoc;
3738
use VuFind\RecordDriver\AbstractBase;
3839
use VuFindSearch\Response\RecordInterface;
3940

@@ -147,17 +148,16 @@ public function getNotes(): string
147148
/**
148149
* Return full record as a filtered SimpleXMLElement for public APIs.
149150
*
150-
* @return \SimpleXMLElement
151+
* @return XmlDoc
151152
*/
152-
public function getFilteredXMLElement(): \SimpleXMLElement
153+
public function getFilteredXMLElement(): XmlDoc
153154
{
154-
$record = clone $this->getXmlRecord();
155-
$filterFields = ['comment'];
156-
foreach ($filterFields as $filterField) {
157-
while ($record->{$filterField}) {
158-
unset($record->{$filterField}[0]);
155+
$record = clone $this->getXmlDoc();
156+
$record->filter(
157+
function (array $node) use ($record): bool {
158+
return 'comment' === $record->localName($node);
159159
}
160-
}
160+
);
161161
// Only the URL of the single encapsulated record is in the XML record, so
162162
// there is no need to call filterEncapsulatedRecords().
163163
return $record;

module/Finna/src/Finna/RecordDriver/CuratedRecordList.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public function getAdditionalType(): string
8282
*/
8383
protected function getEncapsulatedRecordElementTagName(): string
8484
{
85-
return 'curatedRecord';
85+
return "{{$this->aipaNs}}curatedRecord";
8686
}
8787

8888
/**

0 commit comments

Comments
 (0)