From c77663981dbaefb7d8ff039967509aa1204ee556 Mon Sep 17 00:00:00 2001 From: Roland Haeder Date: Sat, 10 Jan 2015 22:49:15 +0100 Subject: [PATCH] Added new classes + moved some in sub folders: - Added input and output classes (duplicated + correct functions used) for text files + added iniFile() in corresponding "base" classes - Moved "raw" input/output classes to sub folders to allow separation, still there may be a "base" class missing for both of them MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Roland Häder --- .../{text/csv => input/raw}/.htaccess | 0 .../class_FrameworkRawFileInputPointer.php} | 6 +- .../file_directories/input/text/.htaccess | 1 + .../class_FrameworkTextFileInputPointer.php | 158 ++++++++++++++++++ .../file_directories/output/raw/.htaccess | 1 + .../class_FrameworkRawFileOutputPointer.php} | 6 +- .../file_directories/output/text/.htaccess | 1 + .../class_FrameworkTextFileOutputPointer.php | 150 +++++++++++++++++ .../text/input/class_BaseTextInputFile.php | 52 ++++++ .../file_directories/text/input/csv/.htaccess | 1 + .../csv/class_CsvInputFile.php} | 8 +- .../text/output/class_BaseTextOutputFile.php | 52 ++++++ inc/config.php | 17 +- 13 files changed, 436 insertions(+), 17 deletions(-) rename inc/classes/main/file_directories/{text/csv => input/raw}/.htaccess (100%) rename inc/classes/main/file_directories/input/{class_FrameworkFileInputPointer.php => raw/class_FrameworkRawFileInputPointer.php} (95%) create mode 100644 inc/classes/main/file_directories/input/text/.htaccess create mode 100644 inc/classes/main/file_directories/input/text/class_FrameworkTextFileInputPointer.php create mode 100644 inc/classes/main/file_directories/output/raw/.htaccess rename inc/classes/main/file_directories/output/{class_FrameworkFileOutputPointer.php => raw/class_FrameworkRawFileOutputPointer.php} (95%) create mode 100644 inc/classes/main/file_directories/output/text/.htaccess create mode 100644 inc/classes/main/file_directories/output/text/class_FrameworkTextFileOutputPointer.php create mode 100644 inc/classes/main/file_directories/text/input/class_BaseTextInputFile.php create mode 100644 inc/classes/main/file_directories/text/input/csv/.htaccess rename inc/classes/main/file_directories/text/{csv/class_CsvFile.php => input/csv/class_CsvInputFile.php} (86%) create mode 100644 inc/classes/main/file_directories/text/output/class_BaseTextOutputFile.php diff --git a/inc/classes/main/file_directories/text/csv/.htaccess b/inc/classes/main/file_directories/input/raw/.htaccess similarity index 100% rename from inc/classes/main/file_directories/text/csv/.htaccess rename to inc/classes/main/file_directories/input/raw/.htaccess diff --git a/inc/classes/main/file_directories/input/class_FrameworkFileInputPointer.php b/inc/classes/main/file_directories/input/raw/class_FrameworkRawFileInputPointer.php similarity index 95% rename from inc/classes/main/file_directories/input/class_FrameworkFileInputPointer.php rename to inc/classes/main/file_directories/input/raw/class_FrameworkRawFileInputPointer.php index 982a07cb..8c4f6529 100644 --- a/inc/classes/main/file_directories/input/class_FrameworkFileInputPointer.php +++ b/inc/classes/main/file_directories/input/raw/class_FrameworkRawFileInputPointer.php @@ -21,7 +21,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -class FrameworkFileInputPointer extends BaseFileIo implements InputPointer { +class FrameworkRawFileInputPointer extends BaseFileIo implements InputPointer { /** * Protected constructor * @@ -41,7 +41,7 @@ class FrameworkFileInputPointer extends BaseFileIo implements InputPointer { * @throws FileIoException If fopen() returns not a file resource * @return void */ - public static final function createFrameworkFileInputPointer ($fileName) { + public static final function createFrameworkRawFileInputPointer ($fileName) { // Some pre-sanity checks... if ((is_null($fileName)) || (empty($fileName))) { // No filename given @@ -62,7 +62,7 @@ class FrameworkFileInputPointer extends BaseFileIo implements InputPointer { } // END - if // Create new instance - $pointerInstance = new FrameworkFileInputPointer(); + $pointerInstance = new FrameworkRawFileInputPointer(); // Set file pointer and file name $pointerInstance->setPointer($filePointer); diff --git a/inc/classes/main/file_directories/input/text/.htaccess b/inc/classes/main/file_directories/input/text/.htaccess new file mode 100644 index 00000000..3a428827 --- /dev/null +++ b/inc/classes/main/file_directories/input/text/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/inc/classes/main/file_directories/input/text/class_FrameworkTextFileInputPointer.php b/inc/classes/main/file_directories/input/text/class_FrameworkTextFileInputPointer.php new file mode 100644 index 00000000..6dc36c31 --- /dev/null +++ b/inc/classes/main/file_directories/input/text/class_FrameworkTextFileInputPointer.php @@ -0,0 +1,158 @@ + + * @version 0.0.0 + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2014 Core Developer Team + * @license GNU GPL 3.0 or any newer version + * @link http://www.shipsimu.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +class FrameworkTextFileInputPointer extends BaseFileIo implements InputPointer { + /** + * Protected constructor + * + * @return void + */ + protected function __construct () { + // Call parent constructor + parent::__construct(__CLASS__); + } + + /** + * Create a file pointer based on the given file. The file will also + * be verified here. + * + * @param $fileName The file name we shall pass to fopen() + * @throws FileIsEmptyException If the provided file name is empty. + * @throws FileIoException If fopen() returns not a file resource + * @return void + */ + public static final function createFrameworkTextFileInputPointer ($fileName) { + // Some pre-sanity checks... + if ((is_null($fileName)) || (empty($fileName))) { + // No filename given + throw new FileIsEmptyException(NULL, self::EXCEPTION_UNEXPECTED_EMPTY_STRING); + } elseif (!file_exists($fileName)) { + // File does not exist! + throw new FileIoException($fileName, self::EXCEPTION_FILE_NOT_FOUND); + } elseif (!is_readable($fileName)) { + // File does not exist! + throw new FileReadProtectedException($fileName, self::EXCEPTION_FILE_CANNOT_BE_READ); + } + + // Try to open a handler + $filePointer = fopen($fileName, 'r'); + if ((is_null($filePointer)) || ($filePointer === FALSE)) { + // Something bad happend + throw new FileIoException($fileName, self::EXCEPTION_FILE_POINTER_INVALID); + } // END - if + + // Create new instance + $pointerInstance = new FrameworkTextFileInputPointer(); + + // Set file pointer and file name + $pointerInstance->setPointer($filePointer); + $pointerInstance->setFileName($fileName); + + // Return the instance + return $pointerInstance; + } + + /** + * Read data a file pointer + * + * @return mixed The result of fread() + * @throws NullPointerException If the file pointer instance + * is not set by setPointer() + * @throws InvalidResourceException If there is being set + */ + public function readFromFile () { + if (is_null($this->getPointer())) { + // Pointer not initialized + throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER); + } elseif (!is_resource($this->getPointer())) { + // Pointer is not a valid resource! + throw new InvalidResourceException($this, self::EXCEPTION_INVALID_RESOURCE); + } + + // Read data from the file pointer and return it + return $this->read(1024); + } + + /** + * Reads given amount of bytes from file. + * + * @param $bytes Amount of bytes to read + * @return $data Data read from file + */ + public function read ($bytes) { + // Try to read given characters + $data = fgets($this->getPointer(), $bytes); + + // Was this successfull? + assert(is_string($data)); + + // Then return it + return $data; + } + + /** + * Analyzes entries in index file. This will count all found (and valid) + * entries, mark invalid as damaged and count gaps ("fragmentation"). If + * only gaps are found, the file is considered as "virgin" (no entries). + * + * @return void + * @throws UnsupportedOperationException If this method is called + */ + public function analyzeFile () { + throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION); + } + + /** + * Advances to next "block" of bytes + * + * @return void + * @throws UnsupportedOperationException If this method is called + */ + public function next () { + throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION); + } + + /** + * 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 + * @throws UnsupportedOperationException If this method is called + */ + public function valid () { + throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION); + } + + /** + * Gets current seek position ("key"). + * + * @return $key Current key in iteration + * @throws UnsupportedOperationException If this method is called + */ + public function key () { + throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION); + } +} + +// [EOF] +?> diff --git a/inc/classes/main/file_directories/output/raw/.htaccess b/inc/classes/main/file_directories/output/raw/.htaccess new file mode 100644 index 00000000..3a428827 --- /dev/null +++ b/inc/classes/main/file_directories/output/raw/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/inc/classes/main/file_directories/output/class_FrameworkFileOutputPointer.php b/inc/classes/main/file_directories/output/raw/class_FrameworkRawFileOutputPointer.php similarity index 95% rename from inc/classes/main/file_directories/output/class_FrameworkFileOutputPointer.php rename to inc/classes/main/file_directories/output/raw/class_FrameworkRawFileOutputPointer.php index 2d0aa8e1..1ce29eac 100644 --- a/inc/classes/main/file_directories/output/class_FrameworkFileOutputPointer.php +++ b/inc/classes/main/file_directories/output/raw/class_FrameworkRawFileOutputPointer.php @@ -21,7 +21,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -class FrameworkFileOutputPointer extends BaseFileIo implements OutputPointer { +class FrameworkRawFileOutputPointer extends BaseFileIo implements OutputPointer { /** * Protected constructor * @@ -42,7 +42,7 @@ class FrameworkFileOutputPointer extends BaseFileIo implements OutputPointer { * @throws FileIoException If fopen() returns not a file resource * @return void */ - public static final function createFrameworkFileOutputPointer ($fileName, $mode) { + public static final function createFrameworkRawFileOutputPointer ($fileName, $mode) { // Some pre-sanity checks... if (is_null($fileName)) { // No filename given @@ -57,7 +57,7 @@ class FrameworkFileOutputPointer extends BaseFileIo implements OutputPointer { } // END - if // Create new instance - $pointerInstance = new FrameworkFileOutputPointer(); + $pointerInstance = new FrameworkRawFileOutputPointer(); // Set file pointer and file name $pointerInstance->setPointer($filePointer); diff --git a/inc/classes/main/file_directories/output/text/.htaccess b/inc/classes/main/file_directories/output/text/.htaccess new file mode 100644 index 00000000..3a428827 --- /dev/null +++ b/inc/classes/main/file_directories/output/text/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/inc/classes/main/file_directories/output/text/class_FrameworkTextFileOutputPointer.php b/inc/classes/main/file_directories/output/text/class_FrameworkTextFileOutputPointer.php new file mode 100644 index 00000000..1ce29eac --- /dev/null +++ b/inc/classes/main/file_directories/output/text/class_FrameworkTextFileOutputPointer.php @@ -0,0 +1,150 @@ + + * @version 0.0.0 + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2014 Core Developer Team + * @license GNU GPL 3.0 or any newer version + * @link http://www.shipsimu.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +class FrameworkRawFileOutputPointer extends BaseFileIo implements OutputPointer { + /** + * Protected constructor + * + * @return void + */ + protected function __construct () { + // Call parent constructor + parent::__construct(__CLASS__); + } + + /** + * Create a file pointer based on the given file. The file will also + * be verified here. + * + * @param $fileName The file name we shall pass to fopen() + * @param $mode The output mode ('w', 'a' are valid) + * @throws FileIsEmptyException If the provided file name is empty. + * @throws FileIoException If fopen() returns not a file resource + * @return void + */ + public static final function createFrameworkRawFileOutputPointer ($fileName, $mode) { + // Some pre-sanity checks... + if (is_null($fileName)) { + // No filename given + throw new FileIsEmptyException(NULL, self::EXCEPTION_UNEXPECTED_EMPTY_STRING); + } // END - if + + // Try to open a handler + $filePointer = @fopen($fileName, $mode); + if ((is_null($filePointer)) || ($filePointer === FALSE)) { + // Something bad happend + throw new FileIoException ($fileName, self::EXCEPTION_FILE_POINTER_INVALID); + } // END - if + + // Create new instance + $pointerInstance = new FrameworkRawFileOutputPointer(); + + // Set file pointer and file name + $pointerInstance->setPointer($filePointer); + $pointerInstance->setFileName($fileName); + + // Return the instance + return $pointerInstance; + } + + /** + * Write data to a file pointer + * + * @param $dataStream The data stream we shall write to the file + * @return mixed Number of writes bytes or FALSE on error + * @throws NullPointerException If the file pointer instance + * is not set by setPointer() + * @throws InvalidResourceException If there is being set + * an invalid file resource + */ + public function writeToFile ($dataStream) { + if (is_null($this->getPointer())) { + // Pointer not initialized + throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER); + } elseif (!is_resource($this->getPointer())) { + // Pointer is not a valid resource! + throw new InvalidResourceException($this, self::EXCEPTION_INVALID_RESOURCE); + } + + // Write data to the file pointer and return written bytes + return fwrite($this->getPointer(), $dataStream); + } + + /** + * Analyzes entries in index file. This will count all found (and valid) + * entries, mark invalid as damaged and count gaps ("fragmentation"). If + * only gaps are found, the file is considered as "virgin" (no entries). + * + * @return void + * @throws UnsupportedOperationException If this method is called + */ + public function analyzeFile () { + throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION); + } + + /** + * Writes at given position by seeking to it. + * + * @param $seekPosition Seek position in file + * @param $data Data to be written + * @return mixed Number of writes bytes or FALSE on error + * @throws UnsupportedOperationException If this method is called + */ + public function writeAtPosition ($seedPosition, $data) { + throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION); + } + + /** + * Advances to next "block" of bytes + * + * @return void + * @throws UnsupportedOperationException If this method is called + */ + public function next () { + throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION); + } + + /** + * 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 + * @throws UnsupportedOperationException If this method is called + */ + public function valid () { + throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION); + } + + /** + * Gets current seek position ("key"). + * + * @return $key Current key in iteration + * @throws UnsupportedOperationException If this method is called + */ + public function key () { + throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION); + } +} + +// [EOF] +?> diff --git a/inc/classes/main/file_directories/text/input/class_BaseTextInputFile.php b/inc/classes/main/file_directories/text/input/class_BaseTextInputFile.php new file mode 100644 index 00000000..d5d2d0cb --- /dev/null +++ b/inc/classes/main/file_directories/text/input/class_BaseTextInputFile.php @@ -0,0 +1,52 @@ + + * @version 0.0.0 + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2014 Core Developer Team + * @license GNU GPL 3.0 or any newer version + * @link http://www.ship-simu.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +class BaseInputTextFile extends BaseTextFile { + /** + * Protected constructor + * + * @param $className Name of the class + * @return void + */ + protected function __construct ($className) { + // Call parent constructor + parent::__construct($className); + } + + /** + * Initializes this text file for reading + * + * @param $fileName File's name + * @return void + */ + protected function initFile ($fileName) { + // Get a file i/o pointer instance + $pointerInstance = ObjectFactory::createObjectByConfiguredName('text_file_input_class', array($fileName)); + + // ... and set it here + $this->setPointerInstance($pointerInstance); + } +} + +// [EOF] +?> diff --git a/inc/classes/main/file_directories/text/input/csv/.htaccess b/inc/classes/main/file_directories/text/input/csv/.htaccess new file mode 100644 index 00000000..3a428827 --- /dev/null +++ b/inc/classes/main/file_directories/text/input/csv/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/inc/classes/main/file_directories/text/csv/class_CsvFile.php b/inc/classes/main/file_directories/text/input/csv/class_CsvInputFile.php similarity index 86% rename from inc/classes/main/file_directories/text/csv/class_CsvFile.php rename to inc/classes/main/file_directories/text/input/csv/class_CsvInputFile.php index dbe99aa0..b6c8d5e6 100644 --- a/inc/classes/main/file_directories/text/csv/class_CsvFile.php +++ b/inc/classes/main/file_directories/text/input/csv/class_CsvInputFile.php @@ -1,6 +1,6 @@ * @version 0.0.0 @@ -21,7 +21,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -class CsvFile extends BaseTextFile implements CsvInputStreamer { +class CsvInputFile extends BaseInputTextFile implements CsvInputStreamer { /** * Protected constructor * @@ -38,9 +38,9 @@ class CsvFile extends BaseTextFile implements CsvInputStreamer { * @param $fileName Name of the index file * @return $fileInstance An instance of this File class */ - public final static function createCsvFile ($fileName) { + public final static function createCsvInputFile ($fileName) { // Get a new instance - $fileInstance = new CsvFile(); + $fileInstance = new CsvInputFile(); // Set file name $fileInstance->setFileName($fileName); diff --git a/inc/classes/main/file_directories/text/output/class_BaseTextOutputFile.php b/inc/classes/main/file_directories/text/output/class_BaseTextOutputFile.php new file mode 100644 index 00000000..13e51ebd --- /dev/null +++ b/inc/classes/main/file_directories/text/output/class_BaseTextOutputFile.php @@ -0,0 +1,52 @@ + + * @version 0.0.0 + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2014 Core Developer Team + * @license GNU GPL 3.0 or any newer version + * @link http://www.ship-simu.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +class BaseTextFile extends BaseFile { + /** + * Protected constructor + * + * @param $className Name of the class + * @return void + */ + protected function __construct ($className) { + // Call parent constructor + parent::__construct($className); + } + + /** + * Initializes this text file for reading + * + * @param $fileName File's name + * @return void + */ + protected function initFile ($fileName) { + // Get a file i/o pointer instance + $pointerInstance = ObjectFactory::createObjectByConfiguredName('text_file_output_class', array($fileName)); + + // ... and set it here + $this->setPointerInstance($pointerInstance); + } +} + +// [EOF] +?> diff --git a/inc/config.php b/inc/config.php index b022da0a..1a855b97 100644 --- a/inc/config.php +++ b/inc/config.php @@ -359,17 +359,20 @@ $cfg->setConfigEntry('database_cache_enabled', FALSE); // CFG: DIRECTORY-CLASS $cfg->setConfigEntry('directory_class', 'FrameworkDirectoryPointer'); -// CFG: FILE-INPUT-CLASS -$cfg->setConfigEntry('file_raw_input_class', 'FrameworkFileInputPointer'); +// CFG: FILE-RAW-INPUT-CLASS +$cfg->setConfigEntry('file_raw_input_class', 'FrameworkRawFileInputPointer'); -// CFG: FILE-OUTPUT-CLASS -$cfg->setConfigEntry('file_raw_output_class', 'FrameworkFileOutputPointer'); +// CFG: FILE-RAW-OUTPUT-CLASS +$cfg->setConfigEntry('file_raw_output_class', 'FrameworkRawFileOutputPointer'); -// CFG: FILE-INPUT-OUTPUT-CLASS +// CFG: FILE-RAW-INPUT-OUTPUT-CLASS $cfg->setConfigEntry('file_raw_input_output_class', 'FrameworkFileInputOutputPointer'); -// CFG: CSV-FILE-CLASS -$cfg->setConfigEntry('csv_file_class', 'CsvFile'); +// CFG: TEXT-FILE-INPUT-CLASS +$cfg->setConfigEntry('text_file_input_class', 'FrameworkTextFileInputPointer'); + +// CFG: CSV-INPUT-FILE-CLASS +$cfg->setConfigEntry('csv_input_file_class', 'CsvInputFile'); // CFG: FILE-ITERATOR-CLASS $cfg->setConfigEntry('file_iterator_class', 'FileIterator'); -- 2.39.2