Compare commits

...
8 Commits
Author SHA1 Message Date
Martin Kutter 51db446428 import SOAP-WSDL 2.00_32 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_32
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_32.tar.gz
2009-12-12 19:48:24 -08:00
Martin Kutter f0b3bdc201 import SOAP-WSDL 2.00_31 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_31
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_31.tar.gz
2009-12-12 19:48:21 -08:00
Martin Kutter 874251225f import SOAP-WSDL 2.00_29 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_29
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_29.tar.gz
2009-12-12 19:48:17 -08:00
Martin Kutter 2bad767211 import SOAP-WSDL 1.27 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  1.27
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-1.27.tar.gz
2009-12-12 19:48:16 -08:00
Martin Kutter 7ca2154ad6 import SOAP-WSDL 2.00_28 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_28
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_28.tar.gz
2009-12-12 19:48:15 -08:00
Martin Kutter eb096ad88e import SOAP-WSDL 2.00_27 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_27
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_27.tar.gz
2009-12-12 19:48:14 -08:00
Martin Kutter 3cfeebae54 import SOAP-WSDL 2.00_26 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_26
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_26.tar.gz
2009-12-12 19:48:13 -08:00
Martin Kutter a9033164e6 import SOAP-WSDL 2.00_25 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_25
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_25.tar.gz
2009-12-12 19:48:11 -08:00
295 changed files with 10106 additions and 2666 deletions
+45 -46
View File
@@ -1,55 +1,54 @@
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_32',
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, 'URI' => 0,
}, 'XML::Parser::Expat' => 0,
buildrequires => { },
'Class::Std' => q/v0.0.8/, buildrequires => {
'Class::Std::Storable' => 0, 'Class::Std::Fast' => qv(0.0.5),
'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;
+277 -97
View File
@@ -1,4 +1,4 @@
Release notes for SOAP::WSDL 2.00_24 Release notes for SOAP::WSDL 2.00_32
------- -------
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.
@@ -16,17 +16,17 @@ Features:
o Automatically encodes perl data structures as message data o Automatically encodes perl data structures as message data
o Automatically sets HTTP headers right o Automatically sets HTTP headers right
* Efficient documentation * Efficient documentation
o SOAP::WSDL::Manual guides you at getting your work done, not at o SOAP::WSDL::Manual guides you at getting your work done, not at
the module's internals the module's internals
* Thorough test suite * Thorough test suite
o SOAP::WSDL is heavily regression tested, with a test coverage of o SOAP::WSDL is heavily regression tested, with a test coverage of
over 95% (excluding documentation - you wouldn't want to read over 95% (excluding documentation - you wouldn't want to read
through it all). through it all).
* SOAP::Lite like look and feel * SOAP::Lite like look and feel
o Where possible, SOAP::WSDL mimics SOAP::Lite's API to allow easy migrations o Where possible, SOAP::WSDL mimics SOAP::Lite's API to allow easy migrations
* XML schema based class library for creating data objects * XML schema based class library for creating data objects
* High-performance XML parser * High-performance XML parser
* Plugin support. SOAP::WSDL can be extended through plugins in various aspects. * Plugin support. SOAP::WSDL can be extended through plugins in various aspects.
The following plugins are supported: The following plugins are supported:
o Transport plugins via SOAP::WSDL::Factory::Transport o Transport plugins via SOAP::WSDL::Factory::Transport
o Serializer plugins via SOAP::WSDL::Factory::Serializer o Serializer plugins via SOAP::WSDL::Factory::Serializer
@@ -34,15 +34,196 @@ Features:
The following changes have been made: The following changes have been made:
2.00_32
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/).
* [ 1893147 ] Segfault on 2.0.0_31
The following uncategorized improvements have been made:
* changed SOAP::WSDL::XSD::ComplexType's set_/get_flavor methods to
set_/get_variety to reflect the XML standard more closely.
get_flavor is retained for compatibility reasons.
* added initial support for complexType/simpleContent definitions. Right
now, only restriction derivations are supported.
* fixed an error in the generator_test.wsdl
2.00_31 - Feb 11 2007
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1883843 ] Support wsdl:import
* [ 1883863 ] Support xsd:import
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/).
The following uncategorized improvements have been made:
* The WSDL Parser now warns about unsupported WSDL / XML schema elements
* Fixed path handling in t/006_client.t
* Removed useless ms regex flag in SOAP::WSDL::Factory::Transport
* The test suite has been improved
2.00_30 - unreleased
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1875288 ] Support XML attributes (partial)
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/).
* [ 1876435 ] Test on perl-5.10 fails
* #32611 empty complexType structure classes are missing 'use Class::Std::Fast::Storable'
The following uncategorized improvements have been made:
* ComplexType objects now accept { foo => undef } in constructor and handle
it as non-present child element foo.
* Updated test suite
* Updated SOAP::WSDL::Client::Base to correctly handle SOAP calls with
no parameters (empty parts)
* Test on perl-5.10 fails when SOAP::Lite is not installed
2.00_29
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
* #32188: minor bug found and fixed in WSDL generation
* [ 1871175 ] Can't delete attributes from ComplexType objects
The following uncategorized improvements have been made:
* Updated SOAP::WSDL::Manual::XSD
* Removed pod directives from templates to avoid confusing CPAN's pod
viewer
* Initial (incomplete) XML attribute support
* Updated test suite
2.00_28
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
* #32062: minor doc fixes
* [ 1852988 ] Generated Interface POD is invalid
* [ 1855583 ] t/SOAP/WSDL/XSD/Typelib/ComplexType.t requires Test::Warn
The following uncategorized improvements have been made:
* Updated SOAP::WSDL::Manual::WS_I to reflect new Server modules
2.00_27
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1850793 ] Add a to_hash_ref method
* [ 1844427 ] Support multiple parts in body
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
* [ 1850795 ] attributes referencing types in default namespace throw
* [ 1844458 ] Add warning when generating Interface with multiple parts
* [ 1843841 ] Grammar/typos in Manual.pod
* [ 1843799 ] ./Build test fails due to testcount mismatch not IO::Scalar
* [ 1845077 ] Top level simpleType elements don't serialize correctly
The following uncategorized improvements have been made:
* Fixed serializing complexType elements with no elements to empty element
* Enhanced test suite
* Documentation improvements
2.00_26
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
* [ 1843195 ] t/013_complexType.t still requires Class::Std::Storable
* [ 1843590 ] Tests broken on Cygwin
The following uncategorized improvements have been made:
* Added examples
* Added Content-length header to CGI output
2.00_25
---
WARNING: INCOMPATIBLE CHANGE:
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
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1832998 ] Make interface methods complain when called as class method * [ 1832998 ] Make interface methods complain when called as class method
* [ 1826833 ] listify all XSD type objects when called as @{} * [ 1826833 ] listify all XSD type objects when called as @{}
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
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/). The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
@@ -51,7 +232,7 @@ The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
* [ 1828240 ] POD Defects * [ 1828240 ] POD Defects
* [ 1792348 ] 006_client.t requires SOAP::Lite (again) * [ 1792348 ] 006_client.t requires SOAP::Lite (again)
The following uncategorized improvements have been made: The following uncategorized improvements have been made:
* The test suite has been improved * The test suite has been improved
* Documentation has been improved * Documentation has been improved
@@ -59,161 +240,160 @@ The following uncategorized improvements have been made:
2.00_23 2.00_23
--- ---
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
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1826382 ] nillable elements not serialized as xsi:nil * [ 1826382 ] nillable elements not serialized as xsi:nil
* [ 1826337 ] Second element in complexType gets eaten up * [ 1826337 ] Second element in complexType gets eaten up
* [ 1792348 ] 006_client.t requires SOAP::Lite (again) * [ 1792348 ] 006_client.t requires SOAP::Lite (again)
The following uncategorized improvements have been made: The following uncategorized improvements have been made:
* Test for complexType containing element with atomic simpleType added * Test for complexType containing element with atomic simpleType added
2.00_22 2.00_22
---- ----
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
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1817697 ] Dots in service/port names lead to broken interfaces * [ 1817697 ] Dots in service/port names lead to broken interfaces
* [ 1817699 ] Templates not found on all OS * [ 1817699 ] Templates not found on all OS
The following uncategorized improvements have been made: 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
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1810058 ] .tt's pod indexed on CPAN (again) * [ 1810058 ] .tt's pod indexed on CPAN (again)
* [ 1809284 ] Rename SOAP::WSDL::Deserializer::SOAP11 to ::XSD * [ 1809284 ] Rename SOAP::WSDL::Deserializer::SOAP11 to ::XSD
The following uncategorized improvements have been made: The following uncategorized improvements have been made:
* Requires at least perl 5.8.0. This is due to a bug in perls before - * Requires at least perl 5.8.0. This is due to a bug in perls before -
see http://aspn.activestate.com/ASPN/Mail/Message/perl5-porters/929746 see http://aspn.activestate.com/ASPN/Mail/Message/perl5-porters/929746
2.00_20 2.00_20
---- ----
The following features were added (the numbers in square brackets are the The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1815646 ] Only include last part of port name in interface * [ 1815646 ] Only include last part of port name in interface
* [ 1815648 ] Methods with empty body cannot be called as ->method() * [ 1815648 ] Methods with empty body cannot be called as ->method()
* [ 1815651 ] Empty complexType definitions not supported * [ 1815651 ] Empty complexType definitions not supported
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
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1815643 ] ComplexTypes cannot be freezed/thawed * [ 1815643 ] ComplexTypes cannot be freezed/thawed
The following uncategorized improvements have been made: The following uncategorized improvements have been made:
* WSDL definitions are decoded into utf8 * WSDL definitions are decoded into utf8
* fixed tests to use correct path on windows * fixed tests to use correct path on windows
2.00_19 2.00_19
---- ----
The following features were added (the numbers in square brackets are the The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1810395 ] Implement complexType complexContent extension * [ 1810395 ] Implement complexType complexContent extension
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
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1813144 ] Typemap not used in interface class * [ 1813144 ] Typemap not used in interface class
* [ 1810058 ] .tt's pod indexed on CPAN * [ 1810058 ] .tt's pod indexed on CPAN
The following uncategorized improvements have been made: The following uncategorized improvements have been made:
* Documentation improvements * Documentation improvements
2.00_18 2.00_18
---- ----
The following features were added (the numbers in square brackets are the The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1790983 ] Create generator Plugin API * [ 1790983 ] Create generator Plugin API
Generator factory is SOAP::WSDL::Factory::Generator Generator factory is SOAP::WSDL::Factory::Generator
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
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1805252 ] t/SOAP/WSDL/XSD/Typelib/Builtin/004_time.t fails * [ 1805252 ] t/SOAP/WSDL/XSD/Typelib/Builtin/004_time.t fails
The default timezone conversion has been fixed. The default timezone conversion has been fixed.
The following uncategorized improvements have been made: The following uncategorized improvements have been made:
* Documentation improvements * Documentation improvements
* Test updates * Test updates
* readable() has been converted into a no-op, as it already had no effect * readable() has been converted into a no-op, as it already had no effect
any more any more
2.00_17 2.00_17
---- ----
The following features were added (the numbers in square brackets are the The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924): 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 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): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1772617 ] SOAP Header not working * [ 1772617 ] SOAP Header not working
Added header support. Currently, SOAP headers are only supported with Added header support. Currently, SOAP headers are only supported with
the SOM or the XSD (SOAP11) serializer. the SOM or the XSD (SOAP11) serializer.
* [ 1805238 ] Tests in t/SOAP/WSDL don't work when run from t/ * [ 1805238 ] Tests in t/SOAP/WSDL don't work when run from t/
* [ 1805241 ] explain() broken in SOAP::WSDL * [ 1805241 ] explain() broken in SOAP::WSDL
explain has been removed from SOAP::WSDL explain has been removed from SOAP::WSDL
The following uncategorized improvements have been made:
* Added limited support for complexType complexContent content model with The following uncategorized improvements have been made:
* Added limited support for complexType complexContent content model with
restriction variety. restriction variety.
SOAP::WSDL now supports this XML Schema definition variant, although no SOAP::WSDL now supports this XML Schema definition variant, although no
constraints are imposed on derived types yet. constraints are imposed on derived types yet.
Derived types do not serialize with a xsi:type attribute (and the xsi:type Derived types do not serialize with a xsi:type attribute (and the xsi:type
attribute is not recognized by the XML parser), so you cannot use derived attribute is not recognized by the XML parser), so you cannot use derived
types as a substitute for theri parent, yet. types as a substitute for theri parent, yet.
* Added support for complexType choice variety * Added support for complexType choice variety
complexType definitions using the choice variety are now supported, complexType definitions using the choice variety are now supported,
even though the content is not checked (if you pass in invalid data, even though the content is not checked (if you pass in invalid data,
invalid XML will be generated). invalid XML will be generated).
* Added Loopback Transport backend. * Added Loopback Transport backend.
SOAP::WSDL::Tranport::Loopback just returns the request as respons, but SOAP::WSDL::Tranport::Loopback just returns the request as respons, but
allows testing the whole chain from user interface to transport backend. allows testing the whole chain from user interface to transport backend.
* Fixed SOAP::WSDL::Factory::Transport prefer user-registered * Fixed SOAP::WSDL::Factory::Transport prefer user-registered
transport backend transport backend
* Fixed set_soap_version method in SOAP::WSDL::Client. * Fixed set_soap_version method in SOAP::WSDL::Client.
Re-setting the SOAP version now invalidates (resets) serializer and Re-setting the SOAP version now invalidates (resets) serializer and
deserializer, but not the transport backend. deserializer, but not the transport backend.
* Fixed SOAP::WSDL::XSD::Typelib::Builtin::boolean to return false * Fixed SOAP::WSDL::XSD::Typelib::Builtin::boolean to return false
when false and true when true. when false and true when true.
* SOAP::WSDL::XSD::Typelib::Builtin::normalizedString now replaces all * SOAP::WSDL::XSD::Typelib::Builtin::normalizedString now replaces all
occurences of tab, newline and carriage return by whitespce on set_value. occurences of tab, newline and carriage return by whitespce on set_value.
* Code cleanup * Code cleanup
o Lots of orphan methods now replaced by the SOAP::WSDL::Generator o Lots of orphan methods now replaced by the SOAP::WSDL::Generator
hierarchy have been removed. hierarchy have been removed.
o Unused (and unusable) readable option checking has been removed in o Unused (and unusable) readable option checking has been removed in
SOAP::WSDL::Serializer::SOAP11. SOAP::WSDL::Serializer::SOAP11.
o Unused XML Schema facet attributes have been removed from XSD Builtin o Unused XML Schema facet attributes have been removed from XSD Builtin
classes classes
o Methods common to all expat parser classes have been factored out o Methods common to all expat parser classes have been factored out
into a common base class. into a common base class.
* XML serialization speedup for SOAP::WSDL::XSD::* objects * XML serialization speedup for SOAP::WSDL::XSD::* objects
* Tests added to improve test coverage. * Tests added to improve test coverage.
@@ -224,7 +404,7 @@ The following uncategorized improvements have been made:
2.00_16 2.00_16
---- ----
The following features were added (the numbers in square brackets are the The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1761532 ] Support embedded atomic types * [ 1761532 ] Support embedded atomic types
@@ -240,11 +420,11 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1803330 ] Create one interface per port * [ 1803330 ] Create one interface per port
SOAP::WSDL now creates one interface per port, not one per service. SOAP::WSDL now creates one interface per port, not one per service.
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
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1804441 ] parts from binding not regarded in SOAP::WSDL * [ 1804441 ] parts from binding not regarded in SOAP::WSDL
SOAP::WSDL (interpreter mode) now respects the body parts specified in the SOAP::WSDL (interpreter mode) now respects the body parts specified in the
binding. binding.
* [ 1803763 ] nonNegativeInteger misspelled in Schema::Builtin * [ 1803763 ] nonNegativeInteger misspelled in Schema::Builtin
@@ -252,35 +432,35 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1793965 ] _expand() does not work on non-root-node ns declarations * [ 1793965 ] _expand() does not work on non-root-node ns declarations
* [ 1792348 ] 006_client.t requires SOAP::Lite in 2.00_15 * [ 1792348 ] 006_client.t requires SOAP::Lite in 2.00_15
SOAP::WSDL no longer attempts to load SOAP::WSDL::Deserializer::SOM when SOAP::WSDL no longer attempts to load SOAP::WSDL::Deserializer::SOM when
no_dispatch is set. no_dispatch is set.
006_client.t now sets outputxml(1), to be really sure. 006_client.t now sets outputxml(1), to be really sure.
The following uncategorized improvements have been made: The following uncategorized improvements have been made:
* Code generator only generates interface for the first port in a service * Code generator only generates interface for the first port in a service
The code generator now generates interfaces for all ports. The code generator now generates interfaces for all ports.
Note: The naming scheme has changed. It is now Note: The naming scheme has changed. It is now
InterfacePrefix::Service::Port InterfacePrefix::Service::Port
* XML Parser speedup * XML Parser speedup
The XML parser has received a little speedup. The XML parser has received a little speedup.
* A number of errors in parsing / traversing WSDL documents have been * A number of errors in parsing / traversing WSDL documents have been
corrected. corrected.
* Documentation has been improved * Documentation has been improved
* A number of (incorrect, but passing) tests have been fixed. * A number of (incorrect, but passing) tests have been fixed.
* Code cleanup: The SOAP::WSDL::SAX* modules are no longer included, as they * Code cleanup: The SOAP::WSDL::SAX* modules are no longer included, as they
are not supported any more. They can still be found in SOAP::WSDL's are not supported any more. They can still be found in SOAP::WSDL's
subversion repository in the attic directory, though. subversion repository in the attic directory, though.
2.00_15 2.00_15
---- ----
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
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1792321 ] 2.00_14 requires SOAP::Lite for passing tests * [ 1792321 ] 2.00_14 requires SOAP::Lite for passing tests
@@ -288,7 +468,7 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
2.00_14 2.00_14
---- ----
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
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1792235 ] SOAP::WSDL::Transport::Test missing from 2.00_13 * [ 1792235 ] SOAP::WSDL::Transport::Test missing from 2.00_13
@@ -299,7 +479,7 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The following uncategorized improvements have been made: The following uncategorized improvements have been made:
* The ::SOM deserializer has been simplified to be just a subclass * The ::SOM deserializer has been simplified to be just a subclass
of SOAP::Deserializer from SOAP::Lite of SOAP::Deserializer from SOAP::Lite
* Factories now emit more useful error messages when no class is registered * Factories now emit more useful error messages when no class is registered
for the protocol/soap_version requested for the protocol/soap_version requested
@@ -310,36 +490,36 @@ The following uncategorized improvements have been made:
2.00_13 2.00_13
---- ----
The following features were added (the numbers in square brackets are the The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1790619 ] Test transport backend * [ 1790619 ] Test transport backend
A test transport backend has been implemented (SOAP::WSDL::Transport::Test). A test transport backend has been implemented (SOAP::WSDL::Transport::Test).
It returns the contents from a file and discards the response. It returns the contents from a file and discards the response.
The filename is determined from the soap_action field. The filename is determined from the soap_action field.
* [ 1785196 ] Replace outputsom(1) by deserializer plugin * [ 1785196 ] Replace outputsom(1) by deserializer plugin
outputsom(1) in SOAP::WSDL is now implemented via using the deserializer outputsom(1) in SOAP::WSDL is now implemented via using the deserializer
plugin SOAP::WSDL::Deserializer::SOM. plugin SOAP::WSDL::Deserializer::SOM.
* [1785195] Support deserializer plugins * [1785195] Support deserializer plugins
Deserializer plugin API added via SOAP::WSDL::Factory::Deserializer. Deserializer plugin API added via SOAP::WSDL::Factory::Deserializer.
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
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [1789581] Support ComplexType mixed * [1789581] Support ComplexType mixed
WSDL parser now supports using the mixed="true" attribute in complexType WSDL parser now supports using the mixed="true" attribute in complexType
definitions. Mixed content in messages is only supported via SOAP::SOM yet. definitions. Mixed content in messages is only supported via SOAP::SOM yet.
* [1787975] 016_client_object.t fails due to testing XML as string * [1787975] 016_client_object.t fails due to testing XML as string
Removed string test. Removed string test.
* [1787959] Test wsdl seems to be broken * [1787959] Test wsdl seems to be broken
Corrected typo. Corrected typo.
* [1787955] ::XSD::Typelib::date is broken * [1787955] ::XSD::Typelib::date is broken
SOAP::WSDL::XSD::Typelib::Builtin::date now converts time-zoned dates properly, SOAP::WSDL::XSD::Typelib::Builtin::date now converts time-zoned dates properly,
and adds the local time zone if none is given. and adds the local time zone if none is given.
* [1785646] SOAPAction header not set from soap:operation soapAction * [1785646] SOAPAction header not set from soap:operation soapAction
@@ -351,55 +531,55 @@ The following uncategorized improvements have been made:
2.00_12 2.00_12
---- ----
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
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [1787146] SOAP::WSDL still uses XML::LibXML * [1787146] SOAP::WSDL still uses XML::LibXML
The superficious usage of XML::LibXML has been removed. XML::LibXML with The superficious usage of XML::LibXML has been removed. XML::LibXML with
sax filter has been replaced by SOAP::WSDL::Expat::WSDLParser. sax filter has been replaced by SOAP::WSDL::Expat::WSDLParser.
* [1787054] Test suite requires XML::LibXML in 2.00_11 * [1787054] Test suite requires XML::LibXML in 2.00_11
The test suite no longer requires XML::LibXML to pass. The test suite no longer requires XML::LibXML to pass.
* [1785678] SOAP envelope not checked for namespace * [1785678] SOAP envelope not checked for namespace
The SOAP envelope is now checked for the correct namespace. The SOAP envelope is now checked for the correct namespace.
* [1786644] SOAP::WSDL::Manual - doc error * [1786644] SOAP::WSDL::Manual - doc error
Documentation improvements Documentation improvements
The following uncategorized improvements have been made The following uncategorized improvements have been made
* The SOAPAction header is now alway quoted (R1109 in WS-I BP 1.0). * The SOAPAction header is now alway quoted (R1109 in WS-I BP 1.0).
2.00_11 2.00_11
---- ----
The following features were added (the numbers in square brackets are the The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [1767963] Transport plugins via SOAP::WSDL::Factory::Transport. * [1767963] Transport plugins via SOAP::WSDL::Factory::Transport.
SOAP::WSDL uses SOAP::Lite's tranport modules as default, with a SOAP::WSDL uses SOAP::Lite's tranport modules as default, with a
lightweight HTTP(S) transport plugin as fallback. lightweight HTTP(S) transport plugin as fallback.
Custom transport modules can be registered via SOAP::WSDL::Factory::Transport. Custom transport modules can be registered via SOAP::WSDL::Factory::Transport.
* [ 1772730 ] Serializer plugins via SOAP::WSDL::Factory::Serializer * [ 1772730 ] Serializer plugins via SOAP::WSDL::Factory::Serializer
The default serializer for SOAP1.1 is SOAP::WSDL::Serializer::SOAP11. The default serializer for SOAP1.1 is SOAP::WSDL::Serializer::SOAP11.
Custom serializers classes can be registered via Custom serializers classes can be registered via
SOAP::WSDL::Factory::Serializer or set via SOAP::WSDL's set_serializer SOAP::WSDL::Factory::Serializer or set via SOAP::WSDL's set_serializer
method. method.
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
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921): tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1764854 ] Port WSDL parser to expat and remove XML::LibXML dependency * [ 1764854 ] Port WSDL parser to expat and remove XML::LibXML dependency
SOAP::WSDL now requires only XML::Parser to be installed. SOAP::WSDL now requires only XML::Parser to be installed.
XML::LibXML is not required any more, though XML::LibXML based modules still XML::LibXML is not required any more, though XML::LibXML based modules still
exist. exist.
The following uncategorized improvements have been made The following uncategorized improvements have been made
* The number of dependencies has been reduced. SOAP::WSDL no longer requires the * The number of dependencies has been reduced. SOAP::WSDL no longer requires the
following modules to be installed: following modules to be installed:
- XML::SAX::Base - XML::SAX::Base
- XML::SAX::ParserFactory - XML::SAX::ParserFactory
@@ -418,27 +598,27 @@ The following uncategorized improvements have been made
2.00_09 2.00_09
---- ----
* SOAP::WSDL::XSD::Typelib::Builtin::boolean objects now return their numerical * SOAP::WSDL::XSD::Typelib::Builtin::boolean objects now return their numerical
value in bool context, not "true" or "false" (always true...) value in bool context, not "true" or "false" (always true...)
* date/time test are now timezone-sensitive * date/time test are now timezone-sensitive
* examples added * examples added
2.00_08 2.00_08
--- ---
* SOAP::WSDL::XSD::Typelib::ComplexType objects now check the class of their * SOAP::WSDL::XSD::Typelib::ComplexType objects now check the class of their
child objects. child objects.
This provides early feedback to developers. This provides early feedback to developers.
* SOAP message parser can skip unwanted parts of the message to improve parsing * SOAP message parser can skip unwanted parts of the message to improve parsing
speed - see SOAP::WSDL::Expat::MessageParser for details. speed - see SOAP::WSDL::Expat::MessageParser for details.
* HTTP Content-Type is configurable * HTTP Content-Type is configurable
* SOAP::WSDL::XSD::Typelib::ComplexType based objects accept any combination of * SOAP::WSDL::XSD::Typelib::ComplexType based objects accept any combination of
hash refs, list refs and objects as parameter to set_value() and new(). hash refs, list refs and objects as parameter to set_value() and new().
* SOAP::WSDL::XSD::Typelib::Builtin::dateTime and ::date convert date * SOAP::WSDL::XSD::Typelib::Builtin::dateTime and ::date convert date
strings into XML date strings strings into XML date strings
* SOAP::WSDL::Definitions::create now * SOAP::WSDL::Definitions::create now
- converts '.' in service names to '::' (.NET class separator to perl class - converts '.' in service names to '::' (.NET class separator to perl class
separator) separator)
- outputs Typemaps and Interface classes in UTF8 to allow proper inclusion - outputs Typemaps and Interface classes in UTF8 to allow proper inclusion
of UTF8 documentation from WSDL of UTF8 documentation from WSDL
* SOAP::WSDL::Definitions::create() includes doc in generated interface classes * SOAP::WSDL::Definitions::create() includes doc in generated interface classes
* WSDLHandler now handles <wsdl:documentation> tags * WSDLHandler now handles <wsdl:documentation> tags
@@ -449,7 +629,7 @@ The following uncategorized improvements have been made
* Implemented a Code generator for creating SOAP interfaces based on WSDL definitions * Implemented a Code generator for creating SOAP interfaces based on WSDL definitions
* Implemented a high-speed stream based SOAP message parser * Implemented a high-speed stream based SOAP message parser
SOAP message parser returns a objects based on XML schema based class library SOAP message parser returns a objects based on XML schema based class library
* Implemented a XML schema based class library * Implemented a XML schema based class library
* Implemented a stream based WSDL parser. * Implemented a stream based WSDL parser.
Parses WSDL into objects. Objects can serialize data, and explain how to use the Parses WSDL into objects. Objects can serialize data, and explain how to use the
service(s) they make up (output documentation). service(s) they make up (output documentation).
+5 -5
View File
@@ -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
View File
@@ -1 +0,0 @@
+93 -9
View File
@@ -1,11 +1,21 @@
benchmark/01_expat.t benchmark/01_expat.t
benchmark/hello.pl
benchmark/person.pl
benchmark/person.xml
benchmark/person_profile.pl
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 +29,50 @@ 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/BarCodeData.pm
example/lib/MyTypes/BarcodeOption.pm
example/lib/MyTypes/BarcodeType.pm
example/lib/MyTypes/CheckSumMethod.pm
example/lib/MyTypes/Contract.pm
example/lib/MyTypes/ImageFormats.pm
example/lib/MyTypes/Person.pm
example/lib/MyTypes/PersonID.pm
example/lib/MyTypes/PhoneNumber.pm
example/lib/MyTypes/ShowTextPosition.pm
example/lib/MyTypes/test2.pm
example/lib/MyTypes/testExtended.pm
example/person.pl
example/person_compile.pl
example/visitor/visitor.pl example/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
@@ -51,11 +93,13 @@ lib/SOAP/WSDL/Factory/Generator.pm
lib/SOAP/WSDL/Factory/Serializer.pm lib/SOAP/WSDL/Factory/Serializer.pm
lib/SOAP/WSDL/Factory/Transport.pm lib/SOAP/WSDL/Factory/Transport.pm
lib/SOAP/WSDL/Generator/Template.pm lib/SOAP/WSDL/Generator/Template.pm
lib/SOAP/WSDL/Generator/Template/Plugin/XSD.pm
lib/SOAP/WSDL/Generator/Template/XSD.pm lib/SOAP/WSDL/Generator/Template/XSD.pm
lib/SOAP/WSDL/Generator/Template/XSD/_type_class.tt lib/SOAP/WSDL/Generator/Template/XSD/_type_class.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/atomicTypes.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/atomicTypes.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/attributeSet.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/contentModel.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/contentModel.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt
@@ -63,8 +107,10 @@ lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/all.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/choice.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/choice.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/complexContent.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/complexContent.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/restriction.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/restriction.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/simpleContent.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/structure.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/structure.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/restriction.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/restriction.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/simpleContent.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/variety.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/variety.tt
lib/SOAP/WSDL/Generator/Template/XSD/element.tt lib/SOAP/WSDL/Generator/Template/XSD/element.tt
lib/SOAP/WSDL/Generator/Template/XSD/element/POD/structure.tt lib/SOAP/WSDL/Generator/Template/XSD/element/POD/structure.tt
@@ -78,6 +124,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 +155,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
@@ -116,12 +169,15 @@ lib/SOAP/WSDL/Transport/Loopback.pm
lib/SOAP/WSDL/Transport/Test.pm lib/SOAP/WSDL/Transport/Test.pm
lib/SOAP/WSDL/TypeLookup.pm lib/SOAP/WSDL/TypeLookup.pm
lib/SOAP/WSDL/Types.pm lib/SOAP/WSDL/Types.pm
lib/SOAP/WSDL/XSD/Attribute.pm
lib/SOAP/WSDL/XSD/Builtin.pm lib/SOAP/WSDL/XSD/Builtin.pm
lib/SOAP/WSDL/XSD/ComplexType.pm lib/SOAP/WSDL/XSD/ComplexType.pm
lib/SOAP/WSDL/XSD/Element.pm lib/SOAP/WSDL/XSD/Element.pm
lib/SOAP/WSDL/XSD/Schema.pm lib/SOAP/WSDL/XSD/Schema.pm
lib/SOAP/WSDL/XSD/Schema/Builtin.pm lib/SOAP/WSDL/XSD/Schema/Builtin.pm
lib/SOAP/WSDL/XSD/SimpleType.pm lib/SOAP/WSDL/XSD/SimpleType.pm
lib/SOAP/WSDL/XSD/Typelib/Attribute.pm
lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin.pm lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
@@ -173,16 +229,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 +247,9 @@ 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/095_copying.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
@@ -220,27 +276,31 @@ t/acceptance/wsdl/10_helloworld.asmx.xml
t/acceptance/wsdl/11_helloworld.wsdl t/acceptance/wsdl/11_helloworld.wsdl
t/acceptance/wsdl/contributed/Axis.wsdl t/acceptance/wsdl/contributed/Axis.wsdl
t/acceptance/wsdl/contributed/ETest.wsdl t/acceptance/wsdl/contributed/ETest.wsdl
t/acceptance/wsdl/contributed/gasquery.wsdl
t/acceptance/wsdl/contributed/OITest.wsdl t/acceptance/wsdl/contributed/OITest.wsdl
t/acceptance/wsdl/contributed/tools.wsdl t/acceptance/wsdl/contributed/tools.wsdl
t/acceptance/wsdl/elementAtomicComplexType.xml t/acceptance/wsdl/elementAtomicComplexType.xml
t/acceptance/wsdl/email_account.wsdl t/acceptance/wsdl/email_account.wsdl
t/acceptance/wsdl/generator_test.wsdl t/acceptance/wsdl/generator_test.wsdl
t/acceptance/wsdl/generator_test_dot_names.wsdl
t/acceptance/wsdl/generator_unsupported_test.wsdl t/acceptance/wsdl/generator_unsupported_test.wsdl
t/acceptance/wsdl/import.xsd
t/acceptance/wsdl/import_loop.xsd
t/acceptance/wsdl/message_gateway.wsdl t/acceptance/wsdl/message_gateway.wsdl
t/acceptance/wsdl/WSDLParser-import.wsdl
t/acceptance/wsdl/WSDLParser-imported.wsdl
t/acceptance/wsdl/WSDLParser.wsdl
t/acceptance/wsdl/WSDLParser_import_loop.wsdl
t/contributed.wsdl t/contributed.wsdl
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 +319,15 @@ 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.t
t/SOAP/WSDL/Client/Base.t
t/SOAP/WSDL/Definitions.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/Expat/MessageParser.t
t/SOAP/WSDL/Expat/WSDLParser.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
@@ -270,12 +336,24 @@ t/SOAP/WSDL/Generator/Visitor.t
t/SOAP/WSDL/Generator/Visitor/Typemap.t 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_dot_names.t
t/SOAP/WSDL/Generator/XSD_unsupported.t t/SOAP/WSDL/Generator/XSD_unsupported.t
t/SOAP/WSDL/Part.t
t/SOAP/WSDL/PortType.t
t/SOAP/WSDL/Serializer/XSD.t
t/SOAP/WSDL/Server.t
t/SOAP/WSDL/Server/CGI.t
t/SOAP/WSDL/Transport/01_Test.t 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
t/SOAP/WSDL/Transport/acceptance/test3.xml t/SOAP/WSDL/Transport/acceptance/test3.xml
t/SOAP/WSDL/Typelib/Fault11.t t/SOAP/WSDL/Typelib/Fault11.t
t/SOAP/WSDL/XSD/Attribute.t
t/SOAP/WSDL/XSD/ComplexType.t
t/SOAP/WSDL/XSD/Element.t
t/SOAP/WSDL/XSD/Schema.t
t/SOAP/WSDL/XSD/SimpleType.t
t/SOAP/WSDL/XSD/Typelib/Attribute.t
t/SOAP/WSDL/XSD/Typelib/Builtin/01_constructors.t t/SOAP/WSDL/XSD/Typelib/Builtin/01_constructors.t
t/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.t t/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.t
t/SOAP/WSDL/XSD/Typelib/Builtin/anyType.t t/SOAP/WSDL/XSD/Typelib/Builtin/anyType.t
@@ -296,6 +374,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 +396,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
+57 -29
View File
@@ -1,6 +1,6 @@
--- ---
name: SOAP-WSDL name: SOAP-WSDL
version: 2.00_24 version: 2.00_32
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
@@ -20,44 +25,45 @@ requires:
List::Util: 0 List::Util: 0
Template: 0 Template: 0
Term::ReadKey: 0 Term::ReadKey: 0
URI: 0
XML::Parser::Expat: 0 XML::Parser::Expat: 0
perl: 5.8.0 perl: 5.8.0
provides: provides:
SOAP::WSDL: SOAP::WSDL:
file: lib/SOAP/WSDL.pm file: lib/SOAP/WSDL.pm
version: 2.00_17 version: 2.00_32
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_27
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_27
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_27
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_32
SOAP::WSDL::Expat::Message2Hash: SOAP::WSDL::Expat::Message2Hash:
file: lib/SOAP/WSDL/Expat/Message2Hash.pm file: lib/SOAP/WSDL/Expat/Message2Hash.pm
version: 2.00_24 version: 2.00_27
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_27
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 +78,23 @@ 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_31
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::Plugin::XSD:
file: lib/SOAP/WSDL/Generator/Template/Plugin/XSD.pm
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_27
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,45 +117,62 @@ 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_27
SOAP::WSDL::Server:
file: lib/SOAP/WSDL/Server.pm
version: 2.00_27
SOAP::WSDL::Server::CGI:
file: lib/SOAP/WSDL/Server/CGI.pm
version: 2.00_27
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
version: 2.00_31
SOAP::WSDL::Types: SOAP::WSDL::Types:
file: lib/SOAP/WSDL/Types.pm file: lib/SOAP/WSDL/Types.pm
SOAP::WSDL::XSD::Attribute:
file: lib/SOAP/WSDL/XSD/Attribute.pm
version: 2.00_29
SOAP::WSDL::XSD::Builtin: SOAP::WSDL::XSD::Builtin:
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_29
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::Attribute:
file: lib/SOAP/WSDL/XSD/Typelib/Attribute.pm
version: 2.00_29
SOAP::WSDL::XSD::Typelib::AttributeSet:
file: lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm
version: 2.00_29
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:
@@ -170,13 +197,14 @@ provides:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
SOAP::WSDL::XSD::Typelib::Builtin::anyType: SOAP::WSDL::XSD::Typelib::Builtin::anyType:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
version: 2.00_29
SOAP::WSDL::XSD::Typelib::Builtin::anyURI: SOAP::WSDL::XSD::Typelib::Builtin::anyURI:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm
SOAP::WSDL::XSD::Typelib::Builtin::base64Binary: SOAP::WSDL::XSD::Typelib::Builtin::base64Binary:
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 +257,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 +270,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_31
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_29
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:
+66
View File
@@ -0,0 +1,66 @@
MIGRATING
---------
MIGRATING FROM PRE-2.00_29
--------------------------
SOAP::WSDL 2.00_29 added experimental XML attribute support. The attribute
support changed the code of the generated classes, which may now
require the class SOAP::WSDL::XSD::Typelib::Attribute introduced in the same
pre-release.
While interfaces generated with pre-releases back to 2.00_25 work without
change, this does not hold true vice versa: Interfaces generated with
2.00_29 and above won't work with older pre-releases.
You'll have to update SOAP::WSDL on all your machines.
MIGRATING FROM PRE-2.00_24
--------------------------
This section 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.
+6 -6
View File
@@ -3,22 +3,22 @@ TODO list for SOAP::WSDL
2.00 Pre-releases 2.00 Pre-releases
-------- --------
* Act as SOAP Server [ 1842436 ]
2.1 release 2.1 release
-------- --------
* Support namespaces in SOAP message payload(#1809057) * Support namespaces in SOAP message payload [ 1809057 ]
* Support the xsi:type attribute on derived types on the wire(#1809059) * Support the xsi:type attribute on derived types on the wire [ 1809059 ]
* SOAP1.2 support (#1803331) * SOAP1.2 support [ 1803331 ]
2.2 release 2.2 release
-------- --------
* XML schema support ("minimal conformant") (#1764845) * XML schema support ("minimal conformant") [ 1764845 ]
* Support SOAP attachments * Support SOAP attachments
* Act as SOAP Server
3.0 release 3.0 release
-------- --------
We're not thinking that far ahead right now. We're not thinking that far ahead right now.
+7 -5
View File
@@ -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' };
+36
View File
@@ -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)
+31
View File
@@ -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)
+69
View File
@@ -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,
}
+86
View File
@@ -0,0 +1,86 @@
use lib '../lib';
use lib '../example/lib';
use lib '../../SOAP-WSDL_XS/blib/lib';
use lib '../../SOAP-WSDL_XS/blib/arch';
use strict;
use Benchmark qw(cmpthese);
use XML::Compile::Transport::SOAPHTTP();
use XML::Compile::Util;
use XML::Compile::WSDL11;
use XML::Simple;
use SOAP::WSDL::Deserializer::XSD_XS;
use SOAP::WSDL::Factory::Deserializer;
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
use SOAP::Lite;
use MyInterfaces::TestService::TestPort;
my $compile = XML::Compile::WSDL11->new('../example/wsdl/Person.wsdl');
my $call = $compile->compileClient('ListPerson');
$call->({ in => undef});
# Initialize SOAP::Lite
my $deserializer = SOAP::Deserializer->new();
# Initialize SOAP::WSDL interface
my $soap = MyInterfaces::TestService::TestPort->new();
# Load all classes - XML::Compile has created everything before, too
$soap->ListPerson({});
my $lite = SOAP::Lite->new()->default_ns('http://www.example.org/benchmark/')
->proxy('http://localhost:81/soap-wsdl-test/person.pl');
$lite->on_action( sub { 'http://www.example.org/benchmark/ListPerson' } );
# # register for SOAP 1.1
SOAP::WSDL::Factory::Deserializer->register('1.1' => 'SOAP::WSDL::Deserializer::XSD_XS' );
my $wsdl_xs = MyInterfaces::TestService::TestPort->new();
# trigger loading of XML Data
my $count = 100;
my @data = ();
my $n = 0;
print "Benchmark conducted with
SOAP::Lite - $SOAP::Lite::VERSION
SOAP::WSDL - $SOAP::WSDL::Client::VERSION
SOAP::WSDL_XS - $SOAP::WSDL::Deserializer::XSD_XS::VERSION;
XML::Compile::SOAP - $XML::Compile::SOAP::VERSION
Benchmark $n: Store result in private variable and destroy it
";
$n++;
cmpthese $count, {
# 'XML::Simple' => sub { my $result = XMLin( MyData::xml() )},
'SOAP::WSDL' => sub { my $result = $soap->ListPerson({}) },
'XML::Compile' => sub { my $result = $call->() },
'SOAP::WSDL_XS' => sub { my $result = $wsdl_xs->ListPerson({}) },
# 'SOAP::Lite' => sub { my $result = $deserializer->deserialize( MyData::xml() )},
'SOAP::Lite' => sub { my $som = $lite->call('ListPerson') },
};
print "\nBenchmark $n: Push result on list\n";
$n++;
cmpthese $count, {
# 'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
'XML::Compile' => sub { push @data, $call->() },
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
# 'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
};
@data = ();
print "\nBenchmark $n: Play it again, Sam\n";
cmpthese $count, {
# 'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
'XML::Compile' => sub { push @data, $call->() },
# 'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
};
+437
View File
@@ -0,0 +1,437 @@
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body>
<ListPersonResponse xmlns="http://www.example.org/benchmark/">
<out>
<NewElement>
<PersonID>
<ID>1</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100000</ContractID>
<ContractName>SomeContract0</ContractName>
</Contract>
<Contract>
<ContractID>100001</ContractID>
<ContractName>SomeContract1</ContractName>
</Contract>
<Contract>
<ContractID>100002</ContractID>
<ContractName>SomeContract2</ContractName>
</Contract>
<Contract>
<ContractID>100003</ContractID>
<ContractName>SomeContract3</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>2</ID>
</PersonID>
<Salutation>Salutation2</Salutation>
<Name>Name2</Name>
<GivenName>Martin2</GivenName>
<DateOfBirth>1970-01-02</DateOfBirth>
<HomeAddress>
<Street>Street 2</Street>
<ZIP>00002</ZIP>
<City>City2</City>
<Country>Country2</Country>
<PhoneNumber>++4900000002</PhoneNumber>
<MobilePhoneNumber>++491700000002</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 2</Street>
<ZIP>222222</ZIP>
<City>SomeCity2</City>
<Country>Germany</Country>
<PhoneNumber>++4920000002</PhoneNumber>
<MobilePhoneNumber>++4920000002</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100002</ContractID>
<ContractName>SomeContract2</ContractName>
</Contract>
<Contract>
<ContractID>100021</ContractID>
<ContractName>SomeContract21</ContractName>
</Contract>
<Contract>
<ContractID>100022</ContractID>
<ContractName>SomeContract22</ContractName>
</Contract>
<Contract>
<ContractID>1000023</ContractID>
<ContractName>SomeContract23</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>3</ID>
</PersonID>
<Salutation>Salutation3</Salutation>
<Name>Name3</Name>
<GivenName>Martin3</GivenName>
<DateOfBirth>1970-01-03</DateOfBirth>
<HomeAddress>
<Street>Street 3</Street>
<ZIP>00003</ZIP>
<City>City3</City>
<Country>Country3</Country>
<PhoneNumber>++4900000003</PhoneNumber>
<MobilePhoneNumber>++491700000003</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 3</Street>
<ZIP>333333</ZIP>
<City>SomeCity3</City>
<Country>Germany</Country>
<PhoneNumber>++4930000003</PhoneNumber>
<MobilePhoneNumber>++4930000003</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100003</ContractID>
<ContractName>SomeContract3</ContractName>
</Contract>
<Contract>
<ContractID>100031</ContractID>
<ContractName>SomeContract31</ContractName>
</Contract>
<Contract>
<ContractID>100033</ContractID>
<ContractName>SomeContract33</ContractName>
</Contract>
<Contract>
<ContractID>1000033</ContractID>
<ContractName>SomeContract33</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>4</ID>
</PersonID>
<Salutation>Salutation4</Salutation>
<Name>Name4</Name>
<GivenName>Martin4</GivenName>
<DateOfBirth>1970-01-04</DateOfBirth>
<HomeAddress>
<Street>Street 4</Street>
<ZIP>00004</ZIP>
<City>City4</City>
<Country>Country4</Country>
<PhoneNumber>++4900000004</PhoneNumber>
<MobilePhoneNumber>++491700000004</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 4</Street>
<ZIP>444444</ZIP>
<City>SomeCity4</City>
<Country>Germany</Country>
<PhoneNumber>++4940000004</PhoneNumber>
<MobilePhoneNumber>++4940000004</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100004</ContractID>
<ContractName>SomeContract4</ContractName>
</Contract>
<Contract>
<ContractID>100041</ContractID>
<ContractName>SomeContract41</ContractName>
</Contract>
<Contract>
<ContractID>100044</ContractID>
<ContractName>SomeContract44</ContractName>
</Contract>
<Contract>
<ContractID>1000044</ContractID>
<ContractName>SomeContract44</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>5</ID>
</PersonID>
<Salutation>Salutation5</Salutation>
<Name>Name5</Name>
<GivenName>Martin5</GivenName>
<DateOfBirth>1970-01-05</DateOfBirth>
<HomeAddress>
<Street>Street 5</Street>
<ZIP>00005</ZIP>
<City>City5</City>
<Country>Country5</Country>
<PhoneNumber>++4900000005</PhoneNumber>
<MobilePhoneNumber>++491700000005</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 5</Street>
<ZIP>555555</ZIP>
<City>SomeCity5</City>
<Country>Germany</Country>
<PhoneNumber>++4950000005</PhoneNumber>
<MobilePhoneNumber>++4950000005</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100005</ContractID>
<ContractName>SomeContract5</ContractName>
</Contract>
<Contract>
<ContractID>100051</ContractID>
<ContractName>SomeContract51</ContractName>
</Contract>
<Contract>
<ContractID>100055</ContractID>
<ContractName>SomeContract55</ContractName>
</Contract>
<Contract>
<ContractID>1000053</ContractID>
<ContractName>SomeContract53</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>6</ID>
</PersonID>
<Salutation>Salutation6</Salutation>
<Name>Name6</Name>
<GivenName>Martin6</GivenName>
<DateOfBirth>1970-01-06</DateOfBirth>
<HomeAddress>
<Street>Street 6</Street>
<ZIP>00006</ZIP>
<City>City6</City>
<Country>Country6</Country>
<PhoneNumber>++4900000006</PhoneNumber>
<MobilePhoneNumber>++491700000006</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 6</Street>
<ZIP>666666</ZIP>
<City>SomeCity6</City>
<Country>Germany</Country>
<PhoneNumber>++4960000006</PhoneNumber>
<MobilePhoneNumber>++4960000006</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100006</ContractID>
<ContractName>SomeContract6</ContractName>
</Contract>
<Contract>
<ContractID>100061</ContractID>
<ContractName>SomeContract61</ContractName>
</Contract>
<Contract>
<ContractID>100066</ContractID>
<ContractName>SomeContract66</ContractName>
</Contract>
<Contract>
<ContractID>1000063</ContractID>
<ContractName>SomeContract63</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>7</ID>
</PersonID>
<Salutation>Salutation7</Salutation>
<Name>Name7</Name>
<GivenName>Martin7</GivenName>
<DateOfBirth>1970-01-07</DateOfBirth>
<HomeAddress>
<Street>Street 7</Street>
<ZIP>00007</ZIP>
<City>City7</City>
<Country>Country7</Country>
<PhoneNumber>++4900000007</PhoneNumber>
<MobilePhoneNumber>++491700000007</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 7</Street>
<ZIP>777777</ZIP>
<City>SomeCity7</City>
<Country>Germany</Country>
<PhoneNumber>++4970000007</PhoneNumber>
<MobilePhoneNumber>++4970000007</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100007</ContractID>
<ContractName>SomeContract7</ContractName>
</Contract>
<Contract>
<ContractID>100071</ContractID>
<ContractName>SomeContract71</ContractName>
</Contract>
<Contract>
<ContractID>100077</ContractID>
<ContractName>SomeContract77</ContractName>
</Contract>
<Contract>
<ContractID>1000073</ContractID>
<ContractName>SomeContract73</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>8</ID>
</PersonID>
<Salutation>Salutation8</Salutation>
<Name>Name8</Name>
<GivenName>Martin8</GivenName>
<DateOfBirth>1970-01-08</DateOfBirth>
<HomeAddress>
<Street>Street 8</Street>
<ZIP>00008</ZIP>
<City>City8</City>
<Country>Country8</Country>
<PhoneNumber>++4900000008</PhoneNumber>
<MobilePhoneNumber>++491700000008</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 8</Street>
<ZIP>888888</ZIP>
<City>SomeCity8</City>
<Country>Germany</Country>
<PhoneNumber>++4980000008</PhoneNumber>
<MobilePhoneNumber>++4980000008</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100008</ContractID>
<ContractName>SomeContract8</ContractName>
</Contract>
<Contract>
<ContractID>100081</ContractID>
<ContractName>SomeContract81</ContractName>
</Contract>
<Contract>
<ContractID>100088</ContractID>
<ContractName>SomeContract88</ContractName>
</Contract>
<Contract>
<ContractID>1000083</ContractID>
<ContractName>SomeContract83</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>9</ID>
</PersonID>
<Salutation>Salutation9</Salutation>
<Name>Name9</Name>
<GivenName>Martin9</GivenName>
<DateOfBirth>1970-01-09</DateOfBirth>
<HomeAddress>
<Street>Street 9</Street>
<ZIP>00009</ZIP>
<City>City9</City>
<Country>Country9</Country>
<PhoneNumber>++4900000009</PhoneNumber>
<MobilePhoneNumber>++491700000009</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 9</Street>
<ZIP>999999</ZIP>
<City>SomeCity9</City>
<Country>Germany</Country>
<PhoneNumber>++4990000009</PhoneNumber>
<MobilePhoneNumber>++4990000009</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100009</ContractID>
<ContractName>SomeContract9</ContractName>
</Contract>
<Contract>
<ContractID>100091</ContractID>
<ContractName>SomeContract91</ContractName>
</Contract>
<Contract>
<ContractID>100099</ContractID>
<ContractName>SomeContract99</ContractName>
</Contract>
<Contract>
<ContractID>1000093</ContractID>
<ContractName>SomeContract93</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>10</ID>
</PersonID>
<Salutation>Salutation10</Salutation>
<Name>Name10</Name>
<GivenName>Martin10</GivenName>
<DateOfBirth>1970-01-010</DateOfBirth>
<HomeAddress>
<Street>Street 10</Street>
<ZIP>000010</ZIP>
<City>City10</City>
<Country>Country10</Country>
<PhoneNumber>++49000000010</PhoneNumber>
<MobilePhoneNumber>++4917000000010</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 10</Street>
<ZIP>101010101010</ZIP>
<City>SomeCity10</City>
<Country>Germany</Country>
<PhoneNumber>++491000000010</PhoneNumber>
<MobilePhoneNumber>++491000000010</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>1000010</ContractID>
<ContractName>SomeContract10</ContractName>
</Contract>
<Contract>
<ContractID>1000101</ContractID>
<ContractName>SomeContract101</ContractName>
</Contract>
<Contract>
<ContractID>10001010</ContractID>
<ContractName>SomeContract1010</ContractName>
</Contract>
<Contract>
<ContractID>10000103</ContractID>
<ContractName>SomeContract103</ContractName>
</Contract>
</Contracts>
</NewElement>
</out>
</ListPersonResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
+11
View File
@@ -0,0 +1,11 @@
use lib '../lib';
use lib '../example/lib';
use lib '../../SOAP-WSDL_XS/blib/lib';
use lib '../../SOAP-WSDL_XS/blib/arch';
use strict;
use MyInterfaces::TestService::TestPort;
my $soap = MyInterfaces::TestService::TestPort->new();
# Load all classes - XML::Compile has created everything before, too
for (1..100) { $soap->ListPerson({}) };
+47 -38
View File
@@ -18,14 +18,15 @@ 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"
no warnings qw(redefine); no warnings qw(redefine);
*LWP::UserAgent::get_basic_credentials = sub { *LWP::UserAgent::get_basic_credentials = sub {
my ($user, $password); my ($user, $password);
# remove user from option if called, to force prompting for a user # remove user from option if called, to force prompting for a user
# name the next time # name the next time
print "URL requires authorization.\n"; print "URL requires authorization.\n";
if (not $user = delete $opt{user}) { if (not $user = delete $opt{user}) {
@@ -38,14 +39,14 @@ my %opt = (
print 'Password:'; print 'Password:';
ReadMode 2; ReadMode 2;
$user = ReadLine; $user = ReadLine;
ReadMode 0; ReadMode 0;
}; };
return ($user, $password); return ($user, $password);
}; };
} }
GetOptions(\%opt, GetOptions(\%opt,
qw( qw(
prefix|p=s prefix|p=s
type_prefix|t=s type_prefix|t=s
element_prefix|e=s element_prefix|e=s
@@ -59,6 +60,7 @@ GetOptions(\%opt,
user=s user=s
password=s password=s
generator=s generator=s
server
) )
); );
@@ -67,24 +69,21 @@ my $url = $ARGV[0];
pod2usage( -exit => 1 , verbose => 2 ) if ($opt{help}); pod2usage( -exit => 1 , verbose => 2 ) if ($opt{help});
pod2usage( -exit => 1 , verbose => 1 ) if not ($url); pod2usage( -exit => 1 , verbose => 1 ) if not ($url);
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
local $ENV{HTTP_PROXY} = $opt{proxy} if $opt{proxy}; local $ENV{HTTP_PROXY} = $opt{proxy} if $opt{proxy};
local $ENV{HTTPS_PROXY} = $opt{proxy} if $opt{proxy}; local $ENV{HTTPS_PROXY} = $opt{proxy} if $opt{proxy};
my $lwp = LWP::UserAgent->new( my $lwp = LWP::UserAgent->new(
$opt{keep_alive} $opt{keep_alive}
? ( keep_alive => 1 ) ? ( keep_alive => 1 )
: () : ()
); );
$lwp->env_proxy(); # get proxy from environment. Works for both http & https. $lwp->env_proxy(); # get proxy from environment. Works for both http & https.
my $response = $lwp->get($url); my $parser = SOAP::WSDL::Expat::WSDLParser->new({
die $response->message(), "\n" if $response->code != 200; user_agent => $lwp,
});
my $xml = $response->content(); my $definitions = $parser->parse_uri( $url );
my $definitions = $parser->parse_string( $xml );
my %typemap = (); my %typemap = ();
@@ -110,11 +109,12 @@ $generator->set_element_prefix($opt{ element_prefix }) if $generator->can('set_e
$generator->set_interface_prefix($opt{ interface_prefix }) if $generator->can('set_interface_prefix'); $generator->set_interface_prefix($opt{ interface_prefix }) if $generator->can('set_interface_prefix');
$generator->set_OUTPUT_PATH($opt{ base_path }) if $generator->can('set_OUTPUT_PATH'); $generator->set_OUTPUT_PATH($opt{ base_path }) if $generator->can('set_OUTPUT_PATH');
$generator->set_definitions($definitions) if $generator->can('set_definitions'); $generator->set_definitions($definitions) if $generator->can('set_definitions');
$generator->set_wsdl($xml) if $generator->can('set_wsdl'); # $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
@@ -133,31 +133,33 @@ wsdl2perl.pl - create perl bindings for SOAP webservices.
NAME SHORT DESCRITPION NAME SHORT DESCRITPION
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
prefix p Prefix for both type and element classes. prefix p Prefix for both type and element classes.
type_prefix t Prefix for type classes. type_prefix t Prefix for type classes.
Default: MyTypes Default: MyTypes
element_prefix e Prefix for element classes. element_prefix e Prefix for element classes.
Default: MyElements Default: MyElements
typemap_prefix m Prefix for typemap classes. typemap_prefix m Prefix for typemap classes.
Default: MyTypemaps Default: MyTypemaps
interface_prefix i Prefix for interface classes. interface_prefix i Prefix for interface classes.
Default: MyInterfaces Default: MyInterfaces
base_path b Path to create classes in. base_path b Path to create classes in.
Default: . Default: .
typemap_include mi File to include in typemap. Must eval() to a valid typemap_include mi File to include in typemap. Must eval() to a valid
perl hash (not a hash ref !). perl hash (not a hash ref !).
proxy x HTTP(S) proxy to use (if any). wsdl2perl will also proxy x HTTP(S) proxy to use (if any). wsdl2perl will also
use the proxy settings specified via the HTTP_PROXY use the proxy settings specified via the HTTP_PROXY
and HTTPS_PROXY environment variables. and HTTPS_PROXY environment variables.
keep_alive Use http keep_alive. keep_alive Use http keep_alive.
user Username for HTTP authentication user Username for HTTP authentication
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
Generates a interface class for a SOAP web service described by a WSDL Generates a interface class for a SOAP web service described by a WSDL
definition. definition.
The following classes are created: The following classes are created:
@@ -166,18 +168,25 @@ The following classes are created:
=item * A interface class for every SOAP port in service =item * A interface class for every SOAP port in service
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
object trees. object trees.
If the WSDL definition is incomplete, you may need to add some lines to If the WSDL definition is incomplete, you may need to add some lines to
your typemap. Especially definitions for faults are sometimes left out. your typemap. Especially definitions for faults are sometimes left out.
Additional typemap content may be included by passing a file name as Additional typemap content may be included by passing a file name as
typemap_include (mi) option. typemap_include (mi) option.
=item * A type class for every element, complexType or simpleType definition =item * A type class for every element, complexType or simpleType definition
@@ -185,7 +194,7 @@ typemap_include (mi) option.
You may need to write additional type classes if your WSDL is incomplete. You may need to write additional type classes if your WSDL is incomplete.
For writing your own lib classes, see L<SOAP::WSDL::XSD::Typelib::Element>, For writing your own lib classes, see L<SOAP::WSDL::XSD::Typelib::Element>,
L<SOAP::WSDL::XSD::Typelib::ComplexType> L<SOAP::WSDL::XSD::Typelib::ComplexType>
and L<SOAP::WSDL::XSD::Typelib::SimpleType>. and L<SOAP::WSDL::XSD::Typelib::SimpleType>.
=back =back
@@ -198,26 +207,26 @@ You need Crypt::SSLeay installed for accessing HTTPS URLs.
=head2 Accessing protected documents =head2 Accessing protected documents
Use the -u option for specifying the user name. You will be prompted for a Use the -u option for specifying the user name. You will be prompted for a
password. password.
Alternatively, you may specify a passowrd with --password on the command Alternatively, you may specify a passowrd with --password on the command
line. line.
=head2 Accessing documents protected by NTLM authentication =head2 Accessing documents protected by NTLM authentication
Set the --keep_alive option. Set the --keep_alive option.
Note that accessing documents protected by NTLM authentication is currently Note that accessing documents protected by NTLM authentication is currently
untested, because I have no access to a system using NTLM authentication. untested, because I have no access to a system using NTLM authentication.
If you try it, I would be glad if you could just drop me a note about If you try it, I would be glad if you could just drop me a note about
success or failure. success or failure.
=head1 LICENSE =head1 LICENSE
Copyright 2007 Martin Kutter. Copyright 2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself the same terms as perl itself
=head1 AUTHOR =head1 AUTHOR
+56
View File
@@ -0,0 +1,56 @@
#!/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
+84
View File
@@ -0,0 +1,84 @@
#!/usr/bin/perl -w
package main;
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 },
],
},
}
);
}
+29
View File
@@ -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;
+24
View File
@@ -0,0 +1,24 @@
#!/usr/bin/perl -w
use strict;
use warnings;
use lib 'lib'; # just needed because interface lies here
# I have to generate the interface using wsdl2perl.pl before
use MyInterfaces::HelloWorld::HelloWorldSoap;
# I instantiate a interface class.
my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new();
# I have to lookup the method and synopsis from the interface's pod
my $result = $soap->sayHello({
name => $ARGV[1] || '"Your name"',
givenName => $ARGV[0] || '"Your given name"',
});
# SOAP::WSDL::SOAP::Typelib::Fault11 objects are false, but serialize to XML
die $result if not $result;
# I have to lookup the output parameter from the interface's POD - or try:
# Will die on bad method names with a list of available methods
print $result->get_sayHelloResult(), "\n";
+25
View File
@@ -0,0 +1,25 @@
#!/usr/bin/perl -w
use strict;
use warnings;
use XML::Compile::WSDL11;
use XML::Compile::Transport::SOAPHTTP;
# I need access to the WSDL around - or use Data::Dumper::Streamer
# for serializing the generated closures into (big) perl files
my $wsdl = XML::Compile::WSDL11->new('wsdl/11_helloworld.wsdl');
# I compile a interface method for a single SOAP method from the WSDL
# I have to lookup the method names from the WSDL
my $call = $wsdl->compileClient('sayHello');
# I have to lookup the parameters from the WSDL - can be quite tricky
my $result = $call->(
name => $ARGV[1] || '"Your name"',
givenName => $ARGV[0] || '"Your given name"',
);
# XML::Compile::SOAP's client just returns undef in case of failure
die "Error calling soap method" if not defined $result;
# I have to lookup the output parameters from the WSDL - or try Data::Dumper
print $result->{ parameters }->{ sayHelloResult }, "\n";
+29
View File
@@ -0,0 +1,29 @@
#!/usr/bin/perl -w
#use strict;
use warnings;
use SOAP::Lite +trace;
# 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
$soap->default_ns('urn:HelloWorld');
# I have to encode all parameters as SOAP::Data objects
# I have to know the order of parameters
my $som = $soap->call(
"sayHello",
SOAP::Data->name('name')->value( $ARGV[1] || '"Your name"'),
SOAP::Data->name('givenName')->value( $ARGV[0] || '"Your given name"'),
);
die $som->fault->{ faultstring } if ($som->fault);
print $som->result, "\n";
+3 -3
View File
@@ -13,8 +13,8 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
@@ -44,7 +44,7 @@ CountCookies from the namespace http://www.fullerdata.com/FortuneCookie/FortuneC
Constructor. The following data structure may be passed to new(): Constructor. The following data structure may be passed to new():
,
=head1 AUTHOR =head1 AUTHOR
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
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
my %CountCookiesResult_of :ATTR(:get<CountCookiesResult>); my %CountCookiesResult_of :ATTR(:get<CountCookiesResult>);
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
[ qw( [ qw(
CountCookiesResult CountCookiesResult
) ], ) ],
{ {
CountCookiesResult => \%CountCookiesResult_of, CountCookiesResult => \%CountCookiesResult_of,
}, },
{ {
CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int', CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{ {
CountCookiesResult => $some_value, # int CountCookiesResult => $some_value, # int
} },
=head1 AUTHOR =head1 AUTHOR
+8 -6
View File
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
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
my %BarCodeParam_of :ATTR(:get<BarCodeParam>); my %BarCodeParam_of :ATTR(:get<BarCodeParam>);
@@ -29,9 +31,9 @@ __PACKAGE__->_factory(
BarCodeParam BarCodeParam
BarCodeText BarCodeText
) ], ) ],
{ {
BarCodeParam => \%BarCodeParam_of, BarCodeParam => \%BarCodeParam_of,
BarCodeText => \%BarCodeText_of, BarCodeText => \%BarCodeText_of,
}, },
{ {
BarCodeParam => 'MyTypes::BarCodeData', BarCodeParam => 'MyTypes::BarCodeData',
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
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
my %GenerateBarCodeResult_of :ATTR(:get<GenerateBarCodeResult>); my %GenerateBarCodeResult_of :ATTR(:get<GenerateBarCodeResult>);
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
[ qw( [ qw(
GenerateBarCodeResult GenerateBarCodeResult
) ], ) ],
{ {
GenerateBarCodeResult => \%GenerateBarCodeResult_of, GenerateBarCodeResult => \%GenerateBarCodeResult_of,
}, },
{ {
GenerateBarCodeResult => 'SOAP::WSDL::XSD::Typelib::Builtin::base64Binary', GenerateBarCodeResult => 'SOAP::WSDL::XSD::Typelib::Builtin::base64Binary',
+8 -6
View File
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
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
my %CountryName_of :ATTR(:get<CountryName>); my %CountryName_of :ATTR(:get<CountryName>);
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
[ qw( [ qw(
CountryName CountryName
) ], ) ],
{ {
CountryName => \%CountryName_of, CountryName => \%CountryName_of,
}, },
{ {
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string', CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{ {
CountryName => $some_value, # string CountryName => $some_value, # string
} },
=head1 AUTHOR =head1 AUTHOR
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
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
my %GetCitiesByCountryResult_of :ATTR(:get<GetCitiesByCountryResult>); my %GetCitiesByCountryResult_of :ATTR(:get<GetCitiesByCountryResult>);
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
[ qw( [ qw(
GetCitiesByCountryResult GetCitiesByCountryResult
) ], ) ],
{ {
GetCitiesByCountryResult => \%GetCitiesByCountryResult_of, GetCitiesByCountryResult => \%GetCitiesByCountryResult_of,
}, },
{ {
GetCitiesByCountryResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', GetCitiesByCountryResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{ {
GetCitiesByCountryResult => $some_value, # string GetCitiesByCountryResult => $some_value, # string
} },
=head1 AUTHOR =head1 AUTHOR
+3 -3
View File
@@ -13,8 +13,8 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
@@ -44,7 +44,7 @@ GetFortuneCookie from the namespace http://www.fullerdata.com/FortuneCookie/Fort
Constructor. The following data structure may be passed to new(): Constructor. The following data structure may be passed to new():
,
=head1 AUTHOR =head1 AUTHOR
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
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
my %GetFortuneCookieResult_of :ATTR(:get<GetFortuneCookieResult>); my %GetFortuneCookieResult_of :ATTR(:get<GetFortuneCookieResult>);
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
[ qw( [ qw(
GetFortuneCookieResult GetFortuneCookieResult
) ], ) ],
{ {
GetFortuneCookieResult => \%GetFortuneCookieResult_of, GetFortuneCookieResult => \%GetFortuneCookieResult_of,
}, },
{ {
GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{ {
GetFortuneCookieResult => $some_value, # string GetFortuneCookieResult => $some_value, # string
} },
=head1 AUTHOR =head1 AUTHOR
+8 -6
View File
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
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
my %index_of :ATTR(:get<index>); my %index_of :ATTR(:get<index>);
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
[ qw( [ qw(
index index
) ], ) ],
{ {
index => \%index_of, index => \%index_of,
}, },
{ {
index => 'SOAP::WSDL::XSD::Typelib::Builtin::int', index => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{ {
index => $some_value, # int index => $some_value, # int
} },
=head1 AUTHOR =head1 AUTHOR
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
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
my %GetSpecificCookieResult_of :ATTR(:get<GetSpecificCookieResult>); my %GetSpecificCookieResult_of :ATTR(:get<GetSpecificCookieResult>);
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
[ qw( [ qw(
GetSpecificCookieResult GetSpecificCookieResult
) ], ) ],
{ {
GetSpecificCookieResult => \%GetSpecificCookieResult_of, GetSpecificCookieResult => \%GetSpecificCookieResult_of,
}, },
{ {
GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{ {
GetSpecificCookieResult => $some_value, # string GetSpecificCookieResult => $some_value, # string
} },
=head1 AUTHOR =head1 AUTHOR
+9 -7
View File
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
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
my %CityName_of :ATTR(:get<CityName>); my %CityName_of :ATTR(:get<CityName>);
@@ -29,9 +31,9 @@ __PACKAGE__->_factory(
CityName CityName
CountryName CountryName
) ], ) ],
{ {
CityName => \%CityName_of, CityName => \%CityName_of,
CountryName => \%CountryName_of, CountryName => \%CountryName_of,
}, },
{ {
CityName => 'SOAP::WSDL::XSD::Typelib::Builtin::string', CityName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -74,7 +76,7 @@ Constructor. The following data structure may be passed to new():
{ {
CityName => $some_value, # string CityName => $some_value, # string
CountryName => $some_value, # string CountryName => $some_value, # string
} },
=head1 AUTHOR =head1 AUTHOR
+8 -6
View File
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
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
my %GetWeatherResult_of :ATTR(:get<GetWeatherResult>); my %GetWeatherResult_of :ATTR(:get<GetWeatherResult>);
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
[ qw( [ qw(
GetWeatherResult GetWeatherResult
) ], ) ],
{ {
GetWeatherResult => \%GetWeatherResult_of, GetWeatherResult => \%GetWeatherResult_of,
}, },
{ {
GetWeatherResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', GetWeatherResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{ {
GetWeatherResult => $some_value, # string GetWeatherResult => $some_value, # string
} },
=head1 AUTHOR =head1 AUTHOR
+111
View File
@@ -0,0 +1,111 @@
package MyElements::ListPerson;
use strict;
use warnings;
{ # BLOCK to scope variables
sub get_xmlns { 'http://www.example.org/benchmark/' }
__PACKAGE__->__set_name('ListPerson');
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %in_of :ATTR(:get<in>);
__PACKAGE__->_factory(
[ qw(
in
) ],
{
in => \%in_of,
},
{
in => 'MyTypes::Person',
}
);
} # end BLOCK
} # end of BLOCK
1;
# __END__
=pod
=head1 NAME
MyElements::ListPerson
=head1 DESCRIPTION
Perl data type class for the XML Schema defined element
ListPerson from the namespace http://www.example.org/benchmark/.
=head1 METHODS
=head2 new
my $element = MyElements::ListPerson->new($data);
Constructor. The following data structure may be passed to new():
{
in => { # MyTypes::Person
PersonID => { # MyTypes::PersonID
ID => $some_value, # int
},
Salutation => $some_value, # string
Name => $some_value, # string
GivenName => $some_value, # string
DateOfBirth => $some_value, # date
HomeAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
WorkAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
Contracts => { # MyTypes::ArrayOfContract
Contract => { # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
},
},
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
@@ -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
+2 -2
View File
@@ -12,8 +12,8 @@ __PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs(); __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::Builtin::int SOAP::WSDL::XSD::Typelib::Builtin::int
); );
+3 -3
View File
@@ -13,8 +13,8 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
@@ -44,7 +44,7 @@ readNodeCount from the namespace http://www.fullerdata.com/FortuneCookie/Fortune
Constructor. The following data structure may be passed to new(): Constructor. The following data structure may be passed to new():
,
=head1 AUTHOR =head1 AUTHOR
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
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
my %readNodeCountResult_of :ATTR(:get<readNodeCountResult>); my %readNodeCountResult_of :ATTR(:get<readNodeCountResult>);
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
[ qw( [ qw(
readNodeCountResult readNodeCountResult
) ], ) ],
{ {
readNodeCountResult => \%readNodeCountResult_of, readNodeCountResult => \%readNodeCountResult_of,
}, },
{ {
readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int', readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{ {
readNodeCountResult => $some_value, # int readNodeCountResult => $some_value, # int
} },
=head1 AUTHOR =head1 AUTHOR
+86
View File
@@ -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
+2 -2
View File
@@ -12,8 +12,8 @@ __PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs(); __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::Builtin::string SOAP::WSDL::XSD::Typelib::Builtin::string
); );
@@ -0,0 +1,135 @@
package MyInterfaces::BarCode::BarCodeSoap;
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::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) = @_;
die "GenerateBarCode must be called as object method (\$self is <$self>)" if not blessed($self);
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 Sun Dec 16 20:10:20 2007
=pod
@@ -1,12 +1,13 @@
package MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap; package MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap;
use strict; use strict;
use warnings; use warnings;
use Class::Std::Storable; use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base); use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before # only load if it hasn't been loaded before
require MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie require MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie
if not MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie->can('get_class'); if not MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie->can('get_class');
sub START { sub START {
$_[0]->set_proxy('http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx') if not $_[2]->{proxy}; $_[0]->set_proxy('http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx') if not $_[2]->{proxy};
@@ -16,11 +17,12 @@ sub START {
sub readNodeCount { sub readNodeCount {
my ($self, $body, $header) = @_; my ($self, $body, $header) = @_;
die "readNodeCount must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({ return $self->SUPER::call({
operation => 'readNodeCount', operation => 'readNodeCount',
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/readNodeCount', soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/readNodeCount',
style => 'document', style => 'document',
body => { body => {
'use' => 'literal', 'use' => 'literal',
namespace => '', namespace => '',
@@ -38,11 +40,12 @@ sub readNodeCount {
sub GetFortuneCookie { sub GetFortuneCookie {
my ($self, $body, $header) = @_; my ($self, $body, $header) = @_;
die "GetFortuneCookie must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({ return $self->SUPER::call({
operation => 'GetFortuneCookie', operation => 'GetFortuneCookie',
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetFortuneCookie', soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetFortuneCookie',
style => 'document', style => 'document',
body => { body => {
'use' => 'literal', 'use' => 'literal',
namespace => '', namespace => '',
@@ -60,11 +63,12 @@ sub GetFortuneCookie {
sub CountCookies { sub CountCookies {
my ($self, $body, $header) = @_; my ($self, $body, $header) = @_;
die "CountCookies must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({ return $self->SUPER::call({
operation => 'CountCookies', operation => 'CountCookies',
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/CountCookies', soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/CountCookies',
style => 'document', style => 'document',
body => { body => {
'use' => 'literal', 'use' => 'literal',
namespace => '', namespace => '',
@@ -82,11 +86,12 @@ sub CountCookies {
sub GetSpecificCookie { sub GetSpecificCookie {
my ($self, $body, $header) = @_; my ($self, $body, $header) = @_;
die "GetSpecificCookie must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({ return $self->SUPER::call({
operation => 'GetSpecificCookie', operation => 'GetSpecificCookie',
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetSpecificCookie', soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetSpecificCookie',
style => 'document', style => 'document',
body => { body => {
'use' => 'literal', 'use' => 'literal',
namespace => '', namespace => '',
@@ -117,9 +122,22 @@ __END__
MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap - SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie Web Service MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap - SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie Web Service
=head1 SYNOPSIS
use MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap;
my $interface = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap->new();
my $response;
$response = $interface->readNodeCount();
$response = $interface->GetFortuneCookie();
$response = $interface->CountCookies();
$response = $interface->GetSpecificCookie();
=head1 DESCRIPTION =head1 DESCRIPTION
SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie web service SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie web service
located at http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx. located at http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
=head1 SERVICE FullerData_x0020_Fortune_x0020_Cookie =head1 SERVICE FullerData_x0020_Fortune_x0020_Cookie
@@ -142,12 +160,12 @@ All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
=head2 SOAP Service methods =head2 SOAP Service methods
Method synopsis is displayed with hash refs as parameters. Method synopsis is displayed with hash refs as parameters.
The commented class names in the method's parameters denote that objects The commented class names in the method's parameters denote that objects
of the corresponding class can be passed instead of the marked hash ref. of the corresponding class can be passed instead of the marked hash ref.
You may pass any combination of objects, hash and list refs to these You may pass any combination of objects, hash and list refs to these
methods, as long as you meet the structure. methods, as long as you meet the structure.
@@ -156,21 +174,21 @@ methods, as long as you meet the structure.
Display the number of nodes specified in fortune XML document Display the number of nodes specified in fortune XML document
$interface->readNodeCount(, $interface->readNodeCount(,,
); );
=head3 GetFortuneCookie =head3 GetFortuneCookie
Get a random fortune cookie from the XML document Get a random fortune cookie from the XML document
$interface->GetFortuneCookie(, $interface->GetFortuneCookie(,,
); );
=head3 CountCookies =head3 CountCookies
Count the actual number of nodes in the XML document of fortunes Count the actual number of nodes in the XML document of fortunes
$interface->CountCookies(, $interface->CountCookies(,,
); );
=head3 GetSpecificCookie =head3 GetSpecificCookie
@@ -179,13 +197,13 @@ Get a specific cookie by the XML node number
$interface->GetSpecificCookie( { $interface->GetSpecificCookie( {
index => $some_value, # int index => $some_value, # int
}, },,
); );
=head1 AUTHOR =head1 AUTHOR
Generated by SOAP::WSDL on Tue Nov 6 20:56:46 2007 Generated by SOAP::WSDL on Sun Dec 16 19:58:30 2007
=pod =pod
@@ -1,12 +1,13 @@
package MyInterfaces::GlobalWeather::GlobalWeatherSoap; package MyInterfaces::GlobalWeather::GlobalWeatherSoap;
use strict; use strict;
use warnings; use warnings;
use Class::Std::Storable; use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base); use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before # only load if it hasn't been loaded before
require MyTypemaps::GlobalWeather require MyTypemaps::GlobalWeather
if not MyTypemaps::GlobalWeather->can('get_class'); if not MyTypemaps::GlobalWeather->can('get_class');
sub START { sub START {
$_[0]->set_proxy('http://www.webservicex.net/globalweather.asmx') if not $_[2]->{proxy}; $_[0]->set_proxy('http://www.webservicex.net/globalweather.asmx') if not $_[2]->{proxy};
@@ -16,11 +17,12 @@ sub START {
sub GetWeather { sub GetWeather {
my ($self, $body, $header) = @_; my ($self, $body, $header) = @_;
die "GetWeather must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({ return $self->SUPER::call({
operation => 'GetWeather', operation => 'GetWeather',
soap_action => 'http://www.webserviceX.NET/GetWeather', soap_action => 'http://www.webserviceX.NET/GetWeather',
style => 'document', style => 'document',
body => { body => {
'use' => 'literal', 'use' => 'literal',
namespace => '', namespace => '',
@@ -38,11 +40,12 @@ sub GetWeather {
sub GetCitiesByCountry { sub GetCitiesByCountry {
my ($self, $body, $header) = @_; my ($self, $body, $header) = @_;
die "GetCitiesByCountry must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({ return $self->SUPER::call({
operation => 'GetCitiesByCountry', operation => 'GetCitiesByCountry',
soap_action => 'http://www.webserviceX.NET/GetCitiesByCountry', soap_action => 'http://www.webserviceX.NET/GetCitiesByCountry',
style => 'document', style => 'document',
body => { body => {
'use' => 'literal', 'use' => 'literal',
namespace => '', namespace => '',
@@ -73,9 +76,20 @@ __END__
MyInterfaces::GlobalWeather::GlobalWeatherSoap - SOAP Interface for the GlobalWeather Web Service MyInterfaces::GlobalWeather::GlobalWeatherSoap - SOAP Interface for the GlobalWeather Web Service
=head1 SYNOPSIS
use MyInterfaces::GlobalWeather::GlobalWeatherSoap;
my $interface = MyInterfaces::GlobalWeather::GlobalWeatherSoap->new();
my $response;
$response = $interface->GetWeather();
$response = $interface->GetCitiesByCountry();
=head1 DESCRIPTION =head1 DESCRIPTION
SOAP Interface for the GlobalWeather web service SOAP Interface for the GlobalWeather web service
located at http://www.webservicex.net/globalweather.asmx. located at http://www.webservicex.net/globalweather.asmx.
=head1 SERVICE GlobalWeather =head1 SERVICE GlobalWeather
@@ -98,12 +112,12 @@ All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
=head2 SOAP Service methods =head2 SOAP Service methods
Method synopsis is displayed with hash refs as parameters. Method synopsis is displayed with hash refs as parameters.
The commented class names in the method's parameters denote that objects The commented class names in the method's parameters denote that objects
of the corresponding class can be passed instead of the marked hash ref. of the corresponding class can be passed instead of the marked hash ref.
You may pass any combination of objects, hash and list refs to these You may pass any combination of objects, hash and list refs to these
methods, as long as you meet the structure. methods, as long as you meet the structure.
@@ -115,7 +129,7 @@ Get weather report for all major cities around the world.
$interface->GetWeather( { $interface->GetWeather( {
CityName => $some_value, # string CityName => $some_value, # string
CountryName => $some_value, # string CountryName => $some_value, # string
}, },,
); );
=head3 GetCitiesByCountry =head3 GetCitiesByCountry
@@ -124,13 +138,13 @@ Get all major cities by country name(full / part).
$interface->GetCitiesByCountry( { $interface->GetCitiesByCountry( {
CountryName => $some_value, # string CountryName => $some_value, # string
}, },,
); );
=head1 AUTHOR =head1 AUTHOR
Generated by SOAP::WSDL on Tue Nov 6 21:00:30 2007 Generated by SOAP::WSDL on Sun Dec 16 20:05:01 2007
=pod =pod
@@ -0,0 +1,113 @@
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
+61
View File
@@ -0,0 +1,61 @@
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/Angle' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'GenerateBarCode/BarCodeParam/Width' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
'GenerateBarCode/BarCodeParam/BarCodeImageFormat' => 'MyTypes::ImageFormats',
'GenerateBarCode/BarCodeParam/BGColor' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'GenerateBarCode/BarCodeParam/Ratio' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
'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/showTextPosition' => 'MyTypes::ShowTextPosition',
'GenerateBarCode/BarCodeParam' => 'MyTypes::BarCodeData',
'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 };
}
sub get_typemap {
return $typemap_1;
}
1;
__END__
=pod
=head1 NAME
MyTypemaps::BarCode; - typemap for ::BarCode;
=head1 DESCRIPTION
Typemap created by SOAP::WSDL for map-based SOAP message parsers.
=cut
@@ -13,7 +13,7 @@ our $typemap_1 = {
'GetFortuneCookieResponse' => 'MyElements::GetFortuneCookieResponse', 'GetFortuneCookieResponse' => 'MyElements::GetFortuneCookieResponse',
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11', 'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
'GetSpecificCookie' => 'MyElements::GetSpecificCookie', 'GetSpecificCookie' => 'MyElements::GetSpecificCookie',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN', 'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
'CountCookies' => 'MyElements::CountCookies', 'CountCookies' => 'MyElements::CountCookies',
'GetSpecificCookie/index' => 'SOAP::WSDL::XSD::Typelib::Builtin::int', 'GetSpecificCookie/index' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -24,12 +24,16 @@ our $typemap_1 = {
}; };
; ;
sub get_class { sub get_class {
my $name = join '/', @{ $_[1] }; my $name = join '/', @{ $_[1] };
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__; exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
return $typemap_1->{ $name }; return $typemap_1->{ $name };
} }
sub get_typemap {
return $typemap_1;
}
1; 1;
__END__ __END__
+6 -2
View File
@@ -6,7 +6,7 @@ our $typemap_1 = {
'GetWeatherResponse/GetWeatherResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'GetWeatherResponse/GetWeatherResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'GetWeather' => 'MyElements::GetWeather', 'GetWeather' => 'MyElements::GetWeather',
'GetCitiesByCountryResponse/GetCitiesByCountryResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'GetCitiesByCountryResponse/GetCitiesByCountryResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN', 'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
'GetWeatherResponse' => 'MyElements::GetWeatherResponse', 'GetWeatherResponse' => 'MyElements::GetWeatherResponse',
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI', 'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
@@ -20,12 +20,16 @@ our $typemap_1 = {
}; };
; ;
sub get_class { sub get_class {
my $name = join '/', @{ $_[1] }; my $name = join '/', @{ $_[1] };
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__; exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
return $typemap_1->{ $name }; return $typemap_1->{ $name };
} }
sub get_typemap {
return $typemap_1;
}
1; 1;
__END__ __END__
+44
View File
@@ -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
+92
View File
@@ -0,0 +1,92 @@
package MyTypemaps::TestService;
use strict;
use warnings;
our $typemap_1 = {
'ListPersonResponse/out/NewElement/WorkAddress/Street' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/Contracts' => 'MyTypes::ArrayOfContract',
'ListPerson/in/HomeAddress/PhoneNumber' => 'MyTypes::PhoneNumber',
'ListPersonResponse/out/NewElement/HomeAddress' => 'MyTypes::Address',
'ListPersonResponse/out/NewElement/Contracts/Contract' => 'MyTypes::Contract',
'ListPersonResponse/out/NewElement/HomeAddress/ZIP' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/WorkAddress/City' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/HomeAddress' => 'MyTypes::Address',
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
'ListPerson/in/HomeAddress/City' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/WorkAddress/PhoneNumber' => 'MyTypes::PhoneNumber',
'ListPerson/in/WorkAddress/ZIP' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/Contracts' => 'MyTypes::ArrayOfContract',
'ListPerson/in/WorkAddress/Street' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in' => 'MyTypes::Person',
'ListPersonResponse/out/NewElement/GivenName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/HomeAddress/PhoneNumber' => 'MyTypes::PhoneNumber',
'ListPersonResponse/out/NewElement/HomeAddress/City' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement' => 'MyTypes::Person',
'ListPerson/in/PersonID/ID' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'ListPerson/in/HomeAddress/Street' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/PersonID/ID' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'ListPerson/in/HomeAddress/Country' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/GivenName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/HomeAddress/MobilePhoneNumber' => 'MyTypes::PhoneNumber',
'ListPerson/in/Name' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/PersonID' => 'MyTypes::PersonID',
'ListPersonResponse/out/NewElement/WorkAddress/MobilePhoneNumber' => 'MyTypes::PhoneNumber',
'ListPersonResponse/out' => 'MyTypes::ArrayOfPerson',
'ListPerson/in/Contracts/Contract' => 'MyTypes::Contract',
'ListPersonResponse/out/NewElement/Name' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/WorkAddress/ZIP' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/DateOfBirth' => 'SOAP::WSDL::XSD::Typelib::Builtin::date',
'ListPersonResponse/out/NewElement/HomeAddress/MobilePhoneNumber' => 'MyTypes::PhoneNumber',
'ListPersonResponse/out/NewElement/HomeAddress/Country' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/HomeAddress/Street' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/Contracts/Contract/ContractName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
'ListPerson/in/Contracts/Contract/ContractName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse' => 'MyElements::ListPersonResponse',
'ListPersonResponse/out/NewElement/Salutation' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/WorkAddress/City' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
'ListPerson' => 'MyElements::ListPerson',
'ListPerson/in/Salutation' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/WorkAddress/MobilePhoneNumber' => 'MyTypes::PhoneNumber',
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/WorkAddress/Country' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/PersonID' => 'MyTypes::PersonID',
'ListPerson/in/HomeAddress/ZIP' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/WorkAddress' => 'MyTypes::Address',
'ListPersonResponse/out/NewElement/DateOfBirth' => 'SOAP::WSDL::XSD::Typelib::Builtin::date',
'ListPerson/in/WorkAddress/PhoneNumber' => 'MyTypes::PhoneNumber',
'ListPersonResponse/out/NewElement/WorkAddress/Country' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/Contracts/Contract/ContractID' => 'SOAP::WSDL::XSD::Typelib::Builtin::long',
'ListPerson/in/Contracts/Contract/ContractID' => 'SOAP::WSDL::XSD::Typelib::Builtin::long',
'ListPerson/in/WorkAddress' => 'MyTypes::Address'
};
;
sub get_class {
my $name = join '/', @{ $_[1] };
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
return $typemap_1->{ $name };
}
sub get_typemap {
return $typemap_1;
}
1;
__END__
=pod
=head1 NAME
MyTypemaps::TestService; - typemap for ::TestService;
=head1 DESCRIPTION
Typemap created by SOAP::WSDL for map-based SOAP message parsers.
=cut
+98
View File
@@ -0,0 +1,98 @@
package MyTypes::Address;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %Street_of :ATTR(:get<Street>);
my %ZIP_of :ATTR(:get<ZIP>);
my %City_of :ATTR(:get<City>);
my %Country_of :ATTR(:get<Country>);
my %PhoneNumber_of :ATTR(:get<PhoneNumber>);
my %MobilePhoneNumber_of :ATTR(:get<MobilePhoneNumber>);
__PACKAGE__->_factory(
[ qw(
Street
ZIP
City
Country
PhoneNumber
MobilePhoneNumber
) ],
{
Street => \%Street_of,
ZIP => \%ZIP_of,
City => \%City_of,
Country => \%Country_of,
PhoneNumber => \%PhoneNumber_of,
MobilePhoneNumber => \%MobilePhoneNumber_of,
},
{
Street => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
ZIP => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
City => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
Country => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
PhoneNumber => 'MyTypes::PhoneNumber',
MobilePhoneNumber => 'MyTypes::PhoneNumber',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::Address
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
Address from the namespace http://www.example.org/benchmark/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
Street
ZIP
City
Country
PhoneNumber
MobilePhoneNumber
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+71
View File
@@ -0,0 +1,71 @@
package MyTypes::ArrayOfContract;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %Contract_of :ATTR(:get<Contract>);
__PACKAGE__->_factory(
[ qw(
Contract
) ],
{
Contract => \%Contract_of,
},
{
Contract => 'MyTypes::Contract',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::ArrayOfContract
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
ArrayOfContract from the namespace http://www.example.org/benchmark/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
Contract
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::ArrayOfContract
Contract => { # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+98
View File
@@ -0,0 +1,98 @@
package MyTypes::ArrayOfPerson;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %NewElement_of :ATTR(:get<NewElement>);
__PACKAGE__->_factory(
[ qw(
NewElement
) ],
{
NewElement => \%NewElement_of,
},
{
NewElement => 'MyTypes::Person',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::ArrayOfPerson
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
ArrayOfPerson from the namespace http://www.example.org/benchmark/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
NewElement
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::ArrayOfPerson
NewElement => { # MyTypes::Person
PersonID => { # MyTypes::PersonID
ID => $some_value, # int
},
Salutation => $some_value, # string
Name => $some_value, # string
GivenName => $some_value, # string
DateOfBirth => $some_value, # date
HomeAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
WorkAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
Contracts => { # MyTypes::ArrayOfContract
Contract => { # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
},
},
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+164
View File
@@ -0,0 +1,164 @@
package MyTypes::BarCodeData;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %Height_of :ATTR(:get<Height>);
my %Width_of :ATTR(:get<Width>);
my %Angle_of :ATTR(:get<Angle>);
my %Ratio_of :ATTR(:get<Ratio>);
my %Module_of :ATTR(:get<Module>);
my %Left_of :ATTR(:get<Left>);
my %Top_of :ATTR(:get<Top>);
my %CheckSum_of :ATTR(:get<CheckSum>);
my %FontName_of :ATTR(:get<FontName>);
my %BarColor_of :ATTR(:get<BarColor>);
my %BGColor_of :ATTR(:get<BGColor>);
my %FontSize_of :ATTR(:get<FontSize>);
my %barcodeOption_of :ATTR(:get<barcodeOption>);
my %barcodeType_of :ATTR(:get<barcodeType>);
my %checkSumMethod_of :ATTR(:get<checkSumMethod>);
my %showTextPosition_of :ATTR(:get<showTextPosition>);
my %BarCodeImageFormat_of :ATTR(:get<BarCodeImageFormat>);
__PACKAGE__->_factory(
[ qw(
Height
Width
Angle
Ratio
Module
Left
Top
CheckSum
FontName
BarColor
BGColor
FontSize
barcodeOption
barcodeType
checkSumMethod
showTextPosition
BarCodeImageFormat
) ],
{
Height => \%Height_of,
Width => \%Width_of,
Angle => \%Angle_of,
Ratio => \%Ratio_of,
Module => \%Module_of,
Left => \%Left_of,
Top => \%Top_of,
CheckSum => \%CheckSum_of,
FontName => \%FontName_of,
BarColor => \%BarColor_of,
BGColor => \%BGColor_of,
FontSize => \%FontSize_of,
barcodeOption => \%barcodeOption_of,
barcodeType => \%barcodeType_of,
checkSumMethod => \%checkSumMethod_of,
showTextPosition => \%showTextPosition_of,
BarCodeImageFormat => \%BarCodeImageFormat_of,
},
{
Height => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
Width => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
Angle => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
Ratio => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
Module => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
Left => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
Top => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
CheckSum => 'SOAP::WSDL::XSD::Typelib::Builtin::boolean',
FontName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
BarColor => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
BGColor => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
FontSize => 'SOAP::WSDL::XSD::Typelib::Builtin::float',
barcodeOption => 'MyTypes::BarcodeOption',
barcodeType => 'MyTypes::BarcodeType',
checkSumMethod => 'MyTypes::CheckSumMethod',
showTextPosition => 'MyTypes::ShowTextPosition',
BarCodeImageFormat => 'MyTypes::ImageFormats',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::BarCodeData
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
BarCodeData from the namespace http://www.webservicex.net/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
Height
Width
Angle
Ratio
Module
Left
Top
CheckSum
FontName
BarColor
BGColor
FontSize
barcodeOption
barcodeType
checkSumMethod
showTextPosition
BarCodeImageFormat
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::BarCodeData
Height => $some_value, # int
Width => $some_value, # int
Angle => $some_value, # int
Ratio => $some_value, # int
Module => $some_value, # int
Left => $some_value, # int
Top => $some_value, # int
CheckSum => $some_value, # boolean
FontName => $some_value, # string
BarColor => $some_value, # string
BGColor => $some_value, # string
FontSize => $some_value, # float
barcodeOption => $some_value, # BarcodeOption
barcodeType => $some_value, # BarcodeType
checkSumMethod => $some_value, # CheckSumMethod
showTextPosition => $some_value, # ShowTextPosition
BarCodeImageFormat => $some_value, # ImageFormats
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+56
View File
@@ -0,0 +1,56 @@
package MyTypes::BarcodeOption;
use strict;
use warnings;
sub get_xmlns { 'http://www.webservicex.net/'};
# derivation by restriction
use base qw(
SOAP::WSDL::XSD::Typelib::Builtin::string
);
1;
=pod
=head1 MyTypes::BarcodeOption
=head1 DESCRIPTION
Perl data type class for the XML Schema defined simpleType
BarcodeOption from the namespace http://www.webservicex.net/.
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
like it's base type.
# Description of restrictions not implemented yet.
=head1 METHODS
=head2 new
Constructor.
=head2 get_value / set_value
Getter and setter for the simpleType's value.
=head1 OVERLOADING
Depending on the simple type's base type, the following operations are overloaded
Stringification
Numerification
Boolification
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+56
View File
@@ -0,0 +1,56 @@
package MyTypes::BarcodeType;
use strict;
use warnings;
sub get_xmlns { 'http://www.webservicex.net/'};
# derivation by restriction
use base qw(
SOAP::WSDL::XSD::Typelib::Builtin::string
);
1;
=pod
=head1 MyTypes::BarcodeType
=head1 DESCRIPTION
Perl data type class for the XML Schema defined simpleType
BarcodeType from the namespace http://www.webservicex.net/.
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
like it's base type.
# Description of restrictions not implemented yet.
=head1 METHODS
=head2 new
Constructor.
=head2 get_value / set_value
Getter and setter for the simpleType's value.
=head1 OVERLOADING
Depending on the simple type's base type, the following operations are overloaded
Stringification
Numerification
Boolification
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+56
View File
@@ -0,0 +1,56 @@
package MyTypes::CheckSumMethod;
use strict;
use warnings;
sub get_xmlns { 'http://www.webservicex.net/'};
# derivation by restriction
use base qw(
SOAP::WSDL::XSD::Typelib::Builtin::string
);
1;
=pod
=head1 MyTypes::CheckSumMethod
=head1 DESCRIPTION
Perl data type class for the XML Schema defined simpleType
CheckSumMethod from the namespace http://www.webservicex.net/.
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
like it's base type.
# Description of restrictions not implemented yet.
=head1 METHODS
=head2 new
Constructor.
=head2 get_value / set_value
Getter and setter for the simpleType's value.
=head1 OVERLOADING
Depending on the simple type's base type, the following operations are overloaded
Stringification
Numerification
Boolification
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+74
View File
@@ -0,0 +1,74 @@
package MyTypes::Contract;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %ContractID_of :ATTR(:get<ContractID>);
my %ContractName_of :ATTR(:get<ContractName>);
__PACKAGE__->_factory(
[ qw(
ContractID
ContractName
) ],
{
ContractID => \%ContractID_of,
ContractName => \%ContractName_of,
},
{
ContractID => 'SOAP::WSDL::XSD::Typelib::Builtin::long',
ContractName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::Contract
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
Contract from the namespace http://www.example.org/benchmark/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
ContractID
ContractName
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+56
View File
@@ -0,0 +1,56 @@
package MyTypes::ImageFormats;
use strict;
use warnings;
sub get_xmlns { 'http://www.webservicex.net/'};
# derivation by restriction
use base qw(
SOAP::WSDL::XSD::Typelib::Builtin::string
);
1;
=pod
=head1 MyTypes::ImageFormats
=head1 DESCRIPTION
Perl data type class for the XML Schema defined simpleType
ImageFormats from the namespace http://www.webservicex.net/.
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
like it's base type.
# Description of restrictions not implemented yet.
=head1 METHODS
=head2 new
Constructor.
=head2 get_value / set_value
Getter and setter for the simpleType's value.
=head1 OVERLOADING
Depending on the simple type's base type, the following operations are overloaded
Stringification
Numerification
Boolification
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+131
View File
@@ -0,0 +1,131 @@
package MyTypes::Person;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %PersonID_of :ATTR(:get<PersonID>);
my %Salutation_of :ATTR(:get<Salutation>);
my %Name_of :ATTR(:get<Name>);
my %GivenName_of :ATTR(:get<GivenName>);
my %DateOfBirth_of :ATTR(:get<DateOfBirth>);
my %HomeAddress_of :ATTR(:get<HomeAddress>);
my %WorkAddress_of :ATTR(:get<WorkAddress>);
my %Contracts_of :ATTR(:get<Contracts>);
__PACKAGE__->_factory(
[ qw(
PersonID
Salutation
Name
GivenName
DateOfBirth
HomeAddress
WorkAddress
Contracts
) ],
{
PersonID => \%PersonID_of,
Salutation => \%Salutation_of,
Name => \%Name_of,
GivenName => \%GivenName_of,
DateOfBirth => \%DateOfBirth_of,
HomeAddress => \%HomeAddress_of,
WorkAddress => \%WorkAddress_of,
Contracts => \%Contracts_of,
},
{
PersonID => 'MyTypes::PersonID',
Salutation => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
Name => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
GivenName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
DateOfBirth => 'SOAP::WSDL::XSD::Typelib::Builtin::date',
HomeAddress => 'MyTypes::Address',
WorkAddress => 'MyTypes::Address',
Contracts => 'MyTypes::ArrayOfContract',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::Person
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
Person from the namespace http://www.example.org/benchmark/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
PersonID
Salutation
Name
GivenName
DateOfBirth
HomeAddress
WorkAddress
Contracts
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::Person
PersonID => { # MyTypes::PersonID
ID => $some_value, # int
},
Salutation => $some_value, # string
Name => $some_value, # string
GivenName => $some_value, # string
DateOfBirth => $some_value, # date
HomeAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
WorkAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
Contracts => { # MyTypes::ArrayOfContract
Contract => { # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
},
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+68
View File
@@ -0,0 +1,68 @@
package MyTypes::PersonID;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %ID_of :ATTR(:get<ID>);
__PACKAGE__->_factory(
[ qw(
ID
) ],
{
ID => \%ID_of,
},
{
ID => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::PersonID
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
PersonID from the namespace http://www.example.org/benchmark/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
ID
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::PersonID
ID => $some_value, # int
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+56
View File
@@ -0,0 +1,56 @@
package MyTypes::PhoneNumber;
use strict;
use warnings;
sub get_xmlns { 'http://www.example.org/benchmark/'};
# derivation by restriction
use base qw(
SOAP::WSDL::XSD::Typelib::Builtin::string
);
1;
=pod
=head1 MyTypes::PhoneNumber
=head1 DESCRIPTION
Perl data type class for the XML Schema defined simpleType
PhoneNumber from the namespace http://www.example.org/benchmark/.
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
like it's base type.
# Description of restrictions not implemented yet.
=head1 METHODS
=head2 new
Constructor.
=head2 get_value / set_value
Getter and setter for the simpleType's value.
=head1 OVERLOADING
Depending on the simple type's base type, the following operations are overloaded
Stringification
Numerification
Boolification
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+56
View File
@@ -0,0 +1,56 @@
package MyTypes::ShowTextPosition;
use strict;
use warnings;
sub get_xmlns { 'http://www.webservicex.net/'};
# derivation by restriction
use base qw(
SOAP::WSDL::XSD::Typelib::Builtin::string
);
1;
=pod
=head1 MyTypes::ShowTextPosition
=head1 DESCRIPTION
Perl data type class for the XML Schema defined simpleType
ShowTextPosition from the namespace http://www.webservicex.net/.
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
like it's base type.
# Description of restrictions not implemented yet.
=head1 METHODS
=head2 new
Constructor.
=head2 get_value / set_value
Getter and setter for the simpleType's value.
=head1 OVERLOADING
Depending on the simple type's base type, the following operations are overloaded
Stringification
Numerification
Boolification
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+74
View File
@@ -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
+68
View File
@@ -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
+12
View File
@@ -0,0 +1,12 @@
use strict;
use warnings;
use lib 'lib';
use MyInterfaces::TestService::TestPort;
my $soap = MyInterfaces::TestService::TestPort->new();
my $result = $soap->ListPerson({})
or die "error calling SOAP method";
print "Found " . @{ $result->get_out()->get_NewElement } . " persons\n";
+21
View File
@@ -0,0 +1,21 @@
#!/usr/bin/perl -w
use strict;
use warnings;
use XML::Compile::WSDL11;
use XML::Compile::Transport::SOAPHTTP;
my $wsdl = XML::Compile::WSDL11->new('wsdl/Person.wsdl');
# I have to lookup the methods from the WSDL
my $call = $wsdl->compileClient('ListPerson');
# I have to lookup the parameters from the WSDL
my $result = $call->({ in => undef});
die "Error calling soap method" if not defined $result;
# I have to lookup the output parameters from the WSDL - or try Dumper
#use Data::Dumper;
#print Dumper $result;
print "Found ", scalar @{ $result->{ parameters }->{ out }->{ seq_NewElement }->[0]->{ NewElement } } , " persons\n";
+95
View File
@@ -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>
+121
View File
@@ -0,0 +1,121 @@
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="benchmark"
targetNamespace="http://www.example.org/benchmark/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://www.example.org/benchmark/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<wsdl:types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/benchmark/">
<xsd:element name="ListPerson">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="in" type="tns:Person"
maxOccurs="1" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="ListPersonResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="out" type="tns:ArrayOfPerson" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="Person">
<xsd:sequence>
<xsd:element name="PersonID" type="tns:PersonID" />
<xsd:element name="Salutation" type="xsd:string" />
<xsd:element name="Name" type="xsd:string" />
<xsd:element name="GivenName" type="xsd:string" />
<xsd:element name="DateOfBirth" type="xsd:date" />
<xsd:element name="HomeAddress" type="tns:Address"
maxOccurs="1" minOccurs="1" />
<xsd:element name="WorkAddress" type="tns:Address"
maxOccurs="1" minOccurs="0" />
<xsd:element name="Contracts"
type="tns:ArrayOfContract" />
</xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="PhoneNumber">
<xsd:restriction base="xsd:string"></xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="ArrayOfPerson">
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element name="NewElement" type="tns:Person"
maxOccurs="unbounded" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="PersonID">
<xsd:sequence>
<xsd:element name="ID" type="xsd:int"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Address">
<xsd:sequence>
<xsd:element name="Street" type="xsd:string" />
<xsd:element name="ZIP" type="xsd:string" />
<xsd:element name="City" type="xsd:string" />
<xsd:element name="Country" type="xsd:string" />
<xsd:element name="PhoneNumber" type="tns:PhoneNumber" />
<xsd:element name="MobilePhoneNumber" type="tns:PhoneNumber" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ArrayOfContract">
<xsd:sequence>
<xsd:element name="Contract" type="tns:Contract"
maxOccurs="unbounded" minOccurs="0">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Contract">
<xsd:sequence>
<xsd:element name="ContractID" type="xsd:long" />
<xsd:element name="ContractName" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<wsdl:message name="ListPersonRequest">
<wsdl:part name="parameters" element="tns:ListPerson" />
</wsdl:message>
<wsdl:message name="ListPersonResponse">
<wsdl:part name="parameters" element="tns:ListPersonResponse" />
</wsdl:message>
<wsdl:portType name="NewPortType">
<wsdl:operation name="ListPerson">
<wsdl:input message="tns:ListPersonRequest"></wsdl:input>
<wsdl:output message="tns:ListPersonResponse"></wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="NewBinding" type="tns:NewPortType">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="ListPerson">
<soap:operation
soapAction="http://www.example.org/benchmark/ListPerson" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="TestService">
<wsdl:port name="TestPort" binding="tns:NewBinding">
<soap:address
location="http://localhost:81/soap-wsdl-test/person.pl"></soap:address>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
+153
View File
@@ -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>
+35 -29
View File
@@ -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_32';
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 };
@@ -174,26 +176,25 @@ sub _wsdl_init_methods :PRIVATE {
my $ns = $wsdl->get_targetNamespace(); my $ns = $wsdl->get_targetNamespace();
# 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();
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 = {};
# get SOAP Action # get SOAP Action
# SOAP-Action is a required HTTP Header, so we need to look it up... # SOAP-Action is a required HTTP Header, so we need to look it up...
# There must be a soapAction uri - or the WSDL is invalid (and
# it's not us to prove that...)
my $soap_binding_operation = $binding_operation->get_operation()->[0]; my $soap_binding_operation = $binding_operation->get_operation()->[0];
$method->{ soap_action } = $soap_binding_operation ? $method->{ soap_action } = $soap_binding_operation->get_soapAction();
$soap_binding_operation->get_soapAction() : $method;
# 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
@@ -204,7 +205,10 @@ sub _wsdl_init_methods :PRIVATE {
my $message = $wsdl->find_message( $ns, $localname ) my $message = $wsdl->find_message( $ns, $localname )
or croak "Message {$ns}$localname not found in WSDL definition"; or croak "Message {$ns}$localname not found in WSDL definition";
if (my $body=$binding_operation->first_input()->first_body()) { # Is body not required? So there must be one? Do we need the "if"?
# if (
my $body=$binding_operation->first_input()->first_body();
# {
if ($body->get_parts()) { if ($body->get_parts()) {
$method->{ parts } = []; # make sure it's empty $method->{ parts } = []; # make sure it's empty
my $message_part_ref = $message->get_part(); my $message_part_ref = $message->get_part();
@@ -216,7 +220,9 @@ sub _wsdl_init_methods :PRIVATE {
grep { $_->get_name() eq $name } @{ $message_part_ref }; grep { $_->get_name() eq $name } @{ $message_part_ref };
} }
} }
} # }
# A body does not need to specify the parts of a messages.
# Use all of the message's parts if it does not.
$method->{ parts } ||= $message->get_part(); $method->{ parts } ||= $message->get_part();
# rpc / encoded methods may have a namespace specified. # rpc / encoded methods may have a namespace specified.
@@ -236,7 +242,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] )
@@ -329,7 +335,7 @@ SOAP client, which mimics L<SOAP::Lite|SOAP::Lite>'s API, read on.
my $soap = SOAP::WSDL->new( my $soap = SOAP::WSDL->new(
wsdl => 'file://bla.wsdl', wsdl => 'file://bla.wsdl',
); );
my $result = $soap->call('MyMethod', %data); my $result = $soap->call('MyMethod', %data);
=head1 DESCRIPTION =head1 DESCRIPTION
@@ -436,7 +442,7 @@ Class resolver
'Person/Name' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'Person/Name' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Person/FirstName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'Person/FirstName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
); );
sub get_class { return $typemap{ $_[1] } }; sub get_class { return $typemap{ $_[1] } };
1; 1;
@@ -669,16 +675,16 @@ The following facets have no influence yet:
=item * L<SOAP::Lite|SOAP::Lite> =item * L<SOAP::Lite|SOAP::Lite>
Full featured SOAP-library, little WSDL support. Supports rpc-encoded style only. Many protocols supported. Full featured SOAP-library, little WSDL support. Supports rpc-encoded style
only. Many protocols supported.
=item * L<XML::Compile::WSDL|XML::Compile::WSDL> / L<XML::Compile::SOAP|XML::Compile::SOAP> =item * L<XML::Compile::WSDL|XML::Compile::WSDL> / L<XML::Compile::SOAP|XML::Compile::SOAP>
A promising-looking approach derived from a cool functional DOM-based XML schema parser. Creates parser/generator functions for SOAP messages. Includes SOAP Client
and Server implementatios.
Will support encoding/decoding of SOAP messages based on WSDL definitions. You might want to give it a try, especially if you need to adhere very
closely to the XML Schema / WSDL specs.
Not yet finished at the time of writing - but you may wish to give it a try, especially
if you need to adhere very closely to the XML Schema / WSDL specs.
=back =back
@@ -730,9 +736,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 391 $ $Rev: 534 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: WSDL.pm 391 2007-11-17 21:56:13Z kutterma $ $Id: WSDL.pm 534 2008-02-14 17:07:18Z 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
+21 -17
View File
@@ -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_27';
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<()>);
@@ -14,6 +14,11 @@ my %targetNamespace_of :ATTR(:name<targetNamespace> :default<()>);
my %xmlns_of :ATTR(:name<xmlns> :default<{}>); my %xmlns_of :ATTR(:name<xmlns> :default<{}>);
my %parent_of :ATTR(:name<parent> :default<()>); my %parent_of :ATTR(:name<parent> :default<()>);
sub START {
my ($self, $ident, $arg_ref) = @_;
$xmlns_of{ $ident }->{ '#default' } = $self->get_xmlns()->{ '#default' };
}
sub DEMOLISH { sub DEMOLISH {
my $self = shift; my $self = shift;
# delete upward references # delete upward references
@@ -82,7 +87,7 @@ sub AUTOMETHOD {
return $result_ref->[0]; return $result_ref->[0];
}; };
} }
confess "$subname not found in class " . (ref $self || $self) ; confess "$subname not found in class " . ref $self;
} }
sub init { sub init {
@@ -91,18 +96,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;
}
elsif ($value->{ Name } =~m{^xmlns$}xms) {
# just ignore xmlns = for now
# TODO handle xmlns correctly - maybe via setting a prefix ?
next; next;
} }
@@ -115,14 +110,23 @@ sub init {
sub expand { sub expand {
my ($self, , $qname) = @_; my ($self, , $qname) = @_;
my $ns_of = $self->get_xmlns();
if (not $qname=~m{:}xm) {
die "un-prefixed element name <$qname> found, but no default namespace set\n"
if not defined $ns_of->{ '#default' };
return $ns_of->{ '#default' }, $qname;
}
my ($prefix, $localname) = split /:/x, $qname; my ($prefix, $localname) = split /:/x, $qname;
my %ns_map = reverse %{ $self->get_xmlns() };
return ($ns_map{ $prefix }, $localname) if ($ns_map{ $prefix });
return ($ns_of->{ $prefix }, $localname) if ($ns_of->{ $prefix });
if (my $parent = $self->get_parent()) { 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_of });
} }
sub _expand; sub _expand;
*_expand = \&expand; *_expand = \&expand;
+1 -1
View File
@@ -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);
+5 -16
View File
@@ -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_27';
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 };
@@ -268,17 +268,6 @@ Default:
text/xml; charset: utf8 text/xml; charset: utf8
=head3 set_trace
$soap->set_trace(1);
$soap->set_trace( sub { Log::Log4perl::get_logger()->debug( @_ ) } );
When set to a true value, tracing (via warn) is enabled.
When set to a code reference, this function will be called on every
trace call, making it really easy for you to set up log4perl logging
or whatever you need.
=head2 Features different from SOAP::Lite =head2 Features different from SOAP::Lite
SOAP::WSDL does not aim to be a complete replacement for SOAP::Lite - the SOAP::WSDL does not aim to be a complete replacement for SOAP::Lite - the
@@ -371,9 +360,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 391 $ $Rev: 455 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Client.pm 391 2007-11-17 21:56:13Z kutterma $ $Id: Client.pm 455 2007-12-14 15:50:16Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
=cut =cut
+23 -39
View File
@@ -4,19 +4,36 @@ 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) = @_;
# Treat non-objects special
if (not blessed $body) { if (not blessed $body) {
# make sure there's something sensible in our body data
$body = {} if not defined $body; $body = {} if not defined $body;
my $class = $method->{ body }->{ parts }->[0]; $body = ref $body eq 'ARRAY' ? $body : [ $body ];
eval "require $class" || die $@;
$body = $class->new($body); my @body_from = @{ $body }; # make a copy
# build list of parts as objects initialized with
# parameters given
my @part_from = ();
foreach my $class (@{ $method->{ body }->{ parts } }) {
eval "require $class" || die $@;
push @part_from, $class->new(shift(@body_from) || {});
}
# it's either the first part or a list ref with all parts...
$body = $#part_from ? \@part_from : $part_from[0];
} }
# if we have a header # if we have a header
if (%{ $method->{ header } }) { if (%{ $method->{ header } }) {
# trat non object special - as above, but only for one
if (not blessed $header) { if (not blessed $header) {
my $class = $method->{ header }->{ parts }->[0]; my $class = $method->{ header }->{ parts }->[0];
eval "require $class" || die $@; eval "require $class" || die $@;
@@ -26,39 +43,6 @@ sub call {
return $self->SUPER::call($method, $body, $header); return $self->SUPER::call($method, $body, $header);
} }
sub __create_methods {
my ($package, %info_of) = @_;
no strict qw(refs);
no warnings qw(redefine);
for my $method (keys %info_of){
my ($soap_action, @parts);
# up to 2.00_10 we had list refs...
if (ref $info_of{ $method }eq 'HASH') {
@parts = @{ $info_of{ $method }->{ parts } };
$soap_action = $info_of{ $method }->{ soap_action };
}
else {
die "Pre-v2.00_10 Interfaces are no longer supported. Please re-generate your interface.";
}
*{ "$package\::$method" } = sub {
my $self = shift;
my @param = map {
my $data = shift || {};
eval "require $_";
$_->new( $data );
} @parts;
return $self->SUPER::call( {
operation => $method,
soap_action => $soap_action,
}, @param );
}
}
}
1; 1;
__END__ __END__
@@ -94,9 +78,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 391 $ $Rev: 501 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Base.pm 391 2007-11-17 21:56:13Z kutterma $ $Id: Base.pm 501 2008-01-26 20:23:32Z 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 -6
View File
@@ -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_27';
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,
@@ -105,7 +105,7 @@ Returns the message matching the namespace/localname pair passed as arguments.
Accessors/Mutators for accessing / setting the E<gt>typesE<lt> child Accessors/Mutators for accessing / setting the E<gt>typesE<lt> child
element(s). element(s).
=head1 LICENSE and COPYRIGHT =head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter. Copyright 2004-2007 Martin Kutter.
@@ -118,9 +118,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 391 $ $Rev: 477 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Definitions.pm 391 2007-11-17 21:56:13Z kutterma $ $Id: Definitions.pm 477 2007-12-24 10:23:52Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Definitions.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Definitions.pm $
=cut =cut
+4 -4
View File
@@ -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
+11 -10
View File
@@ -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,15 @@ 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 }, if not $parser_of{ ${ $self } };
}); $parser_of{ ${ $self } }->class_resolver( $class_resolver_of{ ident $self } );
eval { $parser->parse_string( $content ) }; eval { $parser_of{ ${ $self } }->parse_string( $content ) };
if ($@) { if ($@) {
return $self->generate_fault({ return $self->generate_fault({
code => 'soap:Server', code => 'soap:Server',
@@ -34,7 +35,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 +99,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 391 $ $Rev: 501 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: XSD.pm 391 2007-11-17 21:56:13Z kutterma $ $Id: XSD.pm 501 2008-01-26 20:23:32Z 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
+91 -3
View File
@@ -1,17 +1,71 @@
package SOAP::WSDL::Expat::Base; package SOAP::WSDL::Expat::Base;
use strict; use strict;
use warnings; use warnings;
use URI;
use XML::Parser::Expat; use XML::Parser::Expat;
our $VERSION = '2.00_24'; # TODO: convert to Class::Std::Fast based class - hash based classes suck.
our $VERSION = '2.00_32';
sub new { sub new {
my ($class, $args) = @_; my ($class, $arg_ref) = @_;
my $self = {}; my $self = {};
bless $self, $class; bless $self, $class;
$self->set_user_agent($arg_ref->{ user_agent })
if $arg_ref->{ user_agent };
$self->{ parsed } = $arg_ref->{ parsed } if $arg_ref->{ parsed };
return $self; return $self;
} }
sub clone {
my $self = shift;
my $class = ref $self;
my $clone = $class->new($self);
return $clone;
}
sub set_uri { $_[0]->{ uri } = $_[1]; }
sub get_uri { return $_[0]->{ uri }; }
sub set_user_agent { $_[0]->{ user_agent } = $_[1]; }
sub get_user_agent { return $_[0]->{ user_agent }; }
sub set_parsed {
my ($self, $uri) = @_;
$self->{ parsed }->{ $uri } = 1;
return;
}
sub is_parsed {
my ($self, $uri) = @_;
return exists $self->{ parsed }->{ $uri };
}
sub parse_uri {
my $self = shift;
my $uri = shift;
if ($self->is_parsed($uri)){
warn "$uri already imported. Ignoring it\n";
return;
}
$self->set_parsed($uri);
$self->set_uri( $uri );
if (not $self->{ user_agent }) {
require LWP::UserAgent;
$self->{ user_agent } = LWP::UserAgent->new();
}
my $response = $self->{ user_agent }->get($uri);
die $response->message() if $response->code() ne '200';
return $self->parse( $response->content() );
}
sub parse { sub parse {
eval { eval {
$_[0]->_initialize( XML::Parser::Expat->new( Namespaces => 1 ) )->parse( $_[1] ); $_[0]->_initialize( XML::Parser::Expat->new( Namespaces => 1 ) )->parse( $_[1] );
@@ -41,4 +95,38 @@ sub get_data {
return $_[0]->{ data }; return $_[0]->{ data };
} }
1; 1;
=pod
=head1 NAME
SOAP::WSDL::Expat::Base - Base class for XML::Parser::Expat based XML parsers
=head1 DESCRIPTION
Base class for XML::Parser::Expat based XML parsers. All XML::SAX::Expat based
parsers in SOAP::WSDL inherit from this class.
=head1 AUTHOR
Replace the whitespace by @ for E-Mail Address.
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself
=head1 Repository information
$Id: $
$LastChangedDate: 2007-09-10 18:19:23 +0200 (Mo, 10 Sep 2007) $
$LastChangedRevision: 218 $
$LastChangedBy: kutterma $
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $
+7 -4
View File
@@ -4,7 +4,7 @@ use strict;
use warnings; use warnings;
use base qw(SOAP::WSDL::Expat::Base); use base qw(SOAP::WSDL::Expat::Base);
our $VERSION = '2.00_24'; our $VERSION = '2.00_27';
sub _initialize { sub _initialize {
my ($self, $parser) = @_; my ($self, $parser) = @_;
@@ -113,13 +113,16 @@ Replace the whitespace by @ for E-Mail Address.
Martin Kutter E<lt>martin.kutter fen-net.deE<gt> Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 COPYING =head1 LICENSE AND COPYRIGHT
This module may be used under the same terms as perl itself. Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself
=head1 Repository information =head1 Repository information
$ID: $ $Id: $
$LastChangedDate: 2007-09-10 18:19:23 +0200 (Mo, 10 Sep 2007) $ $LastChangedDate: 2007-09-10 18:19:23 +0200 (Mo, 10 Sep 2007) $
$LastChangedRevision: 218 $ $LastChangedRevision: 218 $
+124 -62
View File
@@ -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_27};
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\::" }; # 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,30 +101,34 @@ 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__
# resolve class of this element # resolve class of this element
@@ -102,31 +142,38 @@ 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 # set attributes if there are any
$current->attr({ @_[2..$#_] }) if (@_ > 2);
# remember top level element
exists $self->{ data }
or ($self->{ data } = $current);
$depth++; $depth++;
return; return;
}, },
@@ -134,8 +181,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 +194,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 +263,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 +278,26 @@ the message and set the type map entry to '__SKIP__'.
=back =back
=head1 AUTHOR
Replace the whitespace by @ for E-Mail Address.
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 LICENSE AND COPYRIGHT =head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter. Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself. the same terms as perl itself
=head1 AUTHOR =head1 Repository information
Martin Kutter E<lt>martin.kutter fen-net.deE<gt> $Id: $
=head1 REPOSITORY INFORMATION $LastChangedDate: 2008-02-02 10:19:45 +0100 (Sa, 02 Feb 2008) $
$LastChangedRevision: 516 $
$Rev: 391 $
$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
+9 -9
View File
@@ -56,22 +56,22 @@ See L<SOAP::WSDL::Manual::Parser> for details.
See SOAP::WSDL::Expat::MessageParser See SOAP::WSDL::Expat::MessageParser
=head1 LICENSE AND COPYRIGHT
Copyright 2007 Martin Kutter. All rights reserved.
This file is part of SOAP-WSDL. You may distribte/modify it under
the same terms as perl itself
=head1 AUTHOR =head1 AUTHOR
Martin Kutter E<lt>martin.kutter fen-net.deE<gt> Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 LICENSE AND COPYRIGHT
Copyright 2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 391 $ $Rev: 477 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: MessageStreamParser.pm 391 2007-11-17 21:56:13Z kutterma $ $Id: MessageStreamParser.pm 477 2007-12-24 10:23:52Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageStreamParser.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageStreamParser.pm $
=cut =cut
+112 -2
View File
@@ -5,6 +5,60 @@ 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_32};
sub _import_children {
my ($self, $name, $imported, $importer, $import_namespace) = @_;
return if not $imported;
my $targetNamespace = $importer->get_targetNamespace();
my $push_method = "push_$name";
my $get_method = "get_$name";
no strict qw(refs);
my $value_ref = $imported->$get_method();
if ($value_ref) {
$value_ref = [ $value_ref ] if (not ref $value_ref eq 'ARRAY');
# set xmlns - can be different from parent
for (@{ $value_ref }) {
# fixup targetNamespace, but don't override
$_->set_targetNamespace( $import_namespace )
if ( ($import_namespace ne $targetNamespace) && ! $_->get_targetNamespace);
# update parent...
$_->set_parent( $importer );
}
# push elements into importing WSDL
$importer->$push_method(@{ $value_ref });
}
}
sub xml_schema_import {
my $self = shift;
my $schema = shift;
my $parser = $self->clone();
my %attr_of = @_;
my $import_namespace = $attr_of{ namespace };
my $uri = URI->new_abs($attr_of{schemaLocation}, $self->get_uri() );
my $import = $parser->parse_uri($uri);
for my $name ( qw(type element group) ) {
$self->_import_children( $name, $import, $schema, $import_namespace);
}
}
sub wsdl_import {
my $self = shift;
my $definitions = shift;
my $parser = $self->clone();
my %attr_of = @_;
my $import_namespace = $attr_of{ namespace };
my $uri = URI->new_abs($attr_of{location}, $self->get_uri() );
my $import = $parser->parse_uri($uri);
for my $name ( qw(types message binding portType service) ) {
$self->_import_children( $name, $import, $definitions, $import_namespace);
}
}
sub _initialize { sub _initialize {
my ($self, $parser) = @_; my ($self, $parser) = @_;
@@ -34,7 +88,9 @@ sub _initialize {
eval "require $action->{ class }"; eval "require $action->{ class }";
croak $@ if ($@); croak $@ if ($@);
my $obj = $action->{ class }->new({ parent => $current }) my $obj = $action->{ class }->new({ parent => $current,
xmlns => { '#default' => $parser->namespace($localname) }
})
->init( _fixup_attrs( $parser, %attrs ) ); ->init( _fixup_attrs( $parser, %attrs ) );
if ($current) { if ($current) {
@@ -61,7 +117,7 @@ sub _initialize {
$current->init( _fixup_attrs($parser, %attrs) ); $current->init( _fixup_attrs($parser, %attrs) );
} }
elsif ($action->{ type } eq 'METHOD') { elsif ($action->{ type } eq 'METHOD') {
my $method = $action->{ method } || $localname; my $method = $action->{ method };
no strict qw(refs); no strict qw(refs);
# call method with # call method with
@@ -77,6 +133,20 @@ sub _initialize {
: _fixup_attrs($parser, %attrs) : _fixup_attrs($parser, %attrs)
); );
} }
elsif ($action->{type} eq 'HANDLER') {
my $method = $self->can($action->{method});
$method->($self, $current, %attrs);
}
else {
# TODO replace by hash lookup of known namespaces.
my $namespace = $parser->namespace($localname) || q{};
my $part = $namespace eq 'http://schemas.xmlsoap.org/wsdl/'
? 'WSDL 1.1'
: 'XML Schema';
warn "$part element <$localname> is not implemented yet"
if ($localname !~m{ \A (:? annotation | documentation ) \z }xms );
}
return; return;
}, },
@@ -141,3 +211,43 @@ sub _fixup_attrs {
1; 1;
=pod
=head1 NAME
SOAP::WSDL::Expat::WSDLParser - Parse WSDL files into object trees
=head1 SYNOPSIS
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
$parser->parse( $xml );
my $obj = $parser->get_data();
=head1 DESCRIPTION
WSDL parser used by SOAP::WSDL.
=head1 AUTHOR
Replace the whitespace by @ for E-Mail Address.
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself
=head1 Repository information
$Id: $
$LastChangedDate: 2008-02-14 18:07:18 +0100 (Do, 14 Feb 2008) $
$LastChangedRevision: 534 $
$LastChangedBy: kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/WSDLParser.pm $
+2 -2
View File
@@ -16,7 +16,7 @@ sub register {
sub get_deserializer { sub get_deserializer {
my ($self, $args_of_ref) = @_; my ($self, $args_of_ref) = @_;
$args_of_ref->{ soap_version } ||= '1.1';
# sanity check # sanity check
die "no deserializer registered for SOAP version $args_of_ref->{ soap_version }" die "no deserializer registered for SOAP version $args_of_ref->{ soap_version }"
if not exists ($DESERIALIZER{ $args_of_ref->{ soap_version } }); if not exists ($DESERIALIZER{ $args_of_ref->{ soap_version } });
@@ -137,7 +137,7 @@ passed as a single hash ref:
Copyright 2007 Martin Kutter. All rights reserved. Copyright 2007 Martin Kutter. All rights reserved.
This file is part of SOAP-WSDL. You may distribte/modify it under This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself the same terms as perl itself
=head1 AUTHOR =head1 AUTHOR
+1 -1
View File
@@ -155,7 +155,7 @@ Set user-defined typemap snippet
Copyright 2007 Martin Kutter. All rights reserved. Copyright 2007 Martin Kutter. All rights reserved.
This file is part of SOAP-WSDL. You may distribte/modify it under This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself the same terms as perl itself
=head1 AUTHOR =head1 AUTHOR
+3 -3
View File
@@ -16,7 +16,7 @@ sub register {
sub get_serializer { sub get_serializer {
my ($self, $args_of_ref) = @_; my ($self, $args_of_ref) = @_;
$args_of_ref->{ soap_version } ||= '1.1';
# sanity check # sanity check
die "no serializer registered for SOAP version $args_of_ref->{ soap_version }" die "no serializer registered for SOAP version $args_of_ref->{ soap_version }"
if not exists ($SERIALIZER{ $args_of_ref->{ soap_version } }); if not exists ($SERIALIZER{ $args_of_ref->{ soap_version } });
@@ -138,9 +138,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 391 $ $Rev: 510 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Serializer.pm 391 2007-11-17 21:56:13Z kutterma $ $Id: Serializer.pm 510 2008-01-29 08:03:46Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
=cut =cut
+18 -14
View File
@@ -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_31';
# class data # class data
my %registered_transport_of = (); my %registered_transport_of = ();
@@ -27,18 +27,20 @@ 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;
} }
sub get_transport { sub get_transport {
my ($class, $scheme, %attrs) = @_; my ($class, $scheme, %attrs) = @_;
$scheme =~s{ \A ([^\:]+) \: .+ }{$1}smx; $scheme =~s{ \A ([^\:]+) \: .+ }{$1}x;
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 } : $@"; defined %{ "$registered_transport_of{ $scheme }::" }
or eval "require $registered_transport_of{ $scheme }"
or die "Cannot load transport class $registered_transport_of{ $scheme } : $@";
# try "foo::Client" class first - SOAP::Tranport always requires # 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 } : $@"; defined %{ "$SOAP_WSDL_TRANSPORT_OF{ $scheme }::" }
or eval "require $SOAP_WSDL_TRANSPORT_OF{ $scheme }"
or die "Cannot load transport class $SOAP_WSDL_TRANSPORT_OF{ $scheme } : $@";
return $SOAP_WSDL_TRANSPORT_OF{ $scheme }->new( %attrs ); return $SOAP_WSDL_TRANSPORT_OF{ $scheme }->new( %attrs );
} }
@@ -92,12 +96,12 @@ SOAP::WSDL::Factory::Transport - Factory for retrieving transport objects
# in transport class: # in transport class:
package MyWickedTransport; package MyWickedTransport;
use SOAP::WSDL::Factory::Transport; use SOAP::WSDL::Factory::Transport;
# register class as transport module for httpr and https # register class as transport module for httpr and https
# (httpr is "reliable http", a protocol developed by IBM). # (httpr is "reliable http", a protocol developed by IBM).
SOAP::WSDL::Factory::Transport->register( 'httpr' , __PACKAGE__ ); SOAP::WSDL::Factory::Transport->register( 'httpr' , __PACKAGE__ );
SOAP::WSDL::Factory::Transport->register( 'https' , __PACKAGE__ ); SOAP::WSDL::Factory::Transport->register( 'https' , __PACKAGE__ );
=head1 DESCRIPTION =head1 DESCRIPTION
SOAP::WSDL::Transport serves as factory for retrieving transport objects for SOAP::WSDL::Transport serves as factory for retrieving transport objects for
@@ -203,10 +207,10 @@ classes in one file, and to follow this naming scheme:
Module name: Module name:
"SOAP::Transport::" . uc($scheme) "SOAP::Transport::" . uc($scheme)
Client class (additional package in module): Client class (additional package in module):
"SOAP::Transport::" . uc($scheme) . "::Client" "SOAP::Transport::" . uc($scheme) . "::Client"
Server class (additional package in module): Server class (additional package in module):
"SOAP::Transport::" . uc($scheme) . "::Client" "SOAP::Transport::" . uc($scheme) . "::Client"
@@ -236,9 +240,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 391 $ $Rev: 524 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Transport.pm 391 2007-11-17 21:56:13Z kutterma $ $Id: Transport.pm 524 2008-02-10 23:24:43Z 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
+24 -3
View File
@@ -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,37 @@ 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(
# always create a new Template object to
# force re-loading of plugins.
my $tt = 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 },
PLUGIN_BASE => 'SOAP::WSDL::Generator::Template::Plugin',
); );
$tt->process( $template, $tt->process( $template,
{ {
context => {
namespace_prefix_map => {
'http://www.w3.org/2001/XMLSchema' => 'SOAP::WSDL::XSD::Typelib::Builtin',
},
namespace_map => {
},
prefix => {
interface => $self->get_interface_prefix,
element => $self->get_element_prefix,
server => $self->get_server_prefix,
type => $self->get_type_prefix,
typemap => $self->get_typemap_prefix,
}
},
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,
@@ -0,0 +1,61 @@
package SOAP::WSDL::Generator::Template::Plugin::XSD;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
my %namespace_prefix_map_of :ATTR(:name<namespace_prefix_map> :default<{}>);
my %namespace_map_of :ATTR(:name<namespace_map> :default<{}>);
my %prefix_of :ATTR(:name<prefix> :default<()>);
# create a singleton
sub load { # called as MyPlugin->load($context)
my ($class, $context, @arg_from) = @_;
my $stash = $context->stash();
my $self = bless \do { my $o = Class::Std::Fast::ID() }, $class;
use Data::Dumper;
# die Data::Dumper::Dumper $stash->{ context };
$self->set_namespace_map( $stash->{ context }->{ namespace_map });
$self->set_namespace_prefix_map( $stash->{ context }->{ namespace_prefix_map });
$self->set_prefix( $stash->{ context }->{ prefix });
return $self; # returns 'MyPlugin'
}
sub new {
return shift;
}
sub _get_prefix {
my ($self, $type, $namespace) = @_;
return $namespace_prefix_map_of{ $$self }->{ $namespace }
|| ( ($namespace_map_of{ $$self }->{ $namespace })
? join ('::', $prefix_of{ $$self }->{ $type }, $namespace_map_of{ $$self }->{ $namespace })
: $prefix_of{ $$self }->{ $type }
)
|| $prefix_of{ $$self }->{ $type };
}
sub get_element_prefix {
shift->_get_prefix( 'element', shift );
}
sub get_interface_prefix {
shift->_get_prefix( 'interface', shift );
}
sub get_server_prefix {
shift->_get_prefix( 'server', shift );
}
sub get_type_prefix {
# die "WIX";
shift->_get_prefix( 'type', shift );
}
sub get_typemap_prefix {
shift->_get_prefix( 'typemap', shift );
}
sub error {}
1;
+43 -7
View File
@@ -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_27};
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,14 +50,16 @@ 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 );
} }
sub generate_typelib { sub generate_typelib {
my ($self) = @_; my ($self, $arg_ref) = @_;
# $output_of{ ident $self } = ""; # $output_of{ ident $self } = "";
my @schema = @{ $self->get_definitions()->first_types()->get_schema() }; my @schema = exists $arg_ref->{ schema }
? @{ $arg_ref->{schema} }
: @{ $self->get_definitions()->first_types()->get_schema() };
for my $type (map { @{ $_->get_type() } , @{ $_->get_element() } } @schema[1..$#schema] ) { for my $type (map { @{ $_->get_type() } , @{ $_->get_element() } } @schema[1..$#schema] ) {
$type->_accept( $self ); $type->_accept( $self );
} }
@@ -63,11 +67,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 +140,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 }},
@@ -131,6 +166,7 @@ sub _generate_filename :PRIVATE {
my ($self, @parts) = @_; my ($self, @parts) = @_;
my $name = join '::', @parts; my $name = join '::', @parts;
$name =~s{ \. }{::}xmsg; $name =~s{ \. }{::}xmsg;
$name =~s{ \- }{_}xmsg;
$name =~s{ :: }{/}xmsg; $name =~s{ :: }{/}xmsg;
return "$name.pm"; return "$name.pm";
} }
@@ -1,17 +1,22 @@
package [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('^.+\.','') %]; [% USE XSD -%]
[% interface_name = interface_prefix _ '::'
_ service.get_name.replace('\.', '::') _ '::'
_ port.get_name.replace('^.+\.','');
interface_name = interface_name.replace('-','_'); -%]
package [% interface_name %];
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);
# only load if it hasn't been loaded before # only load if it hasn't been loaded before
require [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %] require [% typemap_prefix %]::[% service.get_name.replace('\.', '::').replace('-', '_') %]
if not [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]->can('get_class'); if not [% typemap_prefix %]::[% service.get_name.replace('\.', '::').replace('-', '_') %]->can('get_class');
sub START { sub START {
$_[0]->set_proxy('[% port.first_address.get_location %]') if not $_[2]->{proxy}; $_[0]->set_proxy('[% port.first_address.get_location %]') if not $_[2]->{proxy};
$_[0]->set_class_resolver('[% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]') $_[0]->set_class_resolver('[% typemap_prefix %]::[% service.get_name.replace('\.', '::').replace('-', '_') %]')
if not $_[2]->{class_resolver}; if not $_[2]->{class_resolver};
} }
@@ -28,49 +33,53 @@ sub START {
[% IF NO_POD; STOP; END %] [% IF NO_POD; STOP; END %]
__END__ __END__
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% pod = BLOCK %]=pod[% END -%]
[% head1 = BLOCK %]=head1[% END -%]
[% head2 = BLOCK %]=head2[% END -%]
[% head3 = BLOCK %]=head3[% END -%]
=pod [% pod %]
=head1 NAME [% head1 %] NAME
[% interface_name %] - SOAP Interface for the [% service.get_name %] Web Service
[% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %] - SOAP Interface for the [% service.get_name %] Web Service [% head1 %] SYNOPSIS
=head1 SYNOPSIS use [% interface_name %];
my $interface = [% interface_name %]->new();
use [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %];
my $interface = [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %]->new();
my $response; my $response;
[% FOREACH operation = binding.get_operation; [% FOREACH operation = binding.get_operation;
%] $response = $interface->[% operation.get_name %](); %] $response = $interface->[% operation.get_name %]();
[% END %] [% END %]
=head1 DESCRIPTION
[% head1 %] DESCRIPTION
SOAP Interface for the [% service.get_name %] web service SOAP Interface for the [% service.get_name %] web service
located at [% port.first_address.get_location %]. located at [% port.first_address.get_location %].
=head1 SERVICE [% service.get_name %] [% head1 %] SERVICE [% service.get_name %]
[% service.get_documentation %] [% service.get_documentation %]
=head2 Port [% port.get_name %] [% head2 %] Port [% port.get_name %]
[% port.get_documentation %] [% port.get_documentation %]
=head1 METHODS [% head1 %] METHODS
=head2 General methods [% head2 %] General methods
=head3 new [% head3 %] new
Constructor. Constructor.
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>. All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
=head2 SOAP Service methods [% head2 %] SOAP Service methods
[% INCLUDE Interface/POD/method_info.tt %] [% INCLUDE Interface/POD/method_info.tt %]
@@ -79,8 +88,8 @@ All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
%][% INCLUDE Interface/POD/Operation.tt %] %][% INCLUDE Interface/POD/Operation.tt %]
[% END %] [% END %]
=head1 AUTHOR [% head1 %] AUTHOR
Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %] Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %]
=pod =cut
@@ -55,6 +55,11 @@
: die "input must have either type or element"; : die "input must have either type or element";
} @{ $part_from }; } @{ $part_from };
} }
warn "Multiple parts detected in message " . $stash->{ message }->get_name() . ".\n",
"WS-I BP demands 0 to 1 parts in message body\n"
if (@parts > 1);
$stash->{ parts } = \@parts; $stash->{ parts } = \@parts;
[% END %] [% END %]
@@ -1,4 +1,6 @@
=head3 [% operation.get_name %] [%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% head3 = BLOCK %]=head3[% END -%]
[% head3 %] [% operation.get_name %]
[% type = definitions.find_portType( binding.expand( binding.get_type ) ); [% type = definitions.find_portType( binding.expand( binding.get_type ) );
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name ); port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
@@ -0,0 +1,106 @@
[% server_name = server_prefix _ '::'
_ service.get_name.replace('\.', '::') _ '::'
_ port.get_name.replace('^.+\.','');
server_name = server_name.replace('-','_'); -%]
package [% server_name %];
use strict;
use warnings;
use Class::Std::Fast::Storable;
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__
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% pod = BLOCK %]=pod[% END -%]
[% head1 = BLOCK %]=head1[% END -%]
[% head2 = BLOCK %]=head2[% END -%]
[% head3 = BLOCK %]=head3[% END -%]
[% pod %]
[% head1 %] NAME
[% server_name %] - SOAP Server Class for the [% service.get_name %] Web Service
[% head1 %] SYNOPSIS
use [% server_name %];
my $server = [% server_name %]->new({
dispatch_to => 'My::Handler::Class',
transport_class => 'SOAP::WSDL::Server::CGI', # optional, default
});
$server->handle();
[% head1 %] DESCRIPTION
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,18 @@
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% head3 = BLOCK %]=head3[% END -%]
[% head3 %] [% operation.get_name %]
[% type = definitions.find_portType( binding.expand( binding.get_type ) );
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
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 %]
}

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