import SOAP-WSDL 2.00_11 from CPAN
git-cpan-module: SOAP-WSDL git-cpan-version: 2.00_11 git-cpan-authorid: MKUTTER git-cpan-file: authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_11.tar.gz
This commit is contained in:
committed by
Michael G. Schwern
parent
7ba1959888
commit
c2da74b5ae
@@ -15,7 +15,6 @@ my @modules = qw(
|
||||
SOAP::WSDL::Port
|
||||
SOAP::WSDL::PortType
|
||||
SOAP::WSDL::Types
|
||||
SOAP::WSDL::SAX::WSDLHandler
|
||||
SOAP::WSDL::XSD::Builtin
|
||||
SOAP::WSDL::XSD::ComplexType
|
||||
SOAP::WSDL::XSD::SimpleType
|
||||
|
||||
@@ -0,0 +1,333 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 18; # qw/no_plan/; # TODO: change to tests => N;
|
||||
use lib '../lib';
|
||||
|
||||
use XML::LibXML;
|
||||
|
||||
eval {
|
||||
require Test::XML;
|
||||
import Test::XML;
|
||||
};
|
||||
|
||||
use_ok(qw/SOAP::WSDL::SAX::WSDLHandler/);
|
||||
|
||||
my $filter;
|
||||
|
||||
ok($filter = SOAP::WSDL::SAX::WSDLHandler->new(
|
||||
), "Object creation");
|
||||
|
||||
my $parser = XML::LibXML->new();
|
||||
$parser->set_handler( $filter );
|
||||
|
||||
$parser->parse_string( xml() );
|
||||
|
||||
my $wsdl;
|
||||
ok( $wsdl = $filter->get_data() , "get object tree");
|
||||
|
||||
my $types = $wsdl->first_types();
|
||||
|
||||
is $types->get_parent(), $wsdl , 'types parent';
|
||||
|
||||
my $serializer_options = {
|
||||
readable => 1,
|
||||
autotype => 1,
|
||||
namespace => { 'urn:myNamespace' => 'tns',
|
||||
"http://www.w3.org/2001/XMLSchema" => 'xsd' },
|
||||
typelib => $wsdl->first_types(),
|
||||
indent => "\t",
|
||||
};
|
||||
|
||||
my $xml;
|
||||
my $type = $types->find_type( 'urn:myNamespace', 'testSimpleType1' );
|
||||
|
||||
|
||||
ok($xml = $type->serialize( 'test', 1 , $serializer_options ),
|
||||
"serialize simple Type"
|
||||
);
|
||||
|
||||
# print $xml;
|
||||
|
||||
SKIP: {
|
||||
skip_without_test_xml();
|
||||
is_xml( $xml, '<test type="tns:testSimpleType1">1</test>',
|
||||
"content compare" );
|
||||
};
|
||||
|
||||
$type = $types->find_type( 'urn:myNamespace', 'testSimpleList' );
|
||||
ok($xml = $type->serialize( 'testList', [ 1, 2, 3 ] , $serializer_options ),
|
||||
"serialize simple list type"
|
||||
);
|
||||
SKIP: {
|
||||
skip_without_test_xml();
|
||||
is_xml( $xml, '<testList type="tns:testSimpleList">1 2 3</testList>',
|
||||
"content compare" );
|
||||
};
|
||||
|
||||
$type = $types->find_element( 'urn:myNamespace', 'TestElement' );
|
||||
|
||||
ok($xml = $type->serialize( undef, 1 , $serializer_options ),
|
||||
"serialize simple element");
|
||||
SKIP: {
|
||||
skip_without_test_xml();
|
||||
is_xml( $xml, '<TestElement type="xsd:int">1</TestElement>',
|
||||
"content compare" );
|
||||
};
|
||||
|
||||
ok( $xml = $types->find_type( 'urn:myNamespace', 'length3')->serialize(
|
||||
'TestComplex', { size => -13, unit => 'BLA' } ,
|
||||
$serializer_options
|
||||
),
|
||||
"serialize complex type");
|
||||
|
||||
SKIP: {
|
||||
skip_without_test_xml();
|
||||
is_xml( $xml, q{
|
||||
<TestComplex type="tns:length3">
|
||||
<size type="xsd:non-positive-integer">-13</size>
|
||||
<unit type="xsd:NMTOKEN">BLA</unit>
|
||||
</TestComplex>},
|
||||
"content compare" );
|
||||
};
|
||||
|
||||
ok($xml = $types->find_element( 'urn:myNamespace', 'TestElementComplexType')
|
||||
->serialize(
|
||||
undef, { size => -13, unit => 'BLA' } , $serializer_options ),
|
||||
"serialize element with complex type"
|
||||
);
|
||||
SKIP: {
|
||||
skip_without_test_xml();
|
||||
is_xml( $xml, q{
|
||||
<TestElementComplexType type="tns:length3">
|
||||
<size type="xsd:non-positive-integer">-13</size>
|
||||
<unit type="xsd:NMTOKEN">BLA</unit>
|
||||
</TestElementComplexType>
|
||||
},
|
||||
"content compare" );
|
||||
};
|
||||
|
||||
|
||||
ok($xml = $types->find_type( 'urn:myNamespace', 'complex')->serialize(
|
||||
'complexComplex',
|
||||
{ 'length' => { size => -13, unit => 'BLA' }, 'int' => 1 },
|
||||
$serializer_options ),
|
||||
"serialize complex type with complex content"
|
||||
);
|
||||
SKIP: {
|
||||
skip_without_test_xml();
|
||||
is_xml( $xml, q{
|
||||
<complexComplex type="tns:complex">
|
||||
<length type="tns:length3">
|
||||
<size type="xsd:non-positive-integer">-13</size>
|
||||
<unit type="xsd:NMTOKEN">BLA</unit>
|
||||
</length>
|
||||
<int type="xsd:int">1</int>
|
||||
</complexComplex>
|
||||
},
|
||||
"content compare" );
|
||||
}
|
||||
ok($xml = $wsdl->find_message('urn:myNamespace', 'testRequest')
|
||||
->get_part()->[0]->serialize(
|
||||
undef,
|
||||
{ test => { length => { size => -13, unit => 'BLA' } , int => 3 } },
|
||||
$serializer_options ),
|
||||
"serialize part"
|
||||
);
|
||||
SKIP: {
|
||||
skip_without_test_xml();
|
||||
is_xml( $xml, q{
|
||||
<test type="tns:complex">
|
||||
<length type="tns:length3">
|
||||
<size type="xsd:non-positive-integer">-13</size>
|
||||
<unit type="xsd:NMTOKEN">BLA</unit>
|
||||
</length>
|
||||
<int type="xsd:int">3</int>
|
||||
</test>
|
||||
},
|
||||
"content compare")
|
||||
};
|
||||
|
||||
my $opt = {
|
||||
typelib => $types,
|
||||
readable => 1,
|
||||
autotype => 0,
|
||||
namespace => { 'urn:myNamespace' => 'tns',
|
||||
'http://www.w3.org/2001/XMLSchema' => 'xsd',
|
||||
'http://schemas.xmlsoap.org/wsdl/' => 'wsdl',
|
||||
},
|
||||
indent => "",
|
||||
wsdl => $wsdl,
|
||||
};
|
||||
|
||||
# ok $wsdl->explain($opt) =~ m/#optional/m;
|
||||
|
||||
sub skip_without_test_xml {
|
||||
skip("Test::XML not available", 1) if (not $Test::XML::VERSION);
|
||||
}
|
||||
|
||||
sub xml
|
||||
{
|
||||
return q{<?xml version="1.0"?>
|
||||
<definitions name="simpleType"
|
||||
targetNamespace="urn:myNamespace"
|
||||
xmlns="http://schemas.xmlsoap.org/wsdl/"
|
||||
xmlns:tns="urn:myNamespace"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
|
||||
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
|
||||
>
|
||||
<types>
|
||||
<xsd:schema targetNamespace="urn:myNamespace">
|
||||
<xsd:complexType name="length3">
|
||||
<xsd:all>
|
||||
<xsd:element name="size" type="xsd:non-positive-integer"/>
|
||||
<xsd:element name="unit" type="xsd:NMTOKEN"/>
|
||||
</xsd:all>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="complex">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="length" type="tns:length3"/>
|
||||
<xsd:element name="int" type="xsd:int"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:element name="TestElement" type="xsd:int"/>
|
||||
<xsd:element name="TestElementComplexType" type="tns:length3"/>
|
||||
<xsd:simpleType name="testSimpleType1">
|
||||
<xsd:restriction base="int">
|
||||
<xsd:enumeration value="1"/>
|
||||
<xsd:enumeration value="2"/>
|
||||
<xsd:enumeration value="3"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
|
||||
<xsd:simpleType name="testSimpleList">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
SimpleType Test
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:list itemType="int">
|
||||
</xsd:list>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="testSimpleUnion">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
SimpleType Union test
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:union memberTypes="int float">
|
||||
</xsd:union>
|
||||
</xsd:simpleType>
|
||||
</xsd:schema>
|
||||
</types>
|
||||
<message name="testRequest">
|
||||
<part name="test" type="tns:complex"/>
|
||||
</message>
|
||||
<message name="testResponse">
|
||||
<part name="test" type="tns:testSimpleType1"/>
|
||||
</message>
|
||||
<message name="testRequest2">
|
||||
<part name="test" type="tns:testSimpleType1"/>
|
||||
</message>
|
||||
<message name="testResponse2">
|
||||
<part name="test" type="tns:testSimpleType1"/>
|
||||
</message>
|
||||
<portType name="testPort">
|
||||
<operation name="test">
|
||||
<documentation>
|
||||
Test-Methode
|
||||
</documentation>
|
||||
|
||||
<input message="tns:testRequest"/>
|
||||
<output message="tns:testResponse"/>
|
||||
</operation>
|
||||
<operation name="test2">
|
||||
<documentation>
|
||||
Test-Methode
|
||||
</documentation>
|
||||
|
||||
<input message="tns:testRequest2"/>
|
||||
<output message="tns:testResponse2"/>
|
||||
</operation>
|
||||
</portType>
|
||||
<portType name="testPort2">
|
||||
<operation name="test">
|
||||
<documentation>
|
||||
Test-Methode
|
||||
</documentation>
|
||||
|
||||
<input message="tns:testRequest"/>
|
||||
<output message="tns:testResponse"/>
|
||||
</operation>
|
||||
</portType>
|
||||
<portType name="testPort3">
|
||||
<operation name="test">
|
||||
<documentation>
|
||||
Test-Methode
|
||||
</documentation>
|
||||
<input message="tns:testRequest"/>
|
||||
<output message="tns:testResponse"/>
|
||||
</operation>
|
||||
</portType>
|
||||
|
||||
<binding type="tns:testPort" name="testBinding">
|
||||
<operation name="test">
|
||||
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
|
||||
<soap:operation soapAction="test">
|
||||
<input>
|
||||
<soap:body use="literal"/>
|
||||
</input>
|
||||
<output>
|
||||
<soap:body use="literal"/>
|
||||
</output>
|
||||
</soap:operation>
|
||||
</operation>
|
||||
</binding>
|
||||
<binding type="tns:testPort2" name="testBinding2">
|
||||
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
|
||||
<operation name="test">
|
||||
<soap:operation soapAction="test">
|
||||
<input>
|
||||
<soap:body use="literal"/>
|
||||
</input>
|
||||
<output>
|
||||
<soap:body use="literal"/>
|
||||
</output>
|
||||
</soap:operation>
|
||||
</operation>
|
||||
</binding>
|
||||
<binding type="tns:testPort3" name="testBinding3">
|
||||
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
|
||||
<operation name="test">
|
||||
<soap:operation soapAction="test">
|
||||
<input>
|
||||
<soap:body use="literal"/>
|
||||
</input>
|
||||
<output>
|
||||
<soap:body use="literal"/>
|
||||
</output>
|
||||
</soap:operation>
|
||||
</operation>
|
||||
</binding>
|
||||
<service name="testService">
|
||||
<port name="testPort" binding="tns:testBinding">
|
||||
<soap:address location="http://127.0.0.1/testPort" />
|
||||
</port>
|
||||
<port name="testPort2" binding="tns:testBinding2">
|
||||
<soap:address location="http://127.0.0.1/testPort2" />
|
||||
</port>
|
||||
</service>
|
||||
<service name="testService2">
|
||||
<port name="testPort3" binding="tns:testBinding3">
|
||||
<soap:address location="http://127.0.0.1/testPort3" />
|
||||
</port>
|
||||
|
||||
</service>
|
||||
</definitions>
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
+10
-6
@@ -1,9 +1,15 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 18; # qw/no_plan/; # TODO: change to tests => N;
|
||||
use Test::More;
|
||||
use lib '../lib';
|
||||
use XML::SAX::ParserFactory;
|
||||
|
||||
if (eval "require XML::LibXML") {
|
||||
plan tests => 18;
|
||||
}
|
||||
else {
|
||||
plan skip_all => "Cannot test without XML::LibXML";
|
||||
}
|
||||
|
||||
eval {
|
||||
require Test::XML;
|
||||
@@ -15,12 +21,10 @@ use_ok(qw/SOAP::WSDL::SAX::WSDLHandler/);
|
||||
my $filter;
|
||||
|
||||
ok($filter = SOAP::WSDL::SAX::WSDLHandler->new(
|
||||
{ base => 'XML::SAX::Base' }
|
||||
), "Object creation");
|
||||
|
||||
my $parser = XML::SAX::ParserFactory->parser(
|
||||
Handler => $filter
|
||||
);
|
||||
my $parser = XML::LibXML->new();
|
||||
$parser->set_handler( $filter );
|
||||
|
||||
$parser->parse_string( xml() );
|
||||
|
||||
|
||||
@@ -1,7 +1,13 @@
|
||||
use Test::More tests => 11;
|
||||
use Data::Dumper;
|
||||
use Test::More;
|
||||
use lib '../lib';
|
||||
use XML::LibXML;
|
||||
|
||||
if (eval "require XML::LibXML") {
|
||||
plan tests => 11;
|
||||
}
|
||||
else {
|
||||
plan skip_all => "Cannot test without XML::LibXML";
|
||||
}
|
||||
|
||||
|
||||
use_ok(qw/SOAP::WSDL::SAX::WSDLHandler/);
|
||||
|
||||
|
||||
@@ -0,0 +1,256 @@
|
||||
use Test::More tests => 11;
|
||||
use Data::Dumper;
|
||||
use lib '../lib';
|
||||
use XML::LibXML;
|
||||
|
||||
use_ok(qw/SOAP::WSDL::SAX::WSDLHandler/);
|
||||
|
||||
my $filter;
|
||||
|
||||
ok($filter = SOAP::WSDL::SAX::WSDLHandler->new(), "Object creation");
|
||||
|
||||
my $parser = XML::LibXML->new();
|
||||
$parser->set_handler( $filter );
|
||||
|
||||
eval { $parser->parse_string( xml() ) };
|
||||
if ($@)
|
||||
{
|
||||
fail("parsing WSDL");
|
||||
die "Can't test without parsed WSDL";
|
||||
}
|
||||
else
|
||||
{
|
||||
pass("parsing XML");
|
||||
}
|
||||
|
||||
my $wsdl;
|
||||
ok( $wsdl = $filter->get_data() , "get object tree");
|
||||
|
||||
|
||||
my $schema = $wsdl->first_types();
|
||||
|
||||
my $opt = {
|
||||
readable => 0,
|
||||
autotype => 1,
|
||||
namespace => $wsdl->get_xmlns(),
|
||||
indent => "\t",
|
||||
typelib => $schema,
|
||||
};
|
||||
|
||||
is( $schema->find_type( 'myNamespace', 'testSimpleType1' )->serialize(
|
||||
'test', 1 , $opt ),
|
||||
q{<test type="tns:testSimpleType1">1</test>} , "serialize simple type");
|
||||
|
||||
is( $schema->find_type( 'myNamespace', 'testSimpleList' )->serialize(
|
||||
'testList', [ 1, 2, 3 ] , $opt),
|
||||
q{<testList type="tns:testSimpleList">1 2 3</testList>},
|
||||
"serialize simple list type"
|
||||
);
|
||||
|
||||
is( $schema->find_element( 'myNamespace', 'TestElement' )->serialize(
|
||||
undef, 1 , $opt),
|
||||
q{<TestElement type="xsd:int">1</TestElement>}, "Serialize element"
|
||||
);
|
||||
|
||||
$opt->{ readable } = 0;
|
||||
|
||||
is( $schema->find_type( 'myNamespace', 'length3')->serialize(
|
||||
'TestComplex', { size => -13, unit => 'BLA' } ,
|
||||
$opt ),
|
||||
q{<TestComplex type="tns:length3" >}
|
||||
. q{<size type="xsd:non-positive-integer">-13</size>}
|
||||
. q{<unit type="xsd:NMTOKEN">BLA</unit></TestComplex>}
|
||||
, "serialize complex type" );
|
||||
|
||||
is( $schema->find_element( 'myNamespace', 'TestElementComplexType')->serialize(
|
||||
undef, { size => -13, unit => 'BLA' } ,
|
||||
$opt ),
|
||||
q{<TestElementComplexType type="tns:length3" >}
|
||||
. q{<size type="xsd:non-positive-integer">-13</size>}
|
||||
. q{<unit type="xsd:NMTOKEN">BLA</unit></TestElementComplexType>},
|
||||
"element with complex type"
|
||||
);
|
||||
|
||||
is( $schema->find_type( 'myNamespace', 'complex')->serialize(
|
||||
'complexComplex',
|
||||
{ 'length' => { size => -13, unit => 'BLA' }, 'int' => 1 },
|
||||
$opt ),
|
||||
q{<complexComplex type="tns:complex" >}
|
||||
. q{<length type="tns:length3" >}
|
||||
. q{<size type="xsd:non-positive-integer">-13</size>}
|
||||
. q{<unit type="xsd:NMTOKEN">BLA</unit></length>}
|
||||
. q{<int type="xsd:int">1</int></complexComplex>},
|
||||
"nested complex type"
|
||||
);
|
||||
|
||||
is( $wsdl->find_message('myNamespace', 'testRequest')->first_part()->serialize(
|
||||
undef, { test => { length => { size => -13, unit => 'BLA' } , int => 3 } },
|
||||
$opt ),
|
||||
q{<test type="tns:complex" >}
|
||||
. q{<length type="tns:length3" >}
|
||||
. q{<size type="xsd:non-positive-integer">-13</size>}
|
||||
. q{<unit type="xsd:NMTOKEN">BLA</unit>}
|
||||
. q{</length><int type="xsd:int">3</int></test>}
|
||||
, "Message part"
|
||||
);
|
||||
|
||||
|
||||
exit;
|
||||
|
||||
sub xml
|
||||
{
|
||||
return q{<?xml version="1.0"?>
|
||||
<definitions name="simpleType"
|
||||
targetNamespace="myNamespace"
|
||||
xmlns="http://schemas.xmlsoap.org/wsdl/"
|
||||
xmlns:tns="myNamespace"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
|
||||
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
|
||||
>
|
||||
<types>
|
||||
<xsd:schema targetNamespace="myNamespace">
|
||||
<xsd:complexType name="length3">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="size" type="xsd:non-positive-integer"/>
|
||||
<xsd:element name="unit" type="xsd:NMTOKEN"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="complex">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="length" type="tns:length3"/>
|
||||
<xsd:element name="int" type="xsd:int"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:element name="TestElement" type="xsd:int"/>
|
||||
<xsd:element name="TestElementComplexType" type="tns:length3"/>
|
||||
<xsd:simpleType name="testSimpleType1">
|
||||
<xsd:restriction base="int">
|
||||
<xsd:enumeration value="1"/>
|
||||
<xsd:enumeration value="2"/>
|
||||
<xsd:enumeration value="3"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
|
||||
<xsd:simpleType name="testSimpleList">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
SimpleType Test
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:list itemType="int">
|
||||
</xsd:list>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="testSimpleUnion">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
SimpleType Union test
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:union memberTypes="int float">
|
||||
</xsd:union>
|
||||
</xsd:simpleType>
|
||||
</xsd:schema>
|
||||
</types>
|
||||
<message name="testRequest">
|
||||
<part name="test" type="tns:complex"/>
|
||||
</message>
|
||||
<message name="testResponse">
|
||||
<part name="test" type="tns:testSimpleType1"/>
|
||||
</message>
|
||||
<message name="testRequest2">
|
||||
<part name="test" type="tns:testSimpleType1"/>
|
||||
</message>
|
||||
<message name="testResponse2">
|
||||
<part name="test" type="tns:testSimpleType1"/>
|
||||
</message>
|
||||
<portType name="testPort">
|
||||
<operation name="test">
|
||||
<documentation>
|
||||
Test-Methode
|
||||
</documentation>
|
||||
|
||||
<input message="testRequest"/>
|
||||
<output message="testResponse"/>
|
||||
</operation>
|
||||
<operation name="test2">
|
||||
<documentation>
|
||||
Test-Methode
|
||||
</documentation>
|
||||
|
||||
<input message="testRequest2"/>
|
||||
<output message="testResponse2"/>
|
||||
</operation>
|
||||
</portType>
|
||||
<portType name="testPort2">
|
||||
<operation name="test">
|
||||
<documentation>
|
||||
Test-Methode
|
||||
</documentation>
|
||||
|
||||
<input message="testRequest"/>
|
||||
<output message="testResponse"/>
|
||||
</operation>
|
||||
</portType>
|
||||
<portType name="testPort3">
|
||||
<operation name="test">
|
||||
<documentation>
|
||||
Test-Methode
|
||||
</documentation>
|
||||
<input message="testRequest"/>
|
||||
<output message="testResponse"/>
|
||||
</operation>
|
||||
</portType>
|
||||
|
||||
<binding type="testPort" name="testBinding">
|
||||
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
|
||||
<soap:operation soapAction="test">
|
||||
<input>
|
||||
<soap:body use="literal"/>
|
||||
</input>
|
||||
<output>
|
||||
<soap:body use="literal"/>
|
||||
</output>
|
||||
</soap:operation>
|
||||
</binding>
|
||||
<binding type="testPort2" name="testBinding2">
|
||||
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
|
||||
<soap:operation soapAction="test">
|
||||
<input>
|
||||
<soap:body use="literal"/>
|
||||
</input>
|
||||
<output>
|
||||
<soap:body use="literal"/>
|
||||
</output>
|
||||
</soap:operation>
|
||||
</binding>
|
||||
<binding type="testPort3" name="testBinding3">
|
||||
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
|
||||
<soap:operation soapAction="test">
|
||||
<input>
|
||||
<soap:body use="literal"/>
|
||||
</input>
|
||||
<output>
|
||||
<soap:body use="literal"/>
|
||||
</output>
|
||||
</soap:operation>
|
||||
</binding>
|
||||
<service name="testService">
|
||||
<port name="testPort" binding="testBinding">
|
||||
<soap:address location="http://127.0.0.1/testPort" />
|
||||
</port>
|
||||
<port name="testPort2" binding="testBinding2">
|
||||
<soap:address location="http://127.0.0.1/testPort2" />
|
||||
</port>
|
||||
<port name="testPort3" binding="testBinding3">
|
||||
<soap:address location="http://127.0.0.1/testPort3" />
|
||||
</port>
|
||||
|
||||
</service>
|
||||
</definitions>
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,403 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 5;
|
||||
use lib '../lib';
|
||||
|
||||
use XML::LibXML;
|
||||
|
||||
eval {
|
||||
require Test::XML;
|
||||
import Test::XML;
|
||||
};
|
||||
|
||||
use_ok(qw/SOAP::WSDL::SAX::WSDLHandler/);
|
||||
|
||||
my $filter;
|
||||
|
||||
ok($filter = SOAP::WSDL::SAX::WSDLHandler->new(), "Object creation");
|
||||
|
||||
my $parser = XML::LibXML->new();
|
||||
$parser->set_handler( $filter );
|
||||
|
||||
eval { $parser->parse_string( xml() ) };
|
||||
if ($@)
|
||||
{
|
||||
fail("parsing WSDL");
|
||||
die "Can't test without parsed WSDL: $@";
|
||||
}
|
||||
else
|
||||
{
|
||||
pass("parsing XML");
|
||||
}
|
||||
|
||||
my $wsdl;
|
||||
ok( $wsdl = $filter->get_data() , "get object tree");
|
||||
|
||||
my $schema = $wsdl->get_types()->[0]->get_schema()->[0] || die "No schema !";
|
||||
|
||||
my $opt = {
|
||||
typelib => $wsdl->first_types,
|
||||
readable => 1,
|
||||
autotype => 0,
|
||||
namespace => { 'http://www.example.org/MessageGateway2/' => 'tns',
|
||||
'http://www.w3.org/2001/XMLSchema' => 'xsd',
|
||||
'http://schemas.xmlsoap.org/wsdl/' => 'wsdl',
|
||||
},
|
||||
indent => "",
|
||||
};
|
||||
|
||||
my $data = { EnqueueMessage => {
|
||||
MMessage => {
|
||||
MRecipientURI => 'anyURI',
|
||||
MSenderAddress => 'a string',
|
||||
MMessageContent => 'a string',
|
||||
MSubject => 'a string',
|
||||
MDeliveryReportRecipientURI => 'anyURI',
|
||||
MKeepalive => {
|
||||
MKeepaliveTimeout => 1234567,
|
||||
MKeepaliveErrorPolicy => ' ( suppress | report ) ',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
SKIP: { skip_without_test_xml();
|
||||
is_xml( $wsdl->find_message(
|
||||
"http://www.example.org/MessageGateway2/" ,'EnqueueMessageRequest'
|
||||
)->first_part()->serialize( 'test', $data, $opt ),
|
||||
xml_message()
|
||||
, "Serialized message part"
|
||||
);
|
||||
}
|
||||
|
||||
sub skip_without_test_xml {
|
||||
skip("Test::XML not available", 1) if (not $Test::XML::VERSION);
|
||||
}
|
||||
|
||||
sub xml_message {
|
||||
return
|
||||
q{<EnqueueMessage xmlns="http://www.example.org/MessageGateway2/">
|
||||
<MMessage>
|
||||
<MRecipientURI>anyURI</MRecipientURI>
|
||||
<MSenderAddress>a string</MSenderAddress>
|
||||
<MMessageContent>a string</MMessageContent>
|
||||
<MSubject>a string</MSubject>
|
||||
<MDeliveryReportRecipientURI>anyURI</MDeliveryReportRecipientURI>
|
||||
<MKeepalive>
|
||||
<MKeepaliveTimeout>1234567</MKeepaliveTimeout>
|
||||
<MKeepaliveErrorPolicy> ( suppress | report ) </MKeepaliveErrorPolicy>
|
||||
</MKeepalive>
|
||||
</MMessage>
|
||||
</EnqueueMessage>
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
sub xml {
|
||||
return q{<?xml version="1.0" encoding="UTF-8"?>
|
||||
<wsdl:definitions name="MessageGateway"
|
||||
targetNamespace="http://www.example.org/MessageGateway2/"
|
||||
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
|
||||
xmlns:tns="http://www.example.org/MessageGateway2/"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
|
||||
<wsdl:types>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
targetNamespace="http://www.example.org/MessageGateway2/">
|
||||
|
||||
<xsd:element name="EnqueueMessage" type="tns:TEnqueueMessage"
|
||||
xmlns:tns="http://www.example.org/MessageGateway2/">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Enqueue message request element</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
|
||||
<xsd:complexType name="TMessage">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
A type containing all elements of a message to enqueue.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="MRecipientURI" type="xsd:anyURI" minOccurs="1"
|
||||
maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
|
||||
<xsd:documentation>
|
||||
The recipient in URI notaitions. Valid URI schemas are: mailto:, sms:,
|
||||
phone:. Not all URI schemas need to be implemented at the current
|
||||
implementation stage.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="MSenderAddress" type="xsd:string" minOccurs="0"
|
||||
maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
E-Mail sender address. Ignored for all but mailto: recipient URIs.
|
||||
</xsd:documentation>
|
||||
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="MMessageContent" type="xsd:string" minOccurs="1"
|
||||
maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Message Content.</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="MSubject" type="xsd:string" minOccurs="0" maxOccurs="1">
|
||||
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Message Subject. Ignored for all but mailto: URIs
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="MDeliveryReportRecipientURI" type="xsd:anyURI" minOccurs="0"
|
||||
maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
|
||||
URI to send a delivery report to. May be of one of the following schemes:
|
||||
mailto:, http:, https:. Reports to mailto: URIs are sent as plaintext,
|
||||
reports to http(s) URIs are sent as SOAP requests following the
|
||||
MessageGatewayClient service definition.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="MKeepalive" type="tns:TKeepalive" minOccurs="0"
|
||||
maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Container for keepalive information. May be missing.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
|
||||
</xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="TKeepalive">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Type containing keeplive information.</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:sequence>
|
||||
|
||||
<xsd:element name="MKeepaliveTimeout" type="xsd:double">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Keepalive timeout. The keepalive timeout spezifies how long the sending of
|
||||
a message will be delayed waiting for keepalive updates. If a keepalive
|
||||
update is received during this period, the timeout will be reset. If not,
|
||||
the message will be sent after the timeout has expired.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="MKeepaliveErrorPolicy" minOccurs="0" maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
|
||||
<xsd:documentation>
|
||||
Policy to comply to in case of system errors. Valid values are "suppress"
|
||||
and "report". If the policy is set to "suppress", keepalive messages will
|
||||
not be sent to their recipients in case of partial system failure, even if
|
||||
the keepalive has expired. This may result in "false negatives", i.e.
|
||||
messages may not be sent, even though their keepalive has expired. If the
|
||||
value is "report", keepalive messages will be sent from any cluster node.
|
||||
This may result in "false positive" alerts.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:simpleType>
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="suppress"></xsd:enumeration>
|
||||
<xsd:enumeration value="report"></xsd:enumeration>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
</xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="TMessageID">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Type containing a message ID.</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
|
||||
<xsd:sequence>
|
||||
<xsd:element name="MMessageID" type="xsd:string" minOccurs="1" maxOccurs="1"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="TKeepliveMessage">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Type containing all elements of a keppalive update / remove request.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="MMessageID" type="xsd:string" minOccurs="1" maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
The ID for the message to update / remove
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
|
||||
<xsd:element name="MAction" minOccurs="1" maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
The action to perform. Valid values are: "remove", "update". On "remove",
|
||||
the message with the ID specified will be removed from the queue, thus it
|
||||
will never be sent, even if it's timeout expires. On "update" the
|
||||
keepalive timeout of the corresponding message will be reset.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:simpleType>
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="remove"></xsd:enumeration>
|
||||
<xsd:enumeration value="update"></xsd:enumeration>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
</xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:element name="KeepaliveMessage" type="tns:TKeepaliveMessageRequest">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Keepalive message request element</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="KeepaliveMessageResponse" type="tns:TMessageID">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Response element for a keepalive request</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="EnqueueMessageResponse" type="tns:TMessageID">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Enqueue message response element</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
|
||||
|
||||
<xsd:complexType name="TEnqueueMessage">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
A complex type containing one element: The message to enqueue.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="MMessage" type="tns:TMessage">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Element containing a message to enqueue.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
|
||||
</xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
|
||||
<xsd:complexType name="TKeepaliveMessageRequest">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
A complex type containing one element: The keepalive message to process.
|
||||
</xsd:documentation>
|
||||
|
||||
</xsd:annotation>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="MKeepaliveMessage" type="tns:TKeepliveMessage">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Element containing a keepalive message to process.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:schema>
|
||||
</wsdl:types>
|
||||
<wsdl:message name="EnqueueMessageRequest">
|
||||
<wsdl:part name="parameters" element="tns:EnqueueMessage">
|
||||
<wsdl:documentation>inputparameters for EnqueueMessag</wsdl:documentation>
|
||||
</wsdl:part>
|
||||
|
||||
</wsdl:message>
|
||||
<wsdl:message name="EnqueueMessageResponse">
|
||||
<wsdl:part name="parameters" element="tns:EnqueueMessageResponse">
|
||||
<wsdl:documentation>outputparameters for EnqueueMessag</wsdl:documentation>
|
||||
</wsdl:part>
|
||||
</wsdl:message>
|
||||
<wsdl:message name="KeepaliveMessageRequest">
|
||||
<wsdl:part name="parameters" element="tns:KeepaliveMessage">
|
||||
|
||||
<wsdl:documentation>input parameters for KeepaliveMessag</wsdl:documentation>
|
||||
</wsdl:part>
|
||||
</wsdl:message>
|
||||
<wsdl:message name="KeepaliveMessageResponse">
|
||||
<wsdl:part name="parameters" element="tns:KeepaliveMessageResponse">
|
||||
<wsdl:documentation>output parameters for KeepaliveMessag</wsdl:documentation>
|
||||
</wsdl:part>
|
||||
</wsdl:message>
|
||||
|
||||
<wsdl:portType name="MGWPortType">
|
||||
<wsdl:documentation>
|
||||
generic port type for all methods required for sending messages over the mosaic
|
||||
message gatewa
|
||||
</wsdl:documentation>
|
||||
<wsdl:operation name="EnqueueMessage">
|
||||
<wsdl:documentation>
|
||||
This method is used to enqueue a normal (immediate send) or a delayed message with
|
||||
keepalive functionality.
|
||||
</wsdl:documentation>
|
||||
<wsdl:input message="tns:EnqueueMessageRequest"></wsdl:input>
|
||||
<wsdl:output message="tns:EnqueueMessageResponse"></wsdl:output>
|
||||
|
||||
</wsdl:operation>
|
||||
<wsdl:operation name="KeepaliveMessage">
|
||||
<wsdl:documentation>
|
||||
This method is used to update or remove a
|
||||
keepalive message.
|
||||
</wsdl:documentation>
|
||||
<wsdl:input message="tns:KeepaliveMessageRequest"></wsdl:input>
|
||||
<wsdl:output message="tns:KeepaliveMessageResponse"></wsdl:output>
|
||||
</wsdl:operation>
|
||||
</wsdl:portType>
|
||||
|
||||
<wsdl:binding name="MGWBinding" type="tns:MGWPortType">
|
||||
<wsdl:documentation>Generic binding for all (SOAP) port</wsdl:documentation>
|
||||
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
|
||||
<wsdl:operation name="EnqueueMessage">
|
||||
<soap:operation soapAction="http://www.example.org/MessageGateway2/EnqueueMessage" />
|
||||
<wsdl:input>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:input>
|
||||
<wsdl:output>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:output>
|
||||
</wsdl:operation>
|
||||
<wsdl:operation name="KeepaliveMessage">
|
||||
<soap:operation
|
||||
soapAction="http://www.example.org/MessageGateway2/KeepaliveMessage" />
|
||||
<wsdl:input>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:input>
|
||||
|
||||
<wsdl:output>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:output>
|
||||
</wsdl:operation>
|
||||
</wsdl:binding>
|
||||
<wsdl:service name="MessageGateway">
|
||||
<wsdl:documentation>
|
||||
Web Service for sending messages over the mosaic message gatewa
|
||||
</wsdl:documentation>
|
||||
|
||||
<wsdl:port name="HTTPPort" binding="tns:MGWBinding">
|
||||
<wsdl:documentation>HTTP(S) port for the mosaic message gatewa</wsdl:documentation>
|
||||
<soap:address location="https://www.example.org/MessageGateway/" />
|
||||
</wsdl:port>
|
||||
</wsdl:service>
|
||||
</wsdl:definitions>};
|
||||
}
|
||||
+7
-4
@@ -1,11 +1,15 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 5;
|
||||
use Test::More;
|
||||
use lib '../lib';
|
||||
use XML::SAX::ParserFactory;
|
||||
|
||||
use diagnostics;
|
||||
if (eval "require XML::LibXML") {
|
||||
plan tests => 5;
|
||||
}
|
||||
else {
|
||||
plan skip_all => "Cannot test without XML::LibXML";
|
||||
}
|
||||
|
||||
eval {
|
||||
require Test::XML;
|
||||
@@ -18,7 +22,6 @@ my $filter;
|
||||
|
||||
ok($filter = SOAP::WSDL::SAX::WSDLHandler->new(), "Object creation");
|
||||
|
||||
use XML::LibXML;
|
||||
my $parser = XML::LibXML->new();
|
||||
$parser->set_handler( $filter );
|
||||
|
||||
|
||||
@@ -0,0 +1,255 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More qw/no_plan/; # TODO: change to tests => N;
|
||||
use Data::Dumper;
|
||||
use lib '../lib';
|
||||
use XML::LibXML;
|
||||
|
||||
use diagnostics;
|
||||
|
||||
use_ok(qw/SOAP::WSDL::SAX::WSDLHandler/);
|
||||
|
||||
my $filter;
|
||||
|
||||
ok($filter = SOAP::WSDL::SAX::WSDLHandler->new(), "Object creation");
|
||||
|
||||
my $parser = XML::LibXML->new();
|
||||
$parser->set_handler( $filter );
|
||||
|
||||
eval { $parser->parse_string( xml() ) };
|
||||
if ($@)
|
||||
{
|
||||
fail("parsing WSDL");
|
||||
die "Can't test without parsed WSDL: $@";
|
||||
}
|
||||
else
|
||||
{
|
||||
pass("parsing XML");
|
||||
}
|
||||
|
||||
my $wsdl;
|
||||
ok( $wsdl = $filter->get_data() , "get object tree");
|
||||
|
||||
my $opt = {
|
||||
namespace => $wsdl->get_xmlns(),
|
||||
style => 'perl',
|
||||
wsdl => $wsdl,
|
||||
readable => 1,
|
||||
};
|
||||
|
||||
my $txt;
|
||||
ok( $txt = $wsdl->explain( $opt ) , "explain WSDL" );
|
||||
|
||||
# print $txt;
|
||||
|
||||
sub xml {
|
||||
return q{<?xml version="1.0" encoding="UTF-8"?>
|
||||
<wsdl:definitions targetNamespace="http://example.com/soap/services/ETest/impl"
|
||||
xmlns="http://schemas.xmlsoap.org/wsdl/"
|
||||
xmlns:apachesoap="http://xml.apache.org/xml-soap"
|
||||
xmlns:impl="http://example.com/soap/services/ETest/impl"
|
||||
xmlns:intf="http://example.com/soap/services/ETest"
|
||||
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
|
||||
xmlns:tns1="urn:ETest"
|
||||
xmlns:tns2="urn:acquisition"
|
||||
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
|
||||
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
|
||||
<wsdl:types>
|
||||
<schema targetNamespace="urn:ETest" xmlns="http://www.w3.org/2001/XMLSchema">
|
||||
<import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
|
||||
<complexType name="CreationBaseData">
|
||||
<sequence>
|
||||
<element name="createdBy" nillable="true" type="xsd:long" />
|
||||
<element name="creationDate" nillable="true" type="xsd:dateTime" />
|
||||
<element name="updateDateCenter" nillable="true" type="xsd:dateTime" />
|
||||
<element name="updateDateLocal" nillable="true" type="xsd:dateTime" />
|
||||
<element name="updatedBy" nillable="true" type="xsd:long" />
|
||||
</sequence>
|
||||
</complexType>
|
||||
<complexType name="CreationData">
|
||||
<complexContent>
|
||||
<extension base="tns1:CreationBaseData">
|
||||
<sequence>
|
||||
<element name="creatorFullName" nillable="true" type="xsd:string" />
|
||||
<element name="modifierFullName" nillable="true" type="xsd:string" />
|
||||
</sequence>
|
||||
</extension>
|
||||
</complexContent>
|
||||
</complexType>
|
||||
<complexType abstract="true" name="EProductData">
|
||||
<sequence>
|
||||
<element name="EStatus" nillable="true" type="xsd:string" />
|
||||
<element name="EStatusUpdatedate" nillable="true" type="xsd:dateTime" />
|
||||
<element name="SFXID" nillable="true" type="xsd:string" />
|
||||
<element name="activationFromDate" nillable="true" type="xsd:dateTime" />
|
||||
<element name="activationToDate" nillable="true" type="xsd:dateTime" />
|
||||
<element name="activityStatusDateFrom" nillable="true" type="xsd:dateTime" />
|
||||
<element name="activityStatusDateTo" nillable="true" type="xsd:dateTime" />
|
||||
<element name="canEditSFXID" type="xsd:boolean" />
|
||||
<element name="concurrentNumberOfUsers" nillable="true" type="xsd:int" />
|
||||
<element name="creationData" nillable="true" type="tns1:CreationData" />
|
||||
<element name="deleteable" type="xsd:boolean" />
|
||||
<element name="ETestCode" nillable="true" type="xsd:string" />
|
||||
<element name="id" nillable="true" type="xsd:long" />
|
||||
<element name="instanceCode" nillable="true" type="xsd:string" />
|
||||
<element name="mainContact" nillable="true" type="xsd:string" />
|
||||
<element name="metaLibID" nillable="true" type="xsd:string" />
|
||||
<element name="otherID" nillable="true" type="xsd:string" />
|
||||
<element name="otherSource" nillable="true" type="xsd:string" />
|
||||
<element name="privateNote" nillable="true" type="xsd:string" />
|
||||
<element name="procurementStatus" nillable="true" type="xsd:string" />
|
||||
<element name="procurementStatusUpdateDate" nillable="true" type="xsd:dateTime" />
|
||||
<element name="procurementStatusUpdatedate" nillable="true" type="xsd:dateTime" />
|
||||
<element name="sourceInstanceCode" nillable="true" type="xsd:string" />
|
||||
<element name="sponseringLibraryCode" nillable="true" type="xsd:string" />
|
||||
<element name="sponseringLibraryName" nillable="true" type="xsd:string" />
|
||||
<element name="updateTarget" nillable="true" type="xsd:string" />
|
||||
<element name="workExpressionCode" nillable="true" type="xsd:string" />
|
||||
</sequence>
|
||||
</complexType>
|
||||
<complexType name="EProductInformation">
|
||||
<sequence>
|
||||
<element name="acquisitions" nillable="true"
|
||||
type="impl:ArrayOf_tns2_AcquisitionData" />
|
||||
<element name="data" nillable="true" type="tns1:EProductData" />
|
||||
</sequence>
|
||||
</complexType>
|
||||
</schema>
|
||||
<schema targetNamespace="urn:acquisition" xmlns="http://www.w3.org/2001/XMLSchema">
|
||||
<import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
|
||||
<complexType name="AcquisitionCommonData">
|
||||
<sequence>
|
||||
<element name="budgets" nillable="true" type="xsd:string" />
|
||||
<element name="campusCode" nillable="true" type="xsd:string" />
|
||||
<element name="concurrentUsersNote" nillable="true" type="xsd:string" />
|
||||
<element name="creationData" nillable="true" type="tns1:CreationData" />
|
||||
<element name="id" nillable="true" type="xsd:long" />
|
||||
<element name="instituteCode" nillable="true" type="xsd:string" />
|
||||
</sequence>
|
||||
</complexType>
|
||||
<complexType name="AcquisitionData">
|
||||
<sequence>
|
||||
<element name="ILSSubscriptionNo" nillable="true" type="xsd:string" />
|
||||
<element name="acquisitionCode" nillable="true" type="xsd:string" />
|
||||
<element name="acquisitionCommonData" nillable="true"
|
||||
type="tns2:AcquisitionCommonData" />
|
||||
<element name="acquisitionMethod" nillable="true" type="xsd:string" />
|
||||
<element name="acquisitionNumber" nillable="true" type="xsd:string" />
|
||||
<element name="acquisitionStatus" nillable="true" type="xsd:string" />
|
||||
<element name="acquisitionStatusDate" nillable="true" type="xsd:dateTime" />
|
||||
<element name="advanceNoticeDate" nillable="true" type="xsd:dateTime" />
|
||||
<element name="autoRenewal" nillable="true" type="xsd:boolean" />
|
||||
<element name="consortialAgreement" type="xsd:boolean" />
|
||||
<element name="discountOnPrice" nillable="true" type="xsd:int" />
|
||||
<element name="id" nillable="true" type="xsd:long" />
|
||||
<element name="instanceCode" nillable="true" type="xsd:string" />
|
||||
<element name="materialType" nillable="true" type="xsd:string" />
|
||||
<element name="noteForILS" nillable="true" type="xsd:string" />
|
||||
<element name="noteForVendor" nillable="true" type="xsd:string" />
|
||||
<element name="noticePeriodCode" nillable="true" type="xsd:string" />
|
||||
<element name="numberOfCopies" nillable="true" type="xsd:int" />
|
||||
<element name="orderDate" nillable="true" type="xsd:dateTime" />
|
||||
<element name="orderForm" nillable="true" type="xsd:string" />
|
||||
<element name="orderSendMethod" nillable="true" type="xsd:string" />
|
||||
<element name="pooledConcurrentUsers" nillable="true" type="xsd:int" />
|
||||
<element name="price" nillable="true" type="xsd:double" />
|
||||
<element name="pricingCap" nillable="true" type="xsd:int" />
|
||||
<element name="pricingCapFrom" nillable="true" type="xsd:dateTime" />
|
||||
<element name="pricingCapTo" nillable="true" type="xsd:dateTime" />
|
||||
<element name="pricingModel" nillable="true" type="xsd:string" />
|
||||
<element name="printCancellationNote" nillable="true" type="xsd:string" />
|
||||
<element name="printCancellationRestriction" type="xsd:boolean" />
|
||||
<element name="printPurchaseOrderNo" nillable="true" type="xsd:string" />
|
||||
<element name="purchaseOrderNo" nillable="true" type="xsd:string" />
|
||||
<element name="renewallOrCancellationDate" nillable="true" type="xsd:dateTime" />
|
||||
<element name="renewallOrCancellationDescisionNote" nillable="true"
|
||||
type="xsd:string" />
|
||||
<element name="renewallOrCancellationNoteForILS" nillable="true"
|
||||
type="xsd:string" />
|
||||
<element name="renewallOrCancellationNoteForVendor" nillable="true"
|
||||
type="xsd:string" />
|
||||
<element name="subscriptionNotification" nillable="true" type="xsd:int" />
|
||||
<element name="subscriptionPeriodCode" nillable="true" type="xsd:string" />
|
||||
<element name="subscriptionType" nillable="true" type="xsd:string" />
|
||||
<element name="subscriptionTypeNote" nillable="true" type="xsd:string" />
|
||||
<element name="vendorAdvancedNotice" nillable="true" type="xsd:int" />
|
||||
<element name="vendorAdvancedNoticeVal" nillable="true" type="xsd:string" />
|
||||
<element name="vendorCode" nillable="true" type="xsd:string" />
|
||||
<element name="vendorName" nillable="true" type="xsd:string" />
|
||||
<element name="vendorSubscriptionCode" nillable="true" type="xsd:string" />
|
||||
</sequence>
|
||||
</complexType>
|
||||
</schema>
|
||||
<schema targetNamespace="http://example.com/soap/services/ETest/impl"
|
||||
xmlns="http://www.w3.org/2001/XMLSchema">
|
||||
<import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
|
||||
<complexType name="ArrayOf_tns2_AcquisitionData">
|
||||
<complexContent>
|
||||
<restriction base="soapenc:Array">
|
||||
<attribute ref="soapenc:arrayType" wsdl:arrayType="tns2:AcquisitionData[]" />
|
||||
</restriction>
|
||||
</complexContent>
|
||||
</complexType>
|
||||
</schema>
|
||||
</wsdl:types>
|
||||
<wsdl:message name="getETestResponse">
|
||||
<wsdl:part name="getETestReturn" type="tns1:EProductInformation" />
|
||||
</wsdl:message>
|
||||
<wsdl:message name="getFixedETestResponse">
|
||||
<wsdl:part name="getFixedETestReturn" type="tns1:EProductInformation" />
|
||||
</wsdl:message>
|
||||
<wsdl:message name="getFixedETestRequest"></wsdl:message>
|
||||
<wsdl:message name="getETestRequest">
|
||||
<wsdl:part name="indexName" type="xsd:string" />
|
||||
<wsdl:part name="indexValue" type="xsd:string" />
|
||||
<wsdl:part name="withStatus" type="xsd:string" />
|
||||
</wsdl:message>
|
||||
<wsdl:portType name="ETestWeb">
|
||||
<wsdl:operation name="getETest" parameterOrder="indexName indexValue withStatus">
|
||||
<wsdl:input message="impl:getETestRequest" name="getETestRequest" />
|
||||
<wsdl:output message="impl:getETestResponse" name="getETestResponse" />
|
||||
</wsdl:operation>
|
||||
<wsdl:operation name="getFixedETest">
|
||||
<wsdl:input message="impl:getFixedETestRequest" name="getFixedETestRequest" />
|
||||
<wsdl:output message="impl:getFixedETestResponse"
|
||||
name="getFixedETestResponse" />
|
||||
</wsdl:operation>
|
||||
</wsdl:portType>
|
||||
|
||||
<wsdl:binding name="ETestSoapBinding" type="impl:ETestWeb">
|
||||
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
|
||||
<wsdl:operation name="getETest">
|
||||
<wsdlsoap:operation soapAction="" />
|
||||
<wsdl:input name="getETestRequest">
|
||||
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
|
||||
namespace="http://example.com/soap/services/ETest" use="encoded" />
|
||||
</wsdl:input>
|
||||
<wsdl:output name="getETestResponse">
|
||||
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
|
||||
namespace="http://example.com/soap/services/ETest" use="encoded" />
|
||||
</wsdl:output>
|
||||
</wsdl:operation>
|
||||
<wsdl:operation name="getFixedETest">
|
||||
<wsdlsoap:operation soapAction="" />
|
||||
<wsdl:input name="getFixedETestRequest">
|
||||
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
|
||||
namespace="http://example.com/soap/services/ETest" use="encoded" />
|
||||
</wsdl:input>
|
||||
<wsdl:output name="getFixedETestResponse">
|
||||
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
|
||||
namespace="http://example.com/soap/services/ETest" use="encoded" />
|
||||
</wsdl:output>
|
||||
</wsdl:operation>
|
||||
</wsdl:binding>
|
||||
|
||||
<wsdl:service name="ETestWebService">
|
||||
<wsdl:port binding="impl:ETestSoapBinding" name="ETest">
|
||||
<wsdlsoap:address location="http://example.com/soap/services/ETest" />
|
||||
</wsdl:port>
|
||||
</wsdl:service>
|
||||
</wsdl:definitions>
|
||||
};
|
||||
}
|
||||
@@ -1,10 +1,15 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More qw/no_plan/; # TODO: change to tests => N;
|
||||
use Data::Dumper;
|
||||
use Test::More; # TODO: change to tests => N;
|
||||
use lib '../lib';
|
||||
use XML::LibXML;
|
||||
|
||||
if (eval "require XML::LibXML") {
|
||||
plan tests => 5;
|
||||
}
|
||||
else {
|
||||
plan skip_all => "Cannot test without XML::LibXML";
|
||||
}
|
||||
|
||||
use diagnostics;
|
||||
|
||||
|
||||
+11
-10
@@ -1,10 +1,8 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use Pod::Simple::Text;
|
||||
use Test::More qw/no_plan/; # TODO: change to tests => N;
|
||||
use lib '../lib';
|
||||
use XML::SAX::ParserFactory;
|
||||
|
||||
eval {
|
||||
require Test::XML;
|
||||
@@ -31,11 +29,17 @@ ok( $soap->no_dispatch( 1 ) , "Set no_dispatch" );
|
||||
ok( $soap->explain() );
|
||||
|
||||
|
||||
my $pod = Pod::Simple::Text->new();
|
||||
my $output;
|
||||
$pod->output_string( \$output );
|
||||
$pod->parse_string_document( $soap->explain() );
|
||||
|
||||
SKIP: {
|
||||
|
||||
if (not eval "require Pod::Simple::Text") {
|
||||
skip "cannot test parsing pod without Pod::Test::Simple", 1;
|
||||
};
|
||||
|
||||
my $pod = Pod::Simple::Text->new();
|
||||
my $output;
|
||||
$pod->output_string( \$output );
|
||||
ok $pod->parse_string_document( $soap->explain() ), 'parse explain pod';
|
||||
}
|
||||
# print $output;
|
||||
|
||||
SKIP: {
|
||||
@@ -60,6 +64,3 @@ sub skip_without_test_xml {
|
||||
my $number = shift || 1;
|
||||
skip("Test::XML not available", $number) if (not $Test::XML::VERSION);
|
||||
}
|
||||
|
||||
__END__
|
||||
|
||||
|
||||
+12
-15
@@ -1,13 +1,14 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 5;
|
||||
use lib 't/lib';
|
||||
use lib '../lib';
|
||||
use lib 'lib';
|
||||
use XML::Simple;
|
||||
|
||||
use SOAP::WSDL::SAX::WSDLHandler;
|
||||
use Cwd;
|
||||
use XML::LibXML::SAX;
|
||||
|
||||
use_ok(qw/SOAP::WSDL::SAX::MessageHandler/);
|
||||
|
||||
use SOAP::WSDL;
|
||||
@@ -15,22 +16,18 @@ use SOAP::WSDL::XSD::Typelib::Builtin;
|
||||
my $path = cwd;
|
||||
$path =~s|\/t\/?$||; # allow running from t/ and above (Build test)
|
||||
|
||||
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
|
||||
|
||||
my $filter;
|
||||
ok($filter = SOAP::WSDL::SAX::MessageHandler->new( {
|
||||
my $parser;
|
||||
|
||||
ok $parser = SOAP::WSDL::Expat::MessageParser->new({
|
||||
class_resolver => FakeResolver->new(),
|
||||
} ), "Object creation");
|
||||
}), "Object creation";
|
||||
|
||||
my $parser = XML::LibXML->new();
|
||||
$parser->set_handler( $filter );
|
||||
# TODO factor out into bool test
|
||||
|
||||
$parser->parse_string( xml() );
|
||||
$parser->parse( xml() );
|
||||
|
||||
# print $filter->get_data();
|
||||
# print $filter->get_data()->get_MMessage()->_DUMP();
|
||||
|
||||
if($filter->get_data()->get_MMessage()->get_MDeliveryReportRecipientURI()) {
|
||||
if($parser->get_data()->get_MMessage()->get_MDeliveryReportRecipientURI()) {
|
||||
pass "bool context overloading";
|
||||
}
|
||||
else
|
||||
@@ -38,6 +35,8 @@ else
|
||||
fail "bool context overloading"
|
||||
}
|
||||
|
||||
# TODO factor out into different test
|
||||
|
||||
my $soap = SOAP::WSDL->new(
|
||||
readable => 1,
|
||||
wsdl => 'file:///' . $path .'/t/acceptance/wsdl/006_sax_client.wsdl',
|
||||
@@ -86,6 +85,4 @@ BEGIN {
|
||||
: warn "no class found for $name";
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
};
|
||||
|
||||
+7
-4
@@ -1,11 +1,15 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 16;
|
||||
use Test::More;
|
||||
use lib '../lib';
|
||||
use XML::SAX::ParserFactory;
|
||||
|
||||
use diagnostics;
|
||||
if (eval "require XML::LibXML") {
|
||||
plan tests => 16;
|
||||
}
|
||||
else {
|
||||
plan skip_all => "Cannot test without XML::LibXML";
|
||||
}
|
||||
|
||||
eval {
|
||||
require Test::XML;
|
||||
@@ -18,7 +22,6 @@ my $filter;
|
||||
|
||||
ok($filter = SOAP::WSDL::SAX::WSDLHandler->new(), "Object creation");
|
||||
|
||||
use XML::LibXML;
|
||||
my $parser = XML::LibXML->new();
|
||||
$parser->set_handler( $filter );
|
||||
|
||||
|
||||
+7
-4
@@ -1,11 +1,15 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 5;
|
||||
use Test::More;
|
||||
use lib '../lib';
|
||||
use XML::SAX::ParserFactory;
|
||||
|
||||
use diagnostics;
|
||||
if (eval "require XML::LibXML") {
|
||||
plan tests => 5;
|
||||
}
|
||||
else {
|
||||
plan skip_all => "Cannot test without XML::LibXML";
|
||||
}
|
||||
|
||||
eval {
|
||||
require Test::XML;
|
||||
@@ -18,7 +22,6 @@ my $filter;
|
||||
|
||||
ok($filter = SOAP::WSDL::SAX::WSDLHandler->new(), "Object creation");
|
||||
|
||||
use XML::LibXML;
|
||||
my $parser = XML::LibXML->new();
|
||||
$parser->set_handler( $filter );
|
||||
|
||||
|
||||
@@ -0,0 +1,412 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 19;
|
||||
use lib '../lib';
|
||||
use SOAP::WSDL::Expat::WSDLParser;
|
||||
use SOAP::WSDL::Expat::MessageParser;
|
||||
use File::Path;
|
||||
use File::Basename;
|
||||
|
||||
my $path = dirname __FILE__;
|
||||
|
||||
my $wsdl;
|
||||
ok( $wsdl = SOAP::WSDL::Expat::WSDLParser->new()
|
||||
->parse_string( xml() ) , "get object tree");
|
||||
|
||||
$wsdl->create({
|
||||
base_path => "$path/testlib",
|
||||
typemap_prefix => "Test::Typemap::",
|
||||
type_prefix => "Test::Type::",
|
||||
element_prefix => "Test::Element::",
|
||||
interface_prefix => "Test::Interface::",
|
||||
});
|
||||
|
||||
eval "use lib '$path/testlib'";
|
||||
|
||||
use_ok qw(Test::Element::EnqueueMessage);
|
||||
use_ok qw(Test::Type::TMessage);
|
||||
use_ok qw(Test::Typemap::MessageGateway);
|
||||
|
||||
my $data = {
|
||||
MMessage => {
|
||||
MRecipientURI => 'anyURI',
|
||||
MSenderAddress => 'a string',
|
||||
MMessageContent => 'a string',
|
||||
MSubject => 'a string',
|
||||
MDeliveryReportRecipientURI => 'anyURI',
|
||||
MKeepalive => {
|
||||
MKeepaliveTimeout => 1234567,
|
||||
MKeepaliveErrorPolicy => ' ( suppress | report ) ',
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
ok Test::Element::EnqueueMessage->new( $data ) , '(generated) object constructor';
|
||||
|
||||
my $message_parser = SOAP::WSDL::Expat::MessageParser->new({
|
||||
class_resolver => 'Test::Typemap::MessageGateway'
|
||||
});
|
||||
|
||||
eval { $message_parser->parse_string( xml_message2() ) };
|
||||
ok ( !$@, 'parse XML message');
|
||||
|
||||
|
||||
TODO: {
|
||||
local $TODO = 'support embedded atomic simpleType/complexType definitions';
|
||||
eval { $message_parser->parse_string( xml_message() ) };
|
||||
ok ( !$@, 'parse XML message using atomic type definitions');
|
||||
};
|
||||
|
||||
SKIP: {
|
||||
eval "require Test::Pod";
|
||||
skip 'Cannot test generated POD without Test::POD' , 6 if $@;
|
||||
|
||||
foreach my $module (Test::Pod::all_pod_files( "$path/testlib")) {
|
||||
Test::Pod::pod_file_ok( $module )
|
||||
}
|
||||
}
|
||||
|
||||
# cleanup
|
||||
rmtree "$path/testlib";
|
||||
|
||||
# print $wsdl->explain();
|
||||
|
||||
sub xml_message {
|
||||
return
|
||||
q{<EnqueueMessage xmlns="http://www.example.org/MessageGateway2/">
|
||||
<MMessage>
|
||||
<MRecipientURI>anyURI</MRecipientURI>
|
||||
<MSenderAddress>a string</MSenderAddress>
|
||||
<MMessageContent>a string</MMessageContent>
|
||||
<MSubject>a string</MSubject>
|
||||
<MDeliveryReportRecipientURI>anyURI</MDeliveryReportRecipientURI>
|
||||
<MKeepalive>
|
||||
<MKeepaliveTimeout>1234567</MKeepaliveTimeout>
|
||||
<MKeepaliveErrorPolicy> ( suppress | report ) </MKeepaliveErrorPolicy>
|
||||
</MKeepalive>
|
||||
</MMessage>
|
||||
</EnqueueMessage>
|
||||
};
|
||||
}
|
||||
|
||||
sub xml_message2 {
|
||||
return
|
||||
q{<EnqueueMessage xmlns="http://www.example.org/MessageGateway2/">
|
||||
<MMessage>
|
||||
<MRecipientURI>anyURI</MRecipientURI>
|
||||
<MSenderAddress>a string</MSenderAddress>
|
||||
<MMessageContent>a string</MMessageContent>
|
||||
<MSubject>a string</MSubject>
|
||||
<MDeliveryReportRecipientURI>anyURI</MDeliveryReportRecipientURI>
|
||||
</MMessage>
|
||||
</EnqueueMessage>
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
sub xml {
|
||||
return q{<?xml version="1.0" encoding="UTF-8"?>
|
||||
<wsdl:definitions name="MessageGateway"
|
||||
targetNamespace="http://www.example.org/MessageGateway2/"
|
||||
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
|
||||
xmlns:tns="http://www.example.org/MessageGateway2/"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
|
||||
<wsdl:types>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
targetNamespace="http://www.example.org/MessageGateway2/">
|
||||
|
||||
<xsd:element name="EnqueueMessage" type="tns:TEnqueueMessage"
|
||||
xmlns:tns="http://www.example.org/MessageGateway2/">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Enqueue message request element</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
|
||||
<xsd:complexType name="TMessage">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
A type containing all elements of a message to enqueue.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="MRecipientURI" type="xsd:anyURI" minOccurs="1"
|
||||
maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
|
||||
<xsd:documentation>
|
||||
The recipient in URI notaitions. Valid URI schemas are: mailto:, sms:,
|
||||
phone:. Not all URI schemas need to be implemented at the current
|
||||
implementation stage.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="MSenderAddress" type="xsd:string" minOccurs="0"
|
||||
maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
E-Mail sender address. Ignored for all but mailto: recipient URIs.
|
||||
</xsd:documentation>
|
||||
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="MMessageContent" type="xsd:string" minOccurs="1"
|
||||
maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Message Content.</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="MSubject" type="xsd:string" minOccurs="0" maxOccurs="1">
|
||||
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Message Subject. Ignored for all but mailto: URIs
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="MDeliveryReportRecipientURI" type="xsd:anyURI" minOccurs="0"
|
||||
maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
|
||||
URI to send a delivery report to. May be of one of the following schemes:
|
||||
mailto:, http:, https:. Reports to mailto: URIs are sent as plaintext,
|
||||
reports to http(s) URIs are sent as SOAP requests following the
|
||||
MessageGatewayClient service definition.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="MKeepalive" type="tns:TKeepalive" minOccurs="0"
|
||||
maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Container for keepalive information. May be missing.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
|
||||
</xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="TKeepalive">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Type containing keeplive information.</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:sequence>
|
||||
|
||||
<xsd:element name="MKeepaliveTimeout" type="xsd:double">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Keepalive timeout. The keepalive timeout spezifies how long the sending of
|
||||
a message will be delayed waiting for keepalive updates. If a keepalive
|
||||
update is received during this period, the timeout will be reset. If not,
|
||||
the message will be sent after the timeout has expired.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="MKeepaliveErrorPolicy" minOccurs="0" maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
|
||||
<xsd:documentation>
|
||||
Policy to comply to in case of system errors. Valid values are "suppress"
|
||||
and "report". If the policy is set to "suppress", keepalive messages will
|
||||
not be sent to their recipients in case of partial system failure, even if
|
||||
the keepalive has expired. This may result in "false negatives", i.e.
|
||||
messages may not be sent, even though their keepalive has expired. If the
|
||||
value is "report", keepalive messages will be sent from any cluster node.
|
||||
This may result in "false positive" alerts.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:simpleType>
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="suppress"></xsd:enumeration>
|
||||
<xsd:enumeration value="report"></xsd:enumeration>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
</xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="TMessageID">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Type containing a message ID.</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
|
||||
<xsd:sequence>
|
||||
<xsd:element name="MMessageID" type="xsd:string" minOccurs="1" maxOccurs="1"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="TKeepliveMessage">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Type containing all elements of a keppalive update / remove request.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="MMessageID" type="xsd:string" minOccurs="1" maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
The ID for the message to update / remove
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
|
||||
<xsd:element name="MAction" minOccurs="1" maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
The action to perform. Valid values are: "remove", "update". On "remove",
|
||||
the message with the ID specified will be removed from the queue, thus it
|
||||
will never be sent, even if it's timeout expires. On "update" the
|
||||
keepalive timeout of the corresponding message will be reset.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:simpleType>
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="remove"></xsd:enumeration>
|
||||
<xsd:enumeration value="update"></xsd:enumeration>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
</xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:element name="KeepaliveMessage" type="tns:TKeepaliveMessageRequest">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Keepalive message request element</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="KeepaliveMessageResponse" type="tns:TMessageID">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Response element for a keepalive request</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="EnqueueMessageResponse" type="tns:TMessageID">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Enqueue message response element</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
|
||||
|
||||
<xsd:complexType name="TEnqueueMessage">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
A complex type containing one element: The message to enqueue.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="MMessage" type="tns:TMessage">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Element containing a message to enqueue.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
|
||||
</xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
|
||||
<xsd:complexType name="TKeepaliveMessageRequest">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
A complex type containing one element: The keepalive message to process.
|
||||
</xsd:documentation>
|
||||
|
||||
</xsd:annotation>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="MKeepaliveMessage" type="tns:TKeepliveMessage">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Element containing a keepalive message to process.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:schema>
|
||||
</wsdl:types>
|
||||
<wsdl:message name="EnqueueMessageRequest">
|
||||
<wsdl:part name="parameters" element="tns:EnqueueMessage">
|
||||
<wsdl:documentation>inputparameters for EnqueueMessag</wsdl:documentation>
|
||||
</wsdl:part>
|
||||
|
||||
</wsdl:message>
|
||||
<wsdl:message name="EnqueueMessageResponse">
|
||||
<wsdl:part name="parameters" element="tns:EnqueueMessageResponse">
|
||||
<wsdl:documentation>outputparameters for EnqueueMessag</wsdl:documentation>
|
||||
</wsdl:part>
|
||||
</wsdl:message>
|
||||
<wsdl:message name="KeepaliveMessageRequest">
|
||||
<wsdl:part name="parameters" element="tns:KeepaliveMessage">
|
||||
|
||||
<wsdl:documentation>input parameters for KeepaliveMessag</wsdl:documentation>
|
||||
</wsdl:part>
|
||||
</wsdl:message>
|
||||
<wsdl:message name="KeepaliveMessageResponse">
|
||||
<wsdl:part name="parameters" element="tns:KeepaliveMessageResponse">
|
||||
<wsdl:documentation>output parameters for KeepaliveMessag</wsdl:documentation>
|
||||
</wsdl:part>
|
||||
</wsdl:message>
|
||||
|
||||
<wsdl:portType name="MGWPortType">
|
||||
<wsdl:documentation>
|
||||
generic port type for all methods required for sending messages over the mosaic
|
||||
message gatewa
|
||||
</wsdl:documentation>
|
||||
<wsdl:operation name="EnqueueMessage">
|
||||
<wsdl:documentation>
|
||||
This method is used to enqueue a normal (immediate send) or a delayed message with
|
||||
keepalive functionality.
|
||||
</wsdl:documentation>
|
||||
<wsdl:input message="tns:EnqueueMessageRequest"></wsdl:input>
|
||||
<wsdl:output message="tns:EnqueueMessageResponse"></wsdl:output>
|
||||
|
||||
</wsdl:operation>
|
||||
<wsdl:operation name="KeepaliveMessage">
|
||||
<wsdl:documentation>
|
||||
This method is used to update or remove a
|
||||
keepalive message.
|
||||
</wsdl:documentation>
|
||||
<wsdl:input message="tns:KeepaliveMessageRequest"></wsdl:input>
|
||||
<wsdl:output message="tns:KeepaliveMessageResponse"></wsdl:output>
|
||||
</wsdl:operation>
|
||||
</wsdl:portType>
|
||||
|
||||
<wsdl:binding name="MGWBinding" type="tns:MGWPortType">
|
||||
<wsdl:documentation>Generic binding for all (SOAP) port</wsdl:documentation>
|
||||
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
|
||||
<wsdl:operation name="EnqueueMessage">
|
||||
<soap:operation soapAction="http://www.example.org/MessageGateway2/EnqueueMessage" />
|
||||
<wsdl:input>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:input>
|
||||
<wsdl:output>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:output>
|
||||
</wsdl:operation>
|
||||
<wsdl:operation name="KeepaliveMessage">
|
||||
<soap:operation
|
||||
soapAction="http://www.example.org/MessageGateway2/KeepaliveMessage" />
|
||||
<wsdl:input>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:input>
|
||||
|
||||
<wsdl:output>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:output>
|
||||
</wsdl:operation>
|
||||
</wsdl:binding>
|
||||
<wsdl:service name="MessageGateway">
|
||||
<wsdl:documentation>
|
||||
Web Service for sending messages over the message gatewa
|
||||
</wsdl:documentation>
|
||||
|
||||
<wsdl:port name="HTTPPort" binding="tns:MGWBinding">
|
||||
<wsdl:documentation>HTTP(S) port for the message gateway</wsdl:documentation>
|
||||
<soap:address location="https://www.example.org/MessageGateway/" />
|
||||
</wsdl:port>
|
||||
</wsdl:service>
|
||||
</wsdl:definitions>};
|
||||
}
|
||||
@@ -1,13 +1,19 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 18;
|
||||
use Test::More;
|
||||
use lib '../lib';
|
||||
use XML::LibXML;
|
||||
use SOAP::WSDL::SAX::WSDLHandler;
|
||||
use SOAP::WSDL::SAX::MessageHandler;
|
||||
use File::Path;
|
||||
use File::Basename;
|
||||
|
||||
if (eval "require XML::LibXML") {
|
||||
plan tests => 18;
|
||||
}
|
||||
else {
|
||||
plan skip_all => "Cannot test without XML::LibXML";
|
||||
}
|
||||
|
||||
my $path = dirname __FILE__;
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 12;
|
||||
use lib '../lib';
|
||||
use SOAP::WSDL::Expat::WSDLParser;
|
||||
use File::Find;
|
||||
use File::Basename;
|
||||
|
||||
my $path = dirname __FILE__;
|
||||
my $wsdl;
|
||||
|
||||
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
|
||||
ok( $wsdl = $parser->parse_file( "$path/../example/wsdl/globalweather.xml" ) );
|
||||
|
||||
$wsdl->create({
|
||||
base_path => "$path/testlib",
|
||||
typemap_prefix => "Test::Typemap::",
|
||||
type_prefix => "Test::Type::",
|
||||
element_prefix => "Test::Element::",
|
||||
interface_prefix => "Test::Interface::",
|
||||
});
|
||||
|
||||
# Check for created files (and dirs) - value is the number of entries
|
||||
# with this (local) name
|
||||
my %expected = (
|
||||
'GetCitiesByCountry.pm' => 1,
|
||||
'GetCitiesByCountryResponse.pm' => 1,
|
||||
'GetWeather.pm' => 1,
|
||||
'GetWeatherResponse.pm' => 1,
|
||||
'string.pm' => 1,
|
||||
'Element' => 1,
|
||||
'Interface' => 1,
|
||||
'GlobalWeather.pm' => 2,
|
||||
'Typemap' => 1,
|
||||
'Test' => 1,
|
||||
);
|
||||
|
||||
File::Find::finddepth(
|
||||
sub {
|
||||
return if $_ eq '.';
|
||||
ok $expected{ $_ }--, $_;
|
||||
unlink $_ if -f $_;
|
||||
rmdir $_ if -d $_;
|
||||
},
|
||||
"$path/testlib",
|
||||
);
|
||||
|
||||
rmdir "$path/testlib";
|
||||
@@ -1,13 +1,19 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 1;
|
||||
use Test::More;
|
||||
use lib '../lib';
|
||||
use XML::LibXML;
|
||||
use SOAP::WSDL::SAX::WSDLHandler;
|
||||
use SOAP::WSDL::SAX::MessageHandler;
|
||||
use File::Path;
|
||||
use File::Basename;
|
||||
|
||||
if (eval "require XML::LibXML") {
|
||||
plan tests => 1;
|
||||
}
|
||||
else {
|
||||
plan skip_all => "Cannot test without XML::LibXML";
|
||||
}
|
||||
|
||||
my $path = dirname __FILE__;
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 10;
|
||||
use File::Path;
|
||||
use File::Basename;
|
||||
use lib '../lib';
|
||||
|
||||
use_ok(qw/SOAP::WSDL::Expat::WSDLParser/);
|
||||
|
||||
my $path = dirname __FILE__;
|
||||
|
||||
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
|
||||
|
||||
eval { $parser->parsefile( "$path/acceptance/wsdl/03_complexType-element-ref.wsdl" ) };
|
||||
if ($@)
|
||||
{
|
||||
fail("parsing WSDL");
|
||||
die "Can't test without parsed WSDL: $@";
|
||||
}
|
||||
else
|
||||
{
|
||||
pass("parsing XML");
|
||||
}
|
||||
|
||||
my $definitions = $parser->get_data();
|
||||
|
||||
|
||||
my $type = $definitions->first_types()->find_type('urn:Test', 'testComplexTypeRef');
|
||||
my $element = $definitions->first_types()->find_element('urn:Test', 'TestElement');
|
||||
|
||||
my $output = '';
|
||||
ok $element->to_class({ wsdl => $definitions, prefix => 'Test::', output => \$output })
|
||||
, 'generate element code';
|
||||
ok eval $output, 'eval generated code';
|
||||
|
||||
$output = '';
|
||||
ok $type->to_class({ wsdl => $definitions, prefix => 'Test::', output => \$output })
|
||||
, 'generate complexType code with element ref=""';
|
||||
ok eval $output, 'eval generated code';
|
||||
|
||||
my $obj = Test::testComplexTypeRef->new({
|
||||
TestRef => 'test_ref',
|
||||
Test2 => 'test2',
|
||||
});
|
||||
|
||||
is $obj, '<TestRef >test_ref</TestRef><Test2 >test2</Test2 >', 'serialization';
|
||||
|
||||
$element = $definitions->first_types()->find_element('urn:Test', 'TestRef');
|
||||
|
||||
$output = '';
|
||||
|
||||
ok $element->to_class({ wsdl => $definitions, prefix => 'Test::', output => \$output })
|
||||
, 'generate top level element ref code';
|
||||
ok eval $output, 'eval generated code' . $@;
|
||||
|
||||
$obj = Test::TestRef->new({ value => 'test_ref' });
|
||||
is $obj, '<TestRef xmlns="urn:Test" >test_ref</TestRef>', 'serialization';
|
||||
@@ -0,0 +1,76 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More;
|
||||
use File::Path;
|
||||
use File::Basename;
|
||||
use lib '../lib';
|
||||
|
||||
if (eval "require XML::LibXML") {
|
||||
plan tests => 11;
|
||||
}
|
||||
else {
|
||||
plan skip_all => "Cannot test without XML::LibXML";
|
||||
}
|
||||
|
||||
my $path = dirname __FILE__;
|
||||
|
||||
|
||||
use_ok(qw/SOAP::WSDL::SAX::WSDLHandler/);
|
||||
|
||||
my $filter;
|
||||
my $parser = XML::LibXML->new();
|
||||
ok($filter = SOAP::WSDL::SAX::WSDLHandler->new(), "Object creation");
|
||||
$parser->set_handler( $filter );
|
||||
|
||||
eval { $parser->parse_file( "$path/acceptance/wsdl/03_complexType-element-ref.wsdl" ) };
|
||||
if ($@)
|
||||
{
|
||||
fail("parsing WSDL");
|
||||
die "Can't test without parsed WSDL: $@";
|
||||
}
|
||||
else
|
||||
{
|
||||
pass("parsing XML");
|
||||
}
|
||||
|
||||
my $definitions = $filter->get_data();
|
||||
my $type = $definitions->first_types()->find_type('urn:Test', 'testComplexTypeRef');
|
||||
|
||||
my $element = $definitions->first_types()->find_element('urn:Test', 'TestElement');
|
||||
|
||||
my $output;
|
||||
|
||||
ok $element->to_class({ wsdl => $definitions, prefix => 'Test::', output => \$output })
|
||||
, 'generate element code';
|
||||
|
||||
ok eval $output, 'eval generated code';
|
||||
|
||||
$output = '';
|
||||
|
||||
ok $type->to_class({ wsdl => $definitions, prefix => 'Test::', output => \$output })
|
||||
, 'generate complexType code with element ref=""';
|
||||
|
||||
ok eval $output, 'eval generated code';
|
||||
|
||||
my $obj = Test::testComplexTypeRef->new({
|
||||
TestRef => 'test_ref',
|
||||
Test2 => 'test2',
|
||||
});
|
||||
|
||||
is $obj, '<TestRef >test_ref</TestRef><Test2 >test2</Test2 >', 'serialization';
|
||||
|
||||
$element = $definitions->first_types()->find_element('urn:Test', 'TestRef');
|
||||
|
||||
$output = '';
|
||||
|
||||
ok $element->to_class({ wsdl => $definitions, prefix => 'Test::', output => \$output })
|
||||
, 'generate top level element ref code';
|
||||
|
||||
ok eval $output, 'eval generated code' . $@;
|
||||
|
||||
# print $output;
|
||||
|
||||
$obj = Test::TestRef->new({ value => 'test_ref' });
|
||||
|
||||
is $obj, '<TestRef xmlns="urn:Test" >test_ref</TestRef>', 'serialization';
|
||||
@@ -5,7 +5,6 @@ use Test::More tests => 2;
|
||||
use lib '../lib';
|
||||
use lib 'lib';
|
||||
use lib 't/lib';
|
||||
use XML::LibXML;
|
||||
use SOAP::WSDL::SAX::MessageHandler;
|
||||
|
||||
use_ok(qw/SOAP::WSDL::Expat::MessageParser/);
|
||||
@@ -13,7 +12,6 @@ use_ok(qw/SOAP::WSDL::Expat::MessageParser/);
|
||||
use MyComplexType;
|
||||
use MyElement;
|
||||
use MySimpleType;
|
||||
use Benchmark;
|
||||
|
||||
my $xml = q{<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
|
||||
@@ -26,13 +24,6 @@ my $parser = SOAP::WSDL::Expat::MessageParser->new({
|
||||
class_resolver => 'FakeResolver'
|
||||
});
|
||||
|
||||
my $libxml = XML::LibXML->new();
|
||||
my $handler = SOAP::WSDL::SAX::MessageHandler->new({
|
||||
class_resolver => 'FakeResolver',
|
||||
});
|
||||
$libxml->set_handler( $handler );
|
||||
|
||||
|
||||
$parser->parse( $xml );
|
||||
|
||||
is $parser->get_data(), q{<MyAtomicComplexTypeElement xmlns="urn:Test" >}
|
||||
|
||||
@@ -0,0 +1,335 @@
|
||||
package TopElement;
|
||||
use Class::Std::Storable;
|
||||
use SOAP::WSDL::XSD::Typelib::Element;
|
||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
||||
use Memoize;
|
||||
|
||||
memoize('_get_handlers');
|
||||
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
);
|
||||
{
|
||||
my %TestElement_of :ATTR();
|
||||
my $CLASS_OF_REF = { TestElement => 'TestElement' };
|
||||
|
||||
__PACKAGE__->_factory( [ 'TestElement' ],
|
||||
{ 'TestElement' => \%TestElement_of, },
|
||||
{ TestElement => 'TestElement' },
|
||||
);
|
||||
|
||||
sub get_xmlns { 'urn:Test' };
|
||||
__PACKAGE__->__set_name('TopElement');
|
||||
__PACKAGE__->__set_nillable(1);
|
||||
|
||||
sub _get_handlers {
|
||||
my $self = shift;
|
||||
my $parser = shift;
|
||||
|
||||
return {
|
||||
Start => $parser->start_tag({
|
||||
class_of => $CLASS_OF_REF,
|
||||
handler_of => {
|
||||
TestElement => TestElement->_get_handlers( $parser ),
|
||||
}
|
||||
}),
|
||||
End => $parser->end_top_tag( ),
|
||||
Char => undef,
|
||||
};
|
||||
}
|
||||
}
|
||||
1;
|
||||
|
||||
package TestElement;
|
||||
use Class::Std::Storable;
|
||||
use SOAP::WSDL::XSD::Typelib::Element;
|
||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
||||
|
||||
use Memoize;
|
||||
memoize('_get_handlers');
|
||||
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
);
|
||||
|
||||
{
|
||||
my %test_of :ATTR();
|
||||
my %test2_of :ATTR();
|
||||
|
||||
my $CLASS_OF_REF = {
|
||||
test => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
test2 => 'SOAP::WSDL::XSD::Typelib::Builtin::string'
|
||||
};
|
||||
|
||||
__PACKAGE__->_factory( [ 'test', 'test2' ],
|
||||
{ test => \%test_of, test2 => \%test2_of, },
|
||||
$CLASS_OF_REF,
|
||||
);
|
||||
|
||||
sub get_xmlns { 'urn:Test' };
|
||||
__PACKAGE__->__set_name('TestElement');
|
||||
__PACKAGE__->__set_nillable(1);
|
||||
|
||||
sub _get_handlers {
|
||||
my $self = shift;
|
||||
my $parser = shift;
|
||||
|
||||
return {
|
||||
Start => $parser->start_tag({
|
||||
class_of => $CLASS_OF_REF,
|
||||
handler_of =>
|
||||
{
|
||||
map { ( $_ => $CLASS_OF_REF->{$_}->_get_handlers( $parser ) )}
|
||||
keys %{ $CLASS_OF_REF }
|
||||
},
|
||||
}),
|
||||
End => $parser->end_tag(),
|
||||
Char => undef,
|
||||
};
|
||||
}
|
||||
}
|
||||
1;
|
||||
|
||||
package TestResolver;
|
||||
|
||||
sub get_class {
|
||||
my $path = join('/', @{ $_[1] });
|
||||
my $class = {
|
||||
'TestElement' => 'TestElement',
|
||||
'TestElement/test' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
'TestElement/test2' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
'TopElement' => 'TopElement',
|
||||
'TopElement/TestElement' => 'TestElement',
|
||||
'TopElement/TestElement/test' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
'TopElement/TestElement/test2' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
};
|
||||
return $class->{ $path };
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
package main;
|
||||
|
||||
use Test::More qw/no_plan/; # TODO: change to tests => N;
|
||||
use strict;
|
||||
use warnings;
|
||||
use lib '../../lib';
|
||||
|
||||
use_ok('SOAP::WSDL::Expat::MessageParser');
|
||||
use_ok('SOAP::WSDL::Expat::MessageSubParser');
|
||||
my $obj;
|
||||
|
||||
ok($obj = SOAP::WSDL::Expat::MessageSubParser->new(), "Object creation");
|
||||
|
||||
#my $test = $obj->start_tag({
|
||||
# order => [],
|
||||
# class_of => {
|
||||
# test => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
# test2 => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
# },
|
||||
# handler_of => {
|
||||
# test => {
|
||||
# Char => $obj->characters(),
|
||||
# },
|
||||
# test2 => {
|
||||
# Char => $obj->characters(),
|
||||
# },
|
||||
# }
|
||||
#});
|
||||
#
|
||||
#my $handlers = {
|
||||
# Start => $test,
|
||||
# End => $obj->end_tag(),
|
||||
#};
|
||||
#
|
||||
#my $parser = $obj->initialize( $handlers );
|
||||
#
|
||||
#$parser->parsestring('<test>Test</test>');
|
||||
#is $obj->get_data(), 'Test', 'Parse simple XML';
|
||||
#
|
||||
#my $element = $obj->start_tag({
|
||||
# order => [],
|
||||
# class_of => {
|
||||
# TestElement => 'TestElement',
|
||||
# },
|
||||
# handler_of => {
|
||||
# TestElement => {
|
||||
# Start => $obj->start_tag({
|
||||
# order => [],
|
||||
# class_of => {
|
||||
# test => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
# test2 => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
# },
|
||||
# handler_of => {
|
||||
# test => {
|
||||
# Char => $obj->characters(),
|
||||
# },
|
||||
# test2 => {
|
||||
# Char => $obj->characters(),
|
||||
# },
|
||||
# }
|
||||
# }),
|
||||
# End => $obj->end_tag(),
|
||||
# Char => undef,
|
||||
# }
|
||||
# }
|
||||
#});
|
||||
#
|
||||
#
|
||||
#$handlers = {
|
||||
# Start => $element,
|
||||
# End => $obj->end_tag(),
|
||||
# Char => undef,
|
||||
#};
|
||||
#
|
||||
#$parser = $obj->initialize( TestElement->_get_parser( $obj ) );
|
||||
#
|
||||
#my $xml = '<TestElement xmlns="urn:Test">
|
||||
# <test>Test</test>
|
||||
# <test2>Test2</test2>
|
||||
#</TestElement>';
|
||||
#
|
||||
#$parser->parsestring($xml);
|
||||
#
|
||||
#is $obj->get_data()
|
||||
# , '<TestElement xmlns="urn:Test" ><test >Test</test ><test2 >Test2</test2 ></TestElement>'
|
||||
# , 'Parse && serialize ComplexType Element';
|
||||
#
|
||||
|
||||
#my $mp = SOAP::WSDL::Expat::MessageParser->new({
|
||||
# class_resolver => 'TestResolver',
|
||||
#});
|
||||
#
|
||||
#$mp->parse( $xml );
|
||||
|
||||
#use Benchmark;
|
||||
#
|
||||
#timethese 1000 , {
|
||||
# mp => sub { $mp->parse($xml) },
|
||||
# 'sub_p' => sub { $obj->initialize( $handlers )->parse( $xml ) },
|
||||
#
|
||||
#};
|
||||
|
||||
#my $top = $obj->start_tag({
|
||||
# order => [],
|
||||
# class_of => {
|
||||
# TopElement => 'TopElement',
|
||||
# },
|
||||
# handler_of => {
|
||||
# TopElement => {
|
||||
# Start => $obj->start_tag({
|
||||
# order => [ 'TestElement', ],
|
||||
# class_of => {
|
||||
# TestElement => 'TestElement',
|
||||
# },
|
||||
# handler_of => {
|
||||
# TestElement => {
|
||||
# Start => $obj->start_tag({
|
||||
# order => ['test', 'test2'],
|
||||
# class_of => {
|
||||
# test => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
# test2 => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
# },
|
||||
# handler_of => {
|
||||
# test => {
|
||||
# Char => $obj->characters(),
|
||||
# },
|
||||
# test2 => {
|
||||
# Char => $obj->characters(),
|
||||
# },
|
||||
# },
|
||||
# occurs_of => {
|
||||
# test => { max => 1 },
|
||||
# }
|
||||
# }),
|
||||
# End => $obj->end_tag(),
|
||||
# Char => undef,
|
||||
# }
|
||||
# }
|
||||
# })
|
||||
# }
|
||||
# }
|
||||
#});
|
||||
|
||||
my $top = $obj->start_tag({
|
||||
class_of => {
|
||||
TopElement => 'TopElement',
|
||||
},
|
||||
handler_of => {
|
||||
TopElement => TopElement->_get_handlers( $obj ),
|
||||
}
|
||||
});
|
||||
|
||||
my $parser = $obj->initialize( { Start => $top , End => $obj->end_tag() , Char => undef } );
|
||||
|
||||
my $xml = '
|
||||
<TopElement xmlns="urn:Test">
|
||||
<TestElement>
|
||||
<test>Test</test>
|
||||
<test2>Test2</test2>
|
||||
</TestElement>
|
||||
<TestElement>
|
||||
<test>Test</test>
|
||||
<test2>Test2</test2>
|
||||
</TestElement>
|
||||
<TestElement>
|
||||
<test>Test</test>
|
||||
<test2>Test2</test2>
|
||||
</TestElement>
|
||||
<TestElement>
|
||||
<test>Test</test>
|
||||
<test2>Test2</test2>
|
||||
</TestElement>
|
||||
<TestElement>
|
||||
<test>Test</test>
|
||||
<test2>Test2</test2>
|
||||
</TestElement>
|
||||
<TestElement>
|
||||
<test>Test</test>
|
||||
<test2>Test2</test2>
|
||||
</TestElement>
|
||||
</TopElement>';
|
||||
|
||||
$parser->parsestring($xml);
|
||||
|
||||
# print $obj->get_data();
|
||||
|
||||
__END__
|
||||
|
||||
# TODO factor out into benchmark suite
|
||||
|
||||
use XML::Simple;
|
||||
use Benchmark;
|
||||
|
||||
my $mp = SOAP::WSDL::Expat::MessageParser->new({
|
||||
class_resolver => 'TestResolver',
|
||||
});
|
||||
$mp->parse( $xml );
|
||||
|
||||
$top = $obj->start_tag({
|
||||
class_of => {
|
||||
TopElement => 'TopElement',
|
||||
},
|
||||
handler_of => {
|
||||
TopElement => TopElement->_get_handlers( $obj ),
|
||||
}
|
||||
});
|
||||
my $top_end = $obj->end_top_tag();
|
||||
$parser = $obj->initialize( { Start => $top , End => $top_end, , Char => undef } );
|
||||
$parser->parse( $xml ),
|
||||
|
||||
print "DATA:" . $obj->get_data(), "\n";
|
||||
|
||||
|
||||
# $XML::Simple::PREFERRED_PARSER = 'XML::SAX::Expat';
|
||||
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
|
||||
|
||||
timethese 500 , {
|
||||
'typemap' => sub { $mp->parse($xml) },
|
||||
'sub_tree' => sub {
|
||||
my $parser = $obj->initialize( { Start => $top , End => $top_end, , Char => undef } );
|
||||
$parser->parse( $xml ),
|
||||
},
|
||||
'XML::Simple' => sub { XMLin( $xml ); }
|
||||
};
|
||||
@@ -0,0 +1,411 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use diagnostics;
|
||||
use Test::More tests => 7;
|
||||
use Data::Dumper;
|
||||
use lib '../lib';
|
||||
|
||||
eval {
|
||||
require Test::XML;
|
||||
import Test::XML;
|
||||
};
|
||||
|
||||
use_ok(qw/SOAP::WSDL::Expat::WSDLParser/);
|
||||
|
||||
my $parser;
|
||||
ok $parser = SOAP::WSDL::Expat::WSDLParser->new(), "Object creation";
|
||||
|
||||
$parser->parse( xml() );
|
||||
|
||||
eval { $parser->parse( xml() ) };
|
||||
if ($@)
|
||||
{
|
||||
fail("parsing WSDL");
|
||||
die "Can't test without parsed WSDL: " , Dumper $@;
|
||||
}
|
||||
else
|
||||
{
|
||||
pass("parsing XML");
|
||||
}
|
||||
|
||||
my $wsdl;
|
||||
ok $wsdl = $parser->get_data() , "get object tree";
|
||||
|
||||
my $schema = $wsdl->first_types()->get_schema()->[1] || die "No schema !";
|
||||
|
||||
my $element = $schema->find_element(
|
||||
'http://www.example.org/MessageGateway2/'
|
||||
, 'EnqueueMessage'
|
||||
);
|
||||
|
||||
ok $element, 'find element';
|
||||
is $element->get_xmlns()->{ 'http://www.example.org/MessageGateway2/' }, 'tns', 'Namespace definition';
|
||||
|
||||
|
||||
my $opt = {
|
||||
typelib => $wsdl->first_types,
|
||||
readable => 1,
|
||||
autotype => 0,
|
||||
namespace => { 'http://www.example.org/MessageGateway2/' => 'tns',
|
||||
'http://www.w3.org/2001/XMLSchema' => 'xsd',
|
||||
'http://schemas.xmlsoap.org/wsdl/' => 'wsdl',
|
||||
},
|
||||
indent => "",
|
||||
};
|
||||
|
||||
my $data = { EnqueueMessage => {
|
||||
MMessage => {
|
||||
MRecipientURI => 'anyURI',
|
||||
MSenderAddress => 'a string',
|
||||
MMessageContent => 'a string',
|
||||
MSubject => 'a string',
|
||||
MDeliveryReportRecipientURI => 'anyURI',
|
||||
MKeepalive => {
|
||||
MKeepaliveTimeout => 1234567,
|
||||
MKeepaliveErrorPolicy => ' ( suppress | report ) ',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
SKIP: { skip_without_test_xml();
|
||||
is_xml( $wsdl->find_message(
|
||||
"http://www.example.org/MessageGateway2/" ,'EnqueueMessageRequest'
|
||||
)->first_part()->serialize( 'test', $data, $opt ),
|
||||
xml_message()
|
||||
, "Serialized message part"
|
||||
);
|
||||
}
|
||||
|
||||
sub skip_without_test_xml {
|
||||
skip("Test::XML not available", 1) if (not $Test::XML::VERSION);
|
||||
}
|
||||
|
||||
sub xml_message {
|
||||
return
|
||||
q{<EnqueueMessage xmlns="http://www.example.org/MessageGateway2/">
|
||||
<MMessage>
|
||||
<MRecipientURI>anyURI</MRecipientURI>
|
||||
<MSenderAddress>a string</MSenderAddress>
|
||||
<MMessageContent>a string</MMessageContent>
|
||||
<MSubject>a string</MSubject>
|
||||
<MDeliveryReportRecipientURI>anyURI</MDeliveryReportRecipientURI>
|
||||
<MKeepalive>
|
||||
<MKeepaliveTimeout>1234567</MKeepaliveTimeout>
|
||||
<MKeepaliveErrorPolicy> ( suppress | report ) </MKeepaliveErrorPolicy>
|
||||
</MKeepalive>
|
||||
</MMessage>
|
||||
</EnqueueMessage>
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
sub xml {
|
||||
return q{<?xml version="1.0" encoding="UTF-8"?>
|
||||
<wsdl:definitions name="MessageGateway"
|
||||
targetNamespace="http://www.example.org/MessageGateway2/"
|
||||
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
|
||||
xmlns:tns="http://www.example.org/MessageGateway2/"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
|
||||
<wsdl:types>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
targetNamespace="http://www.example.org/MessageGateway2/">
|
||||
|
||||
<xsd:element name="EnqueueMessage" type="tns:TEnqueueMessage"
|
||||
xmlns:tns="http://www.example.org/MessageGateway2/"
|
||||
>
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Enqueue message request element</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
|
||||
<xsd:complexType name="TMessage">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
A type containing all elements of a message to enqueue.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="MRecipientURI" type="xsd:anyURI" minOccurs="1"
|
||||
maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
|
||||
<xsd:documentation>
|
||||
The recipient in URI notaitions. Valid URI schemas are: mailto:, sms:,
|
||||
phone:. Not all URI schemas need to be implemented at the current
|
||||
implementation stage.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="MSenderAddress" type="xsd:string" minOccurs="0"
|
||||
maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
E-Mail sender address. Ignored for all but mailto: recipient URIs.
|
||||
</xsd:documentation>
|
||||
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="MMessageContent" type="xsd:string" minOccurs="1"
|
||||
maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Message Content.</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="MSubject" type="xsd:string" minOccurs="0" maxOccurs="1">
|
||||
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Message Subject. Ignored for all but mailto: URIs
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="MDeliveryReportRecipientURI" type="xsd:anyURI" minOccurs="0"
|
||||
maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
|
||||
URI to send a delivery report to. May be of one of the following schemes:
|
||||
mailto:, http:, https:. Reports to mailto: URIs are sent as plaintext,
|
||||
reports to http(s) URIs are sent as SOAP requests following the
|
||||
MessageGatewayClient service definition.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="MKeepalive" type="tns:TKeepalive" minOccurs="0"
|
||||
maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Container for keepalive information. May be missing.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
|
||||
</xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="TKeepalive">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Type containing keeplive information.</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:sequence>
|
||||
|
||||
<xsd:element name="MKeepaliveTimeout" type="xsd:double">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Keepalive timeout. The keepalive timeout spezifies how long the sending of
|
||||
a message will be delayed waiting for keepalive updates. If a keepalive
|
||||
update is received during this period, the timeout will be reset. If not,
|
||||
the message will be sent after the timeout has expired.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="MKeepaliveErrorPolicy" minOccurs="0" maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
|
||||
<xsd:documentation>
|
||||
Policy to comply to in case of system errors. Valid values are "suppress"
|
||||
and "report". If the policy is set to "suppress", keepalive messages will
|
||||
not be sent to their recipients in case of partial system failure, even if
|
||||
the keepalive has expired. This may result in "false negatives", i.e.
|
||||
messages may not be sent, even though their keepalive has expired. If the
|
||||
value is "report", keepalive messages will be sent from any cluster node.
|
||||
This may result in "false positive" alerts.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:simpleType>
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="suppress"></xsd:enumeration>
|
||||
<xsd:enumeration value="report"></xsd:enumeration>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
</xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="TMessageID">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Type containing a message ID.</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
|
||||
<xsd:sequence>
|
||||
<xsd:element name="MMessageID" type="xsd:string" minOccurs="1" maxOccurs="1"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="TKeepliveMessage">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Type containing all elements of a keppalive update / remove request.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="MMessageID" type="xsd:string" minOccurs="1" maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
The ID for the message to update / remove
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
|
||||
<xsd:element name="MAction" minOccurs="1" maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
The action to perform. Valid values are: "remove", "update". On "remove",
|
||||
the message with the ID specified will be removed from the queue, thus it
|
||||
will never be sent, even if it's timeout expires. On "update" the
|
||||
keepalive timeout of the corresponding message will be reset.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:simpleType>
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="remove"></xsd:enumeration>
|
||||
<xsd:enumeration value="update"></xsd:enumeration>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
</xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:element name="KeepaliveMessage" type="tns:TKeepaliveMessageRequest">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Keepalive message request element</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="KeepaliveMessageResponse" type="tns:TMessageID">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Response element for a keepalive request</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="EnqueueMessageResponse" type="tns:TMessageID">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Enqueue message response element</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
|
||||
|
||||
<xsd:complexType name="TEnqueueMessage">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
A complex type containing one element: The message to enqueue.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="MMessage" type="tns:TMessage">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Element containing a message to enqueue.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
|
||||
</xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
|
||||
<xsd:complexType name="TKeepaliveMessageRequest">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
A complex type containing one element: The keepalive message to process.
|
||||
</xsd:documentation>
|
||||
|
||||
</xsd:annotation>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="MKeepaliveMessage" type="tns:TKeepliveMessage">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Element containing a keepalive message to process.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:schema>
|
||||
</wsdl:types>
|
||||
<wsdl:message name="EnqueueMessageRequest">
|
||||
<wsdl:part name="parameters" element="tns:EnqueueMessage">
|
||||
<wsdl:documentation>inputparameters for EnqueueMessag</wsdl:documentation>
|
||||
</wsdl:part>
|
||||
|
||||
</wsdl:message>
|
||||
<wsdl:message name="EnqueueMessageResponse">
|
||||
<wsdl:part name="parameters" element="tns:EnqueueMessageResponse">
|
||||
<wsdl:documentation>outputparameters for EnqueueMessag</wsdl:documentation>
|
||||
</wsdl:part>
|
||||
</wsdl:message>
|
||||
<wsdl:message name="KeepaliveMessageRequest">
|
||||
<wsdl:part name="parameters" element="tns:KeepaliveMessage">
|
||||
|
||||
<wsdl:documentation>input parameters for KeepaliveMessag</wsdl:documentation>
|
||||
</wsdl:part>
|
||||
</wsdl:message>
|
||||
<wsdl:message name="KeepaliveMessageResponse">
|
||||
<wsdl:part name="parameters" element="tns:KeepaliveMessageResponse">
|
||||
<wsdl:documentation>output parameters for KeepaliveMessag</wsdl:documentation>
|
||||
</wsdl:part>
|
||||
</wsdl:message>
|
||||
|
||||
<wsdl:portType name="MGWPortType">
|
||||
<wsdl:documentation>
|
||||
generic port type for all methods required for sending messages over the mosaic
|
||||
message gatewa
|
||||
</wsdl:documentation>
|
||||
<wsdl:operation name="EnqueueMessage">
|
||||
<wsdl:documentation>
|
||||
This method is used to enqueue a normal (immediate send) or a delayed message with
|
||||
keepalive functionality.
|
||||
</wsdl:documentation>
|
||||
<wsdl:input message="tns:EnqueueMessageRequest"></wsdl:input>
|
||||
<wsdl:output message="tns:EnqueueMessageResponse"></wsdl:output>
|
||||
|
||||
</wsdl:operation>
|
||||
<wsdl:operation name="KeepaliveMessage">
|
||||
<wsdl:documentation>
|
||||
This method is used to update or remove a
|
||||
keepalive message.
|
||||
</wsdl:documentation>
|
||||
<wsdl:input message="tns:KeepaliveMessageRequest"></wsdl:input>
|
||||
<wsdl:output message="tns:KeepaliveMessageResponse"></wsdl:output>
|
||||
</wsdl:operation>
|
||||
</wsdl:portType>
|
||||
|
||||
<wsdl:binding name="MGWBinding" type="tns:MGWPortType">
|
||||
<wsdl:documentation>Generic binding for all (SOAP) port</wsdl:documentation>
|
||||
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
|
||||
<wsdl:operation name="EnqueueMessage">
|
||||
<soap:operation soapAction="http://www.example.org/MessageGateway2/EnqueueMessage" />
|
||||
<wsdl:input>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:input>
|
||||
<wsdl:output>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:output>
|
||||
</wsdl:operation>
|
||||
<wsdl:operation name="KeepaliveMessage">
|
||||
<soap:operation
|
||||
soapAction="http://www.example.org/MessageGateway2/KeepaliveMessage" />
|
||||
<wsdl:input>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:input>
|
||||
|
||||
<wsdl:output>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:output>
|
||||
</wsdl:operation>
|
||||
</wsdl:binding>
|
||||
<wsdl:service name="MessageGateway">
|
||||
<wsdl:documentation>
|
||||
Web Service for sending messages over the mosaic message gatewa
|
||||
</wsdl:documentation>
|
||||
|
||||
<wsdl:port name="HTTPPort" binding="tns:MGWBinding">
|
||||
<wsdl:documentation>HTTP(S) port for the mosaic message gatewa</wsdl:documentation>
|
||||
<soap:address location="https://www.example.org/MessageGateway/" />
|
||||
</wsdl:port>
|
||||
</wsdl:service>
|
||||
</wsdl:definitions>};
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
use Test::More tests => 4;
|
||||
use strict;
|
||||
use warnings;
|
||||
use lib '../lib';
|
||||
use lib 't/lib';
|
||||
use lib 'lib';
|
||||
use Cwd;
|
||||
use File::Basename;
|
||||
|
||||
my $path = cwd();
|
||||
my $name = basename $0;
|
||||
$name =~s/\.t$//;
|
||||
$name =~s/^t\///;
|
||||
|
||||
$path =~s{(/t)?/SOAP/WSDL}{}xms;
|
||||
|
||||
use_ok(qw/SOAP::WSDL/);
|
||||
|
||||
print "# SOAP::WSDL Version: $SOAP::WSDL::VERSION\n";
|
||||
|
||||
my $xml;
|
||||
my $soap;
|
||||
|
||||
#2
|
||||
ok( $soap = SOAP::WSDL->new(
|
||||
wsdl => 'file://' . $path . '/t/acceptance/wsdl/' . $name . '.wsdl',
|
||||
readable => 1,
|
||||
no_dispatch => 1,
|
||||
), 'Instantiated object' );
|
||||
|
||||
ok ($xml = $soap->call('test',
|
||||
testAll => {
|
||||
Test2 => 'Test2',
|
||||
TestRef => 'TestRef'
|
||||
}
|
||||
), 'Serialized complexType' );
|
||||
|
||||
is $xml, q{<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" ><SOAP-ENV:Body><testAll>
|
||||
<TestRef>TestRef</TestRef>
|
||||
<Test2>Test2</Test2>
|
||||
</testAll>
|
||||
</SOAP-ENV:Body></SOAP-ENV:Envelope>}
|
||||
, 'element ref="" serialization';
|
||||
@@ -1,83 +0,0 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use Test::More tests=> 5;
|
||||
use Time::HiRes qw( gettimeofday tv_interval );
|
||||
use lib '../..';
|
||||
use Data::Dumper;
|
||||
use Cwd;
|
||||
use File::Basename;
|
||||
use_ok qw/ SOAP::WSDL /;
|
||||
use Benchmark;
|
||||
|
||||
print "# Testing SOAP::WSDL ". $SOAP::WSDL::VERSION."\n";
|
||||
print "# Performance test with simple WSDL file\n";
|
||||
my $soap;
|
||||
my $data = {
|
||||
sayHello => {
|
||||
name => 'Mein Name',
|
||||
givenName => 'Vorname',
|
||||
}
|
||||
};
|
||||
|
||||
my $name = basename( $0 );
|
||||
$name =~s/\.(t|pl)$//;
|
||||
|
||||
my $path = cwd;
|
||||
|
||||
$path=~s{(/t)?/SOAP/WSDL}{}xms;
|
||||
|
||||
my $cacheDir;
|
||||
if ($^O =~ m/Win/)
|
||||
{
|
||||
$cacheDir = 'C:/Temp/WSDL';
|
||||
}
|
||||
else
|
||||
{
|
||||
$cacheDir = '/tmp/';
|
||||
}
|
||||
|
||||
|
||||
my $t0 = [gettimeofday];
|
||||
ok(
|
||||
$soap=SOAP::WSDL->new(
|
||||
wsdl => "file://$path/t/acceptance/wsdl/10_helloworld.asmx.xml",
|
||||
no_dispatch => 1
|
||||
),
|
||||
"Create SOAP::WSDL object (".tv_interval ( $t0, [gettimeofday]) ."ms)" );
|
||||
|
||||
$soap->proxy('http://helloworld/helloworld.asmx');
|
||||
|
||||
$t0 = [gettimeofday];
|
||||
eval{
|
||||
$soap->wsdlinit(
|
||||
caching => 1,
|
||||
cache_directory => $cacheDir,
|
||||
servicename => 'Service1' ) };
|
||||
|
||||
unless ($@) {
|
||||
pass("wsdl file init (".tv_interval ( $t0, [gettimeofday]) ."s)");
|
||||
} else {
|
||||
fail( $@ );
|
||||
}
|
||||
$soap->readable(1);
|
||||
|
||||
$t0 = [gettimeofday];
|
||||
ok( $soap->call("sayHello" , %{ $data }),
|
||||
"1 x call pre-work (".tv_interval ( $t0, [gettimeofday]) ."s)") ;
|
||||
|
||||
$t0 = [gettimeofday];
|
||||
ok($soap->call(sayHello => %{ $data }),
|
||||
"1 x call pre-work (".tv_interval ( $t0, [gettimeofday]) ."s)" );
|
||||
|
||||
timethis 1000, sub { $soap->call(sayHello => %{ $data }) };
|
||||
|
||||
__END__
|
||||
|
||||
$t0 = [gettimeofday];
|
||||
for (my $i=1; $i<100; $i++)
|
||||
{
|
||||
$soap->call(sayHello => %{ $data });
|
||||
}
|
||||
ok(1, "100 x call pre-work (".tv_interval ( $t0, [gettimeofday]) ."s)");
|
||||
|
||||
chdir $cwd;
|
||||
@@ -13,6 +13,8 @@ sub timezone {
|
||||
}
|
||||
|
||||
use_ok('SOAP::WSDL::XSD::Typelib::Builtin::dateTime');
|
||||
|
||||
print "# timezone is " . timezone( scalar localtime(time) ) . "\n";
|
||||
my $obj;
|
||||
my %dates = (
|
||||
'2007-12-31 12:32' => '2007-12-31T12:32:00',
|
||||
@@ -25,14 +27,6 @@ while (my ($date, $converted) = each %dates ) {
|
||||
$obj = SOAP::WSDL::XSD::Typelib::Builtin::dateTime->new();
|
||||
$obj->set_value( $date );
|
||||
|
||||
is $obj->get_value() , $converted . timezone($date), 'conversion';
|
||||
is $obj->get_value() , $converted . timezone($date), 'conversion with timezone';
|
||||
}
|
||||
$obj->set_value('2007-12-31T00:00:00.0000000+01:00');
|
||||
|
||||
# exit;
|
||||
|
||||
#~ use Benchmark;
|
||||
#~ timethese 10000, {
|
||||
#~ xml => sub { $obj->set_value('2037-12-31T00:00:00.0000000+01:00') },
|
||||
#~ string => sub { $obj->set_value('2037-12-31') },
|
||||
#~ }
|
||||
@@ -0,0 +1,53 @@
|
||||
<?xml version="1.0"?>
|
||||
<definitions name="urn:Test" targetNamespace="urn:Test" xmlns:tns="urn:Test"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
|
||||
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
|
||||
<types>
|
||||
<xsd:schema targetNamespace="urn:Test">
|
||||
<xsd:element name="TestElement" type="xsd:string" />
|
||||
<xsd:element name="TestRef" ref="tns:TestElement" />
|
||||
<xsd:complexType name="testComplexTypeRef">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>ComplexType Test</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:all>
|
||||
<xsd:element name="TestRef" ref="tns:TestElement" />
|
||||
<xsd:element name="Test2" type="xsd:string" minOccurs="1" />
|
||||
</xsd:all>
|
||||
</xsd:complexType>
|
||||
</xsd:schema>
|
||||
</types>
|
||||
<message name="testRequest">
|
||||
<part name="testAll" type="tns:testComplexTypeRef" />
|
||||
</message>
|
||||
<message name="testResponse">
|
||||
<part name="testAll" type="tns:testComplexTypeRef" />
|
||||
</message>
|
||||
<portType name="testPort">
|
||||
<operation name="test">
|
||||
<documentation>Test-Methode</documentation>
|
||||
<input message="tns:testRequest" />
|
||||
<output message="tns:testResponse" />
|
||||
</operation>
|
||||
</portType>
|
||||
|
||||
<binding type="tns:testPort" name="testBinding">
|
||||
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
|
||||
<operation name="test">
|
||||
<soap:operation soapAction="test">
|
||||
<input>
|
||||
<soap:body use="literal" />
|
||||
</input>
|
||||
<output>
|
||||
<soap:body use="literal" />
|
||||
</output>
|
||||
</soap:operation>
|
||||
</operation>
|
||||
</binding>
|
||||
<service name="testService">
|
||||
<port name="testPort" binding="tns:testBinding">
|
||||
<soap:address location="http://127.0.0.1/testPort" />
|
||||
</port>
|
||||
</service>
|
||||
</definitions>
|
||||
Reference in New Issue
Block a user