ILIAS  trunk Revision v11.0_alpha-1866-gfa368f7776e
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
ILIAS\ResourceStorage\Resource\ResourceBuilder Class Reference

Class ResourceBuilder. More...

+ Collaboration diagram for ILIAS\ResourceStorage\Resource\ResourceBuilder:

Public Member Functions

 __construct (private StorageHandlerFactory $storage_handler_factory, Repositories $repositories, private LockHandler $lock_handler, private StreamAccess $stream_access, protected FileNamePolicy $file_name_policy=new NoneFileNamePolicy())
 ResourceBuilder constructor. More...
 
 new (UploadResult $result, InfoResolver $info_resolver, ResourceType $type=ResourceType::SINGLE_FILE)
 
 newFromStream (FileStream $stream, InfoResolver $info_resolver, bool $keep_original=false, ResourceType $type=ResourceType::SINGLE_FILE)
 
 newBlank (ResourceType $type=ResourceType::SINGLE_FILE)
 
 append (StorableResource $resource, UploadResult $result, InfoResolver $info_resolver, RevisionStatus $status)
 
 replaceWithUpload (StorableResource $resource, UploadResult $result, InfoResolver $info_resolver)
 
 appendFromStream (StorableResource $resource, FileStream $stream, InfoResolver $info_resolver, RevisionStatus $status, bool $keep_original=false,)
 
 replaceWithStream (StorableResource $resource, FileStream $stream, InfoResolver $info_resolver, bool $keep_original=false,)
 
 appendFromRevision (StorableResource $resource, int $revision_number)
 
 has (ResourceIdentification $identification)
 check if a resource exists More...
 
 store (StorableResource $resource)
 after you have modified a resource, you can store it here More...
 
 clone (StorableResource $resource)
 Clone anexisting resource with all it's revisions, stakeholders and information More...
 
 storeRevision (Revision $revision, ?StorableResource $resource=null)
 Store one Revision More...
 
 publish (StorableResource $resource)
 
 unpublish (StorableResource $resource)
 
 extractStream (Revision $revision)
 
 remove (StorableResource $resource, ?ResourceStakeholder $stakeholder=null)
 Remove a complete revision. More...
 
 removeRevision (StorableResource $resource, int $revision_number)
 
 createDirectoryInsideContainer (StorableContainerResource $container, string $path_inside_container,)
 
 removePathInsideContainer (StorableContainerResource $container, string $path_inside_container,)
 
 addUploadToContainer (StorableContainerResource $container, UploadResult $result, string $parent_path_inside_container,)
 
 addStreamToContainer (StorableContainerResource $container, FileStream $stream, string $path_inside_container,)
 

Protected Attributes

array $resource_cache = []
 
StorageHandler $primary_storage_handler
 

Private Member Functions

 buildDraftReplacementRevision (StorableResource $resource, Revision $new_revision, InfoResolver $info_resolver)
 
 ensurePathInZIP (\ZipArchive $zip, string $path, bool $is_file)
 
 deleteRevision (StorableResource $resource, Revision $revision)
 
 populateNakedResourceWithRevisionsAndStakeholders (StorableResource $resource)
 
 populateRevisionInfo (Revision $revision, InfoResolver $info_resolver)
 

Private Attributes

InformationRepository $information_repository
 
ResourceRepository $resource_repository
 
RevisionRepository $revision_repository
 
StakeholderRepository $stakeholder_repository
 
bool $auto_migrate = true
 

Detailed Description

Constructor & Destructor Documentation

◆ __construct()

ILIAS\ResourceStorage\Resource\ResourceBuilder::__construct ( private StorageHandlerFactory  $storage_handler_factory,
Repositories  $repositories,
private LockHandler  $lock_handler,
private StreamAccess  $stream_access,
protected FileNamePolicy  $file_name_policy = new NoneFileNamePolicy() 
)

ResourceBuilder constructor.

Parameters
FileNamePolicy | null$file_name_policy

Definition at line 89 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Repositories\getInformationRepository(), ILIAS\ResourceStorage\Repositories\getResourceRepository(), ILIAS\ResourceStorage\Repositories\getRevisionRepository(), and ILIAS\ResourceStorage\Repositories\getStakeholderRepository().

95  {
96  $this->primary_storage_handler = $this->storage_handler_factory->getPrimary();
97  $this->revision_repository = $repositories->getRevisionRepository();
98  $this->resource_repository = $repositories->getResourceRepository();
99  $this->information_repository = $repositories->getInformationRepository();
100  $this->stakeholder_repository = $repositories->getStakeholderRepository();
101  }
+ Here is the call graph for this function:

Member Function Documentation

◆ addStreamToContainer()

ILIAS\ResourceStorage\Resource\ResourceBuilder::addStreamToContainer ( StorableContainerResource  $container,
FileStream  $stream,
string  $path_inside_container 
)

Definition at line 706 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Resource\ResourceBuilder\ensurePathInZIP(), ILIAS\ResourceStorage\Resource\ResourceBuilder\extractStream(), ILIAS\ResourceStorage\Resource\AbstractStorableResource\getCurrentRevisionIncludingDraft(), and ILIAS\ResourceStorage\Resource\ResourceBuilder\storeRevision().

710  : bool {
711  $revision = $container->getCurrentRevisionIncludingDraft();
712  $revision_stream = $this->extractStream($revision);
713 
714  try {
715  $zip = new \ZipArchive();
716  $zip->open($revision_stream->getMetadata()['uri']);
717 
718  $path_inside_container = $this->ensurePathInZIP($zip, $path_inside_container, true);
719 
720  $return = $zip->addFromString(
721  $path_inside_container,
722  (string) $stream
723  );
724  $zip->close();
725 
726  // cleanup revision and flavours
727  $this->storage_handler_factory->getHandlerForRevision($revision)->clearFlavours($revision);
728  $revision->getInformation()->setSize(filesize($revision_stream->getMetadata()['uri']));
729  $this->storeRevision($revision);
730 
731  return $return;
732  } catch (\Throwable) {
733  return false;
734  }
735 
736  return true;
737  }
storeRevision(Revision $revision, ?StorableResource $resource=null)
Store one Revision
$container
Definition: wac.php:36
ensurePathInZIP(\ZipArchive $zip, string $path, bool $is_file)
+ Here is the call graph for this function:

