comparison vendor/phar-io/manifest/src/ManifestSerializer.php @ 14:1fec387a4317

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