123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- <?php
- namespace Drupal\aggregator;
- use Drupal\aggregator\Plugin\AggregatorPluginManager;
- use Drupal\Component\Plugin\Exception\PluginException;
- use Drupal\Core\Config\ConfigFactoryInterface;
- use Psr\Log\LoggerInterface;
- /**
- * Defines an importer of aggregator items.
- */
- class ItemsImporter implements ItemsImporterInterface {
- /**
- * The aggregator fetcher manager.
- *
- * @var \Drupal\aggregator\Plugin\AggregatorPluginManager
- */
- protected $fetcherManager;
- /**
- * The aggregator processor manager.
- *
- * @var \Drupal\aggregator\Plugin\AggregatorPluginManager
- */
- protected $processorManager;
- /**
- * The aggregator parser manager.
- *
- * @var \Drupal\aggregator\Plugin\AggregatorPluginManager
- */
- protected $parserManager;
- /**
- * The aggregator.settings config object.
- *
- * @var \Drupal\Core\Config\Config
- */
- protected $config;
- /**
- * A logger instance.
- *
- * @var \Psr\Log\LoggerInterface
- */
- protected $logger;
- /**
- * Constructs an Importer object.
- *
- * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
- * The factory for configuration objects.
- * @param \Drupal\aggregator\Plugin\AggregatorPluginManager $fetcher_manager
- * The aggregator fetcher plugin manager.
- * @param \Drupal\aggregator\Plugin\AggregatorPluginManager $parser_manager
- * The aggregator parser plugin manager.
- * @param \Drupal\aggregator\Plugin\AggregatorPluginManager $processor_manager
- * The aggregator processor plugin manager.
- * @param \Psr\Log\LoggerInterface $logger
- * A logger instance.
- */
- public function __construct(ConfigFactoryInterface $config_factory, AggregatorPluginManager $fetcher_manager, AggregatorPluginManager $parser_manager, AggregatorPluginManager $processor_manager, LoggerInterface $logger) {
- $this->fetcherManager = $fetcher_manager;
- $this->processorManager = $processor_manager;
- $this->parserManager = $parser_manager;
- $this->config = $config_factory->get('aggregator.settings');
- $this->logger = $logger;
- }
- /**
- * {@inheritdoc}
- */
- public function delete(FeedInterface $feed) {
- foreach ($this->processorManager->getDefinitions() as $id => $definition) {
- $this->processorManager->createInstance($id)->delete($feed);
- }
- }
- /**
- * {@inheritdoc}
- */
- public function refresh(FeedInterface $feed) {
- // Store feed URL to track changes.
- $feed_url = $feed->getUrl();
- // Fetch the feed.
- try {
- $success = $this->fetcherManager->createInstance($this->config->get('fetcher'))->fetch($feed);
- }
- catch (PluginException $e) {
- $success = FALSE;
- watchdog_exception('aggregator', $e);
- }
- // Store instances in an array so we dont have to instantiate new objects.
- $processor_instances = [];
- foreach ($this->config->get('processors') as $processor) {
- try {
- $processor_instances[$processor] = $this->processorManager->createInstance($processor);
- }
- catch (PluginException $e) {
- watchdog_exception('aggregator', $e);
- }
- }
- // We store the hash of feed data in the database. When refreshing a
- // feed we compare stored hash and new hash calculated from downloaded
- // data. If both are equal we say that feed is not updated.
- $hash = hash('sha256', $feed->source_string);
- $has_new_content = $success && ($feed->getHash() != $hash);
- if ($has_new_content) {
- // Parse the feed.
- try {
- if ($this->parserManager->createInstance($this->config->get('parser'))->parse($feed)) {
- if (!$feed->getWebsiteUrl()) {
- $feed->setWebsiteUrl($feed->getUrl());
- }
- $feed->setHash($hash);
- // Update feed with parsed data.
- $feed->save();
- // Log if feed URL has changed.
- if ($feed->getUrl() != $feed_url) {
- $this->logger->notice('Updated URL for feed %title to %url.', ['%title' => $feed->label(), '%url' => $feed->getUrl()]);
- }
- $this->logger->notice('There is new syndicated content from %site.', ['%site' => $feed->label()]);
- // If there are items on the feed, let enabled processors process them.
- if (!empty($feed->items)) {
- foreach ($processor_instances as $instance) {
- $instance->process($feed);
- }
- }
- }
- }
- catch (PluginException $e) {
- watchdog_exception('aggregator', $e);
- }
- }
- // Processing is done, call postProcess on enabled processors.
- foreach ($processor_instances as $instance) {
- $instance->postProcess($feed);
- }
- return $has_new_content;
- }
- }
|