◆ addUploadToContainer()

ILIAS\ResourceStorage\Resource\ResourceBuilder::addUploadToContainer ( StorableContainerResource  $container,
UploadResult  $result,
string  $parent_path_inside_container 
)

Definition at line 670 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Resource\ResourceBuilder\ensurePathInZIP(), ILIAS\ResourceStorage\Resource\ResourceBuilder\extractStream(), ILIAS\ResourceStorage\Resource\AbstractStorableResource\getCurrentRevisionIncludingDraft(), ILIAS\FileUpload\DTO\UploadResult\getName(), ILIAS\FileUpload\DTO\UploadResult\getPath(), and ILIAS\ResourceStorage\Resource\ResourceBuilder\storeRevision().

674  : bool {
675  $revision = $container->getCurrentRevisionIncludingDraft();
676  $stream = $this->extractStream($revision);
677 
678  // create directory inside ZipArchive
679  try {
680  $zip = new \ZipArchive();
681  $zip->open($stream->getMetadata()['uri']);
682 
683  $parent_path_inside_container = $this->ensurePathInZIP($zip, $parent_path_inside_container, false);
684 
685  $path_inside_zip = rtrim($parent_path_inside_container, '/') . '/' . $result->getName();
686 
687  $return = $zip->addFile(
688  $result->getPath(),
689  $path_inside_zip
690  );
691  $zip->close();
692 
693  // cleanup revision and flavours
694  $this->storage_handler_factory->getHandlerForRevision($revision)->clearFlavours($revision);
695  $revision->getInformation()->setSize(filesize($stream->getMetadata()['uri']));
696  $this->storeRevision($revision);
697 
698  return $return;
699  } catch (\Throwable) {
700  return false;
701  }
702 
703  return true;
704  }
storeRevision(Revision $revision, ?StorableResource $resource=null)
Store one Revision
$container
Definition: wac.php:36
ensurePathInZIP(\ZipArchive $zip, string $path, bool $is_file)
+ Here is the call graph for this function:

◆ append()

ILIAS\ResourceStorage\Resource\ResourceBuilder::append ( StorableResource  $resource,
UploadResult  $result,
InfoResolver  $info_resolver,
RevisionStatus  $status 
)

Definition at line 158 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Resource\StorableResource\addRevision(), ILIAS\ResourceStorage\Resource\ResourceBuilder\buildDraftReplacementRevision(), ILIAS\ResourceStorage\Revision\DRAFT, ILIAS\ResourceStorage\Resource\StorableResource\getCurrentRevisionIncludingDraft(), ILIAS\ResourceStorage\Resource\StorableResource\getStorageID(), ILIAS\ResourceStorage\Resource\ResourceBuilder\populateRevisionInfo(), ILIAS\ResourceStorage\Resource\StorableResource\replaceRevision(), and ILIAS\ResourceStorage\Resource\StorableResource\setStorageID().

Referenced by ILIAS\ResourceStorage\Resource\ResourceBuilder\new().

163  : StorableResource {
164  if (
165  $status !== RevisionStatus::DRAFT
166  && $resource->getCurrentRevisionIncludingDraft()->getStatus() === RevisionStatus::DRAFT) {
167  throw new \LogicException(
168  'You can not replace a draft revision with a published, you must publish the current revision first'
169  );
170  }
171 
172  $new_revision = $this->revision_repository->blankFromUpload($info_resolver, $resource, $result, $status);
173 
174  if ($resource->getCurrentRevisionIncludingDraft()->getStatus() === RevisionStatus::DRAFT) {
175  $clone_revision = $this->buildDraftReplacementRevision($resource, $new_revision, $info_resolver);
176  $resource->replaceRevision($clone_revision);
177  } else {
178  $new_revision = $this->populateRevisionInfo($new_revision, $info_resolver);
179  $resource->addRevision($new_revision);
180  }
181 
182  $resource->setStorageID(
183  $resource->getStorageID() === '' ? $this->primary_storage_handler->getID() : $resource->getStorageID()
184  );
185 
186  return $resource;
187  }
populateRevisionInfo(Revision $revision, InfoResolver $info_resolver)
buildDraftReplacementRevision(StorableResource $resource, Revision $new_revision, InfoResolver $info_resolver)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ appendFromRevision()

ILIAS\ResourceStorage\Resource\ResourceBuilder::appendFromRevision ( StorableResource  $resource,
int  $revision_number 
)

Definition at line 288 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Resource\StorableResource\addRevision(), ILIAS\ResourceStorage\Revision\DRAFT, ILIAS\ResourceStorage\Resource\StorableResource\getCurrentRevisionIncludingDraft(), ILIAS\ResourceStorage\Resource\StorableResource\getMaxRevision(), ILIAS\ResourceStorage\Resource\StorableResource\getSpecificRevision(), ILIAS\ResourceStorage\Resource\StorableResource\getStorageID(), ILIAS\ResourceStorage\Resource\ResourceBuilder\populateRevisionInfo(), and ILIAS\ResourceStorage\Resource\StorableResource\setStorageID().

291  : StorableResource {
292  if ($resource->getCurrentRevisionIncludingDraft()->getStatus() === RevisionStatus::DRAFT) {
293  throw new \LogicException('You can not replace a draft revision, you must publish it first');
294  }
295  $existing_revision = $resource->getSpecificRevision($revision_number);
296  if ($existing_revision instanceof FileRevision) {
297  $info_resolver = new ClonedRevisionInfoResolver(
298  $resource->getMaxRevision(false) + 1,
299  $existing_revision
300  );
301 
302  $cloned_revision = $this->revision_repository->blankFromClone(
303  $info_resolver,
304  $resource,
305  $existing_revision
306  );
307 
308  $this->populateRevisionInfo($cloned_revision, $info_resolver);
309 
310  $resource->addRevision($cloned_revision);
311  $resource->setStorageID(
312  $resource->getStorageID() === '' ? $this->primary_storage_handler->getID() : $resource->getStorageID()
313  );
314  return $resource;
315  }
316  return $resource;
317  }
populateRevisionInfo(Revision $revision, InfoResolver $info_resolver)
+ Here is the call graph for this function:

