Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 23 additions & 6 deletions src/Porter.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,13 @@
use ScriptFUSION\Porter\Collection\PorterRecords;
use ScriptFUSION\Porter\Collection\ProviderRecords;
use ScriptFUSION\Porter\Collection\RecordCollection;
use ScriptFUSION\Porter\Connector\Connector;
use ScriptFUSION\Porter\Connector\RecoverableConnectorException;
use ScriptFUSION\Porter\Provider\ForeignResourceException;
use ScriptFUSION\Porter\Provider\ObjectNotCreatedException;
use ScriptFUSION\Porter\Provider\Provider;
use ScriptFUSION\Porter\Provider\ProviderFactory;
use ScriptFUSION\Porter\Provider\ProviderOptions;
use ScriptFUSION\Porter\Provider\Resource\ProviderResource;
use ScriptFUSION\Porter\Specification\ImportSpecification;
use ScriptFUSION\Porter\Transform\Transformer;
Expand Down Expand Up @@ -108,12 +111,26 @@ private function fetch(
) {
$provider = $this->getProvider($providerName ?: $resource->getProviderClassName());

$this->applyCacheAdvice($provider, $cacheAdvice);
if ($resource->getProviderClassName() !== get_class($provider)) {
throw new ForeignResourceException(sprintf(
'Cannot fetch data from foreign resource: "%s".',
get_class($resource)
));
}

$this->applyCacheAdvice($provider->getConnector(), $cacheAdvice);

if (($records = \ScriptFUSION\Retry\retry(
$fetchAttempts,
function () use ($provider, $resource) {
if (($records = $provider->fetch($resource)) instanceof \Iterator) {
$records = $resource->fetch(
$provider->getConnector(),
$provider instanceof ProviderOptions
? clone $provider->getOptions()
: null
);

if ($records instanceof \Iterator) {
// Force generator to run until first yield to provoke an exception.
$records->valid();
}
Expand Down Expand Up @@ -173,22 +190,22 @@ private function createPorterRecords(RecordCollection $records, ImportSpecificat
return new PorterRecords($records, $specification);
}

private function applyCacheAdvice(Provider $provider, CacheAdvice $cacheAdvice)
private function applyCacheAdvice(Connector $connector, CacheAdvice $cacheAdvice)
{
try {
if (!$provider instanceof CacheToggle) {
if (!$connector instanceof CacheToggle) {
throw CacheUnavailableException::modify();
}

switch ("$cacheAdvice") {
case CacheAdvice::MUST_CACHE:
case CacheAdvice::SHOULD_CACHE:
$provider->enableCache();
$connector->enableCache();
break;

case CacheAdvice::MUST_NOT_CACHE:
case CacheAdvice::SHOULD_NOT_CACHE:
$provider->disableCache();
$connector->disableCache();
}
} catch (CacheUnavailableException $exception) {
if ($cacheAdvice === CacheAdvice::MUST_NOT_CACHE() ||
Expand Down
106 changes: 0 additions & 106 deletions src/Provider/AbstractProvider.php

This file was deleted.

12 changes: 5 additions & 7 deletions src/Provider/Provider.php
Original file line number Diff line number Diff line change
@@ -1,19 +1,17 @@
<?php
namespace ScriptFUSION\Porter\Provider;

use ScriptFUSION\Porter\Provider\Resource\ProviderResource;
use ScriptFUSION\Porter\Connector\Connector;

/**
* Provides a method for fetching data from a resource.
* Provides a method for accessing a connector.
*/
interface Provider
{
/**
* Fetches data from the specified resource.
* Gets a connector for accessing resource data.
*
* @param ProviderResource $resource Resource.
*
* @return \Iterator Enumerable data series.
* @return Connector
*/
public function fetch(ProviderResource $resource);
public function getConnector();
}
17 changes: 17 additions & 0 deletions src/Provider/ProviderOptions.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php
namespace ScriptFUSION\Porter\Provider;

use ScriptFUSION\Porter\Options\EncapsulatedOptions;

/**
* Provides a method for accessing provider options.
*/
interface ProviderOptions
{
/**
* Gets the provider options.
*
* @return EncapsulatedOptions
*/
public function getOptions();
}
11 changes: 9 additions & 2 deletions src/Provider/StaticDataProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,17 @@

use ScriptFUSION\Porter\Connector\NullConnector;

class StaticDataProvider extends AbstractProvider
class StaticDataProvider implements Provider
{
private $connector;

public function __construct()
{
parent::__construct(new NullConnector);
$this->connector = new NullConnector;
}

public function getConnector()
{
return $this->connector;
}
}
Loading