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