◆ appendFromStream()

ILIAS\ResourceStorage\Resource\ResourceBuilder::appendFromStream ( StorableResource  $resource,
FileStream  $stream,
InfoResolver  $info_resolver,
RevisionStatus  $status,
bool  $keep_original = false 
)

Definition at line 220 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Resource\StorableResource\addRevision(), ILIAS\ResourceStorage\Resource\ResourceBuilder\buildDraftReplacementRevision(), ILIAS\ResourceStorage\Revision\DRAFT, ILIAS\ResourceStorage\Resource\StorableResource\getCurrentRevisionIncludingDraft(), ILIAS\ResourceStorage\Resource\StorableResource\getStorageID(), ILIAS\ResourceStorage\Resource\ResourceBuilder\populateRevisionInfo(), ILIAS\ResourceStorage\Resource\StorableResource\replaceRevision(), and ILIAS\ResourceStorage\Resource\StorableResource\setStorageID().

Referenced by ILIAS\ResourceStorage\Resource\ResourceBuilder\newFromStream().

226  : StorableResource {
227  if (
228  $status !== RevisionStatus::DRAFT
229  && $resource->getCurrentRevisionIncludingDraft()->getStatus() === RevisionStatus::DRAFT) {
230  throw new \LogicException(
231  'You can not replace a draft revision with a published, you must publish the current revision first'
232  );
233  }
234 
235  $new_revision = $this->revision_repository->blankFromStream(
236  $info_resolver,
237  $resource,
238  $stream,
239  $status,
240  $keep_original
241  );
242 
243  if ($resource->getCurrentRevisionIncludingDraft()->getStatus() === RevisionStatus::DRAFT) {
244  $clone_revision = $this->buildDraftReplacementRevision($resource, $new_revision, $info_resolver);
245  $resource->replaceRevision($clone_revision);
246  } else {
247  $new_revision = $this->populateRevisionInfo($new_revision, $info_resolver);
248  $resource->addRevision($new_revision);
249  }
250 
251  $resource->setStorageID(
252  $resource->getStorageID() === '' ? $this->primary_storage_handler->getID() : $resource->getStorageID()
253  );
254 
255  return $resource;
256  }
populateRevisionInfo(Revision $revision, InfoResolver $info_resolver)
buildDraftReplacementRevision(StorableResource $resource, Revision $new_revision, InfoResolver $info_resolver)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ buildDraftReplacementRevision()

ILIAS\ResourceStorage\Resource\ResourceBuilder::buildDraftReplacementRevision ( StorableResource  $resource,
Revision  $new_revision,
InfoResolver  $info_resolver 
)
private

Definition at line 319 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Revision\DRAFT, ILIAS\ResourceStorage\Resource\ResourceBuilder\extractStream(), ILIAS\ResourceStorage\Resource\StorableResource\getCurrentRevisionIncludingDraft(), ILIAS\ResourceStorage\Resource\StorableResource\getIdentification(), ILIAS\ResourceStorage\Resource\ResourceBuilder\populateRevisionInfo(), ILIAS\ResourceStorage\Revision\BaseRevision\setStatus(), and ILIAS\ResourceStorage\Revision\StreamReplacementRevision\setVersionNumber().

Referenced by ILIAS\ResourceStorage\Resource\ResourceBuilder\append(), and ILIAS\ResourceStorage\Resource\ResourceBuilder\appendFromStream().

323  : Revision {
324  $current_revision = $resource->getCurrentRevisionIncludingDraft();
325  $stream_replacement = new StreamReplacementRevision(
326  $resource->getIdentification(),
327  $this->extractStream($new_revision)
328  );
329  $stream_replacement = $this->populateRevisionInfo($stream_replacement, $info_resolver);
330  $stream_replacement->setVersionNumber($current_revision->getVersionNumber());
331  $stream_replacement->setStatus(RevisionStatus::DRAFT);
332 
333  return $stream_replacement;
334  }
populateRevisionInfo(Revision $revision, InfoResolver $info_resolver)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ clone()

ILIAS\ResourceStorage\Resource\ResourceBuilder::clone ( StorableResource  $resource)

Clone anexisting resource with all it's revisions, stakeholders and information

Definition at line 380 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Resource\StorableResource\getAllRevisionsIncludingDraft(), ILIAS\ResourceStorage\Resource\StorableResource\getStakeholders(), ILIAS\ResourceStorage\Resource\StorableResource\getType(), ILIAS\ResourceStorage\Resource\ResourceBuilder\newBlank(), ILIAS\ResourceStorage\Resource\ResourceBuilder\populateRevisionInfo(), and ILIAS\ResourceStorage\Resource\ResourceBuilder\store().

380  : StorableResource
381  {
382  $new_resource = $this->newBlank($resource->getType());
383  foreach ($resource->getStakeholders() as $stakeholder) {
384  $stakeholder = clone $stakeholder;
385  $new_resource->addStakeholder($stakeholder);
386  }
387 
388  foreach ($resource->getAllRevisionsIncludingDraft() as $existing_revision) {
389  if (!$existing_revision instanceof FileRevision) {
390  continue;
391  }
392  $info_resolver = new ClonedRevisionInfoResolver(
393  $existing_revision->getVersionNumber(),
394  $existing_revision
395  );
396 
397  $existing_revision = $this->stream_access->populateRevision($existing_revision);
398 
399  $cloned_revision = new FileStreamRevision(
400  $new_resource->getIdentification(),
401  $existing_revision->maybeStreamResolver()->getStream(),
402  true
403  );
404 
405  $this->populateRevisionInfo($cloned_revision, $info_resolver);
406  $cloned_revision->setVersionNumber($existing_revision->getVersionNumber());
407 
408  $new_resource->addRevision($cloned_revision);
409  }
410  $this->store($new_resource);
411  return $new_resource;
412  }
populateRevisionInfo(Revision $revision, InfoResolver $info_resolver)
clone(StorableResource $resource)
Clone anexisting resource with all it's revisions, stakeholders and information
store(StorableResource $resource)
after you have modified a resource, you can store it here
newBlank(ResourceType $type=ResourceType::SINGLE_FILE)
+ Here is the call graph for this function:

