Security update for permissions_by_term
[yaffs-website] / vendor / behat / behat / src / Behat / Testwork / ServiceContainer / ContainerLoader.php
diff --git a/vendor/behat/behat/src/Behat/Testwork/ServiceContainer/ContainerLoader.php b/vendor/behat/behat/src/Behat/Testwork/ServiceContainer/ContainerLoader.php
new file mode 100644 (file)
index 0000000..a723777
--- /dev/null
@@ -0,0 +1,163 @@
+<?php
+
+/*
+ * This file is part of the Behat Testwork.
+ * (c) Konstantin Kudryashov <ever.zet@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Testwork\ServiceContainer;
+
+use Behat\Testwork\ServiceContainer\Configuration\ConfigurationTree;
+use Behat\Testwork\ServiceContainer\Exception\ExtensionException;
+use Symfony\Component\Config\Definition\Processor;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
+
+/**
+ * Loads Symfony DI container with testwork extension services.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+final class ContainerLoader
+{
+    /**
+     * @var ExtensionManager
+     */
+    private $extensionManager;
+    /**
+     * @var ConfigurationTree
+     */
+    private $configuration;
+    /**
+     * @var Processor
+     */
+    private $processor;
+
+    /**
+     * Initialize extension.
+     *
+     * @param ExtensionManager       $extensionManager
+     * @param null|ConfigurationTree $configuration
+     * @param null|Processor         $processor
+     */
+    public function __construct(
+        ExtensionManager $extensionManager,
+        ConfigurationTree $configuration = null,
+        Processor $processor = null
+    ) {
+        $this->extensionManager = $extensionManager;
+        $this->configuration = $configuration ? : new ConfigurationTree();
+        $this->processor = $processor ? : new Processor();
+    }
+
+    /**
+     * Loads container extension.
+     *
+     * @param ContainerBuilder $container
+     * @param array            $configs
+     */
+    public function load(ContainerBuilder $container, array $configs)
+    {
+        $configs = $this->initializeExtensions($container, $configs);
+        $config = $this->processConfig($configs);
+
+        $this->loadExtensions($container, $config);
+    }
+
+    /**
+     * Processes config against extensions.
+     *
+     * @param array $configs
+     *
+     * @return array
+     */
+    private function processConfig(array $configs)
+    {
+        $tree = $this->configuration->getConfigTree($this->extensionManager->getExtensions());
+
+        return $this->processor->process($tree, $configs);
+    }
+
+    /**
+     * Initializes extensions using provided config.
+     *
+     * @param ContainerBuilder $container
+     * @param array            $configs
+     *
+     * @return array
+     */
+    private function initializeExtensions(ContainerBuilder $container, array $configs)
+    {
+        foreach ($configs as $i => $config) {
+            if (isset($config['extensions'])) {
+                foreach ($config['extensions'] as $extensionLocator => $extensionConfig) {
+                    $extension = $this->extensionManager->activateExtension($extensionLocator);
+                    $configs[$i][$extension->getConfigKey()] = $extensionConfig;
+                }
+
+                unset($configs[$i]['extensions']);
+            }
+        }
+
+        $this->extensionManager->initializeExtensions();
+
+        $container->setParameter('extensions', $this->extensionManager->getExtensionClasses());
+
+        return $configs;
+    }
+
+    /**
+     * Loads all extensions into container using provided config.
+     *
+     * @param ContainerBuilder $container
+     * @param array            $config
+     *
+     * @throws ExtensionException
+     */
+    private function loadExtensions(ContainerBuilder $container, array $config)
+    {
+        // Load default extensions first
+        foreach ($this->extensionManager->getExtensions() as $extension) {
+            $extensionConfig = array();
+            if (isset($config[$extension->getConfigKey()])) {
+                $extensionConfig = $config[$extension->getConfigKey()];
+                unset($config[$extension->getConfigKey()]);
+            }
+
+            $this->loadExtension($container, $extension, $extensionConfig);
+        }
+
+        // Load activated extensions
+        foreach ($config as $extensionConfigKey => $extensionConfig) {
+            if (null === $extension = $this->extensionManager->getExtension($extensionConfigKey)) {
+                throw new ExtensionException(
+                    sprintf('None of the activated extensions use `%s` config section.', $extensionConfigKey), $extensionConfigKey
+                );
+            }
+
+            $this->loadExtension($container, $extension, $extensionConfig);
+        }
+    }
+
+    /**
+     * Loads extension configuration.
+     *
+     * @param ContainerBuilder $container
+     * @param Extension        $extension
+     * @param array            $config
+     */
+    private function loadExtension(ContainerBuilder $container, Extension $extension, array $config)
+    {
+        $tempContainer = new ContainerBuilder(new ParameterBag(array(
+            'paths.base' => $container->getParameter('paths.base'),
+            'extensions' => $container->getParameter('extensions'),
+        )));
+        $tempContainer->addObjectResource($extension);
+        $extension->load($container, $config);
+        $container->merge($tempContainer);
+        $container->addCompilerPass($extension);
+    }
+}