ManifestSerializer.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. namespace PharIo\Manifest;
  11. use PharIo\Version\AnyVersionConstraint;
  12. use PharIo\Version\Version;
  13. use PharIo\Version\VersionConstraint;
  14. use XMLWriter;
  15. class ManifestSerializer {
  16. /**
  17. * @var XMLWriter
  18. */
  19. private $xmlWriter;
  20. public function serializeToFile(Manifest $manifest, $filename) {
  21. file_put_contents(
  22. $filename,
  23. $this->serializeToString($manifest)
  24. );
  25. }
  26. public function serializeToString(Manifest $manifest) {
  27. $this->startDocument();
  28. $this->addContains($manifest->getName(), $manifest->getVersion(), $manifest->getType());
  29. $this->addCopyright($manifest->getCopyrightInformation());
  30. $this->addRequirements($manifest->getRequirements());
  31. $this->addBundles($manifest->getBundledComponents());
  32. return $this->finishDocument();
  33. }
  34. private function startDocument() {
  35. $xmlWriter = new XMLWriter();
  36. $xmlWriter->openMemory();
  37. $xmlWriter->setIndent(true);
  38. $xmlWriter->setIndentString(str_repeat(' ', 4));
  39. $xmlWriter->startDocument('1.0', 'UTF-8');
  40. $xmlWriter->startElement('phar');
  41. $xmlWriter->writeAttribute('xmlns', 'https://phar.io/xml/manifest/1.0');
  42. $this->xmlWriter = $xmlWriter;
  43. }
  44. private function finishDocument() {
  45. $this->xmlWriter->endElement();
  46. $this->xmlWriter->endDocument();
  47. return $this->xmlWriter->outputMemory();
  48. }
  49. private function addContains($name, Version $version, Type $type) {
  50. $this->xmlWriter->startElement('contains');
  51. $this->xmlWriter->writeAttribute('name', $name);
  52. $this->xmlWriter->writeAttribute('version', $version->getVersionString());
  53. switch (true) {
  54. case $type->isApplication(): {
  55. $this->xmlWriter->writeAttribute('type', 'application');
  56. break;
  57. }
  58. case $type->isLibrary(): {
  59. $this->xmlWriter->writeAttribute('type', 'library');
  60. break;
  61. }
  62. case $type->isExtension(): {
  63. /* @var $type Extension */
  64. $this->xmlWriter->writeAttribute('type', 'extension');
  65. $this->addExtension($type->getApplicationName(), $type->getVersionConstraint());
  66. break;
  67. }
  68. default: {
  69. $this->xmlWriter->writeAttribute('type', 'custom');
  70. }
  71. }
  72. $this->xmlWriter->endElement();
  73. }
  74. private function addCopyright(CopyrightInformation $copyrightInformation) {
  75. $this->xmlWriter->startElement('copyright');
  76. foreach($copyrightInformation->getAuthors() as $author) {
  77. $this->xmlWriter->startElement('author');
  78. $this->xmlWriter->writeAttribute('name', $author->getName());
  79. $this->xmlWriter->writeAttribute('email', (string) $author->getEmail());
  80. $this->xmlWriter->endElement();
  81. }
  82. $license = $copyrightInformation->getLicense();
  83. $this->xmlWriter->startElement('license');
  84. $this->xmlWriter->writeAttribute('type', $license->getName());
  85. $this->xmlWriter->writeAttribute('url', $license->getUrl());
  86. $this->xmlWriter->endElement();
  87. $this->xmlWriter->endElement();
  88. }
  89. private function addRequirements(RequirementCollection $requirementCollection) {
  90. $phpRequirement = new AnyVersionConstraint();
  91. $extensions = [];
  92. foreach($requirementCollection as $requirement) {
  93. if ($requirement instanceof PhpVersionRequirement) {
  94. $phpRequirement = $requirement->getVersionConstraint();
  95. continue;
  96. }
  97. if ($requirement instanceof PhpExtensionRequirement) {
  98. $extensions[] = (string) $requirement;
  99. }
  100. }
  101. $this->xmlWriter->startElement('requires');
  102. $this->xmlWriter->startElement('php');
  103. $this->xmlWriter->writeAttribute('version', $phpRequirement->asString());
  104. foreach($extensions as $extension) {
  105. $this->xmlWriter->startElement('ext');
  106. $this->xmlWriter->writeAttribute('name', $extension);
  107. $this->xmlWriter->endElement();
  108. }
  109. $this->xmlWriter->endElement();
  110. $this->xmlWriter->endElement();
  111. }
  112. private function addBundles(BundledComponentCollection $bundledComponentCollection) {
  113. if (count($bundledComponentCollection) === 0) {
  114. return;
  115. }
  116. $this->xmlWriter->startElement('bundles');
  117. foreach($bundledComponentCollection as $bundledComponent) {
  118. $this->xmlWriter->startElement('component');
  119. $this->xmlWriter->writeAttribute('name', $bundledComponent->getName());
  120. $this->xmlWriter->writeAttribute('version', $bundledComponent->getVersion()->getVersionString());
  121. $this->xmlWriter->endElement();
  122. }
  123. $this->xmlWriter->endElement();
  124. }
  125. private function addExtension($application, VersionConstraint $versionConstraint) {
  126. $this->xmlWriter->startElement('extension');
  127. $this->xmlWriter->writeAttribute('for', $application);
  128. $this->xmlWriter->writeAttribute('compatible', $versionConstraint->asString());
  129. $this->xmlWriter->endElement();
  130. }
  131. }