diff vendor/phar-io/manifest/src/xml/ManifestDocument.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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/phar-io/manifest/src/xml/ManifestDocument.php	Mon Apr 23 09:46:53 2018 +0100
@@ -0,0 +1,118 @@
+<?php
+/*
+ * 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 {
+    const XMLNS = 'https://phar.io/xml/manifest/1.0';
+
+    /**
+     * @var DOMDocument
+     */
+    private $dom;
+
+    /**
+     * ManifestDocument constructor.
+     *
+     * @param DOMDocument $dom
+     */
+    private function __construct(DOMDocument $dom) {
+        $this->ensureCorrectDocumentType($dom);
+
+        $this->dom = $dom;
+    }
+
+    public static function fromFile($filename) {
+        if (!file_exists($filename)) {
+            throw new ManifestDocumentException(
+                sprintf('File "%s" not found', $filename)
+            );
+        }
+
+        return self::fromString(
+            file_get_contents($filename)
+        );
+    }
+
+    public static function fromString($xmlString) {
+        $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);
+    }
+
+    public function getContainsElement() {
+        return new ContainsElement(
+            $this->fetchElementByName('contains')
+        );
+    }
+
+    public function getCopyrightElement() {
+        return new CopyrightElement(
+            $this->fetchElementByName('copyright')
+        );
+    }
+
+    public function getRequiresElement() {
+        return new RequiresElement(
+            $this->fetchElementByName('requires')
+        );
+    }
+
+    public function hasBundlesElement() {
+        return $this->dom->getElementsByTagNameNS(self::XMLNS, 'bundles')->length === 1;
+    }
+
+    public function getBundlesElement() {
+        return new BundlesElement(
+            $this->fetchElementByName('bundles')
+        );
+    }
+
+    private function ensureCorrectDocumentType(DOMDocument $dom) {
+        $root = $dom->documentElement;
+
+        if ($root->localName !== 'phar' || $root->namespaceURI !== self::XMLNS) {
+            throw new ManifestDocumentException('Not a phar.io manifest document');
+        }
+    }
+
+    /**
+     * @param $elementName
+     *
+     * @return DOMElement
+     *
+     * @throws ManifestDocumentException
+     */
+    private function fetchElementByName($elementName) {
+        $element = $this->dom->getElementsByTagNameNS(self::XMLNS, $elementName)->item(0);
+
+        if (!$element instanceof DOMElement) {
+            throw new ManifestDocumentException(
+                sprintf('Element %s missing', $elementName)
+            );
+        }
+
+        return $element;
+    }
+}