From 4a4fccf24efc525f95c20bce3065ad9b44d7a935 Mon Sep 17 00:00:00 2001 From: Kacper Stasik Date: Fri, 3 Mar 2017 12:44:11 +0100 Subject: [PATCH] basic redefine support based on https://github.com/goetas-webservices/xsd-reader/pull/17 by @kstasik ported code to latest version/rebased on master. implements `` https://www.w3.org/TR/xmlschema11-1/#modify-schema --- src/SchemaReader.php | 25 ++++++++++++++++ tests/RedefineTest.php | 66 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 tests/RedefineTest.php diff --git a/src/SchemaReader.php b/src/SchemaReader.php index a1bf4846..57d4a23c 100644 --- a/src/SchemaReader.php +++ b/src/SchemaReader.php @@ -277,6 +277,9 @@ function ( case 'import': $callback = $this->loadImport($schema, $childNode); break; + case 'redefine': + $callback = $this->loadRedefine($schema, $childNode); + break; case 'element': $callback = $this->loadElementDef($schema, $childNode); break; @@ -1170,6 +1173,28 @@ private function loadImport( return $this->loadImportFresh($namespace, $schema, $file); } + private function loadRedefine(Schema $schema, DOMElement $node) + { + $base = urldecode($node->ownerDocument->documentURI); + $file = UrlUtils::resolveRelativeUrl($base, $node->getAttribute('schemaLocation')); + + if (isset($this->loadedFiles[$file])) { + /* @var $redefined Schema */ + $redefined = clone $this->loadedFiles[$file]; + + if($schema->getTargetNamespace() !== $redefined->getTargetNamespace()){ + $redefined->setTargetNamespace($schema->getTargetNamespace()); + } + + $schema->addSchema($redefined); + + return function (): void { + }; + } + + return $this->loadImportFresh($schema->getTargetNamespace(), $schema, $file); + } + private function createOrUseSchemaForNs( Schema $schema, string $namespace diff --git a/tests/RedefineTest.php b/tests/RedefineTest.php new file mode 100644 index 00000000..d8d03a11 --- /dev/null +++ b/tests/RedefineTest.php @@ -0,0 +1,66 @@ +reader->readString( + ' + + + + + + + + + + ', 'http://www.example.com/xsd.xsd'); + + + $schema = $this->reader->readString( + ' + + + + + + + + + + + + + + + '); + + // check if schema is not included + // we don't want to redefine original schema + $this->assertNotContains($remoteSchema, $schema->getSchemas(), '', true); + + /* @var $localAttr \GoetasWebservices\XML\XSDReader\Schema\Element\ElementDef */ + + // it should inherit namespace of main schema + $localAttr = $schema->findElement("addressee", "http://www.user.com"); + $this->assertNotNull($localAttr); + + // find author element + $localAttr = $schema->findElement("author", "http://www.user.com"); + $this->assertNotNull($localAttr); + + /* @var $type \GoetasWebservices\XML\XSDReader\Schema\Type\ComplexType */ + $type = $localAttr->getType(); + + $this->assertInstanceOf('\GoetasWebservices\XML\XSDReader\Schema\Type\ComplexType', $type); + + $children = array(); + foreach($type->getElements() as $element){ + $children[] = $element->getName(); + } + + $this->assertContains('generation', $children); + } +}