Commit ffde907c authored by Alex Pott's avatar Alex Pott
Browse files

Issue #2321609 by benjy, dawehner: Fixed Provide a helpful message in case...

Issue #2321609 by benjy, dawehner: Fixed Provide a helpful message in case requirements are not met.
parent 801d850a
Loading
Loading
Loading
Loading
+31 −11
Changes for core/modules/migrate/src/Entity/Migration.php: 31 added lines, 11 removed lines.
Original line number Diff line number Diff line
@@ -7,7 +7,9 @@

namespace Drupal\migrate\Entity;

use Drupal\Component\Utility\String;
use Drupal\Core\Config\Entity\ConfigEntityBase;
use Drupal\migrate\Exception\RequirementsException;
use Drupal\migrate\MigrateException;
use Drupal\migrate\Plugin\MigrateIdMapInterface;
use Drupal\migrate\Plugin\RequirementsInterface;
@@ -195,6 +197,13 @@ class Migration extends ConfigEntityBase implements MigrationInterface, Requirem
   */
  public $migration_dependencies = array();

  /**
   * The entity manager.
   *
   * @var \Drupal\Core\Entity\EntityManagerInterface
   */
  protected $entityManager;

  /**
   * {@inheritdoc}
   */
@@ -315,28 +324,39 @@ public function saveHighWater($high_water) {
  public function checkRequirements() {
    // Check whether the current migration source and destination plugin
    // requirements are met or not.
    try {
      if ($this->getSourcePlugin() instanceof RequirementsInterface && !$this->getSourcePlugin()->checkRequirements()) {
        return FALSE;
    if ($this->getSourcePlugin() instanceof RequirementsInterface) {
      $this->getSourcePlugin()->checkRequirements();
    }
      if ($this->getDestinationPlugin() instanceof RequirementsInterface && !$this->getDestinationPlugin()->checkRequirements()) {
        return FALSE;
    if ($this->getDestinationPlugin() instanceof RequirementsInterface) {
      $this->getDestinationPlugin()->checkRequirements();
    }

    /** @var \Drupal\migrate\Entity\MigrationInterface[] $required_migrations */
      $required_migrations = \Drupal::entityManager()->getStorage('migration')->loadMultiple($this->requirements);
    $required_migrations = $this->getEntityManager()->getStorage('migration')->loadMultiple($this->requirements);

    $missing_migrations = array_diff($this->requirements, array_keys($required_migrations));
    // Check if the dependencies are in good shape.
      foreach ($required_migrations as $required_migration) {
    foreach ($required_migrations as $migration_id => $required_migration) {
      if (!$required_migration->isComplete()) {
          return FALSE;
        $missing_migrations[] = $migration_id;
      }
    }
    if ($missing_migrations) {
      throw new RequirementsException(String::format('Missing migrations @requirements.', ['@requirements' => implode(', ', $missing_migrations)]), ['requirements' => $missing_migrations]);
    }
    catch (\Exception $e) {
      return FALSE;
  }

    return TRUE;
  /**
   * Get the entity manager.
   *
   * @return \Drupal\Core\Entity\EntityManagerInterface
   *   The entity manager.
   */
  protected function getEntityManager() {
    if (!isset($this->entityManager)) {
      $this->entityManager = \Drupal::entityManager();
    }
    return $this->entityManager;
  }

  /**
+70 −0
Changes for core/modules/migrate/src/Exception/RequirementsException.php: 70 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php

/**
 * @file
 * Contains \Drupal\migrate\Exception\RequirementsException.
 */

namespace Drupal\migrate\Exception;

use Exception;

/**
 * Defines an
 *
 * @see \Drupal\migrate\Plugin\RequirementsInterface
 */
class RequirementsException extends \RuntimeException {

  /**
   * The missing requirements.
   *
   * @var array
   */
  protected $requirements;

  /**
   * Constructs a new RequirementsException instance.
   *
   * @param string $message
   *   (optional) The Exception message to throw.
   * @param array $requirements
   *   (optional) The missing requirements.
   * @param int $code
   *   (optional) The Exception code.
   * @param \Exception $previous
   *   (optional) The previous exception used for the exception chaining.
   */
  public function __construct($message = "", array $requirements = [], $code = 0, Exception $previous = NULL) {
    parent::__construct($message, $code, $previous);

    $this->requirements = $requirements;
  }

  /**
   * Get an array of requirements.
   *
   * @return array
   *   The requirements.
   */
  public function getRequirements() {
    return $this->requirements;
  }

  /**
   * Get the requirements as a string.
   *
   * @return string
   *   A formatted requirements string.
   */
  public function getRequirementsString() {
    $output = '';
    foreach ($this->requirements as $requirement_type => $requirements) {
      foreach ($requirements as $value) {
        $output .= "$requirement_type: $value. ";
      }
    }
    return trim($output);
  }

}
+11 −2
Changes for core/modules/migrate/src/MigrateExecutable.php: 11 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
use Drupal\Core\Utility\Error;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\migrate\Entity\MigrationInterface;
use Drupal\migrate\Exception\RequirementsException;
use Drupal\migrate\Plugin\MigrateIdMapInterface;

/**
@@ -233,11 +234,19 @@ public function getSource() {
   */
  public function import() {
    // Knock off migration if the requirements haven't been met.
    if (!$this->migration->checkRequirements()) {
    try {
      $this->migration->checkRequirements();
    }
    catch (RequirementsException $e) {
      $this->message->display(
        $this->t('Migration @id did not meet the requirements', array('@id' => $this->migration->id())), 'error');
        $this->t('Migration @id did not meet the requirements. @message @requirements', array(
          '@id' => $this->migration->id(),
          '@message' => $e->getMessage(),
          '@requirements' => $e->getRequirementsString(),
        )), 'error');
      return MigrationInterface::RESULT_FAILED;
    }

    $return = MigrationInterface::RESULT_COMPLETED;
    $source = $this->getSource();
    $id_map = $this->migration->getIdMap();
+2 −2
Changes for core/modules/migrate/src/Plugin/RequirementsInterface.php: 2 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -15,8 +15,8 @@ interface RequirementsInterface {
  /**
   * Checks if requirements for this plugin are OK.
   *
   * @return bool
   *   TRUE if it is possible to use the plugin, FALSE if not.
   * @throws \Drupal\migrate\Exception\RequirementsException
   *   Thrown when requirements are not met.
   */
  public function checkRequirements();

+4 −1
Changes for core/modules/migrate/src/Plugin/migrate/destination/DestinationBase.php: 4 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@

use Drupal\Core\Plugin\PluginBase;
use Drupal\migrate\Entity\MigrationInterface;
use Drupal\migrate\Exception\RequirementsException;
use Drupal\migrate\Plugin\MigrateDestinationInterface;
use Drupal\migrate\Plugin\RequirementsInterface;

@@ -53,7 +54,9 @@ public function __construct(array $configuration, $plugin_id, $plugin_definition
   * {@inheritdoc}
   */
  public function checkRequirements() {
    return $this->pluginDefinition['requirements_met'];
    if (empty($this->pluginDefinition['requirements_met'])) {
      throw new RequirementsException();
    }
  }

  /**
Loading