crossword-8.x-1.x-dev/src/Plugin/Validation/Constraint/CrosswordFileValidator.php
src/Plugin/Validation/Constraint/CrosswordFileValidator.php
<?php
namespace Drupal\crossword\Plugin\Validation\Constraint;
use Drupal\Core\Entity\EntityTypeManager;
use Drupal\crossword\CrosswordException;
use Psr\Log\LoggerInterface;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\crossword\CrosswordFileParserManagerInterface;
/**
* Validates the crossword file.
*/
class CrosswordFileValidator extends ConstraintValidator implements ContainerInjectionInterface {
/**
* Crossword Parser manager service.
*
* @var \Drupal\crossword\CrosswordFileParserManagerInterface
*/
protected $parserManager;
/**
* File storage.
*
* @var \Drupal\Core\Entity\EntityStorageInterface
*/
protected $fileStorage;
/**
* A logger instance.
*
* @var \Psr\Log\LoggerInterface
*/
protected $logger;
/**
* Create an instance of the validator.
*
* @param \Drupal\crossword\CrosswordFileParserManagerInterface $parser_manager
* The parser manager service.
* @param \Drupal\Core\Entity\EntityTypeManager $entity_type_manager
* Entity type manager.
* @param \Psr\Log\LoggerInterface $logger
* A logger instance.
*/
public function __construct(CrosswordFileParserManagerInterface $parser_manager, EntityTypeManager $entity_type_manager, LoggerInterface $logger) {
$this->parserManager = $parser_manager;
$this->fileStorage = $entity_type_manager->getStorage('file');
$this->logger = $logger;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('crossword.manager.parser'),
$container->get('entity_type.manager'),
$container->get('logger.factory')->get('crossword')
);
}
/**
* {@inheritdoc}
*/
public function validate($items, Constraint $constraint) {
$allowed_parsers = $items->getFieldDefinition()->getSetting('allowed_parsers');
$allowed_parser_definitions = $this->parserManager->loadDefinitionsFromOptionList($allowed_parsers);
foreach ($items as $item) {
if (get_class($item) == "Drupal\Core\TypedData\Plugin\DataType\IntegerData") {
$file = $this->fileStorage->load($item->getCastedValue());
if ($definition = $this->parserManager->filterApplicableDefinitions($allowed_parser_definitions, $file)) {
/** @var $parser \Drupal\crossword\CrosswordFileParserPluginInterface */
$parser = $this->parserManager->createInstance($definition['id'], ['fid' => $file->id()]);
try {
$data = $parser->parse();
}
catch (CrosswordException $e) {
$this->logger->error('The %parser parser failed parsing file with id %id: %message', ['%parser' => $parser->getPluginId(), '%id' => $file->id(), '%message' => $e->getMessage()]);
$this->context->addViolation($constraint->corrupted, ['%parser' => $definition['title'], '%message' => $e->getMessage()]);
}
}
else {
$this->context->addViolation($constraint->noParser);
}
}
}
}
}
