ILIAS  trunk Revision v12.0_alpha-377-g3641b37b9db
Writer.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22
28use ILIAS\MetaData\OERExposer\OAIPMH\DateHelper;
29
30class Writer implements WriterInterface
31{
32 use DateHelper;
33
34 public function writeError(Error $error, string $message): \DOMDocument
35 {
36 $xml = new \DomDocument('1.0', 'UTF-8');
37 $element = $xml->createElement(
38 'error',
39 $message
40 );
41 $element->setAttribute('code', $error->value);
42 $xml->appendChild($element);
43 return $xml;
44 }
45
46 public function writeIdentifyElements(
47 string $repository_name,
48 URI $base_url,
49 \DateTimeImmutable $earliest_datestamp,
50 string $first_admin_email,
51 string ...$further_admin_emails
52 ): \Generator {
53 yield $this->writeSingleElementXML(
54 'repositoryName',
55 $repository_name
56 );
57 yield $this->writeSingleElementXML(
58 'baseURL',
59 (string) $base_url
60 );
61 yield $this->writeSingleElementXML(
62 'protocolVersion',
63 '2.0'
64 );
65 yield $this->writeSingleElementXML(
66 'earliestDatestamp',
67 $this->getFormattedDate($earliest_datestamp)
68 );
69 yield $this->writeSingleElementXML(
70 'deletedRecord',
71 'transient'
72 );
73 yield $this->writeSingleElementXML(
74 'granularity',
75 'YYYY-MM-DD'
76 );
77
78 array_unshift($further_admin_emails, $first_admin_email);
79 foreach ($further_admin_emails as $admin_email) {
80 yield $this->writeSingleElementXML(
81 'adminEmail',
82 $admin_email
83 );
84 }
85 }
86
87 protected function writeSingleElementXML(
88 string $element_name,
89 string $element_value
90 ): \DOMDocument {
91 $xml = new \DomDocument('1.0', 'UTF-8');
92 $element_xml = $xml->createElement(
93 $element_name,
94 $element_value
95 );
96 $xml->appendChild($element_xml);
97 return $xml;
98 }
99
100 public function writeMetadataFormat(): \DOMDocument
101 {
102 $xml = new \DomDocument('1.0', 'UTF-8');
103
104 $root = $xml->createElement('metadataFormat');
105 $xml->appendChild($root);
106
107 $prefix = $xml->createElement(
108 'metadataPrefix',
109 'oai_dc'
110 );
111 $root->appendChild($prefix);
112
113 $schema = $xml->createElement(
114 'schema',
115 'http://www.openarchives.org/OAI/2.0/oai_dc.xsd'
116 );
117 $root->appendChild($schema);
118
119 $namespace = $xml->createElement(
120 'metadataNamespace',
121 'http://www.openarchives.org/OAI/2.0/oai_dc/'
122 );
123 $root->appendChild($namespace);
124
125 return $xml;
126 }
127
128 public function writeRecordHeader(
129 string $identifier,
130 \DateTimeImmutable $datestamp,
131 bool $deleted = false
132 ): \DOMDocument {
133 $xml = new \DomDocument('1.0', 'UTF-8');
134
135 $root = $xml->createElement('header');
136 if ($deleted) {
137 $root->setAttribute('status', 'deleted');
138 }
139 $xml->appendChild($root);
140
141 $identifier = $xml->createElement(
142 'identifier',
143 $identifier
144 );
145 $root->appendChild($identifier);
146
147 $datestamp = $xml->createElement(
148 'datestamp',
149 $this->getFormattedDate($datestamp)
150 );
151 $root->appendChild($datestamp);
152
153 return $xml;
154 }
155
156 public function writeRecord(
157 string $identifier,
158 \DateTimeImmutable $datestamp,
159 \DOMDocument $metadata
160 ): \DOMDocument {
161 $xml = new \DomDocument('1.0', 'UTF-8');
162
163 $root = $xml->createElement('record');
164 $xml->appendChild($root);
165
166 $header_xml = $this->writeRecordHeader($identifier, $datestamp);
167 $root->appendChild($xml->importNode($header_xml->documentElement, true));
168
169 $metadata_xml = $xml->createElement('metadata');
170 $root->appendChild($metadata_xml);
171 $metadata_xml->appendChild($xml->importNode($metadata->documentElement, true));
172
173 return $xml;
174 }
175
176 public function writeDeletedRecord(
177 string $identifier,
178 \DateTimeImmutable $datestamp
179 ): \DOMDocument {
180 $xml = new \DomDocument('1.0', 'UTF-8');
181
182 $root = $xml->createElement('record');
183 $xml->appendChild($root);
184
185 $header_xml = $this->writeRecordHeader($identifier, $datestamp, true);
186 $root->appendChild($xml->importNode($header_xml->documentElement, true));
187
188 return $xml;
189 }
190
191 public function writeSet(
192 string $spec,
193 string $name
194 ): \DOMDocument {
195 $xml = new \DomDocument('1.0', 'UTF-8');
196
197 $root = $xml->createElement('set');
198 $xml->appendChild($root);
199
200 $spec_xml = $xml->createElement('setSpec', $spec);
201 $root->appendChild($spec_xml);
202
203 $name_xml = $xml->createElement('setName', $name);
204 $root->appendChild($name_xml);
205
206 return $xml;
207 }
208
209 public function writeResumptionToken(
210 string $token,
211 int $complete_list_size,
212 int $cursor
213 ): \DOMDocument {
214 $xml = new \DomDocument('1.0', 'UTF-8');
215 $element = $xml->createElement(
216 'resumptionToken',
217 $token
218 );
219 $element->setAttribute('completeListSize', (string) $complete_list_size);
220 $element->setAttribute('cursor', (string) $cursor);
221 $xml->appendChild($element);
222 return $xml;
223 }
224
225 public function writeResponse(
226 RequestInterface $request,
227 \DOMDocument ...$contents
228 ): \DOMDocument {
229 $xml = new \DomDocument('1.0', 'UTF-8');
230
231 $root = $this->createRootElement($xml);
232 $xml->appendChild($root);
233
234 $date_xml = $this->createDateElement($xml);
235 $root->appendChild($date_xml);
236 $request_xml = $this->createRequestElement($xml, $request);
237 $root->appendChild($request_xml);
238
239 $verb_xml = $xml->createElement($request->verb()->value);
240 $root->appendChild($verb_xml);
241
242 foreach ($contents as $content_xml) {
243 $verb_xml->appendChild(
244 $xml->importNode($content_xml->documentElement, true)
245 );
246 }
247
248 return $xml;
249 }
250
251 public function writeErrorResponse(
252 RequestInterface $request,
253 \DOMDocument ...$errors
254 ): \DOMDocument {
255 $xml = new \DomDocument('1.0', 'UTF-8');
256
257 $root = $this->createRootElement($xml);
258 $xml->appendChild($root);
259
260 $date_xml = $this->createDateElement($xml);
261 $root->appendChild($date_xml);
262 $request_xml = $this->createRequestElement($xml, $request);
263 $root->appendChild($request_xml);
264
265 foreach ($errors as $error_xml) {
266 $root->appendChild(
267 $xml->importNode($error_xml->documentElement, true)
268 );
269 }
270
271 return $xml;
272 }
273
274 protected function createRootElement(\DOMDocument $xml): \DOMElement
275 {
276 $root = $xml->createElement('OAI-PMH');
277 $root->setAttribute(
278 'xmlns',
279 'http://www.openarchives.org/OAI/2.0/'
280 );
281 $root->setAttribute(
282 'xmlns:xsi',
283 'http://www.w3.org/2001/XMLSchema-instance'
284 );
285 $root->setAttribute(
286 'xsi:schemaLocation',
287 'http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd'
288 );
289 return $root;
290 }
291
292 protected function createDateElement(\DOMDocument $xml): \DOMElement
293 {
294 return $xml->createElement(
295 'responseDate',
296 $this->getFormattedDateTime($this->getCurrentDateTime())
297 );
298 }
299
300 protected function createRequestElement(
301 \DOMDocument $xml,
302 RequestInterface $request
303 ): \DOMElement {
304 $request_xml = $xml->createElement(
305 'request',
306 (string) $request->baseURL()
307 );
308 if ($request->verb() !== Verb::NULL) {
309 $request_xml->setAttribute(
310 Argument::VERB->value,
311 $request->verb()->value
312 );
313 }
314 foreach ($request->argumentKeys() as $key) {
315 $request_xml->setAttribute(
316 $key->value,
317 $request->argumentValue($key)
318 );
319 }
320 return $request_xml;
321 }
322}
The scope of this class is split ilias-conform URI's into components.
Definition: URI.php:35
writeError(Error $error, string $message)
Definition: Writer.php:34
writeRecordHeader(string $identifier, \DateTimeImmutable $datestamp, bool $deleted=false)
Definition: Writer.php:128
writeSet(string $spec, string $name)
Definition: Writer.php:191
writeErrorResponse(RequestInterface $request, \DOMDocument ... $errors)
Definition: Writer.php:251
writeRecord(string $identifier, \DateTimeImmutable $datestamp, \DOMDocument $metadata)
Also includes the header.
Definition: Writer.php:156
createRequestElement(\DOMDocument $xml, RequestInterface $request)
Definition: Writer.php:300
writeResumptionToken(string $token, int $complete_list_size, int $cursor)
Definition: Writer.php:209
writeIdentifyElements(string $repository_name, URI $base_url, \DateTimeImmutable $earliest_datestamp, string $first_admin_email, string ... $further_admin_emails)
Definition: Writer.php:46
writeSingleElementXML(string $element_name, string $element_value)
Definition: Writer.php:87
writeDeletedRecord(string $identifier, \DateTimeImmutable $datestamp)
Definition: Writer.php:176
writeResponse(RequestInterface $request, \DOMDocument ... $contents)
Definition: Writer.php:225
ilErrorHandling $error
Definition: class.ilias.php:69
if($err=$client->getError()) $namespace
$token
Definition: xapitoken.php:67