Breaking: #107397 - Circular dependency between ProcessedFile and Task removed 

See forge#107397

Description 

The circular dependency between ProcessedFile and File Processing Task classes has been resolved to improve the architecture and maintainability of the file processing system.

The following changes have been made to ProcessedFile:

  • The public method getTask() has been removed
  • The public method generateProcessedFileNameWithoutExtension() has been removed

The following changes have been made to ProcessedFileRepository:

  • Method add() now requires a TaskInterface parameter
  • Method update() now requires a TaskInterface parameter

The checksum validation logic has been moved from ProcessedFile to AbstractTask

Impact 

Any code that calls the following methods will cause PHP fatal errors:

  • ProcessedFile->getTask()
  • ProcessedFile->generateProcessedFileNameWithoutExtension()

Any code that calls ProcessedFileRepository->add() or ProcessedFileRepository->update() without the new TaskInterface parameter will cause PHP fatal errors.

Code that relied on ProcessedFile objects having Task objects available internally will no longer work, as Task objects are now created externally by FileProcessingService when needed.

Affected installations 

Installations with custom file processing extensions or custom Task implementations that directly interact with the ProcessedFile->getTask() method are affected. The extension scanner will report any usage of ProcessedFile->getTask() and ProcessedFile->generateProcessedFileNameWithoutExtension() as weak match.

Extensions that manually call ProcessedFileRepository->add() or ProcessedFileRepository->update() are also affected. The extension scanner will not report any usage of these methods due to too many weak matches.

Migration 

Replace calls to ProcessedFile->getTask() with direct creation of Task objects through the TaskTypeRegistry:

// Before
$task = $processedFile->getTask();

// After
$taskTypeRegistry = GeneralUtility::makeInstance(TaskTypeRegistry::class);
$task = $taskTypeRegistry->getTaskForType(
    $processedFile->getTaskType(),
    $processedFile,
    $processedFile->getProcessingConfiguration()
);
Copied!

It is recommended to implement your own alternative to ProcessedFile->generateProcessedFileNameWithoutExtension():

Update calls to ProcessedFileRepository->add() and ProcessedFileRepository->update():

// Before
$processedFileRepository->add($processedFile);
$processedFileRepository->update($processedFile);

// After
$task = $taskTypeRegistry->getTaskForType(
    $processedFile->getTaskType(),
    $processedFile,
    $processedFile->getProcessingConfiguration()
);
$processedFileRepository->add($processedFile, $task);
$processedFileRepository->update($processedFile, $task);
Copied!