annotate vendor/phar-io/manifest/src/ManifestSerializer.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 1fec387a4317
children
rev   line source
Chris@14 1 <?php
Chris@14 2 /*
Chris@14 3 * This file is part of PharIo\Manifest.
Chris@14 4 *
Chris@14 5 * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de>
Chris@14 6 *
Chris@14 7 * For the full copyright and license information, please view the LICENSE
Chris@14 8 * file that was distributed with this source code.
Chris@14 9 */
Chris@14 10
Chris@14 11 namespace PharIo\Manifest;
Chris@14 12
Chris@14 13 use PharIo\Version\AnyVersionConstraint;
Chris@14 14 use PharIo\Version\Version;
Chris@14 15 use PharIo\Version\VersionConstraint;
Chris@14 16 use XMLWriter;
Chris@14 17
Chris@14 18 class ManifestSerializer {
Chris@14 19 /**
Chris@14 20 * @var XMLWriter
Chris@14 21 */
Chris@14 22 private $xmlWriter;
Chris@14 23
Chris@14 24 public function serializeToFile(Manifest $manifest, $filename) {
Chris@14 25 file_put_contents(
Chris@14 26 $filename,
Chris@14 27 $this->serializeToString($manifest)
Chris@14 28 );
Chris@14 29 }
Chris@14 30
Chris@14 31 public function serializeToString(Manifest $manifest) {
Chris@14 32 $this->startDocument();
Chris@14 33
Chris@14 34 $this->addContains($manifest->getName(), $manifest->getVersion(), $manifest->getType());
Chris@14 35 $this->addCopyright($manifest->getCopyrightInformation());
Chris@14 36 $this->addRequirements($manifest->getRequirements());
Chris@14 37 $this->addBundles($manifest->getBundledComponents());
Chris@14 38
Chris@14 39 return $this->finishDocument();
Chris@14 40 }
Chris@14 41
Chris@14 42 private function startDocument() {
Chris@14 43 $xmlWriter = new XMLWriter();
Chris@14 44 $xmlWriter->openMemory();
Chris@14 45 $xmlWriter->setIndent(true);
Chris@14 46 $xmlWriter->setIndentString(str_repeat(' ', 4));
Chris@14 47 $xmlWriter->startDocument('1.0', 'UTF-8');
Chris@14 48 $xmlWriter->startElement('phar');
Chris@14 49 $xmlWriter->writeAttribute('xmlns', 'https://phar.io/xml/manifest/1.0');
Chris@14 50
Chris@14 51 $this->xmlWriter = $xmlWriter;
Chris@14 52 }
Chris@14 53
Chris@14 54 private function finishDocument() {
Chris@14 55 $this->xmlWriter->endElement();
Chris@14 56 $this->xmlWriter->endDocument();
Chris@14 57
Chris@14 58 return $this->xmlWriter->outputMemory();
Chris@14 59 }
Chris@14 60
Chris@14 61 private function addContains($name, Version $version, Type $type) {
Chris@14 62 $this->xmlWriter->startElement('contains');
Chris@14 63 $this->xmlWriter->writeAttribute('name', $name);
Chris@14 64 $this->xmlWriter->writeAttribute('version', $version->getVersionString());
Chris@14 65
Chris@14 66 switch (true) {
Chris@14 67 case $type->isApplication(): {
Chris@14 68 $this->xmlWriter->writeAttribute('type', 'application');
Chris@14 69 break;
Chris@14 70 }
Chris@14 71
Chris@14 72 case $type->isLibrary(): {
Chris@14 73 $this->xmlWriter->writeAttribute('type', 'library');
Chris@14 74 break;
Chris@14 75 }
Chris@14 76
Chris@14 77 case $type->isExtension(): {
Chris@14 78 /* @var $type Extension */
Chris@14 79 $this->xmlWriter->writeAttribute('type', 'extension');
Chris@14 80 $this->addExtension($type->getApplicationName(), $type->getVersionConstraint());
Chris@14 81 break;
Chris@14 82 }
Chris@14 83
Chris@14 84 default: {
Chris@14 85 $this->xmlWriter->writeAttribute('type', 'custom');
Chris@14 86 }
Chris@14 87 }
Chris@14 88
Chris@14 89 $this->xmlWriter->endElement();
Chris@14 90 }
Chris@14 91
Chris@14 92 private function addCopyright(CopyrightInformation $copyrightInformation) {
Chris@14 93 $this->xmlWriter->startElement('copyright');
Chris@14 94
Chris@14 95 foreach($copyrightInformation->getAuthors() as $author) {
Chris@14 96 $this->xmlWriter->startElement('author');
Chris@14 97 $this->xmlWriter->writeAttribute('name', $author->getName());
Chris@14 98 $this->xmlWriter->writeAttribute('email', (string) $author->getEmail());
Chris@14 99 $this->xmlWriter->endElement();
Chris@14 100 }
Chris@14 101
Chris@14 102 $license = $copyrightInformation->getLicense();
Chris@14 103
Chris@14 104 $this->xmlWriter->startElement('license');
Chris@14 105 $this->xmlWriter->writeAttribute('type', $license->getName());
Chris@14 106 $this->xmlWriter->writeAttribute('url', $license->getUrl());
Chris@14 107 $this->xmlWriter->endElement();
Chris@14 108
Chris@14 109 $this->xmlWriter->endElement();
Chris@14 110 }
Chris@14 111
Chris@14 112 private function addRequirements(RequirementCollection $requirementCollection) {
Chris@14 113 $phpRequirement = new AnyVersionConstraint();
Chris@14 114 $extensions = [];
Chris@14 115
Chris@14 116 foreach($requirementCollection as $requirement) {
Chris@14 117 if ($requirement instanceof PhpVersionRequirement) {
Chris@14 118 $phpRequirement = $requirement->getVersionConstraint();
Chris@14 119 continue;
Chris@14 120 }
Chris@14 121
Chris@14 122 if ($requirement instanceof PhpExtensionRequirement) {
Chris@14 123 $extensions[] = (string) $requirement;
Chris@14 124 }
Chris@14 125 }
Chris@14 126
Chris@14 127 $this->xmlWriter->startElement('requires');
Chris@14 128 $this->xmlWriter->startElement('php');
Chris@14 129 $this->xmlWriter->writeAttribute('version', $phpRequirement->asString());
Chris@14 130
Chris@14 131 foreach($extensions as $extension) {
Chris@14 132 $this->xmlWriter->startElement('ext');
Chris@14 133 $this->xmlWriter->writeAttribute('name', $extension);
Chris@14 134 $this->xmlWriter->endElement();
Chris@14 135 }
Chris@14 136
Chris@14 137 $this->xmlWriter->endElement();
Chris@14 138 $this->xmlWriter->endElement();
Chris@14 139 }
Chris@14 140
Chris@14 141 private function addBundles(BundledComponentCollection $bundledComponentCollection) {
Chris@14 142 if (count($bundledComponentCollection) === 0) {
Chris@14 143 return;
Chris@14 144 }
Chris@14 145 $this->xmlWriter->startElement('bundles');
Chris@14 146
Chris@14 147 foreach($bundledComponentCollection as $bundledComponent) {
Chris@14 148 $this->xmlWriter->startElement('component');
Chris@14 149 $this->xmlWriter->writeAttribute('name', $bundledComponent->getName());
Chris@14 150 $this->xmlWriter->writeAttribute('version', $bundledComponent->getVersion()->getVersionString());
Chris@14 151 $this->xmlWriter->endElement();
Chris@14 152 }
Chris@14 153
Chris@14 154 $this->xmlWriter->endElement();
Chris@14 155 }
Chris@14 156
Chris@14 157 private function addExtension($application, VersionConstraint $versionConstraint) {
Chris@14 158 $this->xmlWriter->startElement('extension');
Chris@14 159 $this->xmlWriter->writeAttribute('for', $application);
Chris@14 160 $this->xmlWriter->writeAttribute('compatible', $versionConstraint->asString());
Chris@14 161 $this->xmlWriter->endElement();
Chris@14 162 }
Chris@14 163 }