From 6eaf2f01766cca8c4465d57ccb668bd4e4e1c80b Mon Sep 17 00:00:00 2001 From: Shikiryu Date: Fri, 10 Jul 2015 23:13:46 +0200 Subject: [PATCH] Correction after some tests --- app/code/Scenario.php | 51 +++++++++++++++---- app/code/Transport/Abstract.php | 26 ---------- app/code/Transport/Email.php | 19 ++++--- app/code/Transport/Factory.php | 16 +++--- app/code/Transport/TransportAbstract.php | 23 +++++++++ .../{Abstract.php => BackupAbstract.php} | 0 app/code/backup/Factory.php | 6 +-- app/code/backup/Files.php | 9 +++- app/scenario/scenarii.json | 8 +-- 9 files changed, 99 insertions(+), 59 deletions(-) delete mode 100644 app/code/Transport/Abstract.php create mode 100644 app/code/Transport/TransportAbstract.php rename app/code/backup/{Abstract.php => BackupAbstract.php} (100%) diff --git a/app/code/Scenario.php b/app/code/Scenario.php index 063825e..3433125 100644 --- a/app/code/Scenario.php +++ b/app/code/Scenario.php @@ -2,43 +2,76 @@ namespace Shikiryu\Backup; +use Shikiryu\Backup\Backup\BackupAbstract; +use Shikiryu\Backup\Transport\TransportAbstract; use Shikiryu\Backup\Backup\Factory as BackupFactory; use Shikiryu\Backup\Transport\Factory as TransportFactory; class Scenario { + /* @var $backup BackupAbstract */ private $backup; - private $to; + /* @var $to TransportAbstract */ + private $transport; + + public static function register() + { + spl_autoload_register(array(__CLASS__, 'autoload')); + } + + public static function autoload($class) + { + // Autoload only "sub-namespaced" class + if (strpos($class, __NAMESPACE__.'\\') === 0) + { + // Delete current namespace from class one + $relative_NS = str_replace(__NAMESPACE__, '', $class); + // Translate namespace structure into directory structure + $translated_path = str_replace('\\', '/', $relative_NS); + // Load class suffixed by ".class.php" + require __DIR__ . '/' . $translated_path . '.php'; + } + } /** * @param array $scenario */ private function __construct(array $scenario) { - $this->backup = BackupFactory::build($scenario['backup']); - $this->to = TransportFactory::build($scenario['to']); + define('TEMP_DIR', __DIR__.'/../temp/'); + $this->backup = BackupFactory::build($scenario['backup']); + $this->transport = TransportFactory::build($this->backup, $scenario['transport']); } + public function send() + { + $this->transport->send(); + } public static function launch($scenario) { + // add autoloader + static::register(); + + // check the given scenario if (is_readable($scenario)) { $scenario = json_decode(file_get_contents($scenario), true); - if (static::isValid($scenario)) { + if (!is_null($scenario) && static::isValid($scenario)) { $scenario = new self($scenario); + $scenario->send(); } throw new \Exception('invalid scenario.'); } throw new \Exception('scenario not found.'); } - public static function isValid(\StdClass $scenario) + public static function isValid(array $scenario) { return - isset($scenario->backup) && - count($scenario->backup) === 1 && - isset($scenario->to) && - count($scenario->to) === 1; + isset($scenario['backup']) && + count($scenario['backup']) === 1 && + isset($scenario['transport']) && + count($scenario['transport']) === 1; } } \ No newline at end of file diff --git a/app/code/Transport/Abstract.php b/app/code/Transport/Abstract.php deleted file mode 100644 index 45c3100..0000000 --- a/app/code/Transport/Abstract.php +++ /dev/null @@ -1,26 +0,0 @@ -config = $config[ucfirst(strtolower($type))]; - $this->backup = $backup; - } - - /** - * @return bool - */ - public abstract function send(); -} \ No newline at end of file diff --git a/app/code/Transport/Email.php b/app/code/Transport/Email.php index b4dbe08..4dbcc44 100644 --- a/app/code/Transport/Email.php +++ b/app/code/Transport/Email.php @@ -2,6 +2,8 @@ namespace Shikiryu\Backup\Transport; +use Shikiryu\Backup\Backup\BackupAbstract; + class Email extends TransportAbstract { @@ -141,10 +143,10 @@ class Email extends TransportAbstract } /** - * @param Shikiryu_Backup_Abstract $backup + * @param BackupAbstract $backup */ - public function __construct(Shikiryu_Backup_Abstract $backup) { - parent::__construct($backup); + public function __construct(BackupAbstract $backup, array $config) { + parent::__construct($backup, $config); $this->setFiles($this->backup->getFilesToBackup()); $this->setStreams($this->backup->getStreamsToBackup()); $this->to = $this->config['to']; @@ -233,9 +235,9 @@ class Email extends TransportAbstract public function send() { // Checking files are selected - $zip = new ZipArchive(); // Load zip library + $zip = new \ZipArchive(); // Load zip library $zip_name = time().".zip"; // Zip name - if($zip->open(dirname(__FILE__).'/bu/'.$zip_name, ZIPARCHIVE::CREATE)==TRUE) { + if($zip->open(TEMP_DIR.$zip_name, \ZIPARCHIVE::CREATE)==TRUE) { if(!empty($this->files)) { foreach($this->files as $file) { @@ -245,7 +247,7 @@ class Email extends TransportAbstract $zip->close(); } - $this->files = array(dirname(__FILE__).'/bu/'.$zip_name=>dirname(__FILE__).'/bu/'.$zip_name); + $this->files = array(TEMP_DIR.$zip_name=>dirname(__FILE__).'/bu/'.$zip_name); $random_hash = md5(date('r', time())); $headers = "From: " . $this->from . "\r\nReply-To: " . $this->from; @@ -259,8 +261,9 @@ Content-Transfer-Encoding: 8bit " . $this->message . "\r\n"; if(!empty($this->files)) - foreach($this->files as $file=>$name) { - $name = end(explode('/', $name)); + foreach($this->files as $file => $name) { + $name = explode('/', $name); + $name = end($name); $output .= " --$random_hash Content-Type: " . self::getMimeType($file) . "; name=" . $name . " diff --git a/app/code/Transport/Factory.php b/app/code/Transport/Factory.php index 13ab2b3..77bed60 100644 --- a/app/code/Transport/Factory.php +++ b/app/code/Transport/Factory.php @@ -2,20 +2,22 @@ namespace Shikiryu\Backup\Transport; +use Shikiryu\Backup\Backup\BackupAbstract; + class Factory { /** - * @param $type - * @param Shikiryu_Backup_Abstract $backup * - * @return bool + * @param BackupAbstract $backup + * @param array $config + * + * @return TransportAbstract|null */ - public static function build(array $config) + public static function build(BackupAbstract $backup, array $config) { - $class = array_keys($config)[0]; + $class = __NAMESPACE__.'\\'.array_keys($config)[0]; if (class_exists($class)) { - /* @var $instance BackupAbstract */ - return new $class(array_values($config)); + return new $class($backup, array_values($config)[0]); } return null; } diff --git a/app/code/Transport/TransportAbstract.php b/app/code/Transport/TransportAbstract.php new file mode 100644 index 0000000..e891738 --- /dev/null +++ b/app/code/Transport/TransportAbstract.php @@ -0,0 +1,23 @@ +config = $config; + $this->backup = $backup; + } + + /** + * @return bool + */ + public abstract function send(); +} \ No newline at end of file diff --git a/app/code/backup/Abstract.php b/app/code/backup/BackupAbstract.php similarity index 100% rename from app/code/backup/Abstract.php rename to app/code/backup/BackupAbstract.php diff --git a/app/code/backup/Factory.php b/app/code/backup/Factory.php index 5ff7bad..ce2a40f 100644 --- a/app/code/backup/Factory.php +++ b/app/code/backup/Factory.php @@ -6,14 +6,14 @@ class Factory { /** * @param array $config + * * @return BackupAbstract */ public static function build(array $config) { - $class = array_keys($config)[0]; + $class = __NAMESPACE__.'\\'.array_keys($config)[0]; if (class_exists($class)) { - /* @var $instance BackupAbstract */ - return new $class(array_values($config)); + return new $class(array_values($config)[0]); } return null; } diff --git a/app/code/backup/Files.php b/app/code/backup/Files.php index 5956e0b..c8880c2 100644 --- a/app/code/backup/Files.php +++ b/app/code/backup/Files.php @@ -5,11 +5,16 @@ class Files extends BackupAbstract { /** - * @param array $filesToBackup + * @param array $config + * @throws \Exception */ - function __construct($filesToBackup = array()) + function __construct($config = array()) { parent::__construct(); + if (!isset($config['files'])) { + throw new \Exception('Files needs a "files" configuration.'); + } + $filesToBackup = $config['files']; if(!empty($filesToBackup) && is_array($filesToBackup)){ $names = array_map("basename",$filesToBackup); $this->_filesToBackup = array_combine($filesToBackup,$names); diff --git a/app/scenario/scenarii.json b/app/scenario/scenarii.json index 08e463f..f94ca43 100644 --- a/app/scenario/scenarii.json +++ b/app/scenario/scenarii.json @@ -1,4 +1,4 @@ -[{ +{ "backup": { "Files": { "files": [ @@ -13,9 +13,9 @@ "db" : "mysql database" } }, - "to": { + "transport": { "Email": { - "to" : "recipient@example.net;recipient2@example.net", // TODO manage more than one recipient + "to" : "recipient@example.net;recipient2@example.net", "from" : "from@example.net", "encoding" : "UTF-8", "subject" : "[Example.net] backup of the day", @@ -28,4 +28,4 @@ "folder" : "/folder" } } -}] \ No newline at end of file +} \ No newline at end of file