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\AnyVersionConstraint; Chris@14: use PharIo\Version\Version; Chris@14: use PharIo\Version\VersionConstraint; Chris@14: use XMLWriter; Chris@14: Chris@14: class ManifestSerializer { Chris@14: /** Chris@14: * @var XMLWriter Chris@14: */ Chris@14: private $xmlWriter; Chris@14: Chris@14: public function serializeToFile(Manifest $manifest, $filename) { Chris@14: file_put_contents( Chris@14: $filename, Chris@14: $this->serializeToString($manifest) Chris@14: ); Chris@14: } Chris@14: Chris@14: public function serializeToString(Manifest $manifest) { Chris@14: $this->startDocument(); Chris@14: Chris@14: $this->addContains($manifest->getName(), $manifest->getVersion(), $manifest->getType()); Chris@14: $this->addCopyright($manifest->getCopyrightInformation()); Chris@14: $this->addRequirements($manifest->getRequirements()); Chris@14: $this->addBundles($manifest->getBundledComponents()); Chris@14: Chris@14: return $this->finishDocument(); Chris@14: } Chris@14: Chris@14: private function startDocument() { Chris@14: $xmlWriter = new XMLWriter(); Chris@14: $xmlWriter->openMemory(); Chris@14: $xmlWriter->setIndent(true); Chris@14: $xmlWriter->setIndentString(str_repeat(' ', 4)); Chris@14: $xmlWriter->startDocument('1.0', 'UTF-8'); Chris@14: $xmlWriter->startElement('phar'); Chris@14: $xmlWriter->writeAttribute('xmlns', 'https://phar.io/xml/manifest/1.0'); Chris@14: Chris@14: $this->xmlWriter = $xmlWriter; Chris@14: } Chris@14: Chris@14: private function finishDocument() { Chris@14: $this->xmlWriter->endElement(); Chris@14: $this->xmlWriter->endDocument(); Chris@14: Chris@14: return $this->xmlWriter->outputMemory(); Chris@14: } Chris@14: Chris@14: private function addContains($name, Version $version, Type $type) { Chris@14: $this->xmlWriter->startElement('contains'); Chris@14: $this->xmlWriter->writeAttribute('name', $name); Chris@14: $this->xmlWriter->writeAttribute('version', $version->getVersionString()); Chris@14: Chris@14: switch (true) { Chris@14: case $type->isApplication(): { Chris@14: $this->xmlWriter->writeAttribute('type', 'application'); Chris@14: break; Chris@14: } Chris@14: Chris@14: case $type->isLibrary(): { Chris@14: $this->xmlWriter->writeAttribute('type', 'library'); Chris@14: break; Chris@14: } Chris@14: Chris@14: case $type->isExtension(): { Chris@14: /* @var $type Extension */ Chris@14: $this->xmlWriter->writeAttribute('type', 'extension'); Chris@14: $this->addExtension($type->getApplicationName(), $type->getVersionConstraint()); Chris@14: break; Chris@14: } Chris@14: Chris@14: default: { Chris@14: $this->xmlWriter->writeAttribute('type', 'custom'); Chris@14: } Chris@14: } Chris@14: Chris@14: $this->xmlWriter->endElement(); Chris@14: } Chris@14: Chris@14: private function addCopyright(CopyrightInformation $copyrightInformation) { Chris@14: $this->xmlWriter->startElement('copyright'); Chris@14: Chris@14: foreach($copyrightInformation->getAuthors() as $author) { Chris@14: $this->xmlWriter->startElement('author'); Chris@14: $this->xmlWriter->writeAttribute('name', $author->getName()); Chris@14: $this->xmlWriter->writeAttribute('email', (string) $author->getEmail()); Chris@14: $this->xmlWriter->endElement(); Chris@14: } Chris@14: Chris@14: $license = $copyrightInformation->getLicense(); Chris@14: Chris@14: $this->xmlWriter->startElement('license'); Chris@14: $this->xmlWriter->writeAttribute('type', $license->getName()); Chris@14: $this->xmlWriter->writeAttribute('url', $license->getUrl()); Chris@14: $this->xmlWriter->endElement(); Chris@14: Chris@14: $this->xmlWriter->endElement(); Chris@14: } Chris@14: Chris@14: private function addRequirements(RequirementCollection $requirementCollection) { Chris@14: $phpRequirement = new AnyVersionConstraint(); Chris@14: $extensions = []; Chris@14: Chris@14: foreach($requirementCollection as $requirement) { Chris@14: if ($requirement instanceof PhpVersionRequirement) { Chris@14: $phpRequirement = $requirement->getVersionConstraint(); Chris@14: continue; Chris@14: } Chris@14: Chris@14: if ($requirement instanceof PhpExtensionRequirement) { Chris@14: $extensions[] = (string) $requirement; Chris@14: } Chris@14: } Chris@14: Chris@14: $this->xmlWriter->startElement('requires'); Chris@14: $this->xmlWriter->startElement('php'); Chris@14: $this->xmlWriter->writeAttribute('version', $phpRequirement->asString()); Chris@14: Chris@14: foreach($extensions as $extension) { Chris@14: $this->xmlWriter->startElement('ext'); Chris@14: $this->xmlWriter->writeAttribute('name', $extension); Chris@14: $this->xmlWriter->endElement(); Chris@14: } Chris@14: Chris@14: $this->xmlWriter->endElement(); Chris@14: $this->xmlWriter->endElement(); Chris@14: } Chris@14: Chris@14: private function addBundles(BundledComponentCollection $bundledComponentCollection) { Chris@14: if (count($bundledComponentCollection) === 0) { Chris@14: return; Chris@14: } Chris@14: $this->xmlWriter->startElement('bundles'); Chris@14: Chris@14: foreach($bundledComponentCollection as $bundledComponent) { Chris@14: $this->xmlWriter->startElement('component'); Chris@14: $this->xmlWriter->writeAttribute('name', $bundledComponent->getName()); Chris@14: $this->xmlWriter->writeAttribute('version', $bundledComponent->getVersion()->getVersionString()); Chris@14: $this->xmlWriter->endElement(); Chris@14: } Chris@14: Chris@14: $this->xmlWriter->endElement(); Chris@14: } Chris@14: Chris@14: private function addExtension($application, VersionConstraint $versionConstraint) { Chris@14: $this->xmlWriter->startElement('extension'); Chris@14: $this->xmlWriter->writeAttribute('for', $application); Chris@14: $this->xmlWriter->writeAttribute('compatible', $versionConstraint->asString()); Chris@14: $this->xmlWriter->endElement(); Chris@14: } Chris@14: }