Chris@2: , Sebastian Heuer , Sebastian Bergmann Chris@2: * Chris@2: * For the full copyright and license information, please view the LICENSE Chris@2: * file that was distributed with this source code. Chris@2: */ Chris@2: Chris@2: namespace PharIo\Manifest; Chris@2: Chris@2: use PharIo\Version\Version; Chris@2: use PharIo\Version\Exception as VersionException; Chris@2: use PharIo\Version\VersionConstraintParser; Chris@2: Chris@2: class ManifestDocumentMapper { Chris@2: /** Chris@2: * @param ManifestDocument $document Chris@2: * Chris@2: * @returns Manifest Chris@2: * Chris@2: * @throws ManifestDocumentMapperException Chris@2: */ Chris@2: public function map(ManifestDocument $document) { Chris@2: try { Chris@2: $contains = $document->getContainsElement(); Chris@2: $type = $this->mapType($contains); Chris@2: $copyright = $this->mapCopyright($document->getCopyrightElement()); Chris@2: $requirements = $this->mapRequirements($document->getRequiresElement()); Chris@2: $bundledComponents = $this->mapBundledComponents($document); Chris@2: Chris@2: return new Manifest( Chris@2: new ApplicationName($contains->getName()), Chris@2: new Version($contains->getVersion()), Chris@2: $type, Chris@2: $copyright, Chris@2: $requirements, Chris@2: $bundledComponents Chris@2: ); Chris@2: } catch (VersionException $e) { Chris@2: throw new ManifestDocumentMapperException($e->getMessage(), $e->getCode(), $e); Chris@2: } catch (Exception $e) { Chris@2: throw new ManifestDocumentMapperException($e->getMessage(), $e->getCode(), $e); Chris@2: } Chris@2: } Chris@2: Chris@2: /** Chris@2: * @param ContainsElement $contains Chris@2: * Chris@2: * @return Type Chris@2: * Chris@2: * @throws ManifestDocumentMapperException Chris@2: */ Chris@2: private function mapType(ContainsElement $contains) { Chris@2: switch ($contains->getType()) { Chris@2: case 'application': Chris@2: return Type::application(); Chris@2: case 'library': Chris@2: return Type::library(); Chris@2: case 'extension': Chris@2: return $this->mapExtension($contains->getExtensionElement()); Chris@2: } Chris@2: Chris@2: throw new ManifestDocumentMapperException( Chris@2: sprintf('Unsupported type %s', $contains->getType()) Chris@2: ); Chris@2: } Chris@2: Chris@2: /** Chris@2: * @param CopyrightElement $copyright Chris@2: * Chris@2: * @return CopyrightInformation Chris@2: * Chris@2: * @throws InvalidUrlException Chris@2: * @throws InvalidEmailException Chris@2: */ Chris@2: private function mapCopyright(CopyrightElement $copyright) { Chris@2: $authors = new AuthorCollection(); Chris@2: Chris@2: foreach($copyright->getAuthorElements() as $authorElement) { Chris@2: $authors->add( Chris@2: new Author( Chris@2: $authorElement->getName(), Chris@2: new Email($authorElement->getEmail()) Chris@2: ) Chris@2: ); Chris@2: } Chris@2: Chris@2: $licenseElement = $copyright->getLicenseElement(); Chris@2: $license = new License( Chris@2: $licenseElement->getType(), Chris@2: new Url($licenseElement->getUrl()) Chris@2: ); Chris@2: Chris@2: return new CopyrightInformation( Chris@2: $authors, Chris@2: $license Chris@2: ); Chris@2: } Chris@2: Chris@2: /** Chris@2: * @param RequiresElement $requires Chris@2: * Chris@2: * @return RequirementCollection Chris@2: * Chris@2: * @throws ManifestDocumentMapperException Chris@2: */ Chris@2: private function mapRequirements(RequiresElement $requires) { Chris@2: $collection = new RequirementCollection(); Chris@2: $phpElement = $requires->getPHPElement(); Chris@2: $parser = new VersionConstraintParser; Chris@2: Chris@2: try { Chris@2: $versionConstraint = $parser->parse($phpElement->getVersion()); Chris@2: } catch (VersionException $e) { Chris@2: throw new ManifestDocumentMapperException( Chris@2: sprintf('Unsupported version constraint - %s', $e->getMessage()), Chris@2: $e->getCode(), Chris@2: $e Chris@2: ); Chris@2: } Chris@2: Chris@2: $collection->add( Chris@2: new PhpVersionRequirement( Chris@2: $versionConstraint Chris@2: ) Chris@2: ); Chris@2: Chris@2: if (!$phpElement->hasExtElements()) { Chris@2: return $collection; Chris@2: } Chris@2: Chris@2: foreach($phpElement->getExtElements() as $extElement) { Chris@2: $collection->add( Chris@2: new PhpExtensionRequirement($extElement->getName()) Chris@2: ); Chris@2: } Chris@2: Chris@2: return $collection; Chris@2: } Chris@2: Chris@2: /** Chris@2: * @param ManifestDocument $document Chris@2: * Chris@2: * @return BundledComponentCollection Chris@2: */ Chris@2: private function mapBundledComponents(ManifestDocument $document) { Chris@2: $collection = new BundledComponentCollection(); Chris@2: Chris@2: if (!$document->hasBundlesElement()) { Chris@2: return $collection; Chris@2: } Chris@2: Chris@2: foreach($document->getBundlesElement()->getComponentElements() as $componentElement) { Chris@2: $collection->add( Chris@2: new BundledComponent( Chris@2: $componentElement->getName(), Chris@2: new Version( Chris@2: $componentElement->getVersion() Chris@2: ) Chris@2: ) Chris@2: ); Chris@2: } Chris@2: Chris@2: return $collection; Chris@2: } Chris@2: Chris@2: /** Chris@2: * @param ExtensionElement $extension Chris@2: * Chris@2: * @return Extension Chris@2: * Chris@2: * @throws ManifestDocumentMapperException Chris@2: */ Chris@2: private function mapExtension(ExtensionElement $extension) { Chris@2: try { Chris@2: $parser = new VersionConstraintParser; Chris@2: $versionConstraint = $parser->parse($extension->getCompatible()); Chris@2: Chris@2: return Type::extension( Chris@2: new ApplicationName($extension->getFor()), Chris@2: $versionConstraint Chris@2: ); Chris@2: } catch (VersionException $e) { Chris@2: throw new ManifestDocumentMapperException( Chris@2: sprintf('Unsupported version constraint - %s', $e->getMessage()), Chris@2: $e->getCode(), Chris@2: $e Chris@2: ); Chris@2: } Chris@2: } Chris@2: }