ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
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.

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)
persist()
Define whether the generated flavor and the respective streams should be persisted,...

◆ checkDefinition()

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

Definition at line 203 of file FlavourBuilder.php.

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 }
getVariantName()
If a definition can be used in several variants (e.g.

References ILIAS\ResourceStorage\Flavour\Definition\FlavourDefinition\getVariantName().

+ Here is the call graph for this function:

◆ checkDefinitionForMachine()

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

Definition at line 196 of file FlavourBuilder.php.

196 : void
197 {
198 if (!$machine->canHandleDefinition($definition)) {
199 throw new \InvalidArgumentException("FlavourDefinition not supported by machine");
200 }
201 }
canHandleDefinition(FlavourDefinition $definition)
Check if a corresponding configuration can be processed by this Machine.

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

+ Here is the call graph for this function:

◆ delete()

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

Definition at line 139 of file FlavourBuilder.php.

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)

◆ get()

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

Definition at line 76 of file FlavourBuilder.php.

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 }
build(ResourceIdentification $rid, FlavourDefinition $definition)
has(ResourceIdentification $identification, FlavourDefinition $definition)
read(ResourceIdentification $rid, FlavourDefinition $definition, bool $force_building=false)
checkDefinition(FlavourDefinition $definition)

References ILIAS\GlobalScreen\has(), and ILIAS\ResourceStorage\Identification\AbstractIdentification\serialize().

+ 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.

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 }

References ILIAS\ResourceStorage\Flavour\Flavour\getResourceId().

+ Here is the call graph for this function:

◆ getResource()

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

Definition at line 316 of file FlavourBuilder.php.

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 }

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

+ Here is the call graph for this function:

◆ getResourceOfFlavour()

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

Definition at line 324 of file FlavourBuilder.php.

324 : StorableResource
325 {
326 return $this->getResource($flavour->getResourceID());
327 }

◆ getStorageHandler()

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

Definition at line 329 of file FlavourBuilder.php.

329 : StorageHandler
330 {
331 return $this->storage_handler_factory->getHandlerForResource($this->getResourceOfFlavour($flavour));
332 }

◆ has()

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

Definition at line 61 of file FlavourBuilder.php.

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 }

◆ hasFlavourStreams()

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

Definition at line 160 of file FlavourBuilder.php.

160 : bool
161 {
162 return $this->getStorageHandler($flavour)->hasFlavour(
163 $this->getCurrentRevision($flavour),
164 $flavour
165 );
166 }

◆ new()

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

Definition at line 130 of file FlavourBuilder.php.

130 : Flavour
131 {
132 return new Flavour(
133 $definition,
134 $rid,
135 $this->getResource($rid)->getCurrentRevision()->getVersionNumber()
136 );
137 }

◆ populateFlavourWithExistingStreams()

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

Definition at line 179 of file FlavourBuilder.php.

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

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

+ Here is the call 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.

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 }

◆ runMachine()

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

Definition at line 242 of file FlavourBuilder.php.

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 }
static ofString(string $string)
Creates a new stream with an initial value.
Definition: Streams.php:41
checkDefinitionForMachine(FlavourDefinition $definition, FlavourMachine $machine)
storeFlavourStreams(Flavour $flavour, array $streams)
@ FLAVOUR_BUILD_FAILED
event string being used if a new Resource has been stored to the IRSS.
Definition: Event.php:52

◆ storeFlavourStreams()

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

Definition at line 168 of file FlavourBuilder.php.

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 }

◆ testDefinition()

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

Definition at line 213 of file FlavourBuilder.php.

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 }

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: