travi/php-framework

View on GitHub
php/framework/src/travi/framework/dependencyManagement/ClientDependencies.php

Summary

Maintainability
A
45 mins
Test Coverage
<?php

namespace travi\framework\dependencyManagement;

use travi\framework\http\Request,
    travi\framework\exception\MissingLocalPathToResourceException;

class ClientDependencies
{
    const DEFAULT_JQUERY_UI_THEME
        = 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.min.css';

    const CSS_DEPENDENCIES_KEY = 'cssDependencies';
    const JS_DEPENDENCIES_KEY  = 'jsDependencies';

    /** @var Request */
    private $request;
    private $uiDeps;
    private $jsNeeds = array();

    const LOCAL = 'local';

    public function getDependenciesFor($item)
    {
        $this->lazyInit();

        if (isset($this->jsNeeds[$item])) {
            return $this->jsNeeds[$item];
        }
    }

    public function resolveFileURI($resource)
    {
        $this->lazyInit();

        if (isset($this->jsNeeds[$resource]) && isset($this->jsNeeds[$resource][self::LOCAL])) {
            return $this->jsNeeds[$resource][self::LOCAL];
        } else {
            return $resource;
        }
    }

    private function flattenDeps($deps = array(), $requirement = null)
    {
        $this->jsNeeds['jqueryUiTheme'][self::LOCAL] = $this->determineJqueryUiTheme();

        foreach ($deps as $name => $dep) {
            $this->mapConfigDetails($dep, $name, $requirement);
            $this->applyLargeScreenEnhancement($requirement, $dep, $name);
        }
    }

    private function largeScreenEnhancementsDefined($dep)
    {
        return !empty($dep[Request::LARGE_ENHANCEMENT]);
    }

    private function largeScreenVersionRequested()
    {
        return $this->request->getEnhancementVersion() === Request::LARGE_ENHANCEMENT;
    }

    private function mapConfigDetails($dep, $name, $requirement)
    {
        $item = &$this->jsNeeds[$name];

        $this->setLocalVersion($dep, $name, $item);
        $this->setCdnVersion($dep, $item);

        $this->addDependenciesToListForComponent($dep, $item, self::JS_DEPENDENCIES_KEY, $requirement);
        $this->addDependenciesToListForComponent($dep, $item, self::CSS_DEPENDENCIES_KEY);

        if (!empty($dep['plugins'])) {
            $this->flattenDeps($dep['plugins'], $name);
        }

        if (!empty($dep['clientTemplates'])) {
            $item['clientTemplates'] = $dep['clientTemplates'];
        }
    }

    private function addDependenciesToListForComponent(
        $dependencySourceList,
        &$component,
        $key,
        $requirement = null
    ) {
        if (!empty($dependencySourceList[$key]) || !empty($requirement)) {
            if (empty($component[$key])) {
                $component[$key] = array();
            }

            if (!empty($requirement)) {
                array_push($component[$key], $requirement);
            }

            if (!empty($dependencySourceList[$key])) {
                $component[$key] = array_merge($component[$key], $dependencySourceList[$key]);
            }
        }
    }

    private function lazyInit()
    {
        if (empty($this->jsNeeds)) {
            $this->flattenDeps($this->uiDeps);
        }
    }

    /**
     * @PdInject uiDeps
     * @param $deps
     */
    public function setUiDeps($deps)
    {
        $this->uiDeps = $deps;
    }

    /**
     * @PdInject request
     * @param $request
     */
    public function setRequest($request)
    {
        $this->request = $request;
    }

    /**
     * @return string
     */
    private function determineJqueryUiTheme()
    {
        if (defined('JQUERY_UI_THEME')) {
            return JQUERY_UI_THEME;
        } else {
            return self::DEFAULT_JQUERY_UI_THEME;
        }
    }

    /**
     * @param $requirement
     * @param $dep
     * @param $name
     */
    private function applyLargeScreenEnhancement($requirement, $dep, $name)
    {
        if ($this->largeScreenVersionRequested() && $this->largeScreenEnhancementsDefined($dep)) {
            $this->mapConfigDetails($dep[Request::LARGE_ENHANCEMENT], $name, $requirement);
        }
    }

    /**
     * @param $dep
     * @param $name
     * @param $item
     * @return array
     * @throws MissingLocalPathToResourceException
     */
    private function setLocalVersion($dep, $name, &$item)
    {
        if (!empty($dep[self::LOCAL])) {
            $item[self::LOCAL] = $dep[self::LOCAL];
        } else {
            if (empty($dep[Request::LARGE_ENHANCEMENT])) {
                throw new MissingLocalPathToResourceException($name);
            }
        }
    }

    /**
     * @param $dep
     * @param $item
     */
    private function setCdnVersion(&$dep, &$item)
    {
        if (isset($dep['cdn'])) {
            $item['cdn'] = $dep['cdn'];
        }
    }
}