# DirectoryBuilder.class.php

Go to the documentation of this file.

    00001 <?php
    00002 /***************************************************************************
    00003  *   Copyright (C) 2009 by Ivan Y. Khvostishkov                            *
    00004  *                                                                         *
    00005  *   This program is free software; you can redistribute it and/or modify  *
    00006  *   it under the terms of the GNU Lesser General Public License as        *
    00007  *   published by the Free Software Foundation; either version 3 of the    *
    00008  *   License, or (at your option) any later version.                       *
    00009  *                                                                         *
    00010  ***************************************************************************/
    00011
    00012     abstract class DirectoryBuilder extends PrototypedBuilder
    00013     {
    00014         protected $directory    = null;
    00015         protected $permissions  = 0700;
    00016         protected $identityMap  = null;
    00017
    00018         public function __construct(EntityProto $proto)
    00019         {
    00020             parent::__construct($proto);
    00021
    00022             $this->identityMap = new DirectoryContext;
    00023         }
    00024
    00025         public function setDirectory($directory)
    00026         {
    00027             $this->directory = $directory;
    00028
    00029             return $this;
    00030         }
    00031
    00032         public function getDirectory()
    00033         {
    00034             return $this->directory;
    00035         }
    00036
    00037         public function setPermissions($permissions)
    00038         {
    00039             $this->permissions = $permissions;
    00040
    00041             return $this;
    00042         }
    00043
    00044         public function getPermissions()
    00045         {
    00046             return $this->permissions;
    00047         }
    00048
    00049         public function setIdentityMap(DirectoryContext $identityMap)
    00050         {
    00051             $this->identityMap = $identityMap;
    00052
    00053             return $this;
    00054         }
    00055
    00056         public function getIdentityMap()
    00057         {
    00058             return $this->identityMap;
    00059         }
    00060
    00064         public function cloneBuilder(EntityProto $proto)
    00065         {
    00066             $result = parent::cloneBuilder($proto);
    00067
    00068             $result->
    00069                 setDirectory($this->directory)->
    00070                 setPermissions($this->permissions)->
    00071                 setIdentityMap($this->identityMap);
    00072
    00073             return $result;
    00074         }
    00075
    00076         public function cloneInnerBuilder($property)
    00077         {
    00078             $this->checkDirectory();
    00079
    00080             $result = parent::cloneInnerBuilder($property);
    00081
    00082             $result->
    00083                 setDirectory($this->directory.'/'.$property)->
    00084                 setPermissions($this->permissions)->
    00085                 setIdentityMap($this->identityMap);
    00086
    00087             return $result;
    00088         }
    00089
    00090         public function makeListItemBuilder($object)
    00091         {
    00092             $this->checkDirectory();
    00093
    00094             if (!$object instanceof Identifiable)
    00095                 throw new WrongArgumentException(
    00096                     'cannot build list of items without identity'
    00097                 );
    00098
    00099             return $this->cloneBuilder($this->proto)->
    00100                 setPermissions($this->permissions)->
    00101                 setDirectory($this->directory.'/'.$object->getId());
    00102         }
    00103
    00104         protected function createEmpty()
    00105         {
    00106             $result = $this->directory;
    00107
    00108             if (!file_exists($result))
    00109                 mkdir($result, $this->permissions, true);
    00110             elseif (is_link($result)) {
    00111                 throw new WrongStateException(
    00112                     'cannot make object by reference: '.$this->directory
    00113                 );
    00114             }
    00115
    00116             return $result;
    00117         }
    00118
    00119         protected function safeClean()
    00120         {
    00121             if (file_exists($this->directory) || is_link($this->directory)) {
    00122                 if (!is_link($this->directory)) {
    00123                     throw new WrongStateException(
    00124                         'you should remove the storage '
    00125                         .$this->directory
    00126                         .' by your hands'
    00127                     );
    00128                 }
    00129
    00130                 unlink($this->directory);
    00131             }
    00132
    00133             return $this;
    00134         }
    00135
    00136         protected function checkDirectory()
    00137         {
    00138             if (!$this->directory)
    00139                 throw new WrongStateException(
    00140                     'you must specify the context for this builder'
    00141                 );
    00142
    00143             return $this;
    00144         }
    00145     }
    00146 ?>