Completed
Push — master ( da0794...b20e0d )
by Carlos C
02:40
created

AbstractBaseRetriever   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 108
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 2

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 16
lcom 2
cbo 2
dl 0
loc 108
ccs 38
cts 38
cp 1
rs 10
c 0
b 0
f 0

11 Methods

Rating   Name   Duplication   Size   Complexity  
checkIsValidDownloadedFile() 0 1 ?
A __construct() 0 5 2
A getBasePath() 0 4 1
A getDownloader() 0 4 1
A setDownloader() 0 4 1
A buildPath() 0 7 2
B download() 0 24 4
A retrieveHistory() 0 4 1
A clearHistory() 0 4 1
A addToHistory() 0 4 1
A urlParts() 0 8 2
1
<?php
2
namespace XmlResourceRetriever;
3
4
use XmlResourceRetriever\Downloader\DownloaderInterface;
5
use XmlResourceRetriever\Downloader\PhpDownloader;
6
7
/**
8
 * This is an abstract base imlementation of RetrieverInterface
9
 *
10
 * It contains basic helper functions and implement for construct, getters, setters, history, buildPath and download
11
 * There are other type of resources that could be retrieved and might use all this logic
12
 */
13
abstract class AbstractBaseRetriever implements RetrieverInterface
14
{
15
    /** @var string */
16
    private $basePath;
17
18
    /** @var DownloaderInterface */
19
    private $downloader;
20
21
    /**
22
     * This variable stores the list of retrieved resources to avoid infinite recursion
23
     * @var array
24
     */
25
    private $history = [];
26
27
    /**
28
     * This method checks if the recently downloaded file from $source located at $path
29
     * is a valid resource, if not will remove the file and throw an exception
30
     *
31
     * @param string $source
32
     * @param string $localpath
33
     * @throws \RuntimeException when the source is not valid
34
     */
35
    abstract protected function checkIsValidDownloadedFile(string $source, string $localpath);
36
37
    /**
38
     * Retriever constructor.
39
     *
40
     * @param string $basePath
41
     * @param DownloaderInterface $downloader
42
     */
43 16
    public function __construct($basePath, DownloaderInterface $downloader = null)
44
    {
45 16
        $this->basePath = $basePath;
46 16
        $this->setDownloader($downloader ? : new PhpDownloader());
47 16
    }
48
49 2
    public function getBasePath(): string
50
    {
51 2
        return $this->basePath;
52
    }
53
54 1
    public function getDownloader(): DownloaderInterface
55
    {
56 1
        return $this->downloader;
57
    }
58
59 16
    public function setDownloader(DownloaderInterface $downloader)
60
    {
61 16
        $this->downloader = $downloader;
62 16
    }
63
64 13
    public function buildPath(string $url): string
65
    {
66 13
        if (false === $parts = $this->urlParts($url)) {
67 3
            throw new \InvalidArgumentException("Invalid URL: $url");
68
        }
69 10
        return $this->basePath . '/' . $parts['host'] . '/' . ltrim($parts['path'], '/');
70
    }
71
72 10
    public function download(string $resource): string
73
    {
74
        // validate resource
75 10
        if ('' === $resource) {
76 1
            throw new \UnexpectedValueException('The argument to download is empty');
77
        }
78
79
        // set destination
80 9
        $localPath = $this->buildPath($resource);
81
82
        // create local path
83 9
        $dirname = dirname($localPath);
84 9
        if (! is_dir($dirname) && ! @mkdir($dirname, 0777, true)) {
85 1
            throw new \RuntimeException("Unable to create directory $dirname");
86
        }
87
88
        // download the file into its final destination
89 8
        $this->downloader->downloadTo($resource, $localPath);
90
91
        // check content is valid
92 7
        $this->checkIsValidDownloadedFile($resource, $localPath);
93
94 6
        return $localPath;
95
    }
96
97 3
    public function retrieveHistory(): array
98
    {
99 3
        return $this->history;
100
    }
101
102 4
    protected function clearHistory()
103
    {
104 4
        $this->history = [];
105 4
    }
106
107 4
    protected function addToHistory(string $source, string $localpath)
108
    {
109 4
        $this->history[$source] = $localpath;
110 4
    }
111
112 13
    protected function urlParts(string $url)
113
    {
114 13
        $options = FILTER_FLAG_SCHEME_REQUIRED | FILTER_FLAG_HOST_REQUIRED | FILTER_FLAG_PATH_REQUIRED;
115 13
        if (false === filter_var($url, FILTER_VALIDATE_URL, $options)) {
116 4
            return false;
117
        }
118 10
        return parse_url($url);
119
    }
120
}
121