Yaffs site version 1.1
[yaffs-website] / vendor / drupal / console / src / Utils / Site.php
1 <?php
2
3 namespace Drupal\Console\Utils;
4
5 use Symfony\Component\DependencyInjection\Reference;
6 use Symfony\Component\Filesystem\Filesystem;
7 use Symfony\Component\Finder\Finder;
8 use Drupal\Core\DependencyInjection\ContainerBuilder;
9 use Drupal\Core\Logger\LoggerChannelFactory;
10 use Drupal\Core\Language\LanguageManager;
11 use Drupal\Core\Language\Language;
12 use Drupal\Core\Site\Settings;
13 use Drupal\Console\Core\Utils\ConfigurationManager;
14
15 class Site
16 {
17     /**
18      * @var string
19      */
20     protected $appRoot;
21
22     /**
23      * @var ConfigurationManager
24      */
25     protected $configurationManager;
26
27     /**
28      * @var string
29      */
30     protected $cacheDirectory;
31
32     /**
33      * Site constructor.
34      *
35      * @param string               $appRoot
36      * @param ConfigurationManager $configurationManager
37      */
38     public function __construct(
39         $appRoot,
40         ConfigurationManager $configurationManager
41     ) {
42         $this->appRoot = $appRoot;
43         $this->configurationManager = $configurationManager;
44     }
45
46     public function loadLegacyFile($legacyFile, $relative = true)
47     {
48         if ($relative) {
49             $legacyFile = realpath(
50                 sprintf('%s/%s', $this->appRoot, $legacyFile)
51             );
52         }
53
54         if (file_exists($legacyFile)) {
55             include_once $legacyFile;
56
57             return true;
58         }
59
60         return false;
61     }
62
63     /**
64      * @return array
65      */
66     public function getStandardLanguages()
67     {
68         $standardLanguages = LanguageManager::getStandardLanguageList();
69         $languages = [];
70         foreach ($standardLanguages as $langcode => $standardLanguage) {
71             $languages[$langcode] = $standardLanguage[0];
72         }
73
74         return $languages;
75     }
76
77     /**
78      * @return array
79      */
80     public function getDatabaseTypes()
81     {
82         $this->loadLegacyFile('/core/includes/install.inc');
83         $this->setMinimalContainerPreKernel();
84
85         $driverDirectories = [
86             $this->appRoot . '/core/lib/Drupal/Core/Database/Driver',
87             $this->appRoot . '/drivers/lib/Drupal/Driver/Database'
88         ];
89
90         $driverDirectories = array_filter(
91             $driverDirectories,
92             function ($directory) {
93                 return is_dir($directory);
94             }
95         );
96
97         $finder = new Finder();
98         $finder->directories()
99             ->in($driverDirectories)
100             ->depth('== 0');
101
102         $databases = [];
103         foreach ($finder as $driver_folder) {
104             if (file_exists($driver_folder->getRealpath() . '/Install/Tasks.php')) {
105                 $driver  = $driver_folder->getBasename();
106                 $installer = db_installer_object($driver);
107                 // Verify is database is installable
108                 if ($installer->installable()) {
109                     $reflection = new \ReflectionClass($installer);
110                     $install_namespace = $reflection->getNamespaceName();
111                     // Cut the trailing \Install from namespace.
112                     $driver_class = substr($install_namespace, 0, strrpos($install_namespace, '\\'));
113                     $databases[$driver] = ['namespace' => $driver_class, 'name' =>$installer->name()];
114                 }
115             }
116         }
117
118         return $databases;
119     }
120
121     protected function setMinimalContainerPreKernel()
122     {
123         // Create a minimal mocked container to support calls to t() in the pre-kernel
124         // base system verification code paths below. The strings are not actually
125         // used or output for these calls.
126         $container = new ContainerBuilder();
127         $container->setParameter('language.default_values', Language::$defaultValues);
128         $container
129             ->register('language.default', 'Drupal\Core\Language\LanguageDefault')
130             ->addArgument('%language.default_values%');
131         $container
132             ->register('string_translation', 'Drupal\Core\StringTranslation\TranslationManager')
133             ->addArgument(new Reference('language.default'));
134
135         // Register the stream wrapper manager.
136         $container
137             ->register('stream_wrapper_manager', 'Drupal\Core\StreamWrapper\StreamWrapperManager')
138             ->addMethodCall('setContainer', [new Reference('service_container')]);
139         $container
140             ->register('file_system', 'Drupal\Core\File\FileSystem')
141             ->addArgument(new Reference('stream_wrapper_manager'))
142             ->addArgument(Settings::getInstance())
143             ->addArgument((new LoggerChannelFactory())->get('file'));
144
145         \Drupal::setContainer($container);
146     }
147
148     public function getDatabaseTypeDriver($driver)
149     {
150         // We cannot use Database::getConnection->getDriverClass() here, because
151         // the connection object is not yet functional.
152         $task_class = "Drupal\\Core\\Database\\Driver\\{$driver}\\Install\\Tasks";
153         if (class_exists($task_class)) {
154             return new $task_class();
155         } else {
156             $task_class = "Drupal\\Driver\\Database\\{$driver}\\Install\\Tasks";
157             return new $task_class();
158         }
159     }
160
161     /**
162      * @return mixed
163      */
164     public function getAutoload()
165     {
166         $autoLoadFile = $this->appRoot.'/autoload.php';
167
168         return include $autoLoadFile;
169     }
170
171     /**
172      * @return boolean
173      */
174     public function multisiteMode($uri)
175     {
176         if ($uri != 'default') {
177             return true;
178         }
179
180         return false;
181     }
182
183     /**
184      * @return boolean
185      */
186     public function validMultisite($uri)
187     {
188         $multiSiteFile = sprintf(
189             '%s/sites/sites.php',
190             $this->appRoot
191         );
192
193         if (file_exists($multiSiteFile)) {
194             include $multiSiteFile;
195         } else {
196             return false;
197         }
198
199         if (isset($sites[$uri]) && is_dir($this->appRoot . "/sites/" . $sites[$uri])) {
200             return true;
201         }
202
203         return false;
204     }
205
206     public function getCacheDirectory()
207     {
208         if ($this->cacheDirectory) {
209             return $this->cacheDirectory;
210         }
211
212         $configFactory = \Drupal::configFactory();
213         $siteId = $configFactory->get('system.site')
214             ->get('uuid');
215         $pathTemporary = $configFactory->get('system.file')
216             ->get('path.temporary');
217         $configuration = $this->configurationManager->getConfiguration();
218         $cacheDirectory = $configuration->get('application.cache.directory')?:'';
219         if ($cacheDirectory) {
220             if (strpos($cacheDirectory, '/') != 0) {
221                 $cacheDirectory = $this->configurationManager
222                     ->getApplicationDirectory() . '/' . $cacheDirectory;
223             }
224             $cacheDirectories[] = $cacheDirectory . '/' . $siteId . '/';
225         }
226         $cacheDirectories[] = sprintf(
227             '%s/cache/%s/',
228             $this->configurationManager->getConsoleDirectory(),
229             $siteId
230         );
231         $cacheDirectories[] = $pathTemporary . '/console/cache/' . $siteId . '/';
232
233         foreach ($cacheDirectories as $cacheDirectory) {
234             if ($this->isValidDirectory($cacheDirectory)) {
235                 $this->cacheDirectory = $cacheDirectory;
236                 break;
237             }
238         }
239
240         return $this->cacheDirectory;
241     }
242
243     private function isValidDirectory($path)
244     {
245         $fileSystem = new Filesystem();
246         if ($fileSystem->exists($path)) {
247             return true;
248         }
249         try {
250             $fileSystem->mkdir($path);
251
252             return true;
253         } catch (\Exception $e) {
254             return false;
255         }
256     }
257
258     public function cachedServicesFile()
259     {
260         return $this->getCacheDirectory().'/console.services.yml';
261     }
262
263     public function cachedServicesFileExists()
264     {
265         return file_exists($this->cachedServicesFile());
266     }
267
268     public function removeCachedServicesFile()
269     {
270         if ($this->cachedServicesFileExists()) {
271             unlink($this->cachedServicesFile());
272         }
273     }
274 }