Compare commits

..

3 Commits

Author SHA1 Message Date
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
Martin Kutter
eb096ad88e import SOAP-WSDL 2.00_27 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_27
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_27.tar.gz
2009-12-12 19:48:14 -08:00
Martin Kutter
3cfeebae54 import SOAP-WSDL 2.00_26 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_26
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_26.tar.gz
2009-12-12 19:48:13 -08:00
116 changed files with 3753 additions and 466 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_25',
dist_version => '2.00_28',
module_name => 'SOAP::WSDL',
license => 'artistic',
requires => {

57
Changes
View File

@@ -1,4 +1,4 @@
Release notes for SOAP::WSDL 2.00_24
Release notes for SOAP::WSDL 2.00_28
-------
I'm proud to present a new pre-release version of SOAP::WSDL.
@@ -34,6 +34,61 @@ Features:
The following changes have been made:
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
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1850793 ] Add a to_hash_ref method
* [ 1844427 ] Support multiple parts in body
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/).
* [ 1850795 ] attributes referencing types in default namespace throw
* [ 1844458 ] Add warning when generating Interface with multiple parts
* [ 1843841 ] Grammar/typos in Manual.pod
* [ 1843799 ] ./Build test fails due to testcount mismatch not IO::Scalar
* [ 1845077 ] Top level simpleType elements don't serialize correctly
The following uncategorized improvements have been made:
* Fixed serializing complexType elements with no elements to empty element
* Enhanced test suite
* Documentation improvements
2.00_26
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
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/).
* [ 1843195 ] t/013_complexType.t still requires Class::Std::Storable
* [ 1843590 ] Tests broken on Cygwin
The following uncategorized improvements have been made:
* Added examples
* Added Content-length header to CGI output
2.00_25
---
WARNING: INCOMPATIBLE CHANGE:

View File

@@ -1,5 +1,7 @@
benchmark/01_expat.t
benchmark/hello.pl
benchmark/person.pl
benchmark/person.xml
benchmark/XSD/01_anyType.t
benchmark/XSD/02_anySimpleType.t
benchmark/XSD/03_string.t
@@ -7,6 +9,7 @@ bin/wsdl2perl.pl
Build.PL
Changes
example/cgi-bin/helloworld.pl
example/cgi-bin/person.pl
example/fortune.pl
example/genericbarcode.pl
example/hello.pl
@@ -25,6 +28,8 @@ example/lib/MyElements/GetSpecificCookieResponse.pm
example/lib/MyElements/GetWeather.pm
example/lib/MyElements/GetWeatherResponse.pm
example/lib/MyElements/int.pm
example/lib/MyElements/ListPerson.pm
example/lib/MyElements/ListPersonResponse.pm
example/lib/MyElements/readNodeCount.pm
example/lib/MyElements/readNodeCountResponse.pm
example/lib/MyElements/sayHello.pm
@@ -34,13 +39,31 @@ example/lib/MyInterfaces/BarCode/BarCodeSoap.pm
example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie/FullerData_x0020_Fortune_x0020_CookieSoap.pm
example/lib/MyInterfaces/GlobalWeather/GlobalWeatherSoap.pm
example/lib/MyInterfaces/HelloWorld/HelloWorldSoap.pm
example/lib/MyInterfaces/TestService/TestPort.pm
example/lib/MyServer/HelloWorld/HelloWorldSoap.pm
example/lib/MyServer/TestService/TestPort.pm
example/lib/MyTypemaps/BarCode.pm
example/lib/MyTypemaps/FullerData_x0020_Fortune_x0020_Cookie.pm
example/lib/MyTypemaps/GlobalWeather.pm
example/lib/MyTypemaps/HelloWorld.pm
example/lib/MyTypemaps/TestService.pm
example/lib/MyTypes/Address.pm
example/lib/MyTypes/ArrayOfContract.pm
example/lib/MyTypes/ArrayOfPerson.pm
example/lib/MyTypes/BarCodeData.pm
example/lib/MyTypes/BarcodeOption.pm
example/lib/MyTypes/BarcodeType.pm
example/lib/MyTypes/CheckSumMethod.pm
example/lib/MyTypes/Contract.pm
example/lib/MyTypes/ImageFormats.pm
example/lib/MyTypes/Person.pm
example/lib/MyTypes/PersonID.pm
example/lib/MyTypes/PhoneNumber.pm
example/lib/MyTypes/ShowTextPosition.pm
example/lib/MyTypes/test2.pm
example/lib/MyTypes/testExtended.pm
example/person.pl
example/person_compile.pl
example/visitor/visitor.pl
example/weather.pl
example/weather_wsdl.pl
@@ -48,6 +71,7 @@ example/wsdl/11_helloworld.wsdl
example/wsdl/FortuneCookie.xml
example/wsdl/genericbarcode.xml
example/wsdl/globalweather.xml
example/wsdl/Person.wsdl
HACKING
lib/SOAP/WSDL.pm
lib/SOAP/WSDL/Base.pm
@@ -250,6 +274,7 @@ t/acceptance/wsdl/email_account.wsdl
t/acceptance/wsdl/generator_test.wsdl
t/acceptance/wsdl/generator_unsupported_test.wsdl
t/acceptance/wsdl/message_gateway.wsdl
t/contributed.wsdl
t/Expat/01_expat.t
t/Expat/03_wsdl.t
t/lib/MyComplexType.pm
@@ -292,6 +317,8 @@ t/SOAP/WSDL/Generator/Visitor/Typemap.t
t/SOAP/WSDL/Generator/XCS.t
t/SOAP/WSDL/Generator/XSD.t
t/SOAP/WSDL/Generator/XSD_unsupported.t
t/SOAP/WSDL/Part.t
t/SOAP/WSDL/Serializer/XSD.t
t/SOAP/WSDL/Server.t
t/SOAP/WSDL/Server/CGI.t
t/SOAP/WSDL/Transport/01_Test.t
@@ -299,6 +326,9 @@ t/SOAP/WSDL/Transport/02_HTTP.t
t/SOAP/WSDL/Transport/acceptance/test2.xml
t/SOAP/WSDL/Transport/acceptance/test3.xml
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/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_25
version: 2.00_28
author:
- 'Martin Kutter <martin.kutter@fen-net.de>'
abstract: SOAP with WSDL support
@@ -33,18 +33,18 @@ provides:
version: 2.00_25
SOAP::WSDL::Base:
file: lib/SOAP/WSDL/Base.pm
version: 2.00_25
version: 2.00_27
SOAP::WSDL::Binding:
file: lib/SOAP/WSDL/Binding.pm
SOAP::WSDL::Client:
file: lib/SOAP/WSDL/Client.pm
version: 2.00_25
version: 2.00_27
SOAP::WSDL::Client::Base:
file: lib/SOAP/WSDL/Client/Base.pm
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_25
version: 2.00_27
SOAP::WSDL::Service:
file: lib/SOAP/WSDL/Service.pm
SOAP::WSDL::Transport::HTTP:
@@ -256,10 +256,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_27
SOAP::WSDL::XSD::Typelib::Element:
file: lib/SOAP/WSDL/XSD/Typelib/Element.pm
version: 2.00_25
version: 2.00_27
SOAP::WSDL::XSD::Typelib::SimpleType:
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
SOAP::WSDL::XSD::Typelib::SimpleType::restriction:

12
TODO
View File

@@ -3,22 +3,22 @@ TODO list for SOAP::WSDL
2.00 Pre-releases
--------
* Act as SOAP Server [ 1842436 ]
2.1 release
--------
* Support namespaces in SOAP message payload(#1809057)
* Support namespaces in SOAP message payload [ 1809057 ]
* Support the xsi:type attribute on derived types on the wire(#1809059)
* Support the xsi:type attribute on derived types on the wire [ 1809059 ]
* SOAP1.2 support (#1803331)
* SOAP1.2 support [ 1803331 ]
2.2 release
--------
* XML schema support ("minimal conformant") (#1764845)
* XML schema support ("minimal conformant") [ 1764845 ]
* Support SOAP attachments
* Act as SOAP Server
3.0 release
--------
We're not thinking that far ahead right now.

114
benchmark/person.pl Normal file
View File

@@ -0,0 +1,114 @@
use lib '../lib';
use lib '../example/lib';
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::WSDL11;
use XML::Simple;
use SOAP::WSDL::Deserializer::XSD_XS;
use SOAP::WSDL::Factory::Deserializer;
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
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});
# Initialize SOAP::Lite
my $deserializer = SOAP::Deserializer->new();
# Initialize SOAP::WSDL interface
my $soap = MyInterfaces::TestService::TestPort->new();
# Load all classes - XML::Compile has created everything before, too
$soap->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 @data = ();
my $n = 0;
print "Benchmark conducted with
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() )},
'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() )}
};
print "Benchmark $n: Push result on list\n";
$n++;
cmpthese 500, {
'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
'XML::Compile::SOAP' => sub { push @data, $call->() },
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
};
@data = ();
print "Benchmark $n: Play it again, Sam\n";
cmpthese 500, {
'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() )}
};

437
benchmark/person.xml Normal file
View File

@@ -0,0 +1,437 @@
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body>
<ListPersonResponse xmlns="http://www.example.org/benchmark/">
<out>
<NewElement>
<PersonID>
<ID>1</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</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>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>1</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</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>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>1</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</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>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>1</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</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>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>1</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</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>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>1</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</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>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>1</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</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>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>1</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</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>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>1</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</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>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>1</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</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>
</Contracts>
</NewElement>
</out>
</ListPersonResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

View File

@@ -52,4 +52,5 @@ Then run the helloworld.pl from the examples directory. It should print
=head1 DESCRIPTION
=cut
=cut

83
example/cgi-bin/person.pl Executable file
View File

