protected function getFeed($url, $node)
 {
     $transport = TransportFactory::createTransportFromUrl($url);
     $reader = new XmlReader(new FileResource($transport));
     $reader->setNodeCallback($node);
     return new Feed($reader);
 }
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $id = $input->getArgument('id');
     $force = $input->getOption('force');
     $manager = $this->importManager;
     $doctrine = $manager->getEntityManager();
     /** @var $feed Feed */
     if (null === ($feed = $doctrine->find('FMIoBundle:Feed', $id))) {
         $output->writeln(sprintf('<error>Feed with id "%d" does not exist</error>', $id));
         return 1;
     }
     if ($input->isInteractive()) {
         $this->checkForUnfinishedImports($feed, $output);
     }
     $manager->getLogger()->getLogger()->pushHandler(new ConsoleHandler($output));
     $this->setOutputEvents($manager->getEventDispatcher(), $output);
     // schedule all resources
     $dispatcher = $manager->getEventDispatcher();
     $import = $manager->createImport($feed, null, $force);
     $reader = $manager->createImportReader($import, $dispatcher, $manager->getReaderOptions($import));
     $output->writeln(sprintf('Created import with id <info>%d</info>, start importing parts', $import->getId()));
     try {
         while ($reader->getResources()->count()) {
             $resource = $reader->getResources()->dequeue();
             $transportConfig = TransportFactory::createConfigFromTransport($resource->getTransport());
             $manager->createImportPart($import, $transportConfig);
             $output->writeln(sprintf('=> <comment>%s</comment> (<comment>%d</comment> resources left)', (string) $resource->getTransport(), $reader->getResources()->count()));
         }
     } catch (FeedException $e) {
         $output->writeln(sprintf('<error>%s</error>', $e->getMessage()));
     }
     foreach ($import->getParts() as $part) {
         $output->writeln(sprintf('Importing part <comment>%d</comment>', $part->getPosition()));
         $manager->import($part);
     }
     return 0;
 }
Example #3
0
 /**
  * @param  array                    $transportConfig
  * @param  string                   $destinationDir
  * @param  EventDispatcherInterface $dispatcher
  * @return Transport
  */
 protected function createTransport(array $transportConfig, $destinationDir, EventDispatcherInterface $dispatcher)
 {
     $transport = TransportFactory::createTransportFromConfig($transportConfig);
     $transport->setDestinationDir($destinationDir);
     $transport->setEventDispatcher($dispatcher);
     return $transport;
 }
 /**
  * @param OutputInterface $output
  * @param array           $feeds
  * @param integer         $minutes
  * @param boolean         $force
  *
  * @return integer
  */
 protected function scheduleImports(OutputInterface $output, array $feeds, $minutes, $force = false)
 {
     if (empty($feeds)) {
         return 0;
     }
     $repo = $this->getFeedRepository();
     $manager = $this->importManager;
     $num = 0;
     $factor = $minutes / sizeof($feeds);
     foreach ($feeds as $id => $priority) {
         /** @var Feed $feed */
         $feed = $repo->find($id);
         $offset = round($factor * $num++);
         $date = new \DateTime(sprintf('+%d minutes', $offset));
         $output->writeln(sprintf('Scheduling import for <info>%s</info> feed <info>%d</info> to run at <info>%s</info>', $feed->getOrigin()->getName(), $feed->getId(), $date->format('Y-m-d H:i:s')));
         // schedule all resources
         try {
             $dispatcher = $manager->getEventDispatcher();
             $import = $manager->createImport($feed, $date, $force);
             $reader = $manager->createImportReader($import, $dispatcher, $manager->getReaderOptions($import));
         } catch (\RuntimeException $e) {
             // we could get an exception when a new import cannot be created, for example when an existing import
             // for this feed is still running.
             $output->writeln(sprintf('<error>%s</error>', $e->getMessage()));
             continue;
         }
         $output->writeln(sprintf('Created import <info>%d</info>, adding parts...', $import->getId()));
         try {
             while ($reader->getResources()->count()) {
                 $resource = $reader->getResources()->dequeue();
                 $transportConfig = TransportFactory::createConfigFromTransport($resource->getTransport());
                 $manager->createImportPart($import, $transportConfig, $date);
                 $output->writeln(sprintf('=> <comment>%s</comment> (<comment>%d</comment> resources left)', (string) $resource->getTransport(), $reader->getResources()->count()));
             }
         } catch (FeedException $e) {
             $output->writeln(sprintf('<error>%s</error>', $e->getMessage()));
         }
         if ($import->getParts()->count() === 0) {
             $output->writeln('No parts created, finishing import now');
             $manager->startImport($import);
             $manager->finishImport($import);
             continue;
         }
         $output->write('Scheduling jobs for all parts...');
         foreach ($import->getParts() as $part) {
             $delay = $date->getTimestamp() - time();
             if ($delay < 0) {
                 $delay = 0;
             }
             $this->queueManager->addForObject(ImportPartExecutor::NAME, $part, $delay);
         }
         $output->writeln(' <info>done!</info>');
     }
     return 0;
 }
 /**
  * @param Feed                     $feed
  * @param string                   $fixtureName
  * @param EventDispatcherInterface $dispatcher
  * @param array                    $options
  *
  * @return ReaderInterface
  */
 protected function createReader(Feed $feed, $fixtureName, EventDispatcherInterface $dispatcher, array $options = [])
 {
     $readerType = $this->getImportRegistry()->getReaderType($feed->getReaderType());
     $refl = new \ReflectionClass(get_class($this));
     $xml = sprintf('%s/fixtures/%s/%s.xml', dirname($refl->getFileName()), $feed->getType(), $fixtureName);
     $transportConfig = TransportFactory::createConfigFromFile($xml);
     $builder = new ReaderBuilder($dispatcher, sys_get_temp_dir() . '/' . $feed->getType());
     return $builder->build($readerType, $transportConfig, $builder::RESOURCE_TYPE_MAIN, $options);
 }