--- /dev/null
+<?php
+namespace Drush\SiteAlias;
+
+/**
+ * Site Alias manager
+ */
+class SiteAliasManager
+{
+ protected $aliasLoader;
+ protected $legacyAliasConverter;
+ protected $selfAliasRecord;
+ protected $specParser;
+ protected $root = '';
+
+ /**
+ * Constructor for SiteAliasManager
+ *
+ * @param SiteAliasFileLoader|null $aliasLoader an alias loader
+ */
+ public function __construct($aliasLoader = null, $root = '')
+ {
+ $this->aliasLoader = $aliasLoader ?: new SiteAliasFileLoader();
+ $this->legacyAliasConverter = new LegacyAliasConverter($this->aliasLoader->discovery());
+ $this->specParser = new SiteSpecParser();
+ $this->selfAliasRecord = new AliasRecord();
+ $this->root = $root;
+ }
+
+ /**
+ * Allow configuration data to be used in replacements in the alias file.
+ */
+ public function setReferenceData($data)
+ {
+ $this->aliasLoader->setReferenceData($data);
+ }
+
+ /**
+ * Inject the root of the selected site
+ *
+ * @param string $root
+ * @return $this
+ */
+ public function setRoot($root)
+ {
+ $this->root = $root;
+ return $this;
+ }
+
+ /**
+ * Add a search location to our site alias discovery object.
+ *
+ * @param string $path
+ *
+ * @return $this
+ */
+ public function addSearchLocation($path)
+ {
+ $this->aliasLoader->discovery()->addSearchLocation($path);
+ return $this;
+ }
+
+ /**
+ * Add search locations to our site alias discovery object.
+ *
+ * @param array $paths Any path provided in --alias-path option
+ * or drush.path.alias-path configuration item.
+ *
+ * @return $this
+ */
+ public function addSearchLocations(array $paths)
+ {
+ foreach ($paths as $path) {
+ $this->aliasLoader->discovery()->addSearchLocation($path);
+ }
+ return $this;
+ }
+
+ /**
+ * Return all of the paths where alias files may be found.
+ * @return string[]
+ */
+ public function searchLocations()
+ {
+ return $this->aliasLoader->discovery()->searchLocations();
+ }
+
+ /**
+ * Get an alias record by name, or convert a site specification
+ * into an alias record via the site alias spec parser. If a
+ * simple alias name is provided (e.g. '@alias'), it is interpreted
+ * as a sitename, and the default environment for that site is returned.
+ *
+ * @param string $name Alias name or site specification
+ *
+ * @return AliasRecord|false
+ */
+ public function get($name)
+ {
+ if (SiteAliasName::isAliasName($name)) {
+ return $this->getAlias($name);
+ }
+
+ if ($this->specParser->validSiteSpec($name)) {
+ return new AliasRecord($this->specParser->parse($name, $this->root), $name);
+ }
+
+ return false;
+ }
+
+ /**
+ * Get the '@self' alias record.
+ *
+ * @return AliasRecord
+ */
+ public function getSelf()
+ {
+ return $this->selfAliasRecord;
+ }
+
+ /**
+ * Force-set the current @self alias.
+ *
+ * @param AliasRecord $selfAliasRecord
+ * @return $this
+ */
+ public function setSelf(AliasRecord $selfAliasRecord)
+ {
+ $this->selfAliasRecord = $selfAliasRecord;
+ $this->setRoot($selfAliasRecord->localRoot());
+ return $this;
+ }
+
+ /**
+ * Get an alias record from a name. Does not accept site specifications.
+ *
+ * @param string $aliasName alias name
+ *
+ * @return AliasRecord
+ */
+ public function getAlias($aliasName)
+ {
+ $aliasName = SiteAliasName::parse($aliasName);
+
+ if ($aliasName->isSelf()) {
+ return $this->getSelf();
+ }
+
+ if ($aliasName->isNone()) {
+ return new AliasRecord([], '@none');
+ }
+
+ // Search through all search locations, load
+ // matching and potentially-matching alias files,
+ // and return the alias matching the provided name.
+ return $this->aliasLoader->load($aliasName);
+ }
+
+ /**
+ * Given a simple alias name, e.g. '@alias', returns all of the
+ * environments in the specified site.
+ *
+ * If the provided name is a site specification et. al.,
+ * then this method will return 'false'.
+ *
+ * @param string $name Alias name or site specification
+ * @return AliasRecord[]|false
+ */
+ public function getMultiple($name)
+ {
+ if (empty($name)) {
+ return $this->aliasLoader->loadAll();
+ }
+
+ if (!SiteAliasName::isAliasName($name)) {
+ return false;
+ }
+
+ // Trim off the '@' and load all that match
+ $result = $this->aliasLoader->loadMultiple(ltrim($name, '@'));
+
+ // Special checking for @self
+ if ($name == '@self') {
+ $self = $this->getSelf();
+ $result = array_merge(
+ ['@self' => $self],
+ $result
+ );
+ }
+
+ return $result;
+ }
+
+ /**
+ * Return the paths to all alias files in all search locations known
+ * to the alias manager.
+ *
+ * @return string[]
+ */
+ public function listAllFilePaths()
+ {
+ return $this->aliasLoader->listAll();
+ }
+}