@@ -0,0 +1,83 @@
#!/usr/bin/perl -w
use strict;
use warnings;
use lib qw(../lib ../../lib);
use MyElements::ListPersonResponse;
use MyServer::TestService::TestPort;
my $server = MyServer::TestService::TestPort->new({
dispatch_to => 'main',
transport_class => 'SOAP::WSDL::Server::CGI', # optional, default
});
$server->handle();
sub ListPerson {
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...
my %person = (
PersonID => { # MyTypes::PersonID
ID => 1, # int
},
Salutation => 'Salutation0', # string
Name => 'Name0', # string
GivenName => 'Martin', # string
DateOfBirth => '1970-01-01', # date
HomeAddress => { # MyTypes::Address
Street => 'Street 0', # string
ZIP => '00000', # string
City => 'City0', # string
Country => 'Country0', # string
PhoneNumber => '++499131123456', # PhoneNumber
MobilePhoneNumber => '++49150123456', # PhoneNumber
},
WorkAddress => { # MyTypes::Address
Street => 'Somestreet 23', # string
ZIP => '12345', # string
City => 'SomeCity', # string
Country => 'Germany', # string
PhoneNumber => '++499131123456', # PhoneNumber
MobilePhoneNumber => '++49150123456', # PhoneNumber
},
Contracts => { # MyTypes::ArrayOfContract
Contract => [
{ # MyTypes::Contract
ContractID => 100000, # long
ContractName => 'SomeContract0', # string
},
{ # MyTypes::Contract
ContractID => 100001, # long
ContractName => 'SomeContract1', # string
},
{ # MyTypes::Contract
ContractID => 100002, # long
ContractName => 'SomeContract2', # string
},
{ # MyTypes::Contract
ContractID => 100003, # long
ContractName => 'SomeContract3', # string
},
],
},
);
return MyElements::ListPersonResponse->new( {
out => { # MyTypes::ArrayOfPerson
NewElement => [
{ %person },
{ %person },
{ %person },
{ %person },
{ %person },
{ %person },
{ %person },
{ %person },
{ %person },
{ %person },
],
},
}
);
}

View File

@@ -1,11 +1,12 @@
#!/usr/bin/perl -w
use strict;
use warnings;
use lib 'lib';
use lib 'lib'; # just needed because interface lies here
# I have to generate the interface using wsdl2perl.pl before
use MyInterfaces::HelloWorld::HelloWorldSoap;
# I instantiate a interface class.
my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new();
# I have to lookup the method and synopsis from the interface's pod
@@ -14,8 +15,9 @@ my $result = $soap->sayHello({
givenName => $ARGV[0] || '"Your given name"',
});
# SOAP::WSDL::SOAP::Typelib::Fault11 objects are false, but serialize to XML
die $result if not $result;
# I have to lookup the output parameter from the interface's POD - or try:
# Bad method names will die with a list of available methods
print $result->get_sayHelloResult(), "\n";
# Will die on bad method names with a list of available methods
print $result->get_sayHelloResult(), "\n";

View File

@@ -4,18 +4,22 @@ use warnings;
use XML::Compile::WSDL11;
use XML::Compile::Transport::SOAPHTTP;
# I need access to the WSDL around - or use Data::Dumper::Streamer
# for serializing the generated closures into (big) perl files
my $wsdl = XML::Compile::WSDL11->new('wsdl/11_helloworld.wsdl');
# I have to lookup the methods from the WSDL
# I compile a interface method for a single SOAP method from the WSDL
# I have to lookup the method names from the WSDL
my $call = $wsdl->compileClient('sayHello');
# I have to lookup the parameters from the WSDL
# I have to lookup the parameters from the WSDL - can be quite tricky
my $result = $call->(
name => $ARGV[1] || '"Your name"',
givenName => $ARGV[0] || '"Your given name"',
);
# XML::Compile::SOAP's client just returns undef in case of failure
die "Error calling soap method" if not defined $result;
# I have to lookup the output parameters from the WSDL - or try Dumper
print $result->{ parameters }->{ sayHelloResult }, "\n";
# I have to lookup the output parameters from the WSDL - or try Data::Dumper
print $result->{ parameters }->{ sayHelloResult }, "\n";

View File

@@ -13,15 +13,16 @@ $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

@@ -13,8 +13,8 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
@@ -44,7 +44,7 @@ CountCookies from the namespace http://www.fullerdata.com/FortuneCookie/FortuneC
Constructor. The following data structure may be passed to new():
,
=head1 AUTHOR

View File

