ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
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',
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 'no'
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 ): \DOMDocument {
132 $xml = new \DomDocument('1.0', 'UTF-8');
133
134 $root = $xml->createElement('header');
135 $xml->appendChild($root);
136
137 $identifier = $xml->createElement(
138 'identifier',
139 $identifier
140 );
141 $root->appendChild($identifier);
142
143 $datestamp = $xml->createElement(
144 'datestamp',
145 $this->getFormattedDate($datestamp)
146 );
147 $root->appendChild($datestamp);
148
149 return $xml;
150 }
151
152 public function writeRecord(
153 string $identifier,
154 \DateTimeImmutable $datestamp,
155 \DOMDocument $metadata
156 ): \DOMDocument {
157 $xml = new \DomDocument('1.0', 'UTF-8');
158
159 $root = $xml->createElement('record');
160 $xml->appendChild($root);
161
162 $header_xml = $this->writeRecordHeader($identifier, $datestamp);
163 $root->appendChild($xml->importNode($header_xml->documentElement, true));
164
165 $metadata_xml = $xml->createElement('metadata');
166 $root->appendChild($metadata_xml);
167 $metadata_xml->appendChild($xml->importNode($metadata->documentElement, true));
168
169 return $xml;
170 }
171
172 public function writeSet(
173 string $spec,
174 string $name
175 ): \DOMDocument {
176 $xml = new \DomDocument('1.0', 'UTF-8');
177
178 $root = $xml->createElement('set');
179 $xml->appendChild($root);
180
181 $spec_xml = $xml->createElement('setSpec', $spec);
182 $root->appendChild($spec_xml);
183
184 $name_xml = $xml->createElement('setName', $name);
185 $root->appendChild($name_xml);
186
187 return $xml;
188 }
189
190 public function writeResumptionToken(
191 string $token,
192 int $complete_list_size,
193 int $cursor
194 ): \DOMDocument {
195 $xml = new \DomDocument('1.0', 'UTF-8');
196 $element = $xml->createElement(
197 'resumptionToken',
198 $token
199 );
200 $element->setAttribute('completeListSize', (string) $complete_list_size);
201 $element->setAttribute('cursor', (string) $cursor);
202 $xml->appendChild($element);
203 return $xml;
204 }
205
206 public function writeResponse(
207 RequestInterface $request,
208 \DOMDocument ...$contents
209 ): \DOMDocument {
210 $xml = new \DomDocument('1.0', 'UTF-8');
211
212 $root = $this->createRootElement($xml);
213 $xml->appendChild($root);
214
215 $date_xml = $this->createDateElement($xml);
216 $root->appendChild($date_xml);
217 $request_xml = $this->createRequestElement($xml, $request);
218 $root->appendChild($request_xml);
219
220 $verb_xml = $xml->createElement($request->verb()->value);
221 $root->appendChild($verb_xml);
222
223 foreach ($contents as $content_xml) {
224 $verb_xml->appendChild(
225 $xml->importNode($content_xml->documentElement, true)
226 );
227 }
228
229 return $xml;
230 }
231
232 public function writeErrorResponse(
233 RequestInterface $request,
234 \DOMDocument ...$errors
235 ): \DOMDocument {
236 $xml = new \DomDocument('1.0', 'UTF-8');
237
238 $root = $this->createRootElement($xml);
239 $xml->appendChild($root);
240
241 $date_xml = $this->createDateElement($xml);
242 $root->appendChild($date_xml);
243 $request_xml = $this->createRequestElement($xml, $request);
244 $root->appendChild($request_xml);
245
246 foreach ($errors as $error_xml) {
247 $root->appendChild(
248 $xml->importNode($error_xml->documentElement, true)
249 );
250 }
251
252 return $xml;
253 }
254
255 protected function createRootElement(\DOMDocument $xml): \DOMElement
256 {
257 $root = $xml->createElement('OAI-PMH');
258 $root->setAttribute(
259 'xmlns',
260 'http://www.openarchives.org/OAI/2.0/'
261 );
262 $root->setAttribute(
263 'xmlns:xsi',
264 'http://www.w3.org/2001/XMLSchema-instance'
265 );
266 $root->setAttribute(
267 'xsi:schemaLocation',
268 'http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd'
269 );
270 return $root;
271 }
272
273 protected function createDateElement(\DOMDocument $xml): \DOMElement
274 {
275 return $xml->createElement(
276 'responseDate',
277 $this->getFormattedDateTime($this->getCurrentDateTime())
278 );
279 }
280
281 protected function createRequestElement(
282 \DOMDocument $xml,
283 RequestInterface $request
284 ): \DOMElement {
285 $request_xml = $xml->createElement(
286 'request',
287 (string) $request->baseURL()
288 );
289 if ($request->verb() !== Verb::NULL) {
290 $request_xml->setAttribute(
291 Argument::VERB->value,
292 $request->verb()->value
293 );
294 }
295 foreach ($request->argumentKeys() as $key) {
296 $request_xml->setAttribute(
297 $key->value,
298 $request->argumentValue($key)
299 );
300 }
301 return $request_xml;
302 }
303}
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
writeSet(string $spec, string $name)
Definition: Writer.php:172
writeErrorResponse(RequestInterface $request, \DOMDocument ... $errors)
Definition: Writer.php:232
writeRecord(string $identifier, \DateTimeImmutable $datestamp, \DOMDocument $metadata)
Also includes the header.
Definition: Writer.php:152
createRequestElement(\DOMDocument $xml, RequestInterface $request)
Definition: Writer.php:281
writeRecordHeader(string $identifier, \DateTimeImmutable $datestamp)
Definition: Writer.php:128
writeResumptionToken(string $token, int $complete_list_size, int $cursor)
Definition: Writer.php:190
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
writeResponse(RequestInterface $request, \DOMDocument ... $contents)
Definition: Writer.php:206
ilErrorHandling $error
Definition: class.ilias.php:69
if($err=$client->getError()) $namespace
$message
Definition: xapiexit.php:31
$token
Definition: xapitoken.php:70