web/lib/Zend/Service/WindowsAzure/CommandLine/PackageScaffolder/PackageScaffolderAbstract.php
changeset 808 6b6c2214f778
child 1230 68c69c656a2c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/lib/Zend/Service/WindowsAzure/CommandLine/PackageScaffolder/PackageScaffolderAbstract.php	Thu Mar 21 19:52:38 2013 +0100
@@ -0,0 +1,249 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category   Zend
+ * @package    Zend_Service_WindowsAzure
+ * @copyright  Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    http://framework.zend.com/license/new-bsd     New BSD License
+ * @version    $Id$
+ */
+
+/**
+ * @category   Zend
+ * @package    Zend_Service_WindowsAzure_CommandLine
+ * @copyright  Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    http://framework.zend.com/license/new-bsd     New BSD License
+ */ 
+abstract class Zend_Service_WindowsAzure_CommandLine_PackageScaffolder_PackageScaffolderAbstract
+{
+	/**
+	 * Invokes the scaffolder.
+	 *
+	 * @param Phar $phar Phar archive containing the current scaffolder.
+	 * @param string $root Path Root path.
+	 * @param array $options Options array (key/value).
+	 */
+	abstract public function invoke(Phar $phar, $rootPath, $options = array());
+	
+	/**
+	 * Writes output to STDERR, followed by a newline (optional)
+	 * 
+	 * @param string $message
+	 * @param string $newLine
+	 */
+	protected function log($message, $newLine = true)
+	{
+		if (error_reporting() === 0) {
+			return;
+		}
+		file_put_contents('php://stderr', $message . ($newLine ? "\r\n" : ''));
+	}
+	
+	/**
+	 * Extract resources to a file system path
+	 * 
+	 * @param Phar $phar Phar archive.
+	 * @param string $path Output path root.
+	 */
+	protected function extractResources(Phar $phar, $path)
+	{
+		$this->deleteDirectory($path);
+		$phar->extractTo($path);
+		@unlink($path . '/index.php');
+		@unlink($path . '/build.bat');
+		$this->copyDirectory($path . '/resources', $path, false);
+		$this->deleteDirectory($path . '/resources');
+	}
+	
+	/**
+	 * Apply file transforms.
+	 * 
+	 * @param string $rootPath Root path.
+	 * @param array $values Key/value array.
+	 */
+	protected function applyTransforms($rootPath, $values)
+	{
+        if (is_null($rootPath) || !is_string($rootPath) || empty($rootPath)) {
+            throw new InvalidArgumentException("Undefined \"rootPath\"");
+        }
+                        
+        if (is_dir($rootPath)) {
+            $d = dir($rootPath);
+            while ( false !== ( $entry = $d->read() ) ) {
+                if ( $entry == '.' || $entry == '..' ) {
+                    continue;
+                }
+                $entry = $rootPath . '/' . $entry; 
+                
+                $this->applyTransforms($entry, $values);
+            }
+            $d->close();
+        } else {
+        	$contents = file_get_contents($rootPath);
+        	foreach ($values as $key => $value) {
+        		$contents = str_replace('$' . $key . '$', $value, $contents);
+        	}
+            file_put_contents($rootPath, $contents);
+        }
+        
+        return true;
+	}
+	
+	/**
+     * Create directory
+     * 
+     * @param string  $path           Path of directory to create.
+     * @param boolean $abortIfExists  Abort if directory exists.
+     * @param boolean $recursive      Create parent directories if not exist.
+     * 
+     * @return boolean
+     */
+    protected function createDirectory($path, $abortIfExists = true, $recursive = true) {
+        if (is_null($path) || !is_string($path) || empty($path)) {
+            throw new InvalidArgumentException ("Undefined \"path\"" );        
+        }
+                
+        if (is_dir($path) && $abortIfExists) {
+            return false;       
+        }
+        
+        if (is_dir($path) ) {
+            @chmod($path, '0777');
+            if (!self::deleteDirectory($path) ) {
+                throw new RuntimeException("Failed to delete \"{$path}\".");
+            }
+        }
+            
+        if (!mkdir($path, '0777', $recursive) || !is_dir($path)) {
+            throw new RuntimeException( "Failed to create directory \"{$path}\"." );
+        }
+
+        return true;
+    }
+    
+    /**
+     * Fully copy a source directory to a target directory.
+     * 
+     * @param string  $sourcePath   Source directory
+     * @param string  $destinationPath   Target directory
+     * @param boolean $abortIfExists Query re-creating target directory if exists
+     * @param octal   $mode           Changes access mode
+     * 
+     * @return boolean
+     */
+    protected function copyDirectory($sourcePath, $destinationPath, $abortIfExists = true, $mode = '0777') {
+        if (is_null($sourcePath) || !is_string($sourcePath) || empty($sourcePath)) {
+            throw new InvalidArgumentException("Undefined \"sourcePath\"");
+        }
+        
+        if (is_null($destinationPath) || !is_string($destinationPath) || empty($destinationPath)) {
+        	throw new InvalidArgumentException("Undefined \"destinationPath\"");
+        }
+                    
+        if (is_dir($destinationPath) && $abortIfExists) {
+            return false;
+        }
+                        
+        if (is_dir($sourcePath)) {
+            if (!is_dir($destinationPath) && !mkdir($destinationPath, $mode)) {
+                throw new RuntimeException("Failed to create target directory \"{$destinationPath}\"" );
+            }
+            $d = dir($sourcePath);
+            while ( false !== ( $entry = $d->read() ) ) {
+                if ( $entry == '.' || $entry == '..' ) {
+                    continue;
+                }
+                $strSourceEntry = $sourcePath . '/' . $entry; 
+                $strTargetEntry = $destinationPath . '/' . $entry;
+                if (is_dir($strSourceEntry) ) {
+                    $this->copyDirectory(
+                    	$strSourceEntry, 
+                    	$strTargetEntry, 
+                    	false, 
+                    	$mode
+                    );
+                    continue;
+                }
+                if (!copy($strSourceEntry, $strTargetEntry) ) {
+                    throw new RuntimeException (
+                        "Failed to copy"
+                        . " file \"{$strSourceEntry}\""
+                        . " to \"{$strTargetEntry}\"" 
+                    );
+                }
+            }
+            $d->close();
+        } else {
+            if (!copy($sourcePath, $destinationPath)) {
+                throw new RuntimeException (
+                    "Failed to copy"
+                    . " file \"{$sourcePath}\""
+                    . " to \"{$destinationPath}\"" 
+                    
+                );
+            }
+        }
+        
+        return true;
+    }
+    
+    /**
+     * Delete directory and all of its contents;
+     * 
+     * @param string $path Directory path
+     * @return boolean
+     */
+    protected function deleteDirectory($path) 
+    {
+        if (is_null($path) || !is_string($path) || empty($path)) {
+            throw new InvalidArgumentException( "Undefined \"path\"" );        
+        }
+        
+        $handleDir = false;
+        if (is_dir($path) ) {    
+            $handleDir = @opendir($path);
+        }
+        if (!$handleDir) {
+            return false;
+        }
+        @chmod($path, 0777);
+        while ($file = readdir($handleDir)) {
+            if ($file == '.' || $file == '..') {
+                continue;
+            }
+            
+            $fsEntity = $path . "/" . $file;
+            
+            if (is_dir($fsEntity)) {
+                $this->deleteDirectory($fsEntity);
+                continue;
+            }
+            
+            if (is_file($fsEntity)) {
+                @unlink($fsEntity);
+                continue;
+            }
+            
+            throw new LogicException (
+                "Unexpected file type: \"{$fsEntity}\"" 
+            );
+        }
+        
+        @chmod($path, 0777);        
+        closedir($handleDir);
+        @rmdir($path);
+                     
+        return true;
+    }
+}