◆ createDirectoryInsideContainer()

ILIAS\ResourceStorage\Resource\ResourceBuilder::createDirectoryInsideContainer ( StorableContainerResource  $container,
string  $path_inside_container 
)

Definition at line 567 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Resource\ResourceBuilder\ensurePathInZIP(), ILIAS\ResourceStorage\Resource\ResourceBuilder\extractStream(), ILIAS\ResourceStorage\Resource\AbstractStorableResource\getCurrentRevisionIncludingDraft(), and ILIAS\ResourceStorage\Resource\ResourceBuilder\storeRevision().

570  : bool {
571  $revision = $container->getCurrentRevisionIncludingDraft();
572  $stream = $this->extractStream($revision);
573 
574  // create directory inside ZipArchive
575  try {
576  $zip = new \ZipArchive();
577  $zip->open($stream->getMetadata()['uri']);
578  $path_inside_container = $this->ensurePathInZIP($zip, $path_inside_container, false);
579  $zip->close();
580 
581  // cleanup revision and flavours
582  $this->storage_handler_factory->getHandlerForRevision($revision)->clearFlavours($revision);
583  $revision->getInformation()->setSize(filesize($stream->getMetadata()['uri']));
584  $this->storeRevision($revision);
585 
586  return true;
587  } catch (\Throwable) {
588  return false;
589  }
590  }
storeRevision(Revision $revision, ?StorableResource $resource=null)
Store one Revision
$container
Definition: wac.php:36
ensurePathInZIP(\ZipArchive $zip, string $path, bool $is_file)
+ Here is the call graph for this function:

◆ deleteRevision()

ILIAS\ResourceStorage\Resource\ResourceBuilder::deleteRevision ( StorableResource  $resource,
Revision  $revision 
)
private

Definition at line 739 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Revision\Revision\getInformation(), and ILIAS\ResourceStorage\Resource\StorableResource\removeRevision().

Referenced by ILIAS\ResourceStorage\Resource\ResourceBuilder\remove(), ILIAS\ResourceStorage\Resource\ResourceBuilder\removeRevision(), ILIAS\ResourceStorage\Resource\ResourceBuilder\replaceWithStream(), and ILIAS\ResourceStorage\Resource\ResourceBuilder\replaceWithUpload().

