diff -u b/core/modules/migrate_drupal_ui/src/Batch/MigrateUpgradeImportBatch.php b/core/modules/migrate_drupal_ui/src/Batch/MigrateUpgradeImportBatch.php --- b/core/modules/migrate_drupal_ui/src/Batch/MigrateUpgradeImportBatch.php +++ b/core/modules/migrate_drupal_ui/src/Batch/MigrateUpgradeImportBatch.php @@ -8,6 +8,11 @@ use Drupal\Core\Url; use Drupal\migrate\Plugin\MigrationInterface; use Drupal\migrate\Event\MigrateEvents; +use Drupal\migrate\Event\MigrateIdMapMessageEvent; +use Drupal\migrate\Event\MigrateMapDeleteEvent; +use Drupal\migrate\Event\MigrateMapSaveEvent; +use Drupal\migrate\Event\MigratePostRowSaveEvent; +use Drupal\migrate\Event\MigrateRowDeleteEvent; use Drupal\migrate\MigrateExecutable; /** @@ -16,6 +21,41 @@ class MigrateUpgradeImportBatch extends MigrateUpgradeBatchBase { /** + * Maximum number of previous messages to display. + */ + const MESSAGE_LENGTH = 20; + + /** + * The processed items for one batch of a given migration. + * + * @var int + */ + static $numProcessed = 0; + + /** + * Ensure we only add the listeners once per request. + * + * @var bool + */ + protected static $listenersAdded = FALSE; + + /** + * The maximum length in seconds to allow processing in a request. + * + * @see self::run() + * + * @var int + */ + protected static $maxExecTime; + + /** + * MigrateMessage instance to capture messages during the migration process. + * + * @var \Drupal\migrate_drupal_ui\Batch\MigrateMessageCapture + */ + protected static $messages; + + /** * Runs a single migrate import batch. * * @param int[] $initial_ids @@ -175,9 +215,9 @@ * TRUE if batch successfully completed. * @param array $results * Batch results. - * @param $operations + * @param array $operations * An array of methods run in the batch. - * @param $elapsed + * @param string $elapsed * The time to run the batch. */ public static function finished($success, $results, $operations, $elapsed) { @@ -209,2 +249,66 @@ + /** + * Reacts to item import. + * + * @param \Drupal\migrate\Event\MigratePostRowSaveEvent $event + * The post-save event. + */ + public static function onPostRowSave(MigratePostRowSaveEvent $event) { + // We want to interrupt this batch and start a fresh one. + if ((time() - REQUEST_TIME) > static::$maxExecTime) { + $event->getMigration()->interruptMigration(MigrationInterface::RESULT_INCOMPLETE); + } + } + + /** + * Reacts to item deletion. + * + * @param \Drupal\migrate\Event\MigrateRowDeleteEvent $event + * The post-save event. + */ + public static function onPostRowDelete(MigrateRowDeleteEvent $event) { + // We want to interrupt this batch and start a fresh one. + if ((time() - REQUEST_TIME) > static::$maxExecTime) { + $event->getMigration()->interruptMigration(MigrationInterface::RESULT_INCOMPLETE); + } + } + + /** + * Counts up any map save events. + * + * @param \Drupal\migrate\Event\MigrateMapSaveEvent $event + * The map event. + */ + public static function onMapSave(MigrateMapSaveEvent $event) { + static::$numProcessed++; + } + + /** + * Counts up any map delete events. + * + * @param \Drupal\migrate\Event\MigrateMapDeleteEvent $event + * The map event. + */ + public static function onMapDelete(MigrateMapDeleteEvent $event) { + static::$numProcessed++; + } + + /** + * Displays any messages being logged to the ID map. + * + * @param \Drupal\migrate\Event\MigrateIdMapMessageEvent $event + * The message event. + */ + public static function onIdMapMessage(MigrateIdMapMessageEvent $event) { + if ($event->getLevel() == MigrationInterface::MESSAGE_NOTICE || $event->getLevel() == MigrationInterface::MESSAGE_INFORMATIONAL) { + $type = 'status'; + } + else { + $type = 'error'; + } + $source_id_string = implode(',', $event->getSourceIdValues()); + $message = t('Source ID @source_id: @message', ['@source_id' => $source_id_string, '@message' => $event->getMessage()]); + static::$messages->display($message, $type); + } + }