php-vfs/src/Stream/AbstractHandle.php

113 lines
2.6 KiB
PHP

<?php
/*
* This file is part of VFS
*
* Copyright (c) 2015 Andrew Lawson <http://adlawson.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Vfs\Stream;
use Vfs\FileSystemInterface;
use Vfs\Node\NodeInterface;
abstract class AbstractHandle implements HandleInterface
{
protected $fs;
protected $node;
protected $mode;
protected $modifier;
protected $path;
protected $scheme;
protected $url;
/**
* @param FileSystemInterface $fs
* @param string $url
* @param string $mode
*/
public function __construct(FileSystemInterface $fs, $url, $mode = null)
{
$this->fs = $fs;
$this->url = $url;
list($this->mode, $this->modifier) = $this->parseMode($mode);
list($this->scheme, $this->path) = $this->parseUrl($url);
}
public function getNode()
{
return $this->node;
}
public function rename($target)
{
$this->node = $this->findNode($this->path);
$parent = $this->fs->get(dirname($this->path));
list($_, $targetPath) = $this->parseUrl($target);
$targetParent = $this->fs->get(dirname($targetPath));
if (!$this->node || !$targetPath) {
$this->node = null;
$this->warn('rename({origin},{target}): No such file or directory', [
'origin' => $this->url,
'target' => $target
]);
} else {
$parent->remove(basename($this->path));
$targetParent->add(basename($targetPath), $this->node);
}
return $this->node;
}
/**
* @return NodeInterface
*/
protected function findNode()
{
return $this->fs->get($this->path);
}
/**
* @param string $mode
* @return string[]
*/
protected function parseMode($mode)
{
return [substr($mode, 0, 1), substr($mode, 1, 2)];
}
/**
* @param string $url
* @return string[]
*/
protected function parseUrl($url)
{
$parts = parse_url($url);
$path = null;
$scheme = null;
if (isset($parts['scheme'])) {
$scheme = $parts['scheme'];
} else {
$scheme = strstr($url, '://', true);
}
$path = '/' . ltrim(substr($url, strlen($scheme)), ':\/');
return [$scheme, $path];
}
/**
* @param string $message
* @param array $context
*/
protected function warn($message, array $context = [])
{
$this->fs->getLogger()->warning($message, $context);
}
}