155 lines
3.8 KiB
PHP
155 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-2011 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
|
||
|
* @return void
|
||
|
*/
|
||
|
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;
|
||
|
$i=0;
|
||
|
// 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_FileNotFound('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_FileNotFound $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]);
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|