ILIAS  trunk Revision v11.0_alpha-1811-gd2d5443e411
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
Writer.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 
26 use ILIAS\Data\URI;
29 
30 class 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  '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 }
if($err=$client->getError()) $namespace
writeMetadataFormat()
Currently only oai_dc.
Definition: Writer.php:100
writeErrorResponse(RequestInterface $request, \DOMDocument ... $errors)
Definition: Writer.php:232
writeError(Error $error, string $message)
Definition: Writer.php:34
writeSingleElementXML(string $element_name, string $element_value)
Definition: Writer.php:87
writeSet(string $spec, string $name)
Definition: Writer.php:172
writeRecordHeader(string $identifier, \DateTimeImmutable $datestamp)
Definition: Writer.php:128
$token
Definition: xapitoken.php:70
createRequestElement(\DOMDocument $xml, RequestInterface $request)
Definition: Writer.php:281
writeRecord(string $identifier, \DateTimeImmutable $datestamp, \DOMDocument $metadata)
Also includes the header.
Definition: Writer.php:152
ilErrorHandling $error
Definition: class.ilias.php:69
$message
Definition: xapiexit.php:31
writeResumptionToken(string $token, int $complete_list_size, int $cursor)
Definition: Writer.php:190
writeResponse(RequestInterface $request, \DOMDocument ... $contents)
Definition: Writer.php:206
writeIdentifyElements(string $repository_name, URI $base_url, \DateTimeImmutable $earliest_datestamp, string $first_admin_email, string ... $further_admin_emails)
Definition: Writer.php:46