Blame | Letzte Änderung | Log anzeigen | RSS feed
<?php declare(strict_types = 1);/** This file is part of PharIo\Manifest.** (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de>** For the full copyright and license information, please view the LICENSE* file that was distributed with this source code.*/namespace PharIo\Manifest;use DOMDocument;use DOMElement;class ManifestDocument {public const XMLNS = 'https://phar.io/xml/manifest/1.0';/** @var DOMDocument */private $dom;public static function fromFile(string $filename): ManifestDocument {if (!\file_exists($filename)) {throw new ManifestDocumentException(\sprintf('File "%s" not found', $filename));}return self::fromString(\file_get_contents($filename));}public static function fromString(string $xmlString): ManifestDocument {$prev = \libxml_use_internal_errors(true);\libxml_clear_errors();$dom = new DOMDocument();$dom->loadXML($xmlString);$errors = \libxml_get_errors();\libxml_use_internal_errors($prev);if (\count($errors) !== 0) {throw new ManifestDocumentLoadingException($errors);}return new self($dom);}private function __construct(DOMDocument $dom) {$this->ensureCorrectDocumentType($dom);$this->dom = $dom;}public function getContainsElement(): ContainsElement {return new ContainsElement($this->fetchElementByName('contains'));}public function getCopyrightElement(): CopyrightElement {return new CopyrightElement($this->fetchElementByName('copyright'));}public function getRequiresElement(): RequiresElement {return new RequiresElement($this->fetchElementByName('requires'));}public function hasBundlesElement(): bool {return $this->dom->getElementsByTagNameNS(self::XMLNS, 'bundles')->length === 1;}public function getBundlesElement(): BundlesElement {return new BundlesElement($this->fetchElementByName('bundles'));}private function ensureCorrectDocumentType(DOMDocument $dom): void {$root = $dom->documentElement;if ($root->localName !== 'phar' || $root->namespaceURI !== self::XMLNS) {throw new ManifestDocumentException('Not a phar.io manifest document');}}private function fetchElementByName(string $elementName): DOMElement {$element = $this->dom->getElementsByTagNameNS(self::XMLNS, $elementName)->item(0);if (!$element instanceof DOMElement) {throw new ManifestDocumentException(\sprintf('Element %s missing', $elementName));}return $element;}}