summaryrefslogtreecommitdiff
path: root/framework/Caching
diff options
context:
space:
mode:
Diffstat (limited to 'framework/Caching')
-rw-r--r--framework/Caching/TApplicationStateCacheDependency.php40
-rw-r--r--framework/Caching/TCache.php426
-rw-r--r--framework/Caching/TCacheDependency.php43
-rw-r--r--framework/Caching/TCacheDependencyList.php42
-rw-r--r--framework/Caching/TChainedCacheDependency.php59
-rw-r--r--framework/Caching/TDirectoryCacheDependency.php170
-rw-r--r--framework/Caching/TFileCacheDependency.php73
-rw-r--r--framework/Caching/TGlobalStateCacheDependency.php66
8 files changed, 494 insertions, 425 deletions
diff --git a/framework/Caching/TApplicationStateCacheDependency.php b/framework/Caching/TApplicationStateCacheDependency.php
new file mode 100644
index 00000000..a5a3f764
--- /dev/null
+++ b/framework/Caching/TApplicationStateCacheDependency.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * TCache and cache dependency classes.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright &copy; 2005-2014 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @package System.Caching
+ */
+
+
+/**
+ * TApplicationStateCacheDependency class.
+ *
+ * TApplicationStateCacheDependency performs dependency checking based on
+ * the mode of the currently running PRADO application.
+ * The dependency is reportedly as unchanged if and only if the application
+ * is running in performance mode.
+ *
+ * You may chain this dependency together with other dependencies
+ * so that only when the application is not in performance mode the other dependencies
+ * will be checked.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @package System.Caching
+ * @since 3.1.0
+ */
+class TApplicationStateCacheDependency extends TCacheDependency
+{
+ /**
+ * Performs the actual dependency checking.
+ * This method returns true if the currently running application is not in performance mode.
+ * @return boolean whether the dependency is changed or not.
+ */
+ public function getHasChanged()
+ {
+ return Prado::getApplication()->getMode()!==TApplicationMode::Performance;
+ }
+} \ No newline at end of file
diff --git a/framework/Caching/TCache.php b/framework/Caching/TCache.php
index 99b3f24c..10e28f6c 100644
--- a/framework/Caching/TCache.php
+++ b/framework/Caching/TCache.php
@@ -283,428 +283,4 @@ abstract class TCache extends TModule implements ICache, ArrayAccess
{
$this->delete($id);
}
-}
-
-
-/**
- * TCacheDependency class.
- *
- * TCacheDependency is the base class implementing {@link ICacheDependency} interface.
- * Descendant classes must implement {@link getHasChanged()} to provide
- * actual dependency checking logic.
- *
- * The property value of {@link getHasChanged HasChanged} tells whether
- * the dependency is changed or not.
- *
- * You may disable the dependency checking by setting {@link setEnabled Enabled}
- * to false.
- *
- * Note, since the dependency objects often need to be serialized so that
- * they can persist across requests, you may need to implement __sleep() and
- * __wakeup() if the dependency objects contain resource handles which are
- * not serializable.
- *
- * Currently, the following dependency classes are provided in the PRADO release:
- * - {@link TFileCacheDependency}: checks whether a file is changed or not
- * - {@link TDirectoryCacheDependency}: checks whether a directory is changed or not
- * - {@link TGlobalStateCacheDependency}: checks whether a global state is changed or not
- * - {@link TChainedCacheDependency}: checks whether any of a list of dependencies is changed or not
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @package System.Caching
- * @since 3.1.0
- */
-abstract class TCacheDependency extends TComponent implements ICacheDependency
-{
-}
-
-
-/**
- * TFileCacheDependency class.
- *
- * TFileCacheDependency performs dependency checking based on the
- * last modification time of the file specified via {@link setFileName FileName}.
- * The dependency is reported as unchanged if and only if the file's
- * last modification time remains unchanged.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @package System.Caching
- * @since 3.1.0
- */
-class TFileCacheDependency extends TCacheDependency
-{
- private $_fileName;
- private $_timestamp;
-
- /**
- * Constructor.
- * @param string name of the file whose change is to be checked.
- */
- public function __construct($fileName)
- {
- $this->setFileName($fileName);
- }
-
- /**
- * @return string the name of the file whose change is to be checked
- */
- public function getFileName()
- {
- return $this->_fileName;
- }
-
- /**
- * @param string the name of the file whose change is to be checked
- */
- public function setFileName($value)
- {
- $this->_fileName=$value;
- $this->_timestamp=@filemtime($value);
- }
-
- /**
- * @return int the last modification time of the file
- */
- public function getTimestamp()
- {
- return $this->_timestamp;
- }
-
- /**
- * Performs the actual dependency checking.
- * This method returns true if the last modification time of the file is changed.
- * @return boolean whether the dependency is changed or not.
- */
- public function getHasChanged()
- {
- return @filemtime($this->_fileName)!==$this->_timestamp;
- }
-}
-
-/**
- * TDirectoryCacheDependency class.
- *
- * TDirectoryCacheDependency performs dependency checking based on the
- * modification time of the files contained in the specified directory.
- * The directory being checked is specified via {@link setDirectory Directory}.
- *
- * By default, all files under the specified directory and subdirectories
- * will be checked. If the last modification time of any of them is changed
- * or if different number of files are contained in a directory, the dependency
- * is reported as changed. By specifying {@link setRecursiveCheck RecursiveCheck}
- * and {@link setRecursiveLevel RecursiveLevel}, one can limit the checking
- * to a certain depth of the subdirectories.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @package System.Caching
- * @since 3.1.0
- */
-class TDirectoryCacheDependency extends TCacheDependency
-{
- private $_recursiveCheck=true;
- private $_recursiveLevel=-1;
- private $_timestamps;
- private $_directory;
-
- /**
- * Constructor.
- * @param string the directory to be checked
- */
- public function __construct($directory)
- {
- $this->setDirectory($directory);
- }
-
- /**
- * @return string the directory to be checked
- */
- public function getDirectory()
- {
- return $this->_directory;
- }
-
- /**
- * @param string the directory to be checked
- * @throws TInvalidDataValueException if the directory does not exist
- */
- public function setDirectory($directory)
- {
- if(($path=realpath($directory))===false || !is_dir($path))
- throw new TInvalidDataValueException('directorycachedependency_directory_invalid',$directory);
- $this->_directory=$path;
- $this->_timestamps=$this->generateTimestamps($path);
- }
-
- /**
- * @return boolean whether the subdirectories of the directory will also be checked.
- * It defaults to true.
- */
- public function getRecursiveCheck()
- {
- return $this->_recursiveCheck;
- }
-
- /**
- * @param boolean whether the subdirectories of the directory will also be checked.
- */
- public function setRecursiveCheck($value)
- {
- $this->_recursiveCheck=TPropertyValue::ensureBoolean($value);
- }
-
- /**
- * @return int the depth of the subdirectories to be checked.
- * It defaults to -1, meaning unlimited depth.
- */
- public function getRecursiveLevel()
- {
- return $this->_recursiveLevel;
- }
-
- /**
- * Sets a value indicating the depth of the subdirectories to be checked.
- * This is meaningful only when {@link getRecursiveCheck RecursiveCheck}
- * is true.
- * @param int the depth of the subdirectories to be checked.
- * If the value is less than 0, it means unlimited depth.
- * If the value is 0, it means checking the files directly under the specified directory.
- */
- public function setRecursiveLevel($value)
- {
- $this->_recursiveLevel=TPropertyValue::ensureInteger($value);
- }
-
- /**
- * Performs the actual dependency checking.
- * This method returns true if the directory is changed.
- * @return boolean whether the dependency is changed or not.
- */
- public function getHasChanged()
- {
- return $this->generateTimestamps($this->_directory)!=$this->_timestamps;
- }
-
- /**
- * Checks to see if the file should be checked for dependency.
- * This method is invoked when dependency of the whole directory is being checked.
- * By default, it always returns true, meaning the file should be checked.
- * You may override this method to check only certain files.
- * @param string the name of the file that may be checked for dependency.
- * @return boolean whether this file should be checked.
- */
- protected function validateFile($fileName)
- {
- return true;
- }
-
- /**
- * Checks to see if the specified subdirectory should be checked for dependency.
- * This method is invoked when dependency of the whole directory is being checked.
- * By default, it always returns true, meaning the subdirectory should be checked.
- * You may override this method to check only certain subdirectories.
- * @param string the name of the subdirectory that may be checked for dependency.
- * @return boolean whether this subdirectory should be checked.
- */
- protected function validateDirectory($directory)
- {
- return true;
- }
-
- /**
- * Determines the last modification time for files under the directory.
- * This method may go recursively into subdirectories if
- * {@link setRecursiveCheck RecursiveCheck} is set true.
- * @param string the directory name
- * @param int level of the recursion
- * @return array list of file modification time indexed by the file path
- */
- protected function generateTimestamps($directory,$level=0)
- {
- if(($dir=opendir($directory))===false)
- throw new TIOException('directorycachedependency_directory_invalid',$directory);
- $timestamps=array();
- while(($file=readdir($dir))!==false)
- {
- $path=$directory.DIRECTORY_SEPARATOR.$file;
- if($file==='.' || $file==='..')
- continue;
- else if(is_dir($path))
- {
- if(($this->_recursiveLevel<0 || $level<$this->_recursiveLevel) && $this->validateDirectory($path))
- $timestamps=array_merge($this->generateTimestamps($path,$level+1));
- }
- else if($this->validateFile($path))
- $timestamps[$path]=filemtime($path);
- }
- closedir($dir);
- return $timestamps;
- }
-}
-
-
-/**
- * TGlobalStateCacheDependency class.
- *
- * TGlobalStateCacheDependency checks if a global state is changed or not.
- * If the global state is changed, the dependency is reported as changed.
- * To specify which global state this dependency should check with,
- * set {@link setStateName StateName} to the name of the global state.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @package System.Caching
- * @since 3.1.0
- */
-class TGlobalStateCacheDependency extends TCacheDependency
-{
- private $_stateName;
- private $_stateValue;
-
- /**
- * Constructor.
- * @param string the name of the global state
- */
- public function __construct($name)
- {
- $this->setStateName($name);
- }
-
- /**
- * @return string the name of the global state
- */
- public function getStateName()
- {
- return $this->_stateName;
- }
-
- /**
- * @param string the name of the global state
- * @see TApplication::setGlobalState
- */
- public function setStateName($value)
- {
- $this->_stateName=$value;
- $this->_stateValue=Prado::getApplication()->getGlobalState($value);
- }
-
- /**
- * Performs the actual dependency checking.
- * This method returns true if the specified global state is changed.
- * @return boolean whether the dependency is changed or not.
- */
- public function getHasChanged()
- {
- return $this->_stateValue!==Prado::getApplication()->getGlobalState($this->_stateName);
- }
-}
-
-
-/**
- * TChainedCacheDependency class.
- *
- * TChainedCacheDependency represents a list of cache dependency objects
- * and performs the dependency checking based on the checking results of
- * these objects. If any of them reports a dependency change, TChainedCacheDependency
- * will return true for the checking.
- *
- * To add dependencies to TChainedCacheDependency, use {@link getDependencies Dependencies}
- * which gives a {@link TCacheDependencyList} instance and can be used like an array
- * (see {@link TList} for more details}).
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @package System.Caching
- * @since 3.1.0
- */
-class TChainedCacheDependency extends TCacheDependency
-{
- private $_dependencies=null;
-
- /**
- * @return TCacheDependencyList list of dependency objects
- */
- public function getDependencies()
- {
- if($this->_dependencies===null)
- $this->_dependencies=new TCacheDependencyList;
- return $this->_dependencies;
- }
-
- /**
- * Performs the actual dependency checking.
- * This method returns true if any of the dependency objects
- * reports a dependency change.
- * @return boolean whether the dependency is changed or not.
- */
- public function getHasChanged()
- {
- if($this->_dependencies!==null)
- {
- foreach($this->_dependencies as $dependency)
- if($dependency->getHasChanged())
- return true;
- }
- return false;
- }
-}
-
-
-/**
- * TApplicationStateCacheDependency class.
- *
- * TApplicationStateCacheDependency performs dependency checking based on
- * the mode of the currently running PRADO application.
- * The dependency is reportedly as unchanged if and only if the application
- * is running in performance mode.
- *
- * You may chain this dependency together with other dependencies
- * so that only when the application is not in performance mode the other dependencies
- * will be checked.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @package System.Caching
- * @since 3.1.0
- */
-class TApplicationStateCacheDependency extends TCacheDependency
-{
- /**
- * Performs the actual dependency checking.
- * This method returns true if the currently running application is not in performance mode.
- * @return boolean whether the dependency is changed or not.
- */
- public function getHasChanged()
- {
- return Prado::getApplication()->getMode()!==TApplicationMode::Performance;
- }
-}
-
-/**
- * TCacheDependencyList class.
- *
- * TCacheDependencyList represents a list of cache dependency objects.
- * Only objects implementing {@link ICacheDependency} can be added into this list.
- *
- * TCacheDependencyList can be used like an array. See {@link TList}
- * for more details.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @package System.Caching
- * @since 3.1.0
- */
-class TCacheDependencyList extends TList
-{
- /**
- * Inserts an item at the specified position.
- * This overrides the parent implementation by performing additional type checking
- * for each newly added item.
- * @param integer the specified position.
- * @param mixed new item
- * @throws TInvalidDataTypeException if the item to be inserted is not a dependency instance
- */
- public function insertAt($index,$item)
- {
- if($item instanceof ICacheDependency)
- parent::insertAt($index,$item);
- else
- throw new TInvalidDataTypeException('cachedependencylist_cachedependency_required');
- }
-}
-
+} \ No newline at end of file
diff --git a/framework/Caching/TCacheDependency.php b/framework/Caching/TCacheDependency.php
new file mode 100644
index 00000000..269bedf2
--- /dev/null
+++ b/framework/Caching/TCacheDependency.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * TCache and cache dependency classes.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright &copy; 2005-2014 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @package System.Caching
+ */
+
+
+/**
+ * TCacheDependency class.
+ *
+ * TCacheDependency is the base class implementing {@link ICacheDependency} interface.
+ * Descendant classes must implement {@link getHasChanged()} to provide
+ * actual dependency checking logic.
+ *
+ * The property value of {@link getHasChanged HasChanged} tells whether
+ * the dependency is changed or not.
+ *
+ * You may disable the dependency checking by setting {@link setEnabled Enabled}
+ * to false.
+ *
+ * Note, since the dependency objects often need to be serialized so that
+ * they can persist across requests, you may need to implement __sleep() and
+ * __wakeup() if the dependency objects contain resource handles which are
+ * not serializable.
+ *
+ * Currently, the following dependency classes are provided in the PRADO release:
+ * - {@link TFileCacheDependency}: checks whether a file is changed or not
+ * - {@link TDirectoryCacheDependency}: checks whether a directory is changed or not
+ * - {@link TGlobalStateCacheDependency}: checks whether a global state is changed or not
+ * - {@link TChainedCacheDependency}: checks whether any of a list of dependencies is changed or not
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @package System.Caching
+ * @since 3.1.0
+ */
+abstract class TCacheDependency extends TComponent implements ICacheDependency
+{
+} \ No newline at end of file
diff --git a/framework/Caching/TCacheDependencyList.php b/framework/Caching/TCacheDependencyList.php
new file mode 100644
index 00000000..d74ce060
--- /dev/null
+++ b/framework/Caching/TCacheDependencyList.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * TCache and cache dependency classes.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright &copy; 2005-2014 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @package System.Caching
+ */
+
+/**
+ * TCacheDependencyList class.
+ *
+ * TCacheDependencyList represents a list of cache dependency objects.
+ * Only objects implementing {@link ICacheDependency} can be added into this list.
+ *
+ * TCacheDependencyList can be used like an array. See {@link TList}
+ * for more details.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @package System.Caching
+ * @since 3.1.0
+ */
+class TCacheDependencyList extends TList
+{
+ /**
+ * Inserts an item at the specified position.
+ * This overrides the parent implementation by performing additional type checking
+ * for each newly added item.
+ * @param integer the specified position.
+ * @param mixed new item
+ * @throws TInvalidDataTypeException if the item to be inserted is not a dependency instance
+ */
+ public function insertAt($index,$item)
+ {
+ if($item instanceof ICacheDependency)
+ parent::insertAt($index,$item);
+ else
+ throw new TInvalidDataTypeException('cachedependencylist_cachedependency_required');
+ }
+} \ No newline at end of file
diff --git a/framework/Caching/TChainedCacheDependency.php b/framework/Caching/TChainedCacheDependency.php
new file mode 100644
index 00000000..463919fd
--- /dev/null
+++ b/framework/Caching/TChainedCacheDependency.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * TCache and cache dependency classes.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright &copy; 2005-2014 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @package System.Caching
+ */
+
+
+/**
+ * TChainedCacheDependency class.
+ *
+ * TChainedCacheDependency represents a list of cache dependency objects
+ * and performs the dependency checking based on the checking results of
+ * these objects. If any of them reports a dependency change, TChainedCacheDependency
+ * will return true for the checking.
+ *
+ * To add dependencies to TChainedCacheDependency, use {@link getDependencies Dependencies}
+ * which gives a {@link TCacheDependencyList} instance and can be used like an array
+ * (see {@link TList} for more details}).
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @package System.Caching
+ * @since 3.1.0
+ */
+class TChainedCacheDependency extends TCacheDependency
+{
+ private $_dependencies=null;
+
+ /**
+ * @return TCacheDependencyList list of dependency objects
+ */
+ public function getDependencies()
+ {
+ if($this->_dependencies===null)
+ $this->_dependencies=new TCacheDependencyList;
+ return $this->_dependencies;
+ }
+
+ /**
+ * Performs the actual dependency checking.
+ * This method returns true if any of the dependency objects
+ * reports a dependency change.
+ * @return boolean whether the dependency is changed or not.
+ */
+ public function getHasChanged()
+ {
+ if($this->_dependencies!==null)
+ {
+ foreach($this->_dependencies as $dependency)
+ if($dependency->getHasChanged())
+ return true;
+ }
+ return false;
+ }
+} \ No newline at end of file
diff --git a/framework/Caching/TDirectoryCacheDependency.php b/framework/Caching/TDirectoryCacheDependency.php
new file mode 100644
index 00000000..66f7393d
--- /dev/null
+++ b/framework/Caching/TDirectoryCacheDependency.php
@@ -0,0 +1,170 @@
+<?php
+/**
+ * TCache and cache dependency classes.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright &copy; 2005-2014 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @package System.Caching
+ */
+
+/**
+ * TDirectoryCacheDependency class.
+ *
+ * TDirectoryCacheDependency performs dependency checking based on the
+ * modification time of the files contained in the specified directory.
+ * The directory being checked is specified via {@link setDirectory Directory}.
+ *
+ * By default, all files under the specified directory and subdirectories
+ * will be checked. If the last modification time of any of them is changed
+ * or if different number of files are contained in a directory, the dependency
+ * is reported as changed. By specifying {@link setRecursiveCheck RecursiveCheck}
+ * and {@link setRecursiveLevel RecursiveLevel}, one can limit the checking
+ * to a certain depth of the subdirectories.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @package System.Caching
+ * @since 3.1.0
+ */
+class TDirectoryCacheDependency extends TCacheDependency
+{
+ private $_recursiveCheck=true;
+ private $_recursiveLevel=-1;
+ private $_timestamps;
+ private $_directory;
+
+ /**
+ * Constructor.
+ * @param string the directory to be checked
+ */
+ public function __construct($directory)
+ {
+ $this->setDirectory($directory);
+ }
+
+ /**
+ * @return string the directory to be checked
+ */
+ public function getDirectory()
+ {
+ return $this->_directory;
+ }
+
+ /**
+ * @param string the directory to be checked
+ * @throws TInvalidDataValueException if the directory does not exist
+ */
+ public function setDirectory($directory)
+ {
+ if(($path=realpath($directory))===false || !is_dir($path))
+ throw new TInvalidDataValueException('directorycachedependency_directory_invalid',$directory);
+ $this->_directory=$path;
+ $this->_timestamps=$this->generateTimestamps($path);
+ }
+
+ /**
+ * @return boolean whether the subdirectories of the directory will also be checked.
+ * It defaults to true.
+ */
+ public function getRecursiveCheck()
+ {
+ return $this->_recursiveCheck;
+ }
+
+ /**
+ * @param boolean whether the subdirectories of the directory will also be checked.
+ */
+ public function setRecursiveCheck($value)
+ {
+ $this->_recursiveCheck=TPropertyValue::ensureBoolean($value);
+ }
+
+ /**
+ * @return int the depth of the subdirectories to be checked.
+ * It defaults to -1, meaning unlimited depth.
+ */
+ public function getRecursiveLevel()
+ {
+ return $this->_recursiveLevel;
+ }
+
+ /**
+ * Sets a value indicating the depth of the subdirectories to be checked.
+ * This is meaningful only when {@link getRecursiveCheck RecursiveCheck}
+ * is true.
+ * @param int the depth of the subdirectories to be checked.
+ * If the value is less than 0, it means unlimited depth.
+ * If the value is 0, it means checking the files directly under the specified directory.
+ */
+ public function setRecursiveLevel($value)
+ {
+ $this->_recursiveLevel=TPropertyValue::ensureInteger($value);
+ }
+
+ /**
+ * Performs the actual dependency checking.
+ * This method returns true if the directory is changed.
+ * @return boolean whether the dependency is changed or not.
+ */
+ public function getHasChanged()
+ {
+ return $this->generateTimestamps($this->_directory)!=$this->_timestamps;
+ }
+
+ /**
+ * Checks to see if the file should be checked for dependency.
+ * This method is invoked when dependency of the whole directory is being checked.
+ * By default, it always returns true, meaning the file should be checked.
+ * You may override this method to check only certain files.
+ * @param string the name of the file that may be checked for dependency.
+ * @return boolean whether this file should be checked.
+ */
+ protected function validateFile($fileName)
+ {
+ return true;
+ }
+
+ /**
+ * Checks to see if the specified subdirectory should be checked for dependency.
+ * This method is invoked when dependency of the whole directory is being checked.
+ * By default, it always returns true, meaning the subdirectory should be checked.
+ * You may override this method to check only certain subdirectories.
+ * @param string the name of the subdirectory that may be checked for dependency.
+ * @return boolean whether this subdirectory should be checked.
+ */
+ protected function validateDirectory($directory)
+ {
+ return true;
+ }
+
+ /**
+ * Determines the last modification time for files under the directory.
+ * This method may go recursively into subdirectories if
+ * {@link setRecursiveCheck RecursiveCheck} is set true.
+ * @param string the directory name
+ * @param int level of the recursion
+ * @return array list of file modification time indexed by the file path
+ */
+ protected function generateTimestamps($directory,$level=0)
+ {
+ if(($dir=opendir($directory))===false)
+ throw new TIOException('directorycachedependency_directory_invalid',$directory);
+ $timestamps=array();
+ while(($file=readdir($dir))!==false)
+ {
+ $path=$directory.DIRECTORY_SEPARATOR.$file;
+ if($file==='.' || $file==='..')
+ continue;
+ else if(is_dir($path))
+ {
+ if(($this->_recursiveLevel<0 || $level<$this->_recursiveLevel) && $this->validateDirectory($path))
+ $timestamps=array_merge($this->generateTimestamps($path,$level+1));
+ }
+ else if($this->validateFile($path))
+ $timestamps[$path]=filemtime($path);
+ }
+ closedir($dir);
+ return $timestamps;
+ }
+} \ No newline at end of file
diff --git a/framework/Caching/TFileCacheDependency.php b/framework/Caching/TFileCacheDependency.php
new file mode 100644
index 00000000..4a4694bd
--- /dev/null
+++ b/framework/Caching/TFileCacheDependency.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * TCache and cache dependency classes.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright &copy; 2005-2014 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @package System.Caching
+ */
+
+
+/**
+ * TFileCacheDependency class.
+ *
+ * TFileCacheDependency performs dependency checking based on the
+ * last modification time of the file specified via {@link setFileName FileName}.
+ * The dependency is reported as unchanged if and only if the file's
+ * last modification time remains unchanged.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @package System.Caching
+ * @since 3.1.0
+ */
+class TFileCacheDependency extends TCacheDependency
+{
+ private $_fileName;
+ private $_timestamp;
+
+ /**
+ * Constructor.
+ * @param string name of the file whose change is to be checked.
+ */
+ public function __construct($fileName)
+ {
+ $this->setFileName($fileName);
+ }
+
+ /**
+ * @return string the name of the file whose change is to be checked
+ */
+ public function getFileName()
+ {
+ return $this->_fileName;
+ }
+
+ /**
+ * @param string the name of the file whose change is to be checked
+ */
+ public function setFileName($value)
+ {
+ $this->_fileName=$value;
+ $this->_timestamp=@filemtime($value);
+ }
+
+ /**
+ * @return int the last modification time of the file
+ */
+ public function getTimestamp()
+ {
+ return $this->_timestamp;
+ }
+
+ /**
+ * Performs the actual dependency checking.
+ * This method returns true if the last modification time of the file is changed.
+ * @return boolean whether the dependency is changed or not.
+ */
+ public function getHasChanged()
+ {
+ return @filemtime($this->_fileName)!==$this->_timestamp;
+ }
+} \ No newline at end of file
diff --git a/framework/Caching/TGlobalStateCacheDependency.php b/framework/Caching/TGlobalStateCacheDependency.php
new file mode 100644
index 00000000..daae990e
--- /dev/null
+++ b/framework/Caching/TGlobalStateCacheDependency.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * TCache and cache dependency classes.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright &copy; 2005-2014 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @package System.Caching
+ */
+
+
+/**
+ * TGlobalStateCacheDependency class.
+ *
+ * TGlobalStateCacheDependency checks if a global state is changed or not.
+ * If the global state is changed, the dependency is reported as changed.
+ * To specify which global state this dependency should check with,
+ * set {@link setStateName StateName} to the name of the global state.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @package System.Caching
+ * @since 3.1.0
+ */
+class TGlobalStateCacheDependency extends TCacheDependency
+{
+ private $_stateName;
+ private $_stateValue;
+
+ /**
+ * Constructor.
+ * @param string the name of the global state
+ */
+ public function __construct($name)
+ {
+ $this->setStateName($name);
+ }
+
+ /**
+ * @return string the name of the global state
+ */
+ public function getStateName()
+ {
+ return $this->_stateName;
+ }
+
+ /**
+ * @param string the name of the global state
+ * @see TApplication::setGlobalState
+ */
+ public function setStateName($value)
+ {
+ $this->_stateName=$value;
+ $this->_stateValue=Prado::getApplication()->getGlobalState($value);
+ }
+
+ /**
+ * Performs the actual dependency checking.
+ * This method returns true if the specified global state is changed.
+ * @return boolean whether the dependency is changed or not.
+ */
+ public function getHasChanged()
+ {
+ return $this->_stateValue!==Prado::getApplication()->getGlobalState($this->_stateName);
+ }
+} \ No newline at end of file