Skip to content

Commit

Permalink
Merge pull request #39 from veewee/any
Browse files Browse the repository at this point in the history
Read <any /> element information
  • Loading branch information
veewee authored Dec 19, 2024
2 parents 8e809c3 + a1d3e03 commit 4b54ed4
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 1 deletion.
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
"require": {
"php": "~8.2.0 || ~8.3.0 || ~8.4.0",
"ext-dom": "*",
"goetas-webservices/xsd-reader": "^0.4.6",
"goetas-webservices/xsd-reader": "^0.4.8",
"php-soap/engine": "^2.13",
"php-soap/wsdl": "^1.10",
"php-soap/xml": "^1.8.0",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php declare(strict_types=1);

namespace Soap\WsdlReader\Metadata\Converter\Types\Configurator;

use GoetasWebservices\XML\XSDReader\Schema\Element\Any\Any;
use Soap\Engine\Metadata\Model\TypeMeta;
use Soap\Engine\Metadata\Model\XsdType as EngineType;
use Soap\Engine\Metadata\Model\XsdType as MetaType;
use Soap\WsdlReader\Metadata\Converter\Types\TypesConverterContext;
use Soap\Xml\Xmlns;
use function Psl\Fun\pipe;

final class AnyElementConfigurator
{
public function __invoke(EngineType $engineType, mixed $xsdType, TypesConverterContext $context): EngineType
{
if (!$xsdType instanceof Any) {
return $engineType;
}

$xsd = Xmlns::xsd()->value();
$targetNamespace = $xsdType->getSchema()->getTargetNamespace() ?? '';

$configure = pipe(
static fn (MetaType $metaType): MetaType => (new DocsConfigurator())($metaType, $xsdType, $context),
static fn (MetaType $metaType): MetaType => (new OccurrencesConfigurator())($metaType, $xsdType, $context),
);

return $configure(
$engineType
->withXmlTargetNodeName('any')
->withXmlTypeName('any')
->withBaseType('anyXML')
->withXmlNamespace($xsd)
->withXmlNamespaceName($context->knownNamespaces->lookupNameFromNamespace($xsd)->unwrapOr('xsd'))
->withXmlTargetNamespace($targetNamespace)
->withXmlTargetNamespaceName(
$context->knownNamespaces->lookupNameFromNamespace($targetNamespace)->unwrapOr(
$engineType->getXmlNamespaceName()
)
)
->withMeta(
static fn (TypeMeta $meta): TypeMeta => $meta
->withRestriction([
'processXMLContent' => [
['value' => $xsdType->getProcessContents()->value],
]
])
->withIsElement(true)
)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ private function parseElementItem(ElementItem $element, TypesConverterContext $c
$typeName = $type?->getName() ?: $element->getName();
$configure = pipe(
static fn (EngineType $engineType): EngineType => (new Configurator\ElementConfigurator())($engineType, $element, $context),
static fn (EngineType $engineType): EngineType => (new Configurator\AnyElementConfigurator())($engineType, $element, $context),
);

return new PropertyCollection(
Expand Down
29 changes: 29 additions & 0 deletions tests/PhpCompatibility/schema1012.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
--TEST--
SOAP XML Schema 1001: Any elements
--FILE--
<?php
include __DIR__."/test_schema.inc";
$schema = <<<EOF
<element name="GetCustomerDetailsRequest">
<complexType>
<sequence>
<element name="customerId" type="xsd:string" />
<element name="countryCode" type="xsd:string" nillable="true" />
<any processContents="strict" maxOccurs="0" />
</sequence>
</complexType>
</element>
EOF;
test_schema($schema,'type="tns:GetCustomerDetailsRequest"');
?>
--EXPECT--
Methods:
> test(GetCustomerDetailsRequest $testParam): void

Types:
> http://test-uri/:GetCustomerDetailsRequest {
string $customerId
?string $countryCode
any $any
}

0 comments on commit 4b54ed4

Please sign in to comment.