X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=framework%2Fmain%2Fclasses%2Fstacker%2Ffile%2Fclass_BaseFileStack.php;h=5513c77759fad82ed0eeacafd84c6871692976e2;hb=196ab0fc031d6987c87e8c5d257c39f664ec9151;hp=abce939f8640135fc6bcd0979aa5dc27792d5381;hpb=6e64aa2cb0fbd5a3c712a6a15e08399b1120cc67;p=core.git diff --git a/framework/main/classes/stacker/file/class_BaseFileStack.php b/framework/main/classes/stacker/file/class_BaseFileStack.php index abce939f..5513c777 100644 --- a/framework/main/classes/stacker/file/class_BaseFileStack.php +++ b/framework/main/classes/stacker/file/class_BaseFileStack.php @@ -7,11 +7,11 @@ use Org\Mxchange\CoreFramework\Factory\Stack\File\FileStackIndexFactory; use Org\Mxchange\CoreFramework\Factory\ObjectFactory; use Org\Mxchange\CoreFramework\Filesystem\File\BaseBinaryFile; use Org\Mxchange\CoreFramework\Generic\UnsupportedOperationException; -use Org\Mxchange\CoreFramework\Index\Indexable; use Org\Mxchange\CoreFramework\Iterator\Filesystem\SeekableWritableFileIterator; use Org\Mxchange\CoreFramework\Stack\BaseStacker; use Org\Mxchange\CoreFramework\Stack\File\InvalidMagicException; use Org\Mxchange\CoreFramework\Stack\File\StackableFile; +use Org\Mxchange\CoreFramework\Traits\Index\IndexableTrait; use Org\Mxchange\CoreFramework\Traits\Iterator\IteratorTrait; use Org\Mxchange\CoreFramework\Utils\String\StringUtils; @@ -49,11 +49,6 @@ abstract class BaseFileStack extends BaseStacker implements StackableFile { // Exception codes const EXCEPTION_BAD_MAGIC = 0xe100; - /** - * An instance of an Indexable class - */ - private $indexInstance = NULL; - /** * Protected constructor * @@ -65,25 +60,6 @@ abstract class BaseFileStack extends BaseStacker implements StackableFile { parent::__construct($className); } - /** - * Setter for Indexable instance - * - * @param $indexInstance An instance of an Indexable class - * @return void - */ - protected final function setIndexInstance (Indexable $indexInstance) { - $this->indexInstance = $indexInstance; - } - - /** - * Getter for Indexable instance - * - * @return $indexInstance An instance of an Indexable class - */ - public final function getIndexInstance () { - return $this->indexInstance; - } - /** * Reads the file header * @@ -94,7 +70,7 @@ abstract class BaseFileStack extends BaseStacker implements StackableFile { */ public function readFileHeader () { // First rewind to beginning as the header sits at the beginning ... - /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: CALLED!', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('BASE-FILE-STACK: CALLED!'); $this->getIteratorInstance()->rewind(); // Then read it (see constructor for calculation) @@ -184,7 +160,7 @@ abstract class BaseFileStack extends BaseStacker implements StackableFile { */ public function flushFileHeader () { // Put all informations together - /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: CALLED!', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('BASE-FILE-STACK: CALLED!'); $header = sprintf('%s%s%s%s%s%s', // Magic StackableFile::STACK_MAGIC, @@ -209,7 +185,7 @@ abstract class BaseFileStack extends BaseStacker implements StackableFile { $this->getIteratorInstance()->writeData(0, $header, false); // Trace message - /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: EXIT!', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('BASE-FILE-STACK: EXIT!'); } /** @@ -274,6 +250,9 @@ abstract class BaseFileStack extends BaseStacker implements StackableFile { // And set it here $this->setIndexInstance($indexInstance); + + // Trace message + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('BASE-FILE-STACK: EXIT!'); } /** @@ -283,12 +262,16 @@ abstract class BaseFileStack extends BaseStacker implements StackableFile { * @param $value Value to add to this stacker * @return void * @throws FullStackerException If the stack is full + * @throws InvalidArgumentException If a parameter is not valid * @throws InvalidArgumentException Not all variable types are wanted here */ protected function addValue (string $stackerName, $value) { - // Do some tests - /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('stackerName=%s,value[%s]=%s - CALLED!', $stackerName, gettype($value), print_r($value, true))); - if ($this->isStackFull($stackerName)) { + // Validate parameter + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: stackerName=%s,value[%s]=%s - CALLED!', $stackerName, gettype($value), print_r($value, true))); + if (empty($stackerName)) { + // No empty stack name + throw new InvalidArgumentException('Parameter "stackerName" is empty'); + } elseif ($this->isStackFull($stackerName)) { // Stacker is full throw new FullStackerException(array($this, $stackerName, $value), self::EXCEPTION_STACKER_IS_FULL); } elseif (is_resource($value) || is_object($value)) { @@ -304,6 +287,9 @@ abstract class BaseFileStack extends BaseStacker implements StackableFile { // Add the hash and gap position to the index $this->getIndexInstance()->addHashToIndex($stackerName, $data); + + // Trace message + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('BASE-FILE-STACK: EXIT!'); } /** @@ -311,20 +297,26 @@ abstract class BaseFileStack extends BaseStacker implements StackableFile { * * @param $stackerName Name of the stack * @return $value Value of last added value + * @throws InvalidArgumentException If a parameter is not valid * @throws BadMethodCallException If the stack is empty */ protected function getLastValue (string $stackerName) { - // Is the stack not yet initialized or full? - if ($this->isStackEmpty($stackerName)) { + // Validate parameter + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: stackerName=%s - CALLED!', $stackerName)); + if (empty($stackerName)) { + // No empty stack name + throw new InvalidArgumentException('Parameter "stackerName" is empty'); + } elseif ($this->isStackEmpty($stackerName)) { // Throw an exception throw new BadMethodCallException(array($this, $stackerName), self::EXCEPTION_STACKER_IS_EMPTY); - } // END - if + } // Now get the last value /* NOISY-DEBUG: */ $this->partialStub('[' . __METHOD__ . ':' . __LINE__ . '] stackerName=' . $stackerName); $value = NULL; // Return it + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: value[]=%s - EXIT!', gettype($value))); return $value; } @@ -333,20 +325,26 @@ abstract class BaseFileStack extends BaseStacker implements StackableFile { * * @param $stackerName Name of the stack * @return $value Value of last added value + * @throws InvalidArgumentException If a parameter is not valid * @throws BadMethodCallException If the stack is empty */ protected function getFirstValue (string $stackerName) { - // Is the stack not yet initialized or full? - if ($this->isStackEmpty($stackerName)) { + // Validate parameter + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: stackerName=%s - CALLED!', $stackerName)); + if (empty($stackerName)) { + // No empty stack name + throw new InvalidArgumentException('Parameter "stackerName" is empty'); + } elseif ($this->isStackEmpty($stackerName)) { // Throw an exception throw new BadMethodCallException(array($this, $stackerName), self::EXCEPTION_STACKER_IS_EMPTY); - } // END - if + } // Now get the first value /* NOISY-DEBUG: */ $this->partialStub('[' . __METHOD__ . ':' . __LINE__ . '] stackerName=' . $stackerName); $value = NULL; // Return it + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: value[]=%s - EXIT!', gettype($value))); return $value; } @@ -355,14 +353,19 @@ abstract class BaseFileStack extends BaseStacker implements StackableFile { * * @param $stackerName Name of the stack * @return $value Value "poped" from array + * @throws InvalidArgumentException If a parameter is not valid * @throws BadMethodCallException If the stack is empty */ protected function popLast (string $stackerName) { - // Is the stack not yet initialized or full? - if ($this->isStackEmpty($stackerName)) { + // Validate parameter + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: stackerName=%s - CALLED!', $stackerName)); + if (empty($stackerName)) { + // No empty stack name + throw new InvalidArgumentException('Parameter "stackerName" is empty'); + } elseif ($this->isStackEmpty($stackerName)) { // Throw an exception throw new BadMethodCallException(array($this, $stackerName), self::EXCEPTION_STACKER_IS_EMPTY); - } // END - if + } // Now, remove the last entry, we don't care about the return value here, see elseif() block above /* NOISY-DEBUG: */ $this->partialStub('[' . __METHOD__ . ':' . __LINE__ . '] stackerName=' . $stackerName); @@ -374,14 +377,19 @@ abstract class BaseFileStack extends BaseStacker implements StackableFile { * * @param $stackerName Name of the stack * @return $value Value "shifted" from array + * @throws InvalidArgumentException If a parameter is not valid * @throws BadMethodCallException If the named stacker is empty */ protected function popFirst (string $stackerName) { - // Is the stack not yet initialized or full? - if ($this->isStackEmpty($stackerName)) { + // Validate parameter + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: stackerName=%s - CALLED!', $stackerName)); + if (empty($stackerName)) { + // No empty stack name + throw new InvalidArgumentException('Parameter "stackerName" is empty'); + } elseif ($this->isStackEmpty($stackerName)) { // Throw an exception throw new BadMethodCallException(array($this, $stackerName), self::EXCEPTION_STACKER_IS_EMPTY); - } // END - if + } // Now, remove the last entry, we don't care about the return value here, see elseif() block above /* NOISY-DEBUG: */ $this->partialStub('[' . __METHOD__ . ':' . __LINE__ . '] stackerName=' . $stackerName); @@ -393,13 +401,22 @@ abstract class BaseFileStack extends BaseStacker implements StackableFile { * * @param $stackerName Name of the stack * @return $isFull Whether the stack is full + * @throws InvalidArgumentException If a parameter is not valid */ protected function isStackFull (string $stackerName) { - // File-based stacks will only run full if the disk space is low. + // Validate parameter + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: stackerName=%s - CALLED!', $stackerName)); + if (empty($stackerName)) { + // No empty stack name + throw new InvalidArgumentException('Parameter "stackerName" is empty'); + } + // @TODO Please implement this, returning false + /* NOISY-DEBUG: */ $this->partialStub('[' . __METHOD__ . ':' . __LINE__ . '] stackerName=' . $stackerName); $isFull = false; // Return result + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: isFull=%d - EXIT!', intval($isFull))); return $isFull; } @@ -408,13 +425,22 @@ abstract class BaseFileStack extends BaseStacker implements StackableFile { * * @param $stackerName Name of the stack * @return $isEmpty Whether the stack is empty + * @throws InvalidArgumentException If a parameter is not valid * @throws BadMethodCallException If given stack is missing */ public function isStackEmpty (string $stackerName) { + // Validate parameter + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: stackerName=%s - CALLED!', $stackerName)); + if (empty($stackerName)) { + // No empty stack name + throw new InvalidArgumentException('Parameter "stackerName" is empty'); + } + // So, is the stack empty? $isEmpty = (($this->getStackCount($stackerName)) == 0); // Return result + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: isEmpty=%d - EXIT!', intval($isEmpty))); return $isEmpty; } @@ -469,7 +495,12 @@ abstract class BaseFileStack extends BaseStacker implements StackableFile { */ public function getStackCount (string $stackerName) { // Now, simply return the found count value, this must be up-to-date then! - return $this->getIteratorInstance()->getCounter(); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: stackerName=%s - CALLED!', $stackerName)); + $count = $this->getIteratorInstance()->getCounter(); + + // Return count + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: count=%d - EXIT!', $count)); + return $count; } /** @@ -479,6 +510,7 @@ abstract class BaseFileStack extends BaseStacker implements StackableFile { */ public function calculateMinimumBlockLength () { // Calulcate it + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('BASE-FILE-STACK: CALLED!'); $length = // Length of entry group BaseBinaryFile::LENGTH_GROUP + strlen(chr(BaseBinaryFile::SEPARATOR_GROUP_HASH)) + @@ -488,6 +520,7 @@ abstract class BaseFileStack extends BaseStacker implements StackableFile { strlen(chr(BaseBinaryFile::SEPARATOR_ENTRIES)); // Return it + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: length=%d - EXIT!', $length)); return $length; } @@ -614,7 +647,12 @@ abstract class BaseFileStack extends BaseStacker implements StackableFile { */ public function getFileSize () { // Call iterator's method - return $this->getIteratorInstance()->getFileSize(); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('BASE-FILE-STACK: CALLED!'); + $size = $this->getIteratorInstance()->getFileSize(); + + // Return size + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: size=%d - EXIT!', $size)); + return $size; } /** @@ -641,6 +679,7 @@ abstract class BaseFileStack extends BaseStacker implements StackableFile { $gapPosition = $this->getIteratorInstance()->searchNextGap(strlen($rawData)); // Gap position cannot be smaller than header length + 1 + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: gapPosition=%d', $gapPosition)); if ($gapPosition <= $this->getIteratorInstance()->getHeaderSize()) { // Improper gap position throw new UnexpectedValueException(sprintf('gapPosition[%s]=%d is not larger than headerSize=%d',