ILIAS  release_10 Revision v10.1-43-ga1241a92c2f
BaseManager.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 
36 
40 abstract class BaseManager
41 {
45 
49  public function __construct(
50  ResourceBuilder $resource_builder,
51  CollectionBuilder $collection_builder,
52  RepositoryPreloader $preloader
53  ) {
54  $this->resource_builder = $resource_builder;
55  $this->collection_builder = $collection_builder;
56  $this->preloader = $preloader;
57  }
58 
63  protected function checkZIP(bool|string $mimetype): void
64  {
65  if (!in_array($mimetype, ['application/zip', 'application/x-zip-compressed'])) {
66  throw new \LogicException("Cant create container resource since stream is not a ZIP");
67  }
68  }
69 
74  public function publish(ResourceIdentification $rid): void
75  {
76  $this->resource_builder->publish($this->resource_builder->get($rid));
77  }
78 
83  public function unpublish(ResourceIdentification $rid): void
84  {
85  $this->resource_builder->unpublish($this->resource_builder->get($rid));
86  }
87 
88  protected function newStreamBased(
89  FileStream $stream,
90  ResourceStakeholder $stakeholder,
91  ResourceType $type,
92  string $revision_title = null
94  $info_resolver = new StreamInfoResolver(
95  $stream,
96  1,
97  $stakeholder->getOwnerOfNewResources(),
98  $revision_title ?? $stream->getMetadata()['uri']
99  );
100 
101  $resource = $this->resource_builder->newFromStream(
102  $stream,
103  $info_resolver,
104  true,
105  $type
106  );
107  $resource->addStakeholder($stakeholder);
108  $this->resource_builder->store($resource);
109 
110  return $resource->getIdentification();
111  }
112 
113  public function find(string $identification): ?ResourceIdentification
114  {
115  $resource_identification = new ResourceIdentification($identification);
116 
117  if ($this->resource_builder->has($resource_identification)) {
118  return $resource_identification;
119  }
120 
121  return null;
122  }
123 
124  // Resources
125 
127  {
128  $this->preloader->preload([$i->serialize()]);
129  return $this->resource_builder->get($i);
130  }
131 
132  public function remove(ResourceIdentification $identification, ResourceStakeholder $stakeholder): void
133  {
134  $this->resource_builder->remove($this->resource_builder->get($identification), $stakeholder);
135  if (!$this->resource_builder->has($identification)) {
136  $this->collection_builder->notififyResourceDeletion($identification);
137  }
138  }
139 
140  public function clone(ResourceIdentification $identification): ResourceIdentification
141  {
142  $resource = $this->resource_builder->clone($this->resource_builder->get($identification));
143 
144  return $resource->getIdentification();
145  }
146 
147  // Revision
148 
155  public function appendNewRevision(
156  ResourceIdentification $identification,
157  UploadResult $result,
158  ResourceStakeholder $stakeholder,
159  string $revision_title = null,
160  bool $draft = false
161  ): Revision {
162  if ($result->isOK()) {
163  if (!$this->resource_builder->has($identification)) {
164  throw new \LogicException(
165  "Resource not found, can't append new version in: " . $identification->serialize()
166  );
167  }
168  $resource = $this->resource_builder->get($identification);
169  if ($resource->getType() === ResourceType::CONTAINER) {
170  $this->checkZIP($result->getMimeType());
171  }
172 
173  $info_resolver = new UploadInfoResolver(
174  $result,
175  $resource->getMaxRevision(true) + 1,
176  $stakeholder->getOwnerOfNewResources(),
177  $revision_title ?? $result->getName()
178  );
179 
180  $this->resource_builder->append(
181  $resource,
182  $result,
183  $info_resolver,
184  $draft ? RevisionStatus::DRAFT : RevisionStatus::PUBLISHED
185  );
186  $resource->addStakeholder($stakeholder);
187 
188  $this->resource_builder->store($resource);
189 
190  return $resource->getCurrentRevisionIncludingDraft();
191  }
192  throw new \LogicException("Can't handle UploadResult: " . $result->getStatus()->getMessage());
193  }
194 
201  public function replaceWithUpload(
202  ResourceIdentification $identification,
203  UploadResult $result,
204  ResourceStakeholder $stakeholder,
205  string $revision_title = null
206  ): Revision {
207  if ($result->isOK()) {
208  if (!$this->resource_builder->has($identification)) {
209  throw new \LogicException(
210  "Resource not found, can't append new version in: " . $identification->serialize()
211  );
212  }
213  $resource = $this->resource_builder->get($identification);
214  if ($resource->getType() === ResourceType::CONTAINER) {
215  $this->checkZIP($result->getMimeType());
216  }
217  if ($resource->getCurrentRevisionIncludingDraft()->getStatus() === RevisionStatus::DRAFT) {
218  throw new \LogicException(
219  "Can't replace DRAFT revision, use appendNewRevision instead to update the DRAFT"
220  );
221  }
222  $info_resolver = new UploadInfoResolver(
223  $result,
224  $resource->getMaxRevision(true) + 1,
225  $stakeholder->getOwnerOfNewResources(),
226  $revision_title ?? $result->getName()
227  );
228  $this->resource_builder->replaceWithUpload(
229  $resource,
230  $result,
231  $info_resolver
232  );
233  $resource->addStakeholder($stakeholder);
234 
235  $this->resource_builder->store($resource);
236 
237  return $resource->getCurrentRevisionIncludingDraft();
238  }
239  throw new \LogicException("Can't handle UploadResult: " . $result->getStatus()->getMessage());
240  }
241 
249  ResourceIdentification $identification,
250  FileStream $stream,
251  ResourceStakeholder $stakeholder,
252  string $revision_title = null,
253  bool $draft = false
254  ): Revision {
255  if (!$this->resource_builder->has($identification)) {
256  throw new \LogicException(
257  "Resource not found, can't append new version in: " . $identification->serialize()
258  );
259  }
260 
261  $resource = $this->resource_builder->get($identification);
262  if ($resource->getType() === ResourceType::CONTAINER) {
263  $this->checkZIP(mime_content_type($stream->getMetadata()['uri']));
264  }
265  $info_resolver = new StreamInfoResolver(
266  $stream,
267  $resource->getMaxRevision(true) + 1,
268  $stakeholder->getOwnerOfNewResources(),
269  $revision_title ?? $stream->getMetadata()['uri']
270  );
271 
272  $this->resource_builder->appendFromStream(
273  $resource,
274  $stream,
275  $info_resolver,
276  $draft ? RevisionStatus::DRAFT : RevisionStatus::PUBLISHED,
277  true
278  );
279 
280  $resource->addStakeholder($stakeholder);
281 
282  $this->resource_builder->store($resource);
283 
284  return $resource->getCurrentRevisionIncludingDraft();
285  }
286 
293  public function replaceWithStream(
294  ResourceIdentification $identification,
295  FileStream $stream,
296  ResourceStakeholder $stakeholder,
297  string $revision_title = null
298  ): Revision {
299  if (!$this->resource_builder->has($identification)) {
300  throw new \LogicException(
301  "Resource not found, can't append new version in: " . $identification->serialize()
302  );
303  }
304 
305  $resource = $this->resource_builder->get($identification);
306  if ($resource->getCurrentRevisionIncludingDraft()->getStatus() === RevisionStatus::DRAFT) {
307  throw new \LogicException(
308  "Can't replace DRAFT revision, use appendNewRevisionFromStream instead to update the DRAFT"
309  );
310  }
311  if ($resource->getType() === ResourceType::CONTAINER) {
312  $this->checkZIP(mime_content_type($stream->getMetadata()['uri']));
313  }
314  $info_resolver = new StreamInfoResolver(
315  $stream,
316  $resource->getMaxRevision(true) + 1,
317  $stakeholder->getOwnerOfNewResources(),
318  $revision_title ?? $stream->getMetadata()['uri']
319  );
320 
321  $this->resource_builder->replaceWithStream(
322  $resource,
323  $stream,
324  $info_resolver,
325  true
326  );
327  $resource->addStakeholder($stakeholder);
328 
329  $this->resource_builder->store($resource);
330 
331  return $resource->getCurrentRevisionIncludingDraft();
332  }
333 
334  public function getCurrentRevision(
335  ResourceIdentification $identification
336  ): Revision {
337  return $this->resource_builder->get($identification)->getCurrentRevision();
338  }
339 
341  ResourceIdentification $identification
342  ): Revision {
343  return $this->resource_builder->get($identification)->getCurrentRevisionIncludingDraft();
344  }
345 
346  public function updateRevision(Revision $revision): bool
347  {
348  $this->resource_builder->storeRevision($revision);
349 
350  return true;
351  }
352 
353  public function rollbackRevision(ResourceIdentification $identification, int $revision_number): bool
354  {
355  $resource = $this->resource_builder->get($identification);
356  $this->resource_builder->appendFromRevision($resource, $revision_number);
357  $this->resource_builder->store($resource);
358 
359  return true;
360  }
361 
362  public function removeRevision(ResourceIdentification $identification, int $revision_number): bool
363  {
364  $resource = $this->resource_builder->get($identification);
365  $this->resource_builder->removeRevision($resource, $revision_number);
366  $this->resource_builder->store($resource);
367 
368  return true;
369  }
370 }
publish(ResourceIdentification $rid)
Publish a resource.
Definition: BaseManager.php:74
appendNewRevision(ResourceIdentification $identification, UploadResult $result, ResourceStakeholder $stakeholder, string $revision_title=null, bool $draft=false)
Append a new revision from an UploadResult.
replaceWithStream(ResourceIdentification $identification, FileStream $stream, ResourceStakeholder $stakeholder, string $revision_title=null)
removeRevision(ResourceIdentification $identification, int $revision_number)
getCurrentRevision(ResourceIdentification $identification)
unpublish(ResourceIdentification $rid)
Unpublish a resource.
Definition: BaseManager.php:83
clone(ResourceIdentification $identification)
getResource(ResourceIdentification $i)
replaceWithUpload(ResourceIdentification $identification, UploadResult $result, ResourceStakeholder $stakeholder, string $revision_title=null)
appendNewRevisionFromStream(ResourceIdentification $identification, FileStream $stream, ResourceStakeholder $stakeholder, string $revision_title=null, bool $draft=false)
Append a new revision from a stream.
getCurrentRevisionIncludingDraft(ResourceIdentification $identification)
rollbackRevision(ResourceIdentification $identification, int $revision_number)
newStreamBased(FileStream $stream, ResourceStakeholder $stakeholder, ResourceType $type, string $revision_title=null)
Definition: BaseManager.php:88
The base interface for all filesystem streams.
Definition: FileStream.php:31
__construct(ResourceBuilder $resource_builder, CollectionBuilder $collection_builder, RepositoryPreloader $preloader)
Manager constructor.
Definition: BaseManager.php:49