@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %CountCookiesResult_of :ATTR(:get<CountCookiesResult>);
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
[ qw(
CountCookiesResult
) ],
{
CountCookiesResult => \%CountCookiesResult_of,
{
CountCookiesResult => \%CountCookiesResult_of,
},
{
CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{
CountCookiesResult => $some_value, # int
}
},
=head1 AUTHOR

View File

@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %BarCodeParam_of :ATTR(:get<BarCodeParam>);
@@ -29,9 +31,9 @@ __PACKAGE__->_factory(
BarCodeParam
BarCodeText
) ],
{
BarCodeParam => \%BarCodeParam_of,
BarCodeText => \%BarCodeText_of,
{
BarCodeParam => \%BarCodeParam_of,
BarCodeText => \%BarCodeText_of,
},
{
BarCodeParam => 'MyTypes::BarCodeData',

View File

@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %GenerateBarCodeResult_of :ATTR(:get<GenerateBarCodeResult>);
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
[ qw(
GenerateBarCodeResult
) ],
{
GenerateBarCodeResult => \%GenerateBarCodeResult_of,
{
GenerateBarCodeResult => \%GenerateBarCodeResult_of,
},
{
GenerateBarCodeResult => 'SOAP::WSDL::XSD::Typelib::Builtin::base64Binary',

View File

@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %CountryName_of :ATTR(:get<CountryName>);
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
[ qw(
CountryName
) ],
{
CountryName => \%CountryName_of,
{
CountryName => \%CountryName_of,
},
{
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{
CountryName => $some_value, # string
}
},
=head1 AUTHOR

View File

@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %GetCitiesByCountryResult_of :ATTR(:get<GetCitiesByCountryResult>);
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
[ qw(
GetCitiesByCountryResult
) ],
{
GetCitiesByCountryResult => \%GetCitiesByCountryResult_of,
{
GetCitiesByCountryResult => \%GetCitiesByCountryResult_of,
},
{
GetCitiesByCountryResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{
GetCitiesByCountryResult => $some_value, # string
}
},
=head1 AUTHOR

View File

@@ -13,8 +13,8 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
@@ -44,7 +44,7 @@ GetFortuneCookie from the namespace http://www.fullerdata.com/FortuneCookie/Fort
Constructor. The following data structure may be passed to new():
,
=head1 AUTHOR

View File

@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %GetFortuneCookieResult_of :ATTR(:get<GetFortuneCookieResult>);
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
[ qw(
GetFortuneCookieResult
) ],
{
GetFortuneCookieResult => \%GetFortuneCookieResult_of,
{
GetFortuneCookieResult => \%GetFortuneCookieResult_of,
},
{
GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{
GetFortuneCookieResult => $some_value, # string
}
},
=head1 AUTHOR

View File

@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %index_of :ATTR(:get<index>);
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
[ qw(
index
) ],
{
index => \%index_of,
{
index => \%index_of,
},
{
index => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{
index => $some_value, # int
}
},
=head1 AUTHOR

View File

@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %GetSpecificCookieResult_of :ATTR(:get<GetSpecificCookieResult>);
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
[ qw(
GetSpecificCookieResult
) ],
{
GetSpecificCookieResult => \%GetSpecificCookieResult_of,
{
GetSpecificCookieResult => \%GetSpecificCookieResult_of,
},
{
GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{
GetSpecificCookieResult => $some_value, # string
}
},
=head1 AUTHOR

View File

@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %CityName_of :ATTR(:get<CityName>);
@@ -29,9 +31,9 @@ __PACKAGE__->_factory(
CityName
CountryName
) ],
{
CityName => \%CityName_of,
CountryName => \%CountryName_of,
{
CityName => \%CityName_of,
CountryName => \%CountryName_of,
},
{
CityName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -74,7 +76,7 @@ Constructor. The following data structure may be passed to new():
{
CityName => $some_value, # string
CountryName => $some_value, # string
}
},
=head1 AUTHOR

View File

@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %GetWeatherResult_of :ATTR(:get<GetWeatherResult>);
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
[ qw(
GetWeatherResult
) ],
{
GetWeatherResult => \%GetWeatherResult_of,
{
GetWeatherResult => \%GetWeatherResult_of,
},
{
GetWeatherResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{
GetWeatherResult => $some_value, # string
}
},
=head1 AUTHOR

View File

@@ -0,0 +1,111 @@
package MyElements::ListPerson;
use strict;
use warnings;
{ # BLOCK to scope variables
sub get_xmlns { 'http://www.example.org/benchmark/' }
__PACKAGE__->__set_name('ListPerson');
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %in_of :ATTR(:get<in>);
__PACKAGE__->_factory(
[ qw(
in
) ],
{
in => \%in_of,
},
{
in => 'MyTypes::Person',
}
);
} # end BLOCK
} # end of BLOCK
1;
# __END__
=pod
=head1 NAME
MyElements::ListPerson
=head1 DESCRIPTION
Perl data type class for the XML Schema defined element
ListPerson from the namespace http://www.example.org/benchmark/.
=head1 METHODS
=head2 new
my $element = MyElements::ListPerson->new($data);
Constructor. The following data structure may be passed to new():
{
in => { # MyTypes::Person
PersonID => { # MyTypes::PersonID
ID => $some_value, # int
},
Salutation => $some_value, # string
Name => $some_value, # string
GivenName => $some_value, # string
DateOfBirth => $some_value, # date
HomeAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
WorkAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
Contracts => { # MyTypes::ArrayOfContract
Contract => { # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
},
},
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut

View File

@@ -0,0 +1,113 @@
package MyElements::ListPersonResponse;
use strict;
use warnings;
{ # BLOCK to scope variables
sub get_xmlns { 'http://www.example.org/benchmark/' }
__PACKAGE__->__set_name('ListPersonResponse');
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %out_of :ATTR(:get<out>);
__PACKAGE__->_factory(
[ qw(
out
) ],
{
out => \%out_of,
},
{
out => 'MyTypes::ArrayOfPerson',
}
);
} # end BLOCK
} # end of BLOCK
1;
# __END__
=pod
=head1 NAME
MyElements::ListPersonResponse
=head1 DESCRIPTION
Perl data type class for the XML Schema defined element
ListPersonResponse from the namespace http://www.example.org/benchmark/.
=head1 METHODS
=head2 new
my $element = MyElements::ListPersonResponse->new($data);
Constructor. The following data structure may be passed to new():
{
out => { # MyTypes::ArrayOfPerson
NewElement => { # MyTypes::Person
PersonID => { # MyTypes::PersonID
ID => $some_value, # int
},
Salutation => $some_value, # string
Name => $some_value, # string
GivenName => $some_value, # string
DateOfBirth => $some_value, # date
HomeAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
WorkAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
Contracts => { # MyTypes::ArrayOfContract
Contract => { # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
},
},
},
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut

View File

@@ -12,8 +12,8 @@ __PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::Builtin::int
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::Builtin::int
);

View File

@@ -13,8 +13,8 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
@@ -44,7 +44,7 @@ readNodeCount from the namespace http://www.fullerdata.com/FortuneCookie/Fortune
Constructor. The following data structure may be passed to new():
,
=head1 AUTHOR

View File

@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Storable;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %readNodeCountResult_of :ATTR(:get<readNodeCountResult>);
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
[ qw(
readNodeCountResult
) ],
{
readNodeCountResult => \%readNodeCountResult_of,
{
readNodeCountResult => \%readNodeCountResult_of,
},
{
readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{
readNodeCountResult => $some_value, # int
}
},
=head1 AUTHOR

View File

@@ -12,8 +12,8 @@ __PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::Builtin::string
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::Builtin::string
);

View File

@@ -1,12 +1,13 @@
package MyInterfaces::BarCode::BarCodeSoap;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before
require MyTypemaps::BarCode
if not MyTypemaps::BarCode->can('get_class');
if not MyTypemaps::BarCode->can('get_class');
sub START {
$_[0]->set_proxy('http://www.webservicex.net/genericbarcode.asmx') if not $_[2]->{proxy};
@@ -16,11 +17,12 @@ sub START {
sub GenerateBarCode {
my ($self, $body, $header) = @_;
die "GenerateBarCode must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({
operation => 'GenerateBarCode',
operation => 'GenerateBarCode',
soap_action => 'http://www.webservicex.net/GenerateBarCode',
style => 'document',
body => {
body => {
'use' => 'literal',
namespace => '',
@@ -58,12 +60,12 @@ MyInterfaces::BarCode::BarCodeSoap - SOAP Interface for the BarCode Web Service
my $response;
$response = $interface->GenerateBarCode();
=head1 DESCRIPTION
SOAP Interface for the BarCode web service
SOAP Interface for the BarCode web service
located at http://www.webservicex.net/genericbarcode.asmx.
=head1 SERVICE BarCode
@@ -86,12 +88,12 @@ All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
=head2 SOAP Service methods
Method synopsis is displayed with hash refs as parameters.
Method synopsis is displayed with hash refs as parameters.
The commented class names in the method's parameters denote that objects
The commented class names in the method's parameters denote that objects
of the corresponding class can be passed instead of the marked hash ref.
You may pass any combination of objects, hash and list refs to these
You may pass any combination of objects, hash and list refs to these
methods, as long as you meet the structure.
@@ -124,10 +126,10 @@ WebserviceX.NET barcode library that provides the means to create barcodes for p
},,
);
=head1 AUTHOR
Generated by SOAP::WSDL on Fri Nov 9 00:18:35 2007
Generated by SOAP::WSDL on Sun Dec 16 20:10:20 2007
=pod

View File

@@ -1,12 +1,13 @@
package MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before
require MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie
if not MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie->can('get_class');
if not MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie->can('get_class');
sub START {
$_[0]->set_proxy('http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx') if not $_[2]->{proxy};
@@ -16,11 +17,12 @@ sub START {
sub readNodeCount {
my ($self, $body, $header) = @_;
die "readNodeCount must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({
operation => 'readNodeCount',
operation => 'readNodeCount',
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/readNodeCount',
style => 'document',
body => {
body => {
'use' => 'literal',
namespace => '',
@@ -38,11 +40,12 @@ sub readNodeCount {
sub GetFortuneCookie {
my ($self, $body, $header) = @_;
die "GetFortuneCookie must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({
operation => 'GetFortuneCookie',
operation => 'GetFortuneCookie',
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetFortuneCookie',
style => 'document',
body => {
body => {
'use' => 'literal',
namespace => '',
@@ -60,11 +63,12 @@ sub GetFortuneCookie {
sub CountCookies {
my ($self, $body, $header) = @_;
die "CountCookies must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({
operation => 'CountCookies',
operation => 'CountCookies',
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/CountCookies',
style => 'document',
body => {
body => {
'use' => 'literal',
namespace => '',
@@ -82,11 +86,12 @@ sub CountCookies {
sub GetSpecificCookie {
my ($self, $body, $header) = @_;
die "GetSpecificCookie must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({
operation => 'GetSpecificCookie',
operation => 'GetSpecificCookie',
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetSpecificCookie',
style => 'document',
body => {
body => {
'use' => 'literal',
namespace => '',
@@ -117,9 +122,22 @@ __END__
MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap - SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie Web Service
=head1 SYNOPSIS
use MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap;
my $interface = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap->new();
my $response;
$response = $interface->readNodeCount();
$response = $interface->GetFortuneCookie();
$response = $interface->CountCookies();
$response = $interface->GetSpecificCookie();
=head1 DESCRIPTION
SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie web service
SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie web service
located at http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
=head1 SERVICE FullerData_x0020_Fortune_x0020_Cookie
@@ -142,12 +160,12 @@ All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
=head2 SOAP Service methods
Method synopsis is displayed with hash refs as parameters.
Method synopsis is displayed with hash refs as parameters.
The commented class names in the method's parameters denote that objects
The commented class names in the method's parameters denote that objects
of the corresponding class can be passed instead of the marked hash ref.
You may pass any combination of objects, hash and list refs to these
You may pass any combination of objects, hash and list refs to these
methods, as long as you meet the structure.
@@ -156,21 +174,21 @@ methods, as long as you meet the structure.
Display the number of nodes specified in fortune XML document
$interface->readNodeCount(,
$interface->readNodeCount(,,
);
=head3 GetFortuneCookie
Get a random fortune cookie from the XML document
$interface->GetFortuneCookie(,
$interface->GetFortuneCookie(,,
);
=head3 CountCookies
Count the actual number of nodes in the XML document of fortunes
$interface->CountCookies(,
$interface->CountCookies(,,
);
=head3 GetSpecificCookie
@@ -179,13 +197,13 @@ Get a specific cookie by the XML node number
$interface->GetSpecificCookie( {
index => $some_value, # int
},
},,
);
=head1 AUTHOR
Generated by SOAP::WSDL on Tue Nov 6 20:56:46 2007
Generated by SOAP::WSDL on Sun Dec 16 19:58:30 2007
=pod

View File

@@ -1,12 +1,13 @@
package MyInterfaces::GlobalWeather::GlobalWeatherSoap;
use strict;
use warnings;
use Class::Std::Storable;
use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before
require MyTypemaps::GlobalWeather
if not MyTypemaps::GlobalWeather->can('get_class');
if not MyTypemaps::GlobalWeather->can('get_class');
sub START {
$_[0]->set_proxy('http://www.webservicex.net/globalweather.asmx') if not $_[2]->{proxy};
@@ -16,11 +17,12 @@ sub START {
sub GetWeather {
my ($self, $body, $header) = @_;
die "GetWeather must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({
operation => 'GetWeather',
operation => 'GetWeather',
soap_action => 'http://www.webserviceX.NET/GetWeather',
style => 'document',
body => {
body => {
'use' => 'literal',
namespace => '',
@@ -38,11 +40,12 @@ sub GetWeather {
sub GetCitiesByCountry {
my ($self, $body, $header) = @_;
die "GetCitiesByCountry must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({
operation => 'GetCitiesByCountry',
operation => 'GetCitiesByCountry',
soap_action => 'http://www.webserviceX.NET/GetCitiesByCountry',
style => 'document',
body => {
body => {
'use' => 'literal',
namespace => '',
@@ -73,9 +76,20 @@ __END__
MyInterfaces::GlobalWeather::GlobalWeatherSoap - SOAP Interface for the GlobalWeather Web Service
=head1 SYNOPSIS
use MyInterfaces::GlobalWeather::GlobalWeatherSoap;
my $interface = MyInterfaces::GlobalWeather::GlobalWeatherSoap->new();
my $response;
$response = $interface->GetWeather();
$response = $interface->GetCitiesByCountry();
=head1 DESCRIPTION
SOAP Interface for the GlobalWeather web service
SOAP Interface for the GlobalWeather web service
located at http://www.webservicex.net/globalweather.asmx.
=head1 SERVICE GlobalWeather
@@ -98,12 +112,12 @@ All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
=head2 SOAP Service methods
Method synopsis is displayed with hash refs as parameters.
Method synopsis is displayed with hash refs as parameters.
The commented class names in the method's parameters denote that objects
The commented class names in the method's parameters denote that objects
of the corresponding class can be passed instead of the marked hash ref.
You may pass any combination of objects, hash and list refs to these
You may pass any combination of objects, hash and list refs to these
methods, as long as you meet the structure.
@@ -115,7 +129,7 @@ Get weather report for all major cities around the world.
$interface->GetWeather( {
CityName => $some_value, # string
CountryName => $some_value, # string
},
},,
);
=head3 GetCitiesByCountry
@@ -124,13 +138,13 @@ Get all major cities by country name(full / part).
$interface->GetCitiesByCountry( {
CountryName => $some_value, # string
},
},,
);
=head1 AUTHOR
Generated by SOAP::WSDL on Tue Nov 6 21:00:30 2007
Generated by SOAP::WSDL on Sun Dec 16 20:05:01 2007
=pod

View File

@@ -38,12 +38,8 @@ sub sayHello {
}, $body, $header);
}
1;
__END__
=pod

View File

@@ -0,0 +1,146 @@
package MyInterfaces::TestService::TestPort;
use strict;
use warnings;
use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before
require MyTypemaps::TestService
if not MyTypemaps::TestService->can('get_class');
sub START {
$_[0]->set_proxy('http://localhost:81/soap-wsdl-test/person.pl') if not $_[2]->{proxy};
$_[0]->set_class_resolver('MyTypemaps::TestService')
if not $_[2]->{class_resolver};
}
sub ListPerson {
my ($self, $body, $header) = @_;
die "ListPerson must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({
operation => 'ListPerson',
soap_action => 'http://www.example.org/benchmark/ListPerson',
style => 'document',
body => {
'use' => 'literal',
namespace => '',
encodingStyle => '',
parts => [qw( MyElements::ListPerson )],
},
header => {
},
headerfault => {
}
}, $body, $header);
}
1;
__END__
=pod
=head1 NAME
MyInterfaces::TestService::TestPort - SOAP Interface for the TestService Web Service
=head1 SYNOPSIS
use MyInterfaces::TestService::TestPort;
my $interface = MyInterfaces::TestService::TestPort->new();
my $response;
$response = $interface->ListPerson();
=head1 DESCRIPTION
SOAP Interface for the TestService web service
located at http://localhost:81/soap-wsdl-test/person.pl.
=head1 SERVICE TestService
=head2 Port TestPort
=head1 METHODS
=head2 General methods
=head3 new
Constructor.
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
=head2 SOAP Service methods
Method synopsis is displayed with hash refs as parameters.
The commented class names in the method's parameters denote that objects
of the corresponding class can be passed instead of the marked hash ref.
You may pass any combination of objects, hash and list refs to these
methods, as long as you meet the structure.
=head3 ListPerson
$interface->ListPerson( {
in => { # MyTypes::Person
PersonID => { # MyTypes::PersonID
ID => $some_value, # int
},
Salutation => $some_value, # string
Name => $some_value, # string
GivenName => $some_value, # string
DateOfBirth => $some_value, # date
HomeAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
WorkAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
Contracts => { # MyTypes::ArrayOfContract
Contract => { # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
},
},
},,
);
=head1 AUTHOR
Generated by SOAP::WSDL on Mon Dec 3 22:20:49 2007
=pod

View File

@@ -0,0 +1,145 @@
package MyServer::TestService::TestPort;
use strict;
use warnings;
use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before
require MyTypemaps::TestService
if not MyTypemaps::TestService->can('get_class');
my %transport_class_of :ATTR(:name<transport_class> :default<SOAP::WSDL::Server::CGI>);
my %transport_of :ATTR(:name<transport> :default<()>);
my %dispatch_to :ATTR(:name<dispatch_to>);
my $action_map_ref = {
'http://www.example.org/benchmark/ListPerson' => 'ListPerson',
};
sub START {
my ($self, $ident, $arg_ref) = @_;
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,
class_resolver => 'MyTypemaps::TestService',
dispatch_to => $dispatch_to{ $ident },
});
}
sub handle {
$transport_of{ ${ $_[0] } }->handle();
}
1;
__END__
=pod
=head1 NAME
MyInterfaces::TestService::TestPort - SOAP Server Class for the TestService Web Service
=head1 SYNOPSIS
use MyServer::TestService::TestPort;
my $server = MyServer::TestService::TestPort->new({
dispatch_to => 'My::Handler::Class',
transport_class => 'SOAP::WSDL::Server::CGI', # optional, default
});
$server->handle();
=head1 DESCRIPTION
SOAP Server handler for the TestService web service
located at http://localhost:81/soap-wsdl-test/person.pl.
=head1 SERVICE TestService
=head2 Port TestPort
=head1 METHODS
=head2 General methods
=head3 new
Constructor.
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
Your dispatch_to class has to implement the following methods:
The examples below serve as copy-and-paste prototypes to use in your
class.
=head3 ListPerson
sub ListPerson {
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 MyElements::ListPersonResponse->new( {
out => { # MyTypes::ArrayOfPerson
NewElement => { # MyTypes::Person
PersonID => { # MyTypes::PersonID
ID => $some_value, # int
},
Salutation => $some_value, # string
Name => $some_value, # string
GivenName => $some_value, # string
DateOfBirth => $some_value, # date
HomeAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
WorkAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
Contracts => { # MyTypes::ArrayOfContract
Contract => { # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
},
},
},
},
);
}
=head1 AUTHOR
Generated by SOAP::WSDL on Mon Dec 3 22:20:32 2007
=pod

View File

@@ -10,13 +10,13 @@ our $typemap_1 = {
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
'GenerateBarCode' => 'MyElements::GenerateBarCode',
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'GenerateBarCode/BarCodeParam/Width' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'GenerateBarCode/BarCodeParam/Angle' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'GenerateBarCode/BarCodeParam/Width' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
'GenerateBarCode/BarCodeParam/BarCodeImageFormat' => 'MyTypes::ImageFormats',
'GenerateBarCode/BarCodeParam/BGColor' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'GenerateBarCode/BarCodeParam/Ratio' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
'GenerateBarCode/BarCodeParam/Height' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'GenerateBarCode/BarCodeParam/CheckSum' => 'SOAP::WSDL::XSD::Typelib::Builtin::boolean',
'GenerateBarCode/BarCodeParam/checkSumMethod' => 'MyTypes::CheckSumMethod',
@@ -27,18 +27,22 @@ our $typemap_1 = {
'GenerateBarCodeResponse/GenerateBarCodeResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::base64Binary',
'GenerateBarCodeResponse' => 'MyElements::GenerateBarCodeResponse',
'GenerateBarCode/BarCodeParam/Module' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'GenerateBarCode/BarCodeParam' => 'MyTypes::BarCodeData',
'GenerateBarCode/BarCodeParam/showTextPosition' => 'MyTypes::ShowTextPosition',
'GenerateBarCode/BarCodeParam' => 'MyTypes::BarCodeData',
'GenerateBarCode/BarCodeParam/FontName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string'
};
;
sub get_class {
sub get_class {
my $name = join '/', @{ $_[1] };
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
return $typemap_1->{ $name };
}
sub get_typemap {
return $typemap_1;
}
1;
__END__

View File

@@ -13,7 +13,7 @@ our $typemap_1 = {
'GetFortuneCookieResponse' => 'MyElements::GetFortuneCookieResponse',
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
'GetSpecificCookie' => 'MyElements::GetSpecificCookie',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
'CountCookies' => 'MyElements::CountCookies',
'GetSpecificCookie/index' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -24,12 +24,16 @@ our $typemap_1 = {
};
;
sub get_class {
sub get_class {
my $name = join '/', @{ $_[1] };
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
return $typemap_1->{ $name };
}
sub get_typemap {
return $typemap_1;
}
1;
__END__

View File

@@ -6,7 +6,7 @@ our $typemap_1 = {
'GetWeatherResponse/GetWeatherResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'GetWeather' => 'MyElements::GetWeather',
'GetCitiesByCountryResponse/GetCitiesByCountryResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
'GetWeatherResponse' => 'MyElements::GetWeatherResponse',
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
@@ -20,12 +20,16 @@ our $typemap_1 = {
};
;
sub get_class {
sub get_class {
my $name = join '/', @{ $_[1] };
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
return $typemap_1->{ $name };
}
sub get_typemap {
return $typemap_1;
}
1;
__END__

View File

@@ -0,0 +1,92 @@
package MyTypemaps::TestService;
use strict;
use warnings;
our $typemap_1 = {
'ListPersonResponse/out/NewElement/WorkAddress/Street' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/Contracts' => 'MyTypes::ArrayOfContract',
'ListPerson/in/HomeAddress/PhoneNumber' => 'MyTypes::PhoneNumber',
'ListPersonResponse/out/NewElement/HomeAddress' => 'MyTypes::Address',
'ListPersonResponse/out/NewElement/Contracts/Contract' => 'MyTypes::Contract',
'ListPersonResponse/out/NewElement/HomeAddress/ZIP' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/WorkAddress/City' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/HomeAddress' => 'MyTypes::Address',
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
'ListPerson/in/HomeAddress/City' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/WorkAddress/PhoneNumber' => 'MyTypes::PhoneNumber',
'ListPerson/in/WorkAddress/ZIP' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/Contracts' => 'MyTypes::ArrayOfContract',
'ListPerson/in/WorkAddress/Street' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in' => 'MyTypes::Person',
'ListPersonResponse/out/NewElement/GivenName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/HomeAddress/PhoneNumber' => 'MyTypes::PhoneNumber',
'ListPersonResponse/out/NewElement/HomeAddress/City' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement' => 'MyTypes::Person',
'ListPerson/in/PersonID/ID' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'ListPerson/in/HomeAddress/Street' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/PersonID/ID' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'ListPerson/in/HomeAddress/Country' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/GivenName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/HomeAddress/MobilePhoneNumber' => 'MyTypes::PhoneNumber',
'ListPerson/in/Name' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/PersonID' => 'MyTypes::PersonID',
'ListPersonResponse/out/NewElement/WorkAddress/MobilePhoneNumber' => 'MyTypes::PhoneNumber',
'ListPersonResponse/out' => 'MyTypes::ArrayOfPerson',
'ListPerson/in/Contracts/Contract' => 'MyTypes::Contract',
'ListPersonResponse/out/NewElement/Name' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/WorkAddress/ZIP' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/DateOfBirth' => 'SOAP::WSDL::XSD::Typelib::Builtin::date',
'ListPersonResponse/out/NewElement/HomeAddress/MobilePhoneNumber' => 'MyTypes::PhoneNumber',
'ListPersonResponse/out/NewElement/HomeAddress/Country' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/HomeAddress/Street' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/Contracts/Contract/ContractName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
'ListPerson/in/Contracts/Contract/ContractName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse' => 'MyElements::ListPersonResponse',
'ListPersonResponse/out/NewElement/Salutation' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/WorkAddress/City' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
'ListPerson' => 'MyElements::ListPerson',
'ListPerson/in/Salutation' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/WorkAddress/MobilePhoneNumber' => 'MyTypes::PhoneNumber',
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/WorkAddress/Country' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/PersonID' => 'MyTypes::PersonID',
'ListPerson/in/HomeAddress/ZIP' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/WorkAddress' => 'MyTypes::Address',
'ListPersonResponse/out/NewElement/DateOfBirth' => 'SOAP::WSDL::XSD::Typelib::Builtin::date',
'ListPerson/in/WorkAddress/PhoneNumber' => 'MyTypes::PhoneNumber',
'ListPersonResponse/out/NewElement/WorkAddress/Country' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/Contracts/Contract/ContractID' => 'SOAP::WSDL::XSD::Typelib::Builtin::long',
'ListPerson/in/Contracts/Contract/ContractID' => 'SOAP::WSDL::XSD::Typelib::Builtin::long',
'ListPerson/in/WorkAddress' => 'MyTypes::Address'
};
;
sub get_class {
my $name = join '/', @{ $_[1] };
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
return $typemap_1->{ $name };
}
sub get_typemap {
return $typemap_1;
}
1;
__END__
=pod
=head1 NAME
MyTypemaps::TestService; - typemap for ::TestService;
=head1 DESCRIPTION
Typemap created by SOAP::WSDL for map-based SOAP message parsers.
=cut

View File

@@ -0,0 +1,98 @@
package MyTypes::Address;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %Street_of :ATTR(:get<Street>);
my %ZIP_of :ATTR(:get<ZIP>);
my %City_of :ATTR(:get<City>);
my %Country_of :ATTR(:get<Country>);
my %PhoneNumber_of :ATTR(:get<PhoneNumber>);
my %MobilePhoneNumber_of :ATTR(:get<MobilePhoneNumber>);
__PACKAGE__->_factory(
[ qw(
Street
ZIP
City
Country
PhoneNumber
MobilePhoneNumber
) ],
{
Street => \%Street_of,
ZIP => \%ZIP_of,
City => \%City_of,
Country => \%Country_of,
PhoneNumber => \%PhoneNumber_of,
MobilePhoneNumber => \%MobilePhoneNumber_of,
},
{
Street => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
ZIP => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
City => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
Country => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
PhoneNumber => 'MyTypes::PhoneNumber',
MobilePhoneNumber => 'MyTypes::PhoneNumber',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::Address
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
Address from the namespace http://www.example.org/benchmark/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
Street
ZIP
City
Country
PhoneNumber
MobilePhoneNumber
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut

View File

@@ -0,0 +1,71 @@
package MyTypes::ArrayOfContract;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %Contract_of :ATTR(:get<Contract>);
__PACKAGE__->_factory(
[ qw(
Contract
) ],
{
Contract => \%Contract_of,
},
{
Contract => 'MyTypes::Contract',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::ArrayOfContract
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
ArrayOfContract from the namespace http://www.example.org/benchmark/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
Contract
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::ArrayOfContract
Contract => { # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut

View File

@@ -0,0 +1,98 @@
package MyTypes::ArrayOfPerson;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %NewElement_of :ATTR(:get<NewElement>);
__PACKAGE__->_factory(
[ qw(
NewElement
) ],
{
NewElement => \%NewElement_of,
},
{
NewElement => 'MyTypes::Person',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::ArrayOfPerson
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
ArrayOfPerson from the namespace http://www.example.org/benchmark/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
NewElement
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::ArrayOfPerson
NewElement => { # MyTypes::Person
PersonID => { # MyTypes::PersonID
ID => $some_value, # int
},
Salutation => $some_value, # string
Name => $some_value, # string
GivenName => $some_value, # string
DateOfBirth => $some_value, # date
HomeAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
WorkAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
Contracts => { # MyTypes::ArrayOfContract
Contract => { # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
},
},
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut

View File

@@ -0,0 +1,164 @@
package MyTypes::BarCodeData;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %Height_of :ATTR(:get<Height>);
my %Width_of :ATTR(:get<Width>);
my %Angle_of :ATTR(:get<Angle>);
my %Ratio_of :ATTR(:get<Ratio>);
my %Module_of :ATTR(:get<Module>);
my %Left_of :ATTR(:get<Left>);
my %Top_of :ATTR(:get<Top>);
my %CheckSum_of :ATTR(:get<CheckSum>);
my %FontName_of :ATTR(:get<FontName>);
my %BarColor_of :ATTR(:get<BarColor>);
my %BGColor_of :ATTR(:get<BGColor>);
my %FontSize_of :ATTR(:get<FontSize>);
my %barcodeOption_of :ATTR(:get<barcodeOption>);
my %barcodeType_of :ATTR(:get<barcodeType>);
my %checkSumMethod_of :ATTR(:get<checkSumMethod>);
my %showTextPosition_of :ATTR(:get<showTextPosition>);
my %BarCodeImageFormat_of :ATTR(:get<BarCodeImageFormat>);
__PACKAGE__->_factory(
[ qw(
Height
Width
Angle
Ratio
Module
Left
Top
CheckSum
FontName
BarColor
BGColor
FontSize
barcodeOption
barcodeType
checkSumMethod
showTextPosition
BarCodeImageFormat
) ],
{
Height => \%Height_of,
Width => \%Width_of,
Angle => \%Angle_of,
Ratio => \%Ratio_of,
Module => \%Module_of,
Left => \%Left_of,
Top => \%Top_of,
CheckSum => \%CheckSum_of,
FontName => \%FontName_of,
BarColor => \%BarColor_of,
BGColor => \%BGColor_of,
FontSize => \%FontSize_of,
barcodeOption => \%barcodeOption_of,
barcodeType => \%barcodeType_of,
checkSumMethod => \%checkSumMethod_of,
showTextPosition => \%showTextPosition_of,
BarCodeImageFormat => \%BarCodeImageFormat_of,
},
{
Height => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
Width => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
Angle => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
Ratio => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
Module => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
Left => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
Top => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
CheckSum => 'SOAP::WSDL::XSD::Typelib::Builtin::boolean',
FontName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
BarColor => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
BGColor => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
FontSize => 'SOAP::WSDL::XSD::Typelib::Builtin::float',
barcodeOption => 'MyTypes::BarcodeOption',
barcodeType => 'MyTypes::BarcodeType',
checkSumMethod => 'MyTypes::CheckSumMethod',
showTextPosition => 'MyTypes::ShowTextPosition',
BarCodeImageFormat => 'MyTypes::ImageFormats',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::BarCodeData
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
BarCodeData from the namespace http://www.webservicex.net/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
Height
Width
Angle
Ratio
Module
Left
Top
CheckSum
FontName
BarColor
BGColor
FontSize
barcodeOption
barcodeType
checkSumMethod
showTextPosition
BarCodeImageFormat
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::BarCodeData
Height => $some_value, # int
Width => $some_value, # int
Angle => $some_value, # int
Ratio => $some_value, # int
Module => $some_value, # int
Left => $some_value, # int
Top => $some_value, # int
CheckSum => $some_value, # boolean
FontName => $some_value, # string
BarColor => $some_value, # string
BGColor => $some_value, # string
FontSize => $some_value, # float
barcodeOption => $some_value, # BarcodeOption
barcodeType => $some_value, # BarcodeType
checkSumMethod => $some_value, # CheckSumMethod
showTextPosition => $some_value, # ShowTextPosition
BarCodeImageFormat => $some_value, # ImageFormats
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut

View File

@@ -0,0 +1,56 @@
package MyTypes::BarcodeOption;
use strict;
use warnings;
sub get_xmlns { 'http://www.webservicex.net/'};
# derivation by restriction
use base qw(
SOAP::WSDL::XSD::Typelib::Builtin::string
);
1;
=pod
=head1 MyTypes::BarcodeOption
=head1 DESCRIPTION
Perl data type class for the XML Schema defined simpleType
BarcodeOption from the namespace http://www.webservicex.net/.
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
like it's base type.
# Description of restrictions not implemented yet.
=head1 METHODS
=head2 new
Constructor.
=head2 get_value / set_value
Getter and setter for the simpleType's value.
=head1 OVERLOADING
Depending on the simple type's base type, the following operations are overloaded
Stringification
Numerification
Boolification
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR
Generated by SOAP::WSDL
=cut

View File

@@ -0,0 +1,56 @@
package MyTypes::BarcodeType;
use strict;
use warnings;
sub get_xmlns { 'http://www.webservicex.net/'};
# derivation by restriction
use base qw(
SOAP::WSDL::XSD::Typelib::Builtin::string
);
1;
=pod
=head1 MyTypes::BarcodeType
=head1 DESCRIPTION
Perl data type class for the XML Schema defined simpleType
BarcodeType from the namespace http://www.webservicex.net/.
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
like it's base type.
# Description of restrictions not implemented yet.
=head1 METHODS
=head2 new
Constructor.
=head2 get_value / set_value
Getter and setter for the simpleType's value.
=head1 OVERLOADING
Depending on the simple type's base type, the following operations are overloaded
Stringification
Numerification
Boolification
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR
Generated by SOAP::WSDL
=cut

View File

@@ -0,0 +1,56 @@
package MyTypes::CheckSumMethod;
use strict;
use warnings;
sub get_xmlns { 'http://www.webservicex.net/'};
# derivation by restriction
use base qw(
SOAP::WSDL::XSD::Typelib::Builtin::string
);
1;
=pod
=head1 MyTypes::CheckSumMethod
=head1 DESCRIPTION
Perl data type class for the XML Schema defined simpleType
CheckSumMethod from the namespace http://www.webservicex.net/.
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
like it's base type.
# Description of restrictions not implemented yet.
=head1 METHODS
=head2 new
Constructor.
=head2 get_value / set_value
Getter and setter for the simpleType's value.
=head1 OVERLOADING
Depending on the simple type's base type, the following operations are overloaded
Stringification
Numerification
Boolification
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR
Generated by SOAP::WSDL
=cut

View File

@@ -0,0 +1,74 @@
package MyTypes::Contract;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %ContractID_of :ATTR(:get<ContractID>);
my %ContractName_of :ATTR(:get<ContractName>);
__PACKAGE__->_factory(
[ qw(
ContractID
ContractName
) ],
{
ContractID => \%ContractID_of,
ContractName => \%ContractName_of,
},
{
ContractID => 'SOAP::WSDL::XSD::Typelib::Builtin::long',
ContractName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::Contract
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
Contract from the namespace http://www.example.org/benchmark/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
ContractID
ContractName
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut

View File

@@ -0,0 +1,56 @@
package MyTypes::ImageFormats;
use strict;
use warnings;
sub get_xmlns { 'http://www.webservicex.net/'};
# derivation by restriction
use base qw(
SOAP::WSDL::XSD::Typelib::Builtin::string
);
1;
=pod
=head1 MyTypes::ImageFormats
=head1 DESCRIPTION
Perl data type class for the XML Schema defined simpleType
ImageFormats from the namespace http://www.webservicex.net/.
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
like it's base type.
# Description of restrictions not implemented yet.
=head1 METHODS
=head2 new
Constructor.
=head2 get_value / set_value
Getter and setter for the simpleType's value.
=head1 OVERLOADING
Depending on the simple type's base type, the following operations are overloaded
Stringification
Numerification
Boolification
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR
Generated by SOAP::WSDL
=cut

View File

@@ -0,0 +1,131 @@
package MyTypes::Person;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %PersonID_of :ATTR(:get<PersonID>);
my %Salutation_of :ATTR(:get<Salutation>);
my %Name_of :ATTR(:get<Name>);
my %GivenName_of :ATTR(:get<GivenName>);
my %DateOfBirth_of :ATTR(:get<DateOfBirth>);
my %HomeAddress_of :ATTR(:get<HomeAddress>);
my %WorkAddress_of :ATTR(:get<WorkAddress>);
my %Contracts_of :ATTR(:get<Contracts>);
__PACKAGE__->_factory(
[ qw(
PersonID
Salutation
Name
GivenName
DateOfBirth
HomeAddress
WorkAddress
Contracts
) ],
{
PersonID => \%PersonID_of,
Salutation => \%Salutation_of,
Name => \%Name_of,
GivenName => \%GivenName_of,
DateOfBirth => \%DateOfBirth_of,
HomeAddress => \%HomeAddress_of,
WorkAddress => \%WorkAddress_of,
Contracts => \%Contracts_of,
},
{
PersonID => 'MyTypes::PersonID',
Salutation => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
Name => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
GivenName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
DateOfBirth => 'SOAP::WSDL::XSD::Typelib::Builtin::date',
HomeAddress => 'MyTypes::Address',
WorkAddress => 'MyTypes::Address',
Contracts => 'MyTypes::ArrayOfContract',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::Person
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
Person from the namespace http://www.example.org/benchmark/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
PersonID
Salutation
Name
GivenName
DateOfBirth
HomeAddress
WorkAddress
Contracts
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::Person
PersonID => { # MyTypes::PersonID
ID => $some_value, # int
},
Salutation => $some_value, # string
Name => $some_value, # string
GivenName => $some_value, # string
DateOfBirth => $some_value, # date
HomeAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
WorkAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
Contracts => { # MyTypes::ArrayOfContract
Contract => { # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
},
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut

View File

@@ -0,0 +1,68 @@
package MyTypes::PersonID;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %ID_of :ATTR(:get<ID>);
__PACKAGE__->_factory(
[ qw(
ID
) ],
{
ID => \%ID_of,
},
{
ID => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::PersonID
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
PersonID from the namespace http://www.example.org/benchmark/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
ID
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::PersonID
ID => $some_value, # int
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut

View File

@@ -0,0 +1,56 @@
package MyTypes::PhoneNumber;
use strict;
use warnings;
sub get_xmlns { 'http://www.example.org/benchmark/'};
# derivation by restriction
use base qw(
SOAP::WSDL::XSD::Typelib::Builtin::string
);
1;
=pod
=head1 MyTypes::PhoneNumber
=head1 DESCRIPTION
Perl data type class for the XML Schema defined simpleType
PhoneNumber from the namespace http://www.example.org/benchmark/.
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
like it's base type.
# Description of restrictions not implemented yet.
=head1 METHODS
=head2 new
Constructor.
=head2 get_value / set_value
Getter and setter for the simpleType's value.
=head1 OVERLOADING
Depending on the simple type's base type, the following operations are overloaded
Stringification
Numerification
Boolification
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR
Generated by SOAP::WSDL
=cut

View File

@@ -0,0 +1,56 @@
package MyTypes::ShowTextPosition;
use strict;
use warnings;
sub get_xmlns { 'http://www.webservicex.net/'};
# derivation by restriction
use base qw(
SOAP::WSDL::XSD::Typelib::Builtin::string
);
1;
=pod
=head1 MyTypes::ShowTextPosition
=head1 DESCRIPTION
Perl data type class for the XML Schema defined simpleType
ShowTextPosition from the namespace http://www.webservicex.net/.
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
like it's base type.
# Description of restrictions not implemented yet.
=head1 METHODS
=head2 new
Constructor.
=head2 get_value / set_value
Getter and setter for the simpleType's value.
=head1 OVERLOADING
Depending on the simple type's base type, the following operations are overloaded
Stringification
Numerification
Boolification
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR
Generated by SOAP::WSDL
=cut

12
example/person.pl Normal file
View File

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

21
example/person_compile.pl Normal file
View File

@@ -0,0 +1,21 @@
#!/usr/bin/perl -w
use strict;
use warnings;
use XML::Compile::WSDL11;
use XML::Compile::Transport::SOAPHTTP;
my $wsdl = XML::Compile::WSDL11->new('wsdl/Person.wsdl');
# I have to lookup the methods from the WSDL
my $call = $wsdl->compileClient('ListPerson');
# I have to lookup the parameters from the WSDL
my $result = $call->({ in => undef});
die "Error calling soap method" if not defined $result;
# I have to lookup the output parameters from the WSDL - or try Dumper
#use Data::Dumper;
#print Dumper $result;
print "Found ", scalar @{ $result->{ parameters }->{ out }->{ seq_NewElement }->[0]->{ NewElement } } , " persons\n";

121
example/wsdl/Person.wsdl Normal file
View File

@@ -0,0 +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:sequence>
</xsd:complexType>
</xsd:element>
<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: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:simpleType name="PhoneNumber">
<xsd:restriction base="xsd:string"></xsd:restriction>
</xsd:simpleType>
<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="PersonID">
<xsd:sequence>
<xsd:element name="ID" type="xsd:int"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<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: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:message>
<wsdl:message name="ListPersonResponse">
<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: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>
</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>

View File

@@ -669,16 +669,16 @@ The following facets have no influence yet:
=item * L<SOAP::Lite|SOAP::Lite>
Full featured SOAP-library, little WSDL support. Supports rpc-encoded style only. Many protocols supported.
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>
A promising-looking approach derived from a cool functional DOM-based XML schema parser.
Creates parser/generator functions for SOAP messages. Includes SOAP Client
and Server implementatios.
Will support encoding/decoding of SOAP messages based on WSDL definitions.
Not yet finished at the time of writing - but you may wish to give it a try, especially
if you need to adhere very closely to the XML Schema / WSDL specs.
You might want to give it a try, especially if you need to adhere very
closely to the XML Schema / WSDL specs.
=back
@@ -730,9 +730,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 427 $
$Rev: 477 $
$LastChangedBy: kutterma $
$Id: WSDL.pm 427 2007-12-02 22:20:24Z 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

@@ -5,7 +5,7 @@ use Class::Std::Fast::Storable;
use List::Util qw(first);
use Carp qw(croak carp confess);
our $VERSION='2.00_25';
our $VERSION='2.00_27';
my %id_of :ATTR(:name<id> :default<()>);
my %name_of :ATTR(:name<name> :default<()>);
@@ -14,6 +14,11 @@ my %targetNamespace_of :ATTR(:name<targetNamespace> :default<()>);
my %xmlns_of :ATTR(:name<xmlns> :default<{}>);
my %parent_of :ATTR(:name<parent> :default<()>);
sub START {
my ($self, $ident, $arg_ref) = @_;
$xmlns_of{ $ident }->{ '#default' } = $self->get_xmlns()->{ '#default' };
}
sub DEMOLISH {
my $self = shift;
# delete upward references
@@ -82,7 +87,7 @@ sub AUTOMETHOD {
return $result_ref->[0];
};
}
confess "$subname not found in class " . (ref $self || $self) ;
confess "$subname not found in class " . ref $self;
}
sub init {
@@ -95,11 +100,6 @@ sub init {
$xmlns_of{ ident $self }->{ $value->{ LocalName } } = $value->{ Value };
next;
}
elsif ($value->{ Name } =~m{^xmlns$}xms) {
# just ignore xmlns = for now
# TODO handle xmlns correctly - maybe via setting a prefix ?
next;
}
my $name = $value->{ LocalName };
my $method = "set_$name";
@@ -110,16 +110,23 @@ sub init {
sub expand {
my ($self, , $qname) = @_;
my $ns_of = $self->get_xmlns();
if (not $qname=~m{:}xm) {
die "un-prefixed element name <$qname> found, but no default namespace set\n"
if not defined $ns_of->{ '#default' };
return $ns_of->{ '#default' }, $qname;
}
my ($prefix, $localname) = split /:/x, $qname;
# my %ns_map = reverse %{ $self->get_xmlns() };
my %ns_map = %{ $self->get_xmlns() };
return ($ns_map{ $prefix }, $localname) if ($ns_map{ $prefix });
return ($ns_of->{ $prefix }, $localname) if ($ns_of->{ $prefix });
if (my $parent = $self->get_parent()) {
return $parent->expand($qname);
}
confess "unbound prefix $prefix found for $prefix:$localname. Bound prefixes are"
. join(', ', keys %ns_map);
. join(', ', keys %{ $ns_of });
}
sub _expand;
*_expand = \&expand;

View File

@@ -11,7 +11,7 @@ use SOAP::WSDL::Factory::Serializer;
use SOAP::WSDL::Factory::Transport;
use SOAP::WSDL::Expat::MessageParser;
our $VERSION = '2.00_25';
our $VERSION = '2.00_27';
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
my %no_dispatch_of :ATTR(:name<no_dispatch> :default<()>);
@@ -268,17 +268,6 @@ Default:
text/xml; charset: utf8
=head3 set_trace
$soap->set_trace(1);
$soap->set_trace( sub { Log::Log4perl::get_logger()->debug( @_ ) } );
When set to a true value, tracing (via warn) is enabled.
When set to a code reference, this function will be called on every
trace call, making it really easy for you to set up log4perl logging
or whatever you need.
=head2 Features different from SOAP::Lite
SOAP::WSDL does not aim to be a complete replacement for SOAP::Lite - the
@@ -371,9 +360,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 427 $
$Rev: 455 $
$LastChangedBy: kutterma $
$Id: Client.pm 427 2007-12-02 22:20:24Z kutterma $
$Id: Client.pm 455 2007-12-14 15:50:16Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
=cut

View File

@@ -10,9 +10,16 @@ sub call {
my ($self, $method, $body, $header) = @_;
if (not blessed $body) {
$body = {} if not defined $body;
my $class = $method->{ body }->{ parts }->[0];
eval "require $class" || die $@;
$body = $class->new($body);
$body = ref $body eq 'ARRAY' ? $body : [ $body ];
my $index = 0;
my @part_from;
foreach my $part (@{ $body }) {
my $class = $method->{ body }->{ parts }->[$index];
eval "require $class" || die $@;
push @part_from, $class->new($part);
$index++;
}
$body = $#part_from ? \@part_from : $part_from[0];
}
# if we have a header
@@ -94,9 +101,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 427 $
$Rev: 440 $
$LastChangedBy: kutterma $
$Id: Base.pm 427 2007-12-02 22:20:24Z kutterma $
$Id: Base.pm 440 2007-12-04 22:24:33Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.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<()>);
@@ -18,7 +18,7 @@ my %binding_of :ATTR(:name<binding> :default<()>);
my %service_of :ATTR(:name<service> :default<()>);
my %namespace_of :ATTR(:name<namespace> :default<()>);
# must be attr for Class::Std::Storable
# must be attr for Class::Std::Fast::Storable
my %attributes_of :ATTR();
%attributes_of = (
binding => \%binding_of,
@@ -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: 427 $
$Rev: 477 $
$LastChangedBy: kutterma $
$Id: Definitions.pm 427 2007-12-02 22:20:24Z 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;
@@ -48,7 +48,7 @@ sub load_classes {
# a bad test - do you know a better one?
next if $class eq '__SKIP__';
next if defined @{ "$class\::ISA"}; # check if namespace exists
next if defined *{ "$class\::" }; # check if namespace exists
$class =~s{ :: }{/}xmsg;
$class .= '.pm';
@@ -260,7 +260,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 +281,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-02 23:20:24 +0100 (So, 02 Dez 2007) $
$LastChangedRevision: 427 $
$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/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_25};
our $VERSION = q{2.00_27};
sub _initialize {
my ($self, $parser) = @_;
@@ -36,7 +36,9 @@ sub _initialize {
eval "require $action->{ class }";
croak $@ if ($@);
my $obj = $action->{ class }->new({ parent => $current })
my $obj = $action->{ class }->new({ parent => $current,
xmlns => { '#default' => $parser->namespace($localname) }
})
->init( _fixup_attrs( $parser, %attrs ) );
if ($current) {
@@ -143,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

@@ -37,8 +37,10 @@ sub get_transport {
$scheme =~s{ \A ([^\:]+) \: .+ }{$1}smx;
if ($registered_transport_of{ $scheme }) {
eval "require $registered_transport_of{ $scheme }"
or die "Cannot load transport class $registered_transport_of{ $scheme } : $@";
no strict qw(refs);
defined %{ "$registered_transport_of{ $scheme }::" }
or eval "require $registered_transport_of{ $scheme }"
or die "Cannot load transport class $registered_transport_of{ $scheme } : $@";
# try "foo::Client" class first - SOAP::Tranport always requires
# a package withoug the ::Client appended, and then
@@ -68,8 +70,10 @@ sub get_transport {
}
if (exists $SOAP_WSDL_TRANSPORT_OF{ $scheme }) {
eval "require $SOAP_WSDL_TRANSPORT_OF{ $scheme }"
or die "Cannot load transport class $SOAP_WSDL_TRANSPORT_OF{ $scheme } : $@";
no strict qw(refs);
defined %{ "$SOAP_WSDL_TRANSPORT_OF{ $scheme }::" }
or eval "require $SOAP_WSDL_TRANSPORT_OF{ $scheme }"
or die "Cannot load transport class $SOAP_WSDL_TRANSPORT_OF{ $scheme } : $@";
return $SOAP_WSDL_TRANSPORT_OF{ $scheme }->new( %attrs );
}
@@ -236,9 +240,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 427 $
$Rev: 459 $
$LastChangedBy: kutterma $
$Id: Transport.pm 427 2007-12-02 22:20:24Z kutterma $
$Id: Transport.pm 459 2007-12-16 16:00:14Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $
=cut

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;
@@ -55,9 +55,11 @@ sub generate {
}
sub generate_typelib {
my ($self) = @_;
my ($self, $arg_ref) = @_;
# $output_of{ ident $self } = "";
my @schema = @{ $self->get_definitions()->first_types()->get_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 );
}
@@ -164,6 +166,7 @@ sub _generate_filename :PRIVATE {
my ($self, @parts) = @_;
my $name = join '::', @parts;
$name =~s{ \. }{::}xmsg;
$name =~s{ \- }{_}xmsg;
$name =~s{ :: }{/}xmsg;
return "$name.pm";
}

View File

@@ -1,4 +1,8 @@
package [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.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;
@@ -6,12 +10,12 @@ use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before
require [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]
if not [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]->can('get_class');
require [% typemap_prefix %]::[% service.get_name.replace('\.', '::').replace('-', '_') %]
if not [% typemap_prefix %]::[% service.get_name.replace('\.', '::').replace('-', '_') %]->can('get_class');
sub START {
$_[0]->set_proxy('[% port.first_address.get_location %]') if not $_[2]->{proxy};
$_[0]->set_class_resolver('[% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]')
$_[0]->set_class_resolver('[% typemap_prefix %]::[% service.get_name.replace('\.', '::').replace('-', '_') %]')
if not $_[2]->{class_resolver};
}
@@ -33,13 +37,12 @@ __END__
=head1 NAME
[% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %] - SOAP Interface for the [% service.get_name %] Web Service
[% interface_name %] - SOAP Interface for the [% service.get_name %] Web Service
=head1 SYNOPSIS
use [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %];
my $interface = [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %]->new();
use [% interface_name %];
my $interface = [% interface_name %]->new();
my $response;
[% FOREACH operation = binding.get_operation;

View File

@@ -55,6 +55,11 @@
: die "input must have either type or element";
} @{ $part_from };
}
warn "Multiple parts detected in message " . $stash->{ message }->get_name() . ".\n",
"WS-I BP demands 0 to 1 parts in message body\n"
if (@parts > 1);
$stash->{ parts } = \@parts;
[% END %]

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,
@@ -46,12 +50,12 @@ __END__
=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
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
});
@@ -79,7 +83,7 @@ located at [% port.first_address.get_location %].
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

View File

@@ -4,12 +4,12 @@
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
port_op.get_documentation %]
sub [% operation.get_name %](
sub [% operation.get_name %] {
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

@@ -22,7 +22,7 @@ __END__
=head1 NAME
[% typemap_prefix %]::[% service.get_name.replace('\.','::') %]; - typemap for ::[% service.get_name %];
[% typemap_prefix %]::[% service.get_name.replace('\.','::').replace('-', '_') %]; - typemap for ::[% service.get_name %];
=head1 DESCRIPTION

View File

@@ -1,4 +1,4 @@
package [% type_prefix %]::[% complexType.get_name %];
package [% type_prefix %]::[% complexType.get_name.replace('\.','::').replace('-','_') %];
use strict;
use warnings;
[% INCLUDE complexType/contentModel.tt %]
@@ -12,7 +12,7 @@ use warnings;
=head1 NAME
[% type_prefix %]::[% complexType.get_name %]
[% type_prefix %]::[% complexType.get_name.replace('\.','::').replace('-','_') %]
=head1 DESCRIPTION

View File

@@ -1,6 +1,6 @@
[%
base_name=complexType.expand( complexType.get_base);
base_name=complexType.expand( complexType.get_base );
base_type = definitions.first_types.find_type( base_name );
element_from = complexType.get_element;
@@ -8,12 +8,16 @@ element_from = complexType.get_element;
#
# Sanity check: All original elements must be noted first
#
FOREACH element = base_type.get_element;
IF element_from.${ loop.index }.get_name != element.get_name;
THROW WSDL "${element.get_name} not found at position ${ loop.index } in extension type ${ complexType.get_name }";
element_list = base_type.get_element;
FOREACH element = element_from;
IF element_list.${ loop.index }.get_name != element.get_name;
element_list.push( element );
# THROW WSDL "${element.get_name} not found at position ${ loop.index } in extension type ${ complexType.get_name }";
END;
END;
complexType.set_element( element_list );
-%]
use base qw([% type_prefix %]::[% base_name.1.replace('\.', '::') %]);

View File

@@ -1,4 +1,4 @@
package [% element_prefix %]::[% element.get_name %];
package [% element_prefix %]::[% element.get_name.replace('\.','::') %];
use strict;
use warnings;

View File

@@ -1,4 +1,4 @@
package [% type_prefix %]::[% simpleType.get_name %];
package [% type_prefix %]::[% simpleType.get_name.replace('\.','::').replace('-','_') %];
use strict;
use warnings;
@@ -13,7 +13,7 @@ sub get_xmlns { '[% simpleType.get_targetNamespace %]'};
=pod
=head1 [% type_prefix %]::[% simpleType.get_name %]
=head1 [% type_prefix %]::[% simpleType.get_name.replace('\.','::').replace('-','_') %]
=head1 DESCRIPTION

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

@@ -123,7 +123,7 @@ sub visit_Part {
# TODO: auto-generate element for RPC bindings
if ( my $type_name = $part->get_type ) {
# FIXME support RPC-style calls
die "unsupported global type <$type_name> found in part";
die "unsupported global type <$type_name> found in part ". $part->get_name();
}
# TODO factor out iterator or replace by lookup (probably better)
@@ -211,6 +211,8 @@ sub visit_XSD_Element {
# for atomic and complex types , and ref elements
my $typeclass = join q{::}, $element_prefix_of{$ident}, $element->get_name();
$typeclass =~s{\.}{::}g;
$typeclass =~s{\-}{_}g;
$self->set_typemap_entry($typeclass);
$self->process_atomic_type( $element->first_complexType()
@@ -225,6 +227,8 @@ sub visit_XSD_Element {
if (not defined($parent)) {
# for atomic and complex types , and ref elements
my $typeclass = join q{::}, $element_prefix_of{$ident}, $element->get_name();
$typeclass =~s{\.}{::}g;
$typeclass =~s{\-}{_}g;
$self->set_typemap_entry($typeclass);
}

View File

@@ -12,7 +12,7 @@ SOAP::WSDL::Manual - Accessing WSDL based web services
=item * Create WSDL bindings
perl wsdl2perl.pl -b base_dir URL
perl wsdl2perl.pl -b base_dir URL
=item * Look what has been generated
@@ -37,7 +37,7 @@ The results of all calls to your service object's methods (except new) are
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 @@ and you may even want to add custom typemap elements.
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 @@ 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
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 @@ generated classes - while generated classes may be many, you probably will
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.
@@ -230,6 +230,17 @@ L<SOAP::WSDL::Manual::Parser> will tell you how to create a typemap class.
=back
=head1 Creating a SOAP Server
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
Note that SOAP::WSDL only includes a basic CGI based SOAP servers by now -
while more advanced servers (like standalone or mod_perl based) are no big
deal, no base implementation is included yet.
=head1 Troubleshooting
=head2 Accessing HTTPS webservices

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

@@ -3,8 +3,8 @@ package SOAP::WSDL::Serializer::XSD;
use strict;
use warnings;
use Class::Std::Fast::Storable;
our $VERSION=q{2.00_25};
use Scalar::Util qw(blessed);
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';
@@ -49,7 +49,7 @@ sub serialize_header {
return q{} if not $data;
return join ( q{},
"<$opt->{ namespace }->{ $SOAP_NS }\:Header>",
"$data",
blessed $data ? $data->serialize_qualified : (),
"</$opt->{ namespace }->{ $SOAP_NS }\:Header>",
);
}
@@ -61,7 +61,13 @@ sub serialize_body {
# if we have no data.
return join ( q{},
"<$opt->{ namespace }->{ $SOAP_NS }\:Body>",
defined $data ? "$data" : (),
defined $data
? ref $data eq 'ARRAY'
? join q{}, map { blessed $_ ? $_->serialize_qualified() : () } @{ $data }
: blessed $data
? $data->serialize_qualified()
: ()
: (),
"</$opt->{ namespace }->{ $SOAP_NS }\:Body>",
);
}
@@ -113,9 +119,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 427 $
$Rev: 477 $
$LastChangedBy: kutterma $
$Id: XSD.pm 427 2007-12-02 22:20:24Z 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

@@ -9,17 +9,16 @@ use HTTP::Headers;
use Scalar::Util qw(blessed);
use Class::Std::Fast::Storable;
# use Class::Std::Storable;
use base qw(SOAP::WSDL::Server);
our $VERSION=q{2.00_25};
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 {
@@ -27,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;
@@ -38,7 +37,7 @@ sub handle {
}
my $content = q{};
my $buffer;
my $buffer;
binmode(STDIN);
while (read(STDIN,$buffer,$length - length($content))) {
$content .= $buffer;
@@ -48,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),
@@ -80,6 +79,10 @@ sub handle {
'Content-type' => 'text/xml; charset="utf-8"'
);
$response->content( $response_message );
{
use bytes;
$response->header('Content-length', length $response_message);
}
}
$self->_output($response);
@@ -90,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

@@ -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

@@ -7,9 +7,12 @@ sub get_xmlns { 'http://www.w3.org/2001/XMLSchema' };
# use $_[1] for performance
sub start_tag {
my $opt = $_[1] ||= {};
return '<' . $opt->{name} . ' >' if $opt->{ name };
return q{}
return q{} if not $#_; # return if no second argument ($opt)
if ($_[1]->{ name }) {
return "<$_[1]->{name} />" if $_[1]->{ empty };
return "<$_[1]->{name} >";
}
return q{};
}
# use $_[1] for performance

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_27';
my %ELEMENTS_FROM;
my %ATTRIBUTES_OF;
@@ -39,6 +39,34 @@ sub AUTOMETHOD {
. "\n"
}
sub as_hash_ref {
my $self = shift;
my $attributes_ref = $ATTRIBUTES_OF{ ref $self };
my $ident = ident $self;
my $hash_of_ref = {};
foreach my $attribute (keys %{ $attributes_ref }) {
next if not defined $attributes_ref->{ $attribute }->{ $ident };
my $value = $attributes_ref->{ $attribute }->{ $ident };
$hash_of_ref->{ $attribute } = blessed $value
? $value->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType')
? $value
: $value->as_hash_ref()
: ref $value eq 'ARRAY'
? [
map {
$_->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType')
? $_
: $_->as_hash_ref()
} @{ $value }
]
: die "Neither blessed obj nor list ref";
};
return $hash_of_ref;
}
# we store per-class elements.
# call as __PACKAGE__->_factory
sub _factory {
@@ -352,6 +380,10 @@ This means you may set element properties by passing
Examples are similar to the examples provided for new() above.
=head2 as_hash_ref
Returns a hash ref representation of the complexType object
=head1 Bugs and limitations
=over
@@ -380,10 +412,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
@@ -391,9 +423,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 412 $
$Rev: 477 $
$LastChangedBy: kutterma $
$Id: ComplexType.pm 412 2007-11-27 22:57:52Z kutterma $
$Id: ComplexType.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/ComplexType.pm $
=cut

View File

@@ -2,7 +2,7 @@
package SOAP::WSDL::XSD::Typelib::Element;
use strict;
our $VERSION=q{2.00_25};
our $VERSION=q{2.00_27};
my %NAME;
my %NILLABLE;
@@ -159,4 +159,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: 477 $
$LastChangedBy: kutterma $
$Id: Element.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/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

View File

@@ -3,16 +3,19 @@ use strict;
use warnings;
use Test::More qw/no_plan/; # TODO: change to tests => N;
use lib '../lib';
use File::Basename;
use File::Spec;
use Cwd;
my $path = cwd;
$path =~s|\/t\/?$||; # allow running from t/ and above (Build test)
my $path = File::Spec->rel2abs( dirname __FILE__ );
my ($volume, $dir) = File::Spec->splitpath($path, 1);
my @dir_from = File::Spec->splitdir($dir);
unshift @dir_from, $volume if $volume;
my $url = join '/', @dir_from;
use_ok(qw/SOAP::WSDL/);
my $soap = SOAP::WSDL->new(
wsdl => 'file:///' . $path .'/t/acceptance/wsdl/008_complexType.wsdl'
wsdl => 'file://' . $url .'/acceptance/wsdl/008_complexType.wsdl'
)->wsdlinit();
my $wsdl = $soap->get_definitions;

View File

@@ -11,8 +11,14 @@ use Cwd;
use SOAP::WSDL;
use SOAP::WSDL::XSD::Typelib::Builtin;
my $path = cwd;
$path =~s|\/t\/?$||; # allow running from t/ and above (Build test)
use File::Basename;
use File::Spec;
my $path = File::Spec->rel2abs( dirname __FILE__ );
my ($volume, $dir) = File::Spec->splitpath($path, 1);
my @dir_from = File::Spec->splitdir($dir);
unshift @dir_from, $volume if $volume;
my $url = join '/', @dir_from;
my $parser;
@@ -37,7 +43,7 @@ else
# TODO factor out into different test
my $soap = SOAP::WSDL->new(
wsdl => 'file:///' . $path .'/t/acceptance/wsdl/006_sax_client.wsdl',
wsdl => 'file://' . $url .'/acceptance/wsdl/006_sax_client.wsdl',
)->wsdlinit();
$soap->servicename('MessageGateway');

View File

@@ -23,7 +23,7 @@ is $obj, '<MyTestName >test</MyTestName ><MyTestName >test2</MyTestName >',
# try on the fly factory
@MyComplexType2::ISA = ('SOAP::WSDL::XSD::Typelib::ComplexType');
{
use Class::Std::Storable;
use Class::Std::Fast::Storable;
my %MyTestName_of;
MyComplexType2->_factory(

View File

@@ -3,17 +3,23 @@ use strict;
use warnings;
use diagnostics;
use Cwd;
use lib '../lib';
use File::Basename;
use File::Spec;
use lib '../lib';
my $path = File::Spec->rel2abs( dirname __FILE__ );
my ($volume, $dir) = File::Spec->splitpath($path, 1);
my @dir_from = File::Spec->splitdir($dir);
unshift @dir_from, $volume if $volume;
my $url = join '/', @dir_from;
use_ok(qw/SOAP::WSDL/);
my $path = File::Spec->rel2abs( dirname __FILE__ );
my $soap;
#2
ok( $soap = SOAP::WSDL->new(
wsdl => 'file:///' . $path . '/../../acceptance/wsdl/02_port.wsdl'
wsdl => 'file://' . $url . '/../../acceptance/wsdl/02_port.wsdl'
), 'Instantiated object' );
ok( ($soap->servicename('testService') ), 'set service' );

View File

@@ -6,16 +6,21 @@ use lib 't/lib';
use File::Basename;
use File::Spec;
my $path = File::Spec->rel2abs( dirname __FILE__ );
my ($volume, $dir) = File::Spec->splitpath($path, 1);
my @dir_from = File::Spec->splitdir($dir);
unshift @dir_from, $volume if $volume;
my $url = join '/', @dir_from;
use_ok(qw/SOAP::WSDL/);
my $xml;
my $soap = undef;
my $path = File::Spec->rel2abs( dirname __FILE__ );
ok( $soap = SOAP::WSDL->new(
wsdl => 'file:///' . $path . '/../../acceptance/wsdl/04_element-simpleType.wsdl'
wsdl => 'file://' . $url . '/../../acceptance/wsdl/04_element-simpleType.wsdl'
), 'Instantiated object' );
# won't work without - would require SOAP::WSDL::Deserializer::SOM,

View File

@@ -2,19 +2,22 @@ use Test::More tests => 8;
use strict;
use lib '../lib';
use lib 't/lib';
use File::Spec;
use File::Basename;
use File::Spec;
my $path = File::Spec->rel2abs( dirname __FILE__ );
my ($volume, $dir) = File::Spec->splitpath($path, 1);
my @dir_from = File::Spec->splitdir($dir);
unshift @dir_from, $volume if $volume;
my $url = join '/', @dir_from;
use_ok(qw/SOAP::WSDL/);
my ($soap, $xml, $xml2);
# chdir to my location
my $path = File::Spec->rel2abs( dirname __FILE__ );
#2
ok( $soap = SOAP::WSDL->new(
wsdl => 'file:///' . $path . '/../../acceptance/wsdl/05_simpleType-list.wsdl'
wsdl => 'file://' . $url . '/../../acceptance/wsdl/05_simpleType-list.wsdl'
), 'Instantiated object' );
# won't work without - would require SOAP::WSDL::Deserializer::SOM,

View File

@@ -7,16 +7,23 @@ use File::Basename;
use lib '../lib';
use lib 't/lib';
use File::Basename;
use File::Spec;
my $path = File::Spec->rel2abs( dirname __FILE__ );
my ($volume, $dir) = File::Spec->splitpath($path, 1);
my @dir_from = File::Spec->splitdir($dir);
unshift @dir_from, $volume if $volume;
my $url = join '/', @dir_from;
use_ok(qw/SOAP::WSDL/);
my $xml;
my $path = File::Spec->rel2abs( dirname __FILE__ );
my $soap;
#2
ok( $soap = SOAP::WSDL->new(
wsdl => 'file:///' . $path . '/../../acceptance/wsdl/05_simpleType-restriction.wsdl'
wsdl => 'file://' . $url . '/../../acceptance/wsdl/05_simpleType-restriction.wsdl'
), 'Instantiated object' );
#3

Some files were not shown because too many files have changed in this diff Show More