1*a1a3b679SAndreas Boehler<?php 2*a1a3b679SAndreas Boehler 3*a1a3b679SAndreas Boehlernamespace Sabre\DAV\Mock; 4*a1a3b679SAndreas Boehler 5*a1a3b679SAndreas Boehleruse Sabre\DAV; 6*a1a3b679SAndreas Boehler 7*a1a3b679SAndreas Boehler/** 8*a1a3b679SAndreas Boehler * Mock Collection. 9*a1a3b679SAndreas Boehler * 10*a1a3b679SAndreas Boehler * This collection quickly allows you to create trees of nodes. 11*a1a3b679SAndreas Boehler * Children are specified as an array. 12*a1a3b679SAndreas Boehler * 13*a1a3b679SAndreas Boehler * Every key a filename, every array value is either: 14*a1a3b679SAndreas Boehler * * an array, for a sub-collection 15*a1a3b679SAndreas Boehler * * a string, for a file 16*a1a3b679SAndreas Boehler * * An instance of \Sabre\DAV\INode. 17*a1a3b679SAndreas Boehler * 18*a1a3b679SAndreas Boehler * @copyright Copyright (C) 2007-2015 fruux GmbH (https://fruux.com/). 19*a1a3b679SAndreas Boehler * @author Evert Pot (http://evertpot.com/) 20*a1a3b679SAndreas Boehler * @license http://sabre.io/license/ Modified BSD License 21*a1a3b679SAndreas Boehler */ 22*a1a3b679SAndreas Boehlerclass Collection extends DAV\Collection { 23*a1a3b679SAndreas Boehler 24*a1a3b679SAndreas Boehler protected $name; 25*a1a3b679SAndreas Boehler protected $children; 26*a1a3b679SAndreas Boehler protected $parent; 27*a1a3b679SAndreas Boehler 28*a1a3b679SAndreas Boehler /** 29*a1a3b679SAndreas Boehler * Creates the object 30*a1a3b679SAndreas Boehler * 31*a1a3b679SAndreas Boehler * @param string $name 32*a1a3b679SAndreas Boehler * @param array $children 33*a1a3b679SAndreas Boehler * @return void 34*a1a3b679SAndreas Boehler */ 35*a1a3b679SAndreas Boehler function __construct($name, array $children = array(), Collection $parent = null) { 36*a1a3b679SAndreas Boehler 37*a1a3b679SAndreas Boehler $this->name = $name; 38*a1a3b679SAndreas Boehler foreach($children as $key=>$value) { 39*a1a3b679SAndreas Boehler if (is_string($value)) { 40*a1a3b679SAndreas Boehler $this->children[] = new File($key, $value, $this); 41*a1a3b679SAndreas Boehler } elseif (is_array($value)) { 42*a1a3b679SAndreas Boehler $this->children[] = new Collection($key, $value, $this); 43*a1a3b679SAndreas Boehler } elseif ($value instanceof \Sabre\DAV\INode) { 44*a1a3b679SAndreas Boehler $this->children[] = $value; 45*a1a3b679SAndreas Boehler } else { 46*a1a3b679SAndreas Boehler throw new \InvalidArgumentException('Unknown value passed in $children'); 47*a1a3b679SAndreas Boehler } 48*a1a3b679SAndreas Boehler } 49*a1a3b679SAndreas Boehler $this->parent = $parent; 50*a1a3b679SAndreas Boehler 51*a1a3b679SAndreas Boehler } 52*a1a3b679SAndreas Boehler 53*a1a3b679SAndreas Boehler /** 54*a1a3b679SAndreas Boehler * Returns the name of the node. 55*a1a3b679SAndreas Boehler * 56*a1a3b679SAndreas Boehler * This is used to generate the url. 57*a1a3b679SAndreas Boehler * 58*a1a3b679SAndreas Boehler * @return string 59*a1a3b679SAndreas Boehler */ 60*a1a3b679SAndreas Boehler function getName() { 61*a1a3b679SAndreas Boehler 62*a1a3b679SAndreas Boehler return $this->name; 63*a1a3b679SAndreas Boehler 64*a1a3b679SAndreas Boehler } 65*a1a3b679SAndreas Boehler 66*a1a3b679SAndreas Boehler /** 67*a1a3b679SAndreas Boehler * Creates a new file in the directory 68*a1a3b679SAndreas Boehler * 69*a1a3b679SAndreas Boehler * Data will either be supplied as a stream resource, or in certain cases 70*a1a3b679SAndreas Boehler * as a string. Keep in mind that you may have to support either. 71*a1a3b679SAndreas Boehler * 72*a1a3b679SAndreas Boehler * After successful creation of the file, you may choose to return the ETag 73*a1a3b679SAndreas Boehler * of the new file here. 74*a1a3b679SAndreas Boehler * 75*a1a3b679SAndreas Boehler * The returned ETag must be surrounded by double-quotes (The quotes should 76*a1a3b679SAndreas Boehler * be part of the actual string). 77*a1a3b679SAndreas Boehler * 78*a1a3b679SAndreas Boehler * If you cannot accurately determine the ETag, you should not return it. 79*a1a3b679SAndreas Boehler * If you don't store the file exactly as-is (you're transforming it 80*a1a3b679SAndreas Boehler * somehow) you should also not return an ETag. 81*a1a3b679SAndreas Boehler * 82*a1a3b679SAndreas Boehler * This means that if a subsequent GET to this new file does not exactly 83*a1a3b679SAndreas Boehler * return the same contents of what was submitted here, you are strongly 84*a1a3b679SAndreas Boehler * recommended to omit the ETag. 85*a1a3b679SAndreas Boehler * 86*a1a3b679SAndreas Boehler * @param string $name Name of the file 87*a1a3b679SAndreas Boehler * @param resource|string $data Initial payload 88*a1a3b679SAndreas Boehler * @return null|string 89*a1a3b679SAndreas Boehler */ 90*a1a3b679SAndreas Boehler function createFile($name, $data = null) { 91*a1a3b679SAndreas Boehler 92*a1a3b679SAndreas Boehler if (is_resource($data)) { 93*a1a3b679SAndreas Boehler $data = stream_get_contents($data); 94*a1a3b679SAndreas Boehler } 95*a1a3b679SAndreas Boehler $this->children[] = new File($name, $data, $this); 96*a1a3b679SAndreas Boehler return '"' . md5($data) . '"'; 97*a1a3b679SAndreas Boehler 98*a1a3b679SAndreas Boehler } 99*a1a3b679SAndreas Boehler 100*a1a3b679SAndreas Boehler /** 101*a1a3b679SAndreas Boehler * Creates a new subdirectory 102*a1a3b679SAndreas Boehler * 103*a1a3b679SAndreas Boehler * @param string $name 104*a1a3b679SAndreas Boehler * @return void 105*a1a3b679SAndreas Boehler */ 106*a1a3b679SAndreas Boehler function createDirectory($name) { 107*a1a3b679SAndreas Boehler 108*a1a3b679SAndreas Boehler $this->children[] = new Collection($name); 109*a1a3b679SAndreas Boehler 110*a1a3b679SAndreas Boehler } 111*a1a3b679SAndreas Boehler 112*a1a3b679SAndreas Boehler /** 113*a1a3b679SAndreas Boehler * Returns an array with all the child nodes 114*a1a3b679SAndreas Boehler * 115*a1a3b679SAndreas Boehler * @return \Sabre\DAV\INode[] 116*a1a3b679SAndreas Boehler */ 117*a1a3b679SAndreas Boehler function getChildren() { 118*a1a3b679SAndreas Boehler 119*a1a3b679SAndreas Boehler return $this->children; 120*a1a3b679SAndreas Boehler 121*a1a3b679SAndreas Boehler } 122*a1a3b679SAndreas Boehler 123*a1a3b679SAndreas Boehler /** 124*a1a3b679SAndreas Boehler * Removes a childnode from this node. 125*a1a3b679SAndreas Boehler * 126*a1a3b679SAndreas Boehler * @param string $name 127*a1a3b679SAndreas Boehler * @return void 128*a1a3b679SAndreas Boehler */ 129*a1a3b679SAndreas Boehler function deleteChild($name) { 130*a1a3b679SAndreas Boehler 131*a1a3b679SAndreas Boehler foreach($this->children as $key=>$value) { 132*a1a3b679SAndreas Boehler 133*a1a3b679SAndreas Boehler if ($value->getName() == $name) { 134*a1a3b679SAndreas Boehler unset($this->children[$key]); 135*a1a3b679SAndreas Boehler return; 136*a1a3b679SAndreas Boehler } 137*a1a3b679SAndreas Boehler 138*a1a3b679SAndreas Boehler } 139*a1a3b679SAndreas Boehler 140*a1a3b679SAndreas Boehler } 141*a1a3b679SAndreas Boehler 142*a1a3b679SAndreas Boehler /** 143*a1a3b679SAndreas Boehler * Deletes this collection and all its children,. 144*a1a3b679SAndreas Boehler * 145*a1a3b679SAndreas Boehler * @return void 146*a1a3b679SAndreas Boehler */ 147*a1a3b679SAndreas Boehler function delete() { 148*a1a3b679SAndreas Boehler 149*a1a3b679SAndreas Boehler foreach($this->getChildren() as $child) { 150*a1a3b679SAndreas Boehler $this->deleteChild($child->getName()); 151*a1a3b679SAndreas Boehler } 152*a1a3b679SAndreas Boehler $this->parent->deleteChild($this->getName()); 153*a1a3b679SAndreas Boehler 154*a1a3b679SAndreas Boehler } 155*a1a3b679SAndreas Boehler 156*a1a3b679SAndreas Boehler} 157