ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
ILIAS\ResourceStorage\Flavour\FlavourBuilder Class Reference
+ Collaboration diagram for ILIAS\ResourceStorage\Flavour\FlavourBuilder:

Public Member Functions

 __construct (private readonly FlavourRepository $flavour_resource_repository, private readonly Factory $flavour_machine_factory, private readonly ResourceBuilder $resource_builder, private readonly StorageHandlerFactory $storage_handler_factory, private readonly StreamAccess $stream_access, private readonly Subject $events)
 
 has (ResourceIdentification $identification, FlavourDefinition $definition)
 
 get (ResourceIdentification $rid, FlavourDefinition $definition, bool $force_building=false)
 
 delete (ResourceIdentification $rid, FlavourDefinition $definition)
 
 testDefinition (ResourceIdentification $rid, FlavourDefinition $definition)
 

Data Fields

const VARIANT_NAME_MAX_LENGTH = 768
 

Protected Member Functions

 runMachine (ResourceIdentification $rid, FlavourDefinition $definition, Flavour $flavour)
 

Private Member Functions

 build (ResourceIdentification $rid, FlavourDefinition $definition)
 
 read (ResourceIdentification $rid, FlavourDefinition $definition, bool $force_building=false)
 
 new (FlavourDefinition $definition, ResourceIdentification $rid)
 
 hasFlavourStreams (Flavour $flavour)
 
 storeFlavourStreams (Flavour $flavour, array $streams)
 
 populateFlavourWithExistingStreams (Flavour $flavour)
 
 checkDefinitionForMachine (FlavourDefinition $definition, FlavourMachine $machine)
 
 checkDefinition (FlavourDefinition $definition)
 
 getCurrentRevision (Flavour $flavour)
 
 getResource (ResourceIdentification $rid)
 
 getResourceOfFlavour (Flavour $flavour)
 
 getStorageHandler (Flavour $flavour)
 

Private Attributes

array $current_revision_cache = []
 
array $resources_cache = []
 

Detailed Description

Author
Fabian Schmid fabia.nosp@m.n@sr.nosp@m..solu.nosp@m.tion.nosp@m.s

Definition at line 45 of file FlavourBuilder.php.

Constructor & Destructor Documentation

◆ __construct()

ILIAS\ResourceStorage\Flavour\FlavourBuilder::__construct ( private readonly FlavourRepository  $flavour_resource_repository,
private readonly Factory  $flavour_machine_factory,
private readonly ResourceBuilder  $resource_builder,
private readonly StorageHandlerFactory  $storage_handler_factory,
private readonly StreamAccess  $stream_access,
private readonly Subject  $events 
)

Definition at line 51 of file FlavourBuilder.php.

58  {
59  }

Member Function Documentation

◆ build()

ILIAS\ResourceStorage\Flavour\FlavourBuilder::build ( ResourceIdentification  $rid,
FlavourDefinition  $definition 
)
private

Definition at line 92 of file FlavourBuilder.php.

References ILIAS\ResourceStorage\Flavour\Definition\FlavourDefinition\persist(), ILIAS\ResourceStorage\Flavour\FlavourBuilder\populateFlavourWithExistingStreams(), and ILIAS\ResourceStorage\Flavour\FlavourBuilder\runMachine().

Referenced by ILIAS\ResourceStorage\Flavour\FlavourBuilder\get().

95  : Flavour {
96  $flavour = $this->new($definition, $rid);
97  $flavour = $this->runMachine($rid, $definition, $flavour);
98 
99  if ($definition->persist()) {
100  $this->flavour_resource_repository->store($flavour);
101  $flavour = $this->populateFlavourWithExistingStreams($flavour);
102  }
103 
104  return $flavour;
105  }
runMachine(ResourceIdentification $rid, FlavourDefinition $definition, Flavour $flavour)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ checkDefinition()

ILIAS\ResourceStorage\Flavour\FlavourBuilder::checkDefinition ( FlavourDefinition  $definition)
private

Definition at line 203 of file FlavourBuilder.php.

References ILIAS\ResourceStorage\Flavour\Definition\FlavourDefinition\getVariantName(), and null.

Referenced by ILIAS\ResourceStorage\Flavour\FlavourBuilder\get(), ILIAS\ResourceStorage\Flavour\FlavourBuilder\has(), and ILIAS\ResourceStorage\Flavour\FlavourBuilder\testDefinition().

