From 55a804571db8f1fade4c0cd3149ea847a3a7002d Mon Sep 17 00:00:00 2001 From: Roland Haeder Date: Sat, 24 May 2014 13:52:47 +0200 Subject: [PATCH] Moved even more code to BaseFile where a much better place is for it (clear encapsulated). MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Roland Häder --- .../main/file_directories/class_BaseFile.php | 161 +++++++++++++++++- .../index/class_IndexFile.php | 6 +- .../stack/class_StackFile.php | 6 +- inc/classes/main/index/class_BaseIndex.php | 4 +- .../main/iterator/io/class_FileIoIterator.php | 148 +--------------- .../main/stacker/file/class_BaseFileStack.php | 4 +- 6 files changed, 180 insertions(+), 149 deletions(-) diff --git a/inc/classes/main/file_directories/class_BaseFile.php b/inc/classes/main/file_directories/class_BaseFile.php index fb601626..632cbdce 100644 --- a/inc/classes/main/file_directories/class_BaseFile.php +++ b/inc/classes/main/file_directories/class_BaseFile.php @@ -27,11 +27,21 @@ class BaseFile extends BaseFrameworkSystem { */ private $fileName = ''; + /** + * Back-buffer + */ + private $backBuffer = ''; + + /** + * Currently loaded block (will be returned by current()) + */ + private $currentBlock = ''; + /** * Protected constructor * * @param $className Name of the class - * @return void +y * @return void */ protected function __construct ($className) { // Call parent constructor @@ -84,6 +94,53 @@ class BaseFile extends BaseFrameworkSystem { return $this->fileName; } + /** + * Initializes the back-buffer by setting it to an empty string. + * + * @return void + */ + private function initBackBuffer () { + // Simply call the setter + $this->setBackBuffer(''); + } + + /** + * Setter for backBuffer field + * + * @param $backBuffer Characters to "store" in back-buffer + * @return void + */ + private function setBackBuffer ($backBuffer) { + // Cast to string (so no arrays or objects) + $backBuffer = (string) $backBuffer; + + // ... and set it + $this->backBuffer = $backBuffer; + } + + /** + * Getter for backBuffer field + * + * @return $backBuffer Characters "stored" in back-buffer + */ + private function getBackBuffer () { + return $this->backBuffer; + } + + /** + * Setter for currentBlock field + * + * @param $currentBlock Characters to set a currently loaded block + * @return void + */ + private function setCurrentBlock ($currentBlock) { + // Cast to string (so no arrays or objects) + $currentBlock = (string) $currentBlock; + + // ... and set it + $this->currentBlock = $currentBlock; + } + /** * Initializes this file class * @@ -193,7 +250,7 @@ class BaseFile extends BaseFrameworkSystem { * @return $isEndOfFileReached Whether the EOF has been reached */ public final function isEndOfFileReached () { - return $this->getPointerInstance()->isEndOfFileReached(); + return $this->isEndOfFileReached(); } /** @@ -232,6 +289,106 @@ class BaseFile extends BaseFrameworkSystem { //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__)); } + + /** + * Advances to next "block" of bytes + * + * @return void + * @todo This method will load large but empty files in a whole + */ + public function next () { + // Is there nothing to read? + if (!$this->valid()) { + // Nothing to read + return; + } // END - if + + // Make sure the block instance is set + assert($this->getBlockInstance() instanceof CalculatableBlock); + + // First calculate minimum block length + $length = $this->getBlockInstance()->caluclateMinimumBlockLength(); + + // Short be more than zero! + assert($length > 0); + + // Wait until a entry/block separator has been found + $data = $this->getBackBuffer(); + while ((!$this->isEndOfFileReached()) && (!$this->getBlockInstance()->isBlockSeparatorFound($data))) { + // Then read the block + $data .= $this->read($length); + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('data()=' . strlen($data)); + } // END - if + + // EOF reached? + if ($this->isEndOfFileReached()) { + // Set whole data as current block + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('Calling setCurrentBlock(' . strlen($data) . ') ...'); + $this->setCurrentBlock($data); + + // Then abort here silently + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('EOF reached.'); + return; + } // END - if + + /* + * Init back-buffer which is the data that has been found beyond the + * separator. + */ + $this->initBackBuffer(); + + // Separate data + $dataArray = explode(self::getBlockSeparator(), $data); + + // This array must contain two elements + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('dataArray=' . print_r($dataArray, TRUE)); + assert(count($dataArray) == 2); + + // Left part is the actual block, right one the back-buffer data + $this->setCurrentBlock($dataArray[0]); + $this->setBackBuffer($dataArray[1]); + } + + /** + * Checks wether the current entry is valid (not at the end of the file). + * This method will return TRUE if an emptied (nulled) entry has been found. + * + * @return $isValid Whether the next entry is valid + */ + public function valid () { + // Make sure the block instance is set + assert($this->getBlockInstance() instanceof CalculatableBlock); + + // First calculate minimum block length + $length = $this->getBlockInstance()->caluclateMinimumBlockLength(); + + // Short be more than zero! + assert($length > 0); + + // Get current seek position + $seekPosition = $this->key(); + + // Then try to read it + $data = $this->read($length); + + // If some bytes could be read, all is fine + $isValid = ((is_string($data)) && (strlen($data) > 0)); + + // Get header size + $headerSize = $this->getBlockInstance()->getHeaderSize(); + + // Is the seek position at or beyond the header? + if ($seekPosition >= $headerSize) { + // Seek back to old position + $this->seek($seekPosition); + } else { + // Seek directly behind the header + $this->seek($headerSize); + } + + // Return result + return $isValid; + } } // [EOF] diff --git a/inc/classes/main/file_directories/index/class_IndexFile.php b/inc/classes/main/file_directories/index/class_IndexFile.php index d416b240..f8e6be92 100644 --- a/inc/classes/main/file_directories/index/class_IndexFile.php +++ b/inc/classes/main/file_directories/index/class_IndexFile.php @@ -36,12 +36,16 @@ class IndexFile extends BaseFile implements InputOutputPointer { * Creates an instance of this File class and prepares it for usage * * @param $fileName Name of the index file + * @param $blockInstance An instance of a CalculatableBlock class * @return $fileInstance An instance of this File class */ - public final static function createIndexFile ($fileName) { + public final static function createIndexFile ($fileName, CalculatableBlock $blockInstance) { // Get a new instance $fileInstance = new IndexFile(); + // Set block instance here for callbacks + $fileInstance->setBlockInstance($blockInstance); + // Init this abstract file $fileInstance->initFile($fileName); diff --git a/inc/classes/main/file_directories/stack/class_StackFile.php b/inc/classes/main/file_directories/stack/class_StackFile.php index 4cd1f386..299b0042 100644 --- a/inc/classes/main/file_directories/stack/class_StackFile.php +++ b/inc/classes/main/file_directories/stack/class_StackFile.php @@ -36,12 +36,16 @@ class StackFile extends BaseFile implements InputOutputPointer { * Creates an instance of this File class and prepares it for usage * * @param $fileName Name of the stack file + * @param $blockInstance An instance of a CalculatableBlock class * @return $fileInstance An instance of this File class */ - public final static function createStackFile ($fileName) { + public final static function createStackFile ($fileName, CalculatableBlock $blockInstance) { // Get a new instance $fileInstance = new StackFile(); + // Set block instance here for callbacks + $fileInstance->setBlockInstance($blockInstance); + // Init this abstract file $fileInstance->initFile($fileName); diff --git a/inc/classes/main/index/class_BaseIndex.php b/inc/classes/main/index/class_BaseIndex.php index 0ee7b77c..fd577241 100644 --- a/inc/classes/main/index/class_BaseIndex.php +++ b/inc/classes/main/index/class_BaseIndex.php @@ -150,10 +150,10 @@ class BaseIndex extends BaseFrameworkSystem { $fileName .= $this->getConfigInstance()->getConfigEntry('index_extension'); // Get a file i/o pointer instance for index file - $fileInstance = ObjectFactory::createObjectByConfiguredName('index_file_class', array($fileName)); + $fileInstance = ObjectFactory::createObjectByConfiguredName('index_file_class', array($fileName, $this)); // Get iterator instance - $iteratorInstance = ObjectFactory::createObjectByConfiguredName('file_io_iterator_class', array($fileInstance, $this)); + $iteratorInstance = ObjectFactory::createObjectByConfiguredName('file_io_iterator_class', array($fileInstance)); // Is the instance implementing the right interface? assert($iteratorInstance instanceof SeekableWritableFileIterator); diff --git a/inc/classes/main/iterator/io/class_FileIoIterator.php b/inc/classes/main/iterator/io/class_FileIoIterator.php index f2158c63..5be12663 100644 --- a/inc/classes/main/iterator/io/class_FileIoIterator.php +++ b/inc/classes/main/iterator/io/class_FileIoIterator.php @@ -22,16 +22,6 @@ * along with this program. If not, see . */ class FileIoIterator extends BaseIterator implements SeekableWritableFileIterator { - /** - * Back-buffer - */ - private $backBuffer = ''; - - /** - * Currently loaded block (will be returned by current()) - */ - private $currentBlock = ''; - /** * Protected constructor * @@ -46,78 +36,27 @@ class FileIoIterator extends BaseIterator implements SeekableWritableFileIterato * Creates an instance of this class * * @param $pointerInstance An instance of a InputOutputPointer class - * @param $blockInstance An instance of a CalculatableBlock class * @return $iteratorInstance An instance of a Iterator class */ - public final static function createFileIoIterator (InputOutputPointer $pointerInstance, CalculatableBlock $blockInstance) { + public final static function createFileIoIterator (InputOutputPointer $pointerInstance) { // Get new instance $iteratorInstance = new FileIoIterator(); // Set the instance here $iteratorInstance->setPointerInstance($pointerInstance); - // Set the block instance here - $iteratorInstance->setBlockInstance($blockInstance); - // Return the prepared instance return $iteratorInstance; } - /** - * Initializes the back-buffer by setting it to an empty string. - * - * @return void - */ - private function initBackBuffer () { - // Simply call the setter - $this->setBackBuffer(''); - } - - /** - * Setter for backBuffer field - * - * @param $backBuffer Characters to "store" in back-buffer - * @return void - */ - private function setBackBuffer ($backBuffer) { - // Cast to string (so no arrays or objects) - $backBuffer = (string) $backBuffer; - - // ... and set it - $this->backBuffer = $backBuffer; - } - - /** - * Getter for backBuffer field - * - * @return $backBuffer Characters "stored" in back-buffer - */ - private function getBackBuffer () { - return $this->backBuffer; - } - - /** - * Setter for currentBlock field - * - * @param $currentBlock Characters to set a currently loaded block - * @return void - */ - private function setCurrentBlock ($currentBlock) { - // Cast to string (so no arrays or objects) - $currentBlock = (string) $currentBlock; - - // ... and set it - $this->currentBlock = $currentBlock; - } - /** * Gets currently read data * * @return $current Currently read data */ public function current () { - // Return it - return $this->currentBlock; + // Call pointer instance + return $this->getPointerInstance()->current(); } /** @@ -134,56 +73,10 @@ class FileIoIterator extends BaseIterator implements SeekableWritableFileIterato * Advances to next "block" of bytes * * @return void - * @todo This method will load large but empty files in a whole */ public function next () { - // Is there nothing to read? - if (!$this->valid()) { - // Nothing to read - return; - } // END - if - - // First calculate minimum block length - $length = $this->getBlockInstance()->caluclateMinimumBlockLength(); - - // Short be more than zero! - assert($length > 0); - - // Wait until a entry/block separator has been found - $data = $this->getBackBuffer(); - while ((!$this->getPointerInstance()->isEndOfFileReached()) && (!$this->getBlockInstance()->isBlockSeparatorFound($data))) { - // Then read the block - $data .= $this->read($length); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('data()=' . strlen($data)); - } // END - if - - // EOF reached? - if ($this->getPointerInstance()->isEndOfFileReached()) { - // Set whole data as current block - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('Calling setCurrentBlock(' . strlen($data) . ') ...'); - $this->setCurrentBlock($data); - - // Then abort here silently - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('EOF reached.'); - return; - } // END - if - - /* - * Init back-buffer which is the data that has been found beyond the - * separator. - */ - $this->initBackBuffer(); - - // Separate data - $dataArray = explode(self::getBlockSeparator(), $data); - - // This array must contain two elements - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('dataArray=' . print_r($dataArray, TRUE)); - assert(count($dataArray) == 2); - - // Left part is the actual block, right one the back-buffer data - $this->setCurrentBlock($dataArray[0]); - $this->setBackBuffer($dataArray[1]); + // Call pointer instance + $this->getPointerInstance()->next(); } /** @@ -203,35 +96,8 @@ class FileIoIterator extends BaseIterator implements SeekableWritableFileIterato * @return $isValid Whether the next entry is valid */ public function valid () { - // First calculate minimum block length - $length = $this->getBlockInstance()->caluclateMinimumBlockLength(); - - // Short be more than zero! - assert($length > 0); - - // Get current seek position - $seekPosition = $this->key(); - - // Then try to read it - $data = $this->read($length); - - // If some bytes could be read, all is fine - $isValid = ((is_string($data)) && (strlen($data) > 0)); - - // Get header size - $headerSize = $this->getBlockInstance()->getHeaderSize(); - - // Is the seek position at or beyond the header? - if ($seekPosition >= $headerSize) { - // Seek back to old position - $this->seek($seekPosition); - } else { - // Seek directly behind the header - $this->seek($headerSize); - } - - // Return result - return $isValid; + // Call pointer instance + return $this->getPointerInstance()->valid(); } /** diff --git a/inc/classes/main/stacker/file/class_BaseFileStack.php b/inc/classes/main/stacker/file/class_BaseFileStack.php index 8e3ae4d8..9219ecc3 100644 --- a/inc/classes/main/stacker/file/class_BaseFileStack.php +++ b/inc/classes/main/stacker/file/class_BaseFileStack.php @@ -161,10 +161,10 @@ class BaseFileStack extends BaseStacker { */ protected function initFileStack ($fileName, $type) { // Get a stack file instance - $fileInstance = ObjectFactory::createObjectByConfiguredName('stack_file_class', array($fileName)); + $fileInstance = ObjectFactory::createObjectByConfiguredName('stack_file_class', array($fileName, $this)); // Get iterator instance - $iteratorInstance = ObjectFactory::createObjectByConfiguredName('file_io_iterator_class', array($fileInstance, $this)); + $iteratorInstance = ObjectFactory::createObjectByConfiguredName('file_io_iterator_class', array($fileInstance)); // Is the instance implementing the right interface? assert($iteratorInstance instanceof SeekableWritableFileIterator); -- 2.39.5