From 28c74495c8a2d5a2b63d02b90a973027f0da8caa Mon Sep 17 00:00:00 2001 From: dannylamb Date: Mon, 3 Jun 2019 17:58:15 +0000 Subject: [PATCH] Adding describes url to messages and enforcing language neutrality in a few more places. --- islandora.services.yml | 6 ++-- src/EventGenerator/EventGenerator.php | 32 +++++++++++++++++-- src/EventSubscriber/LinkHeaderSubscriber.php | 14 +++++++- .../MediaLinkHeaderSubscriber.php | 3 +- .../NodeLinkHeaderSubscriber.php | 29 +++++++++++------ tests/src/Kernel/EventGeneratorTest.php | 27 ++++++++++------ 6 files changed, 85 insertions(+), 26 deletions(-) diff --git a/islandora.services.yml b/islandora.services.yml index fb7026bf..b88d186b 100644 --- a/islandora.services.yml +++ b/islandora.services.yml @@ -3,7 +3,7 @@ services: islandora.eventgenerator: class: Drupal\islandora\EventGenerator\EventGenerator - arguments: ['@language_manager'] + arguments: ['@language_manager', '@islandora.media_source_service'] islandora.stomp: class: Stomp\StatefulStomp factory: ['Drupal\islandora\StompFactory', create] @@ -16,12 +16,12 @@ services: - { name: event_subscriber } islandora.media_link_header_subscriber: class: Drupal\islandora\EventSubscriber\MediaLinkHeaderSubscriber - arguments: ['@entity_type.manager', '@entity_field.manager', '@access_manager', '@current_user', '@current_route_match', '@request_stack'] + arguments: ['@entity_type.manager', '@entity_field.manager', '@access_manager', '@current_user', '@current_route_match', '@request_stack', '@language_manager'] tags: - { name: event_subscriber } islandora.node_link_header_subscriber: class: Drupal\islandora\EventSubscriber\NodeLinkHeaderSubscriber - arguments: ['@entity_type.manager', '@entity_field.manager', '@access_manager', '@current_user', '@current_route_match', '@request_stack', '@islandora.utils'] + arguments: ['@entity_type.manager', '@entity_field.manager', '@access_manager', '@current_user', '@current_route_match', '@request_stack', '@language_manager', '@islandora.utils'] tags: - { name: event_subscriber } islandora.admin_view_route_subscriber: diff --git a/src/EventGenerator/EventGenerator.php b/src/EventGenerator/EventGenerator.php index ac258163..a9e4ac66 100644 --- a/src/EventGenerator/EventGenerator.php +++ b/src/EventGenerator/EventGenerator.php @@ -5,6 +5,7 @@ namespace Drupal\islandora\EventGenerator; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Language\LanguageManagerInterface; use Drupal\Core\Url; +use Drupal\islandora\MediaSource\MediaSourceService; use Drupal\user\UserInterface; /** @@ -21,14 +22,24 @@ class EventGenerator implements EventGeneratorInterface { */ protected $languageManager; + /** + * Media source service. + * + * @var \Drupal\islandora\MediaSource\MediaSourceService + */ + protected $mediaSource; + /** * Constructor. * * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager * Language manager. + * @param \Drupal\islandora\MediaSource\MediaSourceService $media_source + * Media source service. */ - public function __construct(LanguageManagerInterface $language_manager) { + public function __construct(LanguageManagerInterface $language_manager, MediaSourceService $media_source) { $this->languageManager = $language_manager; + $this->mediaSource = $media_source; } /** @@ -39,12 +50,13 @@ class EventGenerator implements EventGeneratorInterface { $user_url = $user->toUrl()->setAbsolute()->toString(); $entity_type = $entity->getEntityTypeId(); + $undefined = $this->languageManager->getLanguage('und'); + if ($entity_type == 'file') { - $entity_url = $entity->url(); + $entity_url = $entity->url('canonical', ['absolute' => TRUE, 'language' => $undefined]); $mimetype = $entity->getMimeType(); } else { - $undefined = $this->languageManager->getLanguage('und'); $entity_url = Url::fromRoute( "rest.entity.$entity_type.GET", [$entity_type => $entity->id()], @@ -111,6 +123,20 @@ class EventGenerator implements EventGeneratorInterface { ]; } + // Add a link to the file described by a media. + if ($entity_type == 'media') { + $file = $this->mediaSource->getSourceFile($entity); + if ($file) { + $event['object']['url'][] = [ + "name" => "Describes", + "type" => "Link", + "href" => $file->url('canonical', ['absolute' => TRUE, 'language' => $undefined]), + "mediaType" => $file->getMimeType(), + "rel" => "describes", + ]; + } + } + unset($data["event"]); unset($data["queue"]); diff --git a/src/EventSubscriber/LinkHeaderSubscriber.php b/src/EventSubscriber/LinkHeaderSubscriber.php index 3ff64d4b..6bb184fd 100644 --- a/src/EventSubscriber/LinkHeaderSubscriber.php +++ b/src/EventSubscriber/LinkHeaderSubscriber.php @@ -6,6 +6,7 @@ use Drupal\Core\Access\AccessManagerInterface; use Drupal\Core\Entity\EntityFieldManager; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityTypeManager; +use Drupal\Core\Language\LanguageManagerInterface; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Session\AccountInterface; use Drupal\Core\Url; @@ -64,6 +65,13 @@ abstract class LinkHeaderSubscriber implements EventSubscriberInterface { */ protected $requestStack; + /** + * Language manager. + * + * @var \Drupal\Core\Language\LanguageManagerInterface + */ + protected $languageManager; + /** * Constructor. * @@ -79,6 +87,8 @@ abstract class LinkHeaderSubscriber implements EventSubscriberInterface { * The route match object. * @param Symfony\Component\HttpFoundation\RequestStack $request_stack * Request stack (for current request). + * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager + * Language manager. */ public function __construct( EntityTypeManager $entity_type_manager, @@ -86,7 +96,8 @@ abstract class LinkHeaderSubscriber implements EventSubscriberInterface { AccessManagerInterface $access_manager, AccountInterface $account, RouteMatchInterface $route_match, - RequestStack $request_stack + RequestStack $request_stack, + LanguageManagerInterface $language_manager ) { $this->entityTypeManager = $entity_type_manager; $this->entityFieldManager = $entity_field_manager; @@ -96,6 +107,7 @@ abstract class LinkHeaderSubscriber implements EventSubscriberInterface { $this->accessManager = $access_manager; $this->account = $account; $this->requestStack = $request_stack; + $this->languageManager = $language_manager; } /** diff --git a/src/EventSubscriber/MediaLinkHeaderSubscriber.php b/src/EventSubscriber/MediaLinkHeaderSubscriber.php index 16e286e2..6e344f0d 100644 --- a/src/EventSubscriber/MediaLinkHeaderSubscriber.php +++ b/src/EventSubscriber/MediaLinkHeaderSubscriber.php @@ -77,9 +77,10 @@ class MediaLinkHeaderSubscriber extends LinkHeaderSubscriber implements EventSub } // Collect file links for the media. + $undefined = $this->languageManager->getLanguage('und'); foreach ($media->get($source_field)->referencedEntities() as $referencedEntity) { if ($referencedEntity->access('view')) { - $file_url = $referencedEntity->url('canonical', ['absolute' => TRUE]); + $file_url = $referencedEntity->url('canonical', ['absolute' => TRUE, 'language' => $undefined]); $links[] = "<$file_url>; rel=\"describes\"; type=\"{$referencedEntity->getMimeType()}\""; } } diff --git a/src/EventSubscriber/NodeLinkHeaderSubscriber.php b/src/EventSubscriber/NodeLinkHeaderSubscriber.php index e49b4cc1..4d898f8f 100644 --- a/src/EventSubscriber/NodeLinkHeaderSubscriber.php +++ b/src/EventSubscriber/NodeLinkHeaderSubscriber.php @@ -5,8 +5,10 @@ namespace Drupal\islandora\EventSubscriber; use Drupal\Core\Access\AccessManagerInterface; use Drupal\Core\Entity\EntityFieldManager; use Drupal\Core\Entity\EntityTypeManager; +use Drupal\Core\Language\LanguageManagerInterface; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Session\AccountInterface; +use Drupal\Core\Url; use Drupal\islandora\IslandoraUtils; use Drupal\node\NodeInterface; use Symfony\Component\HttpKernel\Event\FilterResponseEvent; @@ -42,6 +44,8 @@ class NodeLinkHeaderSubscriber extends LinkHeaderSubscriber implements EventSubs * The route match object. * @param Symfony\Component\HttpFoundation\RequestStack $request_stack * Request stack (for current request). + * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager + * Language manager. * @param \Drupal\islandora\IslandoraUtils $utils * Derivative utils. */ @@ -52,16 +56,18 @@ class NodeLinkHeaderSubscriber extends LinkHeaderSubscriber implements EventSubs AccountInterface $account, RouteMatchInterface $route_match, RequestStack $request_stack, + LanguageManagerInterface $language_manager, IslandoraUtils $utils ) { - $this->entityTypeManager = $entity_type_manager; - $this->entityFieldManager = $entity_field_manager; - $this->accessManager = $access_manager; - $this->account = $account; - $this->routeMatch = $route_match; - $this->accessManager = $access_manager; - $this->account = $account; - $this->requestStack = $request_stack; + parent::__construct( + $entity_type_manager, + $entity_field_manager, + $access_manager, + $account, + $route_match, + $request_stack, + $language_manager + ); $this->utils = $utils; } @@ -99,8 +105,13 @@ class NodeLinkHeaderSubscriber extends LinkHeaderSubscriber implements EventSubs */ protected function generateRelatedMediaLinks(NodeInterface $node) { $links = []; + $undefined = $this->languageManager->getLanguage('und'); foreach ($this->utils->getMedia($node) as $media) { - $url = $media->url('canonical', ['absolute' => TRUE]); + $url = Url::fromRoute( + "rest.entity.media.GET", + ['media' => $media->id()], + ['absolute' => TRUE, 'language' => $undefined] + )->toString(); foreach ($media->referencedEntities() as $term) { if ($term->getEntityTypeId() == 'taxonomy_term' && $term->hasField('field_external_uri')) { $field = $term->get('field_external_uri'); diff --git a/tests/src/Kernel/EventGeneratorTest.php b/tests/src/Kernel/EventGeneratorTest.php index c5703f3f..21491be0 100644 --- a/tests/src/Kernel/EventGeneratorTest.php +++ b/tests/src/Kernel/EventGeneratorTest.php @@ -64,7 +64,10 @@ class EventGeneratorTest extends IslandoraKernelTestBase { $this->entity->save(); // Create the event generator so we can test it. - $this->eventGenerator = new EventGenerator($this->container->get('language_manager')); + $this->eventGenerator = new EventGenerator( + $this->container->get('language_manager'), + $this->container->get('islandora.media_source_service') + ); } /** @@ -146,9 +149,12 @@ class EventGeneratorTest extends IslandoraKernelTestBase { foreach ($msg['actor']['url'] as $url) { $this->assertTrue($url['type'] == 'Link', "'url' entries must have type 'Link'"); $this->assertTrue( - $url['mediaType'] == 'application/ld+json' || $url['mediaType'] == 'text/html', - "'url' entries must be either html or jsonld" - ); + in_array( + $url['mediaType'], + ['application/json', 'application/ld+json', 'text/html'] + ), + "'url' entries must be either html, json, or jsonld" + ); } // Make sure the object exists and is a uri. @@ -158,13 +164,16 @@ class EventGeneratorTest extends IslandoraKernelTestBase { $msg["object"]["id"] == "urn:uuid:{$this->entity->uuid()}", "Id must be an URN with entity's UUID" ); - $this->assertTrue(array_key_exists("url", $msg["actor"]), "Object must have 'url' key."); - foreach ($msg['actor']['url'] as $url) { + $this->assertTrue(array_key_exists("url", $msg["object"]), "Object must have 'url' key."); + foreach ($msg['object']['url'] as $url) { $this->assertTrue($url['type'] == 'Link', "'url' entries must have type 'Link'"); $this->assertTrue( - $url['mediaType'] == 'application/ld+json' || $url['mediaType'] == 'text/html', - "'url' entries must be either html or jsonld" - ); + in_array( + $url['mediaType'], + ['application/json', 'application/ld+json', 'text/html'] + ), + "'url' entries must be either html, json, or jsonld" + ); } }