LiveRepositoryHandler.php in Workspace 8.2
File
src/Plugin/RepositoryHandler/LiveRepositoryHandler.php
View source
<?php
namespace Drupal\workspace\Plugin\RepositoryHandler;
use Drupal\Core\Database\Connection;
use Drupal\workspace\RepositoryHandlerBase;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\workspace\RepositoryHandlerInterface;
use Drupal\workspace\WorkspaceConflictException;
use Symfony\Component\DependencyInjection\ContainerInterface;
class LiveRepositoryHandler extends RepositoryHandlerBase implements RepositoryHandlerInterface, ContainerFactoryPluginInterface {
protected $sourceWorkspace;
protected $targetWorkspace;
protected $entityTypeManager;
protected $database;
protected $workspaceAssociationStorage;
public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, Connection $database) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->entityTypeManager = $entity_type_manager;
$this->database = $database;
$this->workspaceAssociationStorage = $entity_type_manager
->getStorage('workspace_association');
$this->sourceWorkspace = $this->entityTypeManager
->getStorage('workspace')
->load($this->source);
$this->targetWorkspace = $this->entityTypeManager
->getStorage('workspace')
->load($this->target);
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('entity_type.manager'), $container
->get('database'));
}
public function calculateDependencies() {
$this->dependencies = parent::calculateDependencies();
$this
->addDependency($this->sourceWorkspace
->getConfigDependencyKey(), $this->sourceWorkspace
->getConfigDependencyName());
return $this->dependencies;
}
public function push() {
if ($this
->checkConflictsOnTarget()) {
throw new WorkspaceConflictException();
}
$transaction = $this->database
->startTransaction();
try {
foreach ($this
->getDifferringRevisionIdsOnSource() as $entity_type_id => $revision_difference) {
$entity_revisions = $this->entityTypeManager
->getStorage($entity_type_id)
->loadMultipleRevisions(array_keys($revision_difference));
foreach ($entity_revisions as $entity) {
$entity->_isReplicating = TRUE;
$entity
->isDefaultRevision(TRUE);
$entity
->save();
}
}
} catch (\Exception $e) {
$transaction
->rollBack();
watchdog_exception('workspace', $e);
throw $e;
}
$this->workspaceAssociationStorage
->postPush($this->sourceWorkspace);
}
public function pull() {
}
public function checkConflictsOnTarget() {
}
public function getDifferringRevisionIdsOnTarget() {
$target_revision_difference = [];
$tracked_entities = $this->workspaceAssociationStorage
->getTrackedEntities($this->source);
foreach ($tracked_entities as $entity_type_id => $tracked_revisions) {
$entity_type = $this->entityTypeManager
->getDefinition($entity_type_id);
$query = $this->entityTypeManager
->getStorage($entity_type_id)
->getQuery()
->condition($entity_type
->getKey('id'), $tracked_revisions, 'IN')
->latestRevision();
$result = $query
->execute();
if ($revision_difference = array_diff_key($result, $tracked_revisions)) {
$target_revision_difference[$entity_type_id] = $revision_difference;
}
}
return $target_revision_difference;
}
public function getDifferringRevisionIdsOnSource() {
return $this->workspaceAssociationStorage
->getTrackedEntities($this->source);
}
public function getNumberOfChangesOnTarget() {
$total_changes = $this
->getDifferringRevisionIdsOnTarget();
return count($total_changes, COUNT_RECURSIVE) - count($total_changes);
}
public function getNumberOfChangesOnSource() {
$total_changes = $this
->getDifferringRevisionIdsOnSource();
return count($total_changes, COUNT_RECURSIVE) - count($total_changes);
}
}