You are here

public function PhysicalFile::processEntity in Entity Share 8.3

Plugin annotation

@SuppressWarnings(PHPMD . ErrorControlOperator);

Overrides ImportProcessorPluginBase::processEntity

File

modules/entity_share_client/src/Plugin/EntityShareClient/Processor/PhysicalFile.php, line 100

Class

PhysicalFile
Handle physical file import.

Namespace

Drupal\entity_share_client\Plugin\EntityShareClient\Processor

Code

public function processEntity(RuntimeImportContext $runtime_import_context, ContentEntityInterface $processed_entity, array $entity_json_data) {
  if ($processed_entity instanceof FileInterface) {
    $field_mappings = $runtime_import_context
      ->getFieldMappings();
    $entity_type_id = $processed_entity
      ->getEntityTypeId();
    $entity_bundle = $processed_entity
      ->bundle();
    $uri_public_name = FALSE;
    if (isset($field_mappings[$entity_type_id][$entity_bundle]['uri'])) {
      $uri_public_name = $field_mappings[$entity_type_id][$entity_bundle]['uri'];
    }
    if (!$uri_public_name || !isset($entity_json_data['attributes'][$uri_public_name])) {
      $this->logger
        ->error('Impossible to get the URI of the file in JSON:API data. Please check that the server website is correctly exposing it.');
      $this
        ->messenger()
        ->addError($this
        ->t('Impossible to get the URI of the file in JSON:API data. Please check that the server website is correctly exposing it.'));
      return;
    }
    $remote_file_uri = $entity_json_data['attributes'][$uri_public_name]['value'];
    $remote_file_url = $entity_json_data['attributes'][$uri_public_name]['url'];
    $stream_wrapper = $this->streamWrapperManager
      ->getViaUri($remote_file_uri);
    $directory_uri = $stream_wrapper
      ->dirname($remote_file_uri);
    $log_variables = [
      '%url' => $remote_file_url,
      '%directory' => $directory_uri,
      '%id' => $processed_entity
        ->id(),
      '%uri' => $remote_file_uri,
    ];
    $file_overwrite_mode = $this->configuration['rename'] ? FileSystemInterface::EXISTS_RENAME : FileSystemInterface::EXISTS_REPLACE;
    $file_destination = $this->fileSystem
      ->getDestinationFilename($processed_entity
      ->getFileUri(), $file_overwrite_mode);
    $processed_entity
      ->setFileUri($file_destination);
    $processed_entity
      ->setFilename($this->fileSystem
      ->basename($file_destination));

    // Create the destination folder.
    if ($this->fileSystem
      ->prepareDirectory($directory_uri, FileSystemInterface::CREATE_DIRECTORY)) {
      try {
        $response = $this->remoteManager
          ->request($runtime_import_context
          ->getRemote(), 'GET', $remote_file_url);
        $file_content = (string) $response
          ->getBody();
        $result = @file_put_contents($file_destination, $file_content);
        if (!$result) {
          throw new \Exception('Error writing file to ' . $file_destination);
        }
      } catch (ClientException $e) {
        $this->logger
          ->warning('Error importing file id %id. Missing file: %url', $log_variables);
        $this
          ->messenger()
          ->addWarning($this
          ->t('Error importing file id %id. Missing file: %url', $log_variables));
      } catch (\Throwable $e) {
        $log_variables['@msg'] = $e
          ->getMessage();
        $this->logger
          ->error('Caught exception trying to import the file %url to %uri. Error message was @msg', $log_variables);
        $this
          ->messenger()
          ->addError($this
          ->t('Caught exception trying to import the file %url to %uri', $log_variables));
      }
    }
    else {
      $this->logger
        ->error('Impossible to write in the directory %directory', $log_variables);
      $this
        ->messenger()
        ->addError($this
        ->t('Impossible to write in the directory %directory', $log_variables));
    }
  }
}