Skip to content

Commit

Permalink
Improved item export executors
Browse files Browse the repository at this point in the history
  • Loading branch information
pkruithof committed Apr 24, 2015
1 parent 9744627 commit 867459c
Show file tree
Hide file tree
Showing 3 changed files with 149 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@
use Symfony\Component\OptionsResolver\Exception\InvalidArgumentException;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
use TreeHouse\WorkerBundle\Executor\AbstractExecutor;
use TreeHouse\IoBundle\Export\FeedExporter;
use TreeHouse\WorkerBundle\Executor\AbstractExecutor;
use TreeHouse\WorkerBundle\Executor\ObjectPayloadInterface;

class ExportItemExecutor extends AbstractExecutor
class ItemExportExecutor extends AbstractExecutor implements ObjectPayloadInterface
{
const NAME = "export.item";
const NAME = 'item.export';

/**
* @var FeedExporter
Expand All @@ -33,6 +34,33 @@ public function __construct(FeedExporter $exporter, ManagerRegistry $doctrine)
$this->doctrine = $doctrine;
}

/**
* @inheritdoc
*/
public function getName()
{
return self::NAME;
}

/**
* @inheritdoc
*/
public function supportsObject($object)
{
return $this->exporter->supports($object);
}

/**
* @inheritdoc
*/
public function getObjectPayload($object)
{
$class = get_class($object);
$meta = $this->doctrine->getManagerForClass($class)->getClassMetadata($class);

return [$class, $meta->getIdentifierValues($object)];
}

/**
* @inheritdoc
*/
Expand All @@ -41,10 +69,10 @@ public function configurePayload(OptionsResolver $resolver)
$resolver->setRequired(0);
$resolver->setRequired(1);
$resolver->setAllowedTypes(0, 'string');
$resolver->setAllowedTypes(1, 'numeric');
$resolver->setAllowedTypes(1, 'array');
$resolver->setNormalizer(1, function (Options $options, $value) {
$class = $options[0];
if (null === $item = $this->doctrine->getRepository($class)->find($value)) {
if (null === $item = $this->doctrine->getRepository($class)->findOneBy($value)) {
throw new InvalidArgumentException(sprintf('Could not find %s with id %d', $class, $value));
}

Expand All @@ -61,12 +89,4 @@ public function execute(array $payload)

return $this->exporter->cacheItem($item, [], true);
}

/**
* @return string
*/
public function getName()
{
return self::NAME;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
<?php

namespace TreeHouse\IoBundle\Bridge\WorkerBundle\Executor;

use Doctrine\Common\Persistence\ManagerRegistry;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
use TreeHouse\IoBundle\Export\FeedExporter;
use TreeHouse\WorkerBundle\Executor\AbstractExecutor;
use TreeHouse\WorkerBundle\Executor\ObjectPayloadInterface;

class ItemExportRemoveExecutor extends AbstractExecutor implements ObjectPayloadInterface
{
const NAME = 'item.export.remove';

/**
* @var FeedExporter
*/
protected $exporter;

/**
* @var ManagerRegistry
*/
protected $doctrine;

/**
* @param FeedExporter $exporter
* @param ManagerRegistry $doctrine
*/
public function __construct(FeedExporter $exporter, ManagerRegistry $doctrine)
{
$this->exporter = $exporter;
$this->doctrine = $doctrine;
}

/**
* @inheritdoc
*/
public function getName()
{
return self::NAME;
}

/**
* @inheritdoc
*/
public function supportsObject($object)
{
return $this->exporter->supports($object);
}

/**
* @inheritdoc
*/
public function getObjectPayload($object)
{
$class = get_class($object);
$meta = $this->doctrine->getManagerForClass($class)->getClassMetadata($class);

return [$class, $meta->getIdentifierValues($object)];
}

/**
* @inheritdoc
*/
public function configurePayload(OptionsResolver $resolver)
{
$resolver->setRequired(0);
$resolver->setRequired(1);
$resolver->setAllowedTypes(0, 'string');
$resolver->setAllowedTypes(1, 'array');
$resolver->setNormalizer(1, function (Options $options, $value) {
$class = $options[0];

// use a reference if the item does not exist anymore:
// maybe we're cleaning up after it's been removed
if (null === $item = $this->doctrine->getRepository($class)->findOneBy($value)) {
/** @var EntityManagerInterface $manager */
$manager = $this->doctrine->getManagerForClass($class);
$item = $manager->getReference($class, $value);
}

return $item;
});
}

/**
* @inheritdoc
*/
public function execute(array $payload)
{
$item = $payload[1];

// remove export directory
foreach ($this->exporter->getTypes() as $type) {
if ($type->supports($item)) {
$dir = dirname($this->exporter->getItemCacheFilename($item, $type));
(new Filesystem())->remove($dir);
}
}

return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ parameters:
tree_house.io.worker.listener.scrape_source.class: TreeHouse\IoBundle\Bridge\WorkerBundle\EventListener\ScrapeSourceListener
tree_house.io.worker.listener.rate_limit.class: TreeHouse\IoBundle\Bridge\WorkerBundle\EventListener\ScrapeRateLimitListener
tree_house.io.queue.executor.import_schedule.class: TreeHouse\IoBundle\Bridge\WorkerBundle\Executor\ImportScheduleExecutor
tree_house.io.queue.executor.export_item.class: TreeHouse\IoBundle\Bridge\WorkerBundle\Executor\ExportItemExecutor
tree_house.io.queue.executor.export_item.class: TreeHouse\IoBundle\Bridge\WorkerBundle\Executor\ItemExportExecutor
tree_house.io.queue.executor.export_item_remove.class: TreeHouse\IoBundle\Bridge\WorkerBundle\Executor\ItemExportRemoveExecutor
tree_house.io.queue.executor.import_part.class: TreeHouse\IoBundle\Bridge\WorkerBundle\Executor\ImportPartExecutor
tree_house.io.queue.executor.scrape_url.class: TreeHouse\IoBundle\Bridge\WorkerBundle\Executor\ScrapeUrlExecutor
tree_house.io.queue.executor.scrape_source_revisit.class: TreeHouse\IoBundle\Bridge\WorkerBundle\Executor\ScrapeRevisitSourceExecutor
Expand Down Expand Up @@ -48,6 +49,14 @@ services:
tags:
- { name: tree_house.worker.executor }

tree_house.io.worker.executor.export_item_remove:
class: %tree_house.io.queue.executor.export_item_remove.class%
arguments:
- @tree_house.io.export.feed_exporter
- @doctrine
tags:
- { name: tree_house.worker.executor }

tree_house.io.worker.executor.import_part:
class: %tree_house.io.queue.executor.import_part.class%
arguments:
Expand Down

0 comments on commit 867459c

Please sign in to comment.