<?php namespace Drupal\islandora\Plugin\Action; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityTypeManager; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Session\AccountInterface; use Drupal\Core\Url; use Drupal\islandora\IslandoraUtils; use Drupal\islandora\EventGenerator\EmitEvent; use Drupal\islandora\EventGenerator\EventGeneratorInterface; use Drupal\islandora\MediaSource\MediaSourceService; use Drupal\jwt\Authentication\Provider\JwtAuth; use Drupal\token\Token; use Stomp\StatefulStomp; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Emits a Node event. */ class AbstractGenerateDerivative extends EmitEvent { /** * Islandora utility functions. * * @var \Drupal\islandora\IslandoraUtils */ protected $utils; /** * Media source service. * * @var \Drupal\islandora\MediaSource\MediaSourceService */ protected $mediaSource; /** * Token replacement service. * * @var \Drupal\token\Token */ protected $token; /** * Constructs a EmitEvent action. * * @param array $configuration * A configuration array containing information about the plugin instance. * @param string $plugin_id * The plugin_id for the plugin instance. * @param mixed $plugin_definition * The plugin implementation definition. * @param \Drupal\Core\Session\AccountInterface $account * Current user. * @param \Drupal\Core\Entity\EntityTypeManager $entity_type_manager * Entity type manager. * @param \Drupal\islandora\EventGenerator\EventGeneratorInterface $event_generator * EventGenerator service to serialize AS2 events. * @param \Stomp\StatefulStomp $stomp * Stomp client. * @param \Drupal\jwt\Authentication\Provider\JwtAuth $auth * JWT Auth client. * @param \Drupal\islandora\IslandoraUtils $utils * Islandora utility functions. * @param \Drupal\islandora\MediaSource\MediaSourceService $media_source * Media source service. * @param \Drupal\token\Token $token * Token service. */ public function __construct( array $configuration, $plugin_id, $plugin_definition, AccountInterface $account, EntityTypeManager $entity_type_manager, EventGeneratorInterface $event_generator, StatefulStomp $stomp, JwtAuth $auth, IslandoraUtils $utils, MediaSourceService $media_source, Token $token ) { parent::__construct( $configuration, $plugin_id, $plugin_definition, $account, $entity_type_manager, $event_generator, $stomp, $auth ); $this->utils = $utils; $this->mediaSource = $media_source; $this->token = $token; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { return new static( $configuration, $plugin_id, $plugin_definition, $container->get('current_user'), $container->get('entity_type.manager'), $container->get('islandora.eventgenerator'), $container->get('islandora.stomp'), $container->get('jwt.authentication.jwt'), $container->get('islandora.utils'), $container->get('islandora.media_source_service'), $container->get('token') ); } /** * {@inheritdoc} */ public function defaultConfiguration() { return [ 'queue' => 'islandora-connector-houdini', 'event' => 'Generate Derivative', 'source_term_uri' => '', 'derivative_term_uri' => '', 'mimetype' => '', 'args' => '', 'scheme' => file_default_scheme(), 'path' => '[date:custom:Y]-[date:custom:m]/[node:nid].bin', ]; } /** * Override this to return arbitrary data as an array to be json encoded. */ protected function generateData(EntityInterface $entity) { $data = parent::generateData($entity); // Find media belonging to node that has the source term, and set its file // url in the data array. $source_term = $this->utils->getTermForUri($this->configuration['source_term_uri']); if (!$source_term) { throw new \RuntimeException("Could not locate source term with uri" . $this->configuration['source_term_uri'], 500); } $source_media = $this->utils->getMediaWithTerm($entity, $source_term); if (!$source_media) { throw new \RuntimeException("Could not locate source media", 500); } $source_file = $this->mediaSource->getSourceFile($source_media); if (!$source_file) { throw new \RuntimeException("Could not locate source file for media {$source_media->id()}", 500); } $data['source_uri'] = $source_file->url('canonical', ['absolute' => TRUE]); // Find the term for the derivative and use it to set the destination url // in the data array. $derivative_term = $this->utils->getTermForUri($this->configuration['derivative_term_uri']); if (!$source_term) { throw new \RuntimeException("Could not locate derivative term with uri" . $this->configuration['derivative_term_uri'], 500); } $route_params = [ 'node' => $entity->id(), 'media_type' => $source_media->bundle(), 'taxonomy_term' => $derivative_term->id(), ]; $data['destination_uri'] = Url::fromRoute('islandora.media_source_put_to_node', $route_params) ->setAbsolute() ->toString(); $token_data = [ 'node' => $entity, 'media' => $source_media, 'term' => $derivative_term, ]; $path = $this->token->replace($data['path'], $token_data); $data['file_upload_uri'] = $data['scheme'] . '://' . $path; // Get rid of some config so we just pass along // what the camel route and microservice need. unset($data['source_term_uri']); unset($data['derivative_term_uri']); unset($data['path']); unset($data['scheme']); return $data; } /** * {@inheritdoc} */ public function buildConfigurationForm(array $form, FormStateInterface $form_state) { $schemes = $this->utils->getFilesystemSchemes(); $scheme_options = array_combine($schemes, $schemes); $form = parent::buildConfigurationForm($form, $form_state); $form['event']['#disabled'] = 'disabled'; $form['source_term'] = [ '#type' => 'entity_autocomplete', '#target_type' => 'taxonomy_term', '#title' => t('Source term'), '#default_value' => $this->utils->getTermForUri($this->configuration['source_term_uri']), '#required' => TRUE, '#description' => t('Term indicating the source media'), ]; $form['derivative_term'] = [ '#type' => 'entity_autocomplete', '#target_type' => 'taxonomy_term', '#title' => t('Derivative term'), '#default_value' => $this->utils->getTermForUri($this->configuration['derivative_term_uri']), '#required' => TRUE, '#description' => t('Term indicating the derivative media'), ]; $form['mimetype'] = [ '#type' => 'textfield', '#title' => t('Mimetype'), '#default_value' => $this->configuration['mimetype'], '#required' => TRUE, '#rows' => '8', '#description' => t('Mimetype to convert to (e.g. image/jpeg, video/mp4, etc...)'), ]; $form['args'] = [ '#type' => 'textfield', '#title' => t('Additional arguments'), '#default_value' => $this->configuration['args'], '#rows' => '8', '#description' => t('Additional command line arguments'), ]; $form['scheme'] = [ '#type' => 'select', '#title' => t('File system'), '#options' => $scheme_options, '#default_value' => $this->configuration['scheme'], '#required' => TRUE, ]; $form['path'] = [ '#type' => 'textfield', '#title' => t('File path'), '#default_value' => $this->configuration['path'], '#description' => t('Path within the upload destination where files will be stored. Includes the filename and optional extension.'), ]; $form['queue'] = [ '#type' => 'textfield', '#title' => t('Queue name'), '#default_value' => $this->configuration['queue'], '#description' => t('Queue name to send along to help routing events, CHANGE WITH CARE. Defaults to :queue', [ ':queue' => $this->defaultConfiguration()['queue'], ]), ]; return $form; } /** * {@inheritdoc} */ public function validateConfigurationForm(array &$form, FormStateInterface $form_state) { parent::validateConfigurationForm($form, $form_state); $exploded_mime = explode('/', $form_state->getValue('mimetype')); if (count($exploded_mime) != 2) { $form_state->setErrorByName( 'mimetype', t('Please enter a mimetype (e.g. image/jpeg, video/mp4, audio/mp3, etc...)') ); } if (empty($exploded_mime[1])) { $form_state->setErrorByName( 'mimetype', t('Please enter a mimetype (e.g. image/jpeg, video/mp4, audio/mp3, etc...)') ); } } /** * {@inheritdoc} */ public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { parent::submitConfigurationForm($form, $form_state); $tid = $form_state->getValue('source_term'); $term = $this->entityTypeManager->getStorage('taxonomy_term')->load($tid); $this->configuration['source_term_uri'] = $this->utils->getUriForTerm($term); $tid = $form_state->getValue('derivative_term'); $term = $this->entityTypeManager->getStorage('taxonomy_term')->load($tid); $this->configuration['derivative_term_uri'] = $this->utils->getUriForTerm($term); $this->configuration['mimetype'] = $form_state->getValue('mimetype'); $this->configuration['args'] = $form_state->getValue('args'); $this->configuration['scheme'] = $form_state->getValue('scheme'); $this->configuration['path'] = trim($form_state->getValue('path'), '\\/'); } }