friendica-addons/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Package/Loader/LazyAssetPackageLoader.php

282 lines
7.1 KiB
PHP

<?php
/*
* This file is part of the Fxp Composer Asset Plugin package.
*
* (c) François Pluchino <francois.pluchino@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Fxp\Composer\AssetPlugin\Package\Loader;
use Composer\Downloader\TransportException;
use Composer\IO\IOInterface;
use Composer\Package\CompletePackageInterface;
use Composer\Package\Loader\LoaderInterface;
use Composer\Repository\Vcs\VcsDriverInterface;
use Fxp\Composer\AssetPlugin\Exception\InvalidArgumentException;
use Fxp\Composer\AssetPlugin\Package\LazyPackageInterface;
use Fxp\Composer\AssetPlugin\Repository\AssetRepositoryManager;
use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface;
/**
* Lazy loader for asset package.
*
* @author François Pluchino <francois.pluchino@gmail.com>
*/
class LazyAssetPackageLoader implements LazyLoaderInterface
{
/**
* @var string
*/
protected $type;
/**
* @var string
*/
protected $identifier;
/**
* @var array
*/
protected $packageData;
/**
* @var AssetTypeInterface
*/
protected $assetType;
/**
* @var LoaderInterface
*/
protected $loader;
/**
* @var VcsDriverInterface
*/
protected $driver;
/**
* @var IOInterface
*/
protected $io;
/**
* @var AssetRepositoryManager
*/
protected $assetRepositoryManager;
/**
* @var bool
*/
protected $verbose;
/**
* @var array
*/
protected $cache;
/**
* Constructor.
*
* @param string $identifier
* @param string $type
* @param array $packageData
*/
public function __construct($type, $identifier, array $packageData)
{
$this->identifier = $identifier;
$this->type = $type;
$this->packageData = $packageData;
$this->verbose = false;
$this->cache = array();
}
/**
* Sets the asset type.
*
* @param AssetTypeInterface $assetType
*/
public function setAssetType(AssetTypeInterface $assetType)
{
$this->assetType = $assetType;
}
/**
* Sets the laoder.
*
* @param LoaderInterface $loader
*/
public function setLoader(LoaderInterface $loader)
{
$this->loader = $loader;
}
/**
* Sets the driver.
*
* @param VcsDriverInterface $driver
*/
public function setDriver(VcsDriverInterface $driver)
{
$this->driver = $driver;
}
/**
* Sets the IO.
*
* @param IOInterface $io
*/
public function setIO(IOInterface $io)
{
$this->io = $io;
$this->verbose = $io->isVerbose();
}
/**
* Sets the asset repository manager.
*
* @param AssetRepositoryManager $assetRepositoryManager The asset repository manager
*/
public function setAssetRepositoryManager(AssetRepositoryManager $assetRepositoryManager)
{
$this->assetRepositoryManager = $assetRepositoryManager;
}
/**
* {@inheritdoc}
*/
public function load(LazyPackageInterface $package)
{
if (isset($this->cache[$package->getUniqueName()])) {
return $this->cache[$package->getUniqueName()];
}
$this->validateConfig();
$filename = $this->assetType->getFilename();
$msg = 'Reading '.$filename.' of <info>'.$package->getName().'</info> (<comment>'.$package->getPrettyVersion().'</comment>)';
if ($this->verbose) {
$this->io->write($msg);
} else {
$this->io->overwrite($msg, false);
}
$realPackage = $this->loadRealPackage($package);
$this->cache[$package->getUniqueName()] = $realPackage;
if (!$this->verbose) {
$this->io->overwrite('', false);
}
return $realPackage;
}
/**
* Validates the class config.
*
* @throws InvalidArgumentException When the property of this class is not defined
*/
protected function validateConfig()
{
foreach (array('assetType', 'loader', 'driver', 'io') as $property) {
if (null === $this->$property) {
throw new InvalidArgumentException(sprintf('The "%s" property must be defined', $property));
}
}
}
/**
* Loads the real package.
*
* @param LazyPackageInterface $package
*
* @return CompletePackageInterface|false
*/
protected function loadRealPackage(LazyPackageInterface $package)
{
$realPackage = false;
try {
$data = $this->driver->getComposerInformation($this->identifier);
$valid = is_array($data);
$data = $this->preProcess($this->driver, $this->validateData($data), $this->identifier);
if ($this->verbose) {
$this->io->write('Importing '.($valid ? '' : 'empty ').$this->type.' '.$data['version'].' ('.$data['version_normalized'].')');
}
/* @var CompletePackageInterface $realPackage */
$realPackage = $this->loader->load($data);
} catch (\Exception $e) {
if ($this->verbose) {
$filename = $this->assetType->getFilename();
$this->io->write('<'.$this->getIoTag().'>Skipped '.$this->type.' '.$package->getPrettyVersion().', '.($e instanceof TransportException ? 'no '.$filename.' file was found' : $e->getMessage()).'</'.$this->getIoTag().'>');
}
}
$this->driver->cleanup();
return $realPackage;
}
/**
* @param array|bool $data
*
* @return array
*/
protected function validateData($data)
{
return is_array($data) ? $data : array();
}
/**
* Gets the tag name for IO.
*
* @return string
*/
protected function getIoTag()
{
return 'branch' === $this->type ? 'error' : 'warning';
}
/**
* Pre process the data of package before the conversion to Package instance.
*
* @param VcsDriverInterface $driver
* @param array $data
* @param string $identifier
*
* @return array
*/
protected function preProcess(VcsDriverInterface $driver, array $data, $identifier)
{
$vcsRepos = array();
$data = array_merge($data, $this->packageData);
$data = $this->assetType->getPackageConverter()->convert($data, $vcsRepos);
$this->addRepositories($vcsRepos);
if (!isset($data['dist'])) {
$data['dist'] = $driver->getDist($identifier);
}
if (!isset($data['source'])) {
$data['source'] = $driver->getSource($identifier);
}
return $this->assetRepositoryManager->solveResolutions((array) $data);
}
/**
* Dispatches the vcs repositories event.
*
* @param array $vcsRepositories
*/
protected function addRepositories(array $vcsRepositories)
{
if (null !== $this->assetRepositoryManager) {
$this->assetRepositoryManager->addRepositories($vcsRepositories);
}
}
}