Compare commits

..

3 Commits

Author SHA1 Message Date
Martin Kutter
874251225f import SOAP-WSDL 2.00_29 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_29
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_29.tar.gz
2009-12-12 19:48:17 -08:00
Martin Kutter
2bad767211 import SOAP-WSDL 1.27 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  1.27
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-1.27.tar.gz
2009-12-12 19:48:16 -08:00
Martin Kutter
7ca2154ad6 import SOAP-WSDL 2.00_28 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_28
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_28.tar.gz
2009-12-12 19:48:15 -08:00
79 changed files with 2751 additions and 738 deletions

View File

@@ -5,7 +5,7 @@ $build = Module::Build->new(
create_makefile_pl => 'passthrough',
dist_abstract => 'SOAP with WSDL support',
dist_name => 'SOAP-WSDL',
dist_version => '2.00_27',
dist_version => '2.00_29',
module_name => 'SOAP::WSDL',
license => 'artistic',
requires => {

33
Changes
View File

@@ -1,4 +1,4 @@
Release notes for SOAP::WSDL 2.00_27
Release notes for SOAP::WSDL 2.00_29
-------
I'm proud to present a new pre-release version of SOAP::WSDL.
@@ -34,6 +34,37 @@ Features:
The following changes have been made:
2.00_29
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
* #32188: minor bug found and fixed in WSDL generation
* [ 1871175 ] Can't delete attributes from ComplexType objects
The following uncategorized improvements have been made:
* Updated SOAP::WSDL::Manual::XSD
* Removed pod directives from templates to avoid confusing CPAN's pod
viewer
* Initial (incomplete) XML attribute support
* Updated test suite
2.00_28
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
* #32062: minor doc fixes
* [ 1852988 ] Generated Interface POD is invalid
* [ 1855583 ] t/SOAP/WSDL/XSD/Typelib/ComplexType.t requires Test::Warn
The following uncategorized improvements have been made:
* Updated SOAP::WSDL::Manual::WS_I to reflect new Server modules
2.00_27
The following features were added (the numbers in square brackets are the

View File

@@ -97,6 +97,7 @@ lib/SOAP/WSDL/Generator/Template/XSD/_type_class.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/atomicTypes.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/attributeSet.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/contentModel.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt
@@ -164,12 +165,15 @@ lib/SOAP/WSDL/Transport/Loopback.pm
lib/SOAP/WSDL/Transport/Test.pm
lib/SOAP/WSDL/TypeLookup.pm
lib/SOAP/WSDL/Types.pm
lib/SOAP/WSDL/XSD/Attribute.pm
lib/SOAP/WSDL/XSD/Builtin.pm
lib/SOAP/WSDL/XSD/ComplexType.pm
lib/SOAP/WSDL/XSD/Element.pm
lib/SOAP/WSDL/XSD/Schema.pm
lib/SOAP/WSDL/XSD/Schema/Builtin.pm
lib/SOAP/WSDL/XSD/SimpleType.pm
lib/SOAP/WSDL/XSD/Typelib/Attribute.pm
lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
@@ -225,6 +229,7 @@ Makefile.PL
MANIFEST This list of files
META.yml
MIGRATING
patches/Manual.diff
README
t/001_use.t
t/002_parse_wsdl.t
@@ -240,6 +245,7 @@ t/013_complexType.t
t/016_client_object.t
t/017_generator.t
t/020_storable.t
t/095_copying.t
t/096_characters.t
t/097_kwalitee.t
t/098_pod.t
@@ -267,15 +273,17 @@ t/acceptance/wsdl/10_helloworld.asmx.xml
t/acceptance/wsdl/11_helloworld.wsdl
t/acceptance/wsdl/contributed/Axis.wsdl
t/acceptance/wsdl/contributed/ETest.wsdl
t/acceptance/wsdl/contributed/gasquery.wsdl
t/acceptance/wsdl/contributed/OITest.wsdl
t/acceptance/wsdl/contributed/tools.wsdl
t/acceptance/wsdl/elementAtomicComplexType.xml
t/acceptance/wsdl/email_account.wsdl
t/acceptance/wsdl/generator_test.wsdl
t/acceptance/wsdl/generator_test_dot_names.wsdl
t/acceptance/wsdl/generator_unsupported_test.wsdl
t/acceptance/wsdl/message_gateway.wsdl
t/acceptance/wsdl/WSDLParser.wsdl
t/contributed.wsdl
t/Expat/01_expat.t
t/Expat/03_wsdl.t
t/lib/MyComplexType.pm
t/lib/MyElement.pm
@@ -303,11 +311,14 @@ t/SOAP/WSDL/05_simpleType-union.t
t/SOAP/WSDL/06_keep_alive.t
t/SOAP/WSDL/11_helloworld.NET.t
t/SOAP/WSDL/12_binding.t
t/SOAP/WSDL/Client.t
t/SOAP/WSDL/Client/Base.t
t/SOAP/WSDL/Deserializer/Hash.t
t/SOAP/WSDL/Deserializer/SOM.t
t/SOAP/WSDL/Deserializer/XSD.t
t/SOAP/WSDL/Expat/Base.t
t/SOAP/WSDL/Expat/MessageParser.t
t/SOAP/WSDL/Expat/WSDLParser.t
t/SOAP/WSDL/Factory/Deserializer.t
t/SOAP/WSDL/Factory/Serializer.t
t/SOAP/WSDL/Factory/Transport.t
@@ -316,6 +327,7 @@ t/SOAP/WSDL/Generator/Visitor.t
t/SOAP/WSDL/Generator/Visitor/Typemap.t
t/SOAP/WSDL/Generator/XCS.t
t/SOAP/WSDL/Generator/XSD.t
t/SOAP/WSDL/Generator/XSD_dot_names.t
t/SOAP/WSDL/Generator/XSD_unsupported.t
t/SOAP/WSDL/Part.t
t/SOAP/WSDL/Serializer/XSD.t
@@ -329,6 +341,7 @@ t/SOAP/WSDL/Typelib/Fault11.t
t/SOAP/WSDL/XSD/ComplexType.t
t/SOAP/WSDL/XSD/Element.t
t/SOAP/WSDL/XSD/SimpleType.t
t/SOAP/WSDL/XSD/Typelib/Attribute.t
t/SOAP/WSDL/XSD/Typelib/Builtin/01_constructors.t
t/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.t
t/SOAP/WSDL/XSD/Typelib/Builtin/anyType.t

View File

@@ -1,6 +1,6 @@
---
name: SOAP-WSDL
version: 2.00_27
version: 2.00_29
author:
- 'Martin Kutter <martin.kutter@fen-net.de>'
abstract: SOAP with WSDL support
@@ -44,7 +44,7 @@ provides:
version: 2.00_25
SOAP::WSDL::Definitions:
file: lib/SOAP/WSDL/Definitions.pm
version: 2.00_25
version: 2.00_27
SOAP::WSDL::Deserializer::Hash:
file: lib/SOAP/WSDL/Deserializer/Hash.pm
version: 2.00_25
@@ -56,13 +56,13 @@ provides:
version: 2.00_25
SOAP::WSDL::Expat::Base:
file: lib/SOAP/WSDL/Expat/Base.pm
version: 2.00_24
version: 2.00_27
SOAP::WSDL::Expat::Message2Hash:
file: lib/SOAP/WSDL/Expat/Message2Hash.pm
version: 2.00_24
version: 2.00_27
SOAP::WSDL::Expat::MessageParser:
file: lib/SOAP/WSDL/Expat/MessageParser.pm
version: 2.00_25
version: 2.00_27
SOAP::WSDL::Expat::MessageStreamParser:
file: lib/SOAP/WSDL/Expat/MessageStreamParser.pm
version: 2.00_24
@@ -83,7 +83,7 @@ provides:
version: 2.00_25
SOAP::WSDL::Generator::Template::XSD:
file: lib/SOAP/WSDL/Generator/Template/XSD.pm
version: 2.00_25
version: 2.00_27
SOAP::WSDL::Generator::Visitor:
file: lib/SOAP/WSDL/Generator/Visitor.pm
version: 2.00_25
@@ -120,13 +120,13 @@ provides:
version: 2.00_25
SOAP::WSDL::Serializer::XSD:
file: lib/SOAP/WSDL/Serializer/XSD.pm
version: 2.00_25
version: 2.00_27
SOAP::WSDL::Server:
file: lib/SOAP/WSDL/Server.pm
version: 2.00_25
version: 2.00_27
SOAP::WSDL::Server::CGI:
file: lib/SOAP/WSDL/Server/CGI.pm
version: 2.00_26
version: 2.00_27
SOAP::WSDL::Service:
file: lib/SOAP/WSDL/Service.pm
SOAP::WSDL::Transport::HTTP:
@@ -139,8 +139,12 @@ provides:
version: 2.00_25
SOAP::WSDL::TypeLookup:
file: lib/SOAP/WSDL/TypeLookup.pm
version: 2.00_29
SOAP::WSDL::Types:
file: lib/SOAP/WSDL/Types.pm
SOAP::WSDL::XSD::Attribute:
file: lib/SOAP/WSDL/XSD/Attribute.pm
version: 2.00_29
SOAP::WSDL::XSD::Builtin:
file: lib/SOAP/WSDL/XSD/Builtin.pm
SOAP::WSDL::XSD::ComplexType:
@@ -157,6 +161,10 @@ provides:
SOAP::WSDL::XSD::SimpleType:
file: lib/SOAP/WSDL/XSD/SimpleType.pm
version: 2.00_25
SOAP::WSDL::XSD::Typelib::Attribute:
file: lib/SOAP/WSDL/XSD/Typelib/Attribute.pm
SOAP::WSDL::XSD::Typelib::AttributeSet:
file: lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm
SOAP::WSDL::XSD::Typelib::Builtin:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
version: 2.00_25
@@ -184,6 +192,7 @@ provides:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
SOAP::WSDL::XSD::Typelib::Builtin::anyType:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
version: 2.00_29
SOAP::WSDL::XSD::Typelib::Builtin::anyURI:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm
SOAP::WSDL::XSD::Typelib::Builtin::base64Binary:
@@ -256,10 +265,10 @@ provides:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
SOAP::WSDL::XSD::Typelib::ComplexType:
file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
version: 2.00_25
version: 2.00_29
SOAP::WSDL::XSD::Typelib::Element:
file: lib/SOAP/WSDL/XSD/Typelib/Element.pm
version: 2.00_25
version: 2.00_29
SOAP::WSDL::XSD::Typelib::SimpleType:
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
SOAP::WSDL::XSD::Typelib::SimpleType::restriction:

View File

@@ -4,34 +4,10 @@ use lib '../../SOAP-WSDL_XS/blib/lib';
use lib '../../SOAP-WSDL_XS/blib/arch';
use strict;
package MyData;
my $XML;
sub xml {
return $XML if ($XML);
open my $fh, 'person.xml' or die 'cannot open data file';
$XML = join '', <$fh>;
close $fh;
return $XML;
}
package MyTransport;
use SOAP::WSDL::Factory::Transport;
SOAP::WSDL::Factory::Transport->register( http => __PACKAGE__ );
sub send_receive {
return MyData::xml();
}
sub new { return bless {}, 'MyTransport' };
package main;
use Benchmark qw(cmpthese);
# Do this BEFORE the client SOAP handlers are compiled!
use XML::Compile::Transport::SOAPHTTP();
use XML::Compile::SOAP::Tester ();
use XML::Compile::Util;#use Data::Dumper;
#print Dumper $result;
use XML::Compile::Util;
use XML::Compile::WSDL11;
use XML::Simple;
@@ -43,14 +19,9 @@ use SOAP::Lite;
use MyInterfaces::TestService::TestPort;
my $tester = XML::Compile::SOAP::Tester->new();
my $action = pack_type 'http://example.org', 'ListPerson';
my $compile = XML::Compile::WSDL11->new('../example/wsdl/Person.wsdl');
$tester->actionCallback($action, \&MyData::xml);
my $call = $compile->compileClient('ListPerson');
my $result = $call->({ in => undef});
$call->({ in => undef});
# Initialize SOAP::Lite
my $deserializer = SOAP::Deserializer->new();
@@ -60,17 +31,16 @@ my $soap = MyInterfaces::TestService::TestPort->new();
# Load all classes - XML::Compile has created everything before, too
$soap->ListPerson({});
my $lite = SOAP::Lite->new()->default_ns('http://www.example.org/benchmark/')
->proxy('http://localhost:81/soap-wsdl-test/person.pl');
$lite->on_action( sub { 'http://www.example.org/benchmark/ListPerson' } );
# # register for SOAP 1.1
SOAP::WSDL::Factory::Deserializer->register('1.1' => 'SOAP::WSDL::Deserializer::XSD_XS' );
my $wsdl_xs = MyInterfaces::TestService::TestPort->new();
# trigger loading of XML Data
{
use bytes;
print "XML length (bytes): " . length( MyData::xml() ), "\n";
}
my $count = 100;
my @data = ();
my $n = 0;
print "Benchmark conducted with
@@ -78,37 +48,39 @@ SOAP::Lite - $SOAP::Lite::VERSION
SOAP::WSDL - $SOAP::WSDL::Client::VERSION
SOAP::WSDL_XS - $SOAP::WSDL::Deserializer::XSD_XS::VERSION;
XML::Compile::SOAP - $XML::Compile::SOAP::VERSION
XML::Simple - $XML::Simple::VERSION
Benchmark $n: Store result in private variable and destroy it
";
$n++;
cmpthese 300, {
'XML::Simple' => sub { my $result = XMLin( MyData::xml() )},
cmpthese $count, {
# 'XML::Simple' => sub { my $result = XMLin( MyData::xml() )},
'SOAP::WSDL' => sub { my $result = $soap->ListPerson({}) },
'XML::Compile::SOAP' => sub { my $result = $call->() },
'SOAP::WSDL_XS' => sub { my $result = @data, $wsdl_xs->ListPerson({}) },
'SOAP::Lite' => sub { my $result = $deserializer->deserialize( MyData::xml() )}
'XML::Compile' => sub { my $result = $call->() },
'SOAP::WSDL_XS' => sub { my $result = $wsdl_xs->ListPerson({}) },
# 'SOAP::Lite' => sub { my $result = $deserializer->deserialize( MyData::xml() )},
'SOAP::Lite' => sub { my $som = $lite->call('ListPerson') },
};
print "Benchmark $n: Push result on list\n";
print "\nBenchmark $n: Push result on list\n";
$n++;
cmpthese 500, {
'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
cmpthese $count, {
# 'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
'XML::Compile::SOAP' => sub { push @data, $call->() },
'XML::Compile' => sub { push @data, $call->() },
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
# 'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
};
@data = ();
print "Benchmark $n: Play it again, Sam\n";
print "\nBenchmark $n: Play it again, Sam\n";
cmpthese 500, {
'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
cmpthese $count, {
# 'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
'XML::Compile::SOAP' => sub { push @data, $call->() },
'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
'XML::Compile' => sub { push @data, $call->() },
# 'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
};

View File

@@ -46,388 +46,388 @@
</NewElement>
<NewElement>
<PersonID>
<ID>1</ID>
<ID>2</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<Salutation>Salutation2</Salutation>
<Name>Name2</Name>
<GivenName>Martin2</GivenName>
<DateOfBirth>1970-01-02</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
<Street>Street 2</Street>
<ZIP>00002</ZIP>
<City>City2</City>
<Country>Country2</Country>
<PhoneNumber>++4900000002</PhoneNumber>
<MobilePhoneNumber>++491700000002</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Street>Somestreet 2</Street>
<ZIP>222222</ZIP>
<City>SomeCity2</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
<PhoneNumber>++4920000002</PhoneNumber>
<MobilePhoneNumber>++4920000002</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100000</ContractID>
<ContractName>SomeContract0</ContractName>
</Contract>
<Contract>
<ContractID>100001</ContractID>
<ContractName>SomeContract1</ContractName>
</Contract>
<Contract>
<ContractID>100002</ContractID>
<ContractName>SomeContract2</ContractName>
</Contract>
<Contract>
<ContractID>100003</ContractID>
<ContractName>SomeContract3</ContractName>
<ContractID>100021</ContractID>
<ContractName>SomeContract21</ContractName>
</Contract>
<Contract>
<ContractID>100022</ContractID>
<ContractName>SomeContract22</ContractName>
</Contract>
<Contract>
<ContractID>1000023</ContractID>
<ContractName>SomeContract23</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>1</ID>
<ID>3</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<Salutation>Salutation3</Salutation>
<Name>Name3</Name>
<GivenName>Martin3</GivenName>
<DateOfBirth>1970-01-03</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
<Street>Street 3</Street>
<ZIP>00003</ZIP>
<City>City3</City>
<Country>Country3</Country>
<PhoneNumber>++4900000003</PhoneNumber>
<MobilePhoneNumber>++491700000003</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Street>Somestreet 3</Street>
<ZIP>333333</ZIP>
<City>SomeCity3</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
<PhoneNumber>++4930000003</PhoneNumber>
<MobilePhoneNumber>++4930000003</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100000</ContractID>
<ContractName>SomeContract0</ContractName>
</Contract>
<Contract>
<ContractID>100001</ContractID>
<ContractName>SomeContract1</ContractName>
</Contract>
<Contract>
<ContractID>100002</ContractID>
<ContractName>SomeContract2</ContractName>
</Contract>
<Contract>
<ContractID>100003</ContractID>
<ContractName>SomeContract3</ContractName>
</Contract>
<Contract>
<ContractID>100031</ContractID>
<ContractName>SomeContract31</ContractName>
</Contract>
<Contract>
<ContractID>100033</ContractID>
<ContractName>SomeContract33</ContractName>
</Contract>
<Contract>
<ContractID>1000033</ContractID>
<ContractName>SomeContract33</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>1</ID>
<ID>4</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<Salutation>Salutation4</Salutation>
<Name>Name4</Name>
<GivenName>Martin4</GivenName>
<DateOfBirth>1970-01-04</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
<Street>Street 4</Street>
<ZIP>00004</ZIP>
<City>City4</City>
<Country>Country4</Country>
<PhoneNumber>++4900000004</PhoneNumber>
<MobilePhoneNumber>++491700000004</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Street>Somestreet 4</Street>
<ZIP>444444</ZIP>
<City>SomeCity4</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
<PhoneNumber>++4940000004</PhoneNumber>
<MobilePhoneNumber>++4940000004</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100000</ContractID>
<ContractName>SomeContract0</ContractName>
<ContractID>100004</ContractID>
<ContractName>SomeContract4</ContractName>
</Contract>
<Contract>
<ContractID>100001</ContractID>
<ContractName>SomeContract1</ContractName>
<ContractID>100041</ContractID>
<ContractName>SomeContract41</ContractName>
</Contract>
<Contract>
<ContractID>100002</ContractID>
<ContractName>SomeContract2</ContractName>
<ContractID>100044</ContractID>
<ContractName>SomeContract44</ContractName>
</Contract>
<Contract>
<ContractID>100003</ContractID>
<ContractName>SomeContract3</ContractName>
<ContractID>1000044</ContractID>
<ContractName>SomeContract44</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>1</ID>
<ID>5</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<Salutation>Salutation5</Salutation>
<Name>Name5</Name>
<GivenName>Martin5</GivenName>
<DateOfBirth>1970-01-05</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
<Street>Street 5</Street>
<ZIP>00005</ZIP>
<City>City5</City>
<Country>Country5</Country>
<PhoneNumber>++4900000005</PhoneNumber>
<MobilePhoneNumber>++491700000005</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Street>Somestreet 5</Street>
<ZIP>555555</ZIP>
<City>SomeCity5</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
<PhoneNumber>++4950000005</PhoneNumber>
<MobilePhoneNumber>++4950000005</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100000</ContractID>
<ContractName>SomeContract0</ContractName>
<ContractID>100005</ContractID>
<ContractName>SomeContract5</ContractName>
</Contract>
<Contract>
<ContractID>100001</ContractID>
<ContractName>SomeContract1</ContractName>
<ContractID>100051</ContractID>
<ContractName>SomeContract51</ContractName>
</Contract>
<Contract>
<ContractID>100002</ContractID>
<ContractName>SomeContract2</ContractName>
<ContractID>100055</ContractID>
<ContractName>SomeContract55</ContractName>
</Contract>
<Contract>
<ContractID>100003</ContractID>
<ContractName>SomeContract3</ContractName>
<ContractID>1000053</ContractID>
<ContractName>SomeContract53</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>1</ID>
<ID>6</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<Salutation>Salutation6</Salutation>
<Name>Name6</Name>
<GivenName>Martin6</GivenName>
<DateOfBirth>1970-01-06</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
<Street>Street 6</Street>
<ZIP>00006</ZIP>
<City>City6</City>
<Country>Country6</Country>
<PhoneNumber>++4900000006</PhoneNumber>
<MobilePhoneNumber>++491700000006</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Street>Somestreet 6</Street>
<ZIP>666666</ZIP>
<City>SomeCity6</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
<PhoneNumber>++4960000006</PhoneNumber>
<MobilePhoneNumber>++4960000006</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100000</ContractID>
<ContractName>SomeContract0</ContractName>
<ContractID>100006</ContractID>
<ContractName>SomeContract6</ContractName>
</Contract>
<Contract>
<ContractID>100001</ContractID>
<ContractName>SomeContract1</ContractName>
<ContractID>100061</ContractID>
<ContractName>SomeContract61</ContractName>
</Contract>
<Contract>
<ContractID>100002</ContractID>
<ContractName>SomeContract2</ContractName>
<ContractID>100066</ContractID>
<ContractName>SomeContract66</ContractName>
</Contract>
<Contract>
<ContractID>100003</ContractID>
<ContractName>SomeContract3</ContractName>
<ContractID>1000063</ContractID>
<ContractName>SomeContract63</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>1</ID>
<ID>7</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<Salutation>Salutation7</Salutation>
<Name>Name7</Name>
<GivenName>Martin7</GivenName>
<DateOfBirth>1970-01-07</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
<Street>Street 7</Street>
<ZIP>00007</ZIP>
<City>City7</City>
<Country>Country7</Country>
<PhoneNumber>++4900000007</PhoneNumber>
<MobilePhoneNumber>++491700000007</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Street>Somestreet 7</Street>
<ZIP>777777</ZIP>
<City>SomeCity7</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
<PhoneNumber>++4970000007</PhoneNumber>
<MobilePhoneNumber>++4970000007</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100000</ContractID>
<ContractName>SomeContract0</ContractName>
<ContractID>100007</ContractID>
<ContractName>SomeContract7</ContractName>
</Contract>
<Contract>
<ContractID>100001</ContractID>
<ContractName>SomeContract1</ContractName>
<ContractID>100071</ContractID>
<ContractName>SomeContract71</ContractName>
</Contract>
<Contract>
<ContractID>100002</ContractID>
<ContractName>SomeContract2</ContractName>
<ContractID>100077</ContractID>
<ContractName>SomeContract77</ContractName>
</Contract>
<Contract>
<ContractID>100003</ContractID>
<ContractName>SomeContract3</ContractName>
<ContractID>1000073</ContractID>
<ContractName>SomeContract73</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>1</ID>
<ID>8</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<Salutation>Salutation8</Salutation>
<Name>Name8</Name>
<GivenName>Martin8</GivenName>
<DateOfBirth>1970-01-08</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
<Street>Street 8</Street>
<ZIP>00008</ZIP>
<City>City8</City>
<Country>Country8</Country>
<PhoneNumber>++4900000008</PhoneNumber>
<MobilePhoneNumber>++491700000008</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Street>Somestreet 8</Street>
<ZIP>888888</ZIP>
<City>SomeCity8</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
<PhoneNumber>++4980000008</PhoneNumber>
<MobilePhoneNumber>++4980000008</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100000</ContractID>
<ContractName>SomeContract0</ContractName>
<ContractID>100008</ContractID>
<ContractName>SomeContract8</ContractName>
</Contract>
<Contract>
<ContractID>100001</ContractID>
<ContractName>SomeContract1</ContractName>
<ContractID>100081</ContractID>
<ContractName>SomeContract81</ContractName>
</Contract>
<Contract>
<ContractID>100002</ContractID>
<ContractName>SomeContract2</ContractName>
<ContractID>100088</ContractID>
<ContractName>SomeContract88</ContractName>
</Contract>
<Contract>
<ContractID>100003</ContractID>
<ContractName>SomeContract3</ContractName>
<ContractID>1000083</ContractID>
<ContractName>SomeContract83</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>1</ID>
<ID>9</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<Salutation>Salutation9</Salutation>
<Name>Name9</Name>
<GivenName>Martin9</GivenName>
<DateOfBirth>1970-01-09</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
<Street>Street 9</Street>
<ZIP>00009</ZIP>
<City>City9</City>
<Country>Country9</Country>
<PhoneNumber>++4900000009</PhoneNumber>
<MobilePhoneNumber>++491700000009</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Street>Somestreet 9</Street>
<ZIP>999999</ZIP>
<City>SomeCity9</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
<PhoneNumber>++4990000009</PhoneNumber>
<MobilePhoneNumber>++4990000009</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100000</ContractID>
<ContractName>SomeContract0</ContractName>
<ContractID>100009</ContractID>
<ContractName>SomeContract9</ContractName>
</Contract>
<Contract>
<ContractID>100001</ContractID>
<ContractName>SomeContract1</ContractName>
<ContractID>100091</ContractID>
<ContractName>SomeContract91</ContractName>
</Contract>
<Contract>
<ContractID>100002</ContractID>
<ContractName>SomeContract2</ContractName>
<ContractID>100099</ContractID>
<ContractName>SomeContract99</ContractName>
</Contract>
<Contract>
<ContractID>100003</ContractID>
<ContractName>SomeContract3</ContractName>
<ContractID>1000093</ContractID>
<ContractName>SomeContract93</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>1</ID>
<ID>10</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<Salutation>Salutation10</Salutation>
<Name>Name10</Name>
<GivenName>Martin10</GivenName>
<DateOfBirth>1970-01-010</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
<Street>Street 10</Street>
<ZIP>000010</ZIP>
<City>City10</City>
<Country>Country10</Country>
<PhoneNumber>++49000000010</PhoneNumber>
<MobilePhoneNumber>++4917000000010</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Street>Somestreet 10</Street>
<ZIP>101010101010</ZIP>
<City>SomeCity10</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
<PhoneNumber>++491000000010</PhoneNumber>
<MobilePhoneNumber>++491000000010</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100000</ContractID>
<ContractName>SomeContract0</ContractName>
<ContractID>1000010</ContractID>
<ContractName>SomeContract10</ContractName>
</Contract>
<Contract>
<ContractID>100001</ContractID>
<ContractName>SomeContract1</ContractName>
<ContractID>1000101</ContractID>
<ContractName>SomeContract101</ContractName>
</Contract>
<Contract>
<ContractID>100002</ContractID>
<ContractName>SomeContract2</ContractName>
<ContractID>10001010</ContractID>
<ContractName>SomeContract1010</ContractName>
</Contract>
<Contract>
<ContractID>100003</ContractID>
<ContractName>SomeContract3</ContractName>
<ContractID>10000103</ContractID>
<ContractName>SomeContract103</ContractName>
</Contract>
</Contracts>
</NewElement>

View File

@@ -1,7 +1,8 @@
#!/usr/bin/perl -w
package main;
use strict;
use warnings;
use lib qw(../lib ../../lib);
#use lib qw(../lib ../../lib);
use MyElements::ListPersonResponse;
use MyServer::TestService::TestPort;
my $server = MyServer::TestService::TestPort->new({

View File

@@ -1,7 +1,7 @@
#!/usr/bin/perl -w
use strict;
use warnings;
use lib 'lib'; # just needed because interface lies here
use lib 'lib'; # just needed because interface lies here
# I have to generate the interface using wsdl2perl.pl before
use MyInterfaces::HelloWorld::HelloWorldSoap;
@@ -21,3 +21,4 @@ die $result if not $result;
# I have to lookup the output parameter from the interface's POD - or try:
# Will die on bad method names with a list of available methods
print $result->get_sayHelloResult(), "\n";

View File

@@ -1,7 +1,7 @@
#!/usr/bin/perl -w
use strict;
#use strict;
use warnings;
use SOAP::Lite;
use SOAP::Lite +trace;
# I have to lookup the URL from the WSDL
my $soap = SOAP::Lite->new(
@@ -13,15 +13,17 @@ $soap->on_action( sub { "urn:HelloWorld#sayHello" });
$soap->autotype(0);
# I have to lookup the top level element's namespace from the WSDL
$soap->default_ns('urn:HelloWorld');
# I have to encode all parameters as SOAP::Data objects
# I have to know the order of parameters
my $som = $soap->call(
SOAP::Data->name("sayHello")
->attr({ xmlns => 'urn:HelloWorld' }),
"sayHello",
SOAP::Data->name('name')->value( $ARGV[1] || '"Your name"'),
SOAP::Data->name('givenName')->value( $ARGV[0] || '"Your given name"'),
);
die $som->fault->{ faultstring } if ($som->fault);
print $som->result, "\n";
print $som->result, "\n";

View File

@@ -1,10 +1,12 @@
use strict;
use warnings;
use lib 'lib';
use MyInterfaces::TestService::TestPort;
my $soap = MyInterfaces::TestService::TestPort->new();
$soap->outputxml(1);
my $result = $soap->ListPerson({});
# print "Found " . scalar @{ $result->get_out->get_NewElement } . " persons\n";
my $result = $soap->ListPerson({})
or die "error calling SOAP method";
print "Found " . @{ $result->get_out()->get_NewElement } . " persons\n";
print $result;

View File

@@ -1,107 +1,121 @@
<?xml version="1.0" encoding="UTF-8"?><wsdl:definitions name="benchmark" targetNamespace="http://www.example.org/benchmark/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://www.example.org/benchmark/" 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/benchmark/">
<xsd:element name="ListPerson">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="in" type="tns:Person" maxOccurs="1" minOccurs="0"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="ListPersonResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="out" type="tns:ArrayOfPerson"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="Person">
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="benchmark"
targetNamespace="http://www.example.org/benchmark/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://www.example.org/benchmark/"
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/benchmark/">
<xsd:sequence>
<xsd:element name="PersonID" type="tns:PersonID"></xsd:element>
<xsd:element name="Salutation" type="xsd:string"></xsd:element>
<xsd:element name="Name" type="xsd:string"></xsd:element>
<xsd:element name="GivenName" type="xsd:string"></xsd:element>
<xsd:element name="DateOfBirth" type="xsd:date"></xsd:element>
<xsd:element name="HomeAddress" type="tns:Address"
maxOccurs="1" minOccurs="1">
</xsd:element>
<xsd:element name="WorkAddress" type="tns:Address"
maxOccurs="1" minOccurs="0">
</xsd:element>
<xsd:element name="Contracts" type="tns:ArrayOfContract"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="ListPerson">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="in" type="tns:Person"
maxOccurs="1" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="PhoneNumber">
<xsd:restriction base="xsd:string">
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="ListPersonResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="out" type="tns:ArrayOfPerson" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="Person">
<xsd:complexType name="ArrayOfPerson">
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element name="NewElement" type="tns:Person" maxOccurs="unbounded" minOccurs="0"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:sequence>
<xsd:element name="PersonID" type="tns:PersonID" />
<xsd:element name="Salutation" type="xsd:string" />
<xsd:element name="Name" type="xsd:string" />
<xsd:element name="GivenName" type="xsd:string" />
<xsd:element name="DateOfBirth" type="xsd:date" />
<xsd:element name="HomeAddress" type="tns:Address"
maxOccurs="1" minOccurs="1" />
<xsd:element name="WorkAddress" type="tns:Address"
maxOccurs="1" minOccurs="0" />
<xsd:element name="Contracts"
type="tns:ArrayOfContract" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="PersonID">
<xsd:sequence>
<xsd:element name="ID" type="xsd:int"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="PhoneNumber">
<xsd:restriction base="xsd:string"></xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="Address">
<xsd:sequence>
<xsd:element name="Street" type="xsd:string"></xsd:element>
<xsd:element name="ZIP" type="xsd:string"></xsd:element>
<xsd:element name="City" type="xsd:string"></xsd:element>
<xsd:element name="Country" type="xsd:string"></xsd:element>
<xsd:element name="PhoneNumber" type="tns:PhoneNumber"></xsd:element>
<xsd:element name="MobilePhoneNumber" type="tns:PhoneNumber"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ArrayOfPerson">
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element name="NewElement" type="tns:Person"
maxOccurs="unbounded" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ArrayOfContract">
<xsd:sequence>
<xsd:element name="Contract" type="tns:Contract" maxOccurs="unbounded" minOccurs="0"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="PersonID">
<xsd:sequence>
<xsd:element name="ID" type="xsd:int"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Contract">
<xsd:complexType name="Address">
<xsd:sequence>
<xsd:element name="Street" type="xsd:string" />
<xsd:element name="ZIP" type="xsd:string" />
<xsd:element name="City" type="xsd:string" />
<xsd:element name="Country" type="xsd:string" />
<xsd:element name="PhoneNumber" type="tns:PhoneNumber" />
<xsd:element name="MobilePhoneNumber" type="tns:PhoneNumber" />
</xsd:sequence>
</xsd:complexType>
<xsd:sequence>
<xsd:element name="ContractID" type="xsd:long"></xsd:element>
<xsd:element name="ContractName" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema></wsdl:types>
<xsd:complexType name="ArrayOfContract">
<xsd:sequence>
<xsd:element name="Contract" type="tns:Contract"
maxOccurs="unbounded" minOccurs="0">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Contract">
<xsd:sequence>
<xsd:element name="ContractID" type="xsd:long" />
<xsd:element name="ContractName" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<wsdl:message name="ListPersonRequest">
<wsdl:part name="parameters" element="tns:ListPerson"></wsdl:part>
<wsdl:part name="parameters" element="tns:ListPerson" />
</wsdl:message>
<wsdl:message name="ListPersonResponse">
<wsdl:part name="parameters" element="tns:ListPersonResponse"></wsdl:part>
<wsdl:part name="parameters" element="tns:ListPersonResponse" />
</wsdl:message>
<wsdl:portType name="NewPortType">
<wsdl:operation name="ListPerson">
<wsdl:input message="tns:ListPersonRequest"></wsdl:input>
<wsdl:output message="tns:ListPersonResponse"></wsdl:output>
</wsdl:operation>
<wsdl:operation name="ListPerson">
<wsdl:input message="tns:ListPersonRequest"></wsdl:input>
<wsdl:output message="tns:ListPersonResponse"></wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="NewBinding" type="tns:NewPortType">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="ListPerson">
<soap:operation
soapAction="http://www.example.org/benchmark/ListPerson" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="ListPerson">
<soap:operation
soapAction="http://www.example.org/benchmark/ListPerson" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="TestService">
<wsdl:port name="TestPort" binding="tns:NewBinding">
<soap:address location="http://localhost:81/soap-wsdl-test/person.pl"></soap:address>
</wsdl:port>
</wsdl:service></wsdl:definitions>
<wsdl:port name="TestPort" binding="tns:NewBinding">
<soap:address
location="http://localhost:81/soap-wsdl-test/person.pl"></soap:address>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

View File

@@ -669,12 +669,12 @@ The following facets have no influence yet:
=item * L<SOAP::Lite|SOAP::Lite>
Full featured SOAP-library, little WSDL support. Supports rpc-encoded style
Full featured SOAP-library, little WSDL support. Supports rpc-encoded style
only. Many protocols supported.
=item * L<XML::Compile::WSDL|XML::Compile::WSDL> / L<XML::Compile::SOAP|XML::Compile::SOAP>
Creates parser/generator functions for SOAP messages. Includes SOAP Client
Creates parser/generator functions for SOAP messages. Includes SOAP Client
and Server implementatios.
You might want to give it a try, especially if you need to adhere very
@@ -730,9 +730,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 457 $
$Rev: 477 $
$LastChangedBy: kutterma $
$Id: WSDL.pm 457 2007-12-16 08:02:06Z kutterma $
$Id: WSDL.pm 477 2007-12-24 10:23:52Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $
=cut

View File

@@ -9,7 +9,7 @@ use List::Util qw(first);
use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base);
our $VERSION='2.00_25';
our $VERSION='2.00_27';
my %types_of :ATTR(:name<types> :default<[]>);
my %message_of :ATTR(:name<message> :default<()>);
@@ -105,7 +105,7 @@ Returns the message matching the namespace/localname pair passed as arguments.
Accessors/Mutators for accessing / setting the E<gt>typesE<lt> child
element(s).
=head1 LICENSE and COPYRIGHT
=head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter.
@@ -118,9 +118,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 431 $
$Rev: 477 $
$LastChangedBy: kutterma $
$Id: Definitions.pm 431 2007-12-03 19:39:11Z kutterma $
$Id: Definitions.pm 477 2007-12-24 10:23:52Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Definitions.pm $
=cut

View File

@@ -3,7 +3,7 @@ use strict;
use warnings;
use XML::Parser::Expat;
our $VERSION = '2.00_24';
our $VERSION = '2.00_27';
sub new {
my ($class, $args) = @_;
@@ -41,4 +41,38 @@ sub get_data {
return $_[0]->{ data };
}
1;
1;
=pod
=head1 NAME
SOAP::WSDL::Expat::Base - Base class for XML::Parser::Expat based XML parsers
=head1 DESCRIPTION
Base class for XML::Parser::Expat based XML parsers. All XML::SAX::Expat based
parsers in SOAP::WSDL inherit from this class.
=head1 AUTHOR
Replace the whitespace by @ for E-Mail Address.
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself
=head1 Repository information
$Id: $
$LastChangedDate: 2007-09-10 18:19:23 +0200 (Mo, 10 Sep 2007) $
$LastChangedRevision: 218 $
$LastChangedBy: kutterma $
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $

View File

@@ -4,7 +4,7 @@ use strict;
use warnings;
use base qw(SOAP::WSDL::Expat::Base);
our $VERSION = '2.00_24';
our $VERSION = '2.00_27';
sub _initialize {
my ($self, $parser) = @_;
@@ -113,13 +113,16 @@ Replace the whitespace by @ for E-Mail Address.
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 COPYING
=head1 LICENSE AND COPYRIGHT
This module may be used under the same terms as perl itself.
Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself
=head1 Repository information
$ID: $
$Id: $
$LastChangedDate: 2007-09-10 18:19:23 +0200 (Mo, 10 Sep 2007) $
$LastChangedRevision: 218 $

View File

@@ -4,7 +4,7 @@ use strict;
use warnings;
use Carp qw(croak confess);
our $VERSION = q{2.00_25};
our $VERSION = q{2.00_27};
use SOAP::WSDL::XSD::Typelib::Builtin;
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
@@ -117,7 +117,7 @@ sub _initialize {
no strict qw(refs);
$parser->setHandlers(
Start => sub {
# my ($parser, $element, %_attrs) = @_;
# my ($parser, $element, %attrs) = @_;
$_leaf = 1; # believe we're a leaf node until we see an end
@@ -171,6 +171,8 @@ sub _initialize {
$current = bless \$o, $_class;
}
$current->attr({ @_[2..$#_] }) if (@_ > 2);
$depth++;
return;
},
@@ -260,7 +262,7 @@ See L<SOAP::WSDL::Manual::Parser> for details.
Sometimes there's unneccessary information transported in SOAP messages.
To skip XML nodes (including all child nodes), just edit the type map for
the message, set the type map entry to '__SKIP__', and comment out all
the message, set the type map entry to '__SKIP__', and comment out all
child elements you want to skip.
=head1 Bugs and Limitations
@@ -281,16 +283,19 @@ Replace the whitespace by @ for E-Mail Address.
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 COPYING
=head1 LICENSE AND COPYRIGHT
This module may be used under the same terms as perl itself.
Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself
=head1 Repository information
$ID: $
$Id: $
$LastChangedDate: 2007-12-07 21:04:06 +0100 (Fr, 07 Dez 2007) $
$LastChangedRevision: 444 $
$LastChangedDate: 2008-01-19 13:57:57 +0100 (Sa, 19 Jan 2008) $
$LastChangedRevision: 497 $
$LastChangedBy: kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $

View File

@@ -56,22 +56,22 @@ See L<SOAP::WSDL::Manual::Parser> for details.
See SOAP::WSDL::Expat::MessageParser
=head1 LICENSE AND COPYRIGHT
Copyright 2007 Martin Kutter. All rights reserved.
This file is part of SOAP-WSDL. You may distribte/modify it under
the same terms as perl itself
=head1 AUTHOR
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 LICENSE AND COPYRIGHT
Copyright 2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself
=head1 REPOSITORY INFORMATION
$Rev: 391 $
$Rev: 477 $
$LastChangedBy: kutterma $
$Id: MessageStreamParser.pm 391 2007-11-17 21:56:13Z kutterma $
$Id: MessageStreamParser.pm 477 2007-12-24 10:23:52Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageStreamParser.pm $
=cut

View File

@@ -5,7 +5,7 @@ use Carp;
use SOAP::WSDL::TypeLookup;
use base qw(SOAP::WSDL::Expat::Base);
our $VERSION = q{2.00_27};
our $VERSION = q{2.00_29};
sub _initialize {
my ($self, $parser) = @_;
@@ -65,7 +65,7 @@ sub _initialize {
$current->init( _fixup_attrs($parser, %attrs) );
}
elsif ($action->{ type } eq 'METHOD') {
my $method = $action->{ method } || $localname;
my $method = $action->{ method };
no strict qw(refs);
# call method with
@@ -145,3 +145,43 @@ sub _fixup_attrs {
1;
=pod
=head1 NAME
SOAP::WSDL::Expat::WSDLParser - Parse WSDL files into object trees
=head1 SYNOPSIS
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
$parser->parse( $xml );
my $obj = $parser->get_data();
=head1 DESCRIPTION
WSDL parser used by SOAP::WSDL.
=head1 AUTHOR
Replace the whitespace by @ for E-Mail Address.
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself
=head1 Repository information
$Id: $
$LastChangedDate: 2007-12-24 11:23:52 +0100 (Mo, 24 Dez 2007) $
$LastChangedRevision: 477 $
$LastChangedBy: kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/WSDLParser.pm $

View File

@@ -137,7 +137,7 @@ passed as a single hash ref:
Copyright 2007 Martin Kutter. All rights reserved.
This file is part of SOAP-WSDL. You may distribte/modify it under
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself
=head1 AUTHOR

View File

@@ -155,7 +155,7 @@ Set user-defined typemap snippet
Copyright 2007 Martin Kutter. All rights reserved.
This file is part of SOAP-WSDL. You may distribte/modify it under
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself
=head1 AUTHOR

View File

@@ -5,7 +5,7 @@ use Class::Std::Fast::Storable;
use File::Basename;
use File::Spec;
our $VERSION = q{2.00_25};
our $VERSION = q{2.00_27};
use SOAP::WSDL::Generator::Visitor::Typemap;
use SOAP::WSDL::Generator::Visitor::Typelib;
@@ -57,8 +57,8 @@ sub generate {
sub generate_typelib {
my ($self, $arg_ref) = @_;
# $output_of{ ident $self } = "";
my @schema = exists $arg_ref->{ schema }
? @{ $arg_ref->{schema} }
my @schema = exists $arg_ref->{ schema }
? @{ $arg_ref->{schema} }
: @{ $self->get_definitions()->first_types()->get_schema() };
for my $type (map { @{ $_->get_type() } , @{ $_->get_element() } } @schema[1..$#schema] ) {
$type->_accept( $self );

View File

@@ -1,4 +1,8 @@
package [% interface_prefix %]::[% service.get_name.replace('\.', '::').replace('-', '_') %]::[% port.get_name.replace('^.+\.','').replace('-', '_') %];
[% interface_name = interface_prefix _ '::'
_ service.get_name.replace('\.', '::') _ '::'
_ port.get_name.replace('^.+\.','');
interface_name = interface_name.replace('-','_'); -%]
package [% interface_name %];
use strict;
use warnings;
use Class::Std::Fast::Storable;
@@ -28,18 +32,22 @@ sub START {
[% IF NO_POD; STOP; END %]
__END__
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% pod = BLOCK %]=pod[% END -%]
[% head1 = BLOCK %]=head1[% END -%]
[% head2 = BLOCK %]=head2[% END -%]
[% head3 = BLOCK %]=head3[% END -%]
=pod
[% pod %]
=head1 NAME
[% head1 %] NAME
[% interface_name %] - SOAP Interface for the [% service.get_name %] Web Service
[% interface_prefix %]::[% service.get_name.replace('\.', '::').replace('-', '_') %]::[% port.get_name.replace('\.', '::').replace('-', '_') %] - SOAP Interface for the [% service.get_name %] Web Service
[% head1 %] SYNOPSIS
=head1 SYNOPSIS
use [% interface_prefix %]::[% service.get_name.replace('\.', '::').replace('-', '_') %]::[% port.get_name.replace('\.', '::').replace('-', '_') %];
my $interface = [% interface_prefix %]::[% service.get_name.replace('\.', '::').replace('-', '_') %]::[% port.get_name.replace('\.', '::').replace('-', '_') %]->new();
use [% interface_name %];
my $interface = [% interface_name %]->new();
my $response;
[% FOREACH operation = binding.get_operation;
@@ -47,30 +55,30 @@ __END__
[% END %]
=head1 DESCRIPTION
[% head1 %] DESCRIPTION
SOAP Interface for the [% service.get_name %] web service
located at [% port.first_address.get_location %].
=head1 SERVICE [% service.get_name %]
[% head1 %] SERVICE [% service.get_name %]
[% service.get_documentation %]
=head2 Port [% port.get_name %]
[% head2 %] Port [% port.get_name %]
[% port.get_documentation %]
=head1 METHODS
[% head1 %] METHODS
=head2 General methods
[% head2 %] General methods
=head3 new
[% head3 %] new
Constructor.
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
=head2 SOAP Service methods
[% head2 %] SOAP Service methods
[% INCLUDE Interface/POD/method_info.tt %]
@@ -79,8 +87,8 @@ All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
%][% INCLUDE Interface/POD/Operation.tt %]
[% END %]
=head1 AUTHOR
[% head1 %] AUTHOR
Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %]
=pod
=cut

View File

@@ -1,4 +1,6 @@
=head3 [% operation.get_name %]
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% head3 = BLOCK %]=head3[% END -%]
[% head3 %] [% operation.get_name %]
[% type = definitions.find_portType( binding.expand( binding.get_type ) );
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );

View File

@@ -1,4 +1,8 @@
package [% server_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('^.+\.','') %];
[% server_name = server_prefix _ '::'
_ service.get_name.replace('\.', '::') _ '::'
_ port.get_name.replace('^.+\.','');
server_name = server_name.replace('-','_'); -%]
package [% server_name %];
use strict;
use warnings;
use Class::Std::Fast::Storable;
@@ -23,7 +27,7 @@ my $action_map_ref = {
sub START {
my ($self, $ident, $arg_ref) = @_;
eval "require $transport_class_of{ $ident }"
eval "require $transport_class_of{ $ident }"
or die "Cannot load transport class $transport_class_of{ $ident }: $@";
$transport_of{ $ident } = $transport_class_of{ $ident }->new({
action_map_ref => $action_map_ref,
@@ -41,48 +45,53 @@ sub handle {
[% IF NO_POD; STOP; END %]
__END__
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% pod = BLOCK %]=pod[% END -%]
[% head1 = BLOCK %]=head1[% END -%]
[% head2 = BLOCK %]=head2[% END -%]
[% head3 = BLOCK %]=head3[% END -%]
=pod
[% pod %]
=head1 NAME
[% head1 %] NAME
[% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %] - SOAP Server Class for the [% service.get_name %] Web Service
[% server_name %] - SOAP Server Class for the [% service.get_name %] Web Service
=head1 SYNOPSIS
[% head1 %] SYNOPSIS
use [% server_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %];
my $server = [% server_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %]->new({
use [% server_name %];
my $server = [% server_name %]->new({
dispatch_to => 'My::Handler::Class',
transport_class => 'SOAP::WSDL::Server::CGI', # optional, default
});
$server->handle();
=head1 DESCRIPTION
[% head1 %] DESCRIPTION
SOAP Server handler for the [% service.get_name %] web service
located at [% port.first_address.get_location %].
=head1 SERVICE [% service.get_name %]
[% head1 %] SERVICE [% service.get_name %]
[% service.get_documentation %]
=head2 Port [% port.get_name %]
[% head2 %] Port [% port.get_name %]
[% port.get_documentation %]
=head1 METHODS
[% head1 %] METHODS
=head2 General methods
[% head2 %] General methods
=head3 new
[% head3 %] new
Constructor.
The C<dispatch_to> argument is mandatory. It must be a class or object
The C<dispatch_to> argument is mandatory. It must be a class or object
implementing the SOAP Service methods listed below.
=head2 SOAP Service methods
[% head2 %] SOAP Service methods
[% INCLUDE Server/POD/method_info.tt %]
@@ -90,7 +99,7 @@ implementing the SOAP Service methods listed below.
%][% INCLUDE Server/POD/Operation.tt %]
[% END %]
=head1 AUTHOR
[% head1 %] AUTHOR
Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %]

View File

@@ -1,4 +1,7 @@
=head3 [% operation.get_name %]
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% head3 = BLOCK %]=head3[% END -%]
[% head3 %] [% operation.get_name %]
[% type = definitions.find_portType( binding.expand( binding.get_type ) );
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
@@ -8,8 +11,8 @@ port_op.get_documentation %]
my ($self, $body, $header) = @_;
# body is a ??? object - sorry, POD not implemented yet
# header is a ??? object - sorry, POD not implemented yet
# do something with body and header...
return [% INCLUDE Server/POD/Message.tt %]
}

View File

@@ -3,7 +3,7 @@
#element;
#STOP;
-%]
[% element_prefix %]::[% element.get_name.replace('\.', '::') %]->new([%
[% element_prefix %]::[% element.get_name.replace('\.', '::') %]->new([%
type = element.first_complexType || element.first_simpleType || definitions.first_types.find_type(
element.expand( element.get_type ) );
INCLUDE Interface/POD/Type.tt; %]

View File

@@ -18,13 +18,18 @@ sub get_typemap {
__END__
=pod
__END__
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% pod = BLOCK %]=pod[% END -%]
[% head1 = BLOCK %]=head1[% END -%]
=head1 NAME
[% pod %]
[% head1 %] NAME
[% typemap_prefix %]::[% service.get_name.replace('\.','::').replace('-', '_') %]; - typemap for ::[% service.get_name %];
=head1 DESCRIPTION
[% head1 %] DESCRIPTION
Typemap created by SOAP::WSDL for map-based SOAP message parsers.

View File

@@ -6,20 +6,29 @@ use warnings;
# Don't include any perl source here - there may be sub-packages...
#-%]
package [% type_prefix %]::[% complexType.get_name.replace('\.','::').replace('-','_') %]::_ATTR;
use base qw(SOAP::WSDL::XSD::Typelib::AttributeSet);
[% INCLUDE complexType/attributeSet.tt %]
1;
=pod
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% pod = BLOCK %]=pod[% END -%]
[% head1 = BLOCK %]=head1[% END -%]
[% head2 = BLOCK %]=head2[% END -%]
[% head3 = BLOCK %]=head3[% END -%]
=head1 NAME
[% pod %]
[% head1 %] NAME
[% type_prefix %]::[% complexType.get_name.replace('\.','::').replace('-','_') %]
=head1 DESCRIPTION
[% head1 %] DESCRIPTION
Perl data type class for the XML Schema defined complextype
[% complexType.get_name %] from the namespace [% complexType.get_targetNamespace %].
=head2 PROPERTIES
[% head2 %] PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
@@ -28,15 +37,15 @@ methods:
[% element.get_name %]
[% END %]
=head1 METHODS
[% head1 %] METHODS
=head2 new
[% head2 %] new
Constructor. The following data structure may be passed to new():
[% indent = ' '; INCLUDE complexType/POD/structure.tt %]
=head1 AUTHOR
[% head1 %] AUTHOR
Generated by SOAP::WSDL

View File

@@ -0,0 +1,40 @@
{ # BLOCK to scope variables
[%
FOREACH element = complexType.get_attribute %]
my %[% element.get_name %]_of :ATTR(:get<[% element.get_name %]>);
[%- END %]
__PACKAGE__->_factory(
[ qw([% FOREACH element = complexType.get_attribute %]
[% element.get_name -%]
[% END %]
) ],
{
[% FOREACH element = complexType.get_attribute -%]
[% element.get_name %] => \%[% element.get_name %]_of,
[% END -%]
},
{
[% FOREACH element = complexType.get_attribute;
IF (type = element.get_type);
element_type = complexType.expand( type );
IF (element_type.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
[% element.get_name %] => 'SOAP::WSDL::XSD::Typelib::Builtin::[% element_type.1 %]',
[% ELSE -%]
[% element.get_name %] => '[% type_prefix %]::[% element_type.1 %]',
[% END;
ELSE;
IF (element.first_simpleType);
THROW NOT_IMPLEMENTED , "Attributes with atomic simpleType definition are not implemented yet";
atomic_types.${ element.get_name } = element.first_simpleType;
ELSE;
THROW NOT_IMPLEMENTED , "Neither simple nor complex atomic type - don't know what to do with it";
END; %]
[% element.get_name %] => '[% type_prefix %]::[% complexType.get_name %]::_[% element.get_name %]',
[% END;
END -%]
}
);
} # end BLOCK

View File

@@ -17,45 +17,65 @@ use base qw(
SOAP::WSDL::XSD::Typelib::Element
[% INCLUDE _type_class.tt( type = type, node = element ) %]
);
}
[%- ELSIF (ref = element.get_ref); -%]
# element ref="[% ref %]"
use base qw(
[% element_prefix %]::[% ref.split(':').1 %]
);
}
[%- ELSIF (simpleType = element.first_simpleType) %]
# atomic simpleType: <element><simpleType
use base qw(
SOAP::WSDL::XSD::Typelib::Element
);
[% INCLUDE simpleType/contentModel.tt %]
[% INCLUDE simpleType/contentModel.tt -%]
}
[% ELSIF (complexType = element.first_complexType) %]
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
[% INCLUDE complexType/contentModel.tt;
END %]
[% INCLUDE complexType/contentModel.tt -%]
}
package [% element_prefix %]::[% element.get_name.replace('\.','::').replace('-','_') %]::_ATTR;
use base qw(SOAP::WSDL::XSD::Typelib::AttributeSet);
[% INCLUDE complexType/attributeSet.tt %]
[% ELSE %]
} # end of BLOCK
[% END %]
1;
# __END__
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% pod = BLOCK %]=pod[% END -%]
[% head1 = BLOCK %]=head1[% END -%]
[% head2 = BLOCK %]=head2[% END -%]
[% head3 = BLOCK %]=head3[% END -%]
=pod
[% pod %]
=head1 NAME
[% head1 %] NAME
[% element_prefix %]::[% element.get_name %]
=head1 DESCRIPTION
[% head1 %] DESCRIPTION
Perl data type class for the XML Schema defined element
[% element.get_name %] from the namespace [% element.get_targetNamespace %].
=head1 METHODS
[% head1 %] METHODS
=head2 new
[% head2 %] new
my $element = [% element_prefix %]::[% element.get_name %]->new($data);
@@ -63,7 +83,7 @@ Constructor. The following data structure may be passed to new():
[% indent = ' '; INCLUDE element/POD/structure.tt; %]
=head1 AUTHOR
[% head1 %] AUTHOR
Generated by SOAP::WSDL

View File

@@ -11,11 +11,18 @@ sub get_xmlns { '[% simpleType.get_targetNamespace %]'};
1;
=pod
__END__
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% pod = BLOCK %]=pod[% END -%]
[% head1 = BLOCK %]=head1[% END -%]
[% head2 = BLOCK %]=head2[% END -%]
[% head3 = BLOCK %]=head3[% END -%]
=head1 [% type_prefix %]::[% simpleType.get_name.replace('\.','::').replace('-','_') %]
[% pod %]
=head1 DESCRIPTION
[% head1 %] [% type_prefix %]::[% simpleType.get_name.replace('\.','::').replace('-','_') %]
[% head1 %] DESCRIPTION
Perl data type class for the XML Schema defined simpleType
[% simpleType.get_name %] from the namespace [% simpleType.get_targetNamespace %].
@@ -28,17 +35,17 @@ ELSE;
THROW NOT_IMPLEMENTED "simpleType union not implemented yet in $simpleType.get_name";
END %]
=head1 METHODS
[% head1 %] METHODS
=head2 new
[% head2 %] new
Constructor.
=head2 get_value / set_value
[% head2 %] get_value / set_value
Getter and setter for the simpleType's value.
=head1 OVERLOADING
[% head1 %] OVERLOADING
Depending on the simple type's base type, the following operations are overloaded
@@ -48,7 +55,7 @@ Depending on the simple type's base type, the following operations are overloade
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR
[% head1 %] AUTHOR
Generated by SOAP::WSDL

View File

@@ -48,7 +48,7 @@ SOAP::WSDL::Generator::Visitor - SOAP::WSDL's Visitor-based Code Generator
=head1 DESCRIPTION
SOAP::WSDL featores a code generating facility. This code generation facility
SOAP::WSDL features a code generating facility. This code generation facility
(in fact there are several of them) is implemented as Visitor to
SOAP::WSDL::Base-derived objects.
@@ -186,8 +186,8 @@ mimicing .NET's .asmx example pages.
=back
All these behaviours could well (and has historically been) implemented in the
classes holding the WSDL data. This made these classes rather bloated, and
All these behaviours could well be (and have historically been) implemented in
the classes holding the WSDL data. This made these classes rather bloated, and
made it hard to change behaviour (like, supporting SOAP Headers,
supporting atomic types and other features which were missing from early
versions of SOAP::WSDL).

View File

@@ -245,7 +245,7 @@ sub visit_XSD_ComplexType {
if ( grep { $_ eq $content_model} qw(all sequence choice) )
{
# visit child elements
for (@{ $type->get_element() }) {
for (@{ $type->get_element() || [] }) {
$_->_accept( $self );
}
return;

View File

@@ -111,7 +111,7 @@ included perldoc will be, too - if not, blame the web service author.
print $result;
The above handling of errors ("die $result if not $result") may look a bit
strange - it is due to the nature of the
strange - it is due to the nature of the
L<SOAP::WSDL::SOAP::Typelib::Fault11|SOAP::WSDL::SOAP::Typelib::Fault11>
objects SOAP::WSDL uses for signalling failure.
@@ -232,7 +232,7 @@ L<SOAP::WSDL::Manual::Parser> will tell you how to create a typemap class.
=head1 Creating a SOAP Server
Creating a SOAP server works just like creating a client - just add the
Creating a SOAP server works just like creating a client - just add the
C<--server> or C<-s> option to the call to C<wsdl2perl.pl>.
perl wsdl2perl.pl -s -b BASE_DIR URL

View File

@@ -84,7 +84,7 @@ SOAP::WSDL::Expat::MessageParser allows the use of XML Declarations.
the soap:Body element.
SOAP::WSDL::Serializer::SOAP11 does not emit children of soap:Envelope following
the soap:Body element. Other serializers may behave differentls.
the soap:Body element. Other serializers may behave different.
=head2 R1012
@@ -302,6 +302,73 @@ SOAP::WSDL::Expat::MessageParser checks the namespace of the SOAP envelope.
SOAP::WSDL::Expat::MessageParser does not check that Envelope is the root
element, yet.
=head2 R1110
An INSTANCE MAY accept connections on TCP port 80 (HTTP)
SOAP::WSDL::Server::CGI may be used in a web server listening at port 80.
=head2 R1124
An INSTANCE MUST use a 2xx HTTP status code for responses that
indicate a successful outcome of a request.
SOAP::WSDL::Server::CGI sends a 2xx HTTP status code for successful requests.
=head2 R1111
An INSTANCE SHOULD use a "200 OK" HTTP status code for responses
that contain a SOAP message that is not a SOAP fault.
SOAP::WSDL::Server::CGI does this.
=head2 R1112
An INSTANCE SHOULD use either a "200 OK" or "202 Accepted" HTTP
status code for a response that does do not contain a SOAP message
but indicates successful HTTP outcome of a request.
SOAP::WSDL::Server::CGI does this.
=head2 R1130
An INSTANCE MUST use HTTP status code "307 Temporary Redirect"
when redirecting a request to a different endpoint.
SOAP::WSDL::Server::CGI has no means of redirecting. The web server running
a SOAP::WSDL::Server::CGI script is responsible for redirecting with a 307
HTTP status code.
=head2 R1125
An INSTANCE MUST use a 4xx HTTP status code for responses that indicate
a problem with the format of the request.
SOAP::WSDL does this.
=head2 R1113
An INSTANCE SHOULD use a "400 Bad Request "HTTP status code, if the
request message is a malformed HTTP request, or not well-formed XML.
SOAP::WSDL does this.
=head2 R1114
An INSTANCE SHOULD use a "405 Method not Allowed" HTTP status code if the
request method was not "POST".
SOAP::WSDL does this.
=head2 R1115
An INSTANCE SHOULD use a "415 Unsupported Media Type" HTTP status code if
the Content-Type HTTP request header did not have a value consistent with
the value specified for the corresponding binding of the input message.
SOAP::WSDL::Server::CGI does not support any content type other than text/xml
and application/xml yet.
=head1 RULES NOT CONFIRMED
@@ -310,7 +377,7 @@ element, yet.
A RECEIVER MUST accept messages that include the Unicode Byte Order Mark
(BOM).
May automatically work with XML::Parser::Expat, but is not testet yet.
May automatically work with XML::Parser::Expat, but is not tested yet.
TODO write test. If not confirmed, add encoding support.
@@ -339,6 +406,8 @@ TODO add processing of arbitrary attributes to SOAP::WSDL::SOAP::Typelib::Fault1
A RECEIVER MUST accept fault messages that carry an xml:lang attribute on
the faultstring element.
SOAP::WSDL::Expat::MessageParser currently ignores all attributes.
TODO add processing of the xml:lang attribute to SOAP::WSDL::SOAP::Typelib::Fault11
=head2 R1007
@@ -555,94 +624,37 @@ SOAP::WSDL does not check mandatory header blocks yet.
SOAP::WSDL does not check mandatory header blocks yet.
=head2 R1110
An INSTANCE MAY accept connections on TCP port 80 (HTTP)
SOAP::WSDL does not act as server yet.
=head2 R1124
An INSTANCE MUST use a 2xx HTTP status code for responses that
indicate a successful outcome of a request.
SOAP::WSDL does not act as server yet.
=head2 R1111
An INSTANCE SHOULD use a "200 OK" HTTP status code for responses
that contain a SOAP message that is not a SOAP fault.
SOAP::WSDL does not act as server yet.
=head2 R1112
An INSTANCE SHOULD use either a "200 OK" or "202 Accepted" HTTP
status code for a response that does do not contain a SOAP message
but indicates successful HTTP outcome of a request.
SOAP::WSDL does not act as server yet.
=head2 R1130
An INSTANCE MUST use HTTP status code "307 Temporary Redirect"
when redirecting a request to a different endpoint.
SOAP::WSDL does not act as server yet.
=head2 R1125
An INSTANCE MUST use a 4xx HTTP status code for responses that indicate
a problem with the format of the request.
SOAP::WSDL does not act as server yet.
=head2 R1113
An INSTANCE SHOULD use a "400 Bad Request "HTTP status code, if the
request message is a malformed HTTP request, or not well-formed XML.
SOAP::WSDL does not act as server yet.
=head2 R1114
An INSTANCE SHOULD use a "405 Method not Allowed" HTTP status code if the
request method was not "POST".
SOAP::WSDL does not act as server yet.
=head2 R1115
An INSTANCE SHOULD use a "415 Unsupported Media Type" HTTP status code if
the Content-Type HTTP request header did not have a value consistent with
the value specified for the corresponding binding of the input message.
SOAP::WSDL does not act as server yet.
=head2 R1120
An INSTANCE MAY use the HTTP state mechanism ("Cookies").
SOAP::WSDL does not act as server yet.
SOAP::WSDL::Server::CGI does not use cookies. A web server running a
SOAP::WSDL::Server::CGI script may use cookies..
=head2 R1122
An INSTANCE using Cookies SHOULD conform to RFC2965.
SOAP::WSDL does not act as server yet.
SOAP::WSDL::Server::CGI does not use cookies. A web server running a
SOAP::WSDL::Server::CGI script may use cookies..
=head2 R1121
An INSTANCE SHOULD NOT require consumer support for Cookies in order to
function correctly
SOAP::WSDL does not act as server yet.
SOAP::WSDL::Server::CGI does not use cookies. A web server running a
SOAP::WSDL::Server::CGI script may use cookies.
=head2 R1123
The value of the cookie MUST be considered to be opaque by the CONSUMER.
SOAP::WSDL does not act as server yet.
SOAP::WSDL::Server::CGI does not use cookies. A web server running a
SOAP::WSDL::Server::CGI script may use cookies.
=head2 R2028
@@ -1237,9 +1249,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 391 $
$Rev: 478 $
$LastChangedBy: kutterma $
$Id: WS_I.pod 391 2007-11-17 21:56:13Z kutterma $
$Id: WS_I.pod 478 2007-12-27 14:15:01Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/WS_I.pod $
=cut

View File

@@ -24,12 +24,12 @@ You can use SOAP::WSDL::XSD based classes just like any perl class - you may
instantiate it, inherit from it etc.
You should be aware, that SOAP::WSDL::XSD based classes are inside-out
classes using Class::Std, though - things you would expect from hash-based
classes like using the blessed hash ref as data storage won't work.
classes using Class::Std::Fast, though - things you would expect from
hash-based classes like using the blessed hash ref as data storage won't work.
Moreover, most all SOAP::WSDL::XSD::Typelib based classes override
Class::Std's default constructor for speed - you should not expect BUILD or
START methods to work, unless you call them yourself (or define a new
Class::Std::Fast's default constructor for speed - you should not expect
BUILD or START methods to work, unless you call them yourself (or define a new
constructor).
All SOAP::WSDL::XSD based complexType classes allow a hash ref matching their
@@ -40,11 +40,15 @@ will work fine.
All SOAP::WSDL::XSD based simpleType (and builtin) classes accept a single
hash ref with the only key "value" and the value to be set as value.
=head2 Conversions
=head3 Array dereference
All SOAP::WSDL::XSD based classes overload arrayification - that is being
accessed as a list ref - with a method returning [ $self ].
This means that you can safely use the results of get_ELEMENT calls on
cmplexTypes as list refs (you'll have to check for definedness, though -
complexTypes as list refs (you'll have to check for definedness, though -
see L<SOAP::WSDL::XSD::Typelib::Builtin|SOAP::WSDL::XSD::Typelib::Builtin>
for details.
@@ -65,6 +69,32 @@ L<HTML::Template::Compiled|HTML::Template::Compiled>, where you could say
<%/LOOP>
<%IF%>
Note that this does not work in HTML::Template::Compiled yet - the code
generated for the template checks UNIVERSAL::isa instead of dereferencing.
There's a ticket open in HTC to solve the issue.
=head3 as_hash_ref
SOAP::WSDL::XSD::Typelib::ComplexType based objects have a method as_hash_ref,
which returns the object's content as a hash reference.
This can be convenient for cloning:
my $class = ref $old;
my $clone = $class->new( $old->as_hash_ref() );
To convert from one type to another, you
can just say
my $new = MyTypes::NewType->new( $old->as_hash_ref() );
Of course this will only work if MyTypes::NewType has a superset of the old
object class' elements.
.
Future versions will restrict the data returned to the child element's data -
you should not expect XML attributes to be returned through hash refs.
=head1 HOW IT WORKS
=head2 Base classes
@@ -277,8 +307,34 @@ the correspondent classes.
=head1 ATTRIBUTES
XML attributes are not implemented yet. If you have a good idea on how to
implement them, feel free to email me a proposal.
XML attributes are not implemented yet. The documentation below sketches
how XML attributes will be implemented in the future.
All XML attributes are derived from SOAP::WSDL::XSD::Typelib::Attribute.
The attribute set for a XML element (derived from anySimpleType or
complexType) is implemented as a sub-package of the element derived from
SOAP::WSDL::XSD::Typelib::AttributeSet.
The sub-package is named as the top package, suffixed with C<_ATTR>.
All XML attributes for a XML element are set- and retrievable via the method
C<attr>. The name is chosen to allow mimicing SOAP::Lite's behaviour, which
allows setting a SOAP::Data object's attributes via C<attr>.
my $attrSet = $obj->attr();
$obj->attr({
whitespace => 'preserve',
nillable => 1,
});
SOAP::WSDL::XSD::Typelib::AttributeSet is derived from
SOAP::WSDL::XSD::Typelib::ComplexType with content model C<all>. The
individual attributes can be set and retrieved via the respective set_FOO /
get_FOO methods.
The C<attr> method provides auto-vivification: An xml object's attribute set
is instantiated when accessed.
=head1 CAVEATS
@@ -286,7 +342,7 @@ implement them, feel free to email me a proposal.
=item * START and BUILD are not being called
In contrast to "normal" Class::Std based objects, the classes of the
In contrast to "normal" Class::Std::Fast based objects, the classes of the
SOAP::WSDL::XSD::Typelib:: hierarchy (and all type and element classes
generated by SOAP::WSDL) override Class::Std's constructor for performance
reasons.
@@ -295,10 +351,10 @@ If you inherit from such a class and place a START or BUILD method in it,
it will not get called - at least not unless you place something like this
at the top of you code:
use Class::Std::Storable;
use Class::Std::Fast::Storable;
In this case, Class::Std::Storable will export a new() method into your class,
which in turn calls START and BUILD.
In this case, Class::Std::Fast::Storable will export a new() method into your
class, which in turn calls START and BUILD.
The constructors of all SOAP::WSDL::XSD::Typelib:: classes don't !

View File

@@ -4,7 +4,7 @@ use strict;
use warnings;
use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
our $VERSION=q{2.00_25};
our $VERSION=q{2.00_27};
my $SOAP_NS = 'http://schemas.xmlsoap.org/soap/envelope/';
my $XML_INSTANCE_NS = 'http://www.w3.org/2001/XMLSchema-instance';
@@ -62,10 +62,10 @@ sub serialize_body {
return join ( q{},
"<$opt->{ namespace }->{ $SOAP_NS }\:Body>",
defined $data
? ref $data eq 'ARRAY'
? ref $data eq 'ARRAY'
? join q{}, map { blessed $_ ? $_->serialize_qualified() : () } @{ $data }
: blessed $data
? $data->serialize_qualified
: blessed $data
? $data->serialize_qualified()
: ()
: (),
"</$opt->{ namespace }->{ $SOAP_NS }\:Body>",
@@ -119,9 +119,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 444 $
$Rev: 477 $
$LastChangedBy: kutterma $
$Id: XSD.pm 444 2007-12-07 20:04:06Z kutterma $
$Id: XSD.pm 477 2007-12-24 10:23:52Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Serializer/XSD.pm $
=cut

View File

@@ -6,7 +6,7 @@ use Scalar::Util qw(blessed);
use SOAP::WSDL::Factory::Deserializer;
use SOAP::WSDL::Factory::Serializer;
our $VERSION = q{2.00_25};
our $VERSION = q{2.00_27};
my %dispatch_to_of :ATTR(:name<dispatch_to> :default<()>);
my %action_map_ref_of :ATTR(:name<action_map_ref> :default<{}>);
@@ -28,7 +28,7 @@ sub handle {
soap_version => '1.1'
});
# TODO: factor out dispatcher logic into dispatcher factory + dispatcher
# TODO: factor out dispatcher logic into dispatcher factory + dispatcher
# classes
# $dispatcher_of{ $ident } ||= SOAP::WSDL::Factory::Dispatcher->get_dispatcher({});
@@ -143,12 +143,12 @@ SOAP::WSDL::Server basically follows the architecture sketched below
| Handler |
-------------------------------------
All of the components (Transport class, deserializer, dispatcher and
All of the components (Transport class, deserializer, dispatcher and
serializer) are implemented as plugins.
The architecture is not implemented as planned yet, but the dispatcher is
The architecture is not implemented as planned yet, but the dispatcher is
currently part of SOAP::WSDL::Server, which aggregates serializer and
deserializer, and is subclassed by transport classes (of which
deserializer, and is subclassed by transport classes (of which
SOAP::WSDL::Server::CGI is the only implemented one yet).
The dispatcher is currently based on the SOAPAction header. This does not

View File

@@ -12,13 +12,13 @@ use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Server);
our $VERSION=q{2.00_26};
our $VERSION=q{2.00_27};
# mostly copied from SOAP::Lite. Unfortunately we can't use SOAP::Lite's CGI
# server directly - we would have to swap out it's base class...
#
# This should be a warning for us: We should not handle methods via inheritance,
# but via some plugin mechanism, to allow alternative handlers to be plugge
# but via some plugin mechanism, to allow alternative handlers to be plugged
# in.
sub handle {
@@ -26,7 +26,7 @@ sub handle {
my $response;
my $length = $ENV{'CONTENT_LENGTH'} || 0;
if (!$length) {
if (!$length) {
$response = HTTP::Response->new(411); # LENGTH REQUIRED
$self->_output($response);
return;
@@ -37,7 +37,7 @@ sub handle {
}
my $content = q{};
my $buffer;
my $buffer;
binmode(STDIN);
while (read(STDIN,$buffer,$length - length($content))) {
$content .= $buffer;
@@ -47,10 +47,10 @@ sub handle {
$ENV{'REQUEST_METHOD'} || '' => $ENV{'SCRIPT_NAME'},
HTTP::Headers->new(
map {
(/^HTTP_(.+)/i
? ($1=~m/SOAPACTION/)
(/^HTTP_(.+)/i
? ($1=~m/SOAPACTION/)
?('SOAPAction')
:($1)
:($1)
: $_
) => $ENV{$_}
} keys %ENV),
@@ -93,15 +93,14 @@ sub _output :PRIVATE {
my ($self, $response) = @_;
# imitate nph- cgi for IIS (pointed by Murray Nesbitt)
my $status = defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/
? $ENV{SERVER_PROTOCOL} || 'HTTP/1.0'
? $ENV{SERVER_PROTOCOL} || 'HTTP/1.0'
: 'Status:';
my $code = $response->code;
binmode(STDOUT);
binmode(STDOUT);
print STDOUT "$status $code ", HTTP::Status::status_message($code)
, "\015\012", $response->headers_as_string("\015\012")
, "\015\012", $response->content;
}
1;

View File

@@ -2,6 +2,8 @@ package SOAP::WSDL::TypeLookup;
use strict;
use warnings;
our $VERSION=q{2.00_29};
my %TYPES = (
# wsdl:
'http://schemas.xmlsoap.org/wsdl/' => {
@@ -86,7 +88,8 @@ my %TYPES = (
class => 'SOAP::WSDL::XSD::Schema',
},
attribute => {
type => 'SKIP' # not implemented yet
type => 'CLASS',
class => 'SOAP::WSDL::XSD::Attribute' # not implemented yet
},
attributeGroup => {
type => 'SKIP', # not implemented yet

View File

@@ -0,0 +1,34 @@
package SOAP::WSDL::XSD::Attribute;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::Base);
our $VERSION=q{2.00_29};
#<attribute
# default = string
# fixed = string
# form = (qualified | unqualified)
# id = ID
# name = NCName
# ref = QName
# type = QName
# use = (optional | prohibited | required) : optional
# {any attributes with non-schema namespace . . .}>
# Content: (annotation?, (simpleType?))
#</attribute>
my %default_of :ATTR(:name<default> :default<()>);
my %fixed_of :ATTR(:name<fixed> :default<()>);
my %form_of :ATTR(:name<form> :default<()>);
# id provided by Base
# name provided by Base
my %type_of :ATTR(:name<type> :default<()>);
my %use_of :ATTR(:name<use> :default<()>);
# may be defined as atomic simpleType
my %simpleType_of :ATTR(:name<simpleType> :default<()>);
1;

View File

@@ -9,6 +9,7 @@ use base qw/SOAP::WSDL::Base/;
our $VERSION=q{2.00_25};
my %annotation_of :ATTR(:name<annotation> :default<()>);
my %attribute_of :ATTR(:name<attribute> :default<()>);
my %element_of :ATTR(:name<element> :default<()>);
my %flavor_of :ATTR(:name<flavor> :default<()>);
my %base_of :ATTR(:name<base> :default<()>);

View File

@@ -0,0 +1,17 @@
package SOAP::WSDL::XSD::Typelib::Attribute;
use strict;
use warnings;
use base qw(SOAP::WSDL::XSD::Typelib::Element);
sub start_tag {
# my ($self, $opt, $value) = @_;
return q{} if (@_ < 3);
return qq{ $_[1]->{ name }="}
}
sub end_tag {
return q{"};
}
1;

View File

@@ -0,0 +1,14 @@
package SOAP::WSDL::XSD::Typelib::AttributeSet;
use strict;
use warnings;
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
sub serialize {
# we work on @_ for performance.
$_[1] ||= {}; # $option_ref
return ${ $_[0]->_serialize({ attr => 1 }) };
}
1;

View File

@@ -409,11 +409,11 @@ Replace whitespace by @ in e-mail address.
Martin Kutter E<gt>martin.kutter fen-net.deE<lt>
=head1 Licenxe
=head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter.
This library is free software, you may distribute/modify it under the
This file is part of SOAP-WSDL. You may distribute/modify it under the
same terms as perl itself
=cut

View File

@@ -3,14 +3,17 @@ use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
our $VERSION = q{2.00_29};
sub get_xmlns { 'http://www.w3.org/2001/XMLSchema' };
# use $_[1] for performance
sub start_tag {
return q{} if not $#_; # return if no second argument ($opt)
if ($_[1]->{ name }) {
return "<$_[1]->{name} />" if $_[1]->{ empty };
return "<$_[1]->{name} >";
return qq{ $_[1]->{name}="} if $_[1]->{ attr };
return "<$_[1]->{name}/>" if $_[1]->{ empty };
return "<$_[1]->{name}>";
}
return q{};
}
@@ -18,10 +21,14 @@ sub start_tag {
# use $_[1] for performance
sub end_tag {
return $_[1] && defined $_[1]->{ name }
? "</$_[1]->{name} >"
? $_[1]->{ attr }
? q{"}
: "</$_[1]->{name}>"
: q{};
};
sub serialize_attr {};
sub serialize { q{} };
sub serialize_qualified :STRINGIFY {

View File

@@ -3,6 +3,7 @@ use strict;
use warnings;
use Date::Parse;
use Date::Format;
use Time::Zone;
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
@@ -16,13 +17,17 @@ sub set_value {
[\+\-] \d{2} \: \d{2} $
}xms
);
no warnings qw(uninitialized);
# strptime sets empty values to undef - and strftime doesn't like that...
my @time_from = map { ! defined $_ ? 0 : $_ } strptime($_[1]);
undef $time_from[$#time_from];
my $time_str = strftime( '%Y-%m-%dT%H:%M:%S%z', @time_from );
my $time_str = do { # no warnings;
strftime( '%Y-%m-%dT%H:%M:%S%z', @time_from );
};
# insert : in timezone info
substr $time_str, -2, 0, ':';
$_[0]->SUPER::set_value($time_str);
}

View File

@@ -9,7 +9,7 @@ require Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anyType);
our $VERSION = '2.00_25';
our $VERSION = '2.00_29';
my %ELEMENTS_FROM;
my %ATTRIBUTES_OF;
@@ -39,6 +39,26 @@ sub AUTOMETHOD {
. "\n"
}
# Attribute handling
my %xml_attr_of :ATTR();
sub attr {
my $self = shift;
my $class = ref $self;
die "$class has no attributes" if not defined %{ "$class\::_ATTR::"};
if (@_) {
# setter
return $xml_attr_of{ $$self } = "$class\::_ATTR"->new(@_);
}
return $xml_attr_of{ $$self } if exists $xml_attr_of{ $$self };
return $xml_attr_of{ $$self } = "$class\::_ATTR"->new();
}
sub serialize_attr {
return q{} if not $xml_attr_of{ ${ $_[0] } };
$_[0]->attr()->serialize();
}
sub as_hash_ref {
my $self = shift;
my $attributes_ref = $ATTRIBUTES_OF{ ref $self };
@@ -128,6 +148,10 @@ sub _factory {
# lists but don't do yet - oh my !
*{ "$class\::set_$name" } = sub {
if (not $#_) {
delete $attribute_ref->{ ${ $_[0] } };
return;
};
my $is_ref = ref $_[1];
$attribute_ref->{ ${ $_[0] } } = ($is_ref)
? ($is_ref eq 'ARRAY')
@@ -177,10 +201,6 @@ sub _factory {
push @{ $attribute_ref->{ ${ $_[0]} } }, $_[1];
return;
};
# TODO: remove this alias - we don't use it, and it's pretty much
# misleading...
*{ "$class\::$name" } = *{ "$class\::add_$name" };
}
# TODO Could be moved as normal method into base class, e.g. here.
@@ -202,7 +222,7 @@ sub _factory {
}
: $_ =~ m{ \A # beginning of string
xmlns # xmlns
}xms
}xms # get_elements is inlined for performance.
? do {}
: do { use Data::Dumper;
croak "unknown field $_ in $class. Valid fields are:\n"
@@ -212,23 +232,25 @@ sub _factory {
return $self;
};
# this serialize method works fine for <all> and <sequence>
# this _serialize method works fine for <all> and <sequence>
# complextypes, as well as for <restriction><all> or
# <restriction><sequence>.
# <restriction><sequence>, and attribute sets.
#
# But what about choice, extension ?
#
# Triggers XML attribute serialization if the options hash ref contains
# a attr element with a true value.
*{ "$class\::_serialize" } = sub {
my $ident = ${ $_[0]};
my $option_ref = $_[1];
# return concatenated return value of serialize call of all
# elements retrieved from get_elements expanding list refs.
# get_elements is inlined for performance.
return join q{} , map {
return \join q{} , map {
my $element = $ATTRIBUTES_OF{ $class }->{ $_ }->{ $ident };
# do we have some content
if (defined $element) {
$element = [ $element ]
if not ref $element eq 'ARRAY';
$element = [ $element ] if not ref $element eq 'ARRAY';
my $name = $_;
map {
@@ -240,9 +262,9 @@ sub _factory {
# serialize complextype elments (of other types) with their
# serializer, but add element tags around.
else {
join q{}, $_->start_tag({ name => $name })
join q{}, $_->start_tag({ name => $name , %{ $option_ref } })
, $_->serialize()
, $_->end_tag({ name => $name });
, $_->end_tag({ name => $name , %{ $option_ref } });
}
} @{ $element }
}
@@ -251,17 +273,20 @@ sub _factory {
}
} (@{ $ELEMENTS_FROM{ $class } });
};
}
*{ "$class\::serialize" } = sub {
$_[1] ||= {}; # maybe even replace by assigning a constant var
sub serialize {
# we work on @_ for performance.
$_[1] ||= {}; # $option_ref
# do we have a empty element ?
return $_[0]->start_tag({ %{ $_[1] }, empty => 1 })
if not defined $ELEMENTS_FROM{ $class } or not @{ $ELEMENTS_FROM{ $class } };
return join q{}, $_[0]->start_tag($_[1]),
$_[0]->_serialize(), $_[0]->end_tag();
}
# get content first (pass by reference to avoid copying)
my $content_ref = $_[0]->_serialize($_[1]); # option_ref
# do we have a empty element ?
return $_[0]->start_tag({ %{ $_[1] }, empty => 1 })
if not length ${ $content_ref };
return join q{}, $_[0]->start_tag($_[1]), ${ $content_ref }, $_[0]->end_tag();
}
1;
@@ -281,24 +306,24 @@ To subclass, write a package like this:
package MyComplexType;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
# we only need the :get attribute qualifier.
# set and init_arg are automatically created by
# SOAP::WSDL::XSD::Typelib::ComplexType
my %first_attr_of :ATTR(:get<first_attr> :default<()>);
my %second_attr_of :ATTR(:get<second_attr> :default<()>);
my %third_attr_of :ATTR(:get<third_attr> :default<()>);
# the order of elements in a complexType
my @elements_from = qw(first_attr second_attr third_attr);
# references to the private hashes
my %attribute_of = (
first_attr => \%first_attr_of,
second_attr => \%second_attr_of,
third_attr => \%third_attr_of,
);
# classes_of: Classes the child elements should be of
my %classes_of = (
first_attr => 'My::FirstElement',
@@ -339,14 +364,14 @@ complain, too.
Examples:
my $obj = MyClass->new({ MyName => $value });
my $obj = MyClass->new({
MyName => {
DeepName => $value,
},
MySecondName => $value,
});
my $obj = MyClass->new({
MyName => [
{ DeepName => $value },
@@ -380,6 +405,13 @@ This means you may set element properties by passing
Examples are similar to the examples provided for new() above.
Note that you cannot delete a property by setting it to undef - this sets
the property to a empty property object (with vaue undef).
To delete a property, say
$obj->set_FOO();
=head2 as_hash_ref
Returns a hash ref representation of the complexType object
@@ -412,10 +444,10 @@ No facets are implemented yet.
=head1 LICENSE AND COPYRIGHT
Copyright (c) 2007 Martin Kutter. All rights reserved.
Copyright 2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself.
This file is part of SOAP-WSDL. You may distribute/modify it under the same
terms as perl itself
=head1 AUTHOR
@@ -423,9 +455,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 452 $
$Rev: 497 $
$LastChangedBy: kutterma $
$Id: ComplexType.pm 452 2007-12-12 14:46:54Z kutterma $
$Id: ComplexType.pm 497 2008-01-19 12:57:57Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm $
=cut

View File

@@ -1,8 +1,9 @@
#!/usr/bin/perl
package SOAP::WSDL::XSD::Typelib::Element;
use Class::Std::Fast::Storable constructor => 'none';
use strict;
our $VERSION=q{2.00_25};
our $VERSION=q{2.00_29};
my %NAME;
my %NILLABLE;
@@ -37,6 +38,7 @@ BLOCK: {
}
};
# use $_[0] and $_[1] for speed.
sub start_tag {
@@ -46,17 +48,18 @@ sub start_tag {
if ($_[1]->{ nil }) {
return q{} if not $NILLABLE{ ref $_[0] };
push @attr_from, 'xsi:nil="true"';
push @attr_from, q{ xsi:nil="true"};
$ending = '/>';
}
if ($_[1]->{qualified}) {
push @attr_from, 'xmlns="' . $_[0]->get_xmlns . '"';
push @attr_from, q{ xmlns="} . $_[0]->get_xmlns() . q{"};
}
push @attr_from, $_[0]->serialize_attr();
# do we need to check for name ? Element ref="" should have it's own
# start_tag. If we don't need to check, we can speed things up
return join q{ }, "<$_[1]->{ name }" , @attr_from , $ending if $_[1]->{ name };
return join q{ }, "<$NAME{ ref $_[0]}" , @attr_from , $ending;
return join q{}, "<$_[1]->{ name }" , @attr_from , $ending if $_[1]->{ name };
return join q{}, "<$NAME{ ref $_[0]}" , @attr_from , $ending;
}
# use $_[0] and $_[1] for speed.
@@ -159,4 +162,24 @@ namespace combination (Default for SOAP::WSDL::Envelope).
=back
=head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under the same
terms as perl itself
=head1 AUTHOR
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 497 $
$LastChangedBy: kutterma $
$Id: Element.pm 497 2008-01-19 12:57:57Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Typelib/Element.pm $
=cut

View File

@@ -116,15 +116,23 @@ No facets are implemented yet.
=back
=head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under the same
terms as perl itself
=head1 AUTHOR
Replace whitespace by @ in e-mail address.
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
Martin Kutter E<gt>martin.kutter fen-net.deE<lt>
=head1 REPOSITORY INFORMATION
=head1 COPYING
This library is free software, you may distribute/modify it under the
same terms as perl itself
$Rev: 477 $
$LastChangedBy: kutterma $
$Id: SimpleType.pm 477 2007-12-24 10:23:52Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm $
=cut

44
patches/Manual.diff Normal file
View File

@@ -0,0 +1,44 @@
--- Manual.pod-orig 2007-12-04 00:45:33.000000000 -0500
+++ Manual.pod 2007-12-04 00:53:12.000000000 -0500
@@ -37,7 +37,7 @@
objects based on SOAP::WSDL's XML schema implementation.
To access the object's properties use get_NAME / set_NAME getter/setter
-methods whith NAME corresponding to the XML tag name / the hash structure as
+methods with NAME corresponding to the XML tag name / the hash structure as
showed in the generated pod.
=item * Run script
@@ -91,7 +91,7 @@
There should be a bunch of classes for types (in the MyTypes:: namespace by
default), elements (in MyElements::), and at least one typemap (in
-MyTypemaps::) and one ore more interface classes (in MyInterfaces::).
+MyTypemaps::) and one or more interface classes (in MyInterfaces::).
If you don't already know the details of the web service you're going to
instrument, it's now time to read the perldoc of the generated interface
@@ -111,7 +111,7 @@
print $result;
The above handling of errors ("die $result if not $result") may look a bit
-strange - it is due to the nature of
+strange - it is due to the nature of the
L<SOAP::WSDL::SOAP::Typelib::Fault11|SOAP::WSDL::SOAP::Typelib::Fault11>
objects SOAP::WSDL uses for signalling failure.
@@ -144,12 +144,12 @@
only implement a few by hand. These (precious) few classes may get lost in
the mass of (cheap) generated ones. Just imagine one of your co-workers (or
even yourself) deleting the whole bunch and re-generating everything - oops
-- almost everything. You got the point.
+- almost everything. You get the point.
For simplicity, you probably just want to use builtin types wherever possible
- you are probably not interested in whether a fault detail's error code is
presented to you as a simpleType ranging from 1 to 10 (which you have to
-write) or as a int (which is a builtin type ready to use).
+write) or as an int (which is a builtin type ready to use).
Using builtin types for simpleType definitions may greatly reduce the number
of additional classes you need to implement.

View File

@@ -12,7 +12,7 @@ use_ok qw( MyElement );
my $obj = MyElement->new({ value => 'test'});
ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType')
, 'inherited class';
is $obj->serialize_qualified(), '<MyElementName xmlns="urn:Test" >test</MyElementName>', 'stringification';
is $obj->serialize_qualified(), '<MyElementName xmlns="urn:Test">test</MyElementName>', 'stringification';
$obj = MyAtomicComplexTypeElement->new({ test=> 'Test', test2 => 'Test2'});
ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
@@ -21,8 +21,8 @@ ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
ok $obj->get_test->isa('SOAP::WSDL::XSD::Typelib::Builtin::string')
, 'element isa';
is $obj->serialize_qualified, '<MyAtomicComplexTypeElement xmlns="urn:Test" ><test >Test</test>'
. '<test2 >Test2</test2></MyAtomicComplexTypeElement>'
is $obj->serialize_qualified, '<MyAtomicComplexTypeElement xmlns="urn:Test"><test>Test</test>'
. '<test2>Test2</test2></MyAtomicComplexTypeElement>'
, 'stringification';
$obj = MyElement->new({ value => undef});
@@ -34,14 +34,14 @@ ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType')
$obj = MyAtomicComplexTypeElement->new({ test=> 'Test', test2 => [ 'Test2', 'Test3' ]});
ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
, 'inherited class';
is $obj, '<MyAtomicComplexTypeElement xmlns="urn:Test" ><test >Test</test>'
. '<test2 >Test2</test2>'
. '<test2 >Test3</test2>'
is $obj, '<MyAtomicComplexTypeElement xmlns="urn:Test"><test>Test</test>'
. '<test2>Test2</test2>'
. '<test2>Test3</test2>'
. '</MyAtomicComplexTypeElement>'
, 'multi value stringification';
ok $obj = MyComplexTypeElement->new({ MyTestName => 'test' });
is $obj->serialize_qualified(), '<MyComplexTypeElement xmlns="urn:Test" ><MyTestName >test</MyTestName ></MyComplexTypeElement>';
is $obj->serialize_qualified(), '<MyComplexTypeElement xmlns="urn:Test"><MyTestName>test</MyTestName></MyComplexTypeElement>';
__END__

View File

@@ -12,12 +12,12 @@ use_ok qw( MyComplexType );
my $obj = MyComplexType->new({ MyTestName => 'test' });
ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
, 'inherited class';
is $obj, '<MyTestName >test</MyTestName >', 'stringification';
is $obj, '<MyTestName>test</MyTestName>', 'stringification';
$obj = MyComplexType->new({ MyTestName => [ 'test', 'test2' ] });
ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
, 'inherited class';
is $obj, '<MyTestName >test</MyTestName ><MyTestName >test2</MyTestName >',
is $obj, '<MyTestName>test</MyTestName><MyTestName>test2</MyTestName>',
'stringification';
# try on the fly factory
@@ -36,7 +36,7 @@ is $obj, '<MyTestName >test</MyTestName ><MyTestName >test2</MyTestName >',
$obj = MyComplexType2->new({ MyTestName => [ 'test', 'test2' ] });
ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
, 'inherited class (on the fly-factory object)';
is $obj, '<MyTestName >test</MyTestName><MyTestName >test2</MyTestName>',
is $obj, '<MyTestName>test</MyTestName><MyTestName>test2</MyTestName>',
'stringification (on the fly-factory object)';
# TODO factor out into complexType test

View File

@@ -20,8 +20,8 @@ ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
ok $obj->get_test->isa('SOAP::WSDL::XSD::Typelib::Builtin::string')
, 'element isa';
is $obj, '<MyAtomicComplexTypeElement xmlns="urn:Test" ><test >Test</test>'
. '<test2 >Test2</test2></MyAtomicComplexTypeElement>'
is $obj, '<MyAtomicComplexTypeElement xmlns="urn:Test"><test>Test</test>'
. '<test2>Test2</test2></MyAtomicComplexTypeElement>'
, 'stringification';
my $soap = SOAP::WSDL::Client->new( {

62
t/095_copying.t Normal file
View File

@@ -0,0 +1,62 @@
use strict;
use warnings;
use Test::More;
use File::Find;
if ( not $ENV{TEST_AUTHOR} ) {
my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
plan( skip_all => $msg );
}
require Test::Pod::Content;
import Test::Pod::Content;
my $dir = 'blib/lib';
if (-d '../t') {
$dir = '../lib';
}
my @filelist = ();
find( \&filelist, $dir);
sub filelist {
my $name = $_;
return if (-d $name);
return if $File::Find::name =~m{\.svn}x;
return if $File::Find::name !~m{\.pm$}x;
# skip builtin XSD types - they contain no pod
return if $File::Find::name =~m{SOAP/WSDL/XSD/Typelib/Builtin/.+}xms;
# skip data classes - they contain no pod
return if $File::Find::name =~m{SOAP/WSDL/Base\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/Binding\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/Message\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/Operation\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/OpMessage\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/Part\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/Port\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/PortType\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/SOAP/Address\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/SOAP/Body\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/SOAP/Header\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/SOAP/HeaderFault\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/SOAP/Operation\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/Service\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/TypeLookup\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/Types\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/XSD/Builtin\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/XSD/ComplexType\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/XSD/SimpleType\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/XSD/Element\.pm$}xms;
return if $File::Find::name =~m{SOAP/WSDL/XSD/Schema\.pm$}xms;
push @filelist, $File::Find::name;
}
plan tests => scalar @filelist;
for my $file (sort @filelist) {
pod_section_like( $file, 'LICENSE AND COPYRIGHT', qr{ This \s file \s is \s part \s of
\s SOAP-WSDL\. \s You \s may \s distribute/modify \s it \s under \s
the \s same \s terms \s as \s perl \s itself
}xms, "$file License notice");
}

View File

@@ -1,4 +1,5 @@
use strict;
use warnings;
use lib '../../../lib';
use Test::More tests => 4;
use SOAP::WSDL;
@@ -11,17 +12,13 @@ my @dir_from = File::Spec->splitdir($dir);
unshift @dir_from, $volume if $volume;
my $url = join '/', @dir_from;
print "# Using SOAP::WSDL Version $SOAP::WSDL::VERSION\n";
# chdir to my location
my $soap = undef;
my $path = File::Spec->rel2abs( dirname __FILE__ );
my $proxy = 'http://127.0.0.1/testPort';
ok( $soap = SOAP::WSDL->new(
wsdl => 'file://' . $url . '/../../acceptance/wsdl/02_port.wsdl'
) );

13
t/SOAP/WSDL/Client.t Normal file
View File

@@ -0,0 +1,13 @@
use strict;
use warnings;
use Test::More tests => 4; #qw(no_plan);
use_ok qw(SOAP::WSDL::Client);
ok my $client = SOAP::WSDL::Client->new();
ok $client = SOAP::WSDL::Client->new({
proxy => 'http://localhost',
});
is $client->get_endpoint(), 'http://localhost';

View File

@@ -4,7 +4,7 @@ use Class::Std::Fast;
package main;
use strict;
use warnings;
use Test::More qw(no_plan);
use Test::More tests => 9;
use_ok qw(SOAP::WSDL::Client::Base);
my $client = SOAP::WSDL::Client::Base->new();
@@ -63,3 +63,4 @@ isa_ok $result[0], 'SOAP::WSDL::XSD::Typelib::Builtin::string';
is $result[0], 'Body2';
is $result[1], 'Header2';
isa_ok $result[1], 'SOAP::WSDL::XSD::Typelib::Builtin::string';

View File

@@ -19,7 +19,7 @@ my $data = $som->match('/a')->valueof;
is $data->{ c } , 3;
SKIP: {
skip "SOAP::Lite > 0.69 required" , 2 if ($SOAP::Lite::VERSION < 0.69);
skip "SOAP::Lite > 0.69 required" , 2 if ($SOAP::Lite::VERSION lt '0.69');
is $data->{ b }->[0] , 1, "array values - SOAP::Lite $SOAP::Lite::VERSION";;
is $data->{ b }->[1] , 2, "array values - SOAP::Lite $SOAP::Lite::VERSION";;
}

View File

@@ -1,10 +1,12 @@
#!/usr/bin/perl -w
use strict;
use warnings;
use Test::More tests => 2;
use Test::More tests => 4;
use lib '../../../../lib';
use lib '../../../../t/lib';
use lib 't/lib';
use lib '../lib';
use lib 'lib';
use lib 't/lib';
use_ok(qw/SOAP::WSDL::Expat::MessageParser/);
@@ -26,10 +28,34 @@ my $parser = SOAP::WSDL::Expat::MessageParser->new({
$parser->parse( $xml );
is $parser->get_data(), q{<MyAtomicComplexTypeElement xmlns="urn:Test" >}
. q{<test >Test</test><test2 >Test2</test2></MyAtomicComplexTypeElement>}
is $parser->get_data(), q{<MyAtomicComplexTypeElement xmlns="urn:Test">}
. q{<test>Test</test><test2>Test2</test2></MyAtomicComplexTypeElement>}
, 'Content comparison';
my $xml_attr = 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><MyElementAttrs xmlns="urn:Test" test="Test" test2="Test2">
<test>Test</test>
<test2 >Test2</test2>
</MyElementAttrs></SOAP-ENV:Body></SOAP-ENV:Envelope>};
$parser->parse($xml_attr);
is $parser->get_data(),
q{<MyElementAttrs xmlns="urn:Test" test="Test" test2="Test2"><test>Test</test><test2>Test2</test2></MyElementAttrs>},
'Content with attributes';
my $xml_error = 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><MyElementAttrs xmlns="urn:Test" test="Test" test2="Test2">
<test>Test</test>
<test2 >Test2</test2>
<foo>Bar</foo>
</MyElementAttrs></SOAP-ENV:Body></SOAP-ENV:Envelope>};
eval { $parser->parse($xml_error) };
like $@, qr{\A Cannot \s resolve \s class \s for \s MyElementAttrs/foo }x, 'XML error';
# data classes reside in t/lib/Typelib/
BEGIN {
package FakeResolver;
@@ -41,6 +67,9 @@ BEGIN {
'MyAtomicComplexTypeElement/foo' => '__SKIP__',
# 'MyAtomicComplexTypeElement/foo/bar' => 'MyFooElement',
# 'MyAtomicComplexTypeElement/foo/baz' => 'MyFooElement',
'MyElementAttrs' => 'MyElementAttrs',
'MyElementAttrs/test' => 'MyTestElement',
'MyElementAttrs/test2' => 'MyTestElement2',
);
sub new { return bless {}, 'FakeResolver' };
@@ -50,9 +79,7 @@ BEGIN {
sub get_class {
my $name = join('/', @{ $_[1] });
return ($class_list{ $name }) ? $class_list{ $name }
: warn "no class found for $name";
: undef;
};
};
};

View File

@@ -0,0 +1,53 @@
use strict;
use warnings;
use Test::More tests => 4; #qw(no_plan);
use File::Spec;
use File::Basename;
my $path = File::Spec->rel2abs( dirname __FILE__ );
use_ok qw( SOAP::WSDL::Expat::WSDLParser);
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
my $definitions = $parser->parse_file(
"$path/../../../acceptance/wsdl/WSDLParser.wsdl"
);
use Data::Dumper;
my $schema = $definitions->first_types()->get_schema()->[1];
my $attr = $schema->get_element()->[0]->first_complexType->first_attribute();
ok $attr->get_name('testAttribute');
ok $attr->get_type('xs:string');
use SOAP::WSDL::Generator::Template::XSD;
my $generator = SOAP::WSDL::Generator::Template::XSD->new({
definitions => $definitions,
type_prefix => 'Foo',
element_prefix => 'Foo',
typemap_prefix => 'Foo',
OUTPUT_PATH => "$path/testlib",
});
my $code = "";
$generator->set_output(\$code);
$generator->generate_typelib();
{
eval $code;
ok !$@;
print $@ if $@;
}
# print $code;
__END__
$generator->set_type_prefix('MyTypes');
$generator->set_element_prefix('MyElements');
$generator->set_typemap_prefix('MyTypemaps');
$generator->set_interface_prefix('MyInterfaces');
$generator->set_output(undef);
$generator->generate();

View File

@@ -11,7 +11,7 @@ eval { require XML::LibXML }
plan skip_all => 'XML::Compile::WSDL11 is not functional yet';
plan tests => qw(no_plan);
plan qw(no_plan);
my $path = File::Spec->rel2abs( dirname __FILE__ );
@@ -20,6 +20,8 @@ my $xml = $libxml->parse_file("$path/../../../acceptance/wsdl/generator_test.wsd
my $wsdl = XML::Compile::WSDL11->new($xml);
my $schemas = $wsdl->schemas;
my $operation = $wsdl->operation('testHeader');
ok my $operation = $wsdl->operation('testHeader');
my $client = $operation->prepareClient();
#die Dumper $operation;
#
#my $client = $operation->prepareClient();

View File

@@ -0,0 +1,100 @@
use Test::More tests => 12;
use File::Basename qw(dirname);
use File::Spec;
use File::Path;
my $path = File::Spec->rel2abs( dirname __FILE__ );
use_ok qw(SOAP::WSDL::Generator::Visitor::Typelib);
use_ok qw(SOAP::WSDL::Generator::Template::XSD);
use SOAP::WSDL::Expat::WSDLParser;
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
my $definitions = $parser->parse_file(
"$path/../../../acceptance/wsdl/generator_test_dot_names.wsdl"
#"$path/../../../acceptance/wsdl/elementAtomicComplexType.xml"
);
my $generator = SOAP::WSDL::Generator::Template::XSD->new({
definitions => $definitions,
type_prefix => 'Foo',
element_prefix => 'Foo',
typemap_prefix => 'Foo',
OUTPUT_PATH => "$path/testlib",
});
my $code = "";
$generator->set_output(\$code);
$generator->generate_typelib();
{
eval $code;
ok !$@;
print $@ if $@;
}
# print $code;
$generator->set_type_prefix('MyTypes');
$generator->set_element_prefix('MyElements');
$generator->set_typemap_prefix('MyTypemaps');
$generator->set_interface_prefix('MyInterfaces');
$generator->set_output(undef);
$generator->generate();
#$generator->generate_typelib();
#$generator->generate_typemap();
if (eval { require Test::Warn; }) {
Test::Warn::warning_like( sub { $generator->generate_interface() },
qr{\A Multiple \s parts \s detected \s in \s message \s testMultiPartWarning}xms);
}
else {
$generator->generate_interface();
SKIP: { skip 'Cannot test warnings without Test::Warn', 1 };
}
$generator->generate_server();
eval "use lib '$path/testlib'";
use_ok qw(MyInterfaces::My::SOAP::testService::testPort);
use_ok qw(MyServer::My::SOAP::testService::testPort);
SKIP: {
eval { require Test::Pod::Content; }
or skip 'Cannot test pod content without Test::Pod::Content', 6;
Test::Pod::Content::pod_section_like(
'MyInterfaces::My::SOAP::testService::testPort',
'NAME',
qr{^MyInterfaces::My::SOAP::testService::testPort \s - \s}xms,
'Pod NAME section');
Test::Pod::Content::pod_section_like(
'MyInterfaces::My::SOAP::testService::testPort',
'SYNOPSIS',
qr{use \s MyInterfaces::My::SOAP::testService::testPort}xms,
'Pod SYNOPSIS section');
Test::Pod::Content::pod_section_like(
'MyInterfaces::My::SOAP::testService::testPort',
'SYNOPSIS',
qr{\s MyInterfaces::My::SOAP::testService::testPort->new\(}xms,
'Pod SYNOPSIS section');
Test::Pod::Content::pod_section_like(
'MyServer::My::SOAP::testService::testPort',
'NAME',
qr{^MyServer::My::SOAP::testService::testPort \s - \s}xms,
'Pod NAME section');
Test::Pod::Content::pod_section_like(
'MyServer::My::SOAP::testService::testPort',
'SYNOPSIS',
qr{use \s MyServer::My::SOAP::testService::testPort}xms,
'Pod SYNOPSIS section');
Test::Pod::Content::pod_section_like(
'MyServer::My::SOAP::testService::testPort',
'SYNOPSIS',
qr{\s MyServer::My::SOAP::testService::testPort->new\(}xms,
'Pod SYNOPSIS section');
}
rmtree "$path/testlib";

View File

@@ -10,4 +10,11 @@ like $serializer->serialize(), qr{<SOAP-ENV:Body></SOAP-ENV:Body>}, 'empty body'
like $serializer->serialize({ body => {} }), qr{<SOAP-ENV:Body></SOAP-ENV:Body>}, 'empty body';
like $serializer->serialize({ body => [] }), qr{<SOAP-ENV:Body></SOAP-ENV:Body>}, 'empty body';
like $serializer->serialize({ header => {}, body => [] }),
qr{<SOAP-ENV:Header></SOAP-ENV:Header><SOAP-ENV:Body></SOAP-ENV:Body>}, 'empty header and body';
qr{<SOAP-ENV:Header></SOAP-ENV:Header><SOAP-ENV:Body></SOAP-ENV:Body>}, 'empty header and body';
like $serializer->serialize({ header => {}, body => [] , options => {
namespace => {
'http://schemas.xmlsoap.org/soap/envelope/' => 'SOAP',
'http://www.w3.org/2001/XMLSchema-instance' => 'xsi',
}
} }),
qr{<SOAP:Header></SOAP:Header><SOAP:Body></SOAP:Body>}, 'empty header and body';

View File

@@ -0,0 +1,7 @@
use strict;
use warnings;
use Test::More tests => 3; #qw(no_plan);
use_ok qw(SOAP::WSDL::XSD::Typelib::Attribute);
is SOAP::WSDL::XSD::Typelib::Attribute->start_tag(), '';
is SOAP::WSDL::XSD::Typelib::Attribute->start_tag({ name => 'foo'}, 'bar'), q{ foo="};

View File

@@ -24,8 +24,8 @@ is $obj->get_value(), 'test1', 'get_value';
is $obj->get_xmlns(), 'http://www.w3.org/2001/XMLSchema', 'get_xmlns';
is $obj->start_tag({ name => 'test' }), '<test >', 'start_tag';
is $obj->end_tag({ name => 'test' }), '</test >', 'end_tag';
is $obj->start_tag({ name => 'test' }), '<test>', 'start_tag';
is $obj->end_tag({ name => 'test' }), '</test>', 'end_tag';
ok $obj->set_value('test'), 'set_value';
is $obj->get_value(), 'test', 'get_value';
@@ -54,7 +54,7 @@ is $obj->get_value(), 'test2', 'get_value on attr value';
$obj->set_value(undef);
is $obj->serialize({ name => 'foo' }), '<foo ></foo >'
is $obj->serialize({ name => 'foo' }), '<foo></foo>'
, 'serialize undef value with name';
is $obj->serialize(), q{}, 'serialize undef value without name';

View File

@@ -1,13 +1,14 @@
use strict;
use warnings;
use Test::More tests => 3;
use Test::More tests => 5;
use Scalar::Util qw(blessed);
use_ok qw(SOAP::WSDL::XSD::Typelib::Builtin::anyType);
is SOAP::WSDL::XSD::Typelib::Builtin::anyType->get_xmlns(), 'http://www.w3.org/2001/XMLSchema', 'get_xmlns';
is SOAP::WSDL::XSD::Typelib::Builtin::anyType->serialize(), q{}, 'serialize to empty';
is SOAP::WSDL::XSD::Typelib::Builtin::anyType->start_tag(), q{}, 'serialize to empty';
is SOAP::WSDL::XSD::Typelib::Builtin::anyType->start_tag({ name => 'foo'}), q{<foo>}, 'serialize with name';
exit 0;
__END__

View File

@@ -46,7 +46,7 @@ is "$bool", '0', 'stringification';
ok $bool->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType'), 'inheritance';
is $bool->serialize({ name => 'test'}), '<test >false</test >';
is $bool->serialize({ name => 'test'}), '<test>false</test>';
is $bool->serialize(), 'false';
$bool->delete_value();

View File

@@ -1,9 +1,10 @@
use Test::More tests => 30;
use strict;
use Carp qw(cluck);
$SIG{__WARN__} = sub { cluck @_ };
use warnings;
#use Carp qw(cluck);
#
#$SIG{__WARN__} = sub { cluck @_ };
#use warnings;
use lib '../lib';
use Date::Format;
use Date::Parse;

View File

@@ -1,7 +1,7 @@
use Test::More tests => 7;
use strict;
use warnings;
use lib '../lib';
use Test::More tests => 7;
use Date::Parse;
use Date::Format;

View File

@@ -20,5 +20,5 @@ is $obj->serialize, '&amp; &quot;Aber&quot; &lt;test&gt;'
, 'escape text on serialization';
is $obj->serialize({ name => 'test'})
, '<test >&amp; &quot;Aber&quot; &lt;test&gt;</test >'
, '<test>&amp; &quot;Aber&quot; &lt;test&gt;</test>'
, 'Serialization with name';

View File

@@ -19,5 +19,5 @@ is $obj->serialize(), '&amp; &quot;Aber&quot; &lt;test&gt;'
, 'escape text on serialization';
is $obj->serialize({ name => 'test'})
, '<test >&amp; &quot;Aber&quot; &lt;test&gt;</test >'
, '<test>&amp; &quot;Aber&quot; &lt;test&gt;</test>'
, 'Serialization with name';

View File

@@ -9,22 +9,48 @@ package MyEmptyType2;
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
__PACKAGE__->_factory();
package MyType;
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
my %test_of :ATTR(:get<test>);
__PACKAGE__->_factory(
[ 'test' ],
{
test => \%test_of,
},
{
test => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
}
package MyAttribute;
use base qw(SOAP::WSDL::XSD::Typelib::Attribute
SOAP::WSDL::XSD::Typelib::Builtin::string
);
package MyType;
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
{
my %test_of :ATTR(:get<test>);
__PACKAGE__->_factory(
[ 'test' ],
{ test => \%test_of, },
{ test => 'SOAP::WSDL::XSD::Typelib::Builtin::string', }
);
}
package MyElement;
use base qw(
SOAP::WSDL::XSD::Typelib::Element
MyType
);
__PACKAGE__->__set_name( 'MyElement' );
package MyElement::_ATTR;
use base qw(SOAP::WSDL::XSD::Typelib::AttributeSet);
{
my %test_of :ATTR(:get<test>);
my %test2_of :ATTR(:get<test2>);
__PACKAGE__->_factory(
[ 'test', 'test2' ],
{
test => \%test_of,
test2 => \%test2_of,
},
{
test => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
test2 => 'MyAttribute',
}
);
}
package MyType2;
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
@@ -42,20 +68,20 @@ __PACKAGE__->_factory(
);
package main;
use Test::More tests => 100;
use Test::More tests => 106;
use Storable;
my $have_warn = eval { use Test::Warn; 1; };
my $have_warn = eval { require Test::Warn; import Test::Warn; 1; };
my $obj;
$obj = MyEmptyType->new();
is $obj->serialize, '';
is $obj->serialize({ name => 'test'}), '<test />';
is $obj->serialize({ name => 'test'}), '<test/>';
$obj = MyEmptyType2->new();
is $obj->serialize, '';
is $obj->serialize({ name => 'test'}), '<test />';
is $obj->serialize({ name => 'test'}), '<test/>';
$obj = MyType->new({});
@@ -67,7 +93,7 @@ is scalar keys %{ $hash_of_ref }, 0;
SKIP: {
skip 'Cannot test warnings without Test::Warn', 1 if not $have_warn;
warning_is { $obj->add_test() } 'attempting to add empty value to MyType';
warning_is( sub { $obj->add_test() }, 'attempting to add empty value to MyType' );
}
$obj = MyType->new({ test => 'Test1'});
@@ -168,7 +194,27 @@ for my $count (1..5) {
}
}
# TODO - remove after *{ "$class\::$name"" } methods are gone
$obj->set_test();
is $obj->get_test, (), 'removed element content';
$obj = MyElement->new();
isa_ok $obj->attr() , 'SOAP::WSDL::XSD::Typelib::AttributeSet';
my $attr = $obj->attr({ test => 'TestAttribute',
test2 => 'TestAttribute2'
});
isa_ok $attr, 'SOAP::WSDL::XSD::Typelib::AttributeSet';
is $attr->serialize(), q{ test="TestAttribute" test2="TestAttribute2"}, 'attribute serialization';
is $obj->serialize(),
q{<MyElement test="TestAttribute" test2="TestAttribute2"/>},
'Serialization with attributes';
$obj->attr()->set_test2('test');
is $obj->serialize(),
q{<MyElement test="TestAttribute" test2="test"/>},
'Serialization with attributes';
$obj = MyType->new();
@@ -181,14 +227,12 @@ is $obj->get_test, undef;
eval { $foo = @{ $obj->get_test() } };
if (! $@) {
is $foo, undef;
# like $warnings, qr{ uninitialized \s value \s in array \s dereference }x, 'undef warning';
}
else {
like $@ , qr{Can't \s use \s an \s undefined}x, 'get_ELEMENT still undef on ARRAYIFY';
# pass 'failed array dereference';
}
$obj->test(
$obj->set_test(
SOAP::WSDL::XSD::Typelib::Builtin::string->new({ value => 'TestString0'})
);
}
@@ -197,15 +241,15 @@ eval { is @{ $obj->get_test() }, 1, 'ARRAYIFY get_ELEMENT' };
fail 'cannot ARRAYIFY get_ELEMENT' if ($@);
my @serialized = (
'<test >TestString0</test ><test >TestString1</test >',
'<test >TestString0</test ><test >TestString1</test ><test >TestString2</test >',
'<test >TestString0</test ><test >TestString1</test ><test >TestString2</test ><test >TestString3</test >',
'<test >TestString0</test ><test >TestString1</test ><test >TestString2</test ><test >TestString3</test ><test >TestString4</test >',
'<test >TestString0</test ><test >TestString1</test ><test >TestString2</test ><test >TestString3</test ><test >TestString4</test ><test >TestString5</test >',
'<test>TestString0</test><test>TestString1</test>',
'<test>TestString0</test><test>TestString1</test><test>TestString2</test>',
'<test>TestString0</test><test>TestString1</test><test>TestString2</test><test>TestString3</test>',
'<test>TestString0</test><test>TestString1</test><test>TestString2</test><test>TestString3</test><test>TestString4</test>',
'<test>TestString0</test><test>TestString1</test><test>TestString2</test><test>TestString3</test><test>TestString4</test><test>TestString5</test>',
);
for my $count (1..5) {
$obj->test(
$obj->add_test(
SOAP::WSDL::XSD::Typelib::Builtin::string->new({ value => "TestString$count" })
);
@@ -219,7 +263,6 @@ for my $count (1..5) {
}
eval {
$obj = MyType->new({
test => [
@@ -240,7 +283,6 @@ eval {
};
like $@, qr{cannot \s use \s CODE}xms;
eval {
$obj = MyType->new({
foobar => 'fubar'

View File

@@ -10,7 +10,7 @@ __PACKAGE__->__set_name('MyElement');
__PACKAGE__->__set_nillable(1);
package main;
use Test::More tests => 11;
use Test::More tests => 12;
my $obj;
@@ -25,8 +25,8 @@ isa_ok $obj, 'MyElement';
is $obj->get_value(), 'Test';
$obj->set_value(undef);
is $obj->serialize_qualified, '<MyElement xsi:nil="true" xmlns="http://www.w3.org/2001/XMLSchema" />';
is $obj->serialize_qualified, '<MyElement xsi:nil="true" xmlns="http://www.w3.org/2001/XMLSchema"/>';
is $obj->serialize, '<MyElement xsi:nil="true"/>';
$obj->__set_nillable(0);
is $obj->__get_nillable(), 0;
@@ -35,7 +35,7 @@ like $@, qr{Cannot \s call}xms;
eval { SOAP::WSDL::XSD::Typelib::Element::__set_nillable() };
like $@, qr{Cannot \s call}xms;
is $obj->start_tag({empty => 1}), '<MyElement />';
is $obj->start_tag({empty => 1}), '<MyElement/>';
is $obj->start_tag({nil => 1}), '', 'empty string with nil option and NILLABLE false';
$obj->set_value('Test');

View File

@@ -0,0 +1,77 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="urn:HelloWorld"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
targetNamespace="urn:HelloWorld"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<s:schema elementFormDefault="qualified"
targetNamespace="urn:HelloWorld">
<s:element name="sayHello">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="name"
type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="givenName"
type="s:string" nillable="1" />
</s:sequence>
<s:attribute name="testAttr" type="s:string" use="optional"></s:attribute>
</s:complexType>
</s:element>
<s:element name="sayHelloResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1"
name="sayHelloResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
</s:schema>
</types>
<message name="sayHelloSoapIn">
<part name="parameters" element="s0:sayHello" />
</message>
<message name="sayHelloSoapOut">
<part name="parameters" element="s0:sayHelloResponse" />
</message>
<portType name="Service1Soap">
<operation name="sayHello">
<input message="s0:sayHelloSoapIn" />
<output message="s0:sayHelloSoapOut" />
</operation>
</portType>
<binding name="Service1Soap" type="s0:Service1Soap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document" />
<operation name="sayHello">
<soap:operation soapAction="urn:HelloWorld#sayHello"
style="document" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>
</binding>
<service name="Service1">
<port name="Service1Soap" binding="s0:Service1Soap">
<soap:address
location="http://localhost:81/soap-wsdl-test/helloworld.pl" />
</port>
</service>
</definitions>

View File

@@ -0,0 +1,700 @@
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://stub.query.gasapiserver.esp.globalsign.com"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:impl="http://stub.query.gasapiserver.esp.globalsign.com"
xmlns:intf="http://stub.query.gasapiserver.esp.globalsign.com"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDLはApache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)によって生成されました / [en]-(WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT))-->
<wsdl:types>
<schema elementFormDefault="qualified" targetNamespace="http://stub.query.gasapiserver.esp.globalsign.com" xmlns="http://www.w3.org/2001/XMLSchema">
<element name="GetDVApproverList">
<complexType>
<sequence>
<element name="Request" type="impl:GetDVApproverListRequest"/>
</sequence>
</complexType>
</element>
<complexType name="AuthToken">
<sequence>
<element name="Password" nillable="true" type="xsd:string"/>
<element name="UserName" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="QueryRequestHeader">
<sequence>
<element name="AuthToken" nillable="true" type="impl:AuthToken"/>
</sequence>
</complexType>
<complexType name="GetDVApproverListRequest">
<sequence>
<element name="FQDN" nillable="true" type="xsd:string"/>
<element name="QueryRequestHeader" nillable="true" type="impl:QueryRequestHeader"/>
</sequence>
</complexType>
<element name="GetDVApproverListResponse">
<complexType>
<sequence>
<element name="Response" type="impl:GetDVApproverListResponse"/>
</sequence>
</complexType>
</element>
<complexType name="Approver">
<sequence>
<element maxOccurs="1" minOccurs="0" name="ApproverEmail" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ApproverType" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="ArrayOfApprover">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="Approver" type="impl:Approver"/>
</sequence>
</complexType>
<complexType name="Error">
<sequence>
<element maxOccurs="1" minOccurs="0" name="ErrorCode" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ErrorField" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ErrorMessage" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="ArrayOfError">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="Error" type="impl:Error"/>
</sequence>
</complexType>
<complexType name="QueryResponseHeader">
<sequence>
<element maxOccurs="1" minOccurs="0" name="Errors" nillable="true" type="impl:ArrayOfError"/>
<element maxOccurs="1" minOccurs="0" name="ReturnCount" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="SuccessCode" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Timestamp" nillable="true" type="xsd:dateTime"/>
</sequence>
</complexType>
<complexType name="GetDVApproverListResponse">
<sequence>
<element maxOccurs="1" minOccurs="0" name="Approvers" nillable="true" type="impl:ArrayOfApprover"/>
<element maxOccurs="1" minOccurs="0" name="OrderID" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="QueryResponseHeader" nillable="true" type="impl:QueryResponseHeader"/>
</sequence>
</complexType>
<element name="GetApproverList">
<complexType>
<sequence>
<element name="Request" type="impl:GetApproverListRequest"/>
</sequence>
</complexType>
</element>
<complexType name="GetApproverListRequest">
<sequence>
<element name="FQDN" nillable="true" type="xsd:string"/>
<element name="QueryRequestHeader" nillable="true" type="impl:QueryRequestHeader"/>
</sequence>
</complexType>
<element name="GetApproverListResponse">
<complexType>
<sequence>
<element name="Response" type="impl:GetApproverListResponse"/>
</sequence>
</complexType>
</element>
<complexType name="GetApproverListResponse">
<sequence>
<element maxOccurs="1" minOccurs="0" name="Approvers" nillable="true" type="impl:ArrayOfApprover"/>
<element maxOccurs="1" minOccurs="0" name="QueryResponseHeader" nillable="true" type="impl:QueryResponseHeader"/>
</sequence>
</complexType>
<element name="GetOrderByOrderID">
<complexType>
<sequence>
<element name="Request" type="impl:GetOrderByOrderIDRequest"/>
</sequence>
</complexType>
</element>
<complexType name="OrderQueryOption">
<sequence>
<element maxOccurs="1" minOccurs="0" name="OrderStatus" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ReturnCACerts" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ReturnCertificateInfo" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ReturnFulfillment" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ReturnOrderOption" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="GetOrderByOrderIDRequest">
<sequence>
<element name="OrderID" nillable="true" type="xsd:string"/>
<element name="OrderQueryOption" nillable="true" type="impl:OrderQueryOption"/>
<element name="QueryRequestHeader" nillable="true" type="impl:QueryRequestHeader"/>
</sequence>
</complexType>
<element name="GetOrderByOrderIDResponse">
<complexType>
<sequence>
<element name="Response" type="impl:GetOrderByOrderIDResponse"/>
</sequence>
</complexType>
</element>
<complexType name="CertificateInfo">
<sequence>
<element maxOccurs="1" minOccurs="0" name="DNSNames" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="CertificateStatus" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="CommonName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="EndDate" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="SerialNumber" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="StartDate" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="SubjectName" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="CACertificate">
<sequence>
<element maxOccurs="1" minOccurs="0" name="CACert" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="CACertType" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="ArrayOfCACertificate">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="CACertificate" type="impl:CACertificate"/>
</sequence>
</complexType>
<complexType name="ServerCertificate">
<sequence>
<element maxOccurs="1" minOccurs="0" name="PKCS7Cert" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="X509Cert" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="Fulfillment">
<sequence>
<element maxOccurs="1" minOccurs="0" name="CACertificates" nillable="true" type="impl:ArrayOfCACertificate"/>
<element maxOccurs="1" minOccurs="0" name="ServerCertificate" nillable="true" type="impl:ServerCertificate"/>
</sequence>
</complexType>
<complexType name="ModificationEvent">
<sequence>
<element maxOccurs="1" minOccurs="0" name="ModificationEventName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ModificationEventTimestamp" nillable="true" type="xsd:dateTime"/>
</sequence>
</complexType>
<complexType name="ArrayOfModificationEvent">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="ModificationEvent" type="impl:ModificationEvent"/>
</sequence>
</complexType>
<complexType name="ValidityPeriod">
<sequence>
<element maxOccurs="1" minOccurs="0" name="Months" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="NotAfter" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="NotBefore" nillable="true" type="xsd:dateTime"/>
</sequence>
</complexType>
<complexType name="OrderInfo">
<sequence>
<element maxOccurs="1" minOccurs="0" name="GSSupportOption" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="BaseOption" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Currency" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="DomainName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ExpressOption" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="InsuranceOption" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Licenses" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrderCanceledDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderCompleteDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderDeactivatedDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderID" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrderKind" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrderStatus" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Price" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ProductCode" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="RenewalExtentionOption" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="SpecialInstructions" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ValidityPeriod" nillable="true" type="impl:ValidityPeriod"/>
<element maxOccurs="1" minOccurs="0" name="ValidityPeriodCustomizeOption" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="ContactInfo">
<sequence>
<element maxOccurs="1" minOccurs="0" name="Email" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="FirstName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="LastName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Phone" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="OrganizationAddress">
<sequence>
<element maxOccurs="1" minOccurs="0" name="AddressLine1" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="AddressLine2" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="AddressLine3" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="City" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Country" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Fax" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Phone" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="PostalCode" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Region" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="OrganizationInfo">
<sequence>
<element maxOccurs="1" minOccurs="0" name="CreditAgency" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationAddress" nillable="true" type="impl:OrganizationAddress"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationCode" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="BusinessAssumedName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="BusinessCategoryCode" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="ApproverInfo">
<sequence>
<element maxOccurs="1" minOccurs="0" name="Email" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="FirstName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Function" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="LastName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationUnit" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Phone" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="AuthorizedSignerInfo">
<sequence>
<element maxOccurs="1" minOccurs="0" name="Email" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="FirstName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Function" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="LastName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationUnit" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Phone" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="JurisdictionInfo">
<sequence>
<element maxOccurs="1" minOccurs="0" name="Country" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="IncorporatingAgencyRegistrationNumber" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Locality" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="StateOrProvince" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="RequestorInfo">
<sequence>
<element maxOccurs="1" minOccurs="0" name="Email" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="FirstName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Function" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="LastName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationUnit" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Phone" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="OrderOption">
<sequence>
<element maxOccurs="1" minOccurs="0" name="ApproverConfirmDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="ApproverEmailAddress" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ApproverNotifiedDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="ContactInfo" nillable="true" type="impl:ContactInfo"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationInfo" nillable="true" type="impl:OrganizationInfo"/>
<element maxOccurs="1" minOccurs="0" name="ApproverInfo" nillable="true" type="impl:ApproverInfo"/>
<element maxOccurs="1" minOccurs="0" name="AuthorizedSignerInfo" nillable="true" type="impl:AuthorizedSignerInfo"/>
<element maxOccurs="1" minOccurs="0" name="JurisdictionInfo" nillable="true" type="impl:JurisdictionInfo"/>
<element maxOccurs="1" minOccurs="0" name="RequestorInfo" nillable="true" type="impl:RequestorInfo"/>
</sequence>
</complexType>
<complexType name="OrderSubInfo">
<sequence>
<element maxOccurs="1" minOccurs="0" name="CSRSkipOrderFlag" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="DNSOrderFlag" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="P12DeleteDate" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="P12DeleteStatus" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="SubId" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="TrustedOrderFlag" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="VerificationUrl" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="OrderDetail">
<sequence>
<element maxOccurs="1" minOccurs="0" name="CertificateInfo" nillable="true" type="impl:CertificateInfo"/>
<element maxOccurs="1" minOccurs="0" name="Fulfillment" nillable="true" type="impl:Fulfillment"/>
<element maxOccurs="1" minOccurs="0" name="ModificationEvents" nillable="true" type="impl:ArrayOfModificationEvent"/>
<element maxOccurs="1" minOccurs="0" name="OrderInfo" nillable="true" type="impl:OrderInfo"/>
<element maxOccurs="1" minOccurs="0" name="OrderOption" nillable="true" type="impl:OrderOption"/>
<element maxOccurs="1" minOccurs="0" name="OrderSubInfo" nillable="true" type="impl:OrderSubInfo"/>
</sequence>
</complexType>
<complexType name="GetOrderByOrderIDResponse">
<sequence>
<element maxOccurs="1" minOccurs="0" name="OrderDetail" nillable="true" type="impl:OrderDetail"/>
<element maxOccurs="1" minOccurs="0" name="OrderID" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="QueryResponseHeader" nillable="true" type="impl:QueryResponseHeader"/>
<element name="PKCS12File" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<element name="GetModifiedOrders">
<complexType>
<sequence>
<element name="Request" type="impl:GetModifiedOrdersRequest"/>
</sequence>
</complexType>
</element>
<complexType name="GetModifiedOrdersRequest">
<sequence>
<element name="FromDate" nillable="true" type="xsd:dateTime"/>
<element name="OrderQueryOption" nillable="true" type="impl:OrderQueryOption"/>
<element name="QueryRequestHeader" nillable="true" type="impl:QueryRequestHeader"/>
<element name="ToDate" nillable="true" type="xsd:dateTime"/>
</sequence>
</complexType>
<element name="GetModifiedOrdersResponse">
<complexType>
<sequence>
<element name="Response" type="impl:GetModifiedOrdersResponse"/>
</sequence>
</complexType>
</element>
<complexType name="ArrayOfOrderDetail">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="OrderDetail" type="impl:OrderDetail"/>
</sequence>
</complexType>
<complexType name="GetModifiedOrdersResponse">
<sequence>
<element maxOccurs="1" minOccurs="0" name="FromDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderDetails" nillable="true" type="impl:ArrayOfOrderDetail"/>
<element maxOccurs="1" minOccurs="0" name="QueryResponseHeader" nillable="true" type="impl:QueryResponseHeader"/>
<element maxOccurs="1" minOccurs="0" name="ToDate" nillable="true" type="xsd:dateTime"/>
</sequence>
</complexType>
<element name="GetCertificateOrders">
<complexType>
<sequence>
<element name="Request" type="impl:GetCertificateOrdersRequest"/>
</sequence>
</complexType>
</element>
<complexType name="GetCertificateOrdersRequest">
<sequence>
<element maxOccurs="1" minOccurs="0" name="FQDN" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="FromDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderKind" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrderStatus" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="QueryRequestHeader" nillable="true" type="impl:QueryRequestHeader"/>
<element maxOccurs="1" minOccurs="0" name="SubID" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="ToDate" nillable="true" type="xsd:dateTime"/>
</sequence>
</complexType>
<element name="GetCertificateOrdersResponse">
<complexType>
<sequence>
<element name="Response" type="impl:GetCertificateOrdersResponse"/>
</sequence>
</complexType>
</element>
<complexType name="SearchOrderDetail">
<sequence>
<element maxOccurs="1" minOccurs="0" name="BaseOption" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="FQDN" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Licenses" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Months" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrderCanceledDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderIssueDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderKind" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrderRequestDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderStatus" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="Orderid" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="OrganizationName" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="RequestKind" nillable="true" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="SubId" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="ArrayOfSearchOrderDetail">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="SearchOrderDetail" type="impl:SearchOrderDetail"/>
</sequence>
</complexType>
<complexType name="GetCertificateOrdersResponse">
<sequence>
<element maxOccurs="1" minOccurs="0" name="FromDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="QueryResponseHeader" nillable="true" type="impl:QueryResponseHeader"/>
<element maxOccurs="1" minOccurs="0" name="SearchOrderDetails" nillable="true" type="impl:ArrayOfSearchOrderDetail"/>
<element maxOccurs="1" minOccurs="0" name="ToDate" nillable="true" type="xsd:dateTime"/>
</sequence>
</complexType>
<element name="GetOrderByDataRange">
<complexType>
<sequence>
<element name="Request" type="impl:GetOrderByDataRangeRequest"/>
</sequence>
</complexType>
</element>
<complexType name="GetOrderByDataRangeRequest">
<sequence>
<element name="FromDate" nillable="true" type="xsd:dateTime"/>
<element name="OrderQueryOption" nillable="true" type="impl:OrderQueryOption"/>
<element name="QueryRequestHeader" nillable="true" type="impl:QueryRequestHeader"/>
<element name="ToDate" nillable="true" type="xsd:dateTime"/>
</sequence>
</complexType>
<element name="GetOrderByDataRangeResponse">
<complexType>
<sequence>
<element name="Response" type="impl:GetOrderByDataRangeResponse"/>
</sequence>
</complexType>
</element>
<complexType name="GetOrderByDataRangeResponse">
<sequence>
<element maxOccurs="1" minOccurs="0" name="FromDate" nillable="true" type="xsd:dateTime"/>
<element maxOccurs="1" minOccurs="0" name="OrderDetails" nillable="true" type="impl:ArrayOfOrderDetail"/>
<element maxOccurs="1" minOccurs="0" name="QueryResponseHeader" nillable="true" type="impl:QueryResponseHeader"/>
<element maxOccurs="1" minOccurs="0" name="ToDate" nillable="true" type="xsd:dateTime"/>
</sequence>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="GetDVApproverListResponse">
<wsdl:part element="impl:GetDVApproverListResponse" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetOrderByOrderIDResponse">
<wsdl:part element="impl:GetOrderByOrderIDResponse" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetModifiedOrdersRequest">
<wsdl:part element="impl:GetModifiedOrders" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetOrderByDataRangeResponse">
<wsdl:part element="impl:GetOrderByDataRangeResponse" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetApproverListResponse">
<wsdl:part element="impl:GetApproverListResponse" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetDVApproverListRequest">
<wsdl:part element="impl:GetDVApproverList" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetApproverListRequest">
<wsdl:part element="impl:GetApproverList" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetCertificateOrdersRequest">
<wsdl:part element="impl:GetCertificateOrders" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetOrderByDataRangeRequest">
<wsdl:part element="impl:GetOrderByDataRange" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetCertificateOrdersResponse">
<wsdl:part element="impl:GetCertificateOrdersResponse" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetModifiedOrdersResponse">
<wsdl:part element="impl:GetModifiedOrdersResponse" name="parameters"/>
</wsdl:message>
<wsdl:message name="GetOrderByOrderIDRequest">
<wsdl:part element="impl:GetOrderByOrderID" name="parameters"/>
</wsdl:message>
<wsdl:portType name="GasQuery">
<wsdl:operation name="GetDVApproverList">
<wsdl:input message="impl:GetDVApproverListRequest" name="GetDVApproverListRequest"/>
<wsdl:output message="impl:GetDVApproverListResponse" name="GetDVApproverListResponse"/>
</wsdl:operation>
<wsdl:operation name="GetApproverList">
<wsdl:input message="impl:GetApproverListRequest" name="GetApproverListRequest"/>
<wsdl:output message="impl:GetApproverListResponse" name="GetApproverListResponse"/>
</wsdl:operation>
<wsdl:operation name="GetOrderByOrderID">
<wsdl:input message="impl:GetOrderByOrderIDRequest" name="GetOrderByOrderIDRequest"/>
<wsdl:output message="impl:GetOrderByOrderIDResponse" name="GetOrderByOrderIDResponse"/>
</wsdl:operation>
<wsdl:operation name="GetModifiedOrders">
<wsdl:input message="impl:GetModifiedOrdersRequest" name="GetModifiedOrdersRequest"/>
<wsdl:output message="impl:GetModifiedOrdersResponse" name="GetModifiedOrdersResponse"/>
</wsdl:operation>
<wsdl:operation name="GetCertificateOrders">
<wsdl:input message="impl:GetCertificateOrdersRequest" name="GetCertificateOrdersRequest"/>
<wsdl:output message="impl:GetCertificateOrdersResponse" name="GetCertificateOrdersResponse"/>
</wsdl:operation>
<wsdl:operation name="GetOrderByDataRange">
<wsdl:input message="impl:GetOrderByDataRangeRequest" name="GetOrderByDataRangeRequest"/>
<wsdl:output message="impl:GetOrderByDataRangeResponse" name="GetOrderByDataRangeResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="GasQuerySoapBinding" type="impl:GasQuery">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="GetDVApproverList">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="GetDVApproverListRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="GetDVApproverListResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetApproverList">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="GetApproverListRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="GetApproverListResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetOrderByOrderID">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="GetOrderByOrderIDRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="GetOrderByOrderIDResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetModifiedOrders">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="GetModifiedOrdersRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="GetModifiedOrdersResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetCertificateOrders">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="GetCertificateOrdersRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="GetCertificateOrdersResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetOrderByDataRange">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="GetOrderByDataRangeRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="GetOrderByDataRangeResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="GasQueryService">
<wsdl:port binding="impl:GasQuerySoapBinding" name="GasQuery">
<wsdlsoap:address location="http://localhost:8080/services/GasQuery"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

View File

@@ -6,7 +6,7 @@
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/"
>
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/">
<types>
<xsd:schema targetNamespace="urn:Test">
<xsd:simpleType name="testSimpleTypeList">
@@ -67,7 +67,7 @@
<xsd:documentation>ComplexType Test</xsd:documentation>
</xsd:annotation>
<xsd:all>
<xsd:element name="Test1" type="xsd:string" />
<xsd:element name="Test1" type="xsd:string" maxOccurs="1"/>
<xsd:element name="Test2" type="xsd:string" minOccurs="1" />
</xsd:all>
</xsd:complexType>
@@ -193,6 +193,14 @@
</xsd:complexType>
<xsd:element name="testElementEmptyComplex">
<xsd:complexType>
<xsd:sequence/>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="emptyComplexType">
<xsd:sequence></xsd:sequence>
</xsd:complexType>
</xsd:schema>
</types>
<message name="testChoice">
@@ -215,6 +223,11 @@
<message name="testHeaderResponse">
<part name="testAll" element="tns:testElementString"/>
</message>
<message name="testEmptyComplex">
<part name="test" element="tns:testElementEmptyComplex"/>
</message>
<portType name="testPort">
<operation name="test">
<documentation>
@@ -245,6 +258,10 @@
<output message="tns:testMultiPartWarning"/>
</operation>
<operation name="testEmptyComplex">
<input message="tns:testEmptyComplex"/>
<output message="tns:testEmptyComplex"/>
</operation>
</portType>
<binding type="tns:testPort" name="testBinding">
@@ -287,11 +304,71 @@
<soap:body use="literal"/>
</output>
</operation>
<operation name="testEmptyComplex">
<soap:operation soapAction="testEmptyComplex"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="testService">
<wsdl:binding name="HTTPBinding" type="tns:testPort">
<http:binding verb="GET" />
<wsdl:operation name="test">
<http:operation location="/test" />
<wsdl:input>
<http:urlEncoded />
</wsdl:input>
<wsdl:output>
<mime:content type="text/xml" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="testHeader">
<http:operation location="/testHeader" />
<wsdl:input>
<http:urlEncoded />
</wsdl:input>
<wsdl:output>
<mime:content type="text/xml" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="testChoice">
<http:operation location="/testChoice" />
<wsdl:input>
<http:urlEncoded />
</wsdl:input>
<wsdl:output>
<mime:content type="text/xml" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="testMultiPartWarning">
<http:operation location="/testMultiPartWarning" />
<wsdl:input>
<http:urlEncoded />
</wsdl:input>
<wsdl:output>
<mime:content type="text/xml" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="testEmptyComplex">
<http:operation location="/testEmptyComplex" />
<wsdl:input>
<http:urlEncoded />
</wsdl:input>
<wsdl:output>
<mime:content type="text/xml" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<service name="testService">
<port name="testPort" binding="tns:testBinding">
<soap:address location="http://127.0.0.1/testPort" />
</port>
</service>
<wsdl:port name="HTTPPort" binding="tns:HTTPBinding">
<http:address location="http://www.example.org/"></http:address>
</wsdl:port>
</service>
</definitions>

View File

@@ -0,0 +1,297 @@
<?xml version="1.0"?>
<definitions name="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/"
xmlns="http://schemas.xmlsoap.org/wsdl/"
>
<types>
<xsd:schema targetNamespace="urn:Test">
<xsd:simpleType name="testSimpleTypeList">
<xsd:annotation>
<xsd:documentation>
SimpleType: List with an integer (length 2)
</xsd:documentation>
</xsd:annotation>
<xsd:list itemType="xsd:int">
<xsd:length value="2"/>
</xsd:list>
</xsd:simpleType>
<xsd:simpleType name="testSimpleTypeListAtomic">
<xsd:annotation>
<xsd:documentation>
SimpleType: List with an integer (length 2)
</xsd:documentation>
</xsd:annotation>
<xsd:list>
<xsd:simpleType>
<xsd:restriction base="xsd:int"></xsd:restriction>
</xsd:simpleType>
</xsd:list>
</xsd:simpleType>
<xsd:simpleType name="testRestriction">
<xsd:annotation>
<xsd:documentation>
SimpleType: Integer between 1 and 9 (Exclusive constrains)
</xsd:documentation>
</xsd:annotation>
<xsd:restriction base="xsd:int">
<xsd:minExclusive value="0"/>
<xsd:maxExclusive value="10"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="testRestrictionAtomicType">
<xsd:annotation>
<xsd:documentation>
SimpleType: Integer between 1 and 9 (Exclusive constrains)
</xsd:documentation>
</xsd:annotation>
<xsd:restriction>
<xsd:simpleType>
<xsd:restriction base="xsd:int">
<xsd:minExclusive value="0"/>
<xsd:maxExclusive value="10"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="testComplexTypeAll">
<xsd:annotation>
<xsd:documentation>ComplexType Test</xsd:documentation>
</xsd:annotation>
<xsd:all>
<xsd:element name="Test1" type="xsd:string" />
<xsd:element name="Test2" type="xsd:string" minOccurs="1" />
</xsd:all>
</xsd:complexType>
<xsd:complexType name="testComplexTypeRestriction">
<xsd:annotation>
<xsd:documentation>ComplexType Test</xsd:documentation>
</xsd:annotation>
<xsd:complexContent>
<xsd:restriction base="tns:testComplexTypeAll">
<xsd:element name="Test1" type="xsd:string" minOccurs="1"/>
<xsd:element name="Test2" type="xsd:string" minOccurs="1" />
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="testComplexTypeExtension">
<xsd:annotation>
<xsd:documentation>complexType extension test</xsd:documentation>
</xsd:annotation>
<xsd:complexContent>
<xsd:extension base="tns:testComplexTypeAll">
<xsd:sequence>
<xsd:element name="Test1" type="xsd:string" />
<xsd:element name="Test2" type="xsd:string" minOccurs="1"/>
<xsd:element name="Test3" type="xsd:string" minOccurs="1"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="testComplexTypeChoice">
<xsd:annotation>
<xsd:documentation>
ComplexType Test
</xsd:documentation>
</xsd:annotation>
<xsd:choice>
<xsd:element name="Test1" type="xsd:string" minOccurs="1"/>
<xsd:element name="Test2" type="xsd:string" maxOccurs="1"/>
</xsd:choice>
</xsd:complexType>
<xsd:complexType name="testComplexTypeSequence">
<xsd:annotation>
<xsd:documentation>
ComplexType Test
</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="Test1" type="xsd:string" minOccurs="1"/>
<xsd:element name="Test2" type="xsd:string" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="testComplexTypeSequence2">
<xsd:annotation>
<xsd:documentation>
ComplexType Test
</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="Test1" type="xsd:string" minOccurs="1"/>
<xsd:element name="Test2" type="tns:testComplexTypeSequence" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="testElementString" type="xsd:string" />
<xsd:element name="testElementInt" type="xsd:int" />
<xsd:element name="testElementRefInt" ref="tns:testElementInt" />
<xsd:element name="testElementSimpleTypeList" type="tns:testSimpleTypeList"/>
<xsd:element name="testElementComplexTypeAll" type="tns:testComplexTypeAll"/>
<xsd:element name="testElementComplexTypeSequence" type="tns:testComplexTypeSequence"/>
<xsd:element name="testElementAtomicSimpleTypeRestriction">
<xsd:simpleType>
<xsd:annotation>
<xsd:documentation> SimpleType: Integer between 1 and 9
(Inclusive constraints) </xsd:documentation>
</xsd:annotation>
<xsd:restriction base="xsd:int" minInclusive="1"
maxInclusive="9"/>
</xsd:simpleType>
</xsd:element>
<xsd:element name="testElementAtomicComplexTypeAll">
<xsd:complexType>
<xsd:annotation>
<xsd:documentation> SimpleType: Integer between 1 and 9
(Inclusive constraints) </xsd:documentation>
</xsd:annotation>
<xsd:all>
<xsd:element name="test1" type="int"/>
<xsd:element name="test2" type="xsd:string"/>
</xsd:all>
</xsd:complexType>
</xsd:element>
<xsd:element name="Header" type="tns:testComplexTypeSequence"/>
<xsd:element name="testHeader" type="tns:testComplexTypeSequence"/>
<xsd:element name="testChoice" type="tns:testComplexTypeChoice"/>
<xsd:complexType name="testComplexTypeElementAtomicSimpleType">
<xsd:sequence>
<xsd:element name="testString" type="xsd:string" minOccurs="0"/>
<xsd:element name="testAtomicSimpleTypeElement" minOccurs="0">
<xsd:simpleType>
<xsd:restriction base="xsd:decimal">
<xsd:minInclusive value="0"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="testAtomicSimpleTypeElement2" minOccurs="0">
<xsd:simpleType>
<xsd:restriction base="xsd:decimal">
<xsd:minInclusive value="0"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</types>
<message name="testChoice">
<part name="parameters" element="tns:testChoice"/>
</message>
<message name="testRequest">
<part name="testAll" element="tns:testElementString"/>
</message>
<message name="testResponse">
<part name="testAll" element="tns:testElementString"/>
</message>
<message name="testMultiPartWarning">
<part name="testAll" element="tns:testElementString"/>
<part name="parameters" element="tns:testChoice"/>
</message>
<message name="testHeaderRequest">
<part name="testBody" element="tns:testHeader"/>
<part name="testHeader" element="tns:Header"/>
</message>
<message name="testHeaderResponse">
<part name="testAll" element="tns:testElementString"/>
</message>
<portType name="testPort">
<operation name="test">
<documentation>
Test-Methode
</documentation>
<input message="tns:testRequest"/>
<output message="tns:testResponse"/>
</operation>
<operation name="testHeader">
<documentation>
Test-Methode
</documentation>
<input message="tns:testHeaderRequest"/>
<output message="tns:testHeaderResponse"/>
</operation>
<operation name="testChoice">
<documentation>
Test-Methode
</documentation>
<input message="tns:testChoice"/>
<output message="tns:testChoice"/>
</operation>
<operation name="testMultiPartWarning">
<documentation>
Test-Methode
</documentation>
<input message="tns:testMultiPartWarning"/>
<output message="tns:testMultiPartWarning"/>
</operation>
</portType>
<binding type="tns:testPort" name="testBinding">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="testChoice">
<soap:operation soapAction="testChoice" style="document"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
<operation name="test">
<soap:operation soapAction="test" style="document"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
<operation name="testHeader">
<soap:operation soapAction="testHeader"/>
<input>
<soap:body use="literal" parts="tns:testBody"/>
<soap:header use="literal" part="tns:testHeader" message="tns:testHeaderRequest"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
<operation name="testMultiPartWarning">
<soap:operation soapAction="testHeader"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="My.SOAP.testService">
<port name="My.SOAP.testPort" binding="tns:testBinding">
<soap:address location="http://127.0.0.1/testPort" />
</port>
</service>
</definitions>

View File

@@ -81,4 +81,68 @@ __PACKAGE__->_factory(
__PACKAGE__->__set_name('MyAtomicComplexTypeElement');
package MyTestAttr;
use base qw(SOAP::WSDL::XSD::Typelib::Attribute
SOAP::WSDL::XSD::Typelib::Builtin::string
);
package MyElementAttrs;
use strict;
use SOAP::WSDL::XSD::Typelib::Element;
use SOAP::WSDL::XSD::Typelib::ComplexType;
use SOAP::WSDL::XSD::Typelib::Builtin;
use base (
'SOAP::WSDL::XSD::Typelib::Element',
'SOAP::WSDL::XSD::Typelib::ComplexType',
);
{
my %test_of :ATTR(:get<test>);
my %test2_of :ATTR(:get<test2>);
sub get_xmlns { 'urn:Test' };
__PACKAGE__->_factory(
[ qw(test test2) ],
{
test => \%test_of,
test2 => \%test2_of,
},
{
# this is the <element ref="" variant....
test => 'MyTestElement',
test2 => 'MyTestElement2',
},
);
}
__PACKAGE__->__set_name('MyElementAttrs');
package MyElementAttrs::_ATTR;
use strict;
use SOAP::WSDL::XSD::Typelib::ComplexType;
use SOAP::WSDL::XSD::Typelib::Builtin;
use base qw(
SOAP::WSDL::XSD::Typelib::AttributeSet
);
{
my %test_of :ATTR(:get<test>);
my %test2_of :ATTR(:get<test2>);
sub get_xmlns { 'urn:Test' };
__PACKAGE__->_factory(
[ qw(test test2) ],
{
test => \%test_of,
test2 => \%test2_of,
},
{
# this is the <element ref="" variant....
test => 'MyTestAttr',
test2 => 'MyTestAttr',
},
);
}
1;