Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3cfeebae54 | ||
|
|
a9033164e6 |
@@ -1,55 +1,53 @@
|
|||||||
use Module::Build;
|
use Module::Build;
|
||||||
|
use version;
|
||||||
$build = Module::Build->new(
|
$build = Module::Build->new(
|
||||||
dist_author => 'Martin Kutter <martin.kutter@fen-net.de>',
|
dist_author => 'Martin Kutter <martin.kutter@fen-net.de>',
|
||||||
create_makefile_pl => 'passthrough',
|
create_makefile_pl => 'passthrough',
|
||||||
dist_abstract => 'SOAP with WSDL support',
|
dist_abstract => 'SOAP with WSDL support',
|
||||||
dist_name => 'SOAP-WSDL',
|
dist_name => 'SOAP-WSDL',
|
||||||
dist_version => '2.00_24',
|
dist_version => '2.00_26',
|
||||||
module_name => 'SOAP::WSDL',
|
module_name => 'SOAP::WSDL',
|
||||||
license => 'artistic',
|
license => 'artistic',
|
||||||
requires => {
|
requires => {
|
||||||
# 5.6.x is way too buggy and has no unicode support
|
# 5.6.x is way too buggy and has no unicode support
|
||||||
# for us. SOAP-WSDL relies on unicode (WS-I demands it)
|
# for us. SOAP-WSDL relies on unicode (WS-I demands it)
|
||||||
# and triggers several 5.6 bugs...
|
# and triggers several 5.6 bugs...
|
||||||
'perl' => '5.8.0',
|
'perl' => q(5.8.0),
|
||||||
'Class::Std' => q/v0.0.8/,
|
'Class::Std::Fast' => qv(0.0.5),
|
||||||
'Class::Std::Storable' => 0,
|
|
||||||
'Data::Dumper' => 0,
|
'Data::Dumper' => 0,
|
||||||
'Date::Parse' => 0,
|
'Date::Parse' => 0,
|
||||||
'Date::Format' => 0,
|
'Date::Format' => 0,
|
||||||
'File::Basename' => 0,
|
'File::Basename' => 0,
|
||||||
'File::Path' => 0,
|
'File::Path' => 0,
|
||||||
'Getopt::Long' => 0,
|
'Getopt::Long' => 0,
|
||||||
'List::Util' => 0,
|
'List::Util' => 0,
|
||||||
'LWP::UserAgent' => 0,
|
'LWP::UserAgent' => 0,
|
||||||
'Template' => 0,
|
'Template' => 0,
|
||||||
'Term::ReadKey' => 0,
|
'Term::ReadKey' => 0,
|
||||||
'XML::Parser::Expat' => 0,
|
'XML::Parser::Expat' => 0,
|
||||||
},
|
},
|
||||||
buildrequires => {
|
buildrequires => {
|
||||||
'Class::Std' => q/v0.0.8/,
|
'Class::Std::Fast' => qv(0.0.5),
|
||||||
'Class::Std::Storable' => 0,
|
'Cwd' => 0,
|
||||||
'Cwd' => 0,
|
'Date::Parse' => 0,
|
||||||
'Date::Parse' => 0,
|
'Date::Format' => 0,
|
||||||
'Date::Format' => 0,
|
'Getopt::Long' => 0,
|
||||||
'Getopt::Long' => 0,
|
'List::Util' => 0,
|
||||||
'List::Util' => 0,
|
'LWP::UserAgent' => 0,
|
||||||
'LWP::UserAgent' => 0,
|
'File::Basename' => 0,
|
||||||
'File::Basename' => 0,
|
'File::Path' => 0,
|
||||||
'File::Path' => 0,
|
|
||||||
'File::Spec' => 0,
|
'File::Spec' => 0,
|
||||||
'Storable' => 0,
|
'Storable' => 0,
|
||||||
'Test::More' => 0,
|
'Test::More' => 0,
|
||||||
'Template' => 0,
|
'Template' => 0,
|
||||||
'XML::Parser::Expat' => 0,
|
'XML::Parser::Expat' => 0,
|
||||||
},
|
},
|
||||||
recursive_test_files => 1,
|
recursive_test_files => 1,
|
||||||
meta_add => {
|
meta_add => {
|
||||||
no_index => {
|
no_index => {
|
||||||
directory => 'lib/SOAP/WSDL/Generator/Template/XSD/',
|
directory => 'lib/SOAP/WSDL/Generator/Template/XSD/',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
$build->add_build_element('tt');
|
$build->add_build_element('tt');
|
||||||
$build->create_build_script;
|
$build->create_build_script;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Release notes for SOAP::WSDL 2.00_24
|
Release notes for SOAP::WSDL 2.00_26
|
||||||
-------
|
-------
|
||||||
|
|
||||||
I'm proud to present a new pre-release version of SOAP::WSDL.
|
I'm proud to present a new pre-release version of SOAP::WSDL.
|
||||||
@@ -34,6 +34,70 @@ Features:
|
|||||||
|
|
||||||
The following changes have been made:
|
The following changes have been made:
|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|
SOAP::WSDL now uses Class::Std::Fast. Read the MIGRATING guide for
|
||||||
|
upgrading from previous versions.
|
||||||
|
You probably need to re-generate all your interfaces.
|
||||||
|
|
||||||
|
WARNING: INCOMPATIBLE CHANGE:
|
||||||
|
|
||||||
|
SOAP::WSDL::XSD::Typelib::anySimpleType based objects no longer serialize
|
||||||
|
to their XML value on stringification.
|
||||||
|
This means that strings are no longer XML-escaped when the simpleType
|
||||||
|
containing the string is printed or used like this:
|
||||||
|
|
||||||
|
my $value = "$simpleType";
|
||||||
|
|
||||||
|
Note that ComplexType objects still serialize to their XML on
|
||||||
|
stringification. This Change is due to the demands of applications
|
||||||
|
embedding SOAP::WSDL::XSD::Typelib objects in templates - it would mean
|
||||||
|
a nasty ->get_value for every (simple) value.
|
||||||
|
|
||||||
|
The following features were added (the numbers in square brackets are the
|
||||||
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||||
|
|
||||||
|
* [ 1837347 ] Use Class::Std::Fast
|
||||||
|
Class::Std::Fast allows optimizations which almost double SOAP::WSDL's
|
||||||
|
performance and reduce code size. Class::Std::Fast also opens the door
|
||||||
|
for even faster XS implementations.
|
||||||
|
* [ 1842436 ] Add SOAP Server
|
||||||
|
|
||||||
|
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/).
|
||||||
|
|
||||||
|
* [ 1842418 ] Message parser eats up whitespaces between entities
|
||||||
|
* [ 1839820 ] encoding parameter of Content-Type header set incorrectly
|
||||||
|
* [ 1839851 ] token in UPPERCASE in default typemap
|
||||||
|
* [ 1839690 ] Can't use two prefixes for namespace in WSDL
|
||||||
|
* [ 1839833 ] incorrect encoding/decoding of double-quote
|
||||||
|
|
||||||
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
|
* Errors in typemap generation have been fixed
|
||||||
|
* XML parser speedups
|
||||||
|
* The test suite has been improved
|
||||||
|
|
||||||
2.00_24
|
2.00_24
|
||||||
---
|
---
|
||||||
The following features were added (the numbers in square brackets are the
|
The following features were added (the numbers in square brackets are the
|
||||||
@@ -84,7 +148,6 @@ The following uncategorized improvements have been made:
|
|||||||
* Code cleanup. The XSD library has been cleaned up a bit. Should result
|
* Code cleanup. The XSD library has been cleaned up a bit. Should result
|
||||||
in a minor speedup in serializing and deserializing XML messages,
|
in a minor speedup in serializing and deserializing XML messages,
|
||||||
|
|
||||||
|
|
||||||
2.00_21 - not released
|
2.00_21 - not released
|
||||||
----
|
----
|
||||||
The following bugs have been fixed (the numbers in square brackets are the
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ The following guidelines apply:
|
|||||||
- Testing
|
- Testing
|
||||||
* SOAP::WSDL has a test coverage of >95% and aims at 100%. Please write
|
* SOAP::WSDL has a test coverage of >95% and aims at 100%. Please write
|
||||||
a test first.
|
a test first.
|
||||||
* Use uthor tests are for testing guidelines. Disable author tests for
|
* Use author tests for testing guidelines. Disable author tests for
|
||||||
users - it's time consuming and of no use to have users run author tests.
|
users - it's time consuming and of no use to have users run author tests.
|
||||||
|
|
||||||
- Indentation and formatting
|
- Indentation and formatting
|
||||||
@@ -69,9 +69,9 @@ The following guidelines apply:
|
|||||||
* indent 4 characters per level
|
* indent 4 characters per level
|
||||||
* use \n (LF) for newlines, not CRLF
|
* use \n (LF) for newlines, not CRLF
|
||||||
* use blank lines to separate paragraphs
|
* use blank lines to separate paragraphs
|
||||||
* Coding style is similar to K&R (opening brace on last line, closing
|
* Coding style is similar to K&R (opening brace on last line, closing
|
||||||
brace on new line. No cuddled else)
|
brace on new line. No cuddled else)
|
||||||
* No trailing spaces allowed (except to indicate a blank line in a POD
|
* No trailing spaces allowed (except to indicate a blank line in a POD
|
||||||
source block)
|
source block)
|
||||||
|
|
||||||
- Flow control
|
- Flow control
|
||||||
@@ -88,7 +88,7 @@ The following guidelines apply:
|
|||||||
perlcritic fool you: no strict qw(refs); is often required.
|
perlcritic fool you: no strict qw(refs); is often required.
|
||||||
|
|
||||||
- Naming
|
- Naming
|
||||||
* variable names are lower case with _ separating words, except when
|
* variable names are lower case with _ separating words, except when
|
||||||
a XML Schema, SOAP, or WSDL name is name-giving (don't force portType to
|
a XML Schema, SOAP, or WSDL name is name-giving (don't force portType to
|
||||||
become port_type)
|
become port_type)
|
||||||
* hashes should be named FOO_of, lists FOO_from, references FOO_ref.
|
* hashes should be named FOO_of, lists FOO_from, references FOO_ref.
|
||||||
@@ -121,7 +121,7 @@ The following guidelines apply:
|
|||||||
$_[0]->foo($_[2..$#]); # read as $self->foo(%args_of);
|
$_[0]->foo($_[2..$#]); # read as $self->foo(%args_of);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
* POD is located at end of file, preferably after
|
* POD is located at end of file, preferably after __END__
|
||||||
* Complete POD coverage is essential. However, if the package in question
|
* Complete POD coverage is essential. However, if the package in question
|
||||||
is used internally only, it's better to omit the POD completely - too many
|
is used internally only, it's better to omit the POD completely - too many
|
||||||
PODs to look at confuse the average CPAN user.
|
PODs to look at confuse the average CPAN user.
|
||||||
|
|||||||
@@ -1,11 +1,20 @@
|
|||||||
benchmark/01_expat.t
|
benchmark/01_expat.t
|
||||||
|
benchmark/hello.pl
|
||||||
|
benchmark/person.pl
|
||||||
|
benchmark/person.xml
|
||||||
benchmark/XSD/01_anyType.t
|
benchmark/XSD/01_anyType.t
|
||||||
benchmark/XSD/02_anySimpleType.t
|
benchmark/XSD/02_anySimpleType.t
|
||||||
benchmark/XSD/03_string.t
|
benchmark/XSD/03_string.t
|
||||||
bin/wsdl2perl.pl
|
bin/wsdl2perl.pl
|
||||||
Build.PL
|
Build.PL
|
||||||
Changes
|
Changes
|
||||||
|
example/cgi-bin/helloworld.pl
|
||||||
|
example/cgi-bin/person.pl
|
||||||
example/fortune.pl
|
example/fortune.pl
|
||||||
|
example/genericbarcode.pl
|
||||||
|
example/hello.pl
|
||||||
|
example/hello_compile.pl
|
||||||
|
example/hello_lite.pl
|
||||||
example/lib/MyElements/CountCookies.pm
|
example/lib/MyElements/CountCookies.pm
|
||||||
example/lib/MyElements/CountCookiesResponse.pm
|
example/lib/MyElements/CountCookiesResponse.pm
|
||||||
example/lib/MyElements/GenerateBarCode.pm
|
example/lib/MyElements/GenerateBarCode.pm
|
||||||
@@ -19,18 +28,44 @@ example/lib/MyElements/GetSpecificCookieResponse.pm
|
|||||||
example/lib/MyElements/GetWeather.pm
|
example/lib/MyElements/GetWeather.pm
|
||||||
example/lib/MyElements/GetWeatherResponse.pm
|
example/lib/MyElements/GetWeatherResponse.pm
|
||||||
example/lib/MyElements/int.pm
|
example/lib/MyElements/int.pm
|
||||||
|
example/lib/MyElements/ListPerson.pm
|
||||||
|
example/lib/MyElements/ListPersonResponse.pm
|
||||||
example/lib/MyElements/readNodeCount.pm
|
example/lib/MyElements/readNodeCount.pm
|
||||||
example/lib/MyElements/readNodeCountResponse.pm
|
example/lib/MyElements/readNodeCountResponse.pm
|
||||||
|
example/lib/MyElements/sayHello.pm
|
||||||
|
example/lib/MyElements/sayHelloResponse.pm
|
||||||
example/lib/MyElements/string.pm
|
example/lib/MyElements/string.pm
|
||||||
|
example/lib/MyInterfaces/BarCode/BarCodeSoap.pm
|
||||||
example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie/FullerData_x0020_Fortune_x0020_CookieSoap.pm
|
example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie/FullerData_x0020_Fortune_x0020_CookieSoap.pm
|
||||||
example/lib/MyInterfaces/GlobalWeather/GlobalWeatherSoap.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/FullerData_x0020_Fortune_x0020_Cookie.pm
|
||||||
example/lib/MyTypemaps/GlobalWeather.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/Contract.pm
|
||||||
|
example/lib/MyTypes/Person.pm
|
||||||
|
example/lib/MyTypes/PersonID.pm
|
||||||
|
example/lib/MyTypes/PhoneNumber.pm
|
||||||
|
example/lib/MyTypes/test2.pm
|
||||||
|
example/lib/MyTypes/testExtended.pm
|
||||||
|
example/person.pl
|
||||||
|
example/person_compile.pl
|
||||||
example/visitor/visitor.pl
|
example/visitor/visitor.pl
|
||||||
example/weather.pl
|
example/weather.pl
|
||||||
example/weather_wsdl.pl
|
example/weather_wsdl.pl
|
||||||
|
example/wsdl/11_helloworld.wsdl
|
||||||
example/wsdl/FortuneCookie.xml
|
example/wsdl/FortuneCookie.xml
|
||||||
|
example/wsdl/genericbarcode.xml
|
||||||
example/wsdl/globalweather.xml
|
example/wsdl/globalweather.xml
|
||||||
|
example/wsdl/Person.wsdl
|
||||||
HACKING
|
HACKING
|
||||||
lib/SOAP/WSDL.pm
|
lib/SOAP/WSDL.pm
|
||||||
lib/SOAP/WSDL/Base.pm
|
lib/SOAP/WSDL/Base.pm
|
||||||
@@ -78,6 +113,11 @@ lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/method_info.tt
|
|||||||
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Operation.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Operation.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Part.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Part.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Type.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Type.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Server.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Server/POD/Message.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Server/POD/method_info.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Server/POD/Operation.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Server/POD/OutPart.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/simpleType.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/simpleType.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/atomicType.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/atomicType.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/contentModel.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/contentModel.tt
|
||||||
@@ -104,6 +144,8 @@ lib/SOAP/WSDL/Part.pm
|
|||||||
lib/SOAP/WSDL/Port.pm
|
lib/SOAP/WSDL/Port.pm
|
||||||
lib/SOAP/WSDL/PortType.pm
|
lib/SOAP/WSDL/PortType.pm
|
||||||
lib/SOAP/WSDL/Serializer/XSD.pm
|
lib/SOAP/WSDL/Serializer/XSD.pm
|
||||||
|
lib/SOAP/WSDL/Server.pm
|
||||||
|
lib/SOAP/WSDL/Server/CGI.pm
|
||||||
lib/SOAP/WSDL/Service.pm
|
lib/SOAP/WSDL/Service.pm
|
||||||
lib/SOAP/WSDL/SOAP/Address.pm
|
lib/SOAP/WSDL/SOAP/Address.pm
|
||||||
lib/SOAP/WSDL/SOAP/Body.pm
|
lib/SOAP/WSDL/SOAP/Body.pm
|
||||||
@@ -173,16 +215,15 @@ lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
|
|||||||
lib/SOAP/WSDL/XSD/Typelib/Element.pm
|
lib/SOAP/WSDL/XSD/Typelib/Element.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
||||||
LICENSE
|
LICENSE
|
||||||
MAINFEST
|
|
||||||
Makefile.PL
|
Makefile.PL
|
||||||
MANIFEST
|
MANIFEST This list of files
|
||||||
META.yml
|
META.yml
|
||||||
|
MIGRATING
|
||||||
README
|
README
|
||||||
t/001_use.t
|
t/001_use.t
|
||||||
t/002_parse_wsdl.t
|
t/002_parse_wsdl.t
|
||||||
t/003_wsdl_based_serializer.t
|
t/003_wsdl_based_serializer.t
|
||||||
t/004_parse_wsdl.t
|
t/004_parse_wsdl.t
|
||||||
t/005_parse_contributed.t
|
|
||||||
t/006_client.t
|
t/006_client.t
|
||||||
t/007_envelope.t
|
t/007_envelope.t
|
||||||
t/008_client_wsdl_complexType.t
|
t/008_client_wsdl_complexType.t
|
||||||
@@ -192,8 +233,8 @@ t/012_element.t
|
|||||||
t/013_complexType.t
|
t/013_complexType.t
|
||||||
t/016_client_object.t
|
t/016_client_object.t
|
||||||
t/017_generator.t
|
t/017_generator.t
|
||||||
t/018_compat_2_00_15-generator.t
|
|
||||||
t/020_storable.t
|
t/020_storable.t
|
||||||
|
t/096_characters.t
|
||||||
t/097_kwalitee.t
|
t/097_kwalitee.t
|
||||||
t/098_pod.t
|
t/098_pod.t
|
||||||
t/099_pod_coverage.t
|
t/099_pod_coverage.t
|
||||||
@@ -232,15 +273,12 @@ t/Expat/01_expat.t
|
|||||||
t/Expat/03_wsdl.t
|
t/Expat/03_wsdl.t
|
||||||
t/lib/MyComplexType.pm
|
t/lib/MyComplexType.pm
|
||||||
t/lib/MyElement.pm
|
t/lib/MyElement.pm
|
||||||
t/lib/MyElements/GetWeather.pm
|
|
||||||
t/lib/MyElements/GetWeatherResponse.pm
|
|
||||||
t/lib/MyInterfaces/GlobalWeather.pm
|
|
||||||
t/lib/MySimpleType.pm
|
t/lib/MySimpleType.pm
|
||||||
t/lib/MyTypemaps/GlobalWeather.pm
|
|
||||||
t/lib/Test/SOAPMessage.pm
|
t/lib/Test/SOAPMessage.pm
|
||||||
t/lib/Typelib/Base.pm
|
t/lib/Typelib/Base.pm
|
||||||
t/lib/Typelib/TEnqueueMessage.pm
|
t/lib/Typelib/TEnqueueMessage.pm
|
||||||
t/lib/Typelib/TMessage.pm
|
t/lib/Typelib/TMessage.pm
|
||||||
|
t/SOAP/WSDL.t
|
||||||
t/SOAP/WSDL/01_use.t
|
t/SOAP/WSDL/01_use.t
|
||||||
t/SOAP/WSDL/02_port.t
|
t/SOAP/WSDL/02_port.t
|
||||||
t/SOAP/WSDL/03_complexType-all.t
|
t/SOAP/WSDL/03_complexType-all.t
|
||||||
@@ -259,9 +297,11 @@ t/SOAP/WSDL/05_simpleType-union.t
|
|||||||
t/SOAP/WSDL/06_keep_alive.t
|
t/SOAP/WSDL/06_keep_alive.t
|
||||||
t/SOAP/WSDL/11_helloworld.NET.t
|
t/SOAP/WSDL/11_helloworld.NET.t
|
||||||
t/SOAP/WSDL/12_binding.t
|
t/SOAP/WSDL/12_binding.t
|
||||||
|
t/SOAP/WSDL/Client/Base.t
|
||||||
t/SOAP/WSDL/Deserializer/Hash.t
|
t/SOAP/WSDL/Deserializer/Hash.t
|
||||||
t/SOAP/WSDL/Deserializer/SOM.t
|
t/SOAP/WSDL/Deserializer/SOM.t
|
||||||
t/SOAP/WSDL/Deserializer/XSD.t
|
t/SOAP/WSDL/Deserializer/XSD.t
|
||||||
|
t/SOAP/WSDL/Expat/Base.t
|
||||||
t/SOAP/WSDL/Factory/Deserializer.t
|
t/SOAP/WSDL/Factory/Deserializer.t
|
||||||
t/SOAP/WSDL/Factory/Serializer.t
|
t/SOAP/WSDL/Factory/Serializer.t
|
||||||
t/SOAP/WSDL/Factory/Transport.t
|
t/SOAP/WSDL/Factory/Transport.t
|
||||||
@@ -271,6 +311,8 @@ t/SOAP/WSDL/Generator/Visitor/Typemap.t
|
|||||||
t/SOAP/WSDL/Generator/XCS.t
|
t/SOAP/WSDL/Generator/XCS.t
|
||||||
t/SOAP/WSDL/Generator/XSD.t
|
t/SOAP/WSDL/Generator/XSD.t
|
||||||
t/SOAP/WSDL/Generator/XSD_unsupported.t
|
t/SOAP/WSDL/Generator/XSD_unsupported.t
|
||||||
|
t/SOAP/WSDL/Server.t
|
||||||
|
t/SOAP/WSDL/Server/CGI.t
|
||||||
t/SOAP/WSDL/Transport/01_Test.t
|
t/SOAP/WSDL/Transport/01_Test.t
|
||||||
t/SOAP/WSDL/Transport/02_HTTP.t
|
t/SOAP/WSDL/Transport/02_HTTP.t
|
||||||
t/SOAP/WSDL/Transport/acceptance/test2.xml
|
t/SOAP/WSDL/Transport/acceptance/test2.xml
|
||||||
@@ -296,6 +338,7 @@ t/SOAP/WSDL/XSD/Typelib/Builtin/IDREFS.t
|
|||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/int.t
|
t/SOAP/WSDL/XSD/Typelib/Builtin/int.t
|
||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/integer.t
|
t/SOAP/WSDL/XSD/Typelib/Builtin/integer.t
|
||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/language.t
|
t/SOAP/WSDL/XSD/Typelib/Builtin/language.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/list.t
|
||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/long.t
|
t/SOAP/WSDL/XSD/Typelib/Builtin/long.t
|
||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/Name.t
|
t/SOAP/WSDL/XSD/Typelib/Builtin/Name.t
|
||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/NCName.t
|
t/SOAP/WSDL/XSD/Typelib/Builtin/NCName.t
|
||||||
@@ -317,6 +360,11 @@ t/SOAP/WSDL/XSD/Typelib/Builtin/unsignedLong.t
|
|||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.t
|
t/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.t
|
||||||
t/SOAP/WSDL/XSD/Typelib/ComplexType.t
|
t/SOAP/WSDL/XSD/Typelib/ComplexType.t
|
||||||
t/SOAP/WSDL/XSD/Typelib/Element.t
|
t/SOAP/WSDL/XSD/Typelib/Element.t
|
||||||
|
t/SOAP/WSDL_1.wsdl
|
||||||
|
t/SOAP/WSDL_EMPTY_DEFINITIONS.wsdl
|
||||||
|
t/SOAP/WSDL_NO_BINDING.wsdl
|
||||||
|
t/SOAP/WSDL_NO_MESSAGE.wsdl
|
||||||
|
t/SOAP/WSDL_NO_PORTTYPE.wsdl
|
||||||
t/test.wsdl
|
t/test.wsdl
|
||||||
TEST_COVERAGE
|
TEST_COVERAGE
|
||||||
TODO
|
TODO
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: SOAP-WSDL
|
name: SOAP-WSDL
|
||||||
version: 2.00_24
|
version: 2.00_26
|
||||||
author:
|
author:
|
||||||
- 'Martin Kutter <martin.kutter@fen-net.de>'
|
- 'Martin Kutter <martin.kutter@fen-net.de>'
|
||||||
abstract: SOAP with WSDL support
|
abstract: SOAP with WSDL support
|
||||||
@@ -8,8 +8,13 @@ license: artistic
|
|||||||
resources:
|
resources:
|
||||||
license: http://opensource.org/licenses/artistic-license.php
|
license: http://opensource.org/licenses/artistic-license.php
|
||||||
requires:
|
requires:
|
||||||
Class::Std: v0.0.8
|
Class::Std::Fast: !!perl/hash:version
|
||||||
Class::Std::Storable: 0
|
original: v0.0.5
|
||||||
|
qv: 1
|
||||||
|
version:
|
||||||
|
- 0
|
||||||
|
- 0
|
||||||
|
- 5
|
||||||
Data::Dumper: 0
|
Data::Dumper: 0
|
||||||
Date::Format: 0
|
Date::Format: 0
|
||||||
Date::Parse: 0
|
Date::Parse: 0
|
||||||
@@ -25,30 +30,30 @@ requires:
|
|||||||
provides:
|
provides:
|
||||||
SOAP::WSDL:
|
SOAP::WSDL:
|
||||||
file: lib/SOAP/WSDL.pm
|
file: lib/SOAP/WSDL.pm
|
||||||
version: 2.00_17
|
version: 2.00_25
|
||||||
SOAP::WSDL::Base:
|
SOAP::WSDL::Base:
|
||||||
file: lib/SOAP/WSDL/Base.pm
|
file: lib/SOAP/WSDL/Base.pm
|
||||||
version: 2.00_17
|
version: 2.00_25
|
||||||
SOAP::WSDL::Binding:
|
SOAP::WSDL::Binding:
|
||||||
file: lib/SOAP/WSDL/Binding.pm
|
file: lib/SOAP/WSDL/Binding.pm
|
||||||
SOAP::WSDL::Client:
|
SOAP::WSDL::Client:
|
||||||
file: lib/SOAP/WSDL/Client.pm
|
file: lib/SOAP/WSDL/Client.pm
|
||||||
version: 2.00_17
|
version: 2.00_25
|
||||||
SOAP::WSDL::Client::Base:
|
SOAP::WSDL::Client::Base:
|
||||||
file: lib/SOAP/WSDL/Client/Base.pm
|
file: lib/SOAP/WSDL/Client/Base.pm
|
||||||
version: 2.00_24
|
version: 2.00_25
|
||||||
SOAP::WSDL::Definitions:
|
SOAP::WSDL::Definitions:
|
||||||
file: lib/SOAP/WSDL/Definitions.pm
|
file: lib/SOAP/WSDL/Definitions.pm
|
||||||
version: 2.00_17
|
version: 2.00_25
|
||||||
SOAP::WSDL::Deserializer::Hash:
|
SOAP::WSDL::Deserializer::Hash:
|
||||||
file: lib/SOAP/WSDL/Deserializer/Hash.pm
|
file: lib/SOAP/WSDL/Deserializer/Hash.pm
|
||||||
version: 2.00_24
|
version: 2.00_25
|
||||||
SOAP::WSDL::Deserializer::SOM:
|
SOAP::WSDL::Deserializer::SOM:
|
||||||
file: lib/SOAP/WSDL/Deserializer/SOM.pm
|
file: lib/SOAP/WSDL/Deserializer/SOM.pm
|
||||||
version: 2.00_24
|
version: 2.00_24
|
||||||
SOAP::WSDL::Deserializer::XSD:
|
SOAP::WSDL::Deserializer::XSD:
|
||||||
file: lib/SOAP/WSDL/Deserializer/XSD.pm
|
file: lib/SOAP/WSDL/Deserializer/XSD.pm
|
||||||
version: 2.00_24
|
version: 2.00_25
|
||||||
SOAP::WSDL::Expat::Base:
|
SOAP::WSDL::Expat::Base:
|
||||||
file: lib/SOAP/WSDL/Expat/Base.pm
|
file: lib/SOAP/WSDL/Expat/Base.pm
|
||||||
version: 2.00_24
|
version: 2.00_24
|
||||||
@@ -57,7 +62,7 @@ provides:
|
|||||||
version: 2.00_24
|
version: 2.00_24
|
||||||
SOAP::WSDL::Expat::MessageParser:
|
SOAP::WSDL::Expat::MessageParser:
|
||||||
file: lib/SOAP/WSDL/Expat/MessageParser.pm
|
file: lib/SOAP/WSDL/Expat/MessageParser.pm
|
||||||
version: 2.00_24
|
version: 2.00_25
|
||||||
SOAP::WSDL::Expat::MessageStreamParser:
|
SOAP::WSDL::Expat::MessageStreamParser:
|
||||||
file: lib/SOAP/WSDL/Expat/MessageStreamParser.pm
|
file: lib/SOAP/WSDL/Expat/MessageStreamParser.pm
|
||||||
version: 2.00_24
|
version: 2.00_24
|
||||||
@@ -72,19 +77,21 @@ provides:
|
|||||||
version: 2.00_24
|
version: 2.00_24
|
||||||
SOAP::WSDL::Factory::Transport:
|
SOAP::WSDL::Factory::Transport:
|
||||||
file: lib/SOAP/WSDL/Factory/Transport.pm
|
file: lib/SOAP/WSDL/Factory/Transport.pm
|
||||||
version: 2.00_17
|
version: 2.00_25
|
||||||
SOAP::WSDL::Generator::Template:
|
SOAP::WSDL::Generator::Template:
|
||||||
file: lib/SOAP/WSDL/Generator/Template.pm
|
file: lib/SOAP/WSDL/Generator/Template.pm
|
||||||
version: 2.00_17
|
version: 2.00_25
|
||||||
SOAP::WSDL::Generator::Template::XSD:
|
SOAP::WSDL::Generator::Template::XSD:
|
||||||
file: lib/SOAP/WSDL/Generator/Template/XSD.pm
|
file: lib/SOAP/WSDL/Generator/Template/XSD.pm
|
||||||
|
version: 2.00_25
|
||||||
SOAP::WSDL::Generator::Visitor:
|
SOAP::WSDL::Generator::Visitor:
|
||||||
file: lib/SOAP/WSDL/Generator/Visitor.pm
|
file: lib/SOAP/WSDL/Generator/Visitor.pm
|
||||||
version: 2.00_17
|
version: 2.00_25
|
||||||
SOAP::WSDL::Generator::Visitor::Typelib:
|
SOAP::WSDL::Generator::Visitor::Typelib:
|
||||||
file: lib/SOAP/WSDL/Generator/Visitor/Typelib.pm
|
file: lib/SOAP/WSDL/Generator/Visitor/Typelib.pm
|
||||||
SOAP::WSDL::Generator::Visitor::Typemap:
|
SOAP::WSDL::Generator::Visitor::Typemap:
|
||||||
file: lib/SOAP/WSDL/Generator/Visitor/Typemap.pm
|
file: lib/SOAP/WSDL/Generator/Visitor/Typemap.pm
|
||||||
|
version: 2.00_25
|
||||||
SOAP::WSDL::Message:
|
SOAP::WSDL::Message:
|
||||||
file: lib/SOAP/WSDL/Message.pm
|
file: lib/SOAP/WSDL/Message.pm
|
||||||
SOAP::WSDL::OpMessage:
|
SOAP::WSDL::OpMessage:
|
||||||
@@ -107,23 +114,29 @@ provides:
|
|||||||
file: lib/SOAP/WSDL/SOAP/HeaderFault.pm
|
file: lib/SOAP/WSDL/SOAP/HeaderFault.pm
|
||||||
SOAP::WSDL::SOAP::Operation:
|
SOAP::WSDL::SOAP::Operation:
|
||||||
file: lib/SOAP/WSDL/SOAP/Operation.pm
|
file: lib/SOAP/WSDL/SOAP/Operation.pm
|
||||||
version: 2.00_17
|
version: 2.00_25
|
||||||
SOAP::WSDL::SOAP::Typelib::Fault11:
|
SOAP::WSDL::SOAP::Typelib::Fault11:
|
||||||
file: lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm
|
file: lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm
|
||||||
version: 2.00_17
|
version: 2.00_25
|
||||||
SOAP::WSDL::Serializer::XSD:
|
SOAP::WSDL::Serializer::XSD:
|
||||||
file: lib/SOAP/WSDL/Serializer/XSD.pm
|
file: lib/SOAP/WSDL/Serializer/XSD.pm
|
||||||
version: 2.00_24
|
version: 2.00_25
|
||||||
|
SOAP::WSDL::Server:
|
||||||
|
file: lib/SOAP/WSDL/Server.pm
|
||||||
|
version: 2.00_25
|
||||||
|
SOAP::WSDL::Server::CGI:
|
||||||
|
file: lib/SOAP/WSDL/Server/CGI.pm
|
||||||
|
version: 2.00_26
|
||||||
SOAP::WSDL::Service:
|
SOAP::WSDL::Service:
|
||||||
file: lib/SOAP/WSDL/Service.pm
|
file: lib/SOAP/WSDL/Service.pm
|
||||||
SOAP::WSDL::Transport::HTTP:
|
SOAP::WSDL::Transport::HTTP:
|
||||||
file: lib/SOAP/WSDL/Transport/HTTP.pm
|
file: lib/SOAP/WSDL/Transport/HTTP.pm
|
||||||
SOAP::WSDL::Transport::Loopback:
|
SOAP::WSDL::Transport::Loopback:
|
||||||
file: lib/SOAP/WSDL/Transport/Loopback.pm
|
file: lib/SOAP/WSDL/Transport/Loopback.pm
|
||||||
version: 2.00_17
|
version: 2.00_25
|
||||||
SOAP::WSDL::Transport::Test:
|
SOAP::WSDL::Transport::Test:
|
||||||
file: lib/SOAP/WSDL/Transport/Test.pm
|
file: lib/SOAP/WSDL/Transport/Test.pm
|
||||||
version: 2.00_14
|
version: 2.00_25
|
||||||
SOAP::WSDL::TypeLookup:
|
SOAP::WSDL::TypeLookup:
|
||||||
file: lib/SOAP/WSDL/TypeLookup.pm
|
file: lib/SOAP/WSDL/TypeLookup.pm
|
||||||
SOAP::WSDL::Types:
|
SOAP::WSDL::Types:
|
||||||
@@ -132,20 +145,21 @@ provides:
|
|||||||
file: lib/SOAP/WSDL/XSD/Builtin.pm
|
file: lib/SOAP/WSDL/XSD/Builtin.pm
|
||||||
SOAP::WSDL::XSD::ComplexType:
|
SOAP::WSDL::XSD::ComplexType:
|
||||||
file: lib/SOAP/WSDL/XSD/ComplexType.pm
|
file: lib/SOAP/WSDL/XSD/ComplexType.pm
|
||||||
version: 2.00_17
|
version: 2.00_25
|
||||||
SOAP::WSDL::XSD::Element:
|
SOAP::WSDL::XSD::Element:
|
||||||
file: lib/SOAP/WSDL/XSD/Element.pm
|
file: lib/SOAP/WSDL/XSD/Element.pm
|
||||||
version: 2.00_22
|
version: 2.00_25
|
||||||
SOAP::WSDL::XSD::Schema:
|
SOAP::WSDL::XSD::Schema:
|
||||||
file: lib/SOAP/WSDL/XSD/Schema.pm
|
file: lib/SOAP/WSDL/XSD/Schema.pm
|
||||||
|
version: 2.00_25
|
||||||
SOAP::WSDL::XSD::Schema::Builtin:
|
SOAP::WSDL::XSD::Schema::Builtin:
|
||||||
file: lib/SOAP/WSDL/XSD/Schema/Builtin.pm
|
file: lib/SOAP/WSDL/XSD/Schema/Builtin.pm
|
||||||
SOAP::WSDL::XSD::SimpleType:
|
SOAP::WSDL::XSD::SimpleType:
|
||||||
file: lib/SOAP/WSDL/XSD/SimpleType.pm
|
file: lib/SOAP/WSDL/XSD/SimpleType.pm
|
||||||
version: 2.00_17
|
version: 2.00_25
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin:
|
SOAP::WSDL::XSD::Typelib::Builtin:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
|
||||||
version: 2.00_17
|
version: 2.00_25
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::ENTITY:
|
SOAP::WSDL::XSD::Typelib::Builtin::ENTITY:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::ID:
|
SOAP::WSDL::XSD::Typelib::Builtin::ID:
|
||||||
@@ -176,7 +190,7 @@ provides:
|
|||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/base64Binary.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/base64Binary.pm
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::boolean:
|
SOAP::WSDL::XSD::Typelib::Builtin::boolean:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/boolean.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/boolean.pm
|
||||||
version: 2.00_17
|
version: 2.00_23
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::byte:
|
SOAP::WSDL::XSD::Typelib::Builtin::byte:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/byte.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/byte.pm
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::date:
|
SOAP::WSDL::XSD::Typelib::Builtin::date:
|
||||||
@@ -229,7 +243,7 @@ provides:
|
|||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/string.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/string.pm
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::time:
|
SOAP::WSDL::XSD::Typelib::Builtin::time:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/time.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/time.pm
|
||||||
version: 2.00_18
|
version: 2.00_25
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::token:
|
SOAP::WSDL::XSD::Typelib::Builtin::token:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/token.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/token.pm
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::unsignedByte:
|
SOAP::WSDL::XSD::Typelib::Builtin::unsignedByte:
|
||||||
@@ -242,10 +256,10 @@ provides:
|
|||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType:
|
SOAP::WSDL::XSD::Typelib::ComplexType:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
|
||||||
version: 2.00_24
|
version: 2.00_25
|
||||||
SOAP::WSDL::XSD::Typelib::Element:
|
SOAP::WSDL::XSD::Typelib::Element:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Element.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Element.pm
|
||||||
version: 2.00_24
|
version: 2.00_25
|
||||||
SOAP::WSDL::XSD::Typelib::SimpleType:
|
SOAP::WSDL::XSD::Typelib::SimpleType:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
||||||
SOAP::WSDL::XSD::Typelib::SimpleType::restriction:
|
SOAP::WSDL::XSD::Typelib::SimpleType::restriction:
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
MIGRATING
|
||||||
|
---------
|
||||||
|
|
||||||
|
This document describes how to migrate from 2.00_24 and before versions to
|
||||||
|
2.00_25.
|
||||||
|
|
||||||
|
Migrating from 2.00_xx
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Background
|
||||||
|
|
||||||
|
SOAP::WSDL 2.00_xx has used Class::Std as base for its inside out objects
|
||||||
|
up to 2.00_24. For performance reasons, now Class::Std::Fast is used.
|
||||||
|
As Class::Std::Fast is a drop-in replacement for Class::Std, there should be
|
||||||
|
no need to change anything in your (handwritten) code.
|
||||||
|
|
||||||
|
Generated interfaces
|
||||||
|
|
||||||
|
SOAP::WSDL's internal structure has changed, and this change needs to
|
||||||
|
be reflected in all generated classes.
|
||||||
|
|
||||||
|
This means you have to re-generate your interfaces (in case you use generated
|
||||||
|
interfaces)
|
||||||
|
|
||||||
|
Typemaps
|
||||||
|
|
||||||
|
SOAP::WSDL now tries to load all typemap classes at once from 2.00_25 on.
|
||||||
|
|
||||||
|
If you use __SKIP__ in your typemaps, you'll have to comment out all
|
||||||
|
path deeper than the path marked with __SKIP__ - if you don't, SOAP::WSDL
|
||||||
|
will try to load all correspondent classes.
|
||||||
|
|
||||||
|
Migrating from 1.xx
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
Background
|
||||||
|
|
||||||
|
SOAP::WSDL uses a custom WSDL parser and serializer. It does not rely on XPath
|
||||||
|
for on the fly WSDL processing, nor does it use SOAP::Data objects for
|
||||||
|
encoding any more.
|
||||||
|
|
||||||
|
You should be able to use your wxisting code under most circumstances.
|
||||||
|
SOAP::WSDL is the compatibility module for old interfaces.
|
||||||
|
|
||||||
|
Overloading
|
||||||
|
|
||||||
|
Message overloading (as introduced in 1.23) is not supported any more.
|
||||||
|
|
||||||
|
Message overloading is prohibited by the WS-I basic profile, therefore
|
||||||
|
SOAP::WSDL does not implement it any more.
|
||||||
@@ -1,16 +1,16 @@
|
|||||||
#!/usr/bin/perl -w
|
#!/usr/bin/perl -w
|
||||||
%DB::packages=(SOAP::WSDL::Expat::MessageParser => 1);
|
%DB::packages=(SOAP::WSDL::Expat::MessageParser => 1);
|
||||||
%DB::packages=(SOAP::WSDL::Expat::MessageParser => 1);
|
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use lib '../lib';
|
use lib '../lib';
|
||||||
use lib 'lib';
|
use lib '../../Class-Std-Fast/lib';
|
||||||
use lib '../t/lib';
|
use lib '../t/lib';
|
||||||
# use SOAP::WSDL::SAX::MessageHandler;
|
# use SOAP::WSDL::SAX::MessageHandler;
|
||||||
|
|
||||||
use Benchmark qw(cmpthese timethese);
|
use Benchmark qw(cmpthese timethese);
|
||||||
use SOAP::WSDL::Expat::MessageParser;
|
use SOAP::WSDL::Expat::MessageParser;
|
||||||
use SOAP::WSDL::Expat::Message2Hash;
|
use SOAP::WSDL::Expat::Message2Hash;
|
||||||
|
use SOAP::Lite;
|
||||||
use XML::Simple;
|
use XML::Simple;
|
||||||
use XML::LibXML;
|
use XML::LibXML;
|
||||||
use MyComplexType;
|
use MyComplexType;
|
||||||
@@ -55,6 +55,8 @@ my $libxml = XML::LibXML->new();
|
|||||||
$libxml->keep_blanks(0);
|
$libxml->keep_blanks(0);
|
||||||
my @data;
|
my @data;
|
||||||
|
|
||||||
|
my $deserializer = SOAP::Deserializer->new();
|
||||||
|
|
||||||
sub libxml_test {
|
sub libxml_test {
|
||||||
my $dom = $libxml->parse_string( $xml );
|
my $dom = $libxml->parse_string( $xml );
|
||||||
push @data, dom2hash( $dom->firstChild );
|
push @data, dom2hash( $dom->firstChild );
|
||||||
@@ -100,11 +102,9 @@ cmpthese 5000,
|
|||||||
'XML::Simple (Hash)' => sub { push @data, XMLin $xml },
|
'XML::Simple (Hash)' => sub { push @data, XMLin $xml },
|
||||||
'XML::LibXML (DOM)' => sub { push @data, $libxml->parse_string( $xml ) },
|
'XML::LibXML (DOM)' => sub { push @data, $libxml->parse_string( $xml ) },
|
||||||
'XML::LibXML (Hash)' => \&libxml_test,
|
'XML::LibXML (Hash)' => \&libxml_test,
|
||||||
|
'SOAP::Lite' => sub { push @data, $deserializer->deserialize( $xml ) },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
# for (1..10000) { push @data, $parser->parse( $xml ) };
|
|
||||||
|
|
||||||
# data classes reside in t/lib/Typelib/
|
# data classes reside in t/lib/Typelib/
|
||||||
BEGIN {
|
BEGIN {
|
||||||
package FakeResolver;
|
package FakeResolver;
|
||||||
@@ -115,6 +115,8 @@ BEGIN {
|
|||||||
'MyAtomicComplexTypeElement/test/test2' => 'MyTestElement2',
|
'MyAtomicComplexTypeElement/test/test2' => 'MyTestElement2',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
sub get_typemap { return \%class_list; };
|
||||||
|
|
||||||
sub get_map { return \%class_list };
|
sub get_map { return \%class_list };
|
||||||
|
|
||||||
sub new { return bless {}, 'FakeResolver' };
|
sub new { return bless {}, 'FakeResolver' };
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use Benchmark;
|
use Benchmark;
|
||||||
use lib '../../lib';
|
use lib '../../lib';
|
||||||
|
use lib '../../../Class-Std-Fast/lib';
|
||||||
|
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
||||||
|
|
||||||
my $obj = SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new();
|
my $obj = SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new();
|
||||||
@@ -19,3 +21,37 @@ timethese 1000000, {
|
|||||||
'set_FOO' => sub { $obj->set_value('Test') },
|
'set_FOO' => sub { $obj->set_value('Test') },
|
||||||
'get_FOO' => sub { $data = $obj->get_value() },
|
'get_FOO' => sub { $data = $obj->get_value() },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
Benchmark: timing 10000 iterations of new, new + params, set_FOO...
|
||||||
|
new: 0 wallclock secs ( 0.83 usr + 0.00 sys = 0.83 CPU) @ 12048.19/s (n=10000)
|
||||||
|
new + params: 1 wallclock secs ( 0.58 usr + 0.00 sys = 0.58 CPU) @ 17241.38/s (n=10000)
|
||||||
|
set_FOO: 0 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU) @ 1000000.00/s (n=10000)
|
||||||
|
(warning: too few iterations for a reliable count)
|
||||||
|
Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
|
||||||
|
get_FOO: 1 wallclock secs ( 1.79 usr + 0.01 sys = 1.80 CPU) @ 555555.56/s (n=1000000)
|
||||||
|
set_FOO: 2 wallclock secs ( 1.44 usr + 0.03 sys = 1.47 CPU) @ 680272.11/s (n=1000000)
|
||||||
|
|
||||||
|
## Fast:
|
||||||
|
Benchmark: timing 10000 iterations of new, new + params, set_FOO...
|
||||||
|
new: 1 wallclock secs ( 0.67 usr + 0.01 sys = 0.68 CPU) @ 14705.88/s (n=10000)
|
||||||
|
new + params: 1 wallclock secs ( 0.54 usr + 0.00 sys = 0.54 CPU) @ 18518.52/s (n=10000)
|
||||||
|
set_FOO: 0 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU) @ 1000000.00/s (n=10000)
|
||||||
|
(warning: too few iterations for a reliable count)
|
||||||
|
Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
|
||||||
|
get_FOO: 2 wallclock secs ( 1.11 usr + 0.00 sys = 1.11 CPU) @ 900900.90/s (n=1000000)
|
||||||
|
set_FOO: 2 wallclock secs ( 0.80 usr + 0.00 sys = 0.80 CPU) @ 1250000.00/s (n=1000000)
|
||||||
|
|
||||||
|
## Fast qw(2);
|
||||||
|
Benchmark: timing 10000 iterations of new, new + params, set_FOO...
|
||||||
|
new: 1 wallclock secs ( 0.17 usr + 0.00 sys = 0.17 CPU) @ 58823.53/s (n=10000)
|
||||||
|
(warning: too few iterations for a reliable count)
|
||||||
|
new + params: 0 wallclock secs ( 0.19 usr + 0.00 sys = 0.19 CPU) @ 52631.58/s (n=10000)
|
||||||
|
(warning: too few iterations for a reliable count)
|
||||||
|
set_FOO: 0 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU) @ 1000000.00/s (n=10000)
|
||||||
|
(warning: too few iterations for a reliable count)
|
||||||
|
Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
|
||||||
|
get_FOO: 1 wallclock secs ( 1.12 usr + 0.00 sys = 1.12 CPU) @ 892857.14/s (n=1000000)
|
||||||
|
set_FOO: 0 wallclock secs ( 0.80 usr + 0.01 sys = 0.81 CPU) @ 1234567.90/s (n=1000000)
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use Benchmark;
|
use Benchmark;
|
||||||
use lib '../../lib';
|
use lib '../../lib';
|
||||||
|
use lib '../../../Class-Std-Fast/lib';
|
||||||
|
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::string;
|
use SOAP::WSDL::XSD::Typelib::Builtin::string;
|
||||||
|
|
||||||
my $obj = SOAP::WSDL::XSD::Typelib::Builtin::string->new();
|
my $obj = SOAP::WSDL::XSD::Typelib::Builtin::string->new();
|
||||||
@@ -23,3 +25,32 @@ timethese 1000000, {
|
|||||||
'set_FOO' => sub { $obj->set_value('Test') },
|
'set_FOO' => sub { $obj->set_value('Test') },
|
||||||
'get_FOO' => sub { $data = $obj->get_value() },
|
'get_FOO' => sub { $data = $obj->get_value() },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
Benchmark: timing 20000 iterations of new, new + params...
|
||||||
|
new: 1 wallclock secs ( 0.41 usr + 0.00 sys = 0.41 CPU) @ 48780.49/s (n=20000)
|
||||||
|
new + params: 1 wallclock secs ( 0.53 usr + 0.01 sys = 0.54 CPU) @ 37037.04/s (n=20000)
|
||||||
|
Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
|
||||||
|
get_FOO: 2 wallclock secs ( 1.43 usr + 0.01 sys = 1.44 CPU) @ 694444.44/s (n=1000000)
|
||||||
|
set_FOO: 0 wallclock secs ( 1.43 usr + 0.01 sys = 1.44 CPU) @ 694444.44/s (n=1000000)
|
||||||
|
|
||||||
|
|
||||||
|
::Fast
|
||||||
|
---
|
||||||
|
Benchmark: timing 20000 iterations of new, new + params...
|
||||||
|
new: 0 wallclock secs ( 0.44 usr + 0.01 sys = 0.45 CPU) @ 44444.44/s (n=20000)
|
||||||
|
new + params: 1 wallclock secs ( 0.55 usr + 0.00 sys = 0.55 CPU) @ 36363.64/s (n=20000)
|
||||||
|
Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
|
||||||
|
get_FOO: 0 wallclock secs ( 0.81 usr + 0.00 sys = 0.81 CPU) @ 1234567.90/s (n=1000000)
|
||||||
|
set_FOO: 2 wallclock secs ( 0.87 usr + 0.01 sys = 0.88 CPU) @ 1136363.64/s (n=1000000)
|
||||||
|
|
||||||
|
::Fast with inlined ID
|
||||||
|
Benchmark: timing 20000 iterations of new, new + params...
|
||||||
|
new: 0 wallclock secs ( 0.41 usr + 0.00 sys = 0.41 CPU) @ 48780.49/s (n=20000)
|
||||||
|
new + params: 1 wallclock secs ( 0.52 usr + 0.00 sys = 0.52 CPU) @ 38461.54/s (n=20000)
|
||||||
|
Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
|
||||||
|
get_FOO: 2 wallclock secs ( 0.80 usr + 0.00 sys = 0.80 CPU) @ 1250000.00/s (n=1000000)
|
||||||
|
set_FOO: 2 wallclock secs ( 0.89 usr + -0.01 sys = 0.88 CPU) @ 1136363.64/s (n=1000000)
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use lib '../example/lib';
|
||||||
|
use lib '/home/martin/workspace/SOAP-WSDL-Fast_XS/blib/lib';
|
||||||
|
use lib '/home/martin/workspace/SOAP-WSDL-Fast_XS/blib/arch';
|
||||||
|
use SOAP::Lite;
|
||||||
|
use XML::Compile::WSDL11;
|
||||||
|
use XML::Compile::Transport::SOAPHTTP;
|
||||||
|
use MyInterfaces::HelloWorld::HelloWorldSoap;
|
||||||
|
use SOAP::WSDL::Deserializer::XSD_XS;
|
||||||
|
use Benchmark qw(cmpthese);
|
||||||
|
|
||||||
|
my $lite = SOAP::Lite->new(
|
||||||
|
proxy => 'http://localhost:81/soap-wsdl-test/helloworld.pl'
|
||||||
|
);
|
||||||
|
|
||||||
|
$lite->on_action( sub { "urn:HelloWorld#sayHello" });
|
||||||
|
$lite->autotype(0);
|
||||||
|
|
||||||
|
my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new();
|
||||||
|
|
||||||
|
my $soap_xs = MyInterfaces::HelloWorld::HelloWorldSoap->new();
|
||||||
|
$soap_xs->set_deserializer( SOAP::WSDL::Deserializer::XSD_XS->new() );
|
||||||
|
|
||||||
|
my @result;
|
||||||
|
|
||||||
|
sub wsdl_bench {
|
||||||
|
push @result, $soap->sayHello({
|
||||||
|
name => $ARGV[1] || '"Your name"',
|
||||||
|
givenName => $ARGV[0] || '"Your given name"',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
sub wsdl_xs_bench {
|
||||||
|
push @result, $soap_xs->sayHello({
|
||||||
|
name => $ARGV[1] || '"Your name"',
|
||||||
|
givenName => $ARGV[0] || '"Your given name"',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
my $wsdl = XML::Compile::WSDL11->new('../example/wsdl/11_helloworld.wsdl');
|
||||||
|
my $call = $wsdl->compileClient('sayHello');
|
||||||
|
|
||||||
|
sub compile_bench {
|
||||||
|
push @result, $call->(
|
||||||
|
name => $ARGV[1] || '"Your name"',
|
||||||
|
givenName => $ARGV[0] || '"Your given name"',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub lite_bench {
|
||||||
|
push @result, $lite->call(
|
||||||
|
SOAP::Data->name("sayHello")
|
||||||
|
->attr({ xmlns => 'urn:HelloWorld' }),
|
||||||
|
SOAP::Data->name('name')->value( $ARGV[1] || '"Your name"'),
|
||||||
|
SOAP::Data->name('givenName')->value( $ARGV[0] || '"Your given name"'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
wsdl_bench();
|
||||||
|
wsdl_xs_bench();
|
||||||
|
|
||||||
|
cmpthese 150, {
|
||||||
|
'SOAP::WSDL' => \&wsdl_bench,
|
||||||
|
'SOAP::WSDL_XS' => \&wsdl_xs_bench,
|
||||||
|
'XML::Compile' => \&compile_bench,
|
||||||
|
# 'SOAP::Lite' => \&lite_bench,
|
||||||
|
}
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
use lib '../lib';
|
||||||
|
use lib '../example/lib';
|
||||||
|
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 {
|
||||||
|
# warn MyData::xml;
|
||||||
|
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;
|
||||||
|
$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';
|
||||||
|
sub ListPerson(@) { MyData::xml };
|
||||||
|
my $compile = XML::Compile::WSDL11->new('../example/wsdl/Person.wsdl');
|
||||||
|
# $tester->fromWSDL($wsdl);
|
||||||
|
$tester->actionCallback($action, \&ListPerson);
|
||||||
|
|
||||||
|
# I have to lookup the methods from the WSDL
|
||||||
|
my $call = $compile->compileClient('ListPerson');
|
||||||
|
|
||||||
|
# I have to lookup the parameters from the WSDL
|
||||||
|
my $result = $call->({ in => undef});
|
||||||
|
#use Data::Dumper;
|
||||||
|
#print Dumper $result;
|
||||||
|
|
||||||
|
my $deserializer = SOAP::Deserializer->new();
|
||||||
|
|
||||||
|
my $soap = MyInterfaces::TestService::TestPort->new();
|
||||||
|
|
||||||
|
$result = $soap->ListPerson({});
|
||||||
|
#print $result;
|
||||||
|
#exit;
|
||||||
|
|
||||||
|
my @data = ();
|
||||||
|
my $n = 0;
|
||||||
|
print "Benchmark conducted with
|
||||||
|
SOAP::Lite - $SOAP::Lite::VERSION
|
||||||
|
SOAP::WSDL - $SOAP::WSDL::Client::VERSION
|
||||||
|
XML::Compile::SOAP - $XML::Compile::SOAP::VERSION
|
||||||
|
XML::Simple - $XML::Simple::VERSION
|
||||||
|
|
||||||
|
Benchmark $n: Push result on list
|
||||||
|
";
|
||||||
|
$n++;
|
||||||
|
print "Benchmark $n: Store result in private variable and destroy it\n";
|
||||||
|
cmpthese 100, {
|
||||||
|
'XML::Simple' => sub { my $result = XMLin( MyData::xml() )},
|
||||||
|
'SOAP::WSDL' => sub { my $result = $soap->ListPerson({}) },
|
||||||
|
'XML::Compile::SOAP' => sub { my $result = $call->() },
|
||||||
|
'SOAP::Lite' => sub { my $result = $deserializer->deserialize( MyData::xml() )}
|
||||||
|
};
|
||||||
|
|
||||||
|
$n++;
|
||||||
|
cmpthese 100, {
|
||||||
|
'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
|
||||||
|
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
|
||||||
|
'XML::Compile::SOAP' => sub { push @data, $call->() },
|
||||||
|
'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
|
||||||
|
};
|
||||||
|
|
||||||
|
@data = ();
|
||||||
|
print "Benchmark $n: Play it again, Sam\n";
|
||||||
|
|
||||||
|
cmpthese 100, {
|
||||||
|
'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
|
||||||
|
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
|
||||||
|
'XML::Compile::SOAP' => sub { push @data, $call->() },
|
||||||
|
'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
|
||||||
|
};
|
||||||
|
|
||||||
@@ -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>
|
||||||
+13
-1
@@ -18,6 +18,7 @@ my %opt = (
|
|||||||
base_path => 'lib/',
|
base_path => 'lib/',
|
||||||
proxy => undef,
|
proxy => undef,
|
||||||
generator => 'XSD',
|
generator => 'XSD',
|
||||||
|
server => 0,
|
||||||
);
|
);
|
||||||
|
|
||||||
{ # a block just to scope "no warnings"
|
{ # a block just to scope "no warnings"
|
||||||
@@ -59,6 +60,7 @@ GetOptions(\%opt,
|
|||||||
user=s
|
user=s
|
||||||
password=s
|
password=s
|
||||||
generator=s
|
generator=s
|
||||||
|
server
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -114,7 +116,8 @@ $generator->set_wsdl($xml) if $generator->can('set_wsdl');
|
|||||||
|
|
||||||
# start with typelib, as errors will most likely occur here...
|
# start with typelib, as errors will most likely occur here...
|
||||||
$generator->generate();
|
$generator->generate();
|
||||||
|
$generator->generate_interface() if ! $opt{server};
|
||||||
|
$generator->generate_server() if $opt{server};
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
@@ -153,6 +156,8 @@ wsdl2perl.pl - create perl bindings for SOAP webservices.
|
|||||||
password Password. wsdl2perl will prompt if not given.
|
password Password. wsdl2perl will prompt if not given.
|
||||||
generator g Generator to use.
|
generator g Generator to use.
|
||||||
Default: XSD
|
Default: XSD
|
||||||
|
server s Generate a server interface (currently only CGI
|
||||||
|
supported)
|
||||||
help h Show help content
|
help h Show help content
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
@@ -169,6 +174,13 @@ The following classes are created:
|
|||||||
Interface classes are what you will mainly deal with: They provide a method
|
Interface classes are what you will mainly deal with: They provide a method
|
||||||
for accessing every web service method.
|
for accessing every web service method.
|
||||||
|
|
||||||
|
If you chose to generate Server interfaces, a class for every SOAP port in
|
||||||
|
every Web service.
|
||||||
|
|
||||||
|
You'll have to implement a method for each of the implemented methods. You
|
||||||
|
may implement these methods in the CGI script / handler, or in any class
|
||||||
|
to dispatch calls to.
|
||||||
|
|
||||||
=item * A typemap for every service
|
=item * A typemap for every service
|
||||||
|
|
||||||
Typemaps are used internally by SOAP::WSDL for parsing the SOAP message into
|
Typemaps are used internally by SOAP::WSDL for parsing the SOAP message into
|
||||||
|
|||||||
Executable
+55
@@ -0,0 +1,55 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use lib '../../lib';
|
||||||
|
use lib '../lib';
|
||||||
|
use MyServer::HelloWorld::HelloWorldSoap;
|
||||||
|
|
||||||
|
my $soap = MyServer::HelloWorld::HelloWorldSoap->new({
|
||||||
|
dispatch_to => 'main',
|
||||||
|
});
|
||||||
|
|
||||||
|
$soap->handle();
|
||||||
|
|
||||||
|
sub sayHello {
|
||||||
|
my ($self, $body, $header) = @_;
|
||||||
|
my $name = $body->get_name();
|
||||||
|
my $givenName = $body->get_givenName();
|
||||||
|
|
||||||
|
return MyElements::sayHelloResponse->new({
|
||||||
|
sayHelloResult => "Hello $givenName $name"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
helloworld.pl - a simple CGI-based SOAP server implementing the service from
|
||||||
|
in examples/wsdl/helloworld.wsdl
|
||||||
|
|
||||||
|
=head1 USAGE
|
||||||
|
|
||||||
|
Before using this script, you should secure your webserver. The easiest way
|
||||||
|
to do so is to let it listen to 127.0.0.1 only.
|
||||||
|
|
||||||
|
Then make a ScriptAlias named /soap-wsdl-test/ pointing at the directory
|
||||||
|
this file lies in.
|
||||||
|
|
||||||
|
For my apache, it looks like this:
|
||||||
|
|
||||||
|
ScriptAlias /soap-wsdl-test/ /home/martin/workspace/SOAP-WSDL/example/cgi-bin/
|
||||||
|
<Directory "/home/martin/workspace/SOAP-WSDL/example/cgi-bin">
|
||||||
|
AllowOverride None
|
||||||
|
Options +ExecCGI -MultiViews
|
||||||
|
Order allow,deny
|
||||||
|
Allow from all
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
Then run the helloworld.pl from the examples directory. It should print
|
||||||
|
|
||||||
|
Hello World
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
=cut
|
||||||
Executable
+83
@@ -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 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
use lib 'lib';
|
||||||
|
use lib '../lib';
|
||||||
|
use MyInterfaces::BarCode::BarCodeSoap;
|
||||||
|
my $interface = MyInterfaces::BarCode::BarCodeSoap->new();
|
||||||
|
my $barcode = $interface->GenerateBarCode( {
|
||||||
|
BarCodeParam => { # MyTypes::BarCodeData
|
||||||
|
Height => 42, # int
|
||||||
|
Width => 120, # int
|
||||||
|
Angle => 90, # int
|
||||||
|
Ratio => 1, # int
|
||||||
|
Module => 1, # int
|
||||||
|
Left => 10, # int
|
||||||
|
Top => 10, # int
|
||||||
|
CheckSum => 0, # boolean
|
||||||
|
FontName => 'Arial', # string
|
||||||
|
BarColor => 'black', # string
|
||||||
|
BGColor => 'white', # string
|
||||||
|
FontSize => 6.25, # float
|
||||||
|
barcodeOption => 'Both', # BarcodeOption
|
||||||
|
barcodeType => 'CodeMSI', # BarcodeType
|
||||||
|
checkSumMethod => 'None', # CheckSumMethod
|
||||||
|
showTextPosition => 'TopLeft', # ShowTextPosition
|
||||||
|
BarCodeImageFormat => 'PNG', # ImageFormats
|
||||||
|
},
|
||||||
|
BarCodeText => 'JustSomeText', # string
|
||||||
|
},
|
||||||
|
);
|
||||||
|
die $barcode if not ($barcode);
|
||||||
|
print $barcode;
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use lib 'lib';
|
||||||
|
|
||||||
|
# I have to generate the interface using wsdl2perl.pl before
|
||||||
|
use MyInterfaces::HelloWorld::HelloWorldSoap;
|
||||||
|
|
||||||
|
my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new();
|
||||||
|
|
||||||
|
# I have to lookup the method and synopsis from the interface's pod
|
||||||
|
my $result = $soap->sayHello({
|
||||||
|
name => $ARGV[1] || '"Your name"',
|
||||||
|
givenName => $ARGV[0] || '"Your given name"',
|
||||||
|
});
|
||||||
|
|
||||||
|
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";
|
||||||
@@ -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/11_helloworld.wsdl');
|
||||||
|
|
||||||
|
# I have to lookup the methods from the WSDL
|
||||||
|
my $call = $wsdl->compileClient('sayHello');
|
||||||
|
|
||||||
|
# I have to lookup the parameters from the WSDL
|
||||||
|
my $result = $call->(
|
||||||
|
name => $ARGV[1] || '"Your name"',
|
||||||
|
givenName => $ARGV[0] || '"Your given name"',
|
||||||
|
);
|
||||||
|
|
||||||
|
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";
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use SOAP::Lite;
|
||||||
|
|
||||||
|
# I have to lookup the URL from the WSDL
|
||||||
|
my $soap = SOAP::Lite->new(
|
||||||
|
proxy => 'http://localhost:81/soap-wsdl-test/helloworld.pl'
|
||||||
|
);
|
||||||
|
|
||||||
|
# I have to lookup the SOAPAction from the WSDL
|
||||||
|
$soap->on_action( sub { "urn:HelloWorld#sayHello" });
|
||||||
|
$soap->autotype(0);
|
||||||
|
|
||||||
|
# I have to lookup the top level element's namespace from the WSDL
|
||||||
|
# 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' }),
|
||||||
|
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";
|
||||||
@@ -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
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
package MyElements::sayHello;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
sub get_xmlns { 'urn:HelloWorld' }
|
||||||
|
|
||||||
|
__PACKAGE__->__set_name('sayHello');
|
||||||
|
__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 %name_of :ATTR(:get<name>);
|
||||||
|
my %givenName_of :ATTR(:get<givenName>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
name
|
||||||
|
givenName
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
name => \%name_of,
|
||||||
|
givenName => \%givenName_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
givenName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyElements::sayHello
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined element
|
||||||
|
sayHello from the namespace urn:HelloWorld.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
my $element = MyElements::sayHello->new($data);
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
{
|
||||||
|
name => $some_value, # string
|
||||||
|
givenName => $some_value, # string
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
package MyElements::sayHelloResponse;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
sub get_xmlns { 'urn:HelloWorld' }
|
||||||
|
|
||||||
|
__PACKAGE__->__set_name('sayHelloResponse');
|
||||||
|
__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 %sayHelloResult_of :ATTR(:get<sayHelloResult>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
sayHelloResult
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
sayHelloResult => \%sayHelloResult_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sayHelloResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyElements::sayHelloResponse
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined element
|
||||||
|
sayHelloResponse from the namespace urn:HelloWorld.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
my $element = MyElements::sayHelloResponse->new($data);
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
{
|
||||||
|
sayHelloResult => $some_value, # string
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
package MyInterfaces::BarCode::BarCodeSoap;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Storable;
|
||||||
|
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');
|
||||||
|
|
||||||
|
sub START {
|
||||||
|
$_[0]->set_proxy('http://www.webservicex.net/genericbarcode.asmx') if not $_[2]->{proxy};
|
||||||
|
$_[0]->set_class_resolver('MyTypemaps::BarCode')
|
||||||
|
if not $_[2]->{class_resolver};
|
||||||
|
}
|
||||||
|
|
||||||
|
sub GenerateBarCode {
|
||||||
|
my ($self, $body, $header) = @_;
|
||||||
|
return $self->SUPER::call({
|
||||||
|
operation => 'GenerateBarCode',
|
||||||
|
soap_action => 'http://www.webservicex.net/GenerateBarCode',
|
||||||
|
style => 'document',
|
||||||
|
body => {
|
||||||
|
|
||||||
|
'use' => 'literal',
|
||||||
|
namespace => '',
|
||||||
|
encodingStyle => '',
|
||||||
|
parts => [qw( MyElements::GenerateBarCode )],
|
||||||
|
},
|
||||||
|
header => {
|
||||||
|
|
||||||
|
},
|
||||||
|
headerfault => {
|
||||||
|
|
||||||
|
}
|
||||||
|
}, $body, $header);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
|
||||||
|
MyInterfaces::BarCode::BarCodeSoap - SOAP Interface for the BarCode Web Service
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use MyInterfaces::BarCode::BarCodeSoap;
|
||||||
|
my $interface = MyInterfaces::BarCode::BarCodeSoap->new();
|
||||||
|
|
||||||
|
my $response;
|
||||||
|
$response = $interface->GenerateBarCode();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP Interface for the BarCode web service
|
||||||
|
located at http://www.webservicex.net/genericbarcode.asmx.
|
||||||
|
|
||||||
|
=head1 SERVICE BarCode
|
||||||
|
|
||||||
|
Barcode generator
|
||||||
|
|
||||||
|
=head2 Port BarCodeSoap
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=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 GenerateBarCode
|
||||||
|
|
||||||
|
WebserviceX.NET barcode library that provides the means to create barcodes for printing and display in any internet enabled applications. This web service supports Code 128, Industrial 2 of 5, Interleaved 2 of 5, Code 2 5 Matrix, Code 39, Code 39 Extended, Code 93, Code 93 Extended, Codabar, EAN13, EAN8, MSI, Postnet, Supp2, Supp5, UPC A, UPC E0 and UPC E1 barcode formats. This Barcodes returns byte image. It supports following image format JPEG, GIF, PNG, BMP, EMF, EXIF, ICON, MEMORY BMP, TIFF and WMF.
|
||||||
|
|
||||||
|
$interface->GenerateBarCode( {
|
||||||
|
BarCodeParam => { # 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
|
||||||
|
},
|
||||||
|
BarCodeText => $some_value, # string
|
||||||
|
},,
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL on Fri Nov 9 00:18:35 2007
|
||||||
|
|
||||||
|
=pod
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
package MyInterfaces::HelloWorld::HelloWorldSoap;
|
||||||
|
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::HelloWorld
|
||||||
|
if not MyTypemaps::HelloWorld->can('get_class');
|
||||||
|
|
||||||
|
sub START {
|
||||||
|
$_[0]->set_proxy('http://localhost:81/soap-wsdl-test/helloworld.pl') if not $_[2]->{proxy};
|
||||||
|
$_[0]->set_class_resolver('MyTypemaps::HelloWorld')
|
||||||
|
if not $_[2]->{class_resolver};
|
||||||
|
}
|
||||||
|
|
||||||
|
sub sayHello {
|
||||||
|
my ($self, $body, $header) = @_;
|
||||||
|
die "sayHello must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||||
|
return $self->SUPER::call({
|
||||||
|
operation => 'sayHello',
|
||||||
|
soap_action => 'urn:HelloWorld#sayHello',
|
||||||
|
style => 'document',
|
||||||
|
body => {
|
||||||
|
|
||||||
|
'use' => 'literal',
|
||||||
|
namespace => '',
|
||||||
|
encodingStyle => '',
|
||||||
|
parts => [qw( MyElements::sayHello )],
|
||||||
|
},
|
||||||
|
header => {
|
||||||
|
|
||||||
|
},
|
||||||
|
headerfault => {
|
||||||
|
|
||||||
|
}
|
||||||
|
}, $body, $header);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
|
||||||
|
MyInterfaces::HelloWorld::HelloWorldSoap - SOAP Interface for the HelloWorld Web Service
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use MyInterfaces::HelloWorld::HelloWorldSoap;
|
||||||
|
my $interface = MyInterfaces::HelloWorld::HelloWorldSoap->new();
|
||||||
|
|
||||||
|
my $response;
|
||||||
|
$response = $interface->sayHello();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP Interface for the HelloWorld web service
|
||||||
|
located at http://localhost:81/soap-wsdl-test/helloworld.pl.
|
||||||
|
|
||||||
|
=head1 SERVICE HelloWorld
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head2 Port HelloWorldSoap
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=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 sayHello
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$interface->sayHello( {
|
||||||
|
name => $some_value, # string
|
||||||
|
givenName => $some_value, # string
|
||||||
|
},,
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL on Sat Dec 1 19:51:31 2007
|
||||||
|
|
||||||
|
=pod
|
||||||
@@ -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
|
||||||
@@ -0,0 +1,113 @@
|
|||||||
|
package MyServer::HelloWorld::HelloWorldSoap;
|
||||||
|
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::HelloWorld
|
||||||
|
if not MyTypemaps::HelloWorld->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 = {
|
||||||
|
'urn:HelloWorld#sayHello' => 'sayHello',
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
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::HelloWorld',
|
||||||
|
dispatch_to => $dispatch_to{ $ident },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
sub handle {
|
||||||
|
$transport_of{ ${ $_[0] } }->handle();
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyInterfaces::HelloWorld::HelloWorldSoap - SOAP Server Class for the HelloWorld Web Service
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use MyServer::HelloWorld::HelloWorldSoap;
|
||||||
|
my $server = MyServer::HelloWorld::HelloWorldSoap->new({
|
||||||
|
dispatch_to => 'My::Handler::Class',
|
||||||
|
transport_class => 'SOAP::WSDL::Server::CGI', # optional, default
|
||||||
|
});
|
||||||
|
$server->handle();
|
||||||
|
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP Server handler for the HelloWorld web service
|
||||||
|
located at http://localhost:81/soap-wsdl-test/helloworld.pl.
|
||||||
|
|
||||||
|
=head1 SERVICE HelloWorld
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head2 Port HelloWorldSoap
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=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 sayHello
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sub sayHello(
|
||||||
|
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::sayHelloResponse->new( {
|
||||||
|
sayHelloResult => $some_value, # string
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL on Sun Dec 2 01:20:36 2007
|
||||||
|
|
||||||
|
=pod
|
||||||
@@ -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
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
package MyTypemaps::BarCode;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
our $typemap_1 = {
|
||||||
|
'GenerateBarCode/BarCodeText' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'GenerateBarCode/BarCodeParam/BarColor' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'GenerateBarCode/BarCodeParam/barcodeOption' => 'MyTypes::BarcodeOption',
|
||||||
|
'GenerateBarCode/BarCodeParam/Left' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
'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',
|
||||||
|
'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',
|
||||||
|
'GenerateBarCode/BarCodeParam/Height' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
'GenerateBarCode/BarCodeParam/CheckSum' => 'SOAP::WSDL::XSD::Typelib::Builtin::boolean',
|
||||||
|
'GenerateBarCode/BarCodeParam/checkSumMethod' => 'MyTypes::CheckSumMethod',
|
||||||
|
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'GenerateBarCode/BarCodeParam/barcodeType' => 'MyTypes::BarcodeType',
|
||||||
|
'GenerateBarCode/BarCodeParam/FontSize' => 'SOAP::WSDL::XSD::Typelib::Builtin::float',
|
||||||
|
'GenerateBarCode/BarCodeParam/Top' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
'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/FontName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string'
|
||||||
|
};
|
||||||
|
;
|
||||||
|
|
||||||
|
sub get_class {
|
||||||
|
my $name = join '/', @{ $_[1] };
|
||||||
|
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
|
||||||
|
return $typemap_1->{ $name };
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyTypemaps::BarCode; - typemap for ::BarCode;
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Typemap created by SOAP::WSDL for map-based SOAP message parsers.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package MyTypemaps::HelloWorld;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
our $typemap_1 = {
|
||||||
|
'sayHello/givenName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'sayHelloResponse' => 'MyElements::sayHelloResponse',
|
||||||
|
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
|
||||||
|
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'sayHelloResponse/sayHelloResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
||||||
|
'sayHello' => 'MyElements::sayHello',
|
||||||
|
'sayHello/name' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11'
|
||||||
|
};
|
||||||
|
;
|
||||||
|
|
||||||
|
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::HelloWorld; - typemap for ::HelloWorld;
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Typemap created by SOAP::WSDL for map-based SOAP message parsers.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
package MyTypes::test2;
|
||||||
|
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 %name_of :ATTR(:get<name>);
|
||||||
|
my %givenName_of :ATTR(:get<givenName>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
name
|
||||||
|
givenName
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
name => \%name_of,
|
||||||
|
givenName => \%givenName_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
givenName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyTypes::test2
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined complextype
|
||||||
|
test2 from the namespace urn:HelloWorld.
|
||||||
|
|
||||||
|
=head2 PROPERTIES
|
||||||
|
|
||||||
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
|
methods:
|
||||||
|
|
||||||
|
name
|
||||||
|
givenName
|
||||||
|
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
{ # MyTypes::test2
|
||||||
|
name => $some_value, # string
|
||||||
|
givenName => $some_value, # string
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
package MyTypes::testExtended;
|
||||||
|
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 %extend_of :ATTR(:get<extend>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
extend
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
extend => \%extend_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
extend => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyTypes::testExtended
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined complextype
|
||||||
|
testExtended from the namespace urn:HelloWorld.
|
||||||
|
|
||||||
|
=head2 PROPERTIES
|
||||||
|
|
||||||
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
|
methods:
|
||||||
|
|
||||||
|
extend
|
||||||
|
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
{ # MyTypes::testExtended
|
||||||
|
extend => $some_value, # string
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
use lib 'lib';
|
||||||
|
use MyInterfaces::TestService::TestPort;
|
||||||
|
|
||||||
|
my $soap = MyInterfaces::TestService::TestPort->new();
|
||||||
|
$soap->outputxml(1);
|
||||||
|
my $result = $soap->ListPerson({});
|
||||||
|
|
||||||
|
# print "Found " . scalar @{ $result->get_out->get_NewElement } . " persons\n";
|
||||||
|
|
||||||
|
print $result;
|
||||||
@@ -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";
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
|
||||||
|
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
|
||||||
|
xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="urn:HelloWorld"
|
||||||
|
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
|
||||||
|
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
|
||||||
|
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
|
||||||
|
targetNamespace="urn:HelloWorld"
|
||||||
|
xmlns="http://schemas.xmlsoap.org/wsdl/">
|
||||||
|
<types>
|
||||||
|
<s:schema elementFormDefault="qualified"
|
||||||
|
targetNamespace="urn:HelloWorld">
|
||||||
|
<s:element name="sayHello">
|
||||||
|
<s:complexType>
|
||||||
|
<s:sequence>
|
||||||
|
<s:element minOccurs="0" maxOccurs="1"
|
||||||
|
name="name" type="s:string" />
|
||||||
|
<s:element minOccurs="0" maxOccurs="1"
|
||||||
|
name="givenName" type="s:string" nillable="1" />
|
||||||
|
</s:sequence>
|
||||||
|
</s:complexType>
|
||||||
|
</s:element>
|
||||||
|
|
||||||
|
<s:element name="sayHelloResponse">
|
||||||
|
<s:complexType>
|
||||||
|
<s:sequence>
|
||||||
|
<s:element minOccurs="0" maxOccurs="1"
|
||||||
|
name="sayHelloResult" type="s:string" />
|
||||||
|
</s:sequence>
|
||||||
|
</s:complexType>
|
||||||
|
</s:element>
|
||||||
|
|
||||||
|
<s:complexType name="test2">
|
||||||
|
<s:sequence>
|
||||||
|
<s:element minOccurs="0" maxOccurs="1" name="name"
|
||||||
|
type="s:string" />
|
||||||
|
|
||||||
|
<s:element minOccurs="0" maxOccurs="1"
|
||||||
|
name="givenName" type="s:string" />
|
||||||
|
</s:sequence>
|
||||||
|
</s:complexType>
|
||||||
|
|
||||||
|
<s:complexType name="testExtended">
|
||||||
|
<s:extension base="s0:test2">
|
||||||
|
<s:sequence>
|
||||||
|
<s:element minOccurs="0" maxOccurs="1"
|
||||||
|
name="extend" type="s:string" />
|
||||||
|
</s:sequence>
|
||||||
|
</s:extension>
|
||||||
|
</s:complexType>
|
||||||
|
</s:schema>
|
||||||
|
</types>
|
||||||
|
|
||||||
|
<message name="sayHelloSoapIn">
|
||||||
|
<part name="parameters" element="s0:sayHello" />
|
||||||
|
</message>
|
||||||
|
|
||||||
|
<message name="sayHelloSoapOut">
|
||||||
|
<part name="parameters" element="s0:sayHelloResponse" />
|
||||||
|
</message>
|
||||||
|
|
||||||
|
<portType name="Service1Soap">
|
||||||
|
<operation name="sayHello">
|
||||||
|
<input message="s0:sayHelloSoapIn" />
|
||||||
|
|
||||||
|
<output message="s0:sayHelloSoapOut" />
|
||||||
|
</operation>
|
||||||
|
</portType>
|
||||||
|
|
||||||
|
<binding name="Service1Soap" type="s0:Service1Soap">
|
||||||
|
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
|
||||||
|
style="document" />
|
||||||
|
|
||||||
|
<operation name="sayHello">
|
||||||
|
<soap:operation soapAction="urn:HelloWorld#sayHello"
|
||||||
|
style="document" />
|
||||||
|
|
||||||
|
<input>
|
||||||
|
<soap:body use="literal" />
|
||||||
|
</input>
|
||||||
|
|
||||||
|
<output>
|
||||||
|
<soap:body use="literal" />
|
||||||
|
</output>
|
||||||
|
</operation>
|
||||||
|
</binding>
|
||||||
|
|
||||||
|
<service name="HelloWorld">
|
||||||
|
<port name="HelloWorldSoap" binding="s0:Service1Soap">
|
||||||
|
<soap:address
|
||||||
|
location="http://localhost:81/soap-wsdl-test/helloworld.pl" />
|
||||||
|
</port>
|
||||||
|
</service>
|
||||||
|
</definitions>
|
||||||
|
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><wsdl:definitions name="benchmark" targetNamespace="http://www.example.org/benchmark/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://www.example.org/benchmark/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
|
||||||
|
<wsdl:types><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/benchmark/">
|
||||||
|
<xsd:element name="ListPerson">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="in" type="tns:Person" maxOccurs="1" minOccurs="0"></xsd:element>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="ListPersonResponse">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="out" type="tns:ArrayOfPerson"></xsd:element>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:complexType name="Person">
|
||||||
|
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="PersonID" type="tns:PersonID"></xsd:element>
|
||||||
|
<xsd:element name="Salutation" type="xsd:string"></xsd:element>
|
||||||
|
<xsd:element name="Name" type="xsd:string"></xsd:element>
|
||||||
|
<xsd:element name="GivenName" type="xsd:string"></xsd:element>
|
||||||
|
<xsd:element name="DateOfBirth" type="xsd:date"></xsd:element>
|
||||||
|
<xsd:element name="HomeAddress" type="tns:Address"
|
||||||
|
maxOccurs="1" minOccurs="1">
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="WorkAddress" type="tns:Address"
|
||||||
|
maxOccurs="1" minOccurs="0">
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="Contracts" type="tns:ArrayOfContract"></xsd:element>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
|
||||||
|
<xsd: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:element>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
|
||||||
|
<xsd:complexType name="PersonID">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="ID" type="xsd:int"></xsd:element>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
|
||||||
|
<xsd:complexType name="Address">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="Street" type="xsd:string"></xsd:element>
|
||||||
|
<xsd:element name="ZIP" type="xsd:string"></xsd:element>
|
||||||
|
<xsd:element name="City" type="xsd:string"></xsd:element>
|
||||||
|
<xsd:element name="Country" type="xsd:string"></xsd:element>
|
||||||
|
<xsd:element name="PhoneNumber" type="tns:PhoneNumber"></xsd:element>
|
||||||
|
<xsd:element name="MobilePhoneNumber" type="tns:PhoneNumber"></xsd:element>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
|
||||||
|
<xsd:complexType name="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>
|
||||||
|
<xsd:element name="ContractName" type="xsd:string"></xsd:element>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:schema></wsdl:types>
|
||||||
|
<wsdl:message name="ListPersonRequest">
|
||||||
|
<wsdl:part name="parameters" element="tns:ListPerson"></wsdl:part>
|
||||||
|
</wsdl:message>
|
||||||
|
<wsdl:message name="ListPersonResponse">
|
||||||
|
<wsdl:part name="parameters" element="tns:ListPersonResponse"></wsdl:part>
|
||||||
|
</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>
|
||||||
@@ -0,0 +1,153 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<wsdl:definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://www.webservicex.net/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://www.webservicex.net/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
|
||||||
|
<wsdl:types>
|
||||||
|
<s:schema elementFormDefault="qualified" targetNamespace="http://www.webservicex.net/">
|
||||||
|
<s:element name="GenerateBarCode">
|
||||||
|
<s:complexType>
|
||||||
|
<s:sequence>
|
||||||
|
<s:element minOccurs="1" maxOccurs="1" name="BarCodeParam" type="tns:BarCodeData" />
|
||||||
|
<s:element minOccurs="0" maxOccurs="1" name="BarCodeText" type="s:string" />
|
||||||
|
</s:sequence>
|
||||||
|
</s:complexType>
|
||||||
|
</s:element>
|
||||||
|
<s:complexType name="BarCodeData">
|
||||||
|
<s:sequence>
|
||||||
|
<s:element minOccurs="1" maxOccurs="1" name="Height" type="s:int" />
|
||||||
|
<s:element minOccurs="1" maxOccurs="1" name="Width" type="s:int" />
|
||||||
|
<s:element minOccurs="1" maxOccurs="1" name="Angle" type="s:int" />
|
||||||
|
<s:element minOccurs="1" maxOccurs="1" name="Ratio" type="s:int" />
|
||||||
|
<s:element minOccurs="1" maxOccurs="1" name="Module" type="s:int" />
|
||||||
|
<s:element minOccurs="1" maxOccurs="1" name="Left" type="s:int" />
|
||||||
|
<s:element minOccurs="1" maxOccurs="1" name="Top" type="s:int" />
|
||||||
|
<s:element minOccurs="1" maxOccurs="1" name="CheckSum" type="s:boolean" />
|
||||||
|
<s:element minOccurs="0" maxOccurs="1" name="FontName" type="s:string" />
|
||||||
|
<s:element minOccurs="0" maxOccurs="1" name="BarColor" type="s:string" />
|
||||||
|
<s:element minOccurs="0" maxOccurs="1" name="BGColor" type="s:string" />
|
||||||
|
<s:element minOccurs="1" maxOccurs="1" name="FontSize" type="s:float" />
|
||||||
|
<s:element minOccurs="1" maxOccurs="1" name="barcodeOption" type="tns:BarcodeOption" />
|
||||||
|
<s:element minOccurs="1" maxOccurs="1" name="barcodeType" type="tns:BarcodeType" />
|
||||||
|
<s:element minOccurs="1" maxOccurs="1" name="checkSumMethod" type="tns:CheckSumMethod" />
|
||||||
|
<s:element minOccurs="1" maxOccurs="1" name="showTextPosition" type="tns:ShowTextPosition" />
|
||||||
|
<s:element minOccurs="1" maxOccurs="1" name="BarCodeImageFormat" type="tns:ImageFormats" />
|
||||||
|
</s:sequence>
|
||||||
|
</s:complexType>
|
||||||
|
<s:simpleType name="BarcodeOption">
|
||||||
|
<s:restriction base="s:string">
|
||||||
|
<s:enumeration value="None" />
|
||||||
|
<s:enumeration value="Code" />
|
||||||
|
<s:enumeration value="Typ" />
|
||||||
|
<s:enumeration value="Both" />
|
||||||
|
</s:restriction>
|
||||||
|
</s:simpleType>
|
||||||
|
<s:simpleType name="BarcodeType">
|
||||||
|
<s:restriction base="s:string">
|
||||||
|
<s:enumeration value="Code_2_5_interleaved" />
|
||||||
|
<s:enumeration value="Code_2_5_industrial" />
|
||||||
|
<s:enumeration value="Code_2_5_matrix" />
|
||||||
|
<s:enumeration value="Code39" />
|
||||||
|
<s:enumeration value="Code39Extended" />
|
||||||
|
<s:enumeration value="Code128A" />
|
||||||
|
<s:enumeration value="Code128B" />
|
||||||
|
<s:enumeration value="Code128C" />
|
||||||
|
<s:enumeration value="Code93" />
|
||||||
|
<s:enumeration value="Code93Extended" />
|
||||||
|
<s:enumeration value="CodeMSI" />
|
||||||
|
<s:enumeration value="CodePostNet" />
|
||||||
|
<s:enumeration value="CodeCodabar" />
|
||||||
|
<s:enumeration value="CodeEAN8" />
|
||||||
|
<s:enumeration value="CodeEAN13" />
|
||||||
|
<s:enumeration value="CodeUPC_A" />
|
||||||
|
<s:enumeration value="CodeUPC_E0" />
|
||||||
|
<s:enumeration value="CodeUPC_E1" />
|
||||||
|
<s:enumeration value="CodeUPC_Supp2" />
|
||||||
|
<s:enumeration value="CodeUPC_Supp5" />
|
||||||
|
<s:enumeration value="CodeEAN128A" />
|
||||||
|
<s:enumeration value="CodeEAN128B" />
|
||||||
|
<s:enumeration value="CodeEAN128C" />
|
||||||
|
</s:restriction>
|
||||||
|
</s:simpleType>
|
||||||
|
<s:simpleType name="CheckSumMethod">
|
||||||
|
<s:restriction base="s:string">
|
||||||
|
<s:enumeration value="None" />
|
||||||
|
<s:enumeration value="Modulo10" />
|
||||||
|
</s:restriction>
|
||||||
|
</s:simpleType>
|
||||||
|
<s:simpleType name="ShowTextPosition">
|
||||||
|
<s:restriction base="s:string">
|
||||||
|
<s:enumeration value="TopLeft" />
|
||||||
|
<s:enumeration value="TopRight" />
|
||||||
|
<s:enumeration value="TopCenter" />
|
||||||
|
<s:enumeration value="BottomLeft" />
|
||||||
|
<s:enumeration value="BottomRight" />
|
||||||
|
<s:enumeration value="BottomCenter" />
|
||||||
|
</s:restriction>
|
||||||
|
</s:simpleType>
|
||||||
|
<s:simpleType name="ImageFormats">
|
||||||
|
<s:restriction base="s:string">
|
||||||
|
<s:enumeration value="BMP" />
|
||||||
|
<s:enumeration value="EMF" />
|
||||||
|
<s:enumeration value="EXIF" />
|
||||||
|
<s:enumeration value="GIF" />
|
||||||
|
<s:enumeration value="ICON" />
|
||||||
|
<s:enumeration value="JPEG" />
|
||||||
|
<s:enumeration value="MemoryBMP" />
|
||||||
|
<s:enumeration value="PNG" />
|
||||||
|
<s:enumeration value="TIFF" />
|
||||||
|
<s:enumeration value="WMF" />
|
||||||
|
</s:restriction>
|
||||||
|
</s:simpleType>
|
||||||
|
<s:element name="GenerateBarCodeResponse">
|
||||||
|
<s:complexType>
|
||||||
|
<s:sequence>
|
||||||
|
<s:element minOccurs="0" maxOccurs="1" name="GenerateBarCodeResult" type="s:base64Binary" />
|
||||||
|
</s:sequence>
|
||||||
|
</s:complexType>
|
||||||
|
</s:element>
|
||||||
|
</s:schema>
|
||||||
|
</wsdl:types>
|
||||||
|
<wsdl:message name="GenerateBarCodeSoapIn">
|
||||||
|
<wsdl:part name="parameters" element="tns:GenerateBarCode" />
|
||||||
|
</wsdl:message>
|
||||||
|
<wsdl:message name="GenerateBarCodeSoapOut">
|
||||||
|
<wsdl:part name="parameters" element="tns:GenerateBarCodeResponse" />
|
||||||
|
</wsdl:message>
|
||||||
|
<wsdl:portType name="BarCodeSoap">
|
||||||
|
<wsdl:operation name="GenerateBarCode">
|
||||||
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">WebserviceX.NET barcode library that provides the means to create barcodes for printing and display in any internet enabled applications. This web service supports Code 128, Industrial 2 of 5, Interleaved 2 of 5, Code 2 5 Matrix, Code 39, Code 39 Extended, Code 93, Code 93 Extended, Codabar, EAN13, EAN8, MSI, Postnet, Supp2, Supp5, UPC A, UPC E0 and UPC E1 barcode formats. This Barcodes returns byte image. It supports following image format JPEG, GIF, PNG, BMP, EMF, EXIF, ICON, MEMORY BMP, TIFF and WMF.</documentation>
|
||||||
|
<wsdl:input message="tns:GenerateBarCodeSoapIn" />
|
||||||
|
<wsdl:output message="tns:GenerateBarCodeSoapOut" />
|
||||||
|
</wsdl:operation>
|
||||||
|
</wsdl:portType>
|
||||||
|
<wsdl:portType name="BarCodeHttpGet" />
|
||||||
|
<wsdl:portType name="BarCodeHttpPost" />
|
||||||
|
<wsdl:binding name="BarCodeSoap" type="tns:BarCodeSoap">
|
||||||
|
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
|
||||||
|
<wsdl:operation name="GenerateBarCode">
|
||||||
|
<soap:operation soapAction="http://www.webservicex.net/GenerateBarCode" style="document" />
|
||||||
|
<wsdl:input>
|
||||||
|
<soap:body use="literal" />
|
||||||
|
</wsdl:input>
|
||||||
|
<wsdl:output>
|
||||||
|
<soap:body use="literal" />
|
||||||
|
</wsdl:output>
|
||||||
|
</wsdl:operation>
|
||||||
|
</wsdl:binding>
|
||||||
|
<wsdl:binding name="BarCodeHttpGet" type="tns:BarCodeHttpGet">
|
||||||
|
<http:binding verb="GET" />
|
||||||
|
</wsdl:binding>
|
||||||
|
<wsdl:binding name="BarCodeHttpPost" type="tns:BarCodeHttpPost">
|
||||||
|
<http:binding verb="POST" />
|
||||||
|
</wsdl:binding>
|
||||||
|
<wsdl:service name="BarCode">
|
||||||
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Barcode generator</documentation>
|
||||||
|
<wsdl:port name="BarCodeSoap" binding="tns:BarCodeSoap">
|
||||||
|
<soap:address location="http://www.webservicex.net/genericbarcode.asmx" />
|
||||||
|
</wsdl:port>
|
||||||
|
<wsdl:port name="BarCodeHttpGet" binding="tns:BarCodeHttpGet">
|
||||||
|
<http:address location="http://www.webservicex.net/genericbarcode.asmx" />
|
||||||
|
</wsdl:port>
|
||||||
|
<wsdl:port name="BarCodeHttpPost" binding="tns:BarCodeHttpPost">
|
||||||
|
<http:address location="http://www.webservicex.net/genericbarcode.asmx" />
|
||||||
|
</wsdl:port>
|
||||||
|
</wsdl:service>
|
||||||
|
</wsdl:definitions>
|
||||||
+16
-16
@@ -1,16 +1,20 @@
|
|||||||
package SOAP::WSDL;
|
package SOAP::WSDL;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
|
use 5.008; # require at least perl 5.8
|
||||||
|
|
||||||
use vars qw($AUTOLOAD);
|
use vars qw($AUTOLOAD);
|
||||||
|
|
||||||
use Carp;
|
use Carp;
|
||||||
use Scalar::Util qw(blessed);
|
use Scalar::Util qw(blessed);
|
||||||
use SOAP::WSDL::Client;
|
use SOAP::WSDL::Client;
|
||||||
use SOAP::WSDL::Expat::WSDLParser;
|
use SOAP::WSDL::Expat::WSDLParser;
|
||||||
use Class::Std;
|
use Class::Std::Fast;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
||||||
use LWP::UserAgent;
|
use LWP::UserAgent;
|
||||||
|
|
||||||
our $VERSION='2.00_17';
|
our $VERSION= '2.00_25';
|
||||||
|
|
||||||
my %no_dispatch_of :ATTR(:name<no_dispatch>);
|
my %no_dispatch_of :ATTR(:name<no_dispatch>);
|
||||||
my %wsdl_of :ATTR(:name<wsdl>);
|
my %wsdl_of :ATTR(:name<wsdl>);
|
||||||
@@ -81,7 +85,7 @@ for my $method (keys %LOOKUP ) {
|
|||||||
|
|
||||||
sub new {
|
sub new {
|
||||||
my ($class, %args_from) = @_;
|
my ($class, %args_from) = @_;
|
||||||
my $self = \do { my $foo = undef };
|
my $self = \do { my $foo = Class::Std::Fast::ID() };
|
||||||
bless $self, $class;
|
bless $self, $class;
|
||||||
for (keys %args_from) {
|
for (keys %args_from) {
|
||||||
my $method = $self->can("set_$_")
|
my $method = $self->can("set_$_")
|
||||||
@@ -116,9 +120,7 @@ sub wsdlinit {
|
|||||||
# sanity checks
|
# sanity checks
|
||||||
my $types = $wsdl_definitions->first_types()
|
my $types = $wsdl_definitions->first_types()
|
||||||
or croak "unable to extract schema from WSDL";
|
or croak "unable to extract schema from WSDL";
|
||||||
my $ns = $wsdl_definitions->get_xmlns()
|
my $ns = $wsdl_definitions->get_xmlns();
|
||||||
or croak "unable to extract XML Namespaces" . $wsdl_definitions->to_string;
|
|
||||||
( %{ $ns } ) or croak "unable to extract XML Namespaces";
|
|
||||||
|
|
||||||
# setup lookup variables
|
# setup lookup variables
|
||||||
$definitions_of{ $ident } = $wsdl_definitions;
|
$definitions_of{ $ident } = $wsdl_definitions;
|
||||||
@@ -153,7 +155,7 @@ sub _wsdl_get_binding :PRIVATE {
|
|||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $ident = ident $self;
|
my $ident = ident $self;
|
||||||
my $wsdl = $definitions_of{ $ident };
|
my $wsdl = $definitions_of{ $ident };
|
||||||
my $port = $port_of{ $ident } || $self->_wsdl_get_port();
|
my $port = $self->_wsdl_get_port();
|
||||||
$binding_of{ $ident } = $wsdl->find_binding( $port->expand( $port->get_binding() ) )
|
$binding_of{ $ident } = $wsdl->find_binding( $port->expand( $port->get_binding() ) )
|
||||||
or croak "no binding found for ", $port->get_binding();
|
or croak "no binding found for ", $port->get_binding();
|
||||||
return $binding_of{ $ident };
|
return $binding_of{ $ident };
|
||||||
@@ -162,7 +164,7 @@ sub _wsdl_get_portType :PRIVATE {
|
|||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $ident = ident $self;
|
my $ident = ident $self;
|
||||||
my $wsdl = $definitions_of{ $ident };
|
my $wsdl = $definitions_of{ $ident };
|
||||||
my $binding = $binding_of{ $ident } || $self->_wsdl_get_binding();
|
my $binding = $self->_wsdl_get_binding();
|
||||||
$porttype_of{ $ident } = $wsdl->find_portType( $binding->expand( $binding->get_type() ) )
|
$porttype_of{ $ident } = $wsdl->find_portType( $binding->expand( $binding->get_type() ) )
|
||||||
or croak "cannot find portType for " . $binding->get_type();
|
or croak "cannot find portType for " . $binding->get_type();
|
||||||
return $porttype_of{ $ident };
|
return $porttype_of{ $ident };
|
||||||
@@ -175,13 +177,11 @@ sub _wsdl_init_methods :PRIVATE {
|
|||||||
|
|
||||||
# get bindings, portType, message, part(s) - use private methods for clear separation...
|
# get bindings, portType, message, part(s) - use private methods for clear separation...
|
||||||
$self->_wsdl_get_service if not ($service_of{ $ident });
|
$self->_wsdl_get_service if not ($service_of{ $ident });
|
||||||
my $binding = $binding_of{ $ident } || $self->_wsdl_get_binding()
|
$self->_wsdl_get_portType();
|
||||||
|| croak "Can't find binding";
|
|
||||||
my $portType = $porttype_of{ $ident } || $self->_wsdl_get_portType();
|
|
||||||
|
|
||||||
$method_info_of{ $ident } = {};
|
$method_info_of{ $ident } = {};
|
||||||
|
|
||||||
foreach my $binding_operation (@{ $binding->get_operation() })
|
foreach my $binding_operation (@{ $binding_of{ $ident }->get_operation() })
|
||||||
{
|
{
|
||||||
my $method = {};
|
my $method = {};
|
||||||
|
|
||||||
@@ -193,7 +193,7 @@ sub _wsdl_init_methods :PRIVATE {
|
|||||||
|
|
||||||
# get parts
|
# get parts
|
||||||
# 1. get operation from port
|
# 1. get operation from port
|
||||||
my $operation = $portType->find_operation( $ns,
|
my $operation = $porttype_of{ $ident }->find_operation( $ns,
|
||||||
$binding_operation->get_name() );
|
$binding_operation->get_name() );
|
||||||
|
|
||||||
# 2. get input message name
|
# 2. get input message name
|
||||||
@@ -236,7 +236,7 @@ sub _wsdl_init_methods :PRIVATE {
|
|||||||
|
|
||||||
sub call {
|
sub call {
|
||||||
my ($self, $method, @data_from) = @_;
|
my ($self, $method, @data_from) = @_;
|
||||||
my $ident = ident $self;
|
my $ident = ${ $self };
|
||||||
|
|
||||||
my ($data, $header) = ref $data_from[0]
|
my ($data, $header) = ref $data_from[0]
|
||||||
? ($data_from[0], $data_from[1] )
|
? ($data_from[0], $data_from[1] )
|
||||||
@@ -730,9 +730,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 391 $
|
$Rev: 427 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: WSDL.pm 391 2007-11-17 21:56:13Z kutterma $
|
$Id: WSDL.pm 427 2007-12-02 22:20:24Z kutterma $
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
+7
-10
@@ -1,11 +1,11 @@
|
|||||||
package SOAP::WSDL::Base;
|
package SOAP::WSDL::Base;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use List::Util qw(first);
|
use List::Util qw(first);
|
||||||
use Carp qw(croak carp confess);
|
use Carp qw(croak carp confess);
|
||||||
|
|
||||||
our $VERSION='2.00_17';
|
our $VERSION='2.00_25';
|
||||||
|
|
||||||
my %id_of :ATTR(:name<id> :default<()>);
|
my %id_of :ATTR(:name<id> :default<()>);
|
||||||
my %name_of :ATTR(:name<name> :default<()>);
|
my %name_of :ATTR(:name<name> :default<()>);
|
||||||
@@ -91,13 +91,8 @@ sub init {
|
|||||||
{
|
{
|
||||||
croak @args if (not defined ($value->{ Name }));
|
croak @args if (not defined ($value->{ Name }));
|
||||||
if ($value->{ Name } =~m{^xmlns\:}xms) {
|
if ($value->{ Name } =~m{^xmlns\:}xms) {
|
||||||
croak $xmlns_of{ ident $self }
|
|
||||||
if ref $xmlns_of{ ident $self } ne 'HASH';
|
|
||||||
|
|
||||||
# add namespaces
|
# add namespaces
|
||||||
$xmlns_of{ ident $self }->{ $value->{ Value } } =
|
$xmlns_of{ ident $self }->{ $value->{ LocalName } } = $value->{ Value };
|
||||||
$value->{ LocalName };
|
|
||||||
|
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
elsif ($value->{ Name } =~m{^xmlns$}xms) {
|
elsif ($value->{ Name } =~m{^xmlns$}xms) {
|
||||||
@@ -116,13 +111,15 @@ sub init {
|
|||||||
sub expand {
|
sub expand {
|
||||||
my ($self, , $qname) = @_;
|
my ($self, , $qname) = @_;
|
||||||
my ($prefix, $localname) = split /:/x, $qname;
|
my ($prefix, $localname) = split /:/x, $qname;
|
||||||
my %ns_map = reverse %{ $self->get_xmlns() };
|
# my %ns_map = reverse %{ $self->get_xmlns() };
|
||||||
|
my %ns_map = %{ $self->get_xmlns() };
|
||||||
return ($ns_map{ $prefix }, $localname) if ($ns_map{ $prefix });
|
return ($ns_map{ $prefix }, $localname) if ($ns_map{ $prefix });
|
||||||
|
|
||||||
if (my $parent = $self->get_parent()) {
|
if (my $parent = $self->get_parent()) {
|
||||||
return $parent->expand($qname);
|
return $parent->expand($qname);
|
||||||
}
|
}
|
||||||
confess "unbound prefix $prefix found for $prefix:$localname";
|
confess "unbound prefix $prefix found for $prefix:$localname. Bound prefixes are"
|
||||||
|
. join(', ', keys %ns_map);
|
||||||
}
|
}
|
||||||
sub _expand;
|
sub _expand;
|
||||||
*_expand = \&expand;
|
*_expand = \&expand;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::Binding;
|
package SOAP::WSDL::Binding;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use List::Util qw(first);
|
use List::Util qw(first);
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use Carp;
|
use Carp;
|
||||||
|
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use Scalar::Util qw(blessed);
|
use Scalar::Util qw(blessed);
|
||||||
|
|
||||||
use SOAP::WSDL::Factory::Deserializer;
|
use SOAP::WSDL::Factory::Deserializer;
|
||||||
@@ -11,7 +11,7 @@ use SOAP::WSDL::Factory::Serializer;
|
|||||||
use SOAP::WSDL::Factory::Transport;
|
use SOAP::WSDL::Factory::Transport;
|
||||||
use SOAP::WSDL::Expat::MessageParser;
|
use SOAP::WSDL::Expat::MessageParser;
|
||||||
|
|
||||||
our $VERSION = '2.00_17';
|
our $VERSION = '2.00_25';
|
||||||
|
|
||||||
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
|
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
|
||||||
my %no_dispatch_of :ATTR(:name<no_dispatch> :default<()>);
|
my %no_dispatch_of :ATTR(:name<no_dispatch> :default<()>);
|
||||||
@@ -42,7 +42,7 @@ sub get_proxy { ## no critic RequireArgUnpacking
|
|||||||
|
|
||||||
sub set_proxy {
|
sub set_proxy {
|
||||||
my ($self, @args_from) = @_;
|
my ($self, @args_from) = @_;
|
||||||
my $ident = ident $self;
|
my $ident = ${ $self };
|
||||||
|
|
||||||
# remember old value to return it later - Class::Std does so, too
|
# remember old value to return it later - Class::Std does so, too
|
||||||
my $old_value = $transport_of{ $ident };
|
my $old_value = $transport_of{ $ident };
|
||||||
@@ -371,9 +371,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 391 $
|
$Rev: 427 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: Client.pm 391 2007-11-17 21:56:13Z kutterma $
|
$Id: Client.pm 427 2007-12-02 22:20:24Z kutterma $
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ use warnings;
|
|||||||
use base 'SOAP::WSDL::Client';
|
use base 'SOAP::WSDL::Client';
|
||||||
use Scalar::Util qw(blessed);
|
use Scalar::Util qw(blessed);
|
||||||
|
|
||||||
our $VERSION = '2.00_24';
|
our $VERSION = '2.00_25';
|
||||||
|
|
||||||
sub call {
|
sub call {
|
||||||
my ($self, $method, $body, $header) = @_;
|
my ($self, $method, $body, $header) = @_;
|
||||||
@@ -26,38 +26,38 @@ sub call {
|
|||||||
return $self->SUPER::call($method, $body, $header);
|
return $self->SUPER::call($method, $body, $header);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub __create_methods {
|
#sub __create_methods {
|
||||||
my ($package, %info_of) = @_;
|
# my ($package, %info_of) = @_;
|
||||||
|
#
|
||||||
no strict qw(refs);
|
# no strict qw(refs);
|
||||||
no warnings qw(redefine);
|
# no warnings qw(redefine);
|
||||||
for my $method (keys %info_of){
|
# for my $method (keys %info_of){
|
||||||
my ($soap_action, @parts);
|
# my ($soap_action, @parts);
|
||||||
|
#
|
||||||
# up to 2.00_10 we had list refs...
|
# # up to 2.00_10 we had list refs...
|
||||||
if (ref $info_of{ $method }eq 'HASH') {
|
# if (ref $info_of{ $method }eq 'HASH') {
|
||||||
@parts = @{ $info_of{ $method }->{ parts } };
|
# @parts = @{ $info_of{ $method }->{ parts } };
|
||||||
$soap_action = $info_of{ $method }->{ soap_action };
|
# $soap_action = $info_of{ $method }->{ soap_action };
|
||||||
}
|
# }
|
||||||
else {
|
# else {
|
||||||
die "Pre-v2.00_10 Interfaces are no longer supported. Please re-generate your interface.";
|
# die "Pre-v2.00_10 Interfaces are no longer supported. Please re-generate your interface.";
|
||||||
}
|
# }
|
||||||
|
#
|
||||||
*{ "$package\::$method" } = sub {
|
# *{ "$package\::$method" } = sub {
|
||||||
my $self = shift;
|
# my $self = shift;
|
||||||
my @param = map {
|
# my @param = map {
|
||||||
my $data = shift || {};
|
# my $data = shift || {};
|
||||||
eval "require $_";
|
# eval "require $_";
|
||||||
$_->new( $data );
|
# $_->new( $data );
|
||||||
} @parts;
|
# } @parts;
|
||||||
|
#
|
||||||
return $self->SUPER::call( {
|
# return $self->SUPER::call( {
|
||||||
operation => $method,
|
# operation => $method,
|
||||||
soap_action => $soap_action,
|
# soap_action => $soap_action,
|
||||||
}, @param );
|
# }, @param );
|
||||||
}
|
# }
|
||||||
}
|
# }
|
||||||
}
|
#}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
@@ -94,9 +94,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 391 $
|
$Rev: 427 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: Base.pm 391 2007-11-17 21:56:13Z kutterma $
|
$Id: Base.pm 427 2007-12-02 22:20:24Z kutterma $
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ use Carp;
|
|||||||
use File::Basename;
|
use File::Basename;
|
||||||
use File::Path;
|
use File::Path;
|
||||||
use List::Util qw(first);
|
use List::Util qw(first);
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
our $VERSION='2.00_17';
|
our $VERSION='2.00_25';
|
||||||
|
|
||||||
my %types_of :ATTR(:name<types> :default<[]>);
|
my %types_of :ATTR(:name<types> :default<[]>);
|
||||||
my %message_of :ATTR(:name<message> :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 %service_of :ATTR(:name<service> :default<()>);
|
||||||
my %namespace_of :ATTR(:name<namespace> :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();
|
my %attributes_of :ATTR();
|
||||||
%attributes_of = (
|
%attributes_of = (
|
||||||
binding => \%binding_of,
|
binding => \%binding_of,
|
||||||
@@ -118,9 +118,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 391 $
|
$Rev: 431 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: Definitions.pm 391 2007-11-17 21:56:13Z kutterma $
|
$Id: Definitions.pm 431 2007-12-03 19:39:11Z kutterma $
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Definitions.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Definitions.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
package SOAP::WSDL::Deserializer::Hash;
|
package SOAP::WSDL::Deserializer::Hash;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use SOAP::WSDL::SOAP::Typelib::Fault11;
|
use SOAP::WSDL::SOAP::Typelib::Fault11;
|
||||||
use SOAP::WSDL::Expat::Message2Hash;
|
use SOAP::WSDL::Expat::Message2Hash;
|
||||||
|
|
||||||
use SOAP::WSDL::Factory::Deserializer;
|
use SOAP::WSDL::Factory::Deserializer;
|
||||||
SOAP::WSDL::Factory::Deserializer->register( '1.1', __PACKAGE__ );
|
SOAP::WSDL::Factory::Deserializer->register( '1.1', __PACKAGE__ );
|
||||||
|
|
||||||
our $VERSION='2.00_24';
|
our $VERSION='2.00_25';
|
||||||
|
|
||||||
sub BUILD {
|
sub BUILD {
|
||||||
my ($self, $ident, $args_of_ref) = @_;
|
my ($self, $ident, $args_of_ref) = @_;
|
||||||
@@ -152,9 +152,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 391 $
|
$Rev: 427 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: Hash.pm 391 2007-11-17 21:56:13Z kutterma $
|
$Id: Hash.pm 427 2007-12-02 22:20:24Z kutterma $
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/Hash.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/Hash.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -1,14 +1,16 @@
|
|||||||
package SOAP::WSDL::Deserializer::XSD;
|
package SOAP::WSDL::Deserializer::XSD;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use SOAP::WSDL::SOAP::Typelib::Fault11;
|
use SOAP::WSDL::SOAP::Typelib::Fault11;
|
||||||
use SOAP::WSDL::Expat::MessageParser;
|
use SOAP::WSDL::Expat::MessageParser;
|
||||||
|
|
||||||
our $VERSION='2.00_24';
|
our $VERSION='2.00_25';
|
||||||
|
|
||||||
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
|
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
|
||||||
|
|
||||||
|
my %parser_of :ATTR();
|
||||||
|
|
||||||
sub BUILD {
|
sub BUILD {
|
||||||
my ($self, $ident, $args_of_ref) = @_;
|
my ($self, $ident, $args_of_ref) = @_;
|
||||||
|
|
||||||
@@ -16,16 +18,14 @@ sub BUILD {
|
|||||||
for (keys %{ $args_of_ref }) {
|
for (keys %{ $args_of_ref }) {
|
||||||
delete $args_of_ref->{ $_ } if $_ ne 'class_resolver';
|
delete $args_of_ref->{ $_ } if $_ ne 'class_resolver';
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub deserialize {
|
sub deserialize {
|
||||||
my ($self, $content) = @_;
|
my ($self, $content) = @_;
|
||||||
|
|
||||||
my $parser = SOAP::WSDL::Expat::MessageParser->new({
|
$parser_of{ ${ $self } } ||= SOAP::WSDL::Expat::MessageParser->new();
|
||||||
class_resolver => $class_resolver_of{ ident $self },
|
$parser_of{ ${ $self } }->class_resolver( $class_resolver_of{ ident $self } );
|
||||||
});
|
eval { $parser_of{ ${ $self } }->parse_string( $content ) };
|
||||||
eval { $parser->parse_string( $content ) };
|
|
||||||
if ($@) {
|
if ($@) {
|
||||||
return $self->generate_fault({
|
return $self->generate_fault({
|
||||||
code => 'soap:Server',
|
code => 'soap:Server',
|
||||||
@@ -34,7 +34,7 @@ sub deserialize {
|
|||||||
. "Message was: \n$content"
|
. "Message was: \n$content"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return ( $parser->get_data(), $parser->get_header() );
|
return ( $parser_of{ ${ $self } }->get_data(), $parser_of{ ${ $self } }->get_header() );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub generate_fault {
|
sub generate_fault {
|
||||||
@@ -98,9 +98,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 391 $
|
$Rev: 427 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: XSD.pm 391 2007-11-17 21:56:13Z kutterma $
|
$Id: XSD.pm 427 2007-12-02 22:20:24Z kutterma $
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/XSD.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/XSD.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -2,10 +2,19 @@
|
|||||||
package SOAP::WSDL::Expat::MessageParser;
|
package SOAP::WSDL::Expat::MessageParser;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
use Carp qw(croak confess);
|
||||||
|
|
||||||
|
our $VERSION = q{2.00_25};
|
||||||
|
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin;
|
use SOAP::WSDL::XSD::Typelib::Builtin;
|
||||||
|
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
||||||
|
|
||||||
use base qw(SOAP::WSDL::Expat::Base);
|
use base qw(SOAP::WSDL::Expat::Base);
|
||||||
|
|
||||||
our $VERSION = '2.00_24';
|
require Class::Std::Fast;
|
||||||
|
my $OBJECT_CACHE_REF = Class::Std::Fast::OBJECT_CACHE_REF();
|
||||||
|
|
||||||
|
my %LOADED_OF = ();
|
||||||
|
|
||||||
sub new {
|
sub new {
|
||||||
my ($class, $args) = @_;
|
my ($class, $args) = @_;
|
||||||
@@ -13,16 +22,41 @@ sub new {
|
|||||||
class_resolver => $args->{ class_resolver },
|
class_resolver => $args->{ class_resolver },
|
||||||
strict => exists $args->{ strict } ? $args->{ strict } : 1,
|
strict => exists $args->{ strict } ? $args->{ strict } : 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
bless $self, $class;
|
bless $self, $class;
|
||||||
|
$self->load_classes() if ($args->{ class_resolver });
|
||||||
return $self;
|
return $self;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub class_resolver {
|
sub class_resolver {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
$self->{ class_resolver } = shift if @_;
|
if (@_) {
|
||||||
|
$self->{ class_resolver } = shift;
|
||||||
|
$self->load_classes();
|
||||||
|
}
|
||||||
return $self->{ class_resolver };
|
return $self->{ class_resolver };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub load_classes {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
return if $LOADED_OF{ $self->{ class_resolver } };
|
||||||
|
|
||||||
|
for (values %{ $self->{ class_resolver }->get_typemap }) {
|
||||||
|
no strict qw(refs);
|
||||||
|
my $class = $_;
|
||||||
|
|
||||||
|
# a bad test - do you know a better one?
|
||||||
|
next if $class eq '__SKIP__';
|
||||||
|
next if defined @{ "$class\::ISA"}; # check if namespace exists
|
||||||
|
|
||||||
|
$class =~s{ :: }{/}xmsg;
|
||||||
|
$class .= '.pm';
|
||||||
|
require $class;
|
||||||
|
}
|
||||||
|
$LOADED_OF{ $self->{ class_resolver } } = 1;
|
||||||
|
}
|
||||||
|
|
||||||
sub _initialize {
|
sub _initialize {
|
||||||
my ($self, $parser) = @_;
|
my ($self, $parser) = @_;
|
||||||
$self->{ parser } = $parser;
|
$self->{ parser } = $parser;
|
||||||
@@ -31,13 +65,15 @@ sub _initialize {
|
|||||||
delete $self->{ header };
|
delete $self->{ header };
|
||||||
|
|
||||||
my $characters;
|
my $characters;
|
||||||
#my @characters_from = ();
|
|
||||||
|
# Note: $current MUST be undef - it is used as sentinel
|
||||||
|
# on the object stack via if (! defined $list->[-1])
|
||||||
|
# DON'T set it to anything else !
|
||||||
my $current = undef;
|
my $current = undef;
|
||||||
my $list = []; # node list
|
my $list = []; # node list (object stack)
|
||||||
|
|
||||||
my $path = []; # current path
|
my $path = []; # current path
|
||||||
my $skip = 0; # skip elements
|
my $skip = 0; # skip elements
|
||||||
my $current_part = q{}; # are we in header or body ?
|
|
||||||
|
|
||||||
my $depth = 0;
|
my $depth = 0;
|
||||||
|
|
||||||
my %content_check = $self->{strict}
|
my %content_check = $self->{strict}
|
||||||
@@ -65,28 +101,32 @@ sub _initialize {
|
|||||||
)
|
)
|
||||||
: ();
|
: ();
|
||||||
|
|
||||||
|
# use "globals" for speed
|
||||||
|
my ($_prefix, $_method,
|
||||||
|
$_class, $_leaf) = ();
|
||||||
|
|
||||||
my $char_handler = sub {
|
my $char_handler = sub {
|
||||||
# push @characters_from, $_[1] if $_[1] =~m{ [^s] }xms;
|
return if (!$_leaf); # we only want characters in leaf nodes
|
||||||
$characters .= $_[1] if $_[1] =~m{ [^\s] }xms;
|
|
||||||
|
$characters .= $_[1];
|
||||||
|
# if $_[1] =~m{ [^\s] }xms;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
# use "globals" for speed
|
|
||||||
my ($_prefix, $_method,
|
|
||||||
$_class) = ();
|
|
||||||
|
|
||||||
no strict qw(refs);
|
no strict qw(refs);
|
||||||
$parser->setHandlers(
|
$parser->setHandlers(
|
||||||
Start => sub {
|
Start => sub {
|
||||||
# my ($parser, $element, %_attrs) = @_;
|
# my ($parser, $element, %_attrs) = @_;
|
||||||
# $depth = $parser->depth();
|
|
||||||
|
$_leaf = 1; # believe we're a leaf node until we see an end
|
||||||
|
|
||||||
# call methods without using their parameter stack
|
# call methods without using their parameter stack
|
||||||
# That's slightly faster than $content_check{ $depth }->()
|
# That's slightly faster than $content_check{ $depth }->()
|
||||||
# and we don't have to pass $_[1] to the method.
|
# and we don't have to pass $_[1] to the method.
|
||||||
# Yup, that's dirty.
|
# Yup, that's dirty.
|
||||||
return &{$content_check{ $depth }} if exists $content_check{ $depth };
|
return &{$content_check{ $depth }}
|
||||||
|
if exists $content_check{ $depth };
|
||||||
|
|
||||||
push @{ $path }, $_[1]; # step down in path
|
push @{ $path }, $_[1]; # step down in path
|
||||||
return if $skip; # skip inside __SKIP__
|
return if $skip; # skip inside __SKIP__
|
||||||
@@ -102,31 +142,35 @@ sub _initialize {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
push @$list, $current; # step down in tree (remember current)
|
# step down in tree (remember current)
|
||||||
|
#
|
||||||
|
# on the first object (after skipping Envelope/Body), $current
|
||||||
|
# is undef.
|
||||||
|
# We put it on the stack, anyway, and use it as sentinel when
|
||||||
|
# going through the closing tags in the End handler
|
||||||
|
#
|
||||||
|
push @$list, $current;
|
||||||
|
|
||||||
$characters = q(); # empty characters
|
# cleanup. Mainly here to help profilers find the real hot spots
|
||||||
|
undef $current;
|
||||||
|
|
||||||
# Check whether we have a builtin - we implement them as classes
|
# cleanup
|
||||||
# We could replace this with UNIVERSAL->isa() - but it's slow...
|
$characters = q{};
|
||||||
# match is a bit faster if the string does not match, but WAY slower
|
|
||||||
# if $class matches. We hope to match often...
|
# Create and set new objects using Class::Std::Fast's object cache
|
||||||
if (index $_class, 'SOAP::WSDL::XSD::Typelib::Builtin', 0 < 0) {
|
# if possible, or blessing directly into the class in question
|
||||||
# check wheter there is a non-empty ARRAY reference for $_class::ISA
|
# (circumventing constructor) here.
|
||||||
# or a "new" method
|
# That's dirty, but fast.
|
||||||
# If not, require it - all classes required here MUST
|
#
|
||||||
# define new()
|
# The alternative would read:
|
||||||
# This is not exactly the same as $class->can('new'), but it's way faster
|
# $current = $_class->new({ @_[2..$#_] });
|
||||||
defined *{ "$_class\::new" }{ CODE }
|
#
|
||||||
or scalar @{ *{ "$_class\::ISA" }{ ARRAY } }
|
$current = pop @{ $OBJECT_CACHE_REF->{ $_class } };
|
||||||
or eval "require $_class" ## no critic qw(ProhibitStringyEval)
|
if (not defined $current) {
|
||||||
or die $@;
|
my $o = Class::Std::Fast::ID();
|
||||||
|
$current = bless \$o, $_class;
|
||||||
}
|
}
|
||||||
|
|
||||||
$current = $_class->new({ @_[2..$#_] }); # set new current object
|
|
||||||
|
|
||||||
# remember top level element
|
|
||||||
exists $self->{ data }
|
|
||||||
or ($self->{ data } = $current);
|
|
||||||
$depth++;
|
$depth++;
|
||||||
return;
|
return;
|
||||||
},
|
},
|
||||||
@@ -134,8 +178,10 @@ sub _initialize {
|
|||||||
Char => $char_handler,
|
Char => $char_handler,
|
||||||
|
|
||||||
End => sub {
|
End => sub {
|
||||||
|
|
||||||
pop @{ $path }; # step up in path
|
pop @{ $path }; # step up in path
|
||||||
|
|
||||||
|
# check __SKIP__
|
||||||
if ($skip) {
|
if ($skip) {
|
||||||
return if $skip ne join '/', @{ $path }, $_[1];
|
return if $skip ne join '/', @{ $path }, $_[1];
|
||||||
$skip = 0;
|
$skip = 0;
|
||||||
@@ -145,30 +191,38 @@ sub _initialize {
|
|||||||
|
|
||||||
$depth--;
|
$depth--;
|
||||||
|
|
||||||
# This one easily handles ignores for us, too...
|
# return if there's only one elment - can't set it in parent ;-)
|
||||||
return if not ref $list->[-1];
|
# but set as root element if we don't have one already.
|
||||||
|
if (not defined $list->[-1]) {
|
||||||
|
$self->{ data } = $current if (not exists $self->{ data });
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
# set characters in current if we are a simple type
|
# we only set character values in leaf nodes
|
||||||
# we may have characters in complexTypes with simpleContent,
|
if ($_leaf) {
|
||||||
# too - maybe we should rely on the presence of characters ?
|
# Use dirty but fast access via global variables.
|
||||||
# may get a speedup by defining a ident method in anySimpleType
|
#
|
||||||
# and looking it up via exists &$class::ident;
|
# The normal way (via method) would be this:
|
||||||
# if ( $current->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType') ) {
|
#
|
||||||
# $current->set_value( $characters );
|
# $current->set_value( $characters ) if (length($characters));
|
||||||
# }
|
#
|
||||||
# currently doesn't work, as anyType does not implement value -
|
$SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType::___value
|
||||||
# maybe change ?
|
->{ $$current } = $characters if $characters =~m{ [^\s] }xms;
|
||||||
$current->set_value( $characters ) if (length $characters);
|
}
|
||||||
#$current->set_value( join @characters_from ) if (@characters_from);
|
|
||||||
|
# empty characters
|
||||||
$characters = q{};
|
$characters = q{};
|
||||||
# undef @characters_from;
|
|
||||||
# set appropriate attribute in last element
|
# set appropriate attribute in last element
|
||||||
# multiple values must be implemented in base class
|
# multiple values must be implemented in base class
|
||||||
#$_method = "add_$_localname";
|
# $_method = "add_$_localname";
|
||||||
$_method = "add_$_[1]";
|
$_method = "add_$_[1]";
|
||||||
$list->[-1]->$_method( $current );
|
$list->[-1]->$_method( $current );
|
||||||
|
|
||||||
$current = pop @$list; # step up in object hierarchy...
|
$current = pop @$list; # step up in object hierarchy
|
||||||
|
|
||||||
|
$_leaf = 0; # stop believing we're a leaf node
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -206,7 +260,8 @@ See L<SOAP::WSDL::Manual::Parser> for details.
|
|||||||
Sometimes there's unneccessary information transported in SOAP messages.
|
Sometimes there's unneccessary information transported in SOAP messages.
|
||||||
|
|
||||||
To skip XML nodes (including all child nodes), just edit the type map for
|
To skip XML nodes (including all child nodes), just edit the type map for
|
||||||
the message and set the type map entry to '__SKIP__'.
|
the message, set the type map entry to '__SKIP__', and comment out all
|
||||||
|
child elements you want to skip.
|
||||||
|
|
||||||
=head1 Bugs and Limitations
|
=head1 Bugs and Limitations
|
||||||
|
|
||||||
@@ -220,22 +275,23 @@ the message and set the type map entry to '__SKIP__'.
|
|||||||
|
|
||||||
=back
|
=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
|
=head1 AUTHOR
|
||||||
|
|
||||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
Replace the whitespace by @ for E-Mail Address.
|
||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||||
|
|
||||||
$Rev: 391 $
|
=head1 COPYING
|
||||||
|
|
||||||
|
This module may be used under the same terms as perl itself.
|
||||||
|
|
||||||
|
=head1 Repository information
|
||||||
|
|
||||||
|
$ID: $
|
||||||
|
|
||||||
|
$LastChangedDate: 2007-12-02 23:20:24 +0100 (So, 02 Dez 2007) $
|
||||||
|
$LastChangedRevision: 427 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: MessageParser.pm 391 2007-11-17 21:56:13Z kutterma $
|
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $
|
||||||
|
|
||||||
=cut
|
|
||||||
@@ -5,6 +5,8 @@ use Carp;
|
|||||||
use SOAP::WSDL::TypeLookup;
|
use SOAP::WSDL::TypeLookup;
|
||||||
use base qw(SOAP::WSDL::Expat::Base);
|
use base qw(SOAP::WSDL::Expat::Base);
|
||||||
|
|
||||||
|
our $VERSION = q{2.00_25};
|
||||||
|
|
||||||
sub _initialize {
|
sub _initialize {
|
||||||
my ($self, $parser) = @_;
|
my ($self, $parser) = @_;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Transport;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
our $VERSION='2.00_17';
|
our $VERSION='2.00_25';
|
||||||
|
|
||||||
# class data
|
# class data
|
||||||
my %registered_transport_of = ();
|
my %registered_transport_of = ();
|
||||||
@@ -27,7 +27,7 @@ my %SOAP_WSDL_TRANSPORT_OF = (
|
|||||||
# class methods only
|
# class methods only
|
||||||
sub register {
|
sub register {
|
||||||
my ($class, $scheme, $package) = @_;
|
my ($class, $scheme, $package) = @_;
|
||||||
die "cannot use reference as scheme" if ref $scheme;
|
die "Cannot use reference as scheme" if ref $scheme;
|
||||||
$registered_transport_of{ $scheme } = $package;
|
$registered_transport_of{ $scheme } = $package;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,8 +37,10 @@ sub get_transport {
|
|||||||
$scheme =~s{ \A ([^\:]+) \: .+ }{$1}smx;
|
$scheme =~s{ \A ([^\:]+) \: .+ }{$1}smx;
|
||||||
|
|
||||||
if ($registered_transport_of{ $scheme }) {
|
if ($registered_transport_of{ $scheme }) {
|
||||||
eval "require $registered_transport_of{ $scheme }"
|
no strict qw(refs);
|
||||||
or die "Cannot load transport class $registered_transport_of{ $scheme } : $@";
|
*{ $registered_transport_of{ $scheme } . '::' }{ CODE }
|
||||||
|
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
|
# try "foo::Client" class first - SOAP::Tranport always requires
|
||||||
# a package withoug the ::Client appended, and then
|
# a package withoug the ::Client appended, and then
|
||||||
@@ -68,8 +70,10 @@ sub get_transport {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (exists $SOAP_WSDL_TRANSPORT_OF{ $scheme }) {
|
if (exists $SOAP_WSDL_TRANSPORT_OF{ $scheme }) {
|
||||||
eval "require $SOAP_WSDL_TRANSPORT_OF{ $scheme }"
|
no strict qw(refs);
|
||||||
or die "Cannot load transport class $SOAP_WSDL_TRANSPORT_OF{ $scheme } : $@";
|
*{ $SOAP_WSDL_TRANSPORT_OF{ $scheme } . '::' }{ CODE }
|
||||||
|
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 );
|
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
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 391 $
|
$Rev: 435 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: Transport.pm 391 2007-11-17 21:56:13Z kutterma $
|
$Id: Transport.pm 435 2007-12-03 22:31:00Z kutterma $
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
package SOAP::WSDL::Generator::Template;
|
package SOAP::WSDL::Generator::Template;
|
||||||
use strict;
|
use strict;
|
||||||
use Template;
|
use Template;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
|
|
||||||
our $VERSION='2.00_17';
|
our $VERSION=q{2.00_25};
|
||||||
|
|
||||||
my %tt_of :ATTR(:get<tt>);
|
my %tt_of :ATTR(:get<tt>);
|
||||||
my %definitions_of :ATTR(:name<definitions> :default<()>);
|
my %definitions_of :ATTR(:name<definitions> :default<()>);
|
||||||
|
my %server_prefix_of :ATTR(:name<server_prefix> :default<MyServer>);
|
||||||
my %interface_prefix_of :ATTR(:name<interface_prefix> :default<MyInterfaces>);
|
my %interface_prefix_of :ATTR(:name<interface_prefix> :default<MyInterfaces>);
|
||||||
my %typemap_prefix_of :ATTR(:name<typemap_prefix> :default<MyTypemaps>);
|
my %typemap_prefix_of :ATTR(:name<typemap_prefix> :default<MyTypemaps>);
|
||||||
my %type_prefix_of :ATTR(:name<type_prefix> :default<MyTypes>);
|
my %type_prefix_of :ATTR(:name<type_prefix> :default<MyTypes>);
|
||||||
@@ -23,17 +24,21 @@ sub START {
|
|||||||
sub _process :PROTECTED {
|
sub _process :PROTECTED {
|
||||||
my ($self, $template, $arg_ref, $output) = @_;
|
my ($self, $template, $arg_ref, $output) = @_;
|
||||||
my $ident = ident $self;
|
my $ident = ident $self;
|
||||||
my $tt = $tt_of{$ident} ||= Template->new(
|
|
||||||
|
$tt_of{$ident} = Template->new(
|
||||||
DEBUG => 1,
|
DEBUG => 1,
|
||||||
EVAL_PERL => $EVAL_PERL_of{ $ident },
|
EVAL_PERL => $EVAL_PERL_of{ $ident },
|
||||||
RECURSION => $RECURSION_of{ $ident },
|
RECURSION => $RECURSION_of{ $ident },
|
||||||
INCLUDE_PATH => $INCLUDE_PATH_of{ $ident },
|
INCLUDE_PATH => $INCLUDE_PATH_of{ $ident },
|
||||||
OUTPUT_PATH => $OUTPUT_PATH_of{ $ident },
|
OUTPUT_PATH => $OUTPUT_PATH_of{ $ident },
|
||||||
);
|
)
|
||||||
$tt->process( $template,
|
if (not $tt_of{ $ident });
|
||||||
|
|
||||||
|
$tt_of{ $ident }->process( $template,
|
||||||
{
|
{
|
||||||
definitions => $self->get_definitions,
|
definitions => $self->get_definitions,
|
||||||
interface_prefix => $self->get_interface_prefix,
|
interface_prefix => $self->get_interface_prefix,
|
||||||
|
server_prefix => $self->get_server_prefix,
|
||||||
type_prefix => $self->get_type_prefix,
|
type_prefix => $self->get_type_prefix,
|
||||||
typemap_prefix => $self->get_typemap_prefix,
|
typemap_prefix => $self->get_typemap_prefix,
|
||||||
TYPE_PREFIX => $self->get_type_prefix,
|
TYPE_PREFIX => $self->get_type_prefix,
|
||||||
@@ -42,7 +47,7 @@ sub _process :PROTECTED {
|
|||||||
%{ $arg_ref }
|
%{ $arg_ref }
|
||||||
},
|
},
|
||||||
$output)
|
$output)
|
||||||
or die $INCLUDE_PATH_of{ $ident }, '\\', $template, ' ', $tt->error();
|
or die $INCLUDE_PATH_of{ $ident }, '\\', $template, ' ', $tt_of{ $ident }->error();
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
@@ -1,10 +1,12 @@
|
|||||||
package SOAP::WSDL::Generator::Template::XSD;
|
package SOAP::WSDL::Generator::Template::XSD;
|
||||||
use strict;
|
use strict;
|
||||||
use Template;
|
use Template;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use File::Basename;
|
use File::Basename;
|
||||||
use File::Spec;
|
use File::Spec;
|
||||||
|
|
||||||
|
our $VERSION = q{2.00_25};
|
||||||
|
|
||||||
use SOAP::WSDL::Generator::Visitor::Typemap;
|
use SOAP::WSDL::Generator::Visitor::Typemap;
|
||||||
use SOAP::WSDL::Generator::Visitor::Typelib;
|
use SOAP::WSDL::Generator::Visitor::Typelib;
|
||||||
use base qw(SOAP::WSDL::Generator::Template);
|
use base qw(SOAP::WSDL::Generator::Template);
|
||||||
@@ -32,7 +34,7 @@ sub BUILD {
|
|||||||
);
|
);
|
||||||
$dir = File::Spec->catdir($dir, $file, 'XSD');
|
$dir = File::Spec->catdir($dir, $file, 'XSD');
|
||||||
# return path put together...
|
# return path put together...
|
||||||
my $path = File::Spec->catpath( $volume, $dir );
|
my $path = File::Spec->catpath( $volume, $dir , q{});
|
||||||
|
|
||||||
# Fixup path for windows - / works fine, \ does
|
# Fixup path for windows - / works fine, \ does
|
||||||
# not...
|
# not...
|
||||||
@@ -48,7 +50,7 @@ sub generate {
|
|||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $opt = shift;
|
my $opt = shift;
|
||||||
$self->generate_typelib( $opt );
|
$self->generate_typelib( $opt );
|
||||||
$self->generate_interface( $opt );
|
# $self->generate_interface( $opt );
|
||||||
$self->generate_typemap( $opt );
|
$self->generate_typemap( $opt );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,11 +65,42 @@ sub generate_typelib {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub generate_server {
|
||||||
|
my $self = shift;
|
||||||
|
my $ident = ident $self;
|
||||||
|
my $arg_ref = shift;
|
||||||
|
for my $service (@{ $self->get_definitions->get_service }) {
|
||||||
|
for my $port (@{ $service->get_port() }) {
|
||||||
|
# Skip ports without (known) address
|
||||||
|
next if not $port->first_address;
|
||||||
|
next if not $port->first_address->isa('SOAP::WSDL::SOAP::Address');
|
||||||
|
|
||||||
|
my $port_name = $port->get_name;
|
||||||
|
$port_name =~s{ \A .+\. }{}xms;
|
||||||
|
my $output = $arg_ref->{ output }
|
||||||
|
? $arg_ref->{ output }
|
||||||
|
: $self->_generate_filename(
|
||||||
|
$self->get_server_prefix(),
|
||||||
|
$service->get_name(),
|
||||||
|
$port_name,
|
||||||
|
);
|
||||||
|
print "Creating interface class $output\n";
|
||||||
|
|
||||||
|
$self->_process('Server.tt',
|
||||||
|
{
|
||||||
|
service => $service,
|
||||||
|
port => $port,
|
||||||
|
NO_POD => $arg_ref->{ NO_POD } ? 1 : 0 ,
|
||||||
|
},
|
||||||
|
$output, binmode => ':utf8');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sub generate_interface {
|
sub generate_interface {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $ident = ident $self;
|
my $ident = ident $self;
|
||||||
my $arg_ref = shift;
|
my $arg_ref = shift;
|
||||||
my $tt = $self->get_tt();
|
|
||||||
for my $service (@{ $self->get_definitions->get_service }) {
|
for my $service (@{ $self->get_definitions->get_service }) {
|
||||||
for my $port (@{ $service->get_port() }) {
|
for my $port (@{ $service->get_port() }) {
|
||||||
# Skip ports without (known) address
|
# Skip ports without (known) address
|
||||||
@@ -105,7 +138,7 @@ sub generate_typemap {
|
|||||||
typemap => {
|
typemap => {
|
||||||
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
|
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
|
||||||
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
||||||
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN',
|
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
|
||||||
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
%{ $typemap_of{ident $self }},
|
%{ $typemap_of{ident $self }},
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('^.+\.','') %];
|
package [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('^.+\.','') %];
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use Scalar::Util qw(blessed);
|
use Scalar::Util qw(blessed);
|
||||||
use base qw(SOAP::WSDL::Client::Base);
|
use base qw(SOAP::WSDL::Client::Base);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,97 @@
|
|||||||
|
package [% server_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('^.+\.','') %];
|
||||||
|
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 [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]
|
||||||
|
if not [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]->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 = {
|
||||||
|
[% binding = definitions.find_binding( port.expand( port.get_binding ) );
|
||||||
|
FOREACH operation = binding.get_operation;
|
||||||
|
- %]
|
||||||
|
'[% operation.first_operation.get_soapAction %]' => '[% operation.get_name %]',
|
||||||
|
[% END %]
|
||||||
|
};
|
||||||
|
|
||||||
|
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 => '[% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]',
|
||||||
|
dispatch_to => $dispatch_to{ $ident },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
sub handle {
|
||||||
|
$transport_of{ ${ $_[0] } }->handle();
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
[% IF NO_POD; STOP; END %]
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
[% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %] - 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({
|
||||||
|
dispatch_to => 'My::Handler::Class',
|
||||||
|
transport_class => 'SOAP::WSDL::Server::CGI', # optional, default
|
||||||
|
});
|
||||||
|
$server->handle();
|
||||||
|
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP Server handler for the [% service.get_name %] web service
|
||||||
|
located at [% port.first_address.get_location %].
|
||||||
|
|
||||||
|
=head1 SERVICE [% service.get_name %]
|
||||||
|
|
||||||
|
[% service.get_documentation %]
|
||||||
|
|
||||||
|
=head2 Port [% port.get_name %]
|
||||||
|
|
||||||
|
[% port.get_documentation %]
|
||||||
|
|
||||||
|
=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
|
||||||
|
|
||||||
|
[% INCLUDE Server/POD/method_info.tt %]
|
||||||
|
|
||||||
|
[% FOREACH operation = binding.get_operation;
|
||||||
|
%][% INCLUDE Server/POD/Operation.tt %]
|
||||||
|
[% END %]
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %]
|
||||||
|
|
||||||
|
=pod
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
[%
|
||||||
|
message_name = port_op.first_output.get_message();
|
||||||
|
# message_name;
|
||||||
|
|
||||||
|
part_from = definitions.find_message( port_op.first_output.expand( message_name ) ).get_part;
|
||||||
|
FOREACH part = part_from;
|
||||||
|
INCLUDE Server/POD/OutPart.tt(part = part);
|
||||||
|
END;
|
||||||
|
%]
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
=head3 [% operation.get_name %]
|
||||||
|
|
||||||
|
[% type = definitions.find_portType( binding.expand( binding.get_type ) );
|
||||||
|
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
|
||||||
|
port_op.get_documentation %]
|
||||||
|
|
||||||
|
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 %]
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
[% element = definitions.first_types.find_element( part.expand( part.get_element ) );
|
||||||
|
#element.get_name();
|
||||||
|
#element;
|
||||||
|
#STOP;
|
||||||
|
-%]
|
||||||
|
[% 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; %]
|
||||||
|
);
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
Your dispatch_to class has to implement the following methods:
|
||||||
|
|
||||||
|
The examples below serve as copy-and-paste prototypes to use in your
|
||||||
|
class.
|
||||||
@@ -10,6 +10,10 @@ sub get_class {
|
|||||||
return $typemap_1->{ $name };
|
return $typemap_1->{ $name };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub get_typemap {
|
||||||
|
return $typemap_1;
|
||||||
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
{ # BLOCK to scope variables
|
{ # BLOCK to scope variables
|
||||||
[%
|
[%
|
||||||
atomic_types = {};
|
atomic_types = {};
|
||||||
|
|||||||
@@ -8,12 +8,15 @@ element_from = complexType.get_element;
|
|||||||
#
|
#
|
||||||
# Sanity check: All original elements must be noted first
|
# Sanity check: All original elements must be noted first
|
||||||
#
|
#
|
||||||
|
element_list = base_type.get_element;
|
||||||
FOREACH element = base_type.get_element;
|
FOREACH element = base_type.get_element;
|
||||||
IF element_from.${ loop.index }.get_name != element.get_name;
|
IF element_from.${ 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 }";
|
THROW WSDL "${element.get_name} not found at position ${ loop.index } in extension type ${ complexType.get_name }";
|
||||||
END;
|
END;
|
||||||
END;
|
END;
|
||||||
|
|
||||||
|
#complexType.set_element( element_list );
|
||||||
|
|
||||||
-%]
|
-%]
|
||||||
use base qw([% type_prefix %]::[% base_name.1.replace('\.', '::') %]);
|
use base qw([% type_prefix %]::[% base_name.1.replace('\.', '::') %]);
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package SOAP::WSDL::Generator::Visitor;
|
package SOAP::WSDL::Generator::Visitor;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
|
|
||||||
our $VERSION = '2.00_17';
|
our $VERSION = q{2.00_25};
|
||||||
|
|
||||||
my %definitions_of :ATTR(:name<definitions> :default<()>);
|
my %definitions_of :ATTR(:name<definitions> :default<()>);
|
||||||
my %type_prefix_of :ATTR(:name<type_prefix> :default<()>);
|
my %type_prefix_of :ATTR(:name<type_prefix> :default<()>);
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
package SOAP::WSDL::Generator::Visitor::Typemap;
|
package SOAP::WSDL::Generator::Visitor::Typemap;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
|
|
||||||
use base qw(SOAP::WSDL::Generator::Visitor);
|
use base qw(SOAP::WSDL::Generator::Visitor);
|
||||||
|
|
||||||
|
our $VERSION = q{2.00_25};
|
||||||
|
|
||||||
my %path_of :ATTR(:name<path> :default<[]>);
|
my %path_of :ATTR(:name<path> :default<[]>);
|
||||||
my %typemap_of :ATTR(:name<typemap> :default<()>);
|
my %typemap_of :ATTR(:name<typemap> :default<()>);
|
||||||
my %type_prefix_of :ATTR(:name<type_prefix> :default<()>);
|
my %type_prefix_of :ATTR(:name<type_prefix> :default<()>);
|
||||||
@@ -18,6 +20,7 @@ sub START {
|
|||||||
|
|
||||||
sub set_typemap_entry {
|
sub set_typemap_entry {
|
||||||
my ($self, $value) = @_;
|
my ($self, $value) = @_;
|
||||||
|
# warn join( q{/}, @{ $path_of{ ident $self } }) . " => $value";
|
||||||
$typemap_of{ ident $self }->{
|
$typemap_of{ ident $self }->{
|
||||||
join( q{/}, @{ $path_of{ ident $self } } )
|
join( q{/}, @{ $path_of{ ident $self } } )
|
||||||
} = $value;
|
} = $value;
|
||||||
@@ -120,7 +123,7 @@ sub visit_Part {
|
|||||||
# TODO: auto-generate element for RPC bindings
|
# TODO: auto-generate element for RPC bindings
|
||||||
if ( my $type_name = $part->get_type ) {
|
if ( my $type_name = $part->get_type ) {
|
||||||
# FIXME support RPC-style calls
|
# 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)
|
# TODO factor out iterator or replace by lookup (probably better)
|
||||||
@@ -145,16 +148,21 @@ sub process_referenced_type {
|
|||||||
# get type's class name
|
# get type's class name
|
||||||
# Caveat: visits type if it's a referenced type from the
|
# Caveat: visits type if it's a referenced type from the
|
||||||
# a ? b : c operation.
|
# a ? b : c operation.
|
||||||
my $typeclass =
|
my ($type, $typeclass);
|
||||||
( $ns eq 'http://www.w3.org/2001/XMLSchema' )
|
if ( $ns eq 'http://www.w3.org/2001/XMLSchema' ) {
|
||||||
? "SOAP::WSDL::XSD::Typelib::Builtin::$localname"
|
$typeclass = "SOAP::WSDL::XSD::Typelib::Builtin::$localname";
|
||||||
: do {
|
}
|
||||||
my $type =
|
else {
|
||||||
$self->get_definitions()->first_types()->find_type( $ns, $localname );
|
$type = $self->get_definitions()->first_types()->find_type( $ns, $localname );
|
||||||
$type->_accept($self);
|
$typeclass = join( q{::}, $type_prefix_of{$ident}, $type->get_name() );
|
||||||
join( q{::}, $type_prefix_of{$ident}, $type->get_name() );
|
}
|
||||||
};
|
|
||||||
|
|
||||||
|
# set before to allow it to be used from inside _accept
|
||||||
|
$self->set_typemap_entry($typeclass);
|
||||||
|
|
||||||
|
$type->_accept($self) if ($type);
|
||||||
|
|
||||||
|
# set afterwards again (just to be sure...)
|
||||||
$self->set_typemap_entry($typeclass);
|
$self->set_typemap_entry($typeclass);
|
||||||
return $self;
|
return $self;
|
||||||
}
|
}
|
||||||
@@ -171,8 +179,10 @@ sub process_atomic_type {
|
|||||||
sub visit_XSD_Element {
|
sub visit_XSD_Element {
|
||||||
my ( $self, $ident, $element ) = ( $_[0], ident $_[0], $_[1] );
|
my ( $self, $ident, $element ) = ( $_[0], ident $_[0], $_[1] );
|
||||||
|
|
||||||
# TODO: what about element ref="" ?
|
# warn "simpleType " . $element->get_name();
|
||||||
# when we're hopping from one element to the next one...
|
my @path = @{ $path_of{ ${ $self } } };
|
||||||
|
my $path = join '/', @path;
|
||||||
|
my $parent = $typemap_of{ ${ $self } }->{ $path };
|
||||||
|
|
||||||
# step down in tree
|
# step down in tree
|
||||||
$self->add_element_path( $element );
|
$self->add_element_path( $element );
|
||||||
@@ -181,25 +191,43 @@ sub visit_XSD_Element {
|
|||||||
# They all just return if no argument is given,
|
# They all just return if no argument is given,
|
||||||
# and return $self on success.
|
# and return $self on success.
|
||||||
SWITCH: {
|
SWITCH: {
|
||||||
if ($element->get_type) {
|
if ($element->get_type) {
|
||||||
$self->process_referenced_type( $element->expand( $element->get_type() ) )
|
$self->process_referenced_type( $element->expand( $element->get_type() ) )
|
||||||
&& last;
|
&& last;
|
||||||
}
|
}
|
||||||
# for atomic simple and comples types , and ref elements
|
|
||||||
|
# atomic simpleType typemap rule:
|
||||||
|
# if we have a parent, use parent's sub-package.
|
||||||
|
# if not, use element package.
|
||||||
|
if ($element->get_simpleType()) {
|
||||||
|
# warn "simpleType " . $element->get_name();
|
||||||
|
my @path = @{ $path_of{ ${ $self } } };
|
||||||
|
my $typeclass = defined ($parent)
|
||||||
|
? join '::_', $parent , $element->get_name()
|
||||||
|
: join q{::}, $element_prefix_of{$ident}, $element->get_name();
|
||||||
|
$self->set_typemap_entry($typeclass);
|
||||||
|
last SWITCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
# for atomic and complex types , and ref elements
|
||||||
my $typeclass = join q{::}, $element_prefix_of{$ident}, $element->get_name();
|
my $typeclass = join q{::}, $element_prefix_of{$ident}, $element->get_name();
|
||||||
|
|
||||||
$self->set_typemap_entry($typeclass);
|
$self->set_typemap_entry($typeclass);
|
||||||
|
|
||||||
# kind of double-dispatch: returns true on success, but does nothing
|
|
||||||
$self->process_atomic_type( $element->first_simpleType() )
|
|
||||||
&& last;
|
|
||||||
|
|
||||||
$self->process_atomic_type( $element->first_complexType()
|
$self->process_atomic_type( $element->first_complexType()
|
||||||
, sub { $_[1]->_accept($_[0]) } )
|
, sub { $_[1]->_accept($_[0]) } )
|
||||||
&& last;
|
&& last;
|
||||||
|
|
||||||
# TODO: add element ref handling
|
# TODO: add element ref handling
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Safety measure. If someone defines a top-level element with
|
||||||
|
# a normal (not atomic) type, we just override it here
|
||||||
|
if (not defined($parent)) {
|
||||||
|
# for atomic and complex types , and ref elements
|
||||||
|
my $typeclass = join q{::}, $element_prefix_of{$ident}, $element->get_name();
|
||||||
|
$self->set_typemap_entry($typeclass);
|
||||||
|
}
|
||||||
|
|
||||||
# step up in hierarchy
|
# step up in hierarchy
|
||||||
pop @{ $path_of{$ident} };
|
pop @{ $path_of{$ident} };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::Message;
|
package SOAP::WSDL::Message;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
my %part_of :ATTR(:name<part> :default<[]>);
|
my %part_of :ATTR(:name<part> :default<[]>);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::OpMessage;
|
package SOAP::WSDL::OpMessage;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
my %body_of :ATTR(:name<body> :default<[]>);
|
my %body_of :ATTR(:name<body> :default<[]>);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::Operation;
|
package SOAP::WSDL::Operation;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
my %operation_of :ATTR(:name<operation> :default<()>);
|
my %operation_of :ATTR(:name<operation> :default<()>);
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package SOAP::WSDL::Part;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Carp qw(croak);
|
use Carp qw(croak);
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
|
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ sub serialize
|
|||||||
my $data = shift;
|
my $data = shift;
|
||||||
my $opt = shift;
|
my $opt = shift;
|
||||||
my $typelib = $opt->{ typelib } || die "No typelib";
|
my $typelib = $opt->{ typelib } || die "No typelib";
|
||||||
my %ns_map = reverse %{ $opt->{ namespace } };
|
my %ns_map = %{ $opt->{ namespace } };
|
||||||
|
|
||||||
my $item_name;
|
my $item_name;
|
||||||
if ($item_name = $self->get_type() ) {
|
if ($item_name = $self->get_type() ) {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::Port;
|
package SOAP::WSDL::Port;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
my %binding_of :ATTR(:name<binding> :default<()>);
|
my %binding_of :ATTR(:name<binding> :default<()>);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::PortType;
|
package SOAP::WSDL::PortType;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
my %operation_of :ATTR(:name<operation> :default<()>);
|
my %operation_of :ATTR(:name<operation> :default<()>);
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
package SOAP::WSDL::SOAP::Address;
|
package SOAP::WSDL::SOAP::Address;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
use Class::Std::Fast::Storable;
|
||||||
|
|
||||||
my %location :ATTR(:name<location> :default<()>);
|
my %location :ATTR(:name<location> :default<()>);
|
||||||
1;
|
1;
|
||||||
@@ -2,7 +2,7 @@ package SOAP::WSDL::SOAP::Body;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
use Class::Std::Fast::Storable;
|
||||||
my %use_of :ATTR(:name<use> :default<q{}>);
|
my %use_of :ATTR(:name<use> :default<q{}>);
|
||||||
my %namespace_of :ATTR(:name<namespace> :default<q{}>);
|
my %namespace_of :ATTR(:name<namespace> :default<q{}>);
|
||||||
my %encodingStyle_of :ATTR(:name<encodingStyle> :default<q{}>);
|
my %encodingStyle_of :ATTR(:name<encodingStyle> :default<q{}>);
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package SOAP::WSDL::SOAP::Header;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
use Class::Std::Fast::Storable;
|
||||||
my %use_of :ATTR(:name<use> :default<q{}>);
|
my %use_of :ATTR(:name<use> :default<q{}>);
|
||||||
my %namespace_of :ATTR(:name<namespace> :default<q{}>);
|
my %namespace_of :ATTR(:name<namespace> :default<q{}>);
|
||||||
my %encodingStyle_of :ATTR(:name<encodingStyle> :default<q{}>);
|
my %encodingStyle_of :ATTR(:name<encodingStyle> :default<q{}>);
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
package SOAP::WSDL::SOAP::Operation;
|
package SOAP::WSDL::SOAP::Operation;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
our $VERSION='2.00_17';
|
our $VERSION=q{2.00_25};
|
||||||
|
|
||||||
my %style_of :ATTR(:name<style> :default<()>);
|
my %style_of :ATTR(:name<style> :default<()>);
|
||||||
my %soapAction_of :ATTR(:name<soapAction> :default<()>);
|
my %soapAction_of :ATTR(:name<soapAction> :default<()>);
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package SOAP::WSDL::SOAP::Typelib::Fault11;
|
package SOAP::WSDL::SOAP::Typelib::Fault11;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
|
||||||
our $VERSION='2.00_17';
|
our $VERSION=q{2.00_25};
|
||||||
|
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
use SOAP::WSDL::XSD::Typelib::Element;
|
||||||
@@ -45,7 +45,7 @@ __PACKAGE__->__set_ref('');
|
|||||||
# always return false in boolean context - a fault is never true...
|
# always return false in boolean context - a fault is never true...
|
||||||
sub as_bool : BOOLIFY { return; }
|
sub as_bool : BOOLIFY { return; }
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
1;
|
1;
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
@@ -101,9 +101,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 391 $
|
$Rev: 427 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: Fault11.pm 391 2007-11-17 21:56:13Z kutterma $
|
$Id: Fault11.pm 427 2007-12-02 22:20:24Z kutterma $
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
package SOAP::WSDL::Serializer::XSD;
|
package SOAP::WSDL::Serializer::XSD;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
|
|
||||||
our $VERSION='2.00_24';
|
our $VERSION=q{2.00_25};
|
||||||
|
|
||||||
my $SOAP_NS = 'http://schemas.xmlsoap.org/soap/envelope/';
|
my $SOAP_NS = 'http://schemas.xmlsoap.org/soap/envelope/';
|
||||||
my $XML_INSTANCE_NS = 'http://www.w3.org/2001/XMLSchema-instance';
|
my $XML_INSTANCE_NS = 'http://www.w3.org/2001/XMLSchema-instance';
|
||||||
@@ -113,9 +113,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 391 $
|
$Rev: 427 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: XSD.pm 391 2007-11-17 21:56:13Z kutterma $
|
$Id: XSD.pm 427 2007-12-02 22:20:24Z kutterma $
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Serializer/XSD.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Serializer/XSD.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -0,0 +1,181 @@
|
|||||||
|
package SOAP::WSDL::Server;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable;
|
||||||
|
use Scalar::Util qw(blessed);
|
||||||
|
use SOAP::WSDL::Factory::Deserializer;
|
||||||
|
use SOAP::WSDL::Factory::Serializer;
|
||||||
|
|
||||||
|
our $VERSION = q{2.00_25};
|
||||||
|
|
||||||
|
my %dispatch_to_of :ATTR(:name<dispatch_to> :default<()>);
|
||||||
|
my %action_map_ref_of :ATTR(:name<action_map_ref> :default<{}>);
|
||||||
|
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
|
||||||
|
my %deserializer_of :ATTR(:name<deserializer> :default<()>);
|
||||||
|
my %serializer_of :ATTR(:name<serializer> :default<()>);
|
||||||
|
|
||||||
|
sub handle {
|
||||||
|
my $self = shift;
|
||||||
|
my $ident = ident $self;
|
||||||
|
# this involves copying the request...
|
||||||
|
my $request = shift; # once
|
||||||
|
|
||||||
|
# we only support 1.1 now...
|
||||||
|
$deserializer_of{ $ident } ||= SOAP::WSDL::Factory::Deserializer->get_deserializer({
|
||||||
|
soap_version => '1.1'
|
||||||
|
});
|
||||||
|
$serializer_of{ $ident } ||= SOAP::WSDL::Factory::Serializer->get_serializer({
|
||||||
|
soap_version => '1.1'
|
||||||
|
});
|
||||||
|
|
||||||
|
# TODO: factor out dispatcher logic into dispatcher factory + dispatcher
|
||||||
|
# classes
|
||||||
|
# $dispatcher_of{ $ident } ||= SOAP::WSDL::Factory::Dispatcher->get_dispatcher({});
|
||||||
|
|
||||||
|
# set class resolver if deserializer supports it
|
||||||
|
$deserializer_of{ $ident }->set_class_resolver( $class_resolver_of{ $ident } )
|
||||||
|
if ( $deserializer_of{ $ident }->can('set_class_resolver') );
|
||||||
|
|
||||||
|
# Try deserializing response
|
||||||
|
my ($body, $header) = eval {
|
||||||
|
$deserializer_of{ $ident }->deserialize( $request->content() );
|
||||||
|
};
|
||||||
|
if ($@) {
|
||||||
|
die $deserializer_of{ $ident }->generate_fault({
|
||||||
|
code => 'soap:Server',
|
||||||
|
role => 'urn:localhost',
|
||||||
|
message => "Error deserializing message: $@. \n"
|
||||||
|
});
|
||||||
|
};
|
||||||
|
if (blessed($body) && $body->isa('SOAP::WSDL::SOAP::Typelib::Fault11')) {
|
||||||
|
die $body;
|
||||||
|
}
|
||||||
|
|
||||||
|
# lookup method name by SOAPAction
|
||||||
|
my $soap_action = $request->header('SOAPAction');
|
||||||
|
$soap_action = '' if not defined $soap_action;
|
||||||
|
$soap_action =~s{ \A(?:"|')(.+)(?:"|') \z }{$1}xms;
|
||||||
|
my $method_name = $action_map_ref_of{ $ident }->{ $soap_action };
|
||||||
|
|
||||||
|
# $dispatcher_of{ $ident }->dispatch({
|
||||||
|
# soap_action => $soap_action,
|
||||||
|
# request_body => $body,
|
||||||
|
# request_header => $header,
|
||||||
|
# });
|
||||||
|
|
||||||
|
if (!$dispatch_to_of{ $ident }) {
|
||||||
|
die $deserializer_of{ $ident }->generate_fault({
|
||||||
|
code => 'soap:Server',
|
||||||
|
role => 'urn:localhost',
|
||||||
|
message => "No handler registered",
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
if (! defined $request->header('SOAPAction') ) {
|
||||||
|
die $deserializer_of{ $ident }->generate_fault({
|
||||||
|
code => 'soap:Server',
|
||||||
|
role => 'urn:localhost',
|
||||||
|
message => "Not found: No SOAPAction given",
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
if (! defined $method_name) {
|
||||||
|
die $deserializer_of{ $ident }->generate_fault({
|
||||||
|
code => 'soap:Server',
|
||||||
|
role => 'urn:localhost',
|
||||||
|
message => "Not found: No method found for the SOAPAction '$soap_action'",
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
# find method in handling class/object
|
||||||
|
my $method_ref = $dispatch_to_of{ $ident }->can($method_name);
|
||||||
|
|
||||||
|
if (!$method_ref) {
|
||||||
|
die $deserializer_of{ $ident }->generate_fault({
|
||||||
|
code => 'soap:Server',
|
||||||
|
role => 'urn:localhost',
|
||||||
|
message => "Not implemented: The handler does not implement the method $method_name",
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
my ($response_body, $response_header) = $method_ref->($dispatch_to_of{ $ident }, $body, $header );
|
||||||
|
|
||||||
|
return $serializer_of{ $ident }->serialize({
|
||||||
|
body => $response_body,
|
||||||
|
header => $response_header,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SOAP::WSDL::Server - WSDL based SOAP server base class
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
Don't use directly, use the SOAP::WSDL::Server::* subclasses
|
||||||
|
instead.
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP::WSDL::Server basically follows the architecture sketched below
|
||||||
|
(though dispatcher classes are not implemented yet)
|
||||||
|
|
||||||
|
SOAP Request SOAP Response
|
||||||
|
| ^
|
||||||
|
V |
|
||||||
|
------------------------------------------
|
||||||
|
| SOAP::WSDL::Server |
|
||||||
|
| -------------------------------------- |
|
||||||
|
| | Transport Class | |
|
||||||
|
| |--------------------------------------| |
|
||||||
|
| | Deserializer | Serializer | |
|
||||||
|
| |--------------------------------------| |
|
||||||
|
| | Dispatcher | |
|
||||||
|
| -------------------------------------- |
|
||||||
|
------------------------------------------
|
||||||
|
| calls ^
|
||||||
|
v | returns
|
||||||
|
-------------------------------------
|
||||||
|
| Handler |
|
||||||
|
-------------------------------------
|
||||||
|
|
||||||
|
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
|
||||||
|
currently part of SOAP::WSDL::Server, which aggregates serializer and
|
||||||
|
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
|
||||||
|
comply to the WS-I basic profile, which declares the SOAPAction as optional.
|
||||||
|
|
||||||
|
The final dispatcher will be based on wire signatures (i.e. the classes
|
||||||
|
of the deserialized messages).
|
||||||
|
|
||||||
|
A hash-based dispatcher could be implemented by examining the top level
|
||||||
|
hash keys.
|
||||||
|
|
||||||
|
=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: 391 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: Client.pm 391 2007-11-17 21:56:13Z kutterma $
|
||||||
|
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
|
||||||
|
|
||||||
|
=cut
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
package SOAP::WSDL::Server::CGI;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use HTTP::Request;
|
||||||
|
use HTTP::Response;
|
||||||
|
use HTTP::Status;
|
||||||
|
use HTTP::Headers;
|
||||||
|
use Scalar::Util qw(blessed);
|
||||||
|
|
||||||
|
use Class::Std::Fast::Storable;
|
||||||
|
|
||||||
|
use base qw(SOAP::WSDL::Server);
|
||||||
|
|
||||||
|
our $VERSION=q{2.00_26};
|
||||||
|
|
||||||
|
# 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
|
||||||
|
# in.
|
||||||
|
|
||||||
|
sub handle {
|
||||||
|
my $self = shift;
|
||||||
|
my $response;
|
||||||
|
my $length = $ENV{'CONTENT_LENGTH'} || 0;
|
||||||
|
|
||||||
|
if (!$length) {
|
||||||
|
$response = HTTP::Response->new(411); # LENGTH REQUIRED
|
||||||
|
$self->_output($response);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (exists $ENV{EXPECT} && $ENV{EXPECT} =~ /\b100-Continue\b/i) {
|
||||||
|
print "HTTP/1.1 100 Continue\r\n\r\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
my $content = q{};
|
||||||
|
my $buffer;
|
||||||
|
binmode(STDIN);
|
||||||
|
while (read(STDIN,$buffer,$length - length($content))) {
|
||||||
|
$content .= $buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $request = HTTP::Request->new(
|
||||||
|
$ENV{'REQUEST_METHOD'} || '' => $ENV{'SCRIPT_NAME'},
|
||||||
|
HTTP::Headers->new(
|
||||||
|
map {
|
||||||
|
(/^HTTP_(.+)/i
|
||||||
|
? ($1=~m/SOAPACTION/)
|
||||||
|
?('SOAPAction')
|
||||||
|
:($1)
|
||||||
|
: $_
|
||||||
|
) => $ENV{$_}
|
||||||
|
} keys %ENV),
|
||||||
|
$content,
|
||||||
|
);
|
||||||
|
|
||||||
|
# we copy the response message around here.
|
||||||
|
# Passing by reference would be much better...
|
||||||
|
my $response_message = eval { $self->SUPER::handle($request) };
|
||||||
|
# caveat: SOAP::WSDL::SOAP::Typelib::Fault11 is false in bool context...
|
||||||
|
if ($@ || blessed $@) {
|
||||||
|
$response = HTTP::Response->new(500);
|
||||||
|
if (blessed $@) {
|
||||||
|
$response->content( $self->get_serializer->serialize({
|
||||||
|
body =>$@
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$response->content($@);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$response = HTTP::Response->new(200);
|
||||||
|
$response->header(
|
||||||
|
'Content-type' => 'text/xml; charset="utf-8"'
|
||||||
|
);
|
||||||
|
$response->content( $response_message );
|
||||||
|
{
|
||||||
|
use bytes;
|
||||||
|
$response->header('Content-length', length $response_message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$self->_output($response);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
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'
|
||||||
|
: 'Status:';
|
||||||
|
|
||||||
|
my $code = $response->code;
|
||||||
|
binmode(STDOUT);
|
||||||
|
print STDOUT "$status $code ", HTTP::Status::status_message($code)
|
||||||
|
, "\015\012", $response->headers_as_string("\015\012")
|
||||||
|
, "\015\012", $response->content;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SOAP::WSDL::Server::CGI - CGI based SOAP server
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
=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: 391 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: Client.pm 391 2007-11-17 21:56:13Z kutterma $
|
||||||
|
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
|
||||||
|
|
||||||
|
=cut
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::Service;
|
package SOAP::WSDL::Service;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
my %port_of :ATTR(:name<port> :default<()>);
|
my %port_of :ATTR(:name<port> :default<()>);
|
||||||
|
|||||||
@@ -20,9 +20,10 @@ sub send_receive {
|
|||||||
@parameters{qw(envelope action endpoint encoding content_type)};
|
@parameters{qw(envelope action endpoint encoding content_type)};
|
||||||
|
|
||||||
$encoding = defined($encoding)
|
$encoding = defined($encoding)
|
||||||
? 'utf8'
|
? lc($encoding)
|
||||||
: lc($encoding);
|
: 'utf8';
|
||||||
|
|
||||||
|
$content_type = 'text/xml' if not defined($content_type);
|
||||||
# what's this all about?
|
# what's this all about?
|
||||||
# unfortunately combination of LWP and Perl 5.6.1 and later has bug
|
# unfortunately combination of LWP and Perl 5.6.1 and later has bug
|
||||||
# in sending multibyte characters. LWP uses length() to calculate
|
# in sending multibyte characters. LWP uses length() to calculate
|
||||||
@@ -87,9 +88,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 391 $
|
$Rev: 399 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: HTTP.pm 391 2007-11-17 21:56:13Z kutterma $
|
$Id: HTTP.pm 399 2007-11-19 19:20:52Z kutterma $
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Transport/HTTP.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Transport/HTTP.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
package SOAP::WSDL::Transport::Loopback;
|
package SOAP::WSDL::Transport::Loopback;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable constructor => 'basic';
|
||||||
use SOAP::WSDL::Factory::Transport;
|
use SOAP::WSDL::Factory::Transport;
|
||||||
|
|
||||||
our $VERSION = '2.00_17';
|
our $VERSION=q{2.00_25};
|
||||||
|
|
||||||
SOAP::WSDL::Factory::Transport->register( http => __PACKAGE__ );
|
SOAP::WSDL::Factory::Transport->register( http => __PACKAGE__ );
|
||||||
SOAP::WSDL::Factory::Transport->register( https => __PACKAGE__ );
|
SOAP::WSDL::Factory::Transport->register( https => __PACKAGE__ );
|
||||||
@@ -14,15 +14,6 @@ my %status_of :ATTR(:name<status> :default<()>);
|
|||||||
my %message_of :ATTR(:name<message> :default<()>);
|
my %message_of :ATTR(:name<message> :default<()>);
|
||||||
my %is_success_of :ATTR(:name<is_success> :default<()>);
|
my %is_success_of :ATTR(:name<is_success> :default<()>);
|
||||||
|
|
||||||
{
|
|
||||||
no warnings qw(redefine);
|
|
||||||
|
|
||||||
sub new {
|
|
||||||
my $class = shift;
|
|
||||||
return bless \my ($o), $class;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# create methods normally inherited from SOAP::Client
|
# create methods normally inherited from SOAP::Client
|
||||||
SUBFACTORY: {
|
SUBFACTORY: {
|
||||||
no strict qw(refs);
|
no strict qw(refs);
|
||||||
@@ -36,6 +27,9 @@ sub send_receive {
|
|||||||
return $parameters{envelope};
|
return $parameters{envelope};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
=head1 NAME
|
=head1 NAME
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
package SOAP::WSDL::Transport::Test;
|
package SOAP::WSDL::Transport::Test;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use SOAP::WSDL::Factory::Transport;
|
use SOAP::WSDL::Factory::Transport;
|
||||||
|
|
||||||
our $VERSION = '2.00_14';
|
our $VERSION=q{2.00_25};
|
||||||
|
|
||||||
SOAP::WSDL::Factory::Transport->register( http => __PACKAGE__ );
|
SOAP::WSDL::Factory::Transport->register( http => __PACKAGE__ );
|
||||||
SOAP::WSDL::Factory::Transport->register( https => __PACKAGE__ );
|
SOAP::WSDL::Factory::Transport->register( https => __PACKAGE__ );
|
||||||
|
|||||||
@@ -2,10 +2,9 @@ package SOAP::WSDL::Types;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use SOAP::WSDL::XSD::Schema::Builtin;
|
use SOAP::WSDL::XSD::Schema::Builtin;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
|
|
||||||
my %schema_of :ATTR(:name<schema> :default<[]>);
|
my %schema_of :ATTR(:name<schema> :default<[]>);
|
||||||
|
|
||||||
sub START {
|
sub START {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::XSD::Builtin;
|
package SOAP::WSDL::XSD::Builtin;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
sub serialize {
|
sub serialize {
|
||||||
@@ -14,7 +14,8 @@ sub serialize {
|
|||||||
$xml .= '<' . join ' ', $name, @{ $opt->{ attributes } };
|
$xml .= '<' . join ' ', $name, @{ $opt->{ attributes } };
|
||||||
if ( $opt->{ autotype }) {
|
if ( $opt->{ autotype }) {
|
||||||
my $ns = $self->get_targetNamespace();
|
my $ns = $self->get_targetNamespace();
|
||||||
my $prefix = $opt->{ namespace }->{ $ns }
|
my %prefix_of = reverse %{ $opt->{ namespace } };
|
||||||
|
my $prefix = $prefix_of{ $ns }
|
||||||
|| die 'No prefix found for namespace '. $ns;
|
|| die 'No prefix found for namespace '. $ns;
|
||||||
$xml .= ' type="' . $prefix . ':'
|
$xml .= ' type="' . $prefix . ':'
|
||||||
. $self->get_name() . '"' if ($self->get_name() );
|
. $self->get_name() . '"' if ($self->get_name() );
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ package SOAP::WSDL::XSD::ComplexType;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Carp;
|
use Carp;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use Scalar::Util qw(blessed);
|
use Scalar::Util qw(blessed);
|
||||||
use base qw/SOAP::WSDL::Base/;
|
use base qw/SOAP::WSDL::Base/;
|
||||||
|
|
||||||
our $VERSION='2.00_17';
|
our $VERSION=q{2.00_25};
|
||||||
|
|
||||||
my %annotation_of :ATTR(:name<annotation> :default<()>);
|
my %annotation_of :ATTR(:name<annotation> :default<()>);
|
||||||
my %element_of :ATTR(:name<element> :default<()>);
|
my %element_of :ATTR(:name<element> :default<()>);
|
||||||
@@ -78,7 +78,9 @@ sub serialize {
|
|||||||
|
|
||||||
if ( $opt->{ autotype }) {
|
if ( $opt->{ autotype }) {
|
||||||
my $ns = $self->get_targetNamespace();
|
my $ns = $self->get_targetNamespace();
|
||||||
my $prefix = $opt->{ namespace }->{ $ns }
|
# reverse namespace by prefix hash
|
||||||
|
my %prefix_of = reverse %{ $opt->{ namespace } };
|
||||||
|
my $prefix = $prefix_of{ $ns }
|
||||||
|| die 'No prefix found for namespace '. $ns;
|
|| die 'No prefix found for namespace '. $ns;
|
||||||
$xml .= join q{}, " type=\"$prefix:", $self->get_name(), '" '
|
$xml .= join q{}, " type=\"$prefix:", $self->get_name(), '" '
|
||||||
if ($self->get_name() );
|
if ($self->get_name() );
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
package SOAP::WSDL::XSD::Element;
|
package SOAP::WSDL::XSD::Element;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
our $VERSION='2.00_22';
|
our $VERSION=q{2.00_25};
|
||||||
|
|
||||||
my %annotation_of :ATTR(:name<annotation> :default<()>);
|
my %annotation_of :ATTR(:name<annotation> :default<()>);
|
||||||
my %simpleType_of :ATTR(:name<simpleType> :default<()>);
|
my %simpleType_of :ATTR(:name<simpleType> :default<()>);
|
||||||
@@ -42,7 +42,7 @@ sub serialize {
|
|||||||
my ($self, $name, $value, $opt) = @_;
|
my ($self, $name, $value, $opt) = @_;
|
||||||
my $type;
|
my $type;
|
||||||
my $typelib = $opt->{ typelib };
|
my $typelib = $opt->{ typelib };
|
||||||
my %ns_map = reverse %{ $opt->{ namespace } };
|
my %ns_map = %{ $opt->{ namespace } };
|
||||||
my $ident = ident $self;
|
my $ident = ident $self;
|
||||||
|
|
||||||
# abstract elements may only be serialized via ref - and then we have a
|
# abstract elements may only be serialized via ref - and then we have a
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
package SOAP::WSDL::XSD::Schema;
|
package SOAP::WSDL::XSD::Schema;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
|
our $VERSION=q{2.00_25};
|
||||||
|
|
||||||
# child elements
|
# child elements
|
||||||
my %type_of :ATTR(:name<type> :default<[]>);
|
my %type_of :ATTR(:name<type> :default<[]>);
|
||||||
my %element_of :ATTR(:name<element> :default<[]>);
|
my %element_of :ATTR(:name<element> :default<[]>);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::XSD::Schema::Builtin;
|
package SOAP::WSDL::XSD::Schema::Builtin;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use SOAP::WSDL::XSD::Schema;
|
use SOAP::WSDL::XSD::Schema;
|
||||||
use SOAP::WSDL::XSD::Builtin;
|
use SOAP::WSDL::XSD::Builtin;
|
||||||
use base qw(SOAP::WSDL::XSD::Schema);
|
use base qw(SOAP::WSDL::XSD::Schema);
|
||||||
@@ -88,9 +88,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 391 $
|
$Rev: 412 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: Builtin.pm 391 2007-11-17 21:56:13Z kutterma $
|
$Id: Builtin.pm 412 2007-11-27 22:57:52Z kutterma $
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Schema/Builtin.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Schema/Builtin.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
package SOAP::WSDL::XSD::SimpleType;
|
package SOAP::WSDL::XSD::SimpleType;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
our $VERSION='2.00_17';
|
our $VERSION=q{2.00_25};
|
||||||
|
|
||||||
my %annotation_of :ATTR(:name<annotation> :default<()>);
|
my %annotation_of :ATTR(:name<annotation> :default<()>);
|
||||||
my %base_of :ATTR(:name<base> :default<()>);
|
my %base_of :ATTR(:name<base> :default<()>);
|
||||||
@@ -84,8 +84,10 @@ sub _serialize_single {
|
|||||||
$xml .= $opt->{ indent } if ($opt->{ readable }); # add indentation
|
$xml .= $opt->{ indent } if ($opt->{ readable }); # add indentation
|
||||||
$xml .= '<' . join ' ', $name, @{ $opt->{ attributes } };
|
$xml .= '<' . join ' ', $name, @{ $opt->{ attributes } };
|
||||||
if ( $opt->{ autotype }) {
|
if ( $opt->{ autotype }) {
|
||||||
|
# reverse namespace by prefix hash
|
||||||
|
my %prefix_of = reverse %{ $opt->{ namespace } };
|
||||||
my $ns = $self->get_targetNamespace();
|
my $ns = $self->get_targetNamespace();
|
||||||
my $prefix = $opt->{ namespace }->{ $ns }
|
my $prefix = $prefix_of{ $ns }
|
||||||
|| die 'No prefix found for namespace '. $ns;
|
|| die 'No prefix found for namespace '. $ns;
|
||||||
$xml .= ' type="' . $prefix . ':' . $self->get_name() .'"';
|
$xml .= ' type="' . $prefix . ':' . $self->get_name() .'"';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin;
|
package SOAP::WSDL::XSD::Typelib::Builtin;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
|
|
||||||
our $VERSION="2.00_17";
|
our $VERSION=q{2.00_25};
|
||||||
|
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::anyType;
|
use SOAP::WSDL::XSD::Typelib::Builtin::anyType;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
||||||
@@ -393,7 +393,7 @@ when calling set_calue, but calls it over and over again...
|
|||||||
|
|
||||||
=item * Thread safety
|
=item * Thread safety
|
||||||
|
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin uses Class::Std::Storable which uses
|
SOAP::WSDL::XSD::Typelib::Builtin uses Class::Std::Fast::Storable which uses
|
||||||
Class::Std. Class::Std is not thread safe, so
|
Class::Std. Class::Std is not thread safe, so
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin is neither.
|
SOAP::WSDL::XSD::Typelib::Builtin is neither.
|
||||||
|
|
||||||
|
|||||||
@@ -1,25 +1,7 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::ENTITY;
|
package SOAP::WSDL::XSD::Typelib::Builtin::ENTITY;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::NCName);
|
||||||
BEGIN {
|
Class::Std::initialize();
|
||||||
use Class::Std::Storable;
|
|
||||||
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::NCName);
|
|
||||||
|
|
||||||
no warnings qw(redefine);
|
|
||||||
no strict qw(refs);
|
|
||||||
|
|
||||||
# Yes, I know it's ugly - but this is the fastest constructor to write
|
|
||||||
# for Class::Std-Style inside out objects..
|
|
||||||
*{ __PACKAGE__ . '::new' } = sub {
|
|
||||||
my $self = bless \do { my $foo } , shift;
|
|
||||||
if (@_) {
|
|
||||||
$self->set_value( $_[0]->{ value } )
|
|
||||||
if exists $_[0]->{ value }
|
|
||||||
}
|
|
||||||
return $self;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::ID;
|
package SOAP::WSDL::XSD::Typelib::Builtin::ID;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
|
||||||
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::NCName);
|
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::NCName);
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::IDREF;
|
package SOAP::WSDL::XSD::Typelib::Builtin::IDREF;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
|
||||||
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::ID);
|
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::ID);
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::IDREFS;
|
package SOAP::WSDL::XSD::Typelib::Builtin::IDREFS;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use base qw(
|
use base qw(
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::list
|
SOAP::WSDL::XSD::Typelib::Builtin::list
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::IDREF);
|
SOAP::WSDL::XSD::Typelib::Builtin::IDREF);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user