This repository has been archived by the owner on Nov 25, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 289
/
MetadataCachingStream.php
128 lines (98 loc) · 3.22 KB
/
MetadataCachingStream.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<?php
/**
* Created by PhpStorm.
* User: ghecquet
* Date: 21/06/16
* Time: 09:39
*/
namespace Pydio\Access\Core\Stream;
use GuzzleHttp\Stream\StreamDecoratorTrait;
use GuzzleHttp\Stream\StreamInterface;
use Pydio\Access\Core\Model\AJXP_Node;
use Pydio\Cache\Core\AbstractCacheDriver;
use Pydio\Core\Services\CacheService;
/**
* Stream decorator that can cache previously read bytes from a sequentially
* read stream.
*/
class MetadataCachingStream implements StreamInterface
{
use StreamDecoratorTrait;
/** @var array stat */
private static $stat;
/** @var AJXP_Node node */
private $node;
/** @var string uri */
private $uri;
/** @var array contentFilters */
private $contentFilters;
/** @var string path */
private $path;
/** @var array statCacheId */
private $cacheOptions;
/**
* We will treat the buffer object as the body of the stream
*
* @param StreamInterface $stream Stream to cache
* @param AJXP_Node $node
* @param StreamInterface $target
*/
public function __construct(
StreamInterface $stream,
AJXP_Node $node,
StreamInterface $target = null
) {
$this->node = $node;
$this->uri = $node->getUrl();
$this->cacheOptions = AbstractCacheDriver::getOptionsForNode($node, "meta");
$this->contentFilters = $node->getRepository()->getContentFilter()->filters;
$this->path = parse_url($this->uri, PHP_URL_PATH);
$this->stream = $stream;
$this->stat();
}
public function getSize() {
$stat = $this->stat();
if (isset($stat["size"])) {
return (int) $stat["size"];
}
return null;
}
public function getLastModifiedTime() {
$stat = $this->stat();
if (isset($stat["mtime"])) {
return (int) $stat["mtime"];
}
return null;
}
public function isFile() {
$stat = $this->stat();
if (isset($stat["type"])) {
return ($stat["type"] != "folder");
}
return null;
}
public function getContents() {
return $this->stream->getContents();
}
public function stat() {
$stat = CacheService::fetch(AJXP_CACHE_SERVICE_NS_NODES, $this->cacheOptions["id"]);
if(is_array($stat)) return $stat;
$stats = $this->stream->stat();
// Some APIs will return us multiple uri to avoid having to send multiple requests
// So storing them in a local cache
if (is_array($stats[0])) {
foreach ($stats as $stat) {
$path = "/" . $stat["name"];
if (isset($this->contentFilters[$path])) {
$path = $this->contentFilters[$path];
}
$node = new AJXP_Node($this->uri . "/" . $path);
$id = AbstractCacheDriver::getOptionsForNode($node, "meta")["id"];
CacheService::save(AJXP_CACHE_SERVICE_NS_NODES, $id, $stat);
}
} else {
CacheService::save(AJXP_CACHE_SERVICE_NS_NODES, $this->cacheOptions["id"], $stats, $this->cacheOptions["timelimit"]);
}
return CacheService::fetch(AJXP_CACHE_SERVICE_NS_NODES, $this->cacheOptions["id"]);
}
}