123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- <?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]);
- }
- }
- }
|