friendica-addons/dav/SabreDAV/lib/Sabre/DAV/ObjectTree.php

154 lines
3.8 KiB
PHP

<?php
/**
* ObjectTree class
*
* This implementation of the Tree class makes use of the INode, IFile and ICollection API's
*
* @package Sabre
* @subpackage DAV
* @copyright Copyright (C) 2007-2012 Rooftop Solutions. All rights reserved.
* @author Evert Pot (http://www.rooftopsolutions.nl/)
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
*/
class Sabre_DAV_ObjectTree extends Sabre_DAV_Tree {
/**
* The root node
*
* @var Sabre_DAV_ICollection
*/
protected $rootNode;
/**
* This is the node cache. Accessed nodes are stored here
*
* @var array
*/
protected $cache = array();
/**
* Creates the object
*
* This method expects the rootObject to be passed as a parameter
*
* @param Sabre_DAV_ICollection $rootNode
*/
public function __construct(Sabre_DAV_ICollection $rootNode) {
$this->rootNode = $rootNode;
}
/**
* Returns the INode object for the requested path
*
* @param string $path
* @return Sabre_DAV_INode
*/
public function getNodeForPath($path) {
$path = trim($path,'/');
if (isset($this->cache[$path])) return $this->cache[$path];
//if (!$path || $path=='.') return $this->rootNode;
$currentNode = $this->rootNode;
// We're splitting up the path variable into folder/subfolder components and traverse to the correct node..
foreach(explode('/',$path) as $pathPart) {
// If this part of the path is just a dot, it actually means we can skip it
if ($pathPart=='.' || $pathPart=='') continue;
if (!($currentNode instanceof Sabre_DAV_ICollection))
throw new Sabre_DAV_Exception_NotFound('Could not find node at path: ' . $path);
$currentNode = $currentNode->getChild($pathPart);
}
$this->cache[$path] = $currentNode;
return $currentNode;
}
/**
* This function allows you to check if a node exists.
*
* @param string $path
* @return bool
*/
public function nodeExists($path) {
try {
// The root always exists
if ($path==='') return true;
list($parent, $base) = Sabre_DAV_URLUtil::splitPath($path);
$parentNode = $this->getNodeForPath($parent);
if (!$parentNode instanceof Sabre_DAV_ICollection) return false;
return $parentNode->childExists($base);
} catch (Sabre_DAV_Exception_NotFound $e) {
return false;
}
}
/**
* Returns a list of childnodes for a given path.
*
* @param string $path
* @return array
*/
public function getChildren($path) {
$node = $this->getNodeForPath($path);
$children = $node->getChildren();
foreach($children as $child) {
$this->cache[trim($path,'/') . '/' . $child->getName()] = $child;
}
return $children;
}
/**
* This method is called with every tree update
*
* Examples of tree updates are:
* * node deletions
* * node creations
* * copy
* * move
* * renaming nodes
*
* If Tree classes implement a form of caching, this will allow
* them to make sure caches will be expired.
*
* If a path is passed, it is assumed that the entire subtree is dirty
*
* @param string $path
* @return void
*/
public function markDirty($path) {
// We don't care enough about sub-paths
// flushing the entire cache
$path = trim($path,'/');
foreach($this->cache as $nodePath=>$node) {
if ($nodePath == $path || strpos($nodePath,$path.'/')===0)
unset($this->cache[$nodePath]);
}
}
}