Skip to content

Commit

Permalink
Merge forwardport of #11686 to 2.3-develop branch
Browse files Browse the repository at this point in the history
Applied pull request patch https://github.com/magento/magento2/pull/11686.patch (created by @tdgroot) based on commit(s):
  1. 177e540
  2. 0d65213
  3. a781bf6
  4. dcc480d
  5. 5d4e1c2
  6. b552dd1
  7. b85b91e

Fixed GitHub Issues in 2.3-develop branch:
  - #5188: Error generating URN-catalog when blank one exists (reported by @JamesonNetworks)
  • Loading branch information
magento-engcom-team authored Jan 24, 2018
2 parents 7aeccea + 402b719 commit b857c02
Show file tree
Hide file tree
Showing 4 changed files with 130 additions and 19 deletions.
64 changes: 45 additions & 19 deletions app/code/Magento/Developer/Model/XmlCatalog/Format/PhpStorm.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@

namespace Magento\Developer\Model\XmlCatalog\Format;

use Magento\Framework\App\ObjectManager;
use Magento\Framework\DomDocument\DomDocumentFactory;
use Magento\Framework\Exception\FileSystemException;
use Magento\Framework\Filesystem\Directory\ReadFactory;
use Magento\Framework\Filesystem\Directory\ReadInterface;
use Magento\Framework\Filesystem\Directory\WriteFactory;
use Magento\Framework\Filesystem\Directory\WriteInterface;
use Magento\Framework\Filesystem\File\WriteFactory;

/**
* Class PhpStorm generates URN catalog for PhpStorm 9
Expand All @@ -23,20 +24,28 @@ class PhpStorm implements FormatInterface
private $currentDirRead;

/**
* @var \Magento\Framework\Filesystem\File\WriteFactory
* @var WriteFactory
*/
private $fileWriteFactory;

/**
* @var DomDocumentFactory
*/
private $domDocumentFactory;

/**
* @param ReadFactory $readFactory
* @param \Magento\Framework\Filesystem\File\WriteFactory $fileWriteFactory
* @param WriteFactory $fileWriteFactory
* @param DomDocumentFactory $domDocumentFactory
*/
public function __construct(
ReadFactory $readFactory,
\Magento\Framework\Filesystem\File\WriteFactory $fileWriteFactory
WriteFactory $fileWriteFactory,
DomDocumentFactory $domDocumentFactory = null
) {
$this->currentDirRead = $readFactory->create(getcwd());
$this->fileWriteFactory = $fileWriteFactory;
$this->domDocumentFactory = $domDocumentFactory ?: ObjectManager::getInstance()->get(DomDocumentFactory::class);
}

/**
Expand All @@ -57,26 +66,21 @@ public function generateCatalog(array $dictionary, $configFilePath)
\Magento\Framework\Filesystem\DriverPool::FILE,
'r'
);
$dom = new \DOMDocument();
$dom->loadXML($file->readAll());
$dom = $this->domDocumentFactory->create();
$fileContent = $file->readAll();
if (!empty($fileContent)) {
$dom->loadXML($fileContent);
} else {
$this->initEmptyFile($dom);
}
$xpath = new \DOMXPath($dom);
$nodeList = $xpath->query('/project');
$projectNode = $nodeList->item(0);
$file->close();
} catch (FileSystemException $f) {
//create file if does not exists
$dom = new \DOMDocument();
$projectNode = $dom->createElement('project');

//PhpStorm 9 version for component is "4"
$projectNode->setAttribute('version', '4');
$dom->appendChild($projectNode);
$rootComponentNode = $dom->createElement('component');

//PhpStorm 9 version for ProjectRootManager is "2"
$rootComponentNode->setAttribute('version', '2');
$rootComponentNode->setAttribute('name', 'ProjectRootManager');
$projectNode->appendChild($rootComponentNode);
$dom = $this->domDocumentFactory->create();
$projectNode = $this->initEmptyFile($dom);
}

$xpath = new \DOMXPath($dom);
Expand All @@ -103,4 +107,26 @@ public function generateCatalog(array $dictionary, $configFilePath)
$file->write($dom->saveXML());
$file->close();
}

/**
* Setup basic empty dom elements
*
* @param \DOMDocument $dom
* @return \DOMElement
*/
private function initEmptyFile(\DOMDocument $dom)
{
$projectNode = $dom->createElement('project');

//PhpStorm 9 version for component is "4"
$projectNode->setAttribute('version', '4');
$dom->appendChild($projectNode);
$rootComponentNode = $dom->createElement('component');

//PhpStorm 9 version for ProjectRootManager is "2"
$rootComponentNode->setAttribute('version', '2');
$rootComponentNode->setAttribute('name', 'ProjectRootManager');
$projectNode->appendChild($rootComponentNode);
return $projectNode;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Developer\Model\XmlCatalog\Format\PhpStorm;

use DOMDocument;

class DomDocumentFactory
{
/**
* @var \Magento\Framework\DomDocument\DomDocumentFactory
*/
private $documentFactory;

/**
* DomDocumentFactory constructor.
* @param \Magento\Framework\DomDocument\DomDocumentFactory $documentFactory
*/
public function __construct(\Magento\Framework\DomDocument\DomDocumentFactory $documentFactory)
{
$this->documentFactory = $documentFactory;
}

/**
* {@inheritdoc}
*/
public function create(string $data = null)
{
$dom = $this->documentFactory->create($data);

if (empty($data)) {
$this->initializeDocument($dom);
}

return $dom;
}

/**
* Initialize document to be used as 'misc.xml'
*
* @param DOMDocument $document
* @return DOMDocument
*/
private function initializeDocument(DOMDocument $document)
{
$document->xmlVersion = '1.0';
$projectNode = $document->createElement('project');

//PhpStorm 9 version for component is "4"
$projectNode->setAttribute('version', '4');
$document->appendChild($projectNode);
$rootComponentNode = $document->createElement('component');

//PhpStorm 9 version for ProjectRootManager is "2"
$rootComponentNode->setAttribute('version', '2');
$rootComponentNode->setAttribute('name', 'ProjectRootManager');
$projectNode->appendChild($rootComponentNode);

return $document;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/

namespace Magento\Framework\DomDocument;

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/

namespace Magento\Framework\Test\Unit\DomDocument;

use Magento\Framework\DomDocument\DomDocumentFactory;

class DomDocumentFactoryTest extends \PHPUnit\Framework\TestCase
{
public function testCreateReturnsDomDocument()
{
$domDocumentFactory = new DomDocumentFactory();
$this->assertInstanceOf(
\DOMDocument::class,
$domDocumentFactory->create()
);
}
}

0 comments on commit b857c02

Please sign in to comment.