203  : void
204  {
205  if ($definition->getVariantName() === null) {
206  return;
207  }
208  if (strlen($definition->getVariantName()) > self::VARIANT_NAME_MAX_LENGTH) {
209  throw new \InvalidArgumentException("FlavourDefinition variant name too long");
210  }
211  }
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:

◆ checkDefinitionForMachine()

ILIAS\ResourceStorage\Flavour\FlavourBuilder::checkDefinitionForMachine ( FlavourDefinition  $definition,
FlavourMachine  $machine 
)
private

Definition at line 196 of file FlavourBuilder.php.

References ILIAS\ResourceStorage\Flavour\Machine\FlavourMachine\canHandleDefinition().

Referenced by ILIAS\ResourceStorage\Flavour\FlavourBuilder\runMachine(), and ILIAS\ResourceStorage\Flavour\FlavourBuilder\testDefinition().

196  : void
197  {
198  if (!$machine->canHandleDefinition($definition)) {
199  throw new \InvalidArgumentException("FlavourDefinition not supported by machine");
200  }
201  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ delete()

ILIAS\ResourceStorage\Flavour\FlavourBuilder::delete ( ResourceIdentification  $rid,
FlavourDefinition  $definition 
)

Definition at line 139 of file FlavourBuilder.php.

References ILIAS\ResourceStorage\Flavour\FlavourBuilder\getResource(), and ILIAS\ResourceStorage\Flavour\FlavourBuilder\getStorageHandler().

142  : bool {
143  $current_revision = $this->getResource($rid)->getCurrentRevision();
144  $revision_number = $current_revision->getVersionNumber();
145 
146  if ($this->flavour_resource_repository->has($rid, $revision_number, $definition)) {
147  $flavour = $this->flavour_resource_repository->get($rid, $revision_number, $definition);
148  $this->flavour_resource_repository->delete($flavour);
149  $storage = $this->getStorageHandler($flavour);
150  $storage->deleteFlavour($current_revision, $flavour);
151 
152  return true;
153  }
154 
155  return false;
156  }
getResource(ResourceIdentification $rid)
+ Here is the call graph for this function:

◆ get()

ILIAS\ResourceStorage\Flavour\FlavourBuilder::get ( ResourceIdentification  $rid,
FlavourDefinition  $definition,
bool  $force_building = false 
)
Exceptions
ResourceNotFoundException

Definition at line 76 of file FlavourBuilder.php.

References ILIAS\ResourceStorage\Flavour\FlavourBuilder\build(), ILIAS\ResourceStorage\Flavour\FlavourBuilder\checkDefinition(), ILIAS\ResourceStorage\Flavour\FlavourBuilder\has(), ILIAS\ResourceStorage\Flavour\FlavourBuilder\read(), and ILIAS\ResourceStorage\Identification\AbstractIdentification\serialize().

80  : Flavour {
81  $this->checkDefinition($definition);
82  if (!$this->resource_builder->has($rid)) {
83  throw new ResourceNotFoundException($rid->serialize());
84  }
85  if ($this->has($rid, $definition)) {
86  return $this->read($rid, $definition, $force_building);
87  }
88 
89  return $this->build($rid, $definition);
90  }
checkDefinition(FlavourDefinition $definition)
build(ResourceIdentification $rid, FlavourDefinition $definition)
read(ResourceIdentification $rid, FlavourDefinition $definition, bool $force_building=false)
has(ResourceIdentification $identification, FlavourDefinition $definition)
+ Here is the call graph for this function:

◆ getCurrentRevision()

ILIAS\ResourceStorage\Flavour\FlavourBuilder::getCurrentRevision ( Flavour  $flavour)
private

Definition at line 306 of file FlavourBuilder.php.

References ILIAS\ResourceStorage\Flavour\Flavour\getResourceId(), and ILIAS\ResourceStorage\Flavour\FlavourBuilder\getResourceOfFlavour().

Referenced by ILIAS\ResourceStorage\Flavour\FlavourBuilder\has(), ILIAS\ResourceStorage\Flavour\FlavourBuilder\hasFlavourStreams(), ILIAS\ResourceStorage\Flavour\FlavourBuilder\new(), ILIAS\ResourceStorage\Flavour\FlavourBuilder\populateFlavourWithExistingStreams(), ILIAS\ResourceStorage\Flavour\FlavourBuilder\runMachine(), and ILIAS\ResourceStorage\Flavour\FlavourBuilder\storeFlavourStreams().

306  : Revision
307  {
308  $rid = $flavour->getResourceId()->serialize();
309  if (isset($this->current_revision_cache[$rid])) {
310  // return $this->current_revision_cache[$rid]; // we are currently not able to cache this seriously,
311  // since there might be situations where the revision changes in the meantime
312  }
313  return $this->current_revision_cache[$rid] = $this->getResourceOfFlavour($flavour)->getCurrentRevision();
314  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getResource()

ILIAS\ResourceStorage\Flavour\FlavourBuilder::getResource ( ResourceIdentification  $rid)
private

Definition at line 316 of file FlavourBuilder.php.

References ILIAS\ResourceStorage\Identification\AbstractIdentification\serialize().

Referenced by ILIAS\ResourceStorage\Flavour\FlavourBuilder\delete(), ILIAS\ResourceStorage\Flavour\FlavourBuilder\getResourceOfFlavour(), ILIAS\ResourceStorage\Flavour\FlavourBuilder\has(), ILIAS\ResourceStorage\Flavour\FlavourBuilder\new(), ILIAS\ResourceStorage\Flavour\FlavourBuilder\read(), and ILIAS\ResourceStorage\Flavour\FlavourBuilder\testDefinition().

316  : StorableResource
317  {
318  $rid_string = $rid->serialize();
319  return $this->resources_cache[$rid_string] ?? ($this->resources_cache[$rid_string] = $this->resource_builder->get(
320  $rid
321  ));
322  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getResourceOfFlavour()

ILIAS\ResourceStorage\Flavour\FlavourBuilder::getResourceOfFlavour ( Flavour  $flavour)
private

Definition at line 324 of file FlavourBuilder.php.

References ILIAS\ResourceStorage\Flavour\FlavourBuilder\getResource().

Referenced by ILIAS\ResourceStorage\Flavour\FlavourBuilder\getCurrentRevision(), and ILIAS\ResourceStorage\Flavour\FlavourBuilder\getStorageHandler().

324  : StorableResource
325  {
326  return $this->getResource($flavour->getResourceID());
327  }
getResource(ResourceIdentification $rid)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getStorageHandler()

ILIAS\ResourceStorage\Flavour\FlavourBuilder::getStorageHandler ( Flavour  $flavour)
private

◆ has()

ILIAS\ResourceStorage\Flavour\FlavourBuilder::has ( ResourceIdentification  $identification,
FlavourDefinition  $definition 
)

Definition at line 61 of file FlavourBuilder.php.

References ILIAS\ResourceStorage\Flavour\FlavourBuilder\checkDefinition(), ILIAS\ResourceStorage\Flavour\FlavourBuilder\getCurrentRevision(), and ILIAS\ResourceStorage\Flavour\FlavourBuilder\getResource().

Referenced by ILIAS\ResourceStorage\Flavour\FlavourBuilder\get().

64  : bool {
65  $this->checkDefinition($definition);
66  return $this->flavour_resource_repository->has(
67  $identification,
68  $this->getResource($identification)->getCurrentRevision()->getVersionNumber(),
69  $definition
70  );
71  }
checkDefinition(FlavourDefinition $definition)
getResource(ResourceIdentification $rid)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ hasFlavourStreams()

ILIAS\ResourceStorage\Flavour\FlavourBuilder::hasFlavourStreams ( Flavour  $flavour)
private

Definition at line 160 of file FlavourBuilder.php.

References ILIAS\ResourceStorage\Flavour\FlavourBuilder\getCurrentRevision(), and ILIAS\ResourceStorage\Flavour\FlavourBuilder\getStorageHandler().

Referenced by ILIAS\ResourceStorage\Flavour\FlavourBuilder\read().

160  : bool
161  {
162  return $this->getStorageHandler($flavour)->hasFlavour(
163  $this->getCurrentRevision($flavour),
164  $flavour
165  );
166  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ new()

ILIAS\ResourceStorage\Flavour\FlavourBuilder::new ( FlavourDefinition  $definition,
ResourceIdentification  $rid 
)
private

Definition at line 130 of file FlavourBuilder.php.

References ILIAS\ResourceStorage\Flavour\FlavourBuilder\getCurrentRevision(), and ILIAS\ResourceStorage\Flavour\FlavourBuilder\getResource().

130  : Flavour
131  {
132  return new Flavour(
133  $definition,
134  $rid,
135  $this->getResource($rid)->getCurrentRevision()->getVersionNumber()
136  );
137  }
getResource(ResourceIdentification $rid)
+ Here is the call graph for this function:

◆ populateFlavourWithExistingStreams()

ILIAS\ResourceStorage\Flavour\FlavourBuilder::populateFlavourWithExistingStreams ( Flavour  $flavour)
private

Definition at line 179 of file FlavourBuilder.php.

References $handler, ILIAS\ResourceStorage\Flavour\FlavourBuilder\getCurrentRevision(), ILIAS\ResourceStorage\Flavour\Flavour\getResourceId(), and ILIAS\ResourceStorage\Flavour\FlavourBuilder\getStorageHandler().

Referenced by ILIAS\ResourceStorage\Flavour\FlavourBuilder\build(), and ILIAS\ResourceStorage\Flavour\FlavourBuilder\read().

179  : Flavour
180  {
181  $handler = $this->getStorageHandler($flavour);
182  $identification = $flavour->getResourceId();
183  $revision = $this->getCurrentRevision($flavour);
184  foreach (
185  $handler->getFlavourStreams(
186  $revision,
187  $flavour
188  ) as $index => $file_stream
189  ) {
190  $flavour = $this->stream_access->populateFlavour($flavour, $file_stream, $index);
191  }
192  return $flavour;
193  }
$handler
Definition: oai.php:29
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ read()

ILIAS\ResourceStorage\Flavour\FlavourBuilder::read ( ResourceIdentification  $rid,
FlavourDefinition  $definition,
bool  $force_building = false 
)
private

Definition at line 107 of file FlavourBuilder.php.

References ILIAS\ResourceStorage\Flavour\FlavourBuilder\getResource(), ILIAS\ResourceStorage\Flavour\FlavourBuilder\getStorageHandler(), ILIAS\ResourceStorage\Flavour\FlavourBuilder\hasFlavourStreams(), ILIAS\ResourceStorage\Flavour\FlavourBuilder\populateFlavourWithExistingStreams(), and ILIAS\ResourceStorage\Flavour\FlavourBuilder\runMachine().

Referenced by ILIAS\ResourceStorage\Flavour\FlavourBuilder\get().

111  : Flavour {
112  $current_revision = $this->getResource($rid)->getCurrentRevision();
113  $flavour = $this->flavour_resource_repository->get(
114  $rid,
115  $current_revision->getVersionNumber(),
116  $definition
117  );
118 
119  if ($force_building || !$this->hasFlavourStreams($flavour)) {
120  // ensure deletion of old streams
121  $storage = $this->getStorageHandler($flavour);
122  $storage->deleteFlavour($current_revision, $flavour);
123  // run Machine
124  return $this->runMachine($rid, $definition, $flavour);
125  }
126 
127  return $this->populateFlavourWithExistingStreams($flavour);
128  }
getResource(ResourceIdentification $rid)
runMachine(ResourceIdentification $rid, FlavourDefinition $definition, Flavour $flavour)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ runMachine()

ILIAS\ResourceStorage\Flavour\FlavourBuilder::runMachine ( ResourceIdentification  $rid,
FlavourDefinition  $definition,
Flavour  $flavour 
)
protected

Definition at line 242 of file FlavourBuilder.php.

References $handler, ILIAS\ResourceStorage\Flavour\FlavourBuilder\checkDefinitionForMachine(), ILIAS\ResourceStorage\Events\FLAVOUR_BUILD_FAILED, ILIAS\ResourceStorage\Flavour\FlavourBuilder\getCurrentRevision(), ILIAS\ResourceStorage\Flavour\FlavourBuilder\getStorageHandler(), ILIAS\Filesystem\Stream\Streams\ofString(), ILIAS\ResourceStorage\Flavour\Definition\FlavourDefinition\persist(), and ILIAS\ResourceStorage\Flavour\FlavourBuilder\storeFlavourStreams().

Referenced by ILIAS\ResourceStorage\Flavour\FlavourBuilder\build(), and ILIAS\ResourceStorage\Flavour\FlavourBuilder\read().

246  : Flavour {
247  $revision = $this->getCurrentRevision($flavour);
248 
249  // Get Orignal Stream of Resource/Revision
250  $handler = $this->getStorageHandler($flavour);
251  try {
252  $stream = $this->resource_builder->extractStream($revision);
253  $stream->rewind();
254  } catch (\Throwable) {
255  // error while reading file stream, cannot process
256  $this->events->notify(Event::FLAVOUR_BUILD_FAILED, new FlavourData($rid, $definition, $flavour, $t));
257  return $flavour;
258  }
259 
260  // Get Machine
261  $machine = $this->flavour_machine_factory->get($definition);
262  $this->checkDefinitionForMachine($definition, $machine);
263 
264  // Run Machine and get Streams
265  $storable_streams = [];
266  try {
267  foreach (
268  $machine->processStream(
269  $revision->getInformation(),
270  $stream,
271  $definition
272  ) as $result
273  ) {
274  $generated_stream = $result->getStream();
275  if ($result->isStoreable()) {
276  // Collect Streams to store persistently
277  $storable_streams[$result->getIndex()] = $generated_stream;
278  }
279 
280  $cloned_stream = Streams::ofString((string) $generated_stream);
281 
282  $flavour = $this->stream_access->populateFlavour(
283  $flavour,
284  $cloned_stream,
285  $result->getIndex()
286  );
287  }
288  } catch (\Throwable $t) {
289  // error while processing stream, cannot process
290  $this->events->notify(Event::FLAVOUR_BUILD_FAILED, new FlavourData($rid, $definition, $flavour, $t));
291  return $flavour;
292  }
293 
294  // Store Streams persistently if needed
295  if ($definition->persist()) {
296  $this->storeFlavourStreams($flavour, $storable_streams);
297  }
298 
299  $this->events->notify(Event::FLAVOUR_BUILD_SUCCESS, new FlavourData($rid, $definition, $flavour));
300 
301  return $flavour;
302  }
storeFlavourStreams(Flavour $flavour, array $streams)
checkDefinitionForMachine(FlavourDefinition $definition, FlavourMachine $machine)
event string being used if a new Resource has been stored to the IRSS.
Definition: Event.php:52
static ofString(string $string)
Creates a new stream with an initial value.
Definition: Streams.php:41
$handler
Definition: oai.php:29
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ storeFlavourStreams()

ILIAS\ResourceStorage\Flavour\FlavourBuilder::storeFlavourStreams ( Flavour  $flavour,
array  $streams 
)
private

Definition at line 168 of file FlavourBuilder.php.

References ILIAS\ResourceStorage\Flavour\FlavourBuilder\getCurrentRevision(), and ILIAS\ResourceStorage\Flavour\FlavourBuilder\getStorageHandler().

Referenced by ILIAS\ResourceStorage\Flavour\FlavourBuilder\runMachine().

168  : void
169  {
170  $storable = new StorableFlavourDecorator($flavour);
171  $storable->setStreams($streams);
172 
173  $this->getStorageHandler($flavour)->storeFlavour(
174  $this->getCurrentRevision($flavour),
175  $storable
176  );
177  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ testDefinition()

ILIAS\ResourceStorage\Flavour\FlavourBuilder::testDefinition ( ResourceIdentification  $rid,
FlavourDefinition  $definition 
)

Definition at line 213 of file FlavourBuilder.php.

References ILIAS\ResourceStorage\Flavour\FlavourBuilder\checkDefinition(), ILIAS\ResourceStorage\Flavour\FlavourBuilder\checkDefinitionForMachine(), and ILIAS\ResourceStorage\Flavour\FlavourBuilder\getResource().

216  : bool {
217  try {
218  $this->checkDefinition($definition);
219  $machine = $this->flavour_machine_factory->get($definition);
220  $this->checkDefinitionForMachine($definition, $machine);
221  } catch (\Throwable) {
222  return false;
223  }
224  if ($machine instanceof NullMachine) {
225  return false;
226  }
227  $engine = $machine->getEngine();
228  if (!$engine->isRunning()) {
229  return false;
230  }
231  $current_revision = $this->getResource($rid)->getCurrentRevision();
232  $suffix = $current_revision->getInformation()->getSuffix();
233  $size = $current_revision->getInformation()->getSize();
234  if ($size > $engine->getSizeLimitInBytes()) {
235  return false;
236  }
237 
238  return $engine->supports($suffix);
239  }
checkDefinition(FlavourDefinition $definition)
getResource(ResourceIdentification $rid)
checkDefinitionForMachine(FlavourDefinition $definition, FlavourMachine $machine)
+ Here is the call graph for this function:

Field Documentation

◆ $current_revision_cache

array ILIAS\ResourceStorage\Flavour\FlavourBuilder::$current_revision_cache = []
private

Definition at line 48 of file FlavourBuilder.php.

◆ $resources_cache

array ILIAS\ResourceStorage\Flavour\FlavourBuilder::$resources_cache = []
private

Definition at line 49 of file FlavourBuilder.php.

◆ VARIANT_NAME_MAX_LENGTH

const ILIAS\ResourceStorage\Flavour\FlavourBuilder::VARIANT_NAME_MAX_LENGTH = 768

Definition at line 47 of file FlavourBuilder.php.


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