Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
745ce925c1 | ||
|
|
0cbf981665 | ||
|
|
51db446428 | ||
|
|
f0b3bdc201 | ||
|
|
874251225f | ||
|
|
2bad767211 | ||
|
|
7ca2154ad6 | ||
|
|
eb096ad88e |
16
Build.PL
16
Build.PL
@@ -2,18 +2,18 @@ use Module::Build;
|
||||
use version;
|
||||
$build = Module::Build->new(
|
||||
dist_author => 'Martin Kutter <martin.kutter@fen-net.de>',
|
||||
create_makefile_pl => 'passthrough',
|
||||
create_makefile_pl => 'small',
|
||||
dist_abstract => 'SOAP with WSDL support',
|
||||
dist_name => 'SOAP-WSDL',
|
||||
dist_version => '2.00_26',
|
||||
dist_version => '2.00.01',
|
||||
module_name => 'SOAP::WSDL',
|
||||
license => 'artistic',
|
||||
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)
|
||||
# and triggers several 5.6 bugs...
|
||||
'perl' => q(5.8.0),
|
||||
'Class::Std::Fast' => qv(0.0.5),
|
||||
'Class::Std::Fast' => q(0.0.5),
|
||||
'Data::Dumper' => 0,
|
||||
'Date::Parse' => 0,
|
||||
'Date::Format' => 0,
|
||||
@@ -24,22 +24,24 @@ $build = Module::Build->new(
|
||||
'LWP::UserAgent' => 0,
|
||||
'Template' => 0,
|
||||
'Term::ReadKey' => 0,
|
||||
'URI' => 0,
|
||||
'XML::Parser::Expat' => 0,
|
||||
},
|
||||
buildrequires => {
|
||||
'Class::Std::Fast' => qv(0.0.5),
|
||||
build_requires => {
|
||||
'Class::Std::Fast' => q(0.0.5),
|
||||
'Cwd' => 0,
|
||||
'Date::Parse' => 0,
|
||||
'Date::Format' => 0,
|
||||
'Getopt::Long' => 0,
|
||||
'List::Util' => 0,
|
||||
'LWP::UserAgent' => 0,
|
||||
'Module::Build' => 0,
|
||||
'File::Basename' => 0,
|
||||
'File::Path' => 0,
|
||||
'File::Spec' => 0,
|
||||
'Storable' => 0,
|
||||
'Test::More' => 0,
|
||||
'Template' => 0,
|
||||
'Template' => 0,
|
||||
'XML::Parser::Expat' => 0,
|
||||
},
|
||||
recursive_test_files => 1,
|
||||
|
||||
414
Changes
414
Changes
@@ -1,7 +1,7 @@
|
||||
Release notes for SOAP::WSDL 2.00_26
|
||||
Release notes for SOAP::WSDL 2.00.01
|
||||
-------
|
||||
|
||||
I'm proud to present a new pre-release version of SOAP::WSDL.
|
||||
I'm proud to present a new release of SOAP::WSDL.
|
||||
|
||||
SOAP::WSDL is a toolkit for creating WSDL-based SOAP client interfaces in perl.
|
||||
|
||||
@@ -15,31 +15,225 @@ Features:
|
||||
* Easy-to use API
|
||||
o Automatically encodes perl data structures as message data
|
||||
o Automatically sets HTTP headers right
|
||||
o Datatypes provide hints on method names on calls to non-existant
|
||||
methods
|
||||
* 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
|
||||
* Thorough test suite
|
||||
o SOAP::WSDL is heavily regression tested, with a test coverage of
|
||||
over 95% (excluding documentation - you wouldn't want to read
|
||||
o SOAP::WSDL is heavily regression tested, with a test coverage of
|
||||
over 95% (excluding documentation - you wouldn't want to read
|
||||
through it all).
|
||||
* 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 migration
|
||||
* XML schema based class library for creating data objects
|
||||
* 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:
|
||||
o Transport plugins via SOAP::WSDL::Factory::Transport
|
||||
o Serializer plugins via SOAP::WSDL::Factory::Serializer
|
||||
o Deserializer plugins via SOAP::WSDL::Factory::Serializer
|
||||
o Deserializer plugins via SOAP::WSDL::Factory::Deserializer
|
||||
|
||||
The following changes have been made:
|
||||
|
||||
2.00_26
|
||||
2.00.01
|
||||
|
||||
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):
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
* [ 1941134 ] Server for mod_perl2. Thanks to Noah Robin for contributing.
|
||||
|
||||
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/).
|
||||
|
||||
* [ 1944368 ] SOAP/WSDL/XSD/Typelib/SimpleType.pm spelling
|
||||
* [ 1944367 ] SOAP/WSDL/XSD/Typelib/ComplexType.pm spelling
|
||||
* [ 1944364 ] SOAP/WSDL/XSD/Typelib/Builtin.pm spelling
|
||||
* [ 1944362 ] SOAP/WSDL/SOAP/Typelib/Fault11.pm spelling
|
||||
* [ 1944361 ] SOAP/WSDL/Generator/Visitor.pm spelling
|
||||
* [ 1944360 ] SOAP/WSDL/Generator/Iterator/WSDL11.pm spelling
|
||||
* [ 1944359 ] SOAP::WSDL::Factory::Transport spelling
|
||||
* [ 1944355 ] SOAP::WSDL::Deserializer::XSD.pm spelling
|
||||
Thanks to "nobody" for correcting these errors.
|
||||
|
||||
* [ 1942576 ] SOAP/WSDL/Deserializer/SOM.pm spelling.
|
||||
* [ 1942568 ] SOAP/WSDL/Client.pm minor spelling/grammar/style cleanup.
|
||||
* [ 1942562 ] WSDL.pm spelling corrections.
|
||||
Thanks to Noah Robin for providing patches for these errors.
|
||||
|
||||
* #34642 booleans in WSDL attributes don't get converted to perl's
|
||||
representation (for now - not all attributes covered yet)
|
||||
* #34714: MessageParser misses character data in elements just below SOAP-ENV:Body
|
||||
* #34688: wsdl2perl.pl croaks when WSDL operation uses a header
|
||||
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
* Storable freeze/thaw speedup in conjunction with upcoming version of
|
||||
Class::Std::Fast
|
||||
* improved server doc generation
|
||||
* improved xsi:nil handling
|
||||
* serializing an attribute from http://www.w3.org/XML/1998/namespace now
|
||||
serializes it with xml: prefix. This should probably be moved into the
|
||||
generator, to avoid testing every attribute
|
||||
|
||||
2.00_33 - Mar 30 2008
|
||||
|
||||
The following features were added (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||
|
||||
* [ 1925336 ] Create a Prefix Resolver Plugin Interface for Code Generator
|
||||
* [ 1898591 ] object stringify returns undef
|
||||
* [ 1906753 ] Hypens in MyTypes/* cause runtime syntax errors
|
||||
Hypens and dots in variable and method names are now replaced by _
|
||||
|
||||
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/).
|
||||
|
||||
* #33616: Bugs in the META.yml file
|
||||
* [ 1892895 ] Test failures on RHEL4
|
||||
* [ 1844956 ] t/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKENS fails test on OS X
|
||||
* #33376: HTTP Authentication (not implemented or not documented)
|
||||
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
* Some minor performance improvements have been made
|
||||
* The XSD generator now asserts the soap:operation style is "document"
|
||||
* <wsdl:import> and <xsd:import> now import namespace declarations, too
|
||||
* The XSD generator now uses the relevant <wsdl:portType>'s
|
||||
targetNamespace for finding operation messages, not the <wsdl:definition>
|
||||
element's targetNamespace
|
||||
* Attribute handling has been improved so it could possibly work.
|
||||
Attributes from different namespaces are probably still broken.
|
||||
* Attribute ref handling has been added (though probably broken on
|
||||
ref cascades).
|
||||
* <xsd:attributeGroup> elements are now parsed, but have no effect yet.
|
||||
* <xsd:enumeration> elements are now parsed, but have no effect yet.
|
||||
|
||||
2.00_32 - Feb 14 2008
|
||||
|
||||
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/).
|
||||
|
||||
@@ -55,25 +249,25 @@ The following uncategorized improvements have been made:
|
||||
---
|
||||
WARNING: INCOMPATIBLE CHANGE:
|
||||
|
||||
SOAP::WSDL now uses Class::Std::Fast. Read the MIGRATING guide for
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
@@ -82,7 +276,7 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||
for even faster XS implementations.
|
||||
* [ 1842436 ] Add SOAP Server
|
||||
|
||||
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):
|
||||
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||
|
||||
@@ -100,13 +294,13 @@ The following uncategorized improvements have been made:
|
||||
|
||||
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):
|
||||
|
||||
* [ 1832998 ] Make interface methods complain when called as class method
|
||||
* [ 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):
|
||||
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||
|
||||
@@ -115,7 +309,7 @@ The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||
* [ 1828240 ] POD Defects
|
||||
* [ 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
|
||||
* Documentation has been improved
|
||||
@@ -123,160 +317,160 @@ The following uncategorized improvements have been made:
|
||||
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):
|
||||
|
||||
* [ 1826382 ] nillable elements not serialized as xsi:nil
|
||||
* [ 1826337 ] Second element in complexType gets eaten up
|
||||
* [ 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
|
||||
|
||||
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):
|
||||
|
||||
* [ 1817697 ] Dots in service/port names lead to broken interfaces
|
||||
* [ 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,
|
||||
|
||||
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):
|
||||
|
||||
* [ 1810058 ] .tt's pod indexed on CPAN (again)
|
||||
* [ 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
|
||||
|
||||
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):
|
||||
|
||||
* [ 1815646 ] Only include last part of port name in interface
|
||||
* [ 1815648 ] Methods with empty body cannot be called as ->method()
|
||||
* [ 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):
|
||||
|
||||
* [ 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
|
||||
* fixed tests to use correct path on windows
|
||||
|
||||
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):
|
||||
|
||||
* [ 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):
|
||||
|
||||
* [ 1813144 ] Typemap not used in interface class
|
||||
* [ 1810058 ] .tt's pod indexed on CPAN
|
||||
|
||||
The following uncategorized improvements have been made:
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
* Documentation improvements
|
||||
|
||||
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):
|
||||
|
||||
* [ 1790983 ] Create generator Plugin API
|
||||
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):
|
||||
|
||||
* [ 1805252 ] t/SOAP/WSDL/XSD/Typelib/Builtin/004_time.t fails
|
||||
The default timezone conversion has been fixed.
|
||||
|
||||
The following uncategorized improvements have been made:
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
* Documentation improvements
|
||||
* 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
|
||||
|
||||
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):
|
||||
|
||||
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):
|
||||
|
||||
* [ 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.
|
||||
|
||||
* [ 1805238 ] Tests in t/SOAP/WSDL don't work when run from t/
|
||||
|
||||
* [ 1805241 ] explain() broken in 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.
|
||||
SOAP::WSDL now supports this XML Schema definition variant, although no
|
||||
constraints are imposed on derived types yet.
|
||||
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
|
||||
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
|
||||
types as a substitute for theri parent, yet.
|
||||
|
||||
* Added support for complexType choice variety
|
||||
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).
|
||||
|
||||
* 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.
|
||||
|
||||
* Fixed SOAP::WSDL::Factory::Transport prefer user-registered
|
||||
* Fixed SOAP::WSDL::Factory::Transport prefer user-registered
|
||||
transport backend
|
||||
|
||||
* 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.
|
||||
|
||||
* 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.
|
||||
|
||||
* 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.
|
||||
|
||||
* 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.
|
||||
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.
|
||||
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
|
||||
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.
|
||||
|
||||
|
||||
* XML serialization speedup for SOAP::WSDL::XSD::* objects
|
||||
|
||||
* Tests added to improve test coverage.
|
||||
@@ -287,7 +481,7 @@ The following uncategorized improvements have been made:
|
||||
|
||||
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):
|
||||
|
||||
* [ 1761532 ] Support embedded atomic types
|
||||
@@ -303,11 +497,11 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||
* [ 1803330 ] Create one interface per port
|
||||
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):
|
||||
|
||||
* [ 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.
|
||||
|
||||
* [ 1803763 ] nonNegativeInteger misspelled in Schema::Builtin
|
||||
@@ -315,35 +509,35 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
* [ 1793965 ] _expand() does not work on non-root-node ns declarations
|
||||
|
||||
* [ 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.
|
||||
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
|
||||
The code generator now generates interfaces for all ports.
|
||||
Note: The naming scheme has changed. It is now
|
||||
InterfacePrefix::Service::Port
|
||||
|
||||
|
||||
* XML Parser 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.
|
||||
|
||||
|
||||
* Documentation has been improved
|
||||
|
||||
|
||||
* A number of (incorrect, but passing) tests have been fixed.
|
||||
|
||||
* 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
|
||||
* 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
|
||||
subversion repository in the attic directory, though.
|
||||
|
||||
|
||||
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):
|
||||
|
||||
* [ 1792321 ] 2.00_14 requires SOAP::Lite for passing tests
|
||||
@@ -351,7 +545,7 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
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):
|
||||
|
||||
* [ 1792235 ] SOAP::WSDL::Transport::Test missing from 2.00_13
|
||||
@@ -362,7 +556,7 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
|
||||
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
|
||||
* Factories now emit more useful error messages when no class is registered
|
||||
for the protocol/soap_version requested
|
||||
@@ -373,36 +567,36 @@ The following uncategorized improvements have been made:
|
||||
|
||||
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):
|
||||
|
||||
* [ 1790619 ] Test transport backend
|
||||
A test transport backend has been implemented (SOAP::WSDL::Transport::Test).
|
||||
It returns the contents from a file and discards the response.
|
||||
The filename is determined from the soap_action field.
|
||||
|
||||
|
||||
* [ 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.
|
||||
|
||||
* [1785195] Support deserializer plugins
|
||||
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):
|
||||
|
||||
* [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.
|
||||
|
||||
* [1787975] 016_client_object.t fails due to testing XML as string
|
||||
Removed string test.
|
||||
|
||||
|
||||
* [1787959] Test wsdl seems to be broken
|
||||
Corrected typo.
|
||||
|
||||
|
||||
* [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.
|
||||
|
||||
* [1785646] SOAPAction header not set from soap:operation soapAction
|
||||
@@ -414,55 +608,55 @@ The following uncategorized improvements have been made:
|
||||
|
||||
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):
|
||||
|
||||
* [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.
|
||||
|
||||
|
||||
* [1787054] Test suite requires XML::LibXML in 2.00_11
|
||||
The test suite no longer requires XML::LibXML to pass.
|
||||
|
||||
* [1785678] SOAP envelope not checked for namespace
|
||||
The SOAP envelope is now checked for the correct namespace.
|
||||
|
||||
|
||||
* [1786644] SOAP::WSDL::Manual - doc error
|
||||
Documentation improvements
|
||||
|
||||
|
||||
The following uncategorized improvements have been made
|
||||
|
||||
* The SOAPAction header is now alway quoted (R1109 in WS-I BP 1.0).
|
||||
|
||||
|
||||
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):
|
||||
|
||||
* [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.
|
||||
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.
|
||||
Custom serializers classes can be registered via
|
||||
SOAP::WSDL::Factory::Serializer or set via SOAP::WSDL's set_serializer
|
||||
Custom serializers classes can be registered via
|
||||
SOAP::WSDL::Factory::Serializer or set via SOAP::WSDL's set_serializer
|
||||
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):
|
||||
|
||||
* [ 1764854 ] Port WSDL parser to expat and remove XML::LibXML dependency
|
||||
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.
|
||||
|
||||
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:
|
||||
- XML::SAX::Base
|
||||
- XML::SAX::ParserFactory
|
||||
@@ -481,27 +675,27 @@ The following uncategorized improvements have been made
|
||||
|
||||
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...)
|
||||
* date/time test are now timezone-sensitive
|
||||
* examples added
|
||||
|
||||
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.
|
||||
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.
|
||||
* 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().
|
||||
* 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
|
||||
* 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)
|
||||
- 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
|
||||
* SOAP::WSDL::Definitions::create() includes doc in generated interface classes
|
||||
* WSDLHandler now handles <wsdl:documentation> tags
|
||||
@@ -512,7 +706,7 @@ The following uncategorized improvements have been made
|
||||
* Implemented a Code generator for creating SOAP interfaces based on WSDL definitions
|
||||
* Implemented a high-speed stream based SOAP message parser
|
||||
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.
|
||||
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).
|
||||
|
||||
84
MANIFEST
84
MANIFEST
@@ -2,6 +2,8 @@ benchmark/01_expat.t
|
||||
benchmark/hello.pl
|
||||
benchmark/person.pl
|
||||
benchmark/person.xml
|
||||
benchmark/person_profile.pl
|
||||
benchmark/person_single.pl
|
||||
benchmark/XSD/01_anyType.t
|
||||
benchmark/XSD/02_anySimpleType.t
|
||||
benchmark/XSD/03_string.t
|
||||
@@ -50,10 +52,16 @@ 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
|
||||
@@ -85,23 +93,37 @@ lib/SOAP/WSDL/Factory/Deserializer.pm
|
||||
lib/SOAP/WSDL/Factory/Generator.pm
|
||||
lib/SOAP/WSDL/Factory/Serializer.pm
|
||||
lib/SOAP/WSDL/Factory/Transport.pm
|
||||
lib/SOAP/WSDL/Generator/Iterator/WSDL11.pm
|
||||
lib/SOAP/WSDL/Generator/PrefixResolver.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/_type_class.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/attribute.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/atomicTypes.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/attributeSet.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/contentModel.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/all.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/attributeSet.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/content_model.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/simpleContent/extension.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/simpleContent/restriction.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/structure.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/structure/restriction.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/structure/simpleContent.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/simpleContent/extension.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/POD/contentModel.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/element/POD/structure.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/Interface.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/Interface/Body.tt
|
||||
@@ -113,6 +135,7 @@ 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/Part.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Type.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/POD/annotation.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
|
||||
@@ -122,10 +145,13 @@ lib/SOAP/WSDL/Generator/Template/XSD/simpleType.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/list.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/contentModel.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/list.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/restriction.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/structure.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/union.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/restriction.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/union.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/Typemap.tt
|
||||
lib/SOAP/WSDL/Generator/Visitor.pm
|
||||
lib/SOAP/WSDL/Generator/Visitor/Typelib.pm
|
||||
@@ -158,12 +184,29 @@ lib/SOAP/WSDL/Transport/Loopback.pm
|
||||
lib/SOAP/WSDL/Transport/Test.pm
|
||||
lib/SOAP/WSDL/TypeLookup.pm
|
||||
lib/SOAP/WSDL/Types.pm
|
||||
lib/SOAP/WSDL/XSD/Annotation.pm
|
||||
lib/SOAP/WSDL/XSD/Attribute.pm
|
||||
lib/SOAP/WSDL/XSD/AttributeGroup.pm
|
||||
lib/SOAP/WSDL/XSD/Builtin.pm
|
||||
lib/SOAP/WSDL/XSD/ComplexType.pm
|
||||
lib/SOAP/WSDL/XSD/Element.pm
|
||||
lib/SOAP/WSDL/XSD/Enumeration.pm
|
||||
lib/SOAP/WSDL/XSD/FractionDigits.pm
|
||||
lib/SOAP/WSDL/XSD/Group.pm
|
||||
lib/SOAP/WSDL/XSD/Length.pm
|
||||
lib/SOAP/WSDL/XSD/MaxExclusive.pm
|
||||
lib/SOAP/WSDL/XSD/MaxInclusive.pm
|
||||
lib/SOAP/WSDL/XSD/MaxLength.pm
|
||||
lib/SOAP/WSDL/XSD/MinExclusive.pm
|
||||
lib/SOAP/WSDL/XSD/MinInclusive.pm
|
||||
lib/SOAP/WSDL/XSD/MinLength.pm
|
||||
lib/SOAP/WSDL/XSD/Pattern.pm
|
||||
lib/SOAP/WSDL/XSD/Schema.pm
|
||||
lib/SOAP/WSDL/XSD/Schema/Builtin.pm
|
||||
lib/SOAP/WSDL/XSD/SimpleType.pm
|
||||
lib/SOAP/WSDL/XSD/TotalDigits.pm
|
||||
lib/SOAP/WSDL/XSD/Typelib/Attribute.pm
|
||||
lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm
|
||||
lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
|
||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
|
||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
|
||||
@@ -214,12 +257,14 @@ lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
|
||||
lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
|
||||
lib/SOAP/WSDL/XSD/Typelib/Element.pm
|
||||
lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
||||
lib/SOAP/WSDL/XSD/WhiteSpace.pm
|
||||
LICENSE
|
||||
Makefile.PL
|
||||
MANIFEST This list of files
|
||||
META.yml
|
||||
MIGRATING
|
||||
README
|
||||
SOAP-WSDL-2.00_32.tar
|
||||
t/001_use.t
|
||||
t/002_parse_wsdl.t
|
||||
t/003_wsdl_based_serializer.t
|
||||
@@ -234,6 +279,7 @@ t/013_complexType.t
|
||||
t/016_client_object.t
|
||||
t/017_generator.t
|
||||
t/020_storable.t
|
||||
t/095_copying.t
|
||||
t/096_characters.t
|
||||
t/097_kwalitee.t
|
||||
t/098_pod.t
|
||||
@@ -261,20 +307,31 @@ t/acceptance/wsdl/10_helloworld.asmx.xml
|
||||
t/acceptance/wsdl/11_helloworld.wsdl
|
||||
t/acceptance/wsdl/contributed/Axis.wsdl
|
||||
t/acceptance/wsdl/contributed/ETest.wsdl
|
||||
t/acceptance/wsdl/contributed/gasquery.wsdl
|
||||
t/acceptance/wsdl/contributed/OITest.wsdl
|
||||
t/acceptance/wsdl/contributed/tools.wsdl
|
||||
t/acceptance/wsdl/elementAtomicComplexType.xml
|
||||
t/acceptance/wsdl/email_account.wsdl
|
||||
t/acceptance/wsdl/generator_test.wsdl
|
||||
t/acceptance/wsdl/generator_test_dot_names.wsdl
|
||||
t/acceptance/wsdl/generator_unsupported_test.wsdl
|
||||
t/acceptance/wsdl/import.xsd
|
||||
t/acceptance/wsdl/import_loop.xsd
|
||||
t/acceptance/wsdl/message_gateway.wsdl
|
||||
t/acceptance/wsdl/nested_complextype.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/Expat/01_expat.t
|
||||
t/Expat/03_wsdl.t
|
||||
t/lib/MyComplexType.pm
|
||||
t/lib/MyElement.pm
|
||||
t/lib/MySimpleType.pm
|
||||
t/lib/Test/SOAPMessage.pm
|
||||
t/lib/Test/SOAP/WSDL/Expat/WSDLParser.pm
|
||||
t/lib/Test/SOAP/WSDL/Generator/Iterator/WSDL11.pm
|
||||
t/lib/Test/SOAP/WSDL/Generator/Visitor/Typemap.pm
|
||||
t/lib/Test/SOAP/WSDL/Tester.pm
|
||||
t/lib/Typelib/Base.pm
|
||||
t/lib/Typelib/TEnqueueMessage.pm
|
||||
t/lib/Typelib/TMessage.pm
|
||||
@@ -297,20 +354,29 @@ t/SOAP/WSDL/05_simpleType-union.t
|
||||
t/SOAP/WSDL/06_keep_alive.t
|
||||
t/SOAP/WSDL/11_helloworld.NET.t
|
||||
t/SOAP/WSDL/12_binding.t
|
||||
t/SOAP/WSDL/Client.t
|
||||
t/SOAP/WSDL/Client/Base.t
|
||||
t/SOAP/WSDL/Definitions.t
|
||||
t/SOAP/WSDL/Deserializer/Hash.t
|
||||
t/SOAP/WSDL/Deserializer/SOM.t
|
||||
t/SOAP/WSDL/Deserializer/XSD.t
|
||||
t/SOAP/WSDL/Expat/Base.t
|
||||
t/SOAP/WSDL/Expat/MessageParser.t
|
||||
t/SOAP/WSDL/Expat/WSDLParser.t
|
||||
t/SOAP/WSDL/Factory/Deserializer.t
|
||||
t/SOAP/WSDL/Factory/Serializer.t
|
||||
t/SOAP/WSDL/Factory/Transport.t
|
||||
t/SOAP/WSDL/Generator/attr.pl
|
||||
t/SOAP/WSDL/Generator/Template.t
|
||||
t/SOAP/WSDL/Generator/Visitor.t
|
||||
t/SOAP/WSDL/Generator/Visitor/Typemap.t
|
||||
t/SOAP/WSDL/Generator/XCS.t
|
||||
t/SOAP/WSDL/Generator/XSD.t
|
||||
t/SOAP/WSDL/Generator/XSD_dot_names.t
|
||||
t/SOAP/WSDL/Generator/XSD_nested_complextype.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
|
||||
@@ -318,6 +384,16 @@ t/SOAP/WSDL/Transport/02_HTTP.t
|
||||
t/SOAP/WSDL/Transport/acceptance/test2.xml
|
||||
t/SOAP/WSDL/Transport/acceptance/test3.xml
|
||||
t/SOAP/WSDL/Typelib/Fault11.t
|
||||
t/SOAP/WSDL/Types.t
|
||||
t/SOAP/WSDL/XSD/Attribute.t
|
||||
t/SOAP/WSDL/XSD/AttributeGroup.t
|
||||
t/SOAP/WSDL/XSD/Builtin.t
|
||||
t/SOAP/WSDL/XSD/ComplexType.t
|
||||
t/SOAP/WSDL/XSD/Element.t
|
||||
t/SOAP/WSDL/XSD/Enumeration.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/anySimpleType.t
|
||||
t/SOAP/WSDL/XSD/Typelib/Builtin/anyType.t
|
||||
|
||||
179
META.yml
179
META.yml
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: SOAP-WSDL
|
||||
version: 2.00_26
|
||||
version: 2.00.01
|
||||
author:
|
||||
- 'Martin Kutter <martin.kutter@fen-net.de>'
|
||||
abstract: SOAP with WSDL support
|
||||
@@ -8,13 +8,7 @@ license: artistic
|
||||
resources:
|
||||
license: http://opensource.org/licenses/artistic-license.php
|
||||
requires:
|
||||
Class::Std::Fast: !!perl/hash:version
|
||||
original: v0.0.5
|
||||
qv: 1
|
||||
version:
|
||||
- 0
|
||||
- 0
|
||||
- 5
|
||||
Class::Std::Fast: 0.0.5
|
||||
Data::Dumper: 0
|
||||
Date::Format: 0
|
||||
Date::Parse: 0
|
||||
@@ -25,141 +19,236 @@ requires:
|
||||
List::Util: 0
|
||||
Template: 0
|
||||
Term::ReadKey: 0
|
||||
URI: 0
|
||||
XML::Parser::Expat: 0
|
||||
perl: 5.8.0
|
||||
build_requires:
|
||||
Class::Std::Fast: 0.0.5
|
||||
Cwd: 0
|
||||
Date::Format: 0
|
||||
Date::Parse: 0
|
||||
File::Basename: 0
|
||||
File::Path: 0
|
||||
File::Spec: 0
|
||||
Getopt::Long: 0
|
||||
LWP::UserAgent: 0
|
||||
List::Util: 0
|
||||
Module::Build: 0
|
||||
Storable: 0
|
||||
Template: 0
|
||||
Test::More: 0
|
||||
XML::Parser::Expat: 0
|
||||
provides:
|
||||
SOAP::WSDL:
|
||||
file: lib/SOAP/WSDL.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Base:
|
||||
file: lib/SOAP/WSDL/Base.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Binding:
|
||||
file: lib/SOAP/WSDL/Binding.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Client:
|
||||
file: lib/SOAP/WSDL/Client.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Client::Base:
|
||||
file: lib/SOAP/WSDL/Client/Base.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Definitions:
|
||||
file: lib/SOAP/WSDL/Definitions.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Deserializer::Hash:
|
||||
file: lib/SOAP/WSDL/Deserializer/Hash.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Deserializer::SOM:
|
||||
file: lib/SOAP/WSDL/Deserializer/SOM.pm
|
||||
version: 2.00_24
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Deserializer::XSD:
|
||||
file: lib/SOAP/WSDL/Deserializer/XSD.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Expat::Base:
|
||||
file: lib/SOAP/WSDL/Expat/Base.pm
|
||||
version: 2.00_24
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Expat::Message2Hash:
|
||||
file: lib/SOAP/WSDL/Expat/Message2Hash.pm
|
||||
version: 2.00_24
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Expat::MessageParser:
|
||||
file: lib/SOAP/WSDL/Expat/MessageParser.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Expat::MessageStreamParser:
|
||||
file: lib/SOAP/WSDL/Expat/MessageStreamParser.pm
|
||||
version: 2.00_24
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Factory::Deserializer:
|
||||
file: lib/SOAP/WSDL/Factory/Deserializer.pm
|
||||
version: 2.00_24
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Factory::Generator:
|
||||
file: lib/SOAP/WSDL/Factory/Generator.pm
|
||||
version: 2.00_24
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Factory::Serializer:
|
||||
file: lib/SOAP/WSDL/Factory/Serializer.pm
|
||||
version: 2.00_24
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Factory::Transport:
|
||||
file: lib/SOAP/WSDL/Factory/Transport.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Generator::Iterator::WSDL11:
|
||||
file: lib/SOAP/WSDL/Generator/Iterator/WSDL11.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Generator::PrefixResolver:
|
||||
file: lib/SOAP/WSDL/Generator/PrefixResolver.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Generator::Template:
|
||||
file: lib/SOAP/WSDL/Generator/Template.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Generator::Template::Plugin::XSD:
|
||||
file: lib/SOAP/WSDL/Generator/Template/Plugin/XSD.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Generator::Template::XSD:
|
||||
file: lib/SOAP/WSDL/Generator/Template/XSD.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Generator::Visitor:
|
||||
file: lib/SOAP/WSDL/Generator/Visitor.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Generator::Visitor::Typelib:
|
||||
file: lib/SOAP/WSDL/Generator/Visitor/Typelib.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Generator::Visitor::Typemap:
|
||||
file: lib/SOAP/WSDL/Generator/Visitor/Typemap.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Message:
|
||||
file: lib/SOAP/WSDL/Message.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::OpMessage:
|
||||
file: lib/SOAP/WSDL/OpMessage.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Operation:
|
||||
file: lib/SOAP/WSDL/Operation.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Part:
|
||||
file: lib/SOAP/WSDL/Part.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Port:
|
||||
file: lib/SOAP/WSDL/Port.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::PortType:
|
||||
file: lib/SOAP/WSDL/PortType.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::SOAP::Address:
|
||||
file: lib/SOAP/WSDL/SOAP/Address.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::SOAP::Body:
|
||||
file: lib/SOAP/WSDL/SOAP/Body.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::SOAP::Header:
|
||||
file: lib/SOAP/WSDL/SOAP/Header.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::SOAP::HeaderFault:
|
||||
file: lib/SOAP/WSDL/SOAP/HeaderFault.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::SOAP::Operation:
|
||||
file: lib/SOAP/WSDL/SOAP/Operation.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::SOAP::Typelib::Fault11:
|
||||
file: lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Serializer::XSD:
|
||||
file: lib/SOAP/WSDL/Serializer/XSD.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Server:
|
||||
file: lib/SOAP/WSDL/Server.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Server::CGI:
|
||||
file: lib/SOAP/WSDL/Server/CGI.pm
|
||||
version: 2.00_26
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Service:
|
||||
file: lib/SOAP/WSDL/Service.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Transport::HTTP:
|
||||
file: lib/SOAP/WSDL/Transport/HTTP.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Transport::Loopback:
|
||||
file: lib/SOAP/WSDL/Transport/Loopback.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Transport::Test:
|
||||
file: lib/SOAP/WSDL/Transport/Test.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::TypeLookup:
|
||||
file: lib/SOAP/WSDL/TypeLookup.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::Types:
|
||||
file: lib/SOAP/WSDL/Types.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::Annotation:
|
||||
file: lib/SOAP/WSDL/XSD/Annotation.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::Attribute:
|
||||
file: lib/SOAP/WSDL/XSD/Attribute.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::AttributeGroup:
|
||||
file: lib/SOAP/WSDL/XSD/AttributeGroup.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::Builtin:
|
||||
file: lib/SOAP/WSDL/XSD/Builtin.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::ComplexType:
|
||||
file: lib/SOAP/WSDL/XSD/ComplexType.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::Element:
|
||||
file: lib/SOAP/WSDL/XSD/Element.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::Enumeration:
|
||||
file: lib/SOAP/WSDL/XSD/Enumeration.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::FractionDigits:
|
||||
file: lib/SOAP/WSDL/XSD/FractionDigits.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::Group:
|
||||
file: lib/SOAP/WSDL/XSD/Group.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::Length:
|
||||
file: lib/SOAP/WSDL/XSD/Length.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::MaxExclusive:
|
||||
file: lib/SOAP/WSDL/XSD/MaxExclusive.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::MaxInclusive:
|
||||
file: lib/SOAP/WSDL/XSD/MaxInclusive.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::MaxLength:
|
||||
file: lib/SOAP/WSDL/XSD/MaxLength.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::MinExclusive:
|
||||
file: lib/SOAP/WSDL/XSD/MinExclusive.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::MinInclusive:
|
||||
file: lib/SOAP/WSDL/XSD/MinInclusive.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::MinLength:
|
||||
file: lib/SOAP/WSDL/XSD/MinLength.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::Pattern:
|
||||
file: lib/SOAP/WSDL/XSD/Pattern.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::Schema:
|
||||
file: lib/SOAP/WSDL/XSD/Schema.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::Schema::Builtin:
|
||||
file: lib/SOAP/WSDL/XSD/Schema/Builtin.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::SimpleType:
|
||||
file: lib/SOAP/WSDL/XSD/SimpleType.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::TotalDigits:
|
||||
file: lib/SOAP/WSDL/XSD/TotalDigits.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::Typelib::Attribute:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/Attribute.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::Typelib::AttributeSet:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::Typelib::Builtin:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::ENTITY:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::ID:
|
||||
@@ -184,6 +273,7 @@ provides:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::anyType:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
|
||||
version: 2.00_29
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::anyURI:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::base64Binary:
|
||||
@@ -256,14 +346,19 @@ provides:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::Typelib::Element:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/Element.pm
|
||||
version: 2.00_25
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::Typelib::SimpleType:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::Typelib::SimpleType::restriction:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
||||
version: 2.00.01
|
||||
SOAP::WSDL::XSD::WhiteSpace:
|
||||
file: lib/SOAP/WSDL/XSD/WhiteSpace.pm
|
||||
version: 2.00.01
|
||||
generated_by: Module::Build version 0.2808
|
||||
meta-spec:
|
||||
url: http://module-build.sourceforge.net/META-spec-v1.2.html
|
||||
|
||||
41
MIGRATING
41
MIGRATING
@@ -1,7 +1,36 @@
|
||||
MIGRATING
|
||||
---------
|
||||
MIGRATING FROM PRE-2.00_33
|
||||
--------------------------
|
||||
The handling of stringification of SOAP::WSDL::XSD simpleType objects with
|
||||
undef values changed in 2.00_33.
|
||||
|
||||
This document describes how to migrate from 2.00_24 and before versions to
|
||||
While 2.00_32 and before returned undef on stringification of a undef value,
|
||||
>=2.00_33 now returns an empty string.
|
||||
|
||||
This is due to common usage in templates or the like, where undef is likely
|
||||
to produce a warning, and the unreliable behavior of
|
||||
$obj eq undef
|
||||
which behaves differently in different versions of perl.
|
||||
|
||||
|
||||
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
|
||||
@@ -9,9 +38,9 @@ Migrating from 2.00_xx
|
||||
|
||||
Background
|
||||
|
||||
SOAP::WSDL 2.00_xx has used Class::Std as base for its inside out objects
|
||||
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
|
||||
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
|
||||
@@ -26,8 +55,8 @@ 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
|
||||
If you use __SKIP__ in your typemaps, you'll have to comment out all
|
||||
paths deeper than the path marked with __SKIP__ - if you don't, SOAP::WSDL
|
||||
will try to load all correspondent classes.
|
||||
|
||||
Migrating from 1.xx
|
||||
@@ -39,7 +68,7 @@ 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.
|
||||
You should be able to use your existing code under most circumstances.
|
||||
SOAP::WSDL is the compatibility module for old interfaces.
|
||||
|
||||
Overloading
|
||||
|
||||
27
Makefile.PL
27
Makefile.PL
@@ -1,30 +1,5 @@
|
||||
# Note: this file was auto-generated by Module::Build::Compat version 0.03
|
||||
|
||||
unless (eval "use Module::Build::Compat 0.02; 1" ) {
|
||||
print "This module requires Module::Build to install itself.\n";
|
||||
|
||||
require ExtUtils::MakeMaker;
|
||||
my $yn = ExtUtils::MakeMaker::prompt
|
||||
(' Install Module::Build now from CPAN?', 'y');
|
||||
|
||||
unless ($yn =~ /^y/i) {
|
||||
die " *** Cannot install without Module::Build. Exiting ...\n";
|
||||
}
|
||||
|
||||
require Cwd;
|
||||
require File::Spec;
|
||||
require CPAN;
|
||||
|
||||
# Save this 'cause CPAN will chdir all over the place.
|
||||
my $cwd = Cwd::cwd();
|
||||
|
||||
CPAN::Shell->install('Module::Build::Compat');
|
||||
CPAN::Shell->expand("Module", "Module::Build::Compat")->uptodate
|
||||
or die "Couldn't install Module::Build, giving up.\n";
|
||||
|
||||
chdir $cwd or die "Cannot chdir() back to $cwd: $!";
|
||||
}
|
||||
eval "use Module::Build::Compat 0.02; 1" or die $@;
|
||||
use Module::Build::Compat 0.02;
|
||||
|
||||
Module::Build::Compat->run_build_pl(args => \@ARGV);
|
||||
require Module::Build;
|
||||
|
||||
26
README
26
README
@@ -3,7 +3,25 @@ INTRO
|
||||
|
||||
SOAP-WSDL provides a SOAP client with WSDL support.
|
||||
|
||||
This is a developer release - everything may (and most things will) change.
|
||||
SUBCLASSING
|
||||
-----------
|
||||
|
||||
SOAP-WSDL is still under very active development. Please don't build
|
||||
applications using the following modules directly:
|
||||
|
||||
- SOAP::WSDL::Definitions
|
||||
- SOAP::WSDL::Port
|
||||
- SOAP::WSDL::PortType
|
||||
- SOAP::WSDL::Binding
|
||||
- SOAP::WSDL::Message
|
||||
- SOAP::WSDL::Operation
|
||||
- SOAP::WSDL::OpMessage
|
||||
- SOAP::WSDL::Part
|
||||
- SOAP::WSDL::Service
|
||||
- SOAP::WSDL::Types
|
||||
- SOAP::WSDL::XSD::Schema
|
||||
|
||||
Those will be replaced some time in the future.
|
||||
|
||||
INSTALLING
|
||||
----------
|
||||
@@ -15,12 +33,12 @@ Use the following mantra:
|
||||
perl Build test
|
||||
perl Build install
|
||||
|
||||
If you don't have Module::Build installed, you may also use
|
||||
If you don't have Module::Build installed, you may also use
|
||||
|
||||
perl Makefile.PL
|
||||
make
|
||||
make
|
||||
make test
|
||||
make install
|
||||
|
||||
Note that Module::Build is the recommended installer - make will not run
|
||||
Note that Module::Build is the recommended installer - make will not run
|
||||
all tests provided with SOAP-WSDL.
|
||||
BIN
SOAP-WSDL-2.00_32.tar
Normal file
BIN
SOAP-WSDL-2.00_32.tar
Normal file
Binary file not shown.
@@ -1,11 +1,17 @@
|
||||
# Unfortunately, Build testcover reports test coverage wrong.
|
||||
#
|
||||
# To get a complete coverage report, just run this file as a shell script
|
||||
# To get a complete coverage report, just run this file as a shell script
|
||||
# on a linux box (or execute the equivalent commands on another OS):
|
||||
|
||||
#
|
||||
# Note that this shell script requires Devel::CoverX::Covered - if you
|
||||
# don't have it, comment out the line noted below
|
||||
#
|
||||
cd t/
|
||||
|
||||
cover -delete
|
||||
find . -type f -name '*.t' | xargs -n 1 /usr/bin/perl -MDevel::Cover=-silent,1,-summary,0 -I../lib
|
||||
|
||||
# Devel::CoverX::Covered
|
||||
covered runs
|
||||
|
||||
cover -ignore_re \.t$ -ignore_re ^lib -coverage="statement" -coverage=condition -coverage=subroutine -coverage="branch"
|
||||
|
||||
|
||||
13
TODO
13
TODO
@@ -1,24 +1,19 @@
|
||||
TODO list for SOAP::WSDL
|
||||
|
||||
2.00 Pre-releases
|
||||
--------
|
||||
|
||||
2.1 release
|
||||
--------
|
||||
* Support namespaces in SOAP message payload(#1809057)
|
||||
* Support namespaces in SOAP message payload [ 1809057 ]
|
||||
|
||||
* Support the xsi:type attribute on derived types on the wire(#1809059)
|
||||
* Support the xsi:type attribute on derived types on the wire [ 1809059 ]
|
||||
|
||||
* SOAP1.2 support (#1803331)
|
||||
* SOAP1.2 support [ 1803331 ]
|
||||
|
||||
2.2 release
|
||||
--------
|
||||
* XML schema support ("minimal conformant") (#1764845)
|
||||
* XML schema support ("minimal conformant") [ 1764845 ]
|
||||
|
||||
* Support SOAP attachments
|
||||
|
||||
* Act as SOAP Server
|
||||
|
||||
3.0 release
|
||||
--------
|
||||
We're not thinking that far ahead right now.
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
#!/usr/bin/perl -w
|
||||
%DB::packages=(SOAP::WSDL::Expat::MessageParser => 1);
|
||||
use strict;
|
||||
use warnings;
|
||||
use lib '../lib';
|
||||
use lib '../../Class-Std-Fast/lib';
|
||||
use lib '/home/martin/workspace/SOAP-WSDL_XS/blib/lib';
|
||||
use lib '/home/martin/workspace/SOAP-WSDL_XS/blib/arch';
|
||||
use lib '../t/lib';
|
||||
# use SOAP::WSDL::SAX::MessageHandler;
|
||||
|
||||
use Benchmark qw(cmpthese timethese);
|
||||
use SOAP::WSDL::Expat::MessageParser;
|
||||
use SOAP::WSDL::Expat::Message2Hash;
|
||||
use SOAP::WSDL::Expat::MessageParser_XS;
|
||||
use SOAP::Lite;
|
||||
use XML::Simple;
|
||||
use XML::LibXML;
|
||||
@@ -17,24 +19,50 @@ use MyComplexType;
|
||||
use MyElement;
|
||||
use MySimpleType;
|
||||
|
||||
my $xml = q{<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
my $xml = q{<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
|
||||
<SOAP-ENV:Body>
|
||||
<MyAtomicComplexTypeElement xmlns="urn:Test" >
|
||||
<test>
|
||||
<test2 >Test2</test2>
|
||||
<test2 >Test2</test2>
|
||||
<test2 >Test2</test2>
|
||||
<test2 >Test2</test2>
|
||||
<test2 >Test2</test2>
|
||||
<test2 >Test2</test2>
|
||||
<test2 >Test2</test2>
|
||||
<test2 >Test2</test2>
|
||||
<test2 >Test2</test2>
|
||||
<test2 >Test2</test2>
|
||||
<test2 >Test2</test2>
|
||||
<test2 >Test2</test2>
|
||||
<test2 >Test55</test2>
|
||||
<test2 >Test2</test2>
|
||||
<test2 >Test3</test2>
|
||||
<test2 >Test4</test2>
|
||||
<test2 >Test5</test2>
|
||||
<test2 >Test6</test2>
|
||||
<test2 >Test7</test2>
|
||||
<test2 >Test8</test2>
|
||||
<test2 >Test9</test2>
|
||||
<test2 >Test10</test2>
|
||||
<test2 >Test11</test2>
|
||||
<test2 >Test12</test2>
|
||||
<test2 >Test13</test2>
|
||||
<test2 >Test55</test2>
|
||||
<test2 >Test14</test2>
|
||||
<test2 >Test15</test2>
|
||||
<test2 >Test16</test2>
|
||||
<test2 >Test17</test2>
|
||||
<test2 >Test18</test2>
|
||||
<test2 >Test19</test2>
|
||||
<test2 >Test20</test2>
|
||||
<test2 >Test21</test2>
|
||||
<test2 >Test22</test2>
|
||||
<test2 >Test23</test2>
|
||||
<test2 >Test24</test2>
|
||||
<test2 >Test25</test2>
|
||||
<test2 >Test565</test2>
|
||||
<test2 >Test27</test2>
|
||||
<test2 >Test28</test2>
|
||||
<test2 >Test29</test2>
|
||||
<test2 >Test30</test2>
|
||||
<test2 >Test31</test2>
|
||||
<test2 >Test32</test2>
|
||||
<test2 >Test33</test2>
|
||||
<test2 >Test34</test2>
|
||||
<test2 >Test35</test2>
|
||||
<test2 >Test36</test2>
|
||||
<test2 >Test37</test2>
|
||||
<test2 >Test38</test2>
|
||||
<test2 >Test55</test2>
|
||||
</test>
|
||||
</MyAtomicComplexTypeElement>
|
||||
</SOAP-ENV:Body></SOAP-ENV:Envelope>};
|
||||
@@ -57,13 +85,17 @@ my @data;
|
||||
|
||||
my $deserializer = SOAP::Deserializer->new();
|
||||
|
||||
sub libxml_test {
|
||||
my $parser_xs = SOAP::WSDL::Expat::MessageParser_XS->new({
|
||||
class_resolver => 'FakeResolver'
|
||||
});
|
||||
|
||||
sub libxml_test {
|
||||
my $dom = $libxml->parse_string( $xml );
|
||||
push @data, dom2hash( $dom->firstChild );
|
||||
};
|
||||
|
||||
sub dom2hash {
|
||||
for ($_[0]->childNodes) {
|
||||
for ($_[0]->childNodes) {
|
||||
if (exists $_[1]->{ $_->nodeName }) {
|
||||
if (ref $_[1]->{ $_->nodeName } eq 'ARRAY') {
|
||||
if ($_->nodeName eq '#text') {
|
||||
@@ -78,7 +110,7 @@ sub dom2hash {
|
||||
$_[1] = [ $_[1], $_->textContent() ];
|
||||
}
|
||||
else {
|
||||
$_[1]->{ $_->nodeName } = [ $_[1]->{ $_->nodeName } ,
|
||||
$_[1]->{ $_->nodeName } = [ $_[1]->{ $_->nodeName } ,
|
||||
dom2hash( $_, {} ) ];
|
||||
}
|
||||
}
|
||||
@@ -94,11 +126,11 @@ sub dom2hash {
|
||||
}
|
||||
return $_[1];
|
||||
}
|
||||
|
||||
cmpthese 5000,
|
||||
cmpthese 5000,
|
||||
{
|
||||
'SOAP::WSDL (Hash)' => sub { push @data, $hash_parser->parse( $xml ) },
|
||||
'SOAP::WSDL (XSD)' => sub { push @data, $parser->parse( $xml ) },
|
||||
'SOAP::WSDL_XS (XSD)' => sub { push @data, $parser_xs->parse_string( $xml ) },
|
||||
'XML::Simple (Hash)' => sub { push @data, XMLin $xml },
|
||||
'XML::LibXML (DOM)' => sub { push @data, $libxml->parse_string( $xml ) },
|
||||
'XML::LibXML (Hash)' => \&libxml_test,
|
||||
@@ -128,3 +160,18 @@ BEGIN {
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
__END__
|
||||
|
||||
Output on my machine:
|
||||
|
||||
xml length: 641 bytes
|
||||
Rate SOAP::Lite XML::Simple (Hash) SOAP::WSDL (XSD) XML::LibXML (Hash) SOAP::WSDL (Hash) SOAP::WSDL_XS (XSD) XML::LibXML (DOM)
|
||||
SOAP::Lite 446/s -- -54% -72% -73% -80% -95% -96%
|
||||
XML::Simple (Hash) 963/s 116% -- -39% -41% -57% -89% -91%
|
||||
SOAP::WSDL (XSD) 1587/s 256% 65% -- -3% -29% -81% -86%
|
||||
XML::LibXML (Hash) 1629/s 265% 69% 3% -- -27% -81% -85%
|
||||
SOAP::WSDL (Hash) 2222/s 398% 131% 40% 36% -- -74% -80%
|
||||
SOAP::WSDL_XS (XSD) 8475/s 1798% 780% 434% 420% 281% -- -24%
|
||||
XML::LibXML (DOM) 11111/s 2389% 1053% 600% 582% 400% 31% --
|
||||
|
||||
@@ -11,7 +11,7 @@ my $obj = SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new();
|
||||
timethese 10000, {
|
||||
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new() },
|
||||
'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new({
|
||||
value => 'Teststring'
|
||||
value => 'Teststring',
|
||||
}) },
|
||||
'set_FOO' => sub { $obj->set_value('Test') },
|
||||
};
|
||||
|
||||
@@ -11,8 +11,9 @@ my $obj = SOAP::WSDL::XSD::Typelib::Builtin::string->new();
|
||||
timethese 20000, {
|
||||
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new() },
|
||||
'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new({
|
||||
value => 'Teststring'
|
||||
}) },
|
||||
value => 'Teststring',
|
||||
})
|
||||
},
|
||||
};
|
||||
|
||||
$obj->set_value('Foobar');
|
||||
@@ -36,7 +37,7 @@ new + params: 1 wallclock secs ( 0.53 usr + 0.01 sys = 0.54 CPU) @ 37037.04/s
|
||||
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
|
||||
---
|
||||
@@ -47,7 +48,7 @@ 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
|
||||
::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)
|
||||
|
||||
@@ -1,29 +1,43 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use diagnostics;
|
||||
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 lib '../../SOAP-Lite-0.71/lib';
|
||||
use lib '/home/martin/workspace/SOAP-WSDL_XS/blib/lib';
|
||||
use lib '/home/martin/workspace/SOAP-WSDL_XS/blib/arch';
|
||||
use Data::Dumper;
|
||||
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);
|
||||
use Benchmark qw(cmpthese timethese);
|
||||
|
||||
use SOAP::WSDL::Transport::HTTP;
|
||||
use SOAP::WSDL::Factory::Transport;
|
||||
SOAP::WSDL::Factory::Transport->register('http', 'SOAP::WSDL::Transport::HTTP');
|
||||
|
||||
#my $proxy = 'http://localhost:81/soap-wsdl-test/helloworld.pl';
|
||||
my $proxy = 'http://localhost:81/soap-wsdl-test/helloworld';
|
||||
|
||||
my $lite = SOAP::Lite->new(
|
||||
proxy => 'http://localhost:81/soap-wsdl-test/helloworld.pl'
|
||||
proxy => $proxy
|
||||
);
|
||||
|
||||
$lite->on_action( sub { "urn:HelloWorld#sayHello" });
|
||||
$lite->autotype(0);
|
||||
|
||||
my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new();
|
||||
my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new({
|
||||
proxy => $proxy,
|
||||
});
|
||||
|
||||
my $soap_xs = MyInterfaces::HelloWorld::HelloWorldSoap->new();
|
||||
my $soap_xs = MyInterfaces::HelloWorld::HelloWorldSoap->new({
|
||||
proxy => $proxy,
|
||||
});
|
||||
$soap_xs->set_deserializer( SOAP::WSDL::Deserializer::XSD_XS->new() );
|
||||
|
||||
my @result;
|
||||
my @result = ();;
|
||||
|
||||
sub wsdl_bench {
|
||||
push @result, $soap->sayHello({
|
||||
@@ -40,7 +54,12 @@ sub wsdl_xs_bench {
|
||||
}
|
||||
|
||||
my $wsdl = XML::Compile::WSDL11->new('../example/wsdl/11_helloworld.wsdl');
|
||||
my $call = $wsdl->compileClient('sayHello');
|
||||
my $call = $wsdl->compileClient('sayHello',
|
||||
sloppy_integers => 1,
|
||||
check_values => 0,
|
||||
check_values => 0,
|
||||
validation => 0,
|
||||
);
|
||||
|
||||
sub compile_bench {
|
||||
push @result, $call->(
|
||||
@@ -58,12 +77,16 @@ sub lite_bench {
|
||||
);
|
||||
}
|
||||
|
||||
# give all a chance to perform first-run initializations
|
||||
compile_bench();
|
||||
lite_bench();
|
||||
wsdl_bench();
|
||||
wsdl_xs_bench();
|
||||
|
||||
cmpthese 150, {
|
||||
timethese 150, {
|
||||
'SOAP::WSDL' => \&wsdl_bench,
|
||||
'SOAP::WSDL_XS' => \&wsdl_xs_bench,
|
||||
'XML::Compile' => \&compile_bench,
|
||||
# 'SOAP::Lite' => \&lite_bench,
|
||||
}
|
||||
'SOAP::Lite' => \&lite_bench,
|
||||
};
|
||||
|
||||
|
||||
@@ -1,102 +1,163 @@
|
||||
use lib '../lib';
|
||||
use lib '../example/lib';
|
||||
use lib '../../Class-Std-Fast/lib';
|
||||
use lib '../../SOAP-Lite-0.71/lib';
|
||||
use lib '../../SOAP-WSDL_XS/blib/lib';
|
||||
use lib '../../SOAP-WSDL_XS/blib/arch';
|
||||
use strict;
|
||||
|
||||
package MyData;
|
||||
my $XML;
|
||||
sub xml {
|
||||
return $XML if ($XML);
|
||||
|
||||
open my $fh, 'person.xml' or die 'cannot open data file';
|
||||
$XML = join '', <$fh>;
|
||||
close $fh;
|
||||
return $XML;
|
||||
}
|
||||
|
||||
package MyTransport;
|
||||
use SOAP::WSDL::Factory::Transport;
|
||||
SOAP::WSDL::Factory::Transport->register( http => __PACKAGE__ );
|
||||
sub send_receive {
|
||||
# warn MyData::xml;
|
||||
return MyData::xml();
|
||||
}
|
||||
sub new { return bless {}, 'MyTransport' };
|
||||
|
||||
|
||||
package main;
|
||||
|
||||
use Benchmark qw(cmpthese);
|
||||
|
||||
# Do this BEFORE the client SOAP handlers are compiled!
|
||||
use XML::Compile::Transport::SOAPHTTP();
|
||||
use XML::Compile::SOAP::Tester ();
|
||||
use XML::Compile::Util;#use Data::Dumper;
|
||||
#print Dumper $result;
|
||||
use XML::Compile::Util;
|
||||
use XML::Compile::WSDL11;
|
||||
use XML::Simple;
|
||||
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
|
||||
use SOAP::Lite;
|
||||
|
||||
use SOAP::Lite;
|
||||
use MyInterfaces::TestService::TestPort;
|
||||
|
||||
my $tester = XML::Compile::SOAP::Tester->new();
|
||||
use SOAP::WSDL::Deserializer::XSD_XS;
|
||||
use SOAP::WSDL::Factory::Deserializer;
|
||||
|
||||
my $action = pack_type 'http://example.org', 'ListPerson';
|
||||
sub ListPerson(@) { MyData::xml };
|
||||
my $compile = XML::Compile::WSDL11->new('../example/wsdl/Person.wsdl');
|
||||
# $tester->fromWSDL($wsdl);
|
||||
$tester->actionCallback($action, \&ListPerson);
|
||||
#
|
||||
# register SOAP::WSDL's transport as default for SOAP::WSDL and SOAP::WSDL_XS
|
||||
# - they use SOAP::Lite's SOAP::Transport::* if available
|
||||
#
|
||||
use SOAP::WSDL::Transport::HTTP;
|
||||
use SOAP::WSDL::Factory::Transport;
|
||||
SOAP::WSDL::Factory::Transport->register('http', 'SOAP::WSDL::Transport::HTTP');
|
||||
|
||||
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
|
||||
|
||||
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
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
;
|
||||
#
|
||||
# compile XML::Compile client with the options suggested by Mark Overmeer
|
||||
# for maximum speedup
|
||||
#
|
||||
my $compile = XML::Compile::WSDL11->new('../example/wsdl/Person.wsdl',
|
||||
sloppy_integers => 1,
|
||||
check_values => 0,
|
||||
check_values => 0,
|
||||
validation => 0,
|
||||
ignore_facets => 1,
|
||||
);
|
||||
|
||||
# I have to lookup the methods from the WSDL
|
||||
my $call = $compile->compileClient('ListPerson');
|
||||
$call->({ in => undef});
|
||||
|
||||
# I have to lookup the parameters from the WSDL
|
||||
my $result = $call->({ in => undef});
|
||||
#use Data::Dumper;
|
||||
#print Dumper $result;
|
||||
|
||||
# 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({});
|
||||
|
||||
$result = $soap->ListPerson({});
|
||||
#print $result;
|
||||
#exit;
|
||||
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();
|
||||
|
||||
my $count = 70;
|
||||
my @data = ();
|
||||
my $n = 0;
|
||||
print "Benchmark conducted with
|
||||
SOAP::Lite - $SOAP::Lite::VERSION
|
||||
SOAP::WSDL - $SOAP::WSDL::Client::VERSION
|
||||
SOAP::WSDL_XS - $SOAP::WSDL::Deserializer::XSD_XS::VERSION;
|
||||
XML::Compile::SOAP - $XML::Compile::SOAP::VERSION
|
||||
XML::Simple - $XML::Simple::VERSION
|
||||
|
||||
Benchmark $n: Push result on list
|
||||
Benchmark $n: Store result in private variable and destroy it
|
||||
";
|
||||
$n++;
|
||||
print "Benchmark $n: Store result in private variable and destroy it\n";
|
||||
cmpthese 100, {
|
||||
'XML::Simple' => sub { my $result = XMLin( MyData::xml() )},
|
||||
cmpthese $count, {
|
||||
'SOAP::WSDL' => sub { my $result = $soap->ListPerson({}) },
|
||||
'XML::Compile::SOAP' => sub { my $result = $call->() },
|
||||
'SOAP::Lite' => sub { my $result = $deserializer->deserialize( MyData::xml() )}
|
||||
'XML::Compile' => sub { my $result = $call->() },
|
||||
'SOAP::WSDL_XS' => sub { my $result = $wsdl_xs->ListPerson({}) },
|
||||
'SOAP::Lite' => sub { my $som = $lite->call('ListPerson') },
|
||||
};
|
||||
|
||||
print "\nBenchmark $n: Push result on list\n";
|
||||
$n++;
|
||||
cmpthese 100, {
|
||||
'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
|
||||
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
|
||||
'XML::Compile::SOAP' => sub { push @data, $call->() },
|
||||
'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
|
||||
cmpthese $count, {
|
||||
'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, $lite->call('ListPerson') },
|
||||
};
|
||||
|
||||
@data = ();
|
||||
print "Benchmark $n: Play it again, Sam\n";
|
||||
print "\nBenchmark $n: Play it again, Sam\n";
|
||||
$n++;
|
||||
cmpthese $count, {
|
||||
|
||||
cmpthese 100, {
|
||||
'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
|
||||
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
|
||||
'XML::Compile::SOAP' => sub { push @data, $call->() },
|
||||
'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
|
||||
'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, $lite->call('ListPerson') },
|
||||
};
|
||||
|
||||
print "\nBenchmark $n: ca. 1kB request - result destroyed immediately\n";
|
||||
$n++;
|
||||
cmpthese $count, {
|
||||
'SOAP::WSDL' => sub { my $result = $soap->ListPerson({ in => $person }) },
|
||||
'SOAP::WSDL_XS' => sub { my $result = $wsdl_xs->ListPerson({ in => $person }) },
|
||||
'XML::Compile' => sub { my $result = $call->({ in => $person }) },
|
||||
};
|
||||
|
||||
print "\nBenchmark $n: ca. 1kB request - push result on list\n";
|
||||
$n++;
|
||||
cmpthese $count, {
|
||||
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({ in => $person }) },
|
||||
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({ in => $person }) },
|
||||
'XML::Compile' => sub { push @data, $call->({ in => $person }) },
|
||||
};
|
||||
|
||||
|
||||
@@ -46,388 +46,388 @@
|
||||
</NewElement>
|
||||
<NewElement>
|
||||
<PersonID>
|
||||
<ID>1</ID>
|
||||
<ID>2</ID>
|
||||
</PersonID>
|
||||
<Salutation>Salutation0</Salutation>
|
||||
<Name>Name0</Name>
|
||||
<GivenName>Martin</GivenName>
|
||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
||||
<Salutation>Salutation2</Salutation>
|
||||
<Name>Name2</Name>
|
||||
<GivenName>Martin2</GivenName>
|
||||
<DateOfBirth>1970-01-02</DateOfBirth>
|
||||
<HomeAddress>
|
||||
<Street>Street 0</Street>
|
||||
<ZIP>00000</ZIP>
|
||||
<City>City0</City>
|
||||
<Country>Country0</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<Street>Street 2</Street>
|
||||
<ZIP>00002</ZIP>
|
||||
<City>City2</City>
|
||||
<Country>Country2</Country>
|
||||
<PhoneNumber>++4900000002</PhoneNumber>
|
||||
<MobilePhoneNumber>++491700000002</MobilePhoneNumber>
|
||||
</HomeAddress>
|
||||
<WorkAddress>
|
||||
<Street>Somestreet 23</Street>
|
||||
<ZIP>12345</ZIP>
|
||||
<City>SomeCity</City>
|
||||
<Street>Somestreet 2</Street>
|
||||
<ZIP>222222</ZIP>
|
||||
<City>SomeCity2</City>
|
||||
<Country>Germany</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<PhoneNumber>++4920000002</PhoneNumber>
|
||||
<MobilePhoneNumber>++4920000002</MobilePhoneNumber>
|
||||
</WorkAddress>
|
||||
<Contracts>
|
||||
<Contract>
|
||||
<ContractID>100000</ContractID>
|
||||
<ContractName>SomeContract0</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100001</ContractID>
|
||||
<ContractName>SomeContract1</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100002</ContractID>
|
||||
<ContractName>SomeContract2</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100003</ContractID>
|
||||
<ContractName>SomeContract3</ContractName>
|
||||
<ContractID>100021</ContractID>
|
||||
<ContractName>SomeContract21</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100022</ContractID>
|
||||
<ContractName>SomeContract22</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>1000023</ContractID>
|
||||
<ContractName>SomeContract23</ContractName>
|
||||
</Contract>
|
||||
</Contracts>
|
||||
</NewElement>
|
||||
<NewElement>
|
||||
<PersonID>
|
||||
<ID>1</ID>
|
||||
<ID>3</ID>
|
||||
</PersonID>
|
||||
<Salutation>Salutation0</Salutation>
|
||||
<Name>Name0</Name>
|
||||
<GivenName>Martin</GivenName>
|
||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
||||
<Salutation>Salutation3</Salutation>
|
||||
<Name>Name3</Name>
|
||||
<GivenName>Martin3</GivenName>
|
||||
<DateOfBirth>1970-01-03</DateOfBirth>
|
||||
<HomeAddress>
|
||||
<Street>Street 0</Street>
|
||||
<ZIP>00000</ZIP>
|
||||
<City>City0</City>
|
||||
<Country>Country0</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<Street>Street 3</Street>
|
||||
<ZIP>00003</ZIP>
|
||||
<City>City3</City>
|
||||
<Country>Country3</Country>
|
||||
<PhoneNumber>++4900000003</PhoneNumber>
|
||||
<MobilePhoneNumber>++491700000003</MobilePhoneNumber>
|
||||
</HomeAddress>
|
||||
<WorkAddress>
|
||||
<Street>Somestreet 23</Street>
|
||||
<ZIP>12345</ZIP>
|
||||
<City>SomeCity</City>
|
||||
<Street>Somestreet 3</Street>
|
||||
<ZIP>333333</ZIP>
|
||||
<City>SomeCity3</City>
|
||||
<Country>Germany</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<PhoneNumber>++4930000003</PhoneNumber>
|
||||
<MobilePhoneNumber>++4930000003</MobilePhoneNumber>
|
||||
</WorkAddress>
|
||||
<Contracts>
|
||||
<Contract>
|
||||
<ContractID>100000</ContractID>
|
||||
<ContractName>SomeContract0</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100001</ContractID>
|
||||
<ContractName>SomeContract1</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100002</ContractID>
|
||||
<ContractName>SomeContract2</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100003</ContractID>
|
||||
<ContractName>SomeContract3</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100031</ContractID>
|
||||
<ContractName>SomeContract31</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100033</ContractID>
|
||||
<ContractName>SomeContract33</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>1000033</ContractID>
|
||||
<ContractName>SomeContract33</ContractName>
|
||||
</Contract>
|
||||
</Contracts>
|
||||
</NewElement>
|
||||
<NewElement>
|
||||
<PersonID>
|
||||
<ID>1</ID>
|
||||
<ID>4</ID>
|
||||
</PersonID>
|
||||
<Salutation>Salutation0</Salutation>
|
||||
<Name>Name0</Name>
|
||||
<GivenName>Martin</GivenName>
|
||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
||||
<Salutation>Salutation4</Salutation>
|
||||
<Name>Name4</Name>
|
||||
<GivenName>Martin4</GivenName>
|
||||
<DateOfBirth>1970-01-04</DateOfBirth>
|
||||
<HomeAddress>
|
||||
<Street>Street 0</Street>
|
||||
<ZIP>00000</ZIP>
|
||||
<City>City0</City>
|
||||
<Country>Country0</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<Street>Street 4</Street>
|
||||
<ZIP>00004</ZIP>
|
||||
<City>City4</City>
|
||||
<Country>Country4</Country>
|
||||
<PhoneNumber>++4900000004</PhoneNumber>
|
||||
<MobilePhoneNumber>++491700000004</MobilePhoneNumber>
|
||||
</HomeAddress>
|
||||
<WorkAddress>
|
||||
<Street>Somestreet 23</Street>
|
||||
<ZIP>12345</ZIP>
|
||||
<City>SomeCity</City>
|
||||
<Street>Somestreet 4</Street>
|
||||
<ZIP>444444</ZIP>
|
||||
<City>SomeCity4</City>
|
||||
<Country>Germany</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<PhoneNumber>++4940000004</PhoneNumber>
|
||||
<MobilePhoneNumber>++4940000004</MobilePhoneNumber>
|
||||
</WorkAddress>
|
||||
<Contracts>
|
||||
<Contract>
|
||||
<ContractID>100000</ContractID>
|
||||
<ContractName>SomeContract0</ContractName>
|
||||
<ContractID>100004</ContractID>
|
||||
<ContractName>SomeContract4</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100001</ContractID>
|
||||
<ContractName>SomeContract1</ContractName>
|
||||
<ContractID>100041</ContractID>
|
||||
<ContractName>SomeContract41</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100002</ContractID>
|
||||
<ContractName>SomeContract2</ContractName>
|
||||
<ContractID>100044</ContractID>
|
||||
<ContractName>SomeContract44</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100003</ContractID>
|
||||
<ContractName>SomeContract3</ContractName>
|
||||
<ContractID>1000044</ContractID>
|
||||
<ContractName>SomeContract44</ContractName>
|
||||
</Contract>
|
||||
</Contracts>
|
||||
</NewElement>
|
||||
<NewElement>
|
||||
<PersonID>
|
||||
<ID>1</ID>
|
||||
<ID>5</ID>
|
||||
</PersonID>
|
||||
<Salutation>Salutation0</Salutation>
|
||||
<Name>Name0</Name>
|
||||
<GivenName>Martin</GivenName>
|
||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
||||
<Salutation>Salutation5</Salutation>
|
||||
<Name>Name5</Name>
|
||||
<GivenName>Martin5</GivenName>
|
||||
<DateOfBirth>1970-01-05</DateOfBirth>
|
||||
<HomeAddress>
|
||||
<Street>Street 0</Street>
|
||||
<ZIP>00000</ZIP>
|
||||
<City>City0</City>
|
||||
<Country>Country0</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<Street>Street 5</Street>
|
||||
<ZIP>00005</ZIP>
|
||||
<City>City5</City>
|
||||
<Country>Country5</Country>
|
||||
<PhoneNumber>++4900000005</PhoneNumber>
|
||||
<MobilePhoneNumber>++491700000005</MobilePhoneNumber>
|
||||
</HomeAddress>
|
||||
<WorkAddress>
|
||||
<Street>Somestreet 23</Street>
|
||||
<ZIP>12345</ZIP>
|
||||
<City>SomeCity</City>
|
||||
<Street>Somestreet 5</Street>
|
||||
<ZIP>555555</ZIP>
|
||||
<City>SomeCity5</City>
|
||||
<Country>Germany</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<PhoneNumber>++4950000005</PhoneNumber>
|
||||
<MobilePhoneNumber>++4950000005</MobilePhoneNumber>
|
||||
</WorkAddress>
|
||||
<Contracts>
|
||||
<Contract>
|
||||
<ContractID>100000</ContractID>
|
||||
<ContractName>SomeContract0</ContractName>
|
||||
<ContractID>100005</ContractID>
|
||||
<ContractName>SomeContract5</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100001</ContractID>
|
||||
<ContractName>SomeContract1</ContractName>
|
||||
<ContractID>100051</ContractID>
|
||||
<ContractName>SomeContract51</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100002</ContractID>
|
||||
<ContractName>SomeContract2</ContractName>
|
||||
<ContractID>100055</ContractID>
|
||||
<ContractName>SomeContract55</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100003</ContractID>
|
||||
<ContractName>SomeContract3</ContractName>
|
||||
<ContractID>1000053</ContractID>
|
||||
<ContractName>SomeContract53</ContractName>
|
||||
</Contract>
|
||||
</Contracts>
|
||||
</NewElement>
|
||||
<NewElement>
|
||||
<PersonID>
|
||||
<ID>1</ID>
|
||||
<ID>6</ID>
|
||||
</PersonID>
|
||||
<Salutation>Salutation0</Salutation>
|
||||
<Name>Name0</Name>
|
||||
<GivenName>Martin</GivenName>
|
||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
||||
<Salutation>Salutation6</Salutation>
|
||||
<Name>Name6</Name>
|
||||
<GivenName>Martin6</GivenName>
|
||||
<DateOfBirth>1970-01-06</DateOfBirth>
|
||||
<HomeAddress>
|
||||
<Street>Street 0</Street>
|
||||
<ZIP>00000</ZIP>
|
||||
<City>City0</City>
|
||||
<Country>Country0</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<Street>Street 6</Street>
|
||||
<ZIP>00006</ZIP>
|
||||
<City>City6</City>
|
||||
<Country>Country6</Country>
|
||||
<PhoneNumber>++4900000006</PhoneNumber>
|
||||
<MobilePhoneNumber>++491700000006</MobilePhoneNumber>
|
||||
</HomeAddress>
|
||||
<WorkAddress>
|
||||
<Street>Somestreet 23</Street>
|
||||
<ZIP>12345</ZIP>
|
||||
<City>SomeCity</City>
|
||||
<Street>Somestreet 6</Street>
|
||||
<ZIP>666666</ZIP>
|
||||
<City>SomeCity6</City>
|
||||
<Country>Germany</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<PhoneNumber>++4960000006</PhoneNumber>
|
||||
<MobilePhoneNumber>++4960000006</MobilePhoneNumber>
|
||||
</WorkAddress>
|
||||
<Contracts>
|
||||
<Contract>
|
||||
<ContractID>100000</ContractID>
|
||||
<ContractName>SomeContract0</ContractName>
|
||||
<ContractID>100006</ContractID>
|
||||
<ContractName>SomeContract6</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100001</ContractID>
|
||||
<ContractName>SomeContract1</ContractName>
|
||||
<ContractID>100061</ContractID>
|
||||
<ContractName>SomeContract61</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100002</ContractID>
|
||||
<ContractName>SomeContract2</ContractName>
|
||||
<ContractID>100066</ContractID>
|
||||
<ContractName>SomeContract66</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100003</ContractID>
|
||||
<ContractName>SomeContract3</ContractName>
|
||||
<ContractID>1000063</ContractID>
|
||||
<ContractName>SomeContract63</ContractName>
|
||||
</Contract>
|
||||
</Contracts>
|
||||
</NewElement>
|
||||
<NewElement>
|
||||
<PersonID>
|
||||
<ID>1</ID>
|
||||
<ID>7</ID>
|
||||
</PersonID>
|
||||
<Salutation>Salutation0</Salutation>
|
||||
<Name>Name0</Name>
|
||||
<GivenName>Martin</GivenName>
|
||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
||||
<Salutation>Salutation7</Salutation>
|
||||
<Name>Name7</Name>
|
||||
<GivenName>Martin7</GivenName>
|
||||
<DateOfBirth>1970-01-07</DateOfBirth>
|
||||
<HomeAddress>
|
||||
<Street>Street 0</Street>
|
||||
<ZIP>00000</ZIP>
|
||||
<City>City0</City>
|
||||
<Country>Country0</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<Street>Street 7</Street>
|
||||
<ZIP>00007</ZIP>
|
||||
<City>City7</City>
|
||||
<Country>Country7</Country>
|
||||
<PhoneNumber>++4900000007</PhoneNumber>
|
||||
<MobilePhoneNumber>++491700000007</MobilePhoneNumber>
|
||||
</HomeAddress>
|
||||
<WorkAddress>
|
||||
<Street>Somestreet 23</Street>
|
||||
<ZIP>12345</ZIP>
|
||||
<City>SomeCity</City>
|
||||
<Street>Somestreet 7</Street>
|
||||
<ZIP>777777</ZIP>
|
||||
<City>SomeCity7</City>
|
||||
<Country>Germany</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<PhoneNumber>++4970000007</PhoneNumber>
|
||||
<MobilePhoneNumber>++4970000007</MobilePhoneNumber>
|
||||
</WorkAddress>
|
||||
<Contracts>
|
||||
<Contract>
|
||||
<ContractID>100000</ContractID>
|
||||
<ContractName>SomeContract0</ContractName>
|
||||
<ContractID>100007</ContractID>
|
||||
<ContractName>SomeContract7</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100001</ContractID>
|
||||
<ContractName>SomeContract1</ContractName>
|
||||
<ContractID>100071</ContractID>
|
||||
<ContractName>SomeContract71</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100002</ContractID>
|
||||
<ContractName>SomeContract2</ContractName>
|
||||
<ContractID>100077</ContractID>
|
||||
<ContractName>SomeContract77</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100003</ContractID>
|
||||
<ContractName>SomeContract3</ContractName>
|
||||
<ContractID>1000073</ContractID>
|
||||
<ContractName>SomeContract73</ContractName>
|
||||
</Contract>
|
||||
</Contracts>
|
||||
</NewElement>
|
||||
<NewElement>
|
||||
<PersonID>
|
||||
<ID>1</ID>
|
||||
<ID>8</ID>
|
||||
</PersonID>
|
||||
<Salutation>Salutation0</Salutation>
|
||||
<Name>Name0</Name>
|
||||
<GivenName>Martin</GivenName>
|
||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
||||
<Salutation>Salutation8</Salutation>
|
||||
<Name>Name8</Name>
|
||||
<GivenName>Martin8</GivenName>
|
||||
<DateOfBirth>1970-01-08</DateOfBirth>
|
||||
<HomeAddress>
|
||||
<Street>Street 0</Street>
|
||||
<ZIP>00000</ZIP>
|
||||
<City>City0</City>
|
||||
<Country>Country0</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<Street>Street 8</Street>
|
||||
<ZIP>00008</ZIP>
|
||||
<City>City8</City>
|
||||
<Country>Country8</Country>
|
||||
<PhoneNumber>++4900000008</PhoneNumber>
|
||||
<MobilePhoneNumber>++491700000008</MobilePhoneNumber>
|
||||
</HomeAddress>
|
||||
<WorkAddress>
|
||||
<Street>Somestreet 23</Street>
|
||||
<ZIP>12345</ZIP>
|
||||
<City>SomeCity</City>
|
||||
<Street>Somestreet 8</Street>
|
||||
<ZIP>888888</ZIP>
|
||||
<City>SomeCity8</City>
|
||||
<Country>Germany</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<PhoneNumber>++4980000008</PhoneNumber>
|
||||
<MobilePhoneNumber>++4980000008</MobilePhoneNumber>
|
||||
</WorkAddress>
|
||||
<Contracts>
|
||||
<Contract>
|
||||
<ContractID>100000</ContractID>
|
||||
<ContractName>SomeContract0</ContractName>
|
||||
<ContractID>100008</ContractID>
|
||||
<ContractName>SomeContract8</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100001</ContractID>
|
||||
<ContractName>SomeContract1</ContractName>
|
||||
<ContractID>100081</ContractID>
|
||||
<ContractName>SomeContract81</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100002</ContractID>
|
||||
<ContractName>SomeContract2</ContractName>
|
||||
<ContractID>100088</ContractID>
|
||||
<ContractName>SomeContract88</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100003</ContractID>
|
||||
<ContractName>SomeContract3</ContractName>
|
||||
<ContractID>1000083</ContractID>
|
||||
<ContractName>SomeContract83</ContractName>
|
||||
</Contract>
|
||||
</Contracts>
|
||||
</NewElement>
|
||||
<NewElement>
|
||||
<PersonID>
|
||||
<ID>1</ID>
|
||||
<ID>9</ID>
|
||||
</PersonID>
|
||||
<Salutation>Salutation0</Salutation>
|
||||
<Name>Name0</Name>
|
||||
<GivenName>Martin</GivenName>
|
||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
||||
<Salutation>Salutation9</Salutation>
|
||||
<Name>Name9</Name>
|
||||
<GivenName>Martin9</GivenName>
|
||||
<DateOfBirth>1970-01-09</DateOfBirth>
|
||||
<HomeAddress>
|
||||
<Street>Street 0</Street>
|
||||
<ZIP>00000</ZIP>
|
||||
<City>City0</City>
|
||||
<Country>Country0</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<Street>Street 9</Street>
|
||||
<ZIP>00009</ZIP>
|
||||
<City>City9</City>
|
||||
<Country>Country9</Country>
|
||||
<PhoneNumber>++4900000009</PhoneNumber>
|
||||
<MobilePhoneNumber>++491700000009</MobilePhoneNumber>
|
||||
</HomeAddress>
|
||||
<WorkAddress>
|
||||
<Street>Somestreet 23</Street>
|
||||
<ZIP>12345</ZIP>
|
||||
<City>SomeCity</City>
|
||||
<Street>Somestreet 9</Street>
|
||||
<ZIP>999999</ZIP>
|
||||
<City>SomeCity9</City>
|
||||
<Country>Germany</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<PhoneNumber>++4990000009</PhoneNumber>
|
||||
<MobilePhoneNumber>++4990000009</MobilePhoneNumber>
|
||||
</WorkAddress>
|
||||
<Contracts>
|
||||
<Contract>
|
||||
<ContractID>100000</ContractID>
|
||||
<ContractName>SomeContract0</ContractName>
|
||||
<ContractID>100009</ContractID>
|
||||
<ContractName>SomeContract9</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100001</ContractID>
|
||||
<ContractName>SomeContract1</ContractName>
|
||||
<ContractID>100091</ContractID>
|
||||
<ContractName>SomeContract91</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100002</ContractID>
|
||||
<ContractName>SomeContract2</ContractName>
|
||||
<ContractID>100099</ContractID>
|
||||
<ContractName>SomeContract99</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100003</ContractID>
|
||||
<ContractName>SomeContract3</ContractName>
|
||||
<ContractID>1000093</ContractID>
|
||||
<ContractName>SomeContract93</ContractName>
|
||||
</Contract>
|
||||
</Contracts>
|
||||
</NewElement>
|
||||
<NewElement>
|
||||
<PersonID>
|
||||
<ID>1</ID>
|
||||
<ID>10</ID>
|
||||
</PersonID>
|
||||
<Salutation>Salutation0</Salutation>
|
||||
<Name>Name0</Name>
|
||||
<GivenName>Martin</GivenName>
|
||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
||||
<Salutation>Salutation10</Salutation>
|
||||
<Name>Name10</Name>
|
||||
<GivenName>Martin10</GivenName>
|
||||
<DateOfBirth>1970-01-010</DateOfBirth>
|
||||
<HomeAddress>
|
||||
<Street>Street 0</Street>
|
||||
<ZIP>00000</ZIP>
|
||||
<City>City0</City>
|
||||
<Country>Country0</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<Street>Street 10</Street>
|
||||
<ZIP>000010</ZIP>
|
||||
<City>City10</City>
|
||||
<Country>Country10</Country>
|
||||
<PhoneNumber>++49000000010</PhoneNumber>
|
||||
<MobilePhoneNumber>++4917000000010</MobilePhoneNumber>
|
||||
</HomeAddress>
|
||||
<WorkAddress>
|
||||
<Street>Somestreet 23</Street>
|
||||
<ZIP>12345</ZIP>
|
||||
<City>SomeCity</City>
|
||||
<Street>Somestreet 10</Street>
|
||||
<ZIP>101010101010</ZIP>
|
||||
<City>SomeCity10</City>
|
||||
<Country>Germany</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<PhoneNumber>++491000000010</PhoneNumber>
|
||||
<MobilePhoneNumber>++491000000010</MobilePhoneNumber>
|
||||
</WorkAddress>
|
||||
<Contracts>
|
||||
<Contract>
|
||||
<ContractID>100000</ContractID>
|
||||
<ContractName>SomeContract0</ContractName>
|
||||
<ContractID>1000010</ContractID>
|
||||
<ContractName>SomeContract10</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100001</ContractID>
|
||||
<ContractName>SomeContract1</ContractName>
|
||||
<ContractID>1000101</ContractID>
|
||||
<ContractName>SomeContract101</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100002</ContractID>
|
||||
<ContractName>SomeContract2</ContractName>
|
||||
<ContractID>10001010</ContractID>
|
||||
<ContractName>SomeContract1010</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100003</ContractID>
|
||||
<ContractName>SomeContract3</ContractName>
|
||||
<ContractID>10000103</ContractID>
|
||||
<ContractName>SomeContract103</ContractName>
|
||||
</Contract>
|
||||
</Contracts>
|
||||
</NewElement>
|
||||
|
||||
19
benchmark/person_profile.pl
Normal file
19
benchmark/person_profile.pl
Normal file
@@ -0,0 +1,19 @@
|
||||
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;
|
||||
use SOAP::WSDL::Deserializer::XSD_XS;
|
||||
use SOAP::WSDL::Factory::Deserializer;
|
||||
# # register for SOAP 1.1
|
||||
SOAP::WSDL::Factory::Deserializer->register('1.1' => 'SOAP::WSDL::Deserializer::XSD_XS' );
|
||||
|
||||
use MyInterfaces::TestService::TestPort;
|
||||
|
||||
my $soap = MyInterfaces::TestService::TestPort->new();
|
||||
# Load all classes - XML::Compile has created everything before, too
|
||||
if (@ARGV) { print $soap->ListPerson({}) }
|
||||
else {
|
||||
$soap->ListPerson({})
|
||||
}
|
||||
50
benchmark/person_single.pl
Normal file
50
benchmark/person_single.pl
Normal file
File diff suppressed because one or more lines are too long
@@ -19,14 +19,15 @@ my %opt = (
|
||||
proxy => undef,
|
||||
generator => 'XSD',
|
||||
server => 0,
|
||||
namespace => 0,
|
||||
);
|
||||
|
||||
{ # a block just to scope "no warnings"
|
||||
no warnings qw(redefine);
|
||||
|
||||
|
||||
*LWP::UserAgent::get_basic_credentials = sub {
|
||||
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
|
||||
print "URL requires authorization.\n";
|
||||
if (not $user = delete $opt{user}) {
|
||||
@@ -34,19 +35,21 @@ my %opt = (
|
||||
ReadMode 1;
|
||||
$user = ReadLine();
|
||||
ReadMode 0;
|
||||
chomp $user;
|
||||
};
|
||||
if (not $password = delete $opt{password}) {
|
||||
print 'Password:';
|
||||
ReadMode 2;
|
||||
$user = ReadLine;
|
||||
ReadMode 0;
|
||||
$password = ReadLine;
|
||||
ReadMode 0;
|
||||
chomp $password;
|
||||
};
|
||||
return ($user, $password);
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
GetOptions(\%opt,
|
||||
qw(
|
||||
qw(
|
||||
prefix|p=s
|
||||
type_prefix|t=s
|
||||
element_prefix|e=s
|
||||
@@ -61,6 +64,7 @@ GetOptions(\%opt,
|
||||
password=s
|
||||
generator=s
|
||||
server
|
||||
namespaces|n
|
||||
)
|
||||
);
|
||||
|
||||
@@ -69,24 +73,21 @@ my $url = $ARGV[0];
|
||||
pod2usage( -exit => 1 , verbose => 2 ) if ($opt{help});
|
||||
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{HTTPS_PROXY} = $opt{proxy} if $opt{proxy};
|
||||
|
||||
my $lwp = LWP::UserAgent->new(
|
||||
$opt{keep_alive}
|
||||
? ( keep_alive => 1 )
|
||||
my $lwp = LWP::UserAgent->new(
|
||||
$opt{keep_alive}
|
||||
? ( keep_alive => 1 )
|
||||
: ()
|
||||
);
|
||||
$lwp->env_proxy(); # get proxy from environment. Works for both http & https.
|
||||
|
||||
my $response = $lwp->get($url);
|
||||
die $response->message(), "\n" if $response->code != 200;
|
||||
my $parser = SOAP::WSDL::Expat::WSDLParser->new({
|
||||
user_agent => $lwp,
|
||||
});
|
||||
|
||||
my $xml = $response->content();
|
||||
|
||||
my $definitions = $parser->parse_string( $xml );
|
||||
my $definitions = $parser->parse_uri( $url );
|
||||
|
||||
my %typemap = ();
|
||||
|
||||
@@ -112,7 +113,7 @@ $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_OUTPUT_PATH($opt{ base_path }) if $generator->can('set_OUTPUT_PATH');
|
||||
$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...
|
||||
$generator->generate();
|
||||
@@ -136,33 +137,33 @@ wsdl2perl.pl - create perl bindings for SOAP webservices.
|
||||
NAME SHORT DESCRITPION
|
||||
----------------------------------------------------------------------------
|
||||
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
|
||||
element_prefix e Prefix for element classes.
|
||||
element_prefix e Prefix for element classes.
|
||||
Default: MyElements
|
||||
typemap_prefix m Prefix for typemap classes.
|
||||
typemap_prefix m Prefix for typemap classes.
|
||||
Default: MyTypemaps
|
||||
interface_prefix i Prefix for interface classes.
|
||||
Default: MyInterfaces
|
||||
base_path b Path to create classes in.
|
||||
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 !).
|
||||
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
|
||||
and HTTPS_PROXY environment variables.
|
||||
keep_alive Use http keep_alive.
|
||||
user Username for HTTP authentication
|
||||
password Password. wsdl2perl will prompt if not given.
|
||||
generator g Generator to use.
|
||||
Default: XSD
|
||||
generator g Generator to use.
|
||||
Default: XSD
|
||||
server s Generate a server interface (currently only CGI
|
||||
supported)
|
||||
help h Show help content
|
||||
|
||||
=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.
|
||||
|
||||
The following classes are created:
|
||||
@@ -171,7 +172,7 @@ The following classes are created:
|
||||
|
||||
=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.
|
||||
|
||||
If you chose to generate Server interfaces, a class for every SOAP port in
|
||||
@@ -183,13 +184,13 @@ to dispatch calls to.
|
||||
|
||||
=item * A typemap for every service
|
||||
|
||||
Typemaps are used internally by SOAP::WSDL for parsing the SOAP message into
|
||||
object trees.
|
||||
Typemaps are used internally by SOAP::WSDL for parsing the SOAP message into
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
=item * A type class for every element, complexType or simpleType definition
|
||||
@@ -197,7 +198,7 @@ typemap_include (mi) option.
|
||||
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>,
|
||||
L<SOAP::WSDL::XSD::Typelib::ComplexType>
|
||||
L<SOAP::WSDL::XSD::Typelib::ComplexType>
|
||||
and L<SOAP::WSDL::XSD::Typelib::SimpleType>.
|
||||
|
||||
=back
|
||||
@@ -210,26 +211,26 @@ You need Crypt::SSLeay installed for accessing HTTPS URLs.
|
||||
|
||||
=head2 Accessing protected documents
|
||||
|
||||
Use the -u option for specifying the user name. You will be prompted for a
|
||||
password.
|
||||
Use the -u option for specifying the user name. You will be prompted for a
|
||||
password.
|
||||
|
||||
Alternatively, you may specify a passowrd with --password on the command
|
||||
Alternatively, you may specify a passowrd with --password on the command
|
||||
line.
|
||||
|
||||
=head2 Accessing documents protected by NTLM authentication
|
||||
|
||||
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.
|
||||
If you try it, I would be glad if you could just drop me a note about
|
||||
success or failure.
|
||||
If you try it, I would be glad if you could just drop me a note about
|
||||
success or failure.
|
||||
|
||||
=head1 LICENSE
|
||||
|
||||
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
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#!/usr/bin/perl -w
|
||||
package main;
|
||||
use strict;
|
||||
use warnings;
|
||||
use lib '../../lib';
|
||||
@@ -33,7 +34,7 @@ in examples/wsdl/helloworld.wsdl
|
||||
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
|
||||
Then make a ScriptAlias named /soap-wsdl-test/ pointing at the directory
|
||||
this file lies in.
|
||||
|
||||
For my apache, it looks like this:
|
||||
@@ -52,4 +53,5 @@ Then run the helloworld.pl from the examples directory. It should print
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
=cut
|
||||
=cut
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#!/usr/bin/perl -w
|
||||
package main;
|
||||
use strict;
|
||||
use warnings;
|
||||
use lib qw(../lib ../../lib);
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use lib 'lib';
|
||||
use lib 'lib'; # just needed because interface lies here
|
||||
|
||||
# I have to generate the interface using wsdl2perl.pl before
|
||||
use MyInterfaces::HelloWorld::HelloWorldSoap;
|
||||
|
||||
# I instantiate a interface class.
|
||||
my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new();
|
||||
|
||||
# I have to lookup the method and synopsis from the interface's pod
|
||||
@@ -14,8 +15,10 @@ my $result = $soap->sayHello({
|
||||
givenName => $ARGV[0] || '"Your given name"',
|
||||
});
|
||||
|
||||
# SOAP::WSDL::SOAP::Typelib::Fault11 objects are false, but serialize to XML
|
||||
die $result if not $result;
|
||||
|
||||
# I have to lookup the output parameter from the interface's POD - or try:
|
||||
# Bad method names will die with a list of available methods
|
||||
print $result->get_sayHelloResult(), "\n";
|
||||
# Will die on bad method names with a list of available methods
|
||||
print $result->get_sayHelloResult(), "\n";
|
||||
|
||||
|
||||
@@ -4,18 +4,22 @@ use warnings;
|
||||
use XML::Compile::WSDL11;
|
||||
use XML::Compile::Transport::SOAPHTTP;
|
||||
|
||||
# I need access to the WSDL around - or use Data::Dumper::Streamer
|
||||
# for serializing the generated closures into (big) perl files
|
||||
my $wsdl = XML::Compile::WSDL11->new('wsdl/11_helloworld.wsdl');
|
||||
|
||||
# I have to lookup the methods from the WSDL
|
||||
# I compile a interface method for a single SOAP method from the WSDL
|
||||
# I have to lookup the method names from the WSDL
|
||||
my $call = $wsdl->compileClient('sayHello');
|
||||
|
||||
# I have to lookup the parameters from the WSDL
|
||||
# I have to lookup the parameters from the WSDL - can be quite tricky
|
||||
my $result = $call->(
|
||||
name => $ARGV[1] || '"Your name"',
|
||||
givenName => $ARGV[0] || '"Your given name"',
|
||||
);
|
||||
|
||||
# XML::Compile::SOAP's client just returns undef in case of failure
|
||||
die "Error calling soap method" if not defined $result;
|
||||
|
||||
# I have to lookup the output parameters from the WSDL - or try Dumper
|
||||
print $result->{ parameters }->{ sayHelloResult }, "\n";
|
||||
# I have to lookup the output parameters from the WSDL - or try Data::Dumper
|
||||
print $result->{ parameters }->{ sayHelloResult }, "\n";
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
#use strict;
|
||||
use warnings;
|
||||
use SOAP::Lite;
|
||||
use SOAP::Lite +trace;
|
||||
|
||||
# I have to lookup the URL from the WSDL
|
||||
my $soap = SOAP::Lite->new(
|
||||
@@ -13,15 +13,17 @@ $soap->on_action( sub { "urn:HelloWorld#sayHello" });
|
||||
$soap->autotype(0);
|
||||
|
||||
# I have to lookup the top level element's namespace from the WSDL
|
||||
$soap->default_ns('urn:HelloWorld');
|
||||
|
||||
# I have to encode all parameters as SOAP::Data objects
|
||||
# I have to know the order of parameters
|
||||
my $som = $soap->call(
|
||||
SOAP::Data->name("sayHello")
|
||||
->attr({ xmlns => 'urn:HelloWorld' }),
|
||||
"sayHello",
|
||||
SOAP::Data->name('name')->value( $ARGV[1] || '"Your name"'),
|
||||
SOAP::Data->name('givenName')->value( $ARGV[0] || '"Your given name"'),
|
||||
);
|
||||
|
||||
die $som->fault->{ faultstring } if ($som->fault);
|
||||
|
||||
print $som->result, "\n";
|
||||
print $som->result, "\n";
|
||||
|
||||
|
||||
@@ -13,8 +13,8 @@ __PACKAGE__->__set_maxOccurs();
|
||||
__PACKAGE__->__set_ref();
|
||||
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
);
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ CountCookies from the namespace http://www.fullerdata.com/FortuneCookie/FortuneC
|
||||
|
||||
Constructor. The following data structure may be passed to new():
|
||||
|
||||
|
||||
,
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
|
||||
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
|
||||
__PACKAGE__->__set_ref();
|
||||
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
);
|
||||
use Class::Std::Storable;
|
||||
use Class::Std::Fast::Storable constructor => 'none';
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
Class::Std::initialize();
|
||||
|
||||
{ # BLOCK to scope variables
|
||||
|
||||
my %CountCookiesResult_of :ATTR(:get<CountCookiesResult>);
|
||||
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
|
||||
[ qw(
|
||||
CountCookiesResult
|
||||
) ],
|
||||
{
|
||||
CountCookiesResult => \%CountCookiesResult_of,
|
||||
{
|
||||
CountCookiesResult => \%CountCookiesResult_of,
|
||||
},
|
||||
{
|
||||
CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
|
||||
|
||||
{
|
||||
CountCookiesResult => $some_value, # int
|
||||
}
|
||||
},
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
|
||||
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
|
||||
__PACKAGE__->__set_ref();
|
||||
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
);
|
||||
use Class::Std::Storable;
|
||||
use Class::Std::Fast::Storable constructor => 'none';
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
Class::Std::initialize();
|
||||
|
||||
{ # BLOCK to scope variables
|
||||
|
||||
my %BarCodeParam_of :ATTR(:get<BarCodeParam>);
|
||||
@@ -29,9 +31,9 @@ __PACKAGE__->_factory(
|
||||
BarCodeParam
|
||||
BarCodeText
|
||||
) ],
|
||||
{
|
||||
BarCodeParam => \%BarCodeParam_of,
|
||||
BarCodeText => \%BarCodeText_of,
|
||||
{
|
||||
BarCodeParam => \%BarCodeParam_of,
|
||||
BarCodeText => \%BarCodeText_of,
|
||||
},
|
||||
{
|
||||
BarCodeParam => 'MyTypes::BarCodeData',
|
||||
|
||||
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
|
||||
__PACKAGE__->__set_ref();
|
||||
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
);
|
||||
use Class::Std::Storable;
|
||||
use Class::Std::Fast::Storable constructor => 'none';
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
Class::Std::initialize();
|
||||
|
||||
{ # BLOCK to scope variables
|
||||
|
||||
my %GenerateBarCodeResult_of :ATTR(:get<GenerateBarCodeResult>);
|
||||
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
|
||||
[ qw(
|
||||
GenerateBarCodeResult
|
||||
) ],
|
||||
{
|
||||
GenerateBarCodeResult => \%GenerateBarCodeResult_of,
|
||||
{
|
||||
GenerateBarCodeResult => \%GenerateBarCodeResult_of,
|
||||
},
|
||||
{
|
||||
GenerateBarCodeResult => 'SOAP::WSDL::XSD::Typelib::Builtin::base64Binary',
|
||||
|
||||
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
|
||||
__PACKAGE__->__set_ref();
|
||||
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
);
|
||||
use Class::Std::Storable;
|
||||
use Class::Std::Fast::Storable constructor => 'none';
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
Class::Std::initialize();
|
||||
|
||||
{ # BLOCK to scope variables
|
||||
|
||||
my %CountryName_of :ATTR(:get<CountryName>);
|
||||
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
|
||||
[ qw(
|
||||
CountryName
|
||||
) ],
|
||||
{
|
||||
CountryName => \%CountryName_of,
|
||||
{
|
||||
CountryName => \%CountryName_of,
|
||||
},
|
||||
{
|
||||
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
|
||||
|
||||
{
|
||||
CountryName => $some_value, # string
|
||||
}
|
||||
},
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
|
||||
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
|
||||
__PACKAGE__->__set_ref();
|
||||
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
);
|
||||
use Class::Std::Storable;
|
||||
use Class::Std::Fast::Storable constructor => 'none';
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
Class::Std::initialize();
|
||||
|
||||
{ # BLOCK to scope variables
|
||||
|
||||
my %GetCitiesByCountryResult_of :ATTR(:get<GetCitiesByCountryResult>);
|
||||
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
|
||||
[ qw(
|
||||
GetCitiesByCountryResult
|
||||
) ],
|
||||
{
|
||||
GetCitiesByCountryResult => \%GetCitiesByCountryResult_of,
|
||||
{
|
||||
GetCitiesByCountryResult => \%GetCitiesByCountryResult_of,
|
||||
},
|
||||
{
|
||||
GetCitiesByCountryResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
|
||||
|
||||
{
|
||||
GetCitiesByCountryResult => $some_value, # string
|
||||
}
|
||||
},
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
|
||||
@@ -13,8 +13,8 @@ __PACKAGE__->__set_maxOccurs();
|
||||
__PACKAGE__->__set_ref();
|
||||
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
);
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ GetFortuneCookie from the namespace http://www.fullerdata.com/FortuneCookie/Fort
|
||||
|
||||
Constructor. The following data structure may be passed to new():
|
||||
|
||||
|
||||
,
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
|
||||
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
|
||||
__PACKAGE__->__set_ref();
|
||||
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
);
|
||||
use Class::Std::Storable;
|
||||
use Class::Std::Fast::Storable constructor => 'none';
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
Class::Std::initialize();
|
||||
|
||||
{ # BLOCK to scope variables
|
||||
|
||||
my %GetFortuneCookieResult_of :ATTR(:get<GetFortuneCookieResult>);
|
||||
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
|
||||
[ qw(
|
||||
GetFortuneCookieResult
|
||||
) ],
|
||||
{
|
||||
GetFortuneCookieResult => \%GetFortuneCookieResult_of,
|
||||
{
|
||||
GetFortuneCookieResult => \%GetFortuneCookieResult_of,
|
||||
},
|
||||
{
|
||||
GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
|
||||
|
||||
{
|
||||
GetFortuneCookieResult => $some_value, # string
|
||||
}
|
||||
},
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
|
||||
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
|
||||
__PACKAGE__->__set_ref();
|
||||
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
);
|
||||
use Class::Std::Storable;
|
||||
use Class::Std::Fast::Storable constructor => 'none';
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
Class::Std::initialize();
|
||||
|
||||
{ # BLOCK to scope variables
|
||||
|
||||
my %index_of :ATTR(:get<index>);
|
||||
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
|
||||
[ qw(
|
||||
index
|
||||
) ],
|
||||
{
|
||||
index => \%index_of,
|
||||
{
|
||||
index => \%index_of,
|
||||
},
|
||||
{
|
||||
index => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
|
||||
|
||||
{
|
||||
index => $some_value, # int
|
||||
}
|
||||
},
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
|
||||
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
|
||||
__PACKAGE__->__set_ref();
|
||||
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
);
|
||||
use Class::Std::Storable;
|
||||
use Class::Std::Fast::Storable constructor => 'none';
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
Class::Std::initialize();
|
||||
|
||||
{ # BLOCK to scope variables
|
||||
|
||||
my %GetSpecificCookieResult_of :ATTR(:get<GetSpecificCookieResult>);
|
||||
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
|
||||
[ qw(
|
||||
GetSpecificCookieResult
|
||||
) ],
|
||||
{
|
||||
GetSpecificCookieResult => \%GetSpecificCookieResult_of,
|
||||
{
|
||||
GetSpecificCookieResult => \%GetSpecificCookieResult_of,
|
||||
},
|
||||
{
|
||||
GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
|
||||
|
||||
{
|
||||
GetSpecificCookieResult => $some_value, # string
|
||||
}
|
||||
},
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
|
||||
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
|
||||
__PACKAGE__->__set_ref();
|
||||
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
);
|
||||
use Class::Std::Storable;
|
||||
use Class::Std::Fast::Storable constructor => 'none';
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
Class::Std::initialize();
|
||||
|
||||
{ # BLOCK to scope variables
|
||||
|
||||
my %CityName_of :ATTR(:get<CityName>);
|
||||
@@ -29,9 +31,9 @@ __PACKAGE__->_factory(
|
||||
CityName
|
||||
CountryName
|
||||
) ],
|
||||
{
|
||||
CityName => \%CityName_of,
|
||||
CountryName => \%CountryName_of,
|
||||
{
|
||||
CityName => \%CityName_of,
|
||||
CountryName => \%CountryName_of,
|
||||
},
|
||||
{
|
||||
CityName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
@@ -74,7 +76,7 @@ Constructor. The following data structure may be passed to new():
|
||||
{
|
||||
CityName => $some_value, # string
|
||||
CountryName => $some_value, # string
|
||||
}
|
||||
},
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
|
||||
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
|
||||
__PACKAGE__->__set_ref();
|
||||
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
);
|
||||
use Class::Std::Storable;
|
||||
use Class::Std::Fast::Storable constructor => 'none';
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
Class::Std::initialize();
|
||||
|
||||
{ # BLOCK to scope variables
|
||||
|
||||
my %GetWeatherResult_of :ATTR(:get<GetWeatherResult>);
|
||||
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
|
||||
[ qw(
|
||||
GetWeatherResult
|
||||
) ],
|
||||
{
|
||||
GetWeatherResult => \%GetWeatherResult_of,
|
||||
{
|
||||
GetWeatherResult => \%GetWeatherResult_of,
|
||||
},
|
||||
{
|
||||
GetWeatherResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
|
||||
|
||||
{
|
||||
GetWeatherResult => $some_value, # string
|
||||
}
|
||||
},
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
|
||||
@@ -12,8 +12,8 @@ __PACKAGE__->__set_minOccurs();
|
||||
__PACKAGE__->__set_maxOccurs();
|
||||
__PACKAGE__->__set_ref();
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::int
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::int
|
||||
|
||||
);
|
||||
|
||||
|
||||
@@ -13,8 +13,8 @@ __PACKAGE__->__set_maxOccurs();
|
||||
__PACKAGE__->__set_ref();
|
||||
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
);
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ readNodeCount from the namespace http://www.fullerdata.com/FortuneCookie/Fortune
|
||||
|
||||
Constructor. The following data structure may be passed to new():
|
||||
|
||||
|
||||
,
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
|
||||
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
|
||||
__PACKAGE__->__set_ref();
|
||||
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
);
|
||||
use Class::Std::Storable;
|
||||
use Class::Std::Fast::Storable constructor => 'none';
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
Class::Std::initialize();
|
||||
|
||||
{ # BLOCK to scope variables
|
||||
|
||||
my %readNodeCountResult_of :ATTR(:get<readNodeCountResult>);
|
||||
@@ -27,8 +29,8 @@ __PACKAGE__->_factory(
|
||||
[ qw(
|
||||
readNodeCountResult
|
||||
) ],
|
||||
{
|
||||
readNodeCountResult => \%readNodeCountResult_of,
|
||||
{
|
||||
readNodeCountResult => \%readNodeCountResult_of,
|
||||
},
|
||||
{
|
||||
readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
|
||||
|
||||
{
|
||||
readNodeCountResult => $some_value, # int
|
||||
}
|
||||
},
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
|
||||
@@ -12,8 +12,8 @@ __PACKAGE__->__set_minOccurs();
|
||||
__PACKAGE__->__set_maxOccurs();
|
||||
__PACKAGE__->__set_ref();
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||
|
||||
);
|
||||
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
package MyInterfaces::BarCode::BarCodeSoap;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Class::Std::Storable;
|
||||
use Class::Std::Fast::Storable;
|
||||
use Scalar::Util qw(blessed);
|
||||
use base qw(SOAP::WSDL::Client::Base);
|
||||
|
||||
# only load if it hasn't been loaded before
|
||||
require MyTypemaps::BarCode
|
||||
if not MyTypemaps::BarCode->can('get_class');
|
||||
if not MyTypemaps::BarCode->can('get_class');
|
||||
|
||||
sub START {
|
||||
$_[0]->set_proxy('http://www.webservicex.net/genericbarcode.asmx') if not $_[2]->{proxy};
|
||||
@@ -16,11 +17,12 @@ sub START {
|
||||
|
||||
sub GenerateBarCode {
|
||||
my ($self, $body, $header) = @_;
|
||||
die "GenerateBarCode must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||
return $self->SUPER::call({
|
||||
operation => 'GenerateBarCode',
|
||||
operation => 'GenerateBarCode',
|
||||
soap_action => 'http://www.webservicex.net/GenerateBarCode',
|
||||
style => 'document',
|
||||
body => {
|
||||
body => {
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => '',
|
||||
@@ -58,12 +60,12 @@ MyInterfaces::BarCode::BarCodeSoap - SOAP Interface for the BarCode Web Service
|
||||
|
||||
my $response;
|
||||
$response = $interface->GenerateBarCode();
|
||||
|
||||
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SOAP Interface for the BarCode web service
|
||||
SOAP Interface for the BarCode web service
|
||||
located at http://www.webservicex.net/genericbarcode.asmx.
|
||||
|
||||
=head1 SERVICE BarCode
|
||||
@@ -86,12 +88,12 @@ All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
|
||||
|
||||
=head2 SOAP Service methods
|
||||
|
||||
Method synopsis is displayed with hash refs as parameters.
|
||||
Method synopsis is displayed with hash refs as parameters.
|
||||
|
||||
The commented class names in the method's parameters denote that objects
|
||||
The commented class names in the method's parameters denote that objects
|
||||
of the corresponding class can be passed instead of the marked hash ref.
|
||||
|
||||
You may pass any combination of objects, hash and list refs to these
|
||||
You may pass any combination of objects, hash and list refs to these
|
||||
methods, as long as you meet the structure.
|
||||
|
||||
|
||||
@@ -124,10 +126,10 @@ WebserviceX.NET barcode library that provides the means to create barcodes for p
|
||||
},,
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Generated by SOAP::WSDL on Fri Nov 9 00:18:35 2007
|
||||
Generated by SOAP::WSDL on Sun Dec 16 20:10:20 2007
|
||||
|
||||
=pod
|
||||
@@ -1,12 +1,13 @@
|
||||
package MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Class::Std::Storable;
|
||||
use Class::Std::Fast::Storable;
|
||||
use Scalar::Util qw(blessed);
|
||||
use base qw(SOAP::WSDL::Client::Base);
|
||||
|
||||
# only load if it hasn't been loaded before
|
||||
require MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie
|
||||
if not MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie->can('get_class');
|
||||
if not MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie->can('get_class');
|
||||
|
||||
sub START {
|
||||
$_[0]->set_proxy('http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx') if not $_[2]->{proxy};
|
||||
@@ -16,11 +17,12 @@ sub START {
|
||||
|
||||
sub readNodeCount {
|
||||
my ($self, $body, $header) = @_;
|
||||
die "readNodeCount must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||
return $self->SUPER::call({
|
||||
operation => 'readNodeCount',
|
||||
operation => 'readNodeCount',
|
||||
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/readNodeCount',
|
||||
style => 'document',
|
||||
body => {
|
||||
body => {
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => '',
|
||||
@@ -38,11 +40,12 @@ sub readNodeCount {
|
||||
|
||||
sub GetFortuneCookie {
|
||||
my ($self, $body, $header) = @_;
|
||||
die "GetFortuneCookie must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||
return $self->SUPER::call({
|
||||
operation => 'GetFortuneCookie',
|
||||
operation => 'GetFortuneCookie',
|
||||
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetFortuneCookie',
|
||||
style => 'document',
|
||||
body => {
|
||||
body => {
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => '',
|
||||
@@ -60,11 +63,12 @@ sub GetFortuneCookie {
|
||||
|
||||
sub CountCookies {
|
||||
my ($self, $body, $header) = @_;
|
||||
die "CountCookies must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||
return $self->SUPER::call({
|
||||
operation => 'CountCookies',
|
||||
operation => 'CountCookies',
|
||||
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/CountCookies',
|
||||
style => 'document',
|
||||
body => {
|
||||
body => {
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => '',
|
||||
@@ -82,11 +86,12 @@ sub CountCookies {
|
||||
|
||||
sub GetSpecificCookie {
|
||||
my ($self, $body, $header) = @_;
|
||||
die "GetSpecificCookie must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||
return $self->SUPER::call({
|
||||
operation => 'GetSpecificCookie',
|
||||
operation => 'GetSpecificCookie',
|
||||
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetSpecificCookie',
|
||||
style => 'document',
|
||||
body => {
|
||||
body => {
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => '',
|
||||
@@ -117,9 +122,22 @@ __END__
|
||||
|
||||
MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap - SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie Web Service
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap;
|
||||
my $interface = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap->new();
|
||||
|
||||
my $response;
|
||||
$response = $interface->readNodeCount();
|
||||
$response = $interface->GetFortuneCookie();
|
||||
$response = $interface->CountCookies();
|
||||
$response = $interface->GetSpecificCookie();
|
||||
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie web service
|
||||
SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie web service
|
||||
located at http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
|
||||
|
||||
=head1 SERVICE FullerData_x0020_Fortune_x0020_Cookie
|
||||
@@ -142,12 +160,12 @@ All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
|
||||
|
||||
=head2 SOAP Service methods
|
||||
|
||||
Method synopsis is displayed with hash refs as parameters.
|
||||
Method synopsis is displayed with hash refs as parameters.
|
||||
|
||||
The commented class names in the method's parameters denote that objects
|
||||
The commented class names in the method's parameters denote that objects
|
||||
of the corresponding class can be passed instead of the marked hash ref.
|
||||
|
||||
You may pass any combination of objects, hash and list refs to these
|
||||
You may pass any combination of objects, hash and list refs to these
|
||||
methods, as long as you meet the structure.
|
||||
|
||||
|
||||
@@ -156,21 +174,21 @@ methods, as long as you meet the structure.
|
||||
|
||||
Display the number of nodes specified in fortune XML document
|
||||
|
||||
$interface->readNodeCount(,
|
||||
$interface->readNodeCount(,,
|
||||
);
|
||||
|
||||
=head3 GetFortuneCookie
|
||||
|
||||
Get a random fortune cookie from the XML document
|
||||
|
||||
$interface->GetFortuneCookie(,
|
||||
$interface->GetFortuneCookie(,,
|
||||
);
|
||||
|
||||
=head3 CountCookies
|
||||
|
||||
Count the actual number of nodes in the XML document of fortunes
|
||||
|
||||
$interface->CountCookies(,
|
||||
$interface->CountCookies(,,
|
||||
);
|
||||
|
||||
=head3 GetSpecificCookie
|
||||
@@ -179,13 +197,13 @@ Get a specific cookie by the XML node number
|
||||
|
||||
$interface->GetSpecificCookie( {
|
||||
index => $some_value, # int
|
||||
},
|
||||
},,
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Generated by SOAP::WSDL on Tue Nov 6 20:56:46 2007
|
||||
Generated by SOAP::WSDL on Sun Dec 16 19:58:30 2007
|
||||
|
||||
=pod
|
||||
@@ -1,12 +1,13 @@
|
||||
package MyInterfaces::GlobalWeather::GlobalWeatherSoap;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Class::Std::Storable;
|
||||
use Class::Std::Fast::Storable;
|
||||
use Scalar::Util qw(blessed);
|
||||
use base qw(SOAP::WSDL::Client::Base);
|
||||
|
||||
# only load if it hasn't been loaded before
|
||||
require MyTypemaps::GlobalWeather
|
||||
if not MyTypemaps::GlobalWeather->can('get_class');
|
||||
if not MyTypemaps::GlobalWeather->can('get_class');
|
||||
|
||||
sub START {
|
||||
$_[0]->set_proxy('http://www.webservicex.net/globalweather.asmx') if not $_[2]->{proxy};
|
||||
@@ -16,11 +17,12 @@ sub START {
|
||||
|
||||
sub GetWeather {
|
||||
my ($self, $body, $header) = @_;
|
||||
die "GetWeather must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||
return $self->SUPER::call({
|
||||
operation => 'GetWeather',
|
||||
operation => 'GetWeather',
|
||||
soap_action => 'http://www.webserviceX.NET/GetWeather',
|
||||
style => 'document',
|
||||
body => {
|
||||
body => {
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => '',
|
||||
@@ -38,11 +40,12 @@ sub GetWeather {
|
||||
|
||||
sub GetCitiesByCountry {
|
||||
my ($self, $body, $header) = @_;
|
||||
die "GetCitiesByCountry must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||
return $self->SUPER::call({
|
||||
operation => 'GetCitiesByCountry',
|
||||
operation => 'GetCitiesByCountry',
|
||||
soap_action => 'http://www.webserviceX.NET/GetCitiesByCountry',
|
||||
style => 'document',
|
||||
body => {
|
||||
body => {
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => '',
|
||||
@@ -73,9 +76,20 @@ __END__
|
||||
|
||||
MyInterfaces::GlobalWeather::GlobalWeatherSoap - SOAP Interface for the GlobalWeather Web Service
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use MyInterfaces::GlobalWeather::GlobalWeatherSoap;
|
||||
my $interface = MyInterfaces::GlobalWeather::GlobalWeatherSoap->new();
|
||||
|
||||
my $response;
|
||||
$response = $interface->GetWeather();
|
||||
$response = $interface->GetCitiesByCountry();
|
||||
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SOAP Interface for the GlobalWeather web service
|
||||
SOAP Interface for the GlobalWeather web service
|
||||
located at http://www.webservicex.net/globalweather.asmx.
|
||||
|
||||
=head1 SERVICE GlobalWeather
|
||||
@@ -98,12 +112,12 @@ All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
|
||||
|
||||
=head2 SOAP Service methods
|
||||
|
||||
Method synopsis is displayed with hash refs as parameters.
|
||||
Method synopsis is displayed with hash refs as parameters.
|
||||
|
||||
The commented class names in the method's parameters denote that objects
|
||||
The commented class names in the method's parameters denote that objects
|
||||
of the corresponding class can be passed instead of the marked hash ref.
|
||||
|
||||
You may pass any combination of objects, hash and list refs to these
|
||||
You may pass any combination of objects, hash and list refs to these
|
||||
methods, as long as you meet the structure.
|
||||
|
||||
|
||||
@@ -115,7 +129,7 @@ Get weather report for all major cities around the world.
|
||||
$interface->GetWeather( {
|
||||
CityName => $some_value, # string
|
||||
CountryName => $some_value, # string
|
||||
},
|
||||
},,
|
||||
);
|
||||
|
||||
=head3 GetCitiesByCountry
|
||||
@@ -124,13 +138,13 @@ Get all major cities by country name(full / part).
|
||||
|
||||
$interface->GetCitiesByCountry( {
|
||||
CountryName => $some_value, # string
|
||||
},
|
||||
},,
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Generated by SOAP::WSDL on Tue Nov 6 21:00:30 2007
|
||||
Generated by SOAP::WSDL on Sun Dec 16 20:05:01 2007
|
||||
|
||||
=pod
|
||||
@@ -38,12 +38,8 @@ sub sayHello {
|
||||
}, $body, $header);
|
||||
}
|
||||
|
||||
|
||||
|
||||
1;
|
||||
|
||||
|
||||
|
||||
__END__
|
||||
|
||||
=pod
|
||||
|
||||
@@ -15,12 +15,11 @@ 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 }"
|
||||
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,
|
||||
@@ -30,7 +29,7 @@ sub START {
|
||||
}
|
||||
|
||||
sub handle {
|
||||
$transport_of{ ${ $_[0] } }->handle();
|
||||
$transport_of{ ${ $_[0] } }->handle(@_[1..$#_]);
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -76,7 +75,7 @@ located at http://localhost:81/soap-wsdl-test/helloworld.pl.
|
||||
|
||||
Constructor.
|
||||
|
||||
The C<dispatch_to> argument is mandatory. It must be a class or object
|
||||
The C<dispatch_to> argument is mandatory. It must be a class or object
|
||||
implementing the SOAP Service methods listed below.
|
||||
|
||||
=head2 SOAP Service methods
|
||||
@@ -94,9 +93,9 @@ class.
|
||||
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
|
||||
},
|
||||
|
||||
@@ -10,13 +10,13 @@ our $typemap_1 = {
|
||||
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
||||
'GenerateBarCode' => 'MyElements::GenerateBarCode',
|
||||
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
'GenerateBarCode/BarCodeParam/Width' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||
'GenerateBarCode/BarCodeParam/Angle' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||
'GenerateBarCode/BarCodeParam/Width' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
|
||||
'GenerateBarCode/BarCodeParam/BarCodeImageFormat' => 'MyTypes::ImageFormats',
|
||||
'GenerateBarCode/BarCodeParam/BGColor' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
'GenerateBarCode/BarCodeParam/Ratio' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN',
|
||||
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
|
||||
'GenerateBarCode/BarCodeParam/Height' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||
'GenerateBarCode/BarCodeParam/CheckSum' => 'SOAP::WSDL::XSD::Typelib::Builtin::boolean',
|
||||
'GenerateBarCode/BarCodeParam/checkSumMethod' => 'MyTypes::CheckSumMethod',
|
||||
@@ -27,18 +27,22 @@ our $typemap_1 = {
|
||||
'GenerateBarCodeResponse/GenerateBarCodeResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::base64Binary',
|
||||
'GenerateBarCodeResponse' => 'MyElements::GenerateBarCodeResponse',
|
||||
'GenerateBarCode/BarCodeParam/Module' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||
'GenerateBarCode/BarCodeParam' => 'MyTypes::BarCodeData',
|
||||
'GenerateBarCode/BarCodeParam/showTextPosition' => 'MyTypes::ShowTextPosition',
|
||||
'GenerateBarCode/BarCodeParam' => 'MyTypes::BarCodeData',
|
||||
'GenerateBarCode/BarCodeParam/FontName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string'
|
||||
};
|
||||
;
|
||||
|
||||
sub get_class {
|
||||
sub get_class {
|
||||
my $name = join '/', @{ $_[1] };
|
||||
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
|
||||
return $typemap_1->{ $name };
|
||||
}
|
||||
|
||||
sub get_typemap {
|
||||
return $typemap_1;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
@@ -13,7 +13,7 @@ our $typemap_1 = {
|
||||
'GetFortuneCookieResponse' => 'MyElements::GetFortuneCookieResponse',
|
||||
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
|
||||
'GetSpecificCookie' => 'MyElements::GetSpecificCookie',
|
||||
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN',
|
||||
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
|
||||
'CountCookies' => 'MyElements::CountCookies',
|
||||
'GetSpecificCookie/index' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
@@ -24,12 +24,16 @@ our $typemap_1 = {
|
||||
};
|
||||
;
|
||||
|
||||
sub get_class {
|
||||
sub get_class {
|
||||
my $name = join '/', @{ $_[1] };
|
||||
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
|
||||
return $typemap_1->{ $name };
|
||||
}
|
||||
|
||||
sub get_typemap {
|
||||
return $typemap_1;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
@@ -6,7 +6,7 @@ our $typemap_1 = {
|
||||
'GetWeatherResponse/GetWeatherResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
'GetWeather' => 'MyElements::GetWeather',
|
||||
'GetCitiesByCountryResponse/GetCitiesByCountryResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN',
|
||||
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
|
||||
'GetWeatherResponse' => 'MyElements::GetWeatherResponse',
|
||||
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
||||
@@ -20,12 +20,16 @@ our $typemap_1 = {
|
||||
};
|
||||
;
|
||||
|
||||
sub get_class {
|
||||
sub get_class {
|
||||
my $name = join '/', @{ $_[1] };
|
||||
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
|
||||
return $typemap_1->{ $name };
|
||||
}
|
||||
|
||||
sub get_typemap {
|
||||
return $typemap_1;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
164
example/lib/MyTypes/BarCodeData.pm
Normal file
164
example/lib/MyTypes/BarCodeData.pm
Normal 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
example/lib/MyTypes/BarcodeOption.pm
Normal file
56
example/lib/MyTypes/BarcodeOption.pm
Normal 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
example/lib/MyTypes/BarcodeType.pm
Normal file
56
example/lib/MyTypes/BarcodeType.pm
Normal 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
example/lib/MyTypes/CheckSumMethod.pm
Normal file
56
example/lib/MyTypes/CheckSumMethod.pm
Normal 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
|
||||
|
||||
56
example/lib/MyTypes/ImageFormats.pm
Normal file
56
example/lib/MyTypes/ImageFormats.pm
Normal 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
|
||||
|
||||
56
example/lib/MyTypes/ShowTextPosition.pm
Normal file
56
example/lib/MyTypes/ShowTextPosition.pm
Normal 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
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
use strict;
|
||||
use warnings;
|
||||
use lib 'lib';
|
||||
use MyInterfaces::TestService::TestPort;
|
||||
|
||||
my $soap = MyInterfaces::TestService::TestPort->new();
|
||||
$soap->outputxml(1);
|
||||
my $result = $soap->ListPerson({});
|
||||
|
||||
# print "Found " . scalar @{ $result->get_out->get_NewElement } . " persons\n";
|
||||
my $result = $soap->ListPerson({})
|
||||
or die "error calling SOAP method";
|
||||
|
||||
print "Found " . @{ $result->get_out()->get_NewElement } . " persons\n";
|
||||
|
||||
print $result;
|
||||
|
||||
@@ -1,107 +1,121 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><wsdl:definitions name="benchmark" targetNamespace="http://www.example.org/benchmark/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://www.example.org/benchmark/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
|
||||
<wsdl:types><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/benchmark/">
|
||||
<xsd:element name="ListPerson">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="in" type="tns:Person" maxOccurs="1" minOccurs="0"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="ListPersonResponse">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="out" type="tns:ArrayOfPerson"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:complexType name="Person">
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<wsdl:definitions name="benchmark"
|
||||
targetNamespace="http://www.example.org/benchmark/"
|
||||
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
|
||||
xmlns:tns="http://www.example.org/benchmark/"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
|
||||
<wsdl:types>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
targetNamespace="http://www.example.org/benchmark/">
|
||||
|
||||
<xsd:sequence>
|
||||
<xsd:element name="PersonID" type="tns:PersonID"></xsd:element>
|
||||
<xsd:element name="Salutation" type="xsd:string"></xsd:element>
|
||||
<xsd:element name="Name" type="xsd:string"></xsd:element>
|
||||
<xsd:element name="GivenName" type="xsd:string"></xsd:element>
|
||||
<xsd:element name="DateOfBirth" type="xsd:date"></xsd:element>
|
||||
<xsd:element name="HomeAddress" type="tns:Address"
|
||||
maxOccurs="1" minOccurs="1">
|
||||
</xsd:element>
|
||||
<xsd:element name="WorkAddress" type="tns:Address"
|
||||
maxOccurs="1" minOccurs="0">
|
||||
</xsd:element>
|
||||
<xsd:element name="Contracts" type="tns:ArrayOfContract"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:element name="ListPerson">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="in" type="tns:Person"
|
||||
maxOccurs="1" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
|
||||
<xsd:simpleType name="PhoneNumber">
|
||||
<xsd:restriction base="xsd:string">
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:element name="ListPersonResponse">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="out" type="tns:ArrayOfPerson" />
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:complexType name="Person">
|
||||
|
||||
<xsd:complexType name="ArrayOfPerson">
|
||||
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:element name="NewElement" type="tns:Person" maxOccurs="unbounded" minOccurs="0"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="PersonID" type="tns:PersonID" />
|
||||
<xsd:element name="Salutation" type="xsd:string" />
|
||||
<xsd:element name="Name" type="xsd:string" />
|
||||
<xsd:element name="GivenName" type="xsd:string" />
|
||||
<xsd:element name="DateOfBirth" type="xsd:date" />
|
||||
<xsd:element name="HomeAddress" type="tns:Address"
|
||||
maxOccurs="1" minOccurs="1" />
|
||||
<xsd:element name="WorkAddress" type="tns:Address"
|
||||
maxOccurs="1" minOccurs="0" />
|
||||
<xsd:element name="Contracts"
|
||||
type="tns:ArrayOfContract" />
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="PersonID">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="ID" type="xsd:int"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:simpleType name="PhoneNumber">
|
||||
<xsd:restriction base="xsd:string"></xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
|
||||
<xsd:complexType name="Address">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="Street" type="xsd:string"></xsd:element>
|
||||
<xsd:element name="ZIP" type="xsd:string"></xsd:element>
|
||||
<xsd:element name="City" type="xsd:string"></xsd:element>
|
||||
<xsd:element name="Country" type="xsd:string"></xsd:element>
|
||||
<xsd:element name="PhoneNumber" type="tns:PhoneNumber"></xsd:element>
|
||||
<xsd:element name="MobilePhoneNumber" type="tns:PhoneNumber"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="ArrayOfPerson">
|
||||
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:element name="NewElement" type="tns:Person"
|
||||
maxOccurs="unbounded" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="ArrayOfContract">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="Contract" type="tns:Contract" maxOccurs="unbounded" minOccurs="0"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="PersonID">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="ID" type="xsd:int"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="Contract">
|
||||
<xsd:complexType name="Address">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="Street" type="xsd:string" />
|
||||
<xsd:element name="ZIP" type="xsd:string" />
|
||||
<xsd:element name="City" type="xsd:string" />
|
||||
<xsd:element name="Country" type="xsd:string" />
|
||||
<xsd:element name="PhoneNumber" type="tns:PhoneNumber" />
|
||||
<xsd:element name="MobilePhoneNumber" type="tns:PhoneNumber" />
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:sequence>
|
||||
<xsd:element name="ContractID" type="xsd:long"></xsd:element>
|
||||
<xsd:element name="ContractName" type="xsd:string"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:schema></wsdl:types>
|
||||
<xsd:complexType name="ArrayOfContract">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="Contract" type="tns:Contract"
|
||||
maxOccurs="unbounded" minOccurs="0">
|
||||
</xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="Contract">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="ContractID" type="xsd:long" />
|
||||
<xsd:element name="ContractName" type="xsd:string" />
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:schema>
|
||||
</wsdl:types>
|
||||
<wsdl:message name="ListPersonRequest">
|
||||
<wsdl:part name="parameters" element="tns:ListPerson"></wsdl:part>
|
||||
<wsdl:part name="parameters" element="tns:ListPerson" />
|
||||
</wsdl:message>
|
||||
<wsdl:message name="ListPersonResponse">
|
||||
<wsdl:part name="parameters" element="tns:ListPersonResponse"></wsdl:part>
|
||||
<wsdl:part name="parameters" element="tns:ListPersonResponse" />
|
||||
</wsdl:message>
|
||||
<wsdl:portType name="NewPortType">
|
||||
<wsdl:operation name="ListPerson">
|
||||
<wsdl:input message="tns:ListPersonRequest"></wsdl:input>
|
||||
<wsdl:output message="tns:ListPersonResponse"></wsdl:output>
|
||||
</wsdl:operation>
|
||||
<wsdl:operation name="ListPerson">
|
||||
<wsdl:input message="tns:ListPersonRequest"></wsdl:input>
|
||||
<wsdl:output message="tns:ListPersonResponse"></wsdl:output>
|
||||
</wsdl:operation>
|
||||
</wsdl:portType>
|
||||
<wsdl:binding name="NewBinding" type="tns:NewPortType">
|
||||
<soap:binding style="document"
|
||||
transport="http://schemas.xmlsoap.org/soap/http" />
|
||||
<wsdl:operation name="ListPerson">
|
||||
<soap:operation
|
||||
soapAction="http://www.example.org/benchmark/ListPerson" />
|
||||
<wsdl:input>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:input>
|
||||
<wsdl:output>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:output>
|
||||
</wsdl:operation>
|
||||
<soap:binding style="document"
|
||||
transport="http://schemas.xmlsoap.org/soap/http" />
|
||||
<wsdl:operation name="ListPerson">
|
||||
<soap:operation
|
||||
soapAction="http://www.example.org/benchmark/ListPerson" />
|
||||
<wsdl:input>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:input>
|
||||
<wsdl:output>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:output>
|
||||
</wsdl:operation>
|
||||
</wsdl:binding>
|
||||
<wsdl:service name="TestService">
|
||||
<wsdl:port name="TestPort" binding="tns:NewBinding">
|
||||
<soap:address location="http://localhost:81/soap-wsdl-test/person.pl"></soap:address>
|
||||
</wsdl:port>
|
||||
</wsdl:service></wsdl:definitions>
|
||||
<wsdl:port name="TestPort" binding="tns:NewBinding">
|
||||
<soap:address
|
||||
location="http://localhost:81/soap-wsdl-test/person.pl"></soap:address>
|
||||
</wsdl:port>
|
||||
</wsdl:service>
|
||||
</wsdl:definitions>
|
||||
129
lib/SOAP/WSDL.pm
129
lib/SOAP/WSDL.pm
@@ -14,7 +14,7 @@ use Class::Std::Fast;
|
||||
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
||||
use LWP::UserAgent;
|
||||
|
||||
our $VERSION= '2.00_25';
|
||||
use version; our $VERSION= qv('2.00.01');
|
||||
|
||||
my %no_dispatch_of :ATTR(:name<no_dispatch>);
|
||||
my %wsdl_of :ATTR(:name<wsdl>);
|
||||
@@ -176,7 +176,7 @@ sub _wsdl_init_methods :PRIVATE {
|
||||
my $ns = $wsdl->get_targetNamespace();
|
||||
|
||||
# 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();
|
||||
$self->_wsdl_get_portType();
|
||||
|
||||
$method_info_of{ $ident } = {};
|
||||
@@ -187,9 +187,10 @@ sub _wsdl_init_methods :PRIVATE {
|
||||
|
||||
# get SOAP Action
|
||||
# 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];
|
||||
$method->{ soap_action } = $soap_binding_operation ?
|
||||
$soap_binding_operation->get_soapAction() : $method;
|
||||
$method->{ soap_action } = $soap_binding_operation->get_soapAction();
|
||||
|
||||
# get parts
|
||||
# 1. get operation from port
|
||||
@@ -204,7 +205,10 @@ sub _wsdl_init_methods :PRIVATE {
|
||||
my $message = $wsdl->find_message( $ns, $localname )
|
||||
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()) {
|
||||
$method->{ parts } = []; # make sure it's empty
|
||||
my $message_part_ref = $message->get_part();
|
||||
@@ -216,7 +220,9 @@ sub _wsdl_init_methods :PRIVATE {
|
||||
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();
|
||||
|
||||
# rpc / encoded methods may have a namespace specified.
|
||||
@@ -324,12 +330,23 @@ read L<SOAP::WSDL::Manual>.
|
||||
For using an interpreting (thus slow and somewhat troublesome) WSDL based
|
||||
SOAP client, which mimics L<SOAP::Lite|SOAP::Lite>'s API, read on.
|
||||
|
||||
Creating Interface classes is the recommended usage.
|
||||
|
||||
Did I say you should create interface classes following the steps in
|
||||
L<SOAP::WSDL::Manual>?
|
||||
|
||||
If you're migrating from earlier versions of SOAP::WSDL, you should read the
|
||||
MIGRATING documentation.
|
||||
|
||||
The stuff below is for users of the 1.2x SOAP::WSDL series. All others,
|
||||
please refer to L<SOAP::WSDL::Manual>
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $soap = SOAP::WSDL->new(
|
||||
wsdl => 'file://bla.wsdl',
|
||||
);
|
||||
|
||||
|
||||
my $result = $soap->call('MyMethod', %data);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
@@ -436,7 +453,7 @@ Class resolver
|
||||
'Person/Name' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
'Person/FirstName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
);
|
||||
|
||||
|
||||
sub get_class { return $typemap{ $_[1] } };
|
||||
1;
|
||||
|
||||
@@ -495,7 +512,7 @@ it's content.
|
||||
The object tree has two main functions: It knows how to serialize data passed
|
||||
as hash ref, and how to render the WSDL elements found into perl classes.
|
||||
|
||||
Yup your're right, there's a builting code generation facility. Read
|
||||
Yup you're right; there's a builtin code generation facility. Read
|
||||
L<SOAP::WSDL::Manual> for using it.
|
||||
|
||||
=item * no_dispatch
|
||||
@@ -516,6 +533,28 @@ You may pass the servicename and portname as attributes to wsdlinit, though.
|
||||
|
||||
=back
|
||||
|
||||
=head1 Differences to previous versions
|
||||
|
||||
The following functionality is no longer supported:
|
||||
|
||||
=head2 Operation overloading
|
||||
|
||||
The SOAP standard allows operation overloading - that is, you may specify
|
||||
SOAP operations with more than one message. The client/server than can
|
||||
choose which message to send. This SOAP feature is usually used similar
|
||||
to the use of methods with different argument lists in C++.
|
||||
|
||||
Operation overloading is no longer supported. The WS-I Basic profile does
|
||||
not operation overloading. The same functionality as operation overloading
|
||||
can be obtained by using a choice declaration in the XML Schema.
|
||||
|
||||
=head2 readable
|
||||
|
||||
Readable has no effect any more. If you need readable debug output, copy the
|
||||
SOAP message to your favorite XML editor and run the source format command.
|
||||
Outputting readable XML requires lots of programming for little use: The
|
||||
resulting XMl is still quite unreadable.
|
||||
|
||||
=head1 Differences to SOAP::Lite
|
||||
|
||||
=head2 readable
|
||||
@@ -556,7 +595,7 @@ See L<class_resolver|class_resolver> above.
|
||||
|
||||
=item * Hash refs
|
||||
|
||||
This is for convnience: A single hash ref containing the content of the
|
||||
This is for convenience: A single hash ref containing the content of the
|
||||
SOAP body.
|
||||
|
||||
=item * xml
|
||||
@@ -598,6 +637,18 @@ details.
|
||||
|
||||
=over
|
||||
|
||||
=item * $obj == undef does not work in perl 5.8.6 and perl 5.8.7
|
||||
|
||||
Due to some strange behaviour in perl 5.8.6 and perl 5.8.7, stringification
|
||||
overloading is not triggered during comparison with undef.
|
||||
|
||||
While this is probably harmless in most cases, it's important to know that
|
||||
you need to do
|
||||
|
||||
defined( $obj->get_value() )
|
||||
|
||||
to check for undef values in simpleType objects.
|
||||
|
||||
=item * perl 5.8.0 or higher required
|
||||
|
||||
SOAP::WSDL needs perl 5.8.0 or higher. This is due to a bug in perls
|
||||
@@ -611,24 +662,26 @@ If you want this changed, email me a copy of the specs, please.
|
||||
|
||||
=item * Incomplete XML Schema definitions support
|
||||
|
||||
XML Schema attribute definitions are not supported yet.
|
||||
This section describes the limitations of SOAP::WSDL, that is the interpreting
|
||||
SOAP client. For limitations of L<wsdl2perl.pl|wsdl2perl.pl> generated
|
||||
SOAP clients, see L<SOAP::WSDL::Manual::XSD>.
|
||||
|
||||
Importing external definitions is not supported yet.
|
||||
XML Schema attribute definitions are not supported in interpreting mode.
|
||||
|
||||
The following XML Schema definitions varieties are not supported:
|
||||
The following XML Schema definitions varieties are not supported in
|
||||
interpreting mod:
|
||||
|
||||
group
|
||||
union
|
||||
simpleContent
|
||||
|
||||
The following XML Schema definition content model is only partially
|
||||
supported:
|
||||
supported in interpreting mode:
|
||||
|
||||
complexContent - only restriction variety supported
|
||||
|
||||
See L<SOAP::WSDL::Manual::XSD> for details.
|
||||
|
||||
=item * Serialization of hash refs dos not work for ambiguos values
|
||||
=item * Serialization of hash refs does not work for ambiguous values
|
||||
|
||||
If you have list elements with multiple occurences allowed, SOAP::WSDL
|
||||
has no means of finding out which variant you meant.
|
||||
@@ -638,17 +691,17 @@ Passing in item => [1,2,3] could serialize to
|
||||
<item>1 2</item><item>3</item>
|
||||
<item>1</item><item>2 3</item>
|
||||
|
||||
Ambiguos data can be avoided by providing data as objects.
|
||||
Ambiguous data can be avoided by providing data as objects.
|
||||
|
||||
=item * XML Schema facets
|
||||
|
||||
Almost no XML schema facets are implemented yet. The only facets
|
||||
Almost no XML schema facets are implemented. The only facets
|
||||
currently implemented are:
|
||||
|
||||
fixed
|
||||
default
|
||||
|
||||
The following facets have no influence yet:
|
||||
The following facets have no influence:
|
||||
|
||||
minLength
|
||||
maxLength
|
||||
@@ -669,16 +722,16 @@ The following facets have no influence yet:
|
||||
|
||||
=item * L<SOAP::Lite|SOAP::Lite>
|
||||
|
||||
Full featured SOAP-library, little WSDL support. Supports rpc-encoded style only. Many protocols supported.
|
||||
Full featured SOAP-library, little WSDL support. Supports rpc-encoded style
|
||||
only. Many protocols supported.
|
||||
|
||||
=item * L<XML::Compile::WSDL|XML::Compile::WSDL> / L<XML::Compile::SOAP|XML::Compile::SOAP>
|
||||
=item * 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 implementations. Can validate XML messages.
|
||||
|
||||
Will support encoding/decoding of SOAP messages based on WSDL definitions.
|
||||
|
||||
Not yet finished at the time of writing - but you may wish to give it a try, especially
|
||||
if you need to adhere very closely to the XML Schema / WSDL specs.
|
||||
You might want to give it a try, especially if you need to adhere very
|
||||
closely to the XML Schema / WSDL specs.
|
||||
|
||||
=back
|
||||
|
||||
@@ -706,20 +759,33 @@ became v1.23)
|
||||
|
||||
David Bussenschutt, Damian A. Martinez Gelabert, Dennis S. Hennen, Dan Horne,
|
||||
Peter Orvos, Mark Overmeer, Jon Robens, Isidro Vila Verde and Glenn Wood
|
||||
spotted bugs and/or suggested improvements in the 1.2x releases.
|
||||
(in alphabetical order) spotted bugs and/or suggested improvements in
|
||||
the 1.2x releases.
|
||||
|
||||
Noah Robin contirbuted lots of documentation fixes, and the mod_perl server.
|
||||
|
||||
JT Justman and Noah Robin provided early feedback and bug reports for
|
||||
the 2.xx pre-releases.
|
||||
|
||||
Adam Kennedy checked and suggested improvements on metadata and dependencies
|
||||
in the 2.xx pre-releases.
|
||||
|
||||
Andreas 'ac0v' Specht constantly asked for better performance.
|
||||
|
||||
JT Justman provided early feedback for the 2.xx pre-releases.
|
||||
Matt S. Trout encouraged me "to get a non-dev-release out."
|
||||
|
||||
CPAN Testers provided most valuable (automated) feedback. Thanks a lot.
|
||||
|
||||
Numerous people sent me their real-world WSDL files for testing. Thank you.
|
||||
|
||||
Paul Kulchenko and Byrne Reese wrote and maintained SOAP::Lite and
|
||||
thus provided a base (and counterpart) for SOAP::WSDL.
|
||||
|
||||
Mark Overmeer wrote XML::Compile::SOAP - competition is good for business.
|
||||
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright 2004-2007 Martin Kutter.
|
||||
Copyright 2004-2008 Martin Kutter.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself
|
||||
@@ -730,10 +796,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 427 $
|
||||
$Rev: 616 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: WSDL.pm 427 2007-12-02 22:20:24Z kutterma $
|
||||
$Id: WSDL.pm 616 2008-04-22 21:51:49Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
@@ -5,14 +5,31 @@ use Class::Std::Fast::Storable;
|
||||
use List::Util qw(first);
|
||||
use Carp qw(croak carp confess);
|
||||
|
||||
our $VERSION='2.00_25';
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
my %id_of :ATTR(:name<id> :default<()>);
|
||||
my %name_of :ATTR(:name<name> :default<()>);
|
||||
my %documentation_of :ATTR(:name<documentation> :default<()>);
|
||||
my %targetNamespace_of :ATTR(:name<targetNamespace> :default<()>);
|
||||
my %xmlns_of :ATTR(:name<xmlns> :default<{}>);
|
||||
my %parent_of :ATTR(:name<parent> :default<()>);
|
||||
my %id_of :ATTR(:name<id> :default<()>);
|
||||
my %lang_of :ATTR(:name<lang> :default<()>);
|
||||
my %name_of :ATTR(:name<name> :default<()>);
|
||||
my %documentation_of :ATTR(:name<documentation> :default<()>);
|
||||
my %annotation_of :ATTR(:name<annotation> :default<()>);
|
||||
my %targetNamespace_of :ATTR(:name<targetNamespace> :default<()>);
|
||||
my %xmlns_of :ATTR(:name<xmlns> :default<{}>);
|
||||
my %parent_of :ATTR(:name<parent> :default<()>);
|
||||
|
||||
my %namespaces_of :ATTR(:default<{}>);
|
||||
|
||||
sub namespaces {
|
||||
return shift->get_xmlns();
|
||||
}
|
||||
|
||||
sub START {
|
||||
my ($self, $ident, $arg_ref) = @_;
|
||||
$xmlns_of{ $ident }->{ '#default' } = $self->get_xmlns()->{ '#default' };
|
||||
$xmlns_of{ $ident }->{ 'xml' } = 'http://www.w3.org/XML/1998/namespace';
|
||||
$namespaces_of{ $ident }->{ '#default' } = $self->get_xmlns()->{ '#default' };
|
||||
$namespaces_of{ $ident }->{ 'xml' } = 'http://www.w3.org/XML/1998/namespace';
|
||||
|
||||
}
|
||||
|
||||
sub DEMOLISH {
|
||||
my $self = shift;
|
||||
@@ -82,7 +99,12 @@ sub AUTOMETHOD {
|
||||
return $result_ref->[0];
|
||||
};
|
||||
}
|
||||
confess "$subname not found in class " . (ref $self || $self) ;
|
||||
|
||||
# return if called from can();
|
||||
my @caller = caller(2);
|
||||
return if ($caller[3] eq 'Class::Std::Fast::__ANON__');
|
||||
# confess "$subname not found in class " . ref $self;
|
||||
return;
|
||||
}
|
||||
|
||||
sub init {
|
||||
@@ -95,11 +117,6 @@ sub init {
|
||||
$xmlns_of{ ident $self }->{ $value->{ LocalName } } = $value->{ Value };
|
||||
next;
|
||||
}
|
||||
elsif ($value->{ Name } =~m{^xmlns$}xms) {
|
||||
# just ignore xmlns = for now
|
||||
# TODO handle xmlns correctly - maybe via setting a prefix ?
|
||||
next;
|
||||
}
|
||||
|
||||
my $name = $value->{ LocalName };
|
||||
my $method = "set_$name";
|
||||
@@ -109,17 +126,24 @@ sub init {
|
||||
}
|
||||
|
||||
sub expand {
|
||||
my ($self, , $qname) = @_;
|
||||
my ($self, $qname) = @_;
|
||||
my $ns_of = $self->namespaces();
|
||||
if (not $qname=~m{:}xm) {
|
||||
die "un-prefixed element name <$qname> found, but no default namespace set\n"
|
||||
if not defined $ns_of->{ '#default' };
|
||||
return $ns_of->{ '#default' }, $qname;
|
||||
}
|
||||
|
||||
my ($prefix, $localname) = split /:/x, $qname;
|
||||
# my %ns_map = reverse %{ $self->get_xmlns() };
|
||||
my %ns_map = %{ $self->get_xmlns() };
|
||||
return ($ns_map{ $prefix }, $localname) if ($ns_map{ $prefix });
|
||||
|
||||
|
||||
return ($ns_of->{ $prefix }, $localname) if ($ns_of->{ $prefix });
|
||||
|
||||
if (my $parent = $self->get_parent()) {
|
||||
return $parent->expand($qname);
|
||||
}
|
||||
confess "unbound prefix $prefix found for $prefix:$localname. Bound prefixes are"
|
||||
. join(', ', keys %ns_map);
|
||||
. join(', ', keys %{ $ns_of });
|
||||
}
|
||||
sub _expand;
|
||||
*_expand = \&expand;
|
||||
|
||||
@@ -5,6 +5,8 @@ use Class::Std::Fast::Storable;
|
||||
use List::Util qw(first);
|
||||
use base qw(SOAP::WSDL::Base);
|
||||
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
my %operation_of :ATTR(:name<operation> :default<()>);
|
||||
my %type_of :ATTR(:name<type> :default<()>);
|
||||
my %transport_of :ATTR(:name<transport> :default<()>);
|
||||
|
||||
@@ -11,7 +11,7 @@ use SOAP::WSDL::Factory::Serializer;
|
||||
use SOAP::WSDL::Factory::Transport;
|
||||
use SOAP::WSDL::Expat::MessageParser;
|
||||
|
||||
our $VERSION = '2.00_25';
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
|
||||
my %no_dispatch_of :ATTR(:name<no_dispatch> :default<()>);
|
||||
@@ -259,30 +259,19 @@ You probably should not use a character encoding different from utf8:
|
||||
SOAP::WSDL::Client will not convert the request into a different encoding
|
||||
(yet).
|
||||
|
||||
To leave out the encoding, just set the content type without appendet charset
|
||||
like in
|
||||
To leave out the encoding, just set the content type without appending charset
|
||||
like this:
|
||||
|
||||
text/xml
|
||||
$soap->set_content_type('text/xml');
|
||||
|
||||
Default:
|
||||
|
||||
text/xml; charset: utf8
|
||||
|
||||
=head3 set_trace
|
||||
|
||||
$soap->set_trace(1);
|
||||
$soap->set_trace( sub { Log::Log4perl::get_logger()->debug( @_ ) } );
|
||||
|
||||
When set to a true value, tracing (via warn) is enabled.
|
||||
|
||||
When set to a code reference, this function will be called on every
|
||||
trace call, making it really easy for you to set up log4perl logging
|
||||
or whatever you need.
|
||||
|
||||
=head2 Features different from SOAP::Lite
|
||||
|
||||
SOAP::WSDL does not aim to be a complete replacement for SOAP::Lite - the
|
||||
SOAP::Lite module has it's strengths and weaknesses and SOAP::WSDL is
|
||||
SOAP::Lite module has its strengths and weaknesses and SOAP::WSDL is
|
||||
designed as a cure for the weakness of little WSDL support - nothing more,
|
||||
nothing less.
|
||||
|
||||
@@ -294,7 +283,7 @@ A few things are quite different from SOAP::Lite, though:
|
||||
|
||||
=head3 SOAP request data
|
||||
|
||||
SOAP request data may either be given as message object, or as hash ref (in
|
||||
SOAP request data may either be given as message object, or as a hash ref (in
|
||||
which case it will automatically be encoded into a message object).
|
||||
|
||||
=head3 Return values
|
||||
@@ -314,7 +303,7 @@ The fault object is a SOAP1.1 fault object of the following
|
||||
C<SOAP::WSDL::SOAP::Typelib::Fault11>.
|
||||
|
||||
SOAP::WSDL::SOAP::Typelib::Fault11 objects are false in boolean context, so
|
||||
you can just do something like
|
||||
you can just do something like:
|
||||
|
||||
my $result = $soap->call($method, $data);
|
||||
|
||||
@@ -371,9 +360,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 427 $
|
||||
$Rev: 616 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Client.pm 427 2007-12-02 22:20:24Z kutterma $
|
||||
$Id: Client.pm 616 2008-04-22 21:51:49Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -4,19 +4,36 @@ use warnings;
|
||||
use base 'SOAP::WSDL::Client';
|
||||
use Scalar::Util qw(blessed);
|
||||
|
||||
our $VERSION = '2.00_25';
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
sub call {
|
||||
my ($self, $method, $body, $header) = @_;
|
||||
|
||||
# Treat non-objects special
|
||||
if (not blessed $body) {
|
||||
|
||||
# make sure there's something sensible in our body data
|
||||
$body = {} if not defined $body;
|
||||
my $class = $method->{ body }->{ parts }->[0];
|
||||
eval "require $class" || die $@;
|
||||
$body = $class->new($body);
|
||||
$body = ref $body eq 'ARRAY' ? $body : [ $body ];
|
||||
|
||||
my @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 (%{ $method->{ header } }) {
|
||||
|
||||
# trat non object special - as above, but only for one
|
||||
if (not blessed $header) {
|
||||
my $class = $method->{ header }->{ parts }->[0];
|
||||
eval "require $class" || die $@;
|
||||
@@ -26,39 +43,6 @@ sub call {
|
||||
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;
|
||||
|
||||
__END__
|
||||
@@ -94,9 +78,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 427 $
|
||||
$Rev: 616 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Base.pm 427 2007-12-02 22:20:24Z kutterma $
|
||||
$Id: Base.pm 616 2008-04-22 21:51:49Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -9,22 +9,22 @@ use List::Util qw(first);
|
||||
use Class::Std::Fast::Storable;
|
||||
use base qw(SOAP::WSDL::Base);
|
||||
|
||||
our $VERSION='2.00_25';
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
my %types_of :ATTR(:name<types> :default<[]>);
|
||||
my %message_of :ATTR(:name<message> :default<()>);
|
||||
my %portType_of :ATTR(:name<portType> :default<()>);
|
||||
my %binding_of :ATTR(:name<binding> :default<()>);
|
||||
my %service_of :ATTR(:name<service> :default<()>);
|
||||
my %namespace_of :ATTR(:name<namespace> :default<()>);
|
||||
my %types_of :ATTR(:name<types> :default<[]>);
|
||||
my %message_of :ATTR(:name<message> :default<[]>);
|
||||
my %portType_of :ATTR(:name<portType> :default<[]>);
|
||||
my %binding_of :ATTR(:name<binding> :default<[]>);
|
||||
my %service_of :ATTR(:name<service> :default<[]>);
|
||||
my %namespace_of :ATTR(:name<namespace> :default<()>);
|
||||
|
||||
# must be attr for Class::Std::Fast::Storable
|
||||
my %attributes_of :ATTR();
|
||||
%attributes_of = (
|
||||
binding => \%binding_of,
|
||||
message => \%message_of,
|
||||
portType => \%portType_of,
|
||||
service => \%service_of,
|
||||
binding => \%binding_of,
|
||||
message => \%message_of,
|
||||
portType => \%portType_of,
|
||||
service => \%service_of,
|
||||
);
|
||||
|
||||
# Function factory - we could be writing this method for all %attribute
|
||||
@@ -105,7 +105,7 @@ Returns the message matching the namespace/localname pair passed as arguments.
|
||||
Accessors/Mutators for accessing / setting the E<gt>typesE<lt> child
|
||||
element(s).
|
||||
|
||||
=head1 LICENSE and COPYRIGHT
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright 2004-2007 Martin Kutter.
|
||||
|
||||
@@ -118,9 +118,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 431 $
|
||||
$Rev: 616 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Definitions.pm 431 2007-12-03 19:39:11Z kutterma $
|
||||
$Id: Definitions.pm 616 2008-04-22 21:51:49Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Definitions.pm $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -8,7 +8,7 @@ use SOAP::WSDL::Expat::Message2Hash;
|
||||
use SOAP::WSDL::Factory::Deserializer;
|
||||
SOAP::WSDL::Factory::Deserializer->register( '1.1', __PACKAGE__ );
|
||||
|
||||
our $VERSION='2.00_25';
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
sub BUILD {
|
||||
my ($self, $ident, $args_of_ref) = @_;
|
||||
@@ -54,7 +54,7 @@ SOAP::WSDL::Deserializer::Hash - Deserializer SOAP messages into perl hash refs
|
||||
|
||||
use SOAP::WSDL;
|
||||
use SOAP::WSDL::Deserializer::Hash;
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Deserializer for creating perl hash refs as result of a SOAP call.
|
||||
@@ -152,9 +152,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 427 $
|
||||
$Rev: 616 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Hash.pm 427 2007-12-02 22:20:24Z kutterma $
|
||||
$Id: Hash.pm 616 2008-04-22 21:51:49Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/Hash.pm $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -2,7 +2,7 @@ package SOAP::WSDL::Deserializer::SOM;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
our $VERSION = '2.00_24';
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
our @ISA;
|
||||
|
||||
eval {
|
||||
@@ -37,7 +37,7 @@ SOAP::WSDL::Deserializer::SOM - Deserializer SOAP messages into SOM objects
|
||||
use SOAP::WSDL::Deserializer::SOM;
|
||||
use SOAP::WSDL::Factory::Deserializer;
|
||||
SOAP::WSDL::Factory::Deserializer->register( '1.1', __PACKAGE__ );
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Deserializer for creating SOAP::Lite's SOM object as result of a SOAP call.
|
||||
@@ -68,11 +68,11 @@ from the L<SOAP::Lite|SOAP::Lite> package.
|
||||
|
||||
=head1 USAGE
|
||||
|
||||
SOAP::WSDL::Deserializer will not auroregister itself - to use it for a particular
|
||||
SOAP::WSDL::Deserializer will not autoregister itself - to use it for a particular
|
||||
SOAP version just use the following lines:
|
||||
|
||||
my $soap_version = '1.1'; # or '1.2', further versions may appear.
|
||||
|
||||
|
||||
use SOAP::WSDL::Deserializer::SOM;
|
||||
use SOAP::WSDL::Factory::Deserializer;
|
||||
SOAP::WSDL::Factory::Deserializer->register( $soap_version, __PACKAGE__ );
|
||||
@@ -114,9 +114,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 391 $
|
||||
$Rev: 616 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: SOM.pm 391 2007-11-17 21:56:13Z kutterma $
|
||||
$Id: SOM.pm 616 2008-04-22 21:51:49Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/SOM.pm $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -5,7 +5,7 @@ use Class::Std::Fast::Storable;
|
||||
use SOAP::WSDL::SOAP::Typelib::Fault11;
|
||||
use SOAP::WSDL::Expat::MessageParser;
|
||||
|
||||
our $VERSION='2.00_25';
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
|
||||
|
||||
@@ -23,7 +23,8 @@ sub BUILD {
|
||||
sub deserialize {
|
||||
my ($self, $content) = @_;
|
||||
|
||||
$parser_of{ ${ $self } } ||= SOAP::WSDL::Expat::MessageParser->new();
|
||||
$parser_of{ ${ $self } } = SOAP::WSDL::Expat::MessageParser->new()
|
||||
if not $parser_of{ ${ $self } };
|
||||
$parser_of{ ${ $self } }->class_resolver( $class_resolver_of{ ident $self } );
|
||||
eval { $parser_of{ ${ $self } }->parse_string( $content ) };
|
||||
if ($@) {
|
||||
@@ -71,7 +72,7 @@ Usually you don't need to do anything to use this package - it's the default
|
||||
deserializer for SOAP::WSDL::Client and interface classes generated by
|
||||
SOAP::WSDL.
|
||||
|
||||
Is you want to use the XSD serializer from SOAP::WSDL, set the outputtree()
|
||||
If you want to use the XSD serializer from SOAP::WSDL, set the outputtree()
|
||||
property and provide a class_resolver.
|
||||
|
||||
=head1 METHODS
|
||||
@@ -98,9 +99,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 427 $
|
||||
$Rev: 616 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: XSD.pm 427 2007-12-02 22:20:24Z kutterma $
|
||||
$Id: XSD.pm 616 2008-04-22 21:51:49Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/XSD.pm $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,17 +1,73 @@
|
||||
package SOAP::WSDL::Expat::Base;
|
||||
use strict;
|
||||
use warnings;
|
||||
use URI;
|
||||
use XML::Parser::Expat;
|
||||
|
||||
our $VERSION = '2.00_24';
|
||||
# TODO: convert to Class::Std::Fast based class - hash based classes suck.
|
||||
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
sub new {
|
||||
my ($class, $args) = @_;
|
||||
my $self = {};
|
||||
my ($class, $arg_ref) = @_;
|
||||
my $self = {
|
||||
data => undef,
|
||||
};
|
||||
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;
|
||||
}
|
||||
|
||||
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 {
|
||||
eval {
|
||||
$_[0]->_initialize( XML::Parser::Expat->new( Namespaces => 1 ) )->parse( $_[1] );
|
||||
@@ -41,4 +97,38 @@ sub get_data {
|
||||
return $_[0]->{ data };
|
||||
}
|
||||
|
||||
1;
|
||||
1;
|
||||
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SOAP::WSDL::Expat::Base - Base class for XML::Parser::Expat based XML parsers
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Base class for XML::Parser::Expat based XML parsers. All XML::SAX::Expat based
|
||||
parsers in SOAP::WSDL inherit from this class.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Replace the whitespace by @ for E-Mail Address.
|
||||
|
||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright 2004-2007 Martin Kutter.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself
|
||||
|
||||
=head1 Repository information
|
||||
|
||||
$Id: $
|
||||
|
||||
$LastChangedDate: 2007-09-10 18:19:23 +0200 (Mo, 10 Sep 2007) $
|
||||
$LastChangedRevision: 218 $
|
||||
$LastChangedBy: kutterma $
|
||||
|
||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $
|
||||
|
||||
@@ -4,7 +4,7 @@ use strict;
|
||||
use warnings;
|
||||
use base qw(SOAP::WSDL::Expat::Base);
|
||||
|
||||
our $VERSION = '2.00_24';
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
sub _initialize {
|
||||
my ($self, $parser) = @_;
|
||||
@@ -21,7 +21,7 @@ sub _initialize {
|
||||
my ($_element, $_method,
|
||||
$_class, $_parser, %_attrs) = ();
|
||||
|
||||
no strict qw(refs);
|
||||
# no strict qw(refs);
|
||||
$parser->setHandlers(
|
||||
Start => sub {
|
||||
push @$list, $current;
|
||||
@@ -113,13 +113,16 @@ Replace the whitespace by @ for E-Mail Address.
|
||||
|
||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 COPYING
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
This module may be used under the same terms as perl itself.
|
||||
Copyright 2004-2007 Martin Kutter.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself
|
||||
|
||||
=head1 Repository information
|
||||
|
||||
$ID: $
|
||||
$Id: $
|
||||
|
||||
$LastChangedDate: 2007-09-10 18:19:23 +0200 (Mo, 10 Sep 2007) $
|
||||
$LastChangedRevision: 218 $
|
||||
|
||||
@@ -4,7 +4,7 @@ use strict;
|
||||
use warnings;
|
||||
use Carp qw(croak confess);
|
||||
|
||||
our $VERSION = q{2.00_25};
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
use SOAP::WSDL::XSD::Typelib::Builtin;
|
||||
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
||||
@@ -24,7 +24,12 @@ sub new {
|
||||
};
|
||||
|
||||
bless $self, $class;
|
||||
$self->load_classes() if ($args->{ class_resolver });
|
||||
|
||||
# could be written as && - but Devel::Cover doesn't like that
|
||||
if ($args->{ class_resolver }) {
|
||||
$self->load_classes()
|
||||
if ! exists $LOADED_OF{ $self->{ class_resolver } };
|
||||
}
|
||||
return $self;
|
||||
}
|
||||
|
||||
@@ -32,7 +37,8 @@ sub class_resolver {
|
||||
my $self = shift;
|
||||
if (@_) {
|
||||
$self->{ class_resolver } = shift;
|
||||
$self->load_classes();
|
||||
$self->load_classes()
|
||||
if ! exists $LOADED_OF{ $self->{ class_resolver } };
|
||||
}
|
||||
return $self->{ class_resolver };
|
||||
}
|
||||
@@ -40,15 +46,13 @@ sub class_resolver {
|
||||
sub load_classes {
|
||||
my $self = shift;
|
||||
|
||||
return if $LOADED_OF{ $self->{ class_resolver } };
|
||||
|
||||
for (values %{ $self->{ class_resolver }->get_typemap }) {
|
||||
no strict qw(refs);
|
||||
my $class = $_;
|
||||
|
||||
# a bad test - do you know a better one?
|
||||
next if $class eq '__SKIP__';
|
||||
next if defined @{ "$class\::ISA"}; # check if namespace exists
|
||||
next if defined *{ "$class\::" }; # check if namespace exists
|
||||
|
||||
$class =~s{ :: }{/}xmsg;
|
||||
$class .= '.pm';
|
||||
@@ -117,7 +121,7 @@ sub _initialize {
|
||||
no strict qw(refs);
|
||||
$parser->setHandlers(
|
||||
Start => sub {
|
||||
# my ($parser, $element, %_attrs) = @_;
|
||||
# my ($parser, $element, %attrs) = @_;
|
||||
|
||||
$_leaf = 1; # believe we're a leaf node until we see an end
|
||||
|
||||
@@ -128,7 +132,7 @@ sub _initialize {
|
||||
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__
|
||||
|
||||
# resolve class of this element
|
||||
@@ -162,6 +166,9 @@ sub _initialize {
|
||||
# (circumventing constructor) here.
|
||||
# That's dirty, but fast.
|
||||
#
|
||||
# TODO: check whether this is faster under all perls - there's
|
||||
# strange benchmark results...
|
||||
#
|
||||
# The alternative would read:
|
||||
# $current = $_class->new({ @_[2..$#_] });
|
||||
#
|
||||
@@ -171,6 +178,21 @@ sub _initialize {
|
||||
$current = bless \$o, $_class;
|
||||
}
|
||||
|
||||
# set attributes if there are any
|
||||
ATTR: {
|
||||
if (@_ > 2) {
|
||||
# die Data::Dumper::Dumper(@_[2..$#_]);
|
||||
my %attr = @_[2..$#_];
|
||||
if (my $nil = delete $attr{nil}) {
|
||||
# TODO: check namespace
|
||||
if ($nil && $nil ne 'false') {
|
||||
undef $characters;
|
||||
last ATTR if not (%attr);
|
||||
}
|
||||
}
|
||||
$current->attr(\%attr);
|
||||
}
|
||||
}
|
||||
$depth++;
|
||||
return;
|
||||
},
|
||||
@@ -191,13 +213,6 @@ sub _initialize {
|
||||
|
||||
$depth--;
|
||||
|
||||
# return if there's only one elment - can't set it in parent ;-)
|
||||
# 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;
|
||||
};
|
||||
|
||||
# we only set character values in leaf nodes
|
||||
if ($_leaf) {
|
||||
# Use dirty but fast access via global variables.
|
||||
@@ -207,12 +222,20 @@ sub _initialize {
|
||||
# $current->set_value( $characters ) if (length($characters));
|
||||
#
|
||||
$SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType::___value
|
||||
->{ $$current } = $characters if $characters =~m{ [^\s] }xms;
|
||||
->{ $$current } = $characters
|
||||
if defined $characters && defined $current; # =~m{ [^\s] }xms;
|
||||
}
|
||||
|
||||
# empty characters
|
||||
$characters = q{};
|
||||
|
||||
# return if there's only one elment - can't set it in parent ;-)
|
||||
# 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 appropriate attribute in last element
|
||||
# multiple values must be implemented in base class
|
||||
# $_method = "add_$_localname";
|
||||
@@ -260,7 +283,7 @@ See L<SOAP::WSDL::Manual::Parser> for details.
|
||||
Sometimes there's unneccessary information transported in SOAP messages.
|
||||
|
||||
To skip XML nodes (including all child nodes), just edit the type map for
|
||||
the message, set the type map entry to '__SKIP__', and comment out all
|
||||
the message, set the type map entry to '__SKIP__', and comment out all
|
||||
child elements you want to skip.
|
||||
|
||||
=head1 Bugs and Limitations
|
||||
@@ -281,16 +304,19 @@ Replace the whitespace by @ for E-Mail Address.
|
||||
|
||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 COPYING
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
This module may be used under the same terms as perl itself.
|
||||
Copyright 2004-2007 Martin Kutter.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself
|
||||
|
||||
=head1 Repository information
|
||||
|
||||
$ID: $
|
||||
$Id: $
|
||||
|
||||
$LastChangedDate: 2007-12-02 23:20:24 +0100 (So, 02 Dez 2007) $
|
||||
$LastChangedRevision: 427 $
|
||||
$LastChangedDate: 2008-04-22 23:51:49 +0200 (Di, 22 Apr 2008) $
|
||||
$LastChangedRevision: 616 $
|
||||
$LastChangedBy: kutterma $
|
||||
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $
|
||||
|
||||
@@ -6,7 +6,7 @@ use XML::Parser::Expat;
|
||||
use SOAP::WSDL::Expat::MessageParser;
|
||||
use base qw(SOAP::WSDL::Expat::MessageParser);
|
||||
|
||||
our $VERSION = '2.00_24';
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
sub parse_start {
|
||||
my $self = shift;
|
||||
@@ -43,7 +43,7 @@ SOAP::WSDL::Expat::MessageStreamParser - Convert SOAP messages to custom object
|
||||
# process response while it comes in, trying to read 32k chunks.
|
||||
$lwp->request( $request, sub { $chunk_parser->parse_more($_[0]) } , 32468 );
|
||||
$chunk_parser->parse_done();
|
||||
|
||||
|
||||
my $obj = $parser->get_data();
|
||||
|
||||
=head1 DESCRIPTION
|
||||
@@ -56,22 +56,22 @@ See L<SOAP::WSDL::Manual::Parser> for details.
|
||||
|
||||
See SOAP::WSDL::Expat::MessageParser
|
||||
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright 2007 Martin Kutter. All rights reserved.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribte/modify it under
|
||||
the same terms as perl itself
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright 2007 Martin Kutter.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 391 $
|
||||
$Rev: 616 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: MessageStreamParser.pm 391 2007-11-17 21:56:13Z kutterma $
|
||||
$Id: MessageStreamParser.pm 616 2008-04-22 21:51:49Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageStreamParser.pm $
|
||||
|
||||
|
||||
=cut
|
||||
|
||||
@@ -5,7 +5,95 @@ use Carp;
|
||||
use SOAP::WSDL::TypeLookup;
|
||||
use base qw(SOAP::WSDL::Expat::Base);
|
||||
|
||||
our $VERSION = q{2.00_25};
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
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) {
|
||||
#print $self->get_uri(), "\n";
|
||||
#use Data::Dumper;
|
||||
#print Data::Dumper::Dumper $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 );
|
||||
$importer->$push_method($_);
|
||||
}
|
||||
# push elements into importing WSDL
|
||||
#$importer->$push_method(@{ $value_ref })
|
||||
# if @{ $value_ref };
|
||||
}
|
||||
}
|
||||
|
||||
sub _import_namespace_definitions {
|
||||
my $self = shift;
|
||||
my $arg_ref = shift;
|
||||
my $importer = $arg_ref->{ importer };
|
||||
my $imported = $arg_ref->{ imported };
|
||||
|
||||
# import namespace definitions, too
|
||||
my $importer_ns_of = $importer->get_xmlns();
|
||||
my %xmlns_of = %{ $imported->get_xmlns() };
|
||||
while (my ($prefix, $url) = each %xmlns_of) {
|
||||
$importer_ns_of->{ $prefix } = $url;
|
||||
}
|
||||
}
|
||||
|
||||
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 $imported = $parser->parse_uri($uri);
|
||||
|
||||
# might already be imported - parse_uri just returns in this case
|
||||
return if not defined $imported;
|
||||
|
||||
$self->_import_namespace_definitions({
|
||||
importer => $schema,
|
||||
imported => $imported,
|
||||
});
|
||||
|
||||
for my $name ( qw(type element group attribute attributeGroup) ) {
|
||||
$self->_import_children( $name, $imported, $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 $imported = $parser->parse_uri($uri);
|
||||
|
||||
# might already be imported - parse_uri just returns in this case
|
||||
return if not defined $imported;
|
||||
|
||||
$self->_import_namespace_definitions({
|
||||
importer => $definitions,
|
||||
imported => $imported,
|
||||
});
|
||||
|
||||
for my $name ( qw(types message binding portType service) ) {
|
||||
$self->_import_children( $name, $imported, $definitions, $import_namespace);
|
||||
}
|
||||
}
|
||||
|
||||
sub _initialize {
|
||||
my ($self, $parser) = @_;
|
||||
@@ -36,7 +124,9 @@ sub _initialize {
|
||||
eval "require $action->{ class }";
|
||||
croak $@ if ($@);
|
||||
|
||||
my $obj = $action->{ class }->new({ parent => $current })
|
||||
my $obj = $action->{ class }->new({ parent => $current,
|
||||
xmlns => { '#default' => $parser->namespace($localname) }
|
||||
})
|
||||
->init( _fixup_attrs( $parser, %attrs ) );
|
||||
|
||||
if ($current) {
|
||||
@@ -63,7 +153,7 @@ sub _initialize {
|
||||
$current->init( _fixup_attrs($parser, %attrs) );
|
||||
}
|
||||
elsif ($action->{ type } eq 'METHOD') {
|
||||
my $method = $action->{ method } || $localname;
|
||||
my $method = $action->{ method };
|
||||
|
||||
no strict qw(refs);
|
||||
# call method with
|
||||
@@ -79,6 +169,20 @@ sub _initialize {
|
||||
: _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;
|
||||
},
|
||||
@@ -143,3 +247,43 @@ sub _fixup_attrs {
|
||||
|
||||
1;
|
||||
|
||||
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SOAP::WSDL::Expat::WSDLParser - Parse WSDL files into object trees
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
|
||||
$parser->parse( $xml );
|
||||
my $obj = $parser->get_data();
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
WSDL parser used by SOAP::WSDL.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Replace the whitespace by @ for E-Mail Address.
|
||||
|
||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright 2004-2007 Martin Kutter.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself
|
||||
|
||||
=head1 Repository information
|
||||
|
||||
$Id: WSDLParser.pm 616 2008-04-22 21:51:49Z kutterma $
|
||||
|
||||
$LastChangedDate: 2008-04-22 23:51:49 +0200 (Di, 22 Apr 2008) $
|
||||
$LastChangedRevision: 616 $
|
||||
$LastChangedBy: kutterma $
|
||||
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/WSDLParser.pm $
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Deserializer;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
our $VERSION = '2.00_24';
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
my %DESERIALIZER = (
|
||||
'1.1' => 'SOAP::WSDL::Deserializer::XSD',
|
||||
@@ -16,7 +16,7 @@ sub register {
|
||||
|
||||
sub get_deserializer {
|
||||
my ($self, $args_of_ref) = @_;
|
||||
|
||||
$args_of_ref->{ soap_version } ||= '1.1';
|
||||
# sanity check
|
||||
die "no deserializer registered for SOAP version $args_of_ref->{ soap_version }"
|
||||
if not exists ($DESERIALIZER{ $args_of_ref->{ soap_version } });
|
||||
@@ -47,10 +47,10 @@ SOAP::WSDL::Factory::Deserializer - Factory for retrieving Deserializer objects
|
||||
# in deserializer class:
|
||||
package MyWickedDeserializer;
|
||||
use SOAP::WSDL::Factory::Deserializer;
|
||||
|
||||
|
||||
# register class as deserializer for SOAP1.2 messages
|
||||
SOAP::WSDL::Factory::Deserializer->register( '1.2' , __PACKAGE__ );
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SOAP::WSDL::Factory::Deserializer serves as factory for retrieving
|
||||
@@ -137,7 +137,7 @@ passed as a single hash ref:
|
||||
|
||||
Copyright 2007 Martin Kutter. All rights reserved.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribte/modify it under
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself
|
||||
|
||||
=head1 AUTHOR
|
||||
@@ -150,5 +150,5 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Serializer.pm 176 2007-08-31 15:28:29Z kutterma $
|
||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
|
||||
|
||||
|
||||
=cut
|
||||
|
||||
@@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Generator;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
our $VERSION='2.00_24';
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
my %GENERATOR = (
|
||||
'XSD' => 'SOAP::WSDL::Generator::Template::XSD',
|
||||
@@ -49,10 +49,10 @@ SOAP::WSDL::Factory:Generator - Factory for retrieving generator objects
|
||||
# in generator class:
|
||||
package MyWickedGenerator;
|
||||
use SOAP::WSDL::Factory::Generator;
|
||||
|
||||
|
||||
# register as generator for SOAP1.2 messages
|
||||
SOAP::WSDL::Factory::Generator->register( '1.2' , __PACKAGE__ );
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SOAP::WSDL::Factory::Generator serves as factory for retrieving
|
||||
@@ -155,7 +155,7 @@ Set user-defined typemap snippet
|
||||
|
||||
Copyright 2007 Martin Kutter. All rights reserved.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribte/modify it under
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself
|
||||
|
||||
=head1 AUTHOR
|
||||
@@ -168,5 +168,5 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Serializer.pm 176 2007-08-31 15:28:29Z kutterma $
|
||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
|
||||
|
||||
|
||||
=cut
|
||||
|
||||
@@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Serializer;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
our $VERSION='2.00_24';
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
my %SERIALIZER = (
|
||||
'1.1' => 'SOAP::WSDL::Serializer::XSD',
|
||||
@@ -16,7 +16,7 @@ sub register {
|
||||
|
||||
sub get_serializer {
|
||||
my ($self, $args_of_ref) = @_;
|
||||
|
||||
$args_of_ref->{ soap_version } ||= '1.1';
|
||||
# sanity check
|
||||
die "no serializer registered for SOAP version $args_of_ref->{ soap_version }"
|
||||
if not exists ($SERIALIZER{ $args_of_ref->{ soap_version } });
|
||||
@@ -46,10 +46,10 @@ SOAP::WSDL::Factory::Serializer - Factory for retrieving serializer objects
|
||||
# in serializer class:
|
||||
package MyWickedSerializer;
|
||||
use SOAP::WSDL::Factory::Serializer;
|
||||
|
||||
|
||||
# register as serializer for SOAP1.2 messages
|
||||
SOAP::WSDL::Factory::Serializer->register( '1.2' , __PACKAGE__ );
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SOAP::WSDL::Factory::Serializer serves as factory for retrieving
|
||||
@@ -138,9 +138,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 391 $
|
||||
$Rev: 616 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Serializer.pm 391 2007-11-17 21:56:13Z kutterma $
|
||||
$Id: Serializer.pm 616 2008-04-22 21:51:49Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
|
||||
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
package SOAP::WSDL::Factory::Transport;
|
||||
use strict;
|
||||
use warnings;
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
our $VERSION='2.00_25';
|
||||
|
||||
# class data
|
||||
my %registered_transport_of = ();
|
||||
|
||||
# Local constants
|
||||
@@ -12,7 +10,7 @@ my %registered_transport_of = ();
|
||||
my %SOAP_LITE_TRANSPORT_OF = (
|
||||
ftp => 'SOAP::Transport::FTP',
|
||||
http => 'SOAP::Transport::HTTP',
|
||||
https => 'SOAP::Transport::HTTPS',
|
||||
https => 'SOAP::Transport::HTTP',
|
||||
mailto => 'SOAP::Transport::MAILTO',
|
||||
'local' => 'SOAP::Transport::LOCAL',
|
||||
jabber => 'SOAP::Transport::JABBER',
|
||||
@@ -32,14 +30,17 @@ sub register {
|
||||
}
|
||||
|
||||
sub get_transport {
|
||||
my ($class, $scheme, %attrs) = @_;
|
||||
my ($class, $url, %attrs) = @_;
|
||||
|
||||
$scheme =~s{ \A ([^\:]+) \: .+ }{$1}smx;
|
||||
|
||||
if ($registered_transport_of{ $scheme }) {
|
||||
my $scheme = $url;
|
||||
$scheme =~s{ \:.+$ }{}xm;
|
||||
|
||||
|
||||
if (defined $registered_transport_of{ $scheme }) {
|
||||
no strict qw(refs);
|
||||
*{ $registered_transport_of{ $scheme } . '::' }{ CODE }
|
||||
or eval "require $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
|
||||
@@ -50,28 +51,30 @@ sub get_transport {
|
||||
# sparse resource ...
|
||||
# ... but we've decided to mimic SOAP::Lite...
|
||||
|
||||
# my $protocol_class = $SOAP_LITE_TRANSPORT_OF{ $scheme } . '::Client';
|
||||
# my $transport;
|
||||
# eval {
|
||||
# $transport = $protocol_class->new( %attrs );
|
||||
# };
|
||||
# return $transport if not $@;
|
||||
return $registered_transport_of{ $scheme }->new( %attrs );
|
||||
}
|
||||
|
||||
# try SOAP::Lite's Transport module - just skip if not require'able
|
||||
SOAP_Lite: {
|
||||
if (exists $SOAP_LITE_TRANSPORT_OF{ $scheme }) {
|
||||
eval "require $SOAP_LITE_TRANSPORT_OF{ $scheme }"
|
||||
or last SOAP_Lite;
|
||||
my $protocol_class = $SOAP_LITE_TRANSPORT_OF{ $scheme } . '::Client';
|
||||
return $protocol_class->new( %attrs );
|
||||
}
|
||||
if (exists $SOAP_LITE_TRANSPORT_OF{ $scheme }) {
|
||||
no strict qw(refs);
|
||||
# behaves interestingly different under different versions of perl
|
||||
# maybe true even if it's not available
|
||||
defined %{ "$SOAP_LITE_TRANSPORT_OF{ $scheme }::" }
|
||||
or eval "require $SOAP_LITE_TRANSPORT_OF{ $scheme }"
|
||||
or last SOAP_Lite;
|
||||
|
||||
my $protocol_class = $SOAP_LITE_TRANSPORT_OF{ $scheme } . '::Client';
|
||||
# may fail if it's not available
|
||||
my $transport = eval { $protocol_class->new( %attrs ) }
|
||||
or last SOAP_Lite;
|
||||
return $transport;
|
||||
}
|
||||
}
|
||||
|
||||
if (exists $SOAP_WSDL_TRANSPORT_OF{ $scheme }) {
|
||||
no strict qw(refs);
|
||||
*{ $SOAP_WSDL_TRANSPORT_OF{ $scheme } . '::' }{ CODE }
|
||||
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 );
|
||||
@@ -96,12 +99,12 @@ SOAP::WSDL::Factory::Transport - Factory for retrieving transport objects
|
||||
# in transport class:
|
||||
package MyWickedTransport;
|
||||
use SOAP::WSDL::Factory::Transport;
|
||||
|
||||
|
||||
# register class as transport module for httpr and https
|
||||
# (httpr is "reliable http", a protocol developed by IBM).
|
||||
SOAP::WSDL::Factory::Transport->register( 'httpr' , __PACKAGE__ );
|
||||
SOAP::WSDL::Factory::Transport->register( 'https' , __PACKAGE__ );
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SOAP::WSDL::Transport serves as factory for retrieving transport objects for
|
||||
@@ -159,7 +162,7 @@ the class should be used for, and $module is the class' module name.
|
||||
To auto-register your transport class on loading, execute register() in your
|
||||
tranport class (see L<SYNOPSIS|SYNOPSIS> above).
|
||||
|
||||
Multiple protocols ore multiple classes are registered by multiple calls to
|
||||
Multiple protocols or multiple classes are registered by multiple calls to
|
||||
register().
|
||||
|
||||
=head2 Transport plugin package layout
|
||||
@@ -207,10 +210,10 @@ classes in one file, and to follow this naming scheme:
|
||||
|
||||
Module name:
|
||||
"SOAP::Transport::" . uc($scheme)
|
||||
|
||||
|
||||
Client class (additional package in module):
|
||||
"SOAP::Transport::" . uc($scheme) . "::Client"
|
||||
|
||||
|
||||
Server class (additional package in module):
|
||||
"SOAP::Transport::" . uc($scheme) . "::Client"
|
||||
|
||||
@@ -240,9 +243,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 435 $
|
||||
$Rev: 616 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Transport.pm 435 2007-12-03 22:31:00Z kutterma $
|
||||
$Id: Transport.pm 616 2008-04-22 21:51:49Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $
|
||||
|
||||
|
||||
=cut
|
||||
|
||||
270
lib/SOAP/WSDL/Generator/Iterator/WSDL11.pm
Normal file
270
lib/SOAP/WSDL/Generator/Iterator/WSDL11.pm
Normal file
@@ -0,0 +1,270 @@
|
||||
package SOAP::WSDL::Generator::Iterator::WSDL11;
|
||||
use strict; use warnings;
|
||||
use Class::Std::Fast;
|
||||
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
my %definitions_of :ATTR(:name<definitions> :default<[]>);
|
||||
my %nodes_of :ATTR(:name<nodes> :default<[]>);
|
||||
|
||||
# memoization attributes
|
||||
my %portType_of :ATTR();
|
||||
my %types_of :ATTR();
|
||||
|
||||
my %METHOD_OF = (
|
||||
'SOAP::WSDL::Definitions' => 'get_service',
|
||||
'SOAP::WSDL::Service' => 'get_port',
|
||||
'SOAP::WSDL::Port' => sub {
|
||||
my ($self, $node) = @_;
|
||||
return if ! $node->first_address()
|
||||
or ! $node->first_address()->isa('SOAP::WSDL::SOAP::Address');
|
||||
|
||||
return [ $self->get_definitions()
|
||||
->find_binding( $node->expand( $node->get_binding() ) ) || () ];
|
||||
},
|
||||
|
||||
'SOAP::WSDL::Binding' => sub {
|
||||
my ($self, $node) = @_;
|
||||
|
||||
# remember referenced portType
|
||||
$portType_of{ ident $self } = $self->get_definitions()
|
||||
->find_portType( $node->expand( $node->get_type ) )
|
||||
or return [];
|
||||
|
||||
return $node->get_operation();
|
||||
},
|
||||
|
||||
'SOAP::WSDL::Operation' => sub {
|
||||
my ($self, $node) = @_;
|
||||
|
||||
my $name = $node->get_name();
|
||||
|
||||
# get the equally named operation from the portType
|
||||
my ($op) = grep { $_->get_name() eq $name }
|
||||
@{ $portType_of{ ident $self }->get_operation() }
|
||||
or return [];
|
||||
|
||||
return [ @{ $op->get_input }, @{ $op->get_output }, @{ $op->get_fault } ]
|
||||
},
|
||||
|
||||
'SOAP::WSDL::OpMessage' => sub {
|
||||
my ($self, $node) = @_;
|
||||
return if ( ref $node->get_parent() eq 'SOAP::WSDL::Binding' ); # we're in binding
|
||||
|
||||
# TODO maybe allow more messages && overloading by specifying name
|
||||
|
||||
return [ $self->get_definitions()->find_message(
|
||||
$node->expand( $node->get_message() )
|
||||
) || () ];
|
||||
},
|
||||
|
||||
'SOAP::WSDL::Message' => 'get_part',
|
||||
|
||||
'SOAP::WSDL::Part' => sub {
|
||||
my ($self, $node) = @_;
|
||||
my $ident = ident $self;
|
||||
my $types = $types_of{ $ident } = $definitions_of{ $ident }->get_types()->[0]
|
||||
or return [];
|
||||
return [
|
||||
# If we have a type, this type is to be used in document/literal
|
||||
# as global type. However this is forbidden, at least by WS-I.
|
||||
# We should store the style/encoding somewhere, and regard it.
|
||||
# TODO: auto-generate element for RPC bindings
|
||||
$node->get_type()
|
||||
? do {
|
||||
die "unsupported global type <"
|
||||
. $node->get_type . "> found in part ". $node->get_name();
|
||||
$types->find_type( $node->expand($node->get_type) )
|
||||
}
|
||||
: (),
|
||||
$node->get_element()
|
||||
? $types->find_element( $node->expand($node->get_element) )
|
||||
: (),
|
||||
];
|
||||
},
|
||||
);
|
||||
|
||||
sub init {
|
||||
my ($self, $arg_of) = @_;
|
||||
my $ident = ident $self;
|
||||
undef $portType_of{ $ident };
|
||||
undef $types_of{ $ident };
|
||||
$nodes_of{ $ident } = [
|
||||
exists($arg_of->{ node })
|
||||
? $arg_of->{ node }
|
||||
: $definitions_of{ ident $self }
|
||||
];
|
||||
}
|
||||
|
||||
sub get_next {
|
||||
my $self = shift;
|
||||
my $ident = ident $self;
|
||||
|
||||
my $node = shift @{ $nodes_of{ $ident }};
|
||||
return if ! defined $node;
|
||||
|
||||
unshift @{ $nodes_of{ $ident }}, @{ $self->get_nextNodes( $node ) || [] };
|
||||
|
||||
return $node;
|
||||
}
|
||||
|
||||
sub get_nextNodes {
|
||||
my ($self, $node) = @_;
|
||||
|
||||
my $method = $METHOD_OF{ ref $node }
|
||||
or return [];
|
||||
|
||||
return (ref($method) eq 'CODE')
|
||||
? $method->( $self, $node )
|
||||
: $node->can($method)->( $node );
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SOAP::WSDL::Generator::Iterator::WSDL11 - WSDL 1.1 Iterator
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $iter = SOAP::WSDL::Generator::Iterator::WSDL11->new({
|
||||
definitions => $wsdl
|
||||
});
|
||||
$iter->init();
|
||||
while (my $node = $iter->get_next()) {
|
||||
# do something with node - possibly call _accept with a visitor on it...
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Iterator for walking a WSDL 1.1 definition.
|
||||
|
||||
The iterator performs a depth-first search along the following path:
|
||||
|
||||
service
|
||||
port
|
||||
binding
|
||||
operation
|
||||
input/output/fault of operation in portType
|
||||
message
|
||||
part
|
||||
type/element in XML schema
|
||||
|
||||
If you wonder about this path: This is how to look up which XML Schema element
|
||||
is associated with a operation from a service/port.
|
||||
|
||||
=head2 Example
|
||||
|
||||
The nodes are returned in the order denoted in the following example:
|
||||
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- 1 -->
|
||||
<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"
|
||||
targetNamespace="urn:HelloWorld"
|
||||
xmlns="http://schemas.xmlsoap.org/wsdl/">
|
||||
<types>
|
||||
<s:schema elementFormDefault="qualified" targetNamespace="urn:HelloWorld">
|
||||
<!-- 9 -->
|
||||
<s:element name="sayHello">
|
||||
<s:complexType>
|
||||
<s:sequence>
|
||||
<s:element minOccurs="0" maxOccurs="1" name="name" type="s:string" />
|
||||
<s:element minOccurs="0" maxOccurs="1" name="givenName" type="s:string" nillable="1" />
|
||||
</s:sequence>
|
||||
<s:attribute name="testAttr" type="s:string" use="optional"></s:attribute>
|
||||
</s:complexType>
|
||||
</s:element>
|
||||
|
||||
<!-- 13 -->
|
||||
<s:element name="sayHelloResponse">
|
||||
<s:complexType>
|
||||
<s:sequence>
|
||||
<s:element minOccurs="0" maxOccurs="1"
|
||||
name="sayHelloResult" type="s:string" />
|
||||
</s:sequence>
|
||||
</s:complexType>
|
||||
</s:element>
|
||||
</s:schema>
|
||||
</types>
|
||||
|
||||
<!-- 7 -->
|
||||
<message name="sayHelloSoapIn">
|
||||
<!-- 8 -->
|
||||
<part name="parameters" element="s0:sayHello" />
|
||||
</message>
|
||||
|
||||
<!-- 11 -->
|
||||
<message name="sayHelloSoapOut">
|
||||
<!-- 12 -->
|
||||
<part name="parameters" element="s0:sayHelloResponse" />
|
||||
</message>
|
||||
|
||||
<portType name="Service1Soap">
|
||||
<operation name="sayHello">
|
||||
<!-- 6 -->
|
||||
<input message="s0:sayHelloSoapIn" />
|
||||
<!-- 10 -->
|
||||
<output message="s0:sayHelloSoapOut" />
|
||||
</operation>
|
||||
</portType>
|
||||
|
||||
<!-- 4 -->
|
||||
<binding name="Service1Soap" type="s0:Service1Soap">
|
||||
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
|
||||
style="document" />
|
||||
|
||||
<!-- 5 -->
|
||||
<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>
|
||||
|
||||
<!-- 2 -->
|
||||
<service name="Service1">
|
||||
<!-- 3 -->
|
||||
<port name="Service1Soap" binding="s0:Service1Soap">
|
||||
<soap:address
|
||||
location="http://localhost:81/soap-wsdl-test/helloworld.pl" />
|
||||
</port>
|
||||
</service>
|
||||
</definitions>
|
||||
|
||||
You should not rely too much on this order - it may change. Even though the
|
||||
current order will probably remain, the nodes currently skipped might
|
||||
be returned somewhere along the path.
|
||||
|
||||
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright 2004-2008 Martin Kutter.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 239 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Client.pm 239 2007-09-11 09:45:42Z kutterma $
|
||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
|
||||
|
||||
=cut
|
||||
145
lib/SOAP/WSDL/Generator/PrefixResolver.pm
Normal file
145
lib/SOAP/WSDL/Generator/PrefixResolver.pm
Normal file
@@ -0,0 +1,145 @@
|
||||
package SOAP::WSDL::Generator::PrefixResolver;
|
||||
use strict; use warnings;
|
||||
|
||||
use Class::Std::Fast::Storable;
|
||||
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
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<{}>);
|
||||
|
||||
sub resolve_prefix {
|
||||
my ($self, $type, $namespace, $element) = @_;
|
||||
my $prefix;
|
||||
if (not defined($namespace)) {
|
||||
$prefix = $prefix_of{ $$self }->{ $type }
|
||||
}
|
||||
else {
|
||||
$prefix = $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 }
|
||||
);
|
||||
}
|
||||
return "${prefix}::";
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SOAP::WSDL::Generator::PrefixResolver - prefixes for different classes
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
If you want to create your custom prefix resolver:
|
||||
|
||||
package MyPrefixResolver;
|
||||
use strict; use warnings;
|
||||
use base qw(SOAP::WSDL::Generator::PrefixResolver);
|
||||
|
||||
sub resolve_prefix {
|
||||
my ($self, $type, $namespace, $node) = @_;
|
||||
# return something special
|
||||
return $self->SUPER::resolve_prefix($type, $namespace, $node);
|
||||
}
|
||||
|
||||
When generating code:
|
||||
|
||||
use MyPrefixResolver;
|
||||
use SOAP::WSDL::Generator::XSD;
|
||||
my $generator = SOAP::WSDL::Generator::Template::XSD->new({
|
||||
prefix_resolver_class => 'MyPrefixResolver',
|
||||
});
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Prefix resolver class for SOAP::WSDL's code generator. You may subclass it to
|
||||
apply some custom prefix resolving logic.
|
||||
|
||||
Subclasses must implement the following methods:
|
||||
|
||||
=over
|
||||
|
||||
=item * resolve_prefix
|
||||
|
||||
sub resolve_prefix {
|
||||
my ($self, $namespace, $node) = @_;
|
||||
# ...
|
||||
}
|
||||
|
||||
resolve_prefix is expected to return a (perl class) prefix. It is called with
|
||||
the following parameters:
|
||||
|
||||
NAME DESCRIPTION
|
||||
-----------------------------------------------------------------------------
|
||||
type One of (server|interface|typemap|type|element|attribute)
|
||||
namespace The targetNamespace of the node to generate a prefix for.
|
||||
node The node to generate a prefix for
|
||||
|
||||
You usually just need type and namespace for prefix resolving. node is
|
||||
provided for rather funky setups, where you have to choose different prefixes
|
||||
based on type names or whatever.
|
||||
|
||||
Node may be of any of the following classes:
|
||||
|
||||
SOAP::WSDL::Service
|
||||
SOAP::WSDL::XSD::Attribute
|
||||
SOAP::WSDL::XSD::Element
|
||||
SOAP::WSDL::XSD::Type
|
||||
|
||||
Note that both namespace and node may be undef - you should test for
|
||||
definedness before doing anything fancy with them.
|
||||
|
||||
If you want your prefixes to represent perl class hierarchies, they should
|
||||
end with '::'.
|
||||
|
||||
Example:
|
||||
|
||||
Imagine you're generating interfaces for the Acme Pet Shop. Acme Corp. has
|
||||
set up their datatypes to be global across all interfaces (and products), while
|
||||
elements are local to the product (the Pet Shop in the example).
|
||||
All elements are in the urn:Acme namespace.
|
||||
|
||||
In addition, there are types in the namespace urn:Acme:Goods, which should go
|
||||
into the same namespace as types, but be prefixed with 'Goods_'
|
||||
|
||||
You may want prefixes (roughly) like this:
|
||||
|
||||
Interfaces: Acme::Client::PetShop::
|
||||
Server: Acme::Server::PetShop::
|
||||
Types: Acme::Types::
|
||||
Types (Goods): Acme::Types::Goods_
|
||||
Elements: Acme::Elements::PetShop::
|
||||
Typemaps: Acme::Typemaps::PetShop::
|
||||
|
||||
=back
|
||||
|
||||
=head1 BUGS AND LIMITATIONS
|
||||
|
||||
You cannot suffix your types by some rule yet...
|
||||
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright 2008 Martin Kutter.
|
||||
|
||||
This library is free software. You may distribute/modify it under
|
||||
the same terms as perl itself
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 583 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: $
|
||||
$HeadURL: $
|
||||
|
||||
=cut
|
||||
@@ -2,20 +2,25 @@ package SOAP::WSDL::Generator::Template;
|
||||
use strict;
|
||||
use Template;
|
||||
use Class::Std::Fast::Storable;
|
||||
use Carp;
|
||||
use SOAP::WSDL::Generator::PrefixResolver;
|
||||
|
||||
our $VERSION=q{2.00_25};
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
my %tt_of :ATTR(:get<tt>);
|
||||
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 %typemap_prefix_of :ATTR(:name<typemap_prefix> :default<MyTypemaps>);
|
||||
my %type_prefix_of :ATTR(:name<type_prefix> :default<MyTypes>);
|
||||
my %element_prefix_of :ATTR(:name<element_prefix> :default<MyElements>);
|
||||
my %INCLUDE_PATH_of :ATTR(:name<INCLUDE_PATH> :default<()>);
|
||||
my %EVAL_PERL_of :ATTR(:name<EVAL_PERL> :default<0>);
|
||||
my %RECURSION_of :ATTR(:name<RECURSION> :default<0>);
|
||||
my %OUTPUT_PATH_of :ATTR(:name<OUTPUT_PATH> :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 %typemap_prefix_of :ATTR(:name<typemap_prefix> :default<MyTypemaps>);
|
||||
my %type_prefix_of :ATTR(:name<type_prefix> :default<MyTypes>);
|
||||
my %element_prefix_of :ATTR(:name<element_prefix> :default<MyElements>);
|
||||
my %attribute_prefix_of :ATTR(:name<attribute_prefix> :default<MyAttributes>);
|
||||
my %INCLUDE_PATH_of :ATTR(:name<INCLUDE_PATH> :default<()>);
|
||||
my %EVAL_PERL_of :ATTR(:name<EVAL_PERL> :default<0>);
|
||||
my %RECURSION_of :ATTR(:name<RECURSION> :default<0>);
|
||||
my %OUTPUT_PATH_of :ATTR(:name<OUTPUT_PATH> :default<.>);
|
||||
|
||||
my %prefix_resolver_class_of :ATTR(:name<prefix_resolver_class> :default<SOAP::WSDL::Generator::PrefixResolver>);
|
||||
|
||||
sub START {
|
||||
my ($self, $ident, $arg_ref) = @_;
|
||||
@@ -25,29 +30,42 @@ sub _process :PROTECTED {
|
||||
my ($self, $template, $arg_ref, $output) = @_;
|
||||
my $ident = ident $self;
|
||||
|
||||
$tt_of{$ident} = Template->new(
|
||||
# always create a new Template object to
|
||||
# force re-loading of plugins.
|
||||
my $tt = Template->new(
|
||||
DEBUG => 1,
|
||||
EVAL_PERL => $EVAL_PERL_of{ $ident },
|
||||
RECURSION => $RECURSION_of{ $ident },
|
||||
INCLUDE_PATH => $INCLUDE_PATH_of{ $ident },
|
||||
OUTPUT_PATH => $OUTPUT_PATH_of{ $ident },
|
||||
)
|
||||
if (not $tt_of{ $ident });
|
||||
PLUGIN_BASE => 'SOAP::WSDL::Generator::Template::Plugin',
|
||||
);
|
||||
|
||||
$tt_of{ $ident }->process( $template,
|
||||
$tt->process( $template,
|
||||
{
|
||||
context => {
|
||||
prefix_resolver => $prefix_resolver_class_of{ $$self }->new({
|
||||
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,
|
||||
attribute => $self->get_attribute_prefix,
|
||||
server => $self->get_server_prefix,
|
||||
type => $self->get_type_prefix,
|
||||
typemap => $self->get_typemap_prefix,
|
||||
}
|
||||
}),
|
||||
},
|
||||
definitions => $self->get_definitions,
|
||||
interface_prefix => $self->get_interface_prefix,
|
||||
server_prefix => $self->get_server_prefix,
|
||||
type_prefix => $self->get_type_prefix,
|
||||
typemap_prefix => $self->get_typemap_prefix,
|
||||
TYPE_PREFIX => $self->get_type_prefix,
|
||||
element_prefix => $self->get_element_prefix,
|
||||
NO_POD => delete $arg_ref->{ NO_POD } ? 1 : 0 ,
|
||||
%{ $arg_ref }
|
||||
},
|
||||
$output)
|
||||
or die $INCLUDE_PATH_of{ $ident }, '\\', $template, ' ', $tt_of{ $ident }->error();
|
||||
or croak $INCLUDE_PATH_of{ $ident }, '\\', $template, ' ', $tt->error();
|
||||
}
|
||||
|
||||
1;
|
||||
179
lib/SOAP/WSDL/Generator/Template/Plugin/XSD.pm
Normal file
179
lib/SOAP/WSDL/Generator/Template/Plugin/XSD.pm
Normal file
@@ -0,0 +1,179 @@
|
||||
package SOAP::WSDL::Generator::Template::Plugin::XSD;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Carp qw(confess);
|
||||
use Class::Std::Fast::Storable constructor => 'none';
|
||||
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
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<()>);
|
||||
my %prefix_resolver_of :ATTR(:name<prefix_resolver> :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;
|
||||
$self->set_prefix_resolver( $stash->{ context }->{ prefix_resolver });
|
||||
return $self; # returns 'MyPlugin'
|
||||
}
|
||||
|
||||
sub new {
|
||||
return shift if ref $_[0];
|
||||
|
||||
my ($class, $arg_ref) = @_;
|
||||
|
||||
my $self = bless \do { my $o = Class::Std::Fast::ID() }, $class;
|
||||
$self->set_prefix_resolver( $arg_ref->{ prefix_resolver });
|
||||
return $self; # returns 'MyPlugin'
|
||||
}
|
||||
|
||||
sub _get_prefix {
|
||||
my ($self, $type, $node) = @_;
|
||||
my $namespace = defined ($node)
|
||||
? ref($node)
|
||||
? $node->get_targetNamespace()
|
||||
: $node
|
||||
: undef;
|
||||
return $self->get_prefix_resolver()->resolve_prefix(
|
||||
$type,
|
||||
$namespace,
|
||||
ref($node)
|
||||
? $node
|
||||
: undef
|
||||
);
|
||||
}
|
||||
|
||||
sub create_xsd_name {
|
||||
my ($self,$node) = @_;
|
||||
my $name = $self->_resolve_prefix($node) #. '::'
|
||||
. $node->get_name();
|
||||
return $self->perl_name( $name );
|
||||
}
|
||||
|
||||
sub create_typemap_name {
|
||||
my ($self, $node) = @_;
|
||||
my $name = $self->_get_prefix('typemap') #. '::'
|
||||
. $node->get_name();
|
||||
return $self->perl_name( $name );
|
||||
}
|
||||
|
||||
sub create_server_name {
|
||||
my ($self, $server, $port) = @_;
|
||||
my $port_name = $port->get_name();
|
||||
$port_name =~s{\A (?:.+)\. ([^\.]+) \z}{$1}x;
|
||||
my $name = join( q{},
|
||||
$self->_get_prefix('server', $server),
|
||||
join( '::', $server->get_name(), $port_name)
|
||||
);
|
||||
return $self->perl_name( $name );
|
||||
}
|
||||
|
||||
sub create_interface_name {
|
||||
my ($self, $server, $port) = @_;
|
||||
my $port_name = $port->get_name();
|
||||
$port_name =~s{\A (?:.+)\. ([^\.]+) \z}{$1}x;
|
||||
my $name = join( q{},
|
||||
$self->_get_prefix('interface', $server),
|
||||
join( '::', $server->get_name(), $port_name )
|
||||
);
|
||||
return $self->perl_name( $name );
|
||||
}
|
||||
|
||||
sub _resolve_prefix {
|
||||
my ($self, $node) = @_;
|
||||
confess "no node" if not $node;
|
||||
if ($node->isa('SOAP::WSDL::XSD::Builtin')) {
|
||||
return $self->_get_prefix('type', $node)
|
||||
}
|
||||
if ( $node->isa('SOAP::WSDL::XSD::SimpleType')
|
||||
or $node->isa('SOAP::WSDL::XSD::ComplexType')
|
||||
) {
|
||||
return $self->_get_prefix('type', $node);
|
||||
}
|
||||
if ( $node->isa('SOAP::WSDL::XSD::Element') ) {
|
||||
return $self->_get_prefix('element', $node);
|
||||
}
|
||||
if ( $node->isa('SOAP::WSDL::XSD::Attribute') ) {
|
||||
return $self->_get_prefix('attribute', $node);
|
||||
}
|
||||
}
|
||||
|
||||
sub perl_name {
|
||||
my $self = shift;
|
||||
my $name = shift;
|
||||
$name =~s{\-}{_}xmsg;
|
||||
$name =~s{\.}{::}xmsg;
|
||||
return $name;
|
||||
}
|
||||
|
||||
sub create_subpackage_name {
|
||||
my $self = shift;
|
||||
my $arg_ref = shift;
|
||||
my $type = ref $arg_ref eq 'HASH' ? $arg_ref->{ value } : $arg_ref;
|
||||
|
||||
my @name_from = $type->get_name() || (); ;
|
||||
my $parent = $type;
|
||||
my $top_node = $parent;
|
||||
if (! $parent->get_parent()->isa('SOAP::WSDL::XSD::Schema') ) {
|
||||
NAMES: while ($parent = $parent->get_parent()) {
|
||||
$top_node = $parent;
|
||||
last NAMES if $parent->get_parent()->isa('SOAP::WSDL::XSD::Schema');
|
||||
# skip empty names - atomic types have no name...
|
||||
unshift @name_from, $parent->get_name()
|
||||
if $parent->get_name();
|
||||
}
|
||||
}
|
||||
# create name for top node
|
||||
my $top_node_name = $self->create_xsd_name($top_node);
|
||||
my $package_name = join('::_', $top_node_name , (@name_from) ? join('::', @name_from) : () );
|
||||
return $package_name;
|
||||
}
|
||||
|
||||
sub create_xmlattr_name {
|
||||
return join '::', shift->create_subpackage_name(shift), 'XmlAttr';
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SOAP::WSDL::Generator::Template::Plugin::XSD - Template plugin for the XSD generator
|
||||
|
||||
=head1 METHODS
|
||||
|
||||
=head2 perl_name
|
||||
|
||||
XSD.perl_name(element.get_name);
|
||||
|
||||
Converts a XML name into a valid perl name (valid for subroutines, variables
|
||||
or the like).
|
||||
|
||||
perl_name takes a crude approach by just replacing . and - (dot and dash)
|
||||
with a underscore. This may or may not be sufficient, and may or may not
|
||||
provoke collisions in your XML names.
|
||||
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright 2008 Martin Kutter.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under the same
|
||||
terms as perl itself
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 564 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: ComplexType.pm 564 2008-02-23 13:31:39Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -5,14 +5,15 @@ use Class::Std::Fast::Storable;
|
||||
use File::Basename;
|
||||
use File::Spec;
|
||||
|
||||
our $VERSION = q{2.00_25};
|
||||
use version; our $VERSION = qv('2.00.01');
|
||||
|
||||
use SOAP::WSDL::Generator::Visitor::Typemap;
|
||||
use SOAP::WSDL::Generator::Visitor::Typelib;
|
||||
use SOAP::WSDL::Generator::Template::Plugin::XSD;
|
||||
use base qw(SOAP::WSDL::Generator::Template);
|
||||
|
||||
my %output_of :ATTR(:name<output> :default<()>);
|
||||
my %typemap_of :ATTR(:name<typemap> :default<({})>);
|
||||
my %output_of :ATTR(:name<output> :default<()>);
|
||||
my %typemap_of :ATTR(:name<typemap> :default<({})>);
|
||||
|
||||
sub BUILD {
|
||||
my ($self, $ident, $arg_ref) = @_;
|
||||
@@ -46,91 +47,104 @@ sub BUILD {
|
||||
);
|
||||
}
|
||||
|
||||
# construct object on call to allow late binding of prefix_resolver class
|
||||
# and namespace maps (not used yet)
|
||||
sub get_name_resolver {
|
||||
my $self = shift;
|
||||
return SOAP::WSDL::Generator::Template::Plugin::XSD->new({
|
||||
prefix_resolver => $self->get_prefix_resolver_class()->new({
|
||||
namespace_prefix_map => {
|
||||
'http://www.w3.org/2001/XMLSchema' => 'SOAP::WSDL::XSD::Typelib::Builtin',
|
||||
},
|
||||
namespace_map => {
|
||||
},
|
||||
prefix => {
|
||||
attribute => $self->get_attribute_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,
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
sub generate {
|
||||
my $self = shift;
|
||||
my $opt = shift;
|
||||
$self->generate_typelib( $opt );
|
||||
# $self->generate_interface( $opt );
|
||||
$self->generate_typemap( $opt );
|
||||
}
|
||||
|
||||
sub generate_typelib {
|
||||
my ($self) = @_;
|
||||
# $output_of{ ident $self } = "";
|
||||
my @schema = @{ $self->get_definitions()->first_types()->get_schema() };
|
||||
for my $type (map { @{ $_->get_type() } , @{ $_->get_element() } } @schema[1..$#schema] ) {
|
||||
my ($self, $arg_ref) = @_;
|
||||
my @schema = exists $arg_ref->{ schema }
|
||||
? @{ $arg_ref->{schema} }
|
||||
: @{ $self->get_definitions()->first_types()->get_schema() };
|
||||
for my $type (map {
|
||||
@{ $_->get_type() } ,
|
||||
@{ $_->get_element() },
|
||||
@{ $_->get_attribute() }
|
||||
} @schema[1..$#schema] ) {
|
||||
$type->_accept( $self );
|
||||
}
|
||||
# return $output_of{ ident $self };
|
||||
return;
|
||||
}
|
||||
|
||||
sub _generate_interface {
|
||||
my $self = shift;
|
||||
my $arg_ref = shift;
|
||||
my $template_name = delete $arg_ref->{ template_name };
|
||||
my $name_method = delete $arg_ref->{ name_method };
|
||||
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_name_resolver()->can($name_method)->(
|
||||
$self->get_name_resolver(),
|
||||
$service,
|
||||
$port,
|
||||
));
|
||||
print "Creating interface class $output\n";
|
||||
|
||||
$self->_process($template_name,
|
||||
{
|
||||
service => $service,
|
||||
port => $port,
|
||||
NO_POD => $arg_ref->{ NO_POD } ? 1 : 0 ,
|
||||
},
|
||||
$output, binmode => ':utf8');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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');
|
||||
}
|
||||
}
|
||||
my ($self, $arg_ref) = @_;
|
||||
$arg_ref->{ template_name } = 'Server.tt';
|
||||
$arg_ref->{ name_method } = 'create_server_name';
|
||||
$self->_generate_interface($arg_ref);
|
||||
}
|
||||
|
||||
sub generate_interface {
|
||||
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_interface_prefix(),
|
||||
$service->get_name(),
|
||||
$port_name,
|
||||
);
|
||||
print "Creating interface class $output\n";
|
||||
|
||||
$self->_process('Interface.tt',
|
||||
{
|
||||
service => $service,
|
||||
port => $port,
|
||||
NO_POD => $arg_ref->{ NO_POD } ? 1 : 0 ,
|
||||
},
|
||||
$output, binmode => ':utf8');
|
||||
}
|
||||
}
|
||||
sub generate_client {
|
||||
my ($self, $arg_ref) = @_;
|
||||
$arg_ref->{ template_name } = 'Interface.tt';
|
||||
$arg_ref->{ name_method } = 'create_interface_name';
|
||||
$self->_generate_interface($arg_ref);
|
||||
}
|
||||
sub generate_interface;
|
||||
*generate_interface = \&generate_client;
|
||||
|
||||
sub generate_typemap {
|
||||
my ($self, $arg_ref) = @_;
|
||||
|
||||
my $visitor = SOAP::WSDL::Generator::Visitor::Typemap->new({
|
||||
type_prefix => $self->get_type_prefix(),
|
||||
element_prefix => $self->get_element_prefix(),
|
||||
@@ -142,13 +156,23 @@ sub generate_typemap {
|
||||
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
%{ $typemap_of{ident $self }},
|
||||
}
|
||||
},
|
||||
resolver => $self->get_name_resolver(),
|
||||
});
|
||||
|
||||
use SOAP::WSDL::Generator::Iterator::WSDL11;
|
||||
my $iterator = SOAP::WSDL::Generator::Iterator::WSDL11->new({
|
||||
definitions => $self->get_definitions });
|
||||
|
||||
for my $service (@{ $self->get_definitions->get_service }) {
|
||||
$visitor->visit_Service( $service );
|
||||
$iterator->init({ node => $service });
|
||||
while (my $node = $iterator->get_next()) {
|
||||
$node->_accept( $visitor );
|
||||
}
|
||||
|
||||
my $output = $arg_ref->{ output }
|
||||
? $arg_ref->{ output }
|
||||
: $self->_generate_filename( $self->get_typemap_prefix(), $service->get_name() );
|
||||
: $self->_generate_filename( $self->get_name_resolver()->create_typemap_name($service) );
|
||||
print "Creating typemap class $output\n";
|
||||
$self->_process('Typemap.tt',
|
||||
{
|
||||
@@ -161,18 +185,26 @@ sub generate_typemap {
|
||||
}
|
||||
|
||||
sub _generate_filename :PRIVATE {
|
||||
my ($self, @parts) = @_;
|
||||
my $name = join '::', @parts;
|
||||
my ($self, $name) = @_;
|
||||
$name =~s{ \. }{::}xmsg;
|
||||
$name =~s{ \- }{_}xmsg;
|
||||
$name =~s{ :: }{/}xmsg;
|
||||
return "$name.pm";
|
||||
}
|
||||
|
||||
sub visit_XSD_Attribute {
|
||||
my ($self, $attribute) = @_;
|
||||
my $output = defined $output_of{ ident $self }
|
||||
? $output_of{ ident $self }
|
||||
: $self->_generate_filename( $self->get_name_resolver()->create_xsd_name($attribute) );
|
||||
$self->_process('attribute.tt', { attribute => $attribute } , $output);
|
||||
}
|
||||
|
||||
sub visit_XSD_Element {
|
||||
my ($self, $element) = @_;
|
||||
my $output = defined $output_of{ ident $self }
|
||||
? $output_of{ ident $self }
|
||||
: $self->_generate_filename( $self->get_element_prefix(), $element->get_name() );
|
||||
: $self->_generate_filename( $self->get_name_resolver()->create_xsd_name($element) );
|
||||
$self->_process('element.tt', { element => $element } , $output);
|
||||
}
|
||||
|
||||
@@ -180,7 +212,7 @@ sub visit_XSD_SimpleType {
|
||||
my ($self, $type) = @_;
|
||||
my $output = defined $output_of{ ident $self }
|
||||
? $output_of{ ident $self }
|
||||
: $self->_generate_filename( $self->get_type_prefix(), $type->get_name() );
|
||||
: $self->_generate_filename( $self->get_name_resolver()->create_xsd_name($type) );
|
||||
$self->_process('simpleType.tt', { simpleType => $type } , $output);
|
||||
}
|
||||
|
||||
@@ -188,8 +220,8 @@ sub visit_XSD_ComplexType {
|
||||
my ($self, $type) = @_;
|
||||
my $output = defined $output_of{ ident $self }
|
||||
? $output_of{ ident $self }
|
||||
: $self->_generate_filename( $self->get_type_prefix(), $type->get_name() );
|
||||
: $self->_generate_filename( $self->get_name_resolver()->create_xsd_name($type) );
|
||||
$self->_process('complexType.tt', { complexType => $type } , $output);
|
||||
}
|
||||
|
||||
1;
|
||||
1;
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
package [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('^.+\.','') %];
|
||||
[% USE XSD -%]
|
||||
[% interface_name = XSD.create_interface_name(service, port) -%]
|
||||
package [% interface_name %];
|
||||
use strict;
|
||||
use warnings;
|
||||
use Class::Std::Fast::Storable;
|
||||
@@ -6,20 +8,20 @@ use Scalar::Util qw(blessed);
|
||||
use base qw(SOAP::WSDL::Client::Base);
|
||||
|
||||
# only load if it hasn't been loaded before
|
||||
require [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]
|
||||
if not [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]->can('get_class');
|
||||
require [% XSD.create_typemap_name(service) %]
|
||||
if not [% XSD.create_typemap_name(service) %]->can('get_class');
|
||||
|
||||
sub START {
|
||||
$_[0]->set_proxy('[% port.first_address.get_location %]') if not $_[2]->{proxy};
|
||||
$_[0]->set_class_resolver('[% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]')
|
||||
$_[0]->set_class_resolver('[% XSD.create_typemap_name(service) %]')
|
||||
if not $_[2]->{class_resolver};
|
||||
}
|
||||
|
||||
[% binding = definitions.find_binding( port.expand( port.get_binding ) );
|
||||
FOREACH operation = binding.get_operation;
|
||||
%][% INCLUDE Interface/Operation.tt %]
|
||||
[%
|
||||
|
||||
[%
|
||||
END;
|
||||
%]
|
||||
|
||||
@@ -28,59 +30,62 @@ sub START {
|
||||
[% IF NO_POD; STOP; END %]
|
||||
|
||||
__END__
|
||||
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||
[% pod = BLOCK %]=pod[% END -%]
|
||||
[% head1 = BLOCK %]=head1[% END -%]
|
||||
[% head2 = BLOCK %]=head2[% END -%]
|
||||
[% head3 = BLOCK %]=head3[% END -%]
|
||||
|
||||
=pod
|
||||
[% pod %]
|
||||
|
||||
=head1 NAME
|
||||
[% head1 %] NAME
|
||||
|
||||
[% interface_name %] - SOAP Interface for the [% service.get_name %] Web Service
|
||||
|
||||
[% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% 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;
|
||||
[% FOREACH operation = binding.get_operation;
|
||||
%] $response = $interface->[% operation.get_name %]();
|
||||
[% END %]
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
[% head1 %] DESCRIPTION
|
||||
|
||||
SOAP Interface for the [% service.get_name %] web service
|
||||
located at [% port.first_address.get_location %].
|
||||
|
||||
=head1 SERVICE [% service.get_name %]
|
||||
[% head1 %] SERVICE [% service.get_name %]
|
||||
|
||||
[% service.get_documentation %]
|
||||
|
||||
=head2 Port [% port.get_name %]
|
||||
[% head2 %] Port [% port.get_name %]
|
||||
|
||||
[% port.get_documentation %]
|
||||
|
||||
=head1 METHODS
|
||||
[% head1 %] METHODS
|
||||
|
||||
=head2 General methods
|
||||
[% head2 %] General methods
|
||||
|
||||
=head3 new
|
||||
[% head3 %] new
|
||||
|
||||
Constructor.
|
||||
|
||||
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
|
||||
|
||||
=head2 SOAP Service methods
|
||||
[% head2 %] SOAP Service methods
|
||||
|
||||
[% INCLUDE Interface/POD/method_info.tt %]
|
||||
|
||||
|
||||
[% FOREACH operation = binding.get_operation;
|
||||
%][% INCLUDE Interface/POD/Operation.tt %]
|
||||
[% END %]
|
||||
|
||||
=head1 AUTHOR
|
||||
[% head1 %] AUTHOR
|
||||
|
||||
Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %]
|
||||
|
||||
=pod
|
||||
=cut
|
||||
@@ -1,14 +1,12 @@
|
||||
[% RETURN IF NOT item;
|
||||
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( type.get_targetNamespace, operation.get_name );
|
||||
message = definitions.find_message( port_op.first_input.expand( port_op.first_input.get_message ) );
|
||||
part_from = message.get_part;
|
||||
PERL %]
|
||||
my $item = $stash->{ item };
|
||||
my $def = $stash->{ definitions };
|
||||
my $part_from = $stash->{ part_from };
|
||||
my $type_prefix = $stash->{ type_prefix };
|
||||
my $element_prefix = $stash->{ element_prefix };
|
||||
my $part_from = $stash->{ message }->get_part();
|
||||
|
||||
my @body_part_from = split m{\s}, $item->get_parts;
|
||||
|
||||
@@ -17,22 +15,25 @@
|
||||
@parts = map {
|
||||
my $part = $_;
|
||||
(grep {
|
||||
my ($ns, $lname) = $def->expand( $_ );
|
||||
($lname eq $part->get_name)
|
||||
# my ($ns, $lname) = $def->expand( $_ );
|
||||
($_ eq $part->get_name)
|
||||
} @body_part_from
|
||||
)
|
||||
? do {
|
||||
my $name;
|
||||
($name = $part->get_element)
|
||||
? do {
|
||||
$name =~s{ ^[^:]+: }{}xms;
|
||||
$element_prefix . '::' . $name;
|
||||
}
|
||||
my $element = $def->first_types->find_element($part->expand($name));
|
||||
my $resolver = $context->plugin('XSD');
|
||||
$resolver->create_xsd_name($element);
|
||||
|
||||
}
|
||||
: ($name = $part->get_type)
|
||||
? do {
|
||||
$name =~s{ ^[^:]+: }{}xms;
|
||||
$type_prefix . '::' . $name;
|
||||
}
|
||||
my $element = $def->first_types->find_type($part->expand($name));
|
||||
my $resolver = $context->plugin('XSD');
|
||||
$resolver->create_xsd_name($element);
|
||||
}
|
||||
: die "input must have either type or element"
|
||||
}
|
||||
: ()
|
||||
@@ -44,21 +45,31 @@
|
||||
my $name;
|
||||
($name = $part->get_element)
|
||||
? do {
|
||||
$name =~s{ ^[^:]+: }{}xms;
|
||||
"$element_prefix\::$name"
|
||||
}
|
||||
my $element = $def->first_types->find_element($part->expand($name));
|
||||
my $resolver = $context->plugin('XSD');
|
||||
$resolver->create_xsd_name($element);
|
||||
}
|
||||
: ($name = $part->get_type)
|
||||
? do {
|
||||
$name =~s{ ^[^:]+: }{}xms;
|
||||
"$type_prefix\::$name"
|
||||
my $element = $def->first_types->find_type($part->expand($name));
|
||||
my $resolver = $context->plugin('XSD');
|
||||
$resolver->create_xsd_name($element);
|
||||
}
|
||||
: die "input must have either type or element";
|
||||
} @{ $part_from };
|
||||
}
|
||||
|
||||
warn "Multiple parts detected in message " . $stash->{ message }->get_name() . ".\n",
|
||||
"WS-I BP demands 0 to 1 parts in message body\n"
|
||||
if (@parts > 1);
|
||||
|
||||
$stash->{ parts } = \@parts;
|
||||
|
||||
[% END %]
|
||||
'use' => '[% item.get_use %]',
|
||||
namespace => '[% item.get_namespace %]',
|
||||
encodingStyle => '[% item.get_encodingStyle %]',
|
||||
parts => [qw( [% parts.join(' ') %] )],
|
||||
[% IF item.get_use != 'literal';
|
||||
THROW NOT_SUPPORTED "Body: SOAP::WSDL supports literal encoding only - ${ item.get_use } found";
|
||||
END %]
|
||||
'use' => '[% item.get_use %]',
|
||||
namespace => '[% item.get_namespace %]',
|
||||
encodingStyle => '[% item.get_encodingStyle %]',
|
||||
parts => [qw( [% parts.join(' ') %] )],
|
||||
@@ -11,27 +11,34 @@
|
||||
my $def = $stash->{ definitions };
|
||||
my $type_prefix = $stash->{ type_prefix };
|
||||
my $element_prefix = $stash->{ element_prefix };
|
||||
my ($ns, $lname) = $def->expand( $item->get_part() );
|
||||
#my ($ns, $lname) = $def->expand( $item->get_part() );
|
||||
my $part_name = $item->get_part();
|
||||
my ($part) = grep {
|
||||
$_->get_name eq $lname
|
||||
&& $_->get_targetNamespace eq $ns } @{ $message->get_part( ) };
|
||||
$_->get_name eq $part_name
|
||||
} @{ $message->get_part( ) };
|
||||
my $part_class = do {
|
||||
my $name;
|
||||
($name = $part->get_element)
|
||||
? do {
|
||||
$name =~s{ ^[^:]+: }{}xms;
|
||||
$element_prefix . '::' . $name;
|
||||
my $element = $def->first_types->find_element($part->expand($name));
|
||||
my $resolver = $context->plugin('XSD');
|
||||
$resolver->create_xsd_name($element);
|
||||
}
|
||||
: ($name = $part->get_type)
|
||||
? do {
|
||||
$name =~s{ ^[^:]+: }{}xms;
|
||||
$type_prefix . '::' . $name;
|
||||
}
|
||||
my $element = $def->first_types->find_type($part->expand($name));
|
||||
my $resolver = $context->plugin('XSD');
|
||||
$resolver->create_xsd_name($element);
|
||||
}
|
||||
: die "input must have either type or element"
|
||||
};
|
||||
$stash->{ part_class } = $part_class;
|
||||
[% END;
|
||||
%]
|
||||
%]
|
||||
[% IF item.get_use != 'literal';
|
||||
THROW NOT_SUPPORTED "Header: SOAP::WSDL supports literal encoding only - ${ item.get_use } found";
|
||||
END %]
|
||||
|
||||
'use' => '[% item.get_use %]',
|
||||
namespace => '[% item.get_namespace %]',
|
||||
encodingStyle => '[% item.get_encodingStyle %]',
|
||||
|
||||
@@ -4,7 +4,12 @@ sub [% operation.get_name %] {
|
||||
return $self->SUPER::call({
|
||||
operation => '[% operation.get_name %]',
|
||||
soap_action => '[% operation.first_operation.get_soapAction %]',
|
||||
style => '[% operation.get_style || binding.get_style %]',
|
||||
style => [% style = operation.first_operation.get_style || binding.get_style;
|
||||
IF style != "document";
|
||||
THROW NOT_SUPPORTED "SOAP::WSDL supports document encoding only - $style found";
|
||||
END;
|
||||
-%]
|
||||
'[% style %]',
|
||||
body => {
|
||||
[% INCLUDE Interface/Body.tt( item = operation.first_input.first_body ); %]
|
||||
},
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
=head3 [% operation.get_name %]
|
||||
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||
[% head3 = BLOCK %]=head3[% END -%]
|
||||
[% head3 %] [% operation.get_name %]
|
||||
|
||||
[% type = definitions.find_portType( binding.expand( binding.get_type ) );
|
||||
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
|
||||
port_op.get_documentation %]
|
||||
|
||||
$interface->[% operation.get_name %]([% INCLUDE Interface/POD/Message.tt %] );
|
||||
|
||||
@@ -5,3 +5,12 @@ 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.
|
||||
|
||||
List items (i.e. multiple occurences) are not displayed in the synopsis.
|
||||
You may generally pass a list ref of hash refs (or objects) instead of a hash
|
||||
ref - this may result in invalid XML if used improperly, though. Note that
|
||||
SOAP::WSDL always expects list references at maximum depth position.
|
||||
|
||||
XML attributes are not displayed in this synopsis and cannot be set using
|
||||
hash refs. See the respective class' documentation for additional information.
|
||||
|
||||
|
||||
2
lib/SOAP/WSDL/Generator/Template/XSD/POD/annotation.tt
Normal file
2
lib/SOAP/WSDL/Generator/Template/XSD/POD/annotation.tt
Normal file
@@ -0,0 +1,2 @@
|
||||
[% node.get_annotation.0.get_documentation %]
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
package [% server_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('^.+\.','') %];
|
||||
[% USE XSD;
|
||||
server_name = XSD.create_server_name(service, port);
|
||||
-%]
|
||||
package [% server_name %];
|
||||
use strict;
|
||||
use warnings;
|
||||
use Class::Std::Fast::Storable;
|
||||
@@ -6,8 +9,8 @@ use Scalar::Util qw(blessed);
|
||||
use base qw(SOAP::WSDL::Client::Base);
|
||||
|
||||
# only load if it hasn't been loaded before
|
||||
require [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]
|
||||
if not [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]->can('get_class');
|
||||
require [% XSD.create_typemap_name(service) %]
|
||||
if not [% XSD.create_typemap_name(service) %]->can('get_class');
|
||||
|
||||
my %transport_class_of :ATTR(:name<transport_class> :default<SOAP::WSDL::Server::CGI>);
|
||||
my %transport_of :ATTR(:name<transport> :default<()>);
|
||||
@@ -23,17 +26,17 @@ my $action_map_ref = {
|
||||
|
||||
sub START {
|
||||
my ($self, $ident, $arg_ref) = @_;
|
||||
eval "require $transport_class_of{ $ident }"
|
||||
eval "require $transport_class_of{ $ident }"
|
||||
or die "Cannot load transport class $transport_class_of{ $ident }: $@";
|
||||
$transport_of{ $ident } = $transport_class_of{ $ident }->new({
|
||||
action_map_ref => $action_map_ref,
|
||||
class_resolver => '[% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]',
|
||||
class_resolver => '[% XSD.create_typemap_name(service) %]',
|
||||
dispatch_to => $dispatch_to{ $ident },
|
||||
});
|
||||
}
|
||||
|
||||
sub handle {
|
||||
$transport_of{ ${ $_[0] } }->handle();
|
||||
$transport_of{ ${ $_[0] } }->handle(@_[1..$#_]);
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -41,48 +44,53 @@ sub handle {
|
||||
[% IF NO_POD; STOP; END %]
|
||||
|
||||
__END__
|
||||
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||
[% pod = BLOCK %]=pod[% END -%]
|
||||
[% head1 = BLOCK %]=head1[% END -%]
|
||||
[% head2 = BLOCK %]=head2[% END -%]
|
||||
[% head3 = BLOCK %]=head3[% END -%]
|
||||
|
||||
=pod
|
||||
[% pod %]
|
||||
|
||||
=head1 NAME
|
||||
[% head1 %] NAME
|
||||
|
||||
[% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %] - SOAP Server Class for the [% service.get_name %] Web Service
|
||||
[% server_name %] - SOAP Server Class for the [% service.get_name %] Web Service
|
||||
|
||||
=head1 SYNOPSIS
|
||||
[% head1 %] SYNOPSIS
|
||||
|
||||
use [% server_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %];
|
||||
my $server = [% server_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %]->new({
|
||||
use [% server_name %];
|
||||
my $server = [% server_name %]->new({
|
||||
dispatch_to => 'My::Handler::Class',
|
||||
transport_class => 'SOAP::WSDL::Server::CGI', # optional, default
|
||||
});
|
||||
$server->handle();
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
[% head1 %] DESCRIPTION
|
||||
|
||||
SOAP Server handler for the [% service.get_name %] web service
|
||||
located at [% port.first_address.get_location %].
|
||||
|
||||
=head1 SERVICE [% service.get_name %]
|
||||
[% head1 %] SERVICE [% service.get_name %]
|
||||
|
||||
[% service.get_documentation %]
|
||||
|
||||
=head2 Port [% port.get_name %]
|
||||
[% head2 %] Port [% port.get_name %]
|
||||
|
||||
[% port.get_documentation %]
|
||||
|
||||
=head1 METHODS
|
||||
[% head1 %] METHODS
|
||||
|
||||
=head2 General methods
|
||||
[% head2 %] General methods
|
||||
|
||||
=head3 new
|
||||
[% head3 %] new
|
||||
|
||||
Constructor.
|
||||
|
||||
The C<dispatch_to> argument is mandatory. It must be a class or object
|
||||
The C<dispatch_to> argument is mandatory. It must be a class or object
|
||||
implementing the SOAP Service methods listed below.
|
||||
|
||||
=head2 SOAP Service methods
|
||||
[% head2 %] SOAP Service methods
|
||||
|
||||
[% INCLUDE Server/POD/method_info.tt %]
|
||||
|
||||
@@ -90,8 +98,8 @@ implementing the SOAP Service methods listed below.
|
||||
%][% INCLUDE Server/POD/Operation.tt %]
|
||||
[% END %]
|
||||
|
||||
=head1 AUTHOR
|
||||
[% head1 %] AUTHOR
|
||||
|
||||
Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %]
|
||||
|
||||
=pod
|
||||
=cut
|
||||
|
||||
@@ -1,15 +1,51 @@
|
||||
=head3 [% operation.get_name %]
|
||||
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||
[% head3 = BLOCK %]=head3[% END -%]
|
||||
|
||||
[% type = definitions.find_portType( binding.expand( binding.get_type ) );
|
||||
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
|
||||
port_op.get_documentation %]
|
||||
[% head3 %] [% operation.get_name %]
|
||||
|
||||
[% type = definitions.find_portType( binding.expand( binding.get_type ) );
|
||||
port_op = '';
|
||||
FOREACH port_op = type.get_operation();
|
||||
IF (port_op.get_name == operation.get_name);
|
||||
LAST;
|
||||
END;
|
||||
END;
|
||||
|
||||
input_message_name = port_op.first_input.get_message();
|
||||
output_message_name = port_op.first_output.get_message();
|
||||
|
||||
input_message = definitions.find_message(port_op.first_input.expand(input_message_name));
|
||||
output_message = definitions.find_message(port_op.first_output.expand(output_message_name));
|
||||
|
||||
input_parts = input_message.get_part();
|
||||
output_parts = output_message.get_part();
|
||||
|
||||
# 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
|
||||
|
||||
[%
|
||||
IF (input_parts.size() > 1); -%]
|
||||
# body is a list ref of the following objects:
|
||||
# [
|
||||
# sorry - POD support not implemented yet
|
||||
# ]
|
||||
[% ELSE;
|
||||
input_element = definitions.first_types.find_element(input_parts.0.expand(input_parts.0.get_element));
|
||||
IF (input_element);
|
||||
class = XSD.create_xsd_name( input_element );
|
||||
ELSE;
|
||||
input_type = definitions.first_types.find_type(input_parts.0.expand(input_parts.0.get_type));
|
||||
class = XSD.create_xsd_name( input_type );
|
||||
END;
|
||||
-%]
|
||||
# body is a [% class %] object
|
||||
[%-
|
||||
END;
|
||||
%]
|
||||
# header is a ??? object - sorry, POD support not implemented yet
|
||||
# do something with body and header...
|
||||
|
||||
|
||||
return [% INCLUDE Server/POD/Message.tt %]
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#element;
|
||||
#STOP;
|
||||
-%]
|
||||
[% element_prefix %]::[% element.get_name.replace('\.', '::') %]->new([%
|
||||
[% XSD.create_xsd_name(element) %]->new([%
|
||||
type = element.first_complexType || element.first_simpleType || definitions.first_types.find_type(
|
||||
element.expand( element.get_type ) );
|
||||
INCLUDE Interface/POD/Type.tt; %]
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
package [% typemap_prefix %]::[% service.get_name.replace('\.','::') %];
|
||||
[% USE XSD %]
|
||||
package [% XSD.create_typemap_name(service) %];
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
@@ -18,13 +19,18 @@ sub get_typemap {
|
||||
|
||||
__END__
|
||||
|
||||
=pod
|
||||
__END__
|
||||
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||
[% pod = BLOCK %]=pod[% END -%]
|
||||
[% head1 = BLOCK %]=head1[% END -%]
|
||||
|
||||
=head1 NAME
|
||||
[% pod %]
|
||||
|
||||
[% typemap_prefix %]::[% service.get_name.replace('\.','::') %]; - typemap for ::[% service.get_name %];
|
||||
[% head1 %] NAME
|
||||
|
||||
=head1 DESCRIPTION
|
||||
[% XSD.create_typemap_name(service) %] - typemap for [% service.get_name %]
|
||||
|
||||
[% head1 %] DESCRIPTION
|
||||
|
||||
Typemap created by SOAP::WSDL for map-based SOAP message parsers.
|
||||
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
[% type_name = node.expand( type );
|
||||
IF (type_name.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::[% type_name.1 %]
|
||||
[% ELSE -%]
|
||||
[% type_prefix %]::[% type_name.1 %]
|
||||
[% END -%]
|
||||
83
lib/SOAP/WSDL/Generator/Template/XSD/attribute.tt
Normal file
83
lib/SOAP/WSDL/Generator/Template/XSD/attribute.tt
Normal file
@@ -0,0 +1,83 @@
|
||||
[% USE XSD(context) %]
|
||||
package [% XSD.create_xsd_name(attribute) %];
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
{ # BLOCK to scope variables
|
||||
|
||||
sub get_xmlns { '[% attribute.get_targetNamespace %]' }
|
||||
|
||||
__PACKAGE__->__set_name('[% attribute.get_name %]');
|
||||
__PACKAGE__->__set_ref([% IF attribute.get_ref; %]'[% attribute.get_ref %]'[% END %]);
|
||||
|
||||
[%- IF (type_name = attribute.get_type); -%]
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Attribute
|
||||
[% type = definitions.get_types.0.find_type(attribute.expand(type_name));
|
||||
IF ! type;
|
||||
THROW NOT_FOUND "type " _ type_name _ " not found in attribute " _ attribute.get_name;
|
||||
END;
|
||||
XSD.create_xsd_name(type) %]
|
||||
);
|
||||
|
||||
}
|
||||
[%- ELSIF (ref = attribute.get_ref);
|
||||
ref_from = ref.split(':');
|
||||
-%]
|
||||
# attribute ref="[% ref %]"
|
||||
use base qw(
|
||||
[% ref_element = definitions.get_types.0.find_attribute(attribute.expand(ref));
|
||||
XSD.create_xsd_name( ref_element ); %]
|
||||
);
|
||||
|
||||
}
|
||||
[%- ELSIF (simpleType = attribute.first_simpleType) %]
|
||||
# atomic simpleType: <attribute><simpleType
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Attribute
|
||||
);
|
||||
[% INCLUDE simpleType/contentModel.tt -%]
|
||||
|
||||
}
|
||||
|
||||
[% END %]
|
||||
|
||||
1;
|
||||
|
||||
[%# 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
|
||||
|
||||
[% XSD.create_xsd_name(attribute) %]
|
||||
|
||||
[% head1 %] DESCRIPTION
|
||||
|
||||
Perl data type class for the XML Schema defined attribute
|
||||
[% attribute.get_name %] from the namespace [% attribute.get_targetNamespace %].
|
||||
|
||||
[% INCLUDE POD/annotation.tt(node = attribute) %]
|
||||
|
||||
[% INCLUDE element/POD/contentModel.tt(element = attribute) %]
|
||||
|
||||
[% head1 %] METHODS
|
||||
|
||||
[% head2 %] new
|
||||
|
||||
my $element = [% XSD.create_xsd_name(attribute) %]->new($data);
|
||||
|
||||
Constructor. The following data structure may be passed to new():
|
||||
|
||||
{ value => $value }
|
||||
|
||||
[% head1 %] AUTHOR
|
||||
|
||||
Generated by SOAP::WSDL
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,42 +1,67 @@
|
||||
package [% type_prefix %]::[% complexType.get_name %];
|
||||
[% USE XSD -%]
|
||||
package [% XSD.create_xsd_name(complexType) %];
|
||||
use strict;
|
||||
use warnings;
|
||||
[% INCLUDE complexType/contentModel.tt %]
|
||||
|
||||
[%#
|
||||
# Don't include any perl source here - there may be sub-packages...
|
||||
# Don't include any perl source for this package below this line - there
|
||||
# may be sub-packages...
|
||||
#-%]
|
||||
|
||||
[% INCLUDE complexType/contentModel.tt %]
|
||||
|
||||
1;
|
||||
|
||||
=pod
|
||||
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||
[% pod = BLOCK %]=pod[% END -%]
|
||||
[% head1 = BLOCK %]=head1[% END -%]
|
||||
[% head2 = BLOCK %]=head2[% END -%]
|
||||
[% head3 = BLOCK %]=head3[% END -%]
|
||||
|
||||
=head1 NAME
|
||||
[% pod %]
|
||||
|
||||
[% type_prefix %]::[% complexType.get_name %]
|
||||
[% head1 %] NAME
|
||||
|
||||
=head1 DESCRIPTION
|
||||
[% XSD.create_xsd_name(complexType) %]
|
||||
|
||||
Perl data type class for the XML Schema defined complextype
|
||||
[% head1 %] DESCRIPTION
|
||||
|
||||
Perl data type class for the XML Schema defined complexType
|
||||
[% complexType.get_name %] from the namespace [% complexType.get_targetNamespace %].
|
||||
|
||||
=head2 PROPERTIES
|
||||
[% INCLUDE POD/annotation.tt(node = complexType) %]
|
||||
|
||||
[% IF (complexType.get_element); %]
|
||||
[% head2 %] PROPERTIES
|
||||
|
||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||
methods:
|
||||
|
||||
=over
|
||||
|
||||
[% FOREACH element = complexType.get_element -%]
|
||||
[% element.get_name %]
|
||||
=item * [% element.get_name %]
|
||||
|
||||
[% IF element.get_annotation.get_documentation; %]
|
||||
[% element.get_annotation.get_documentation %]
|
||||
[% END -%]
|
||||
[% END %]
|
||||
|
||||
=head1 METHODS
|
||||
=back
|
||||
|
||||
=head2 new
|
||||
[% END -%]
|
||||
|
||||
[% head1 %] METHODS
|
||||
|
||||
[% head2 %] new
|
||||
|
||||
Constructor. The following data structure may be passed to new():
|
||||
|
||||
[% indent = ' '; INCLUDE complexType/POD/structure.tt %]
|
||||
|
||||
=head1 AUTHOR
|
||||
[% INCLUDE complexType/POD/attributeSet.tt %]
|
||||
|
||||
[% head1 %] AUTHOR
|
||||
|
||||
Generated by SOAP::WSDL
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
[% indent %]{
|
||||
[%- IF complexType.get_name %] # [% type_prefix %]::[% complexType.get_name %][% END %]
|
||||
{
|
||||
[%- IF complexType.get_name %] # [% XSD.create_xsd_name(complexType) %][% END %]
|
||||
[%- indent = indent _ ' ';
|
||||
FOREACH element = complexType.get_element %]
|
||||
[% indent %][% element.get_name %] => [% INCLUDE element/POD/structure.tt -%]
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
[% head2 = BLOCK %]=head2[% END -%]
|
||||
[% IF (complexType.get_attribute.size) %]
|
||||
|
||||
[% head2 %] attr
|
||||
|
||||
NOTE: Attribute documentation is experimental, and may be inaccurate.
|
||||
See the correspondent WSDL/XML Schema if in question.
|
||||
|
||||
This class has additional attributes, accessibly via the C<attr()> method.
|
||||
|
||||
attr() returns an object of the class [% XSD.create_xmlattr_name(complexType) %].
|
||||
|
||||
The following attributes can be accessed on this object via the corresponding
|
||||
get_/set_ methods:
|
||||
|
||||
=over
|
||||
|
||||
[% FOREACH element = complexType.get_attribute;
|
||||
WHILE element.get_ref;
|
||||
element = definitions.first_types.find_attribute(element.expand( element.get_ref ));
|
||||
END; -%]
|
||||
=item * [% element.get_name %]
|
||||
|
||||
[%- IF (element.get_annotation && element.get_annotation.0.get_documentation) %]
|
||||
[% element.get_annotation.0.get_documentation %]
|
||||
[% END; %]
|
||||
|
||||
[% IF (type_name=element.get_type);
|
||||
type = definitions.get_types.0.find_type(element.expand(type_name));
|
||||
IF (! type);
|
||||
THROW NOT_FOUND "type " _ type_name _ " for attribute " _ element.get_name _ " not found";
|
||||
END; %]
|
||||
This attribute is of type L<[% XSD.create_xsd_name(type) %]|[% XSD.create_xsd_name(type) %]>.
|
||||
[% END %]
|
||||
|
||||
[%- END -%]
|
||||
[% END %]
|
||||
@@ -1,5 +1,5 @@
|
||||
[% indent %]{
|
||||
[%- IF complexType.get_name %] # [% type_prefix %]::[% complexType.get_name %][% END %]
|
||||
[%- IF complexType.get_name %] # [% XSD.create_xsd_name(complexType) %][% END %]
|
||||
[%- indent = indent _ ' ' %]
|
||||
[% indent %]# One of the following elements.
|
||||
[% indent %]# No occurance checks yet, so be sure to pass just one...
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
[% IF (complexType.get_variety == 'restriction');
|
||||
INCLUDE complexType/POD/restriction.tt(complexType = complexType);
|
||||
ELSIF (complexType.get_variety == 'sequence');
|
||||
THROW NOT_IMPLEMENTED, "${ complexType.get_name } - complexType complexContent extension not implemented yet";
|
||||
ELSIF (complexType.get_variety == 'extension');
|
||||
#THROW NOT_IMPLEMENTED, "${ complexType.get_name } - complexType complexContent extension not implemented yet";
|
||||
%]
|
||||
# No documentation generated for complexContent / extension yet
|
||||
[%
|
||||
ELSE;
|
||||
THROW UNKNOWN, "unknown variety ${ complexType.get_variety }";
|
||||
END;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
[% indent %]{
|
||||
[%- IF complexType.get_name %] # [% type_prefix %]::[% complexType.get_name %][% END %]
|
||||
[%- IF complexType.get_name %] # [% XSD.create_xsd_name(complexType) %][% END %]
|
||||
[%- indent = indent _ ' ';
|
||||
FOREACH element = complexType.get_element %]
|
||||
[% indent %][% element.get_name %] => [% INCLUDE element/POD/structure.tt -%]
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
[% IF (complexType.get_variety == 'restriction');
|
||||
INCLUDE complexType/POD/simpleContent/restriction.tt(complexType = complexType);
|
||||
ELSIF (complexType.get_variety == 'extension');
|
||||
INCLUDE complexType/POD/simpleContent/restriction.tt(complexType = complexType);
|
||||
ELSE;
|
||||
THROW UNKNOWN, "unknown variety ${ complexType.get_variety }";
|
||||
END;
|
||||
|
||||
%]
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user