739  : void
740  {
741  try {
742  $this->storage_handler_factory->getHandlerForResource($resource)->deleteRevision($revision);
743  } catch (\Throwable) {
744  }
745 
746  $this->information_repository->delete($revision->getInformation(), $revision);
747  $this->revision_repository->delete($revision);
748  $resource->removeRevision($revision);
749  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ ensurePathInZIP()

ILIAS\ResourceStorage\Resource\ResourceBuilder::ensurePathInZIP ( \ZipArchive  $zip,
string  $path,
bool  $is_file 
)
private

Definition at line 592 of file ResourceBuilder.php.

References $filename, $parts, and $path.

Referenced by ILIAS\ResourceStorage\Resource\ResourceBuilder\addStreamToContainer(), ILIAS\ResourceStorage\Resource\ResourceBuilder\addUploadToContainer(), and ILIAS\ResourceStorage\Resource\ResourceBuilder\createDirectoryInsideContainer().

592  : string
593  {
594  if ($path === '' || $path === '/') {
595  return $path;
596  }
597 
598  $filename = '';
599  if ($is_file) {
600  $filename = basename($path);
601  $path = dirname($path);
602  }
603 
604  // try to determine if a path inside the zip exists with or without a slash at the beginning
605  // determine root directory of the path using regex
606  $parts = explode('/', $path);
607  $root = array_shift($parts);
608  $root = $root === '' ? array_shift($parts) : $root;
609 
610  // check if the root directory exists without a slash at the beginning
611  if ($zip->locateName($root . '/') !== false) {
612  $root = $root;
613  } elseif ($zip->locateName('/' . $root . '/') !== false) {
614  // check if the root directory exists with a slash at the beginning
615  $root = '/' . $root;
616  } else {
617  // if the root directory does not exist, create it
618  $zip->addEmptyDir($root);
619  }
620 
621  $path_inside_container = $root;
622  foreach ($parts as $part) {
623  $path_inside_container .= '/' . $part;
624  if ($zip->locateName($path_inside_container . '/') === false) {
625  $zip->addEmptyDir($path_inside_container . '/');
626  }
627  }
628 
629  return rtrim((string) $path_inside_container, '/') . '/' . $filename;
630  }
if($clientAssertionType !='urn:ietf:params:oauth:client-assertion-type:jwt-bearer'|| $grantType !='client_credentials') $parts
Definition: ltitoken.php:61
$path
Definition: ltiservices.php:29
$filename
Definition: buildRTE.php:78
+ Here is the caller graph for this function:

◆ extractStream()

ILIAS\ResourceStorage\Resource\ResourceBuilder::extractStream ( Revision  $revision)

Definition at line 503 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Revision\Revision\getIdentification(), ILIAS\ResourceStorage\Revision\Revision\getStorageID(), and ILIAS\Filesystem\Stream\Streams\ofReattachableResource().

Referenced by ILIAS\ResourceStorage\Resource\ResourceBuilder\addStreamToContainer(), ILIAS\ResourceStorage\Resource\ResourceBuilder\addUploadToContainer(), ILIAS\ResourceStorage\Resource\ResourceBuilder\buildDraftReplacementRevision(), ILIAS\ResourceStorage\Resource\ResourceBuilder\createDirectoryInsideContainer(), and ILIAS\ResourceStorage\Resource\ResourceBuilder\removePathInsideContainer().

503  : FileStream
504  {
505  switch (true) {
506  case $revision instanceof FileStreamRevision:
507  return Streams::ofReattachableResource($revision->getStream()->detach());
508  case $revision instanceof UploadedFileRevision:
509  return Streams::ofReattachableResource(fopen($revision->getUpload()->getPath(), 'rb'));
510  case $revision instanceof CloneRevision:
511  return $revision->getRevisionToClone()->getStream();
512  case $revision instanceof FileRevision:
513  if ($revision->getStorageID() !== '') {
514  return $this->storage_handler_factory->getHandlerForRevision(
515  $revision
516  )->getStream($revision);
517  }
518 
519  return $this->storage_handler_factory->getHandlerForResource(
520  $this->get($revision->getIdentification())
521  )->getStream($revision);
522  default:
523  throw new \LogicException('This revision type is not supported');
524  }
525  }
static ofReattachableResource($resource)
Definition: Streams.php:74
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ has()

ILIAS\ResourceStorage\Resource\ResourceBuilder::has ( ResourceIdentification  $identification)

check if a resource exists

Definition at line 339 of file ResourceBuilder.php.

339  : bool
340  {
341  return $this->resource_repository->has($identification);
342  }

◆ new()

ILIAS\ResourceStorage\Resource\ResourceBuilder::new ( UploadResult  $result,
InfoResolver  $info_resolver,
ResourceType  $type = ResourceType::SINGLE_FILE 
)

Definition at line 110 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Resource\ResourceBuilder\append().

Referenced by ILIAS\ResourceStorage\Policy\FileNamePolicyTest\testDeniedFileEnding(), ILIAS\ResourceStorage\Resource\ResourceBuilderTest\testNewUpload(), and ILIAS\ResourceStorage\Policy\FileNamePolicyTest\testValidFileEnding().

114  : StorableResource {
115  $resource = $this->resource_repository->blank(
116  $this->primary_storage_handler->getIdentificationGenerator()->getUniqueResourceIdentification(),
117  $type
118  );
119 
120  return $this->append($resource, $result, $info_resolver, RevisionStatus::PUBLISHED);
121  }
append(StorableResource $resource, UploadResult $result, InfoResolver $info_resolver, RevisionStatus $status)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ newBlank()

ILIAS\ResourceStorage\Resource\ResourceBuilder::newBlank ( ResourceType  $type = ResourceType::SINGLE_FILE)

Definition at line 143 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Resource\StorableResource\setStorageID().

Referenced by ILIAS\ResourceStorage\Resource\ResourceBuilder\clone().

143  : StorableResource
144  {
145  $resource = $this->resource_repository->blank(
146  $this->primary_storage_handler->getIdentificationGenerator()->getUniqueResourceIdentification(),
147  $type
148  );
149  $resource->setStorageID($this->primary_storage_handler->getID());
150 
151  return $resource;
152  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ newFromStream()

ILIAS\ResourceStorage\Resource\ResourceBuilder::newFromStream ( FileStream  $stream,
InfoResolver  $info_resolver,
bool  $keep_original = false,
ResourceType  $type = ResourceType::SINGLE_FILE 
)

Definition at line 123 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Resource\ResourceBuilder\appendFromStream().

128  : StorableResource {
129  $resource = $this->resource_repository->blank(
130  $this->primary_storage_handler->getIdentificationGenerator()->getUniqueResourceIdentification(),
131  $type
132  );
133 
134  return $this->appendFromStream(
135  $resource,
136  $stream,
137  $info_resolver,
138  RevisionStatus::PUBLISHED,
139  $keep_original
140  );
141  }
appendFromStream(StorableResource $resource, FileStream $stream, InfoResolver $info_resolver, RevisionStatus $status, bool $keep_original=false,)
+ Here is the call graph for this function:

◆ populateNakedResourceWithRevisionsAndStakeholders()

ILIAS\ResourceStorage\Resource\ResourceBuilder::populateNakedResourceWithRevisionsAndStakeholders ( StorableResource  $resource)
private

Definition at line 751 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Resource\StorableResource\addStakeholder(), ILIAS\ResourceStorage\Resource\StorableResource\getIdentification(), ILIAS\ResourceStorage\Resource\StorableResource\getStorageID(), and ILIAS\ResourceStorage\Resource\StorableResource\setRevisions().

Referenced by ILIAS\ResourceStorage\Resource\ResourceBuilder\storeRevision().

751  : StorableResource
752  {
753  $revisions = $this->revision_repository->get($resource);
754  $resource->setRevisions($revisions);
755 
756  foreach ($revisions->getAll(true) as $i => $revision) {
757  $information = $this->information_repository->get($revision);
758  $revision->setInformation($information);
759  $revision->setStorageID($resource->getStorageID());
760  // $revisions->replaceSingleRevision($this->stream_access->populateRevision($revision)); // currently we do not need populating the stream every time, we will do that in consumers only
761  }
762 
763  foreach ($this->stakeholder_repository->getStakeholders($resource->getIdentification()) as $s) {
764  $resource->addStakeholder($s);
765  }
766 
767  return $resource;
768  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ populateRevisionInfo()

ILIAS\ResourceStorage\Resource\ResourceBuilder::populateRevisionInfo ( Revision  $revision,
InfoResolver  $info_resolver 
)
private

Definition at line 770 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Resource\InfoResolver\InfoResolver\getCreationDate(), ILIAS\ResourceStorage\Resource\InfoResolver\InfoResolver\getFileName(), ILIAS\ResourceStorage\Revision\Revision\getInformation(), ILIAS\ResourceStorage\Resource\InfoResolver\InfoResolver\getMimeType(), ILIAS\ResourceStorage\Resource\InfoResolver\InfoResolver\getOwnerId(), ILIAS\ResourceStorage\Resource\InfoResolver\InfoResolver\getRevisionTitle(), ILIAS\ResourceStorage\Resource\InfoResolver\InfoResolver\getSize(), ILIAS\ResourceStorage\Resource\InfoResolver\InfoResolver\getSuffix(), ILIAS\ResourceStorage\Revision\Revision\setInformation(), and ILIAS\ResourceStorage\Revision\Revision\setTitle().

Referenced by ILIAS\ResourceStorage\Resource\ResourceBuilder\append(), ILIAS\ResourceStorage\Resource\ResourceBuilder\appendFromRevision(), ILIAS\ResourceStorage\Resource\ResourceBuilder\appendFromStream(), ILIAS\ResourceStorage\Resource\ResourceBuilder\buildDraftReplacementRevision(), ILIAS\ResourceStorage\Resource\ResourceBuilder\clone(), ILIAS\ResourceStorage\Resource\ResourceBuilder\replaceWithStream(), and ILIAS\ResourceStorage\Resource\ResourceBuilder\replaceWithUpload().

770  : Revision
771  {
772  $info = $revision->getInformation();
773 
774  $info->setTitle($this->secure($info_resolver->getFileName()));
775  $info->setMimeType($info_resolver->getMimeType());
776  $info->setSuffix($this->secure($info_resolver->getSuffix()));
777  $info->setSize($info_resolver->getSize());
778  $info->setCreationDate($info_resolver->getCreationDate());
779 
780  $revision->setInformation($info);
781  $revision->setTitle($this->secure($info_resolver->getRevisionTitle()));
782  $revision->setOwnerId($info_resolver->getOwnerId());
783 
784  return $revision;
785  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ publish()

ILIAS\ResourceStorage\Resource\ResourceBuilder::publish ( StorableResource  $resource)

Definition at line 481 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Resource\StorableResource\getCurrentRevisionIncludingDraft(), and ILIAS\ResourceStorage\Resource\ResourceBuilder\store().

481  : bool
482  {
483  $revision = $resource->getCurrentRevisionIncludingDraft();
484  if ($revision->getStatus() === RevisionStatus::PUBLISHED) {
485  return false;
486  }
487  $revision->setStatus(RevisionStatus::PUBLISHED);
488  $this->store($resource);
489  return true;
490  }
store(StorableResource $resource)
after you have modified a resource, you can store it here
+ Here is the call graph for this function:

◆ remove()

ILIAS\ResourceStorage\Resource\ResourceBuilder::remove ( StorableResource  $resource,
?ResourceStakeholder  $stakeholder = null 
)

Remove a complete revision.

if there are other Stakeholder, only your stakeholder gets removed

Parameters
ResourceStakeholder | null$stakeholder
Returns
bool whether ResourceStakeholders handled this successful

Definition at line 532 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Resource\ResourceBuilder\deleteRevision(), ILIAS\ResourceStorage\Resource\StorableResource\getAllRevisionsIncludingDraft(), ILIAS\ResourceStorage\Resource\StorableResource\getIdentification(), ILIAS\ResourceStorage\Resource\StorableResource\getStakeholders(), and ILIAS\ResourceStorage\Resource\StorableResource\removeStakeholder().

532  : bool
533  {
534  $sucessful = true;
535  if ($stakeholder instanceof ResourceStakeholder) {
536  $this->stakeholder_repository->deregister($resource->getIdentification(), $stakeholder);
537  $sucessful = $stakeholder->resourceHasBeenDeleted($resource->getIdentification());
538  $resource->removeStakeholder($stakeholder);
539  if ($resource->getStakeholders() !== []) {
540  return $sucessful;
541  }
542  }
543  foreach ($resource->getStakeholders() as $s) {
544  $sucessful = $s->resourceHasBeenDeleted($resource->getIdentification()) && $sucessful;
545  }
546 
547  foreach ($resource->getAllRevisionsIncludingDraft() as $revision) {
548  $this->deleteRevision($resource, $revision);
549  }
550 
551  $this->storage_handler_factory->getHandlerForResource($resource)->deleteResource($resource);
552  $this->resource_repository->delete($resource);
553 
554  return $sucessful;
555  }
deleteRevision(StorableResource $resource, Revision $revision)
+ Here is the call graph for this function:

◆ removePathInsideContainer()

ILIAS\ResourceStorage\Resource\ResourceBuilder::removePathInsideContainer ( StorableContainerResource  $container,
string  $path_inside_container 
)

Definition at line 632 of file ResourceBuilder.php.

References $path, ILIAS\ResourceStorage\Resource\ResourceBuilder\extractStream(), ILIAS\ResourceStorage\Resource\AbstractStorableResource\getCurrentRevisionIncludingDraft(), and ILIAS\ResourceStorage\Resource\ResourceBuilder\storeRevision().

635  : bool {
636  $revision = $container->getCurrentRevisionIncludingDraft();
637  $stream = $this->extractStream($revision);
638 
639  // create directory inside ZipArchive
640  try {
641  $zip = new \ZipArchive();
642  $zip->open($stream->getMetadata()['uri']);
643 
644  $return = $zip->deleteName($path_inside_container);
645  // remove all files inside the directory
646  for ($i = 0; $i < $zip->numFiles; $i++) {
647  $path = $zip->getNameIndex($i);
648  if ($path === false) {
649  continue;
650  }
651  if (str_starts_with($path, $path_inside_container)) {
652  $zip->deleteIndex($i);
653  }
654  }
655 
656  $zip->close();
657 
658  // cleanup revision and flavours
659  $this->storage_handler_factory->getHandlerForRevision($revision)->clearFlavours($revision);
660  $revision->getInformation()->setSize(filesize($stream->getMetadata()['uri']));
661  $this->storeRevision($revision);
662 
663  return $return;
664  } catch (\Throwable) {
665  $this->storage_handler_factory->getHandlerForRevision($revision)->clearFlavours($revision);
666  return false;
667  }
668  }
storeRevision(Revision $revision, ?StorableResource $resource=null)
Store one Revision
$path
Definition: ltiservices.php:29
$container
Definition: wac.php:36
+ Here is the call graph for this function:

◆ removeRevision()

ILIAS\ResourceStorage\Resource\ResourceBuilder::removeRevision ( StorableResource  $resource,
int  $revision_number 
)

Definition at line 557 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Resource\ResourceBuilder\deleteRevision(), ILIAS\ResourceStorage\Resource\StorableResource\getSpecificRevision(), null, and ILIAS\ResourceStorage\Resource\ResourceBuilder\store().

557  : void
558  {
559  $reveision_to_delete = $resource->getSpecificRevision($revision_number);
560  if ($reveision_to_delete !== null) {
561  $this->deleteRevision($resource, $reveision_to_delete);
562  }
563  $this->store($resource);
564  }
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
deleteRevision(StorableResource $resource, Revision $revision)
store(StorableResource $resource)
after you have modified a resource, you can store it here
+ Here is the call graph for this function:

◆ replaceWithStream()

ILIAS\ResourceStorage\Resource\ResourceBuilder::replaceWithStream ( StorableResource  $resource,
FileStream  $stream,
InfoResolver  $info_resolver,
bool  $keep_original = false 
)

Definition at line 258 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Resource\StorableResource\addRevision(), ILIAS\ResourceStorage\Resource\ResourceBuilder\deleteRevision(), ILIAS\ResourceStorage\Revision\DRAFT, ILIAS\ResourceStorage\Resource\StorableResource\getAllRevisionsIncludingDraft(), ILIAS\ResourceStorage\Resource\StorableResource\getCurrentRevisionIncludingDraft(), ILIAS\ResourceStorage\Resource\StorableResource\getStorageID(), ILIAS\ResourceStorage\Resource\ResourceBuilder\populateRevisionInfo(), and ILIAS\ResourceStorage\Resource\StorableResource\setStorageID().

263  : StorableResource {
264  if ($resource->getCurrentRevisionIncludingDraft()->getStatus() === RevisionStatus::DRAFT) {
265  throw new \LogicException('You can not replace a draft revision, you must publish it first');
266  }
267  $revision = $this->revision_repository->blankFromStream(
268  $info_resolver,
269  $resource,
270  $stream,
271  RevisionStatus::PUBLISHED,
272  $keep_original
273  );
274  $revision = $this->populateRevisionInfo($revision, $info_resolver);
275 
276  foreach ($resource->getAllRevisionsIncludingDraft() as $existing_revision) {
277  $this->deleteRevision($resource, $existing_revision);
278  }
279 
280  $resource->addRevision($revision);
281  $resource->setStorageID(
282  $resource->getStorageID() === '' ? $this->primary_storage_handler->getID() : $resource->getStorageID()
283  );
284 
285  return $resource;
286  }
populateRevisionInfo(Revision $revision, InfoResolver $info_resolver)
deleteRevision(StorableResource $resource, Revision $revision)
+ Here is the call graph for this function:

◆ replaceWithUpload()

ILIAS\ResourceStorage\Resource\ResourceBuilder::replaceWithUpload ( StorableResource  $resource,
UploadResult  $result,
InfoResolver  $info_resolver 
)

Definition at line 192 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Resource\StorableResource\addRevision(), ILIAS\ResourceStorage\Resource\ResourceBuilder\deleteRevision(), ILIAS\ResourceStorage\Revision\DRAFT, ILIAS\ResourceStorage\Resource\StorableResource\getAllRevisionsIncludingDraft(), ILIAS\ResourceStorage\Resource\StorableResource\getCurrentRevisionIncludingDraft(), ILIAS\ResourceStorage\Resource\StorableResource\getStorageID(), ILIAS\ResourceStorage\Resource\ResourceBuilder\populateRevisionInfo(), and ILIAS\ResourceStorage\Resource\StorableResource\setStorageID().

196  : StorableResource {
197  if ($resource->getCurrentRevisionIncludingDraft()->getStatus() === RevisionStatus::DRAFT) {
198  throw new \LogicException('You can not replace a draft revision, you must publish it first');
199  }
200  $revision = $this->revision_repository->blankFromUpload(
201  $info_resolver,
202  $resource,
203  $result,
204  RevisionStatus::PUBLISHED
205  );
206  $revision = $this->populateRevisionInfo($revision, $info_resolver);
207 
208  foreach ($resource->getAllRevisionsIncludingDraft() as $existing_revision) {
209  $this->deleteRevision($resource, $existing_revision);
210  }
211 
212  $resource->addRevision($revision);
213  $resource->setStorageID(
214  $resource->getStorageID() === '' ? $this->primary_storage_handler->getID() : $resource->getStorageID()
215  );
216 
217  return $resource;
218  }
populateRevisionInfo(Revision $revision, InfoResolver $info_resolver)
deleteRevision(StorableResource $resource, Revision $revision)
+ Here is the call graph for this function:

◆ store()

ILIAS\ResourceStorage\Resource\ResourceBuilder::store ( StorableResource  $resource)

after you have modified a resource, you can store it here

Exceptions
FileNamePolicyException

Definition at line 348 of file ResourceBuilder.php.

References $r, ILIAS\ResourceStorage\Resource\StorableResource\getAllRevisionsIncludingDraft(), ILIAS\ResourceStorage\Resource\StorableResource\getIdentification(), ILIAS\ResourceStorage\Resource\StorableResource\getStakeholders(), and ILIAS\ResourceStorage\Resource\ResourceBuilder\storeRevision().

Referenced by ILIAS\ResourceStorage\Resource\ResourceBuilder\clone(), ILIAS\ResourceStorage\Resource\ResourceBuilder\publish(), ILIAS\ResourceStorage\Resource\ResourceBuilder\removeRevision(), ILIAS\ResourceStorage\Policy\FileNamePolicyTest\testDeniedFileEnding(), ILIAS\ResourceStorage\Policy\FileNamePolicyTest\testValidFileEnding(), and ILIAS\ResourceStorage\Resource\ResourceBuilder\unpublish().

348  : void
349  {
350  foreach ($resource->getAllRevisionsIncludingDraft() as $revision) {
351  $this->file_name_policy->check($revision->getInformation()->getSuffix());
352  }
353 
354  $r = $this->lock_handler->lockTables(
355  array_merge(
356  $this->resource_repository->getNamesForLocking(),
357  $this->revision_repository->getNamesForLocking(),
358  $this->information_repository->getNamesForLocking(),
359  $this->stakeholder_repository->getNamesForLocking()
360  ),
361  function () use ($resource): void {
362  $this->resource_repository->store($resource);
363 
364  foreach ($resource->getAllRevisionsIncludingDraft() as $revision) {
365  $this->storeRevision($revision, $resource);
366  }
367 
368  foreach ($resource->getStakeholders() as $stakeholder) {
369  $this->stakeholder_repository->register($resource->getIdentification(), $stakeholder);
370  }
371  }
372  );
373 
374  $r->runAndUnlock();
375  }
storeRevision(Revision $revision, ?StorableResource $resource=null)
Store one Revision
$r
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ storeRevision()

ILIAS\ResourceStorage\Resource\ResourceBuilder::storeRevision ( Revision  $revision,
?StorableResource  $resource = null 
)

Store one Revision

Exceptions
FileNamePolicyException

Definition at line 418 of file ResourceBuilder.php.

References $DIC, InitResourceStorage\D_MIGRATOR, ILIAS\ResourceStorage\Revision\Revision\getIdentification(), ILIAS\ResourceStorage\Revision\Revision\getInformation(), ILIAS\ResourceStorage\Revision\Revision\getOwnerId(), ILIAS\ResourceStorage\Revision\Revision\getStatus(), ILIAS\ResourceStorage\Revision\Revision\getStorageID(), ILIAS\ResourceStorage\Revision\Revision\getTitle(), ILIAS\ResourceStorage\Revision\Revision\getVersionNumber(), null, ILIAS\ResourceStorage\Resource\ResourceBuilder\populateNakedResourceWithRevisionsAndStakeholders(), and ILIAS\ResourceStorage\Revision\FileRevision\setVersionNumber().

Referenced by ILIAS\ResourceStorage\Resource\ResourceBuilder\addStreamToContainer(), ILIAS\ResourceStorage\Resource\ResourceBuilder\addUploadToContainer(), ILIAS\ResourceStorage\Resource\ResourceBuilder\createDirectoryInsideContainer(), ILIAS\ResourceStorage\Resource\ResourceBuilder\removePathInsideContainer(), and ILIAS\ResourceStorage\Resource\ResourceBuilder\store().

418  : void
419  {
420  $storage_handler = empty($revision->getStorageID())
421  ? $this->primary_storage_handler
422  : $this->storage_handler_factory->getHandlerForRevision($revision);
423 
424  if ($revision instanceof UploadedFileRevision) {
425  // check policies
426  $this->file_name_policy->check($revision->getInformation()->getSuffix());
427  $storage_handler->storeUpload($revision);
428  }
429  if ($revision instanceof FileStreamRevision) {
430  $storage_handler->storeStream($revision);
431  }
432  if ($revision instanceof CloneRevision) {
433  $storage_handler->cloneRevision($revision);
434  }
435  if ($revision instanceof StreamReplacementRevision) {
436  $storage_handler->streamReplacement($revision);
437  }
438  $this->revision_repository->store($revision);
439  $this->information_repository->store($revision->getInformation(), $revision);
440 
441  // we replace the revision with the populated one
442  if ($resource !== null) {
443  $replace_revision = new FileRevision($revision->getIdentification());
444  $replace_revision->setVersionNumber($revision->getVersionNumber());
445  $replace_revision->setOwnerId($revision->getOwnerId());
446  $replace_revision->setTitle($revision->getTitle());
447  $replace_revision->setStatus($revision->getStatus());
448  $replace_revision->setInformation($revision->getInformation());
449  $replace_revision->setStorageID($revision->getStorageID());
450 
451  $resource->replaceRevision($replace_revision);
452  }
453  }
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ unpublish()

ILIAS\ResourceStorage\Resource\ResourceBuilder::unpublish ( StorableResource  $resource)

Definition at line 492 of file ResourceBuilder.php.

References ILIAS\ResourceStorage\Revision\DRAFT, ILIAS\ResourceStorage\Resource\StorableResource\getCurrentRevisionIncludingDraft(), and ILIAS\ResourceStorage\Resource\ResourceBuilder\store().

492  : bool
493  {
494  $revision = $resource->getCurrentRevisionIncludingDraft();
495  if ($revision->getStatus() === RevisionStatus::DRAFT) {
496  return false;
497  }
498  $revision->setStatus(RevisionStatus::DRAFT);
499  $this->store($resource);
500  return true;
501  }
store(StorableResource $resource)
after you have modified a resource, you can store it here
+ Here is the call graph for this function:

Field Documentation

◆ $auto_migrate

bool ILIAS\ResourceStorage\Resource\ResourceBuilder::$auto_migrate = true
private

Definition at line 83 of file ResourceBuilder.php.

◆ $information_repository

InformationRepository ILIAS\ResourceStorage\Resource\ResourceBuilder::$information_repository
private

Definition at line 64 of file ResourceBuilder.php.

◆ $primary_storage_handler

StorageHandler ILIAS\ResourceStorage\Resource\ResourceBuilder::$primary_storage_handler
protected

Definition at line 82 of file ResourceBuilder.php.

◆ $resource_cache

array ILIAS\ResourceStorage\Resource\ResourceBuilder::$resource_cache = []
protected

Definition at line 81 of file ResourceBuilder.php.

◆ $resource_repository

ResourceRepository ILIAS\ResourceStorage\Resource\ResourceBuilder::$resource_repository
private

Definition at line 68 of file ResourceBuilder.php.

◆ $revision_repository

RevisionRepository ILIAS\ResourceStorage\Resource\ResourceBuilder::$revision_repository
private

Definition at line 72 of file ResourceBuilder.php.

◆ $stakeholder_repository

StakeholderRepository ILIAS\ResourceStorage\Resource\ResourceBuilder::$stakeholder_repository
private

Definition at line 76 of file ResourceBuilder.php.


The documentation for this class was generated from the following file: