1:   2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91:  92:  93:  94:  95:  96:  97:  98:  99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 
<?php
namespace Omeka\Installation;

use Omeka\Stdlib\ErrorStore;
use Zend\ServiceManager\ServiceLocatorInterface;

class Installer
{
    /**
     * @var ServiceLocatorInterface
     */
    protected $serviceLocator;

    /**
     * @var array Registered pre-installation tasks.
     */
    protected $preTasks = [];

    /**
     * @var array Registered installation tasks.
     */
    protected $tasks = [];

    /**
     * @var array Error messages
     */
    protected $errors = [];

    public function __construct(ServiceLocatorInterface $serviceLocator)
    {
        $this->serviceLocator = $serviceLocator;
    }

    /**
     * Run pre-installation checks.
     *
     * @return bool Whether the pre-installation checks passed.
     */
    public function preInstall()
    {
        foreach ($this->getPreTasks() as $taskName) {
            try {
                $task = new $taskName;
                $task->perform($this);
            } catch (\Exception $e) {
                $this->addError($e->getMessage());
            }
        }

        return !($this->getErrors());
    }

    /**
     * Install Omeka.
     *
     * @return bool Whether the installation was successful.
     */
    public function install()
    {
        // Even if checked before, run the "pre" checks again before the actual install tasks
        if (!$this->preInstall()) {
            return false;
        }

        foreach ($this->getTasks() as $taskName) {
            try {
                $task = new $taskName;
                $task->perform($this);
            } catch (\Exception $e) {
                $this->addError($e->getMessage());
            }

            // Stop immediately upon any error
            if ($this->getErrors()) {
                return false;
            }
        }

        return true;
    }

    /**
     * Register an installation task.
     *
     * @param string $task
     */
    public function registerTask($task)
    {
        $this->tasks[] = $task;
    }

    /**
     * Register an pre-installation task to occur before the installation begins.
     *
     * @param string $task
     */
    public function registerPreTask($task)
    {
        $this->preTasks[] = $task;
    }

    /**
     * Get registered installation tasks.
     *
     * @return array
     */
    public function getTasks()
    {
        return $this->tasks;
    }

    /**
     * Get registered pre-installation tasks.
     *
     * @return array
     */
    public function getPreTasks()
    {
        return $this->preTasks;
    }

    /**
     * Register a specific task's variables.
     *
     * @param string $task
     * @param array $vars
     */
    public function registerVars($task, array $vars)
    {
        $this->vars[$task] = $vars;
    }

    /**
     * Get a specific task's variables.
     *
     * @return array|null
     */
    public function getVars($task)
    {
        return isset($this->vars[$task]) ? $this->vars[$task] : null;
    }

    /**
     * Add errors derived from an ErrorStore.
     *
     * @param ErrorStore $errorStore
     */
    public function addErrorStore(ErrorStore $errorStore)
    {
        foreach ($errorStore->getErrors() as $error) {
            foreach ($error as $message) {
                $this->addError($message);
            }
        }
    }

    /**
     * Add an error message.
     *
     * @param string $message
     */
    public function addError($message)
    {
        $this->errors[] = $message;
    }

    /**
     * Get all error messages.
     *
     * @return array
     */
    public function getErrors()
    {
        return $this->errors;
    }

    /**
     * Get the service locator.
     *
     * @return ServiceLocatorInterface
     */
    public function getServiceLocator()
    {
        return $this->serviceLocator;
    }
}