Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0cbf981665 | ||
|
|
51db446428 | ||
|
|
f0b3bdc201 | ||
|
|
874251225f | ||
|
|
2bad767211 |
@@ -2,18 +2,18 @@ use Module::Build;
|
|||||||
use version;
|
use version;
|
||||||
$build = Module::Build->new(
|
$build = Module::Build->new(
|
||||||
dist_author => 'Martin Kutter <martin.kutter@fen-net.de>',
|
dist_author => 'Martin Kutter <martin.kutter@fen-net.de>',
|
||||||
create_makefile_pl => 'passthrough',
|
create_makefile_pl => 'small',
|
||||||
dist_abstract => 'SOAP with WSDL support',
|
dist_abstract => 'SOAP with WSDL support',
|
||||||
dist_name => 'SOAP-WSDL',
|
dist_name => 'SOAP-WSDL',
|
||||||
dist_version => '2.00_28',
|
dist_version => '2.00_33',
|
||||||
module_name => 'SOAP::WSDL',
|
module_name => 'SOAP::WSDL',
|
||||||
license => 'artistic',
|
license => 'artistic',
|
||||||
requires => {
|
requires => {
|
||||||
# 5.6.x is way too buggy and has no unicode support
|
# 5.6.x is way too buggy and has no unicode support
|
||||||
# for us. SOAP-WSDL relies on unicode (WS-I demands it)
|
# for us. SOAP-WSDL relies on unicode (WS-I demands it)
|
||||||
# and triggers several 5.6 bugs...
|
# and triggers several 5.6 bugs...
|
||||||
'perl' => q(5.8.0),
|
'perl' => q(5.8.0),
|
||||||
'Class::Std::Fast' => qv(0.0.5),
|
'Class::Std::Fast' => q(0.0.5),
|
||||||
'Data::Dumper' => 0,
|
'Data::Dumper' => 0,
|
||||||
'Date::Parse' => 0,
|
'Date::Parse' => 0,
|
||||||
'Date::Format' => 0,
|
'Date::Format' => 0,
|
||||||
@@ -24,22 +24,24 @@ $build = Module::Build->new(
|
|||||||
'LWP::UserAgent' => 0,
|
'LWP::UserAgent' => 0,
|
||||||
'Template' => 0,
|
'Template' => 0,
|
||||||
'Term::ReadKey' => 0,
|
'Term::ReadKey' => 0,
|
||||||
|
'URI' => 0,
|
||||||
'XML::Parser::Expat' => 0,
|
'XML::Parser::Expat' => 0,
|
||||||
},
|
},
|
||||||
buildrequires => {
|
build_requires => {
|
||||||
'Class::Std::Fast' => qv(0.0.5),
|
'Class::Std::Fast' => q(0.0.5),
|
||||||
'Cwd' => 0,
|
'Cwd' => 0,
|
||||||
'Date::Parse' => 0,
|
'Date::Parse' => 0,
|
||||||
'Date::Format' => 0,
|
'Date::Format' => 0,
|
||||||
'Getopt::Long' => 0,
|
'Getopt::Long' => 0,
|
||||||
'List::Util' => 0,
|
'List::Util' => 0,
|
||||||
'LWP::UserAgent' => 0,
|
'LWP::UserAgent' => 0,
|
||||||
|
'Module::Build' => 0,
|
||||||
'File::Basename' => 0,
|
'File::Basename' => 0,
|
||||||
'File::Path' => 0,
|
'File::Path' => 0,
|
||||||
'File::Spec' => 0,
|
'File::Spec' => 0,
|
||||||
'Storable' => 0,
|
'Storable' => 0,
|
||||||
'Test::More' => 0,
|
'Test::More' => 0,
|
||||||
'Template' => 0,
|
'Template' => 0,
|
||||||
'XML::Parser::Expat' => 0,
|
'XML::Parser::Expat' => 0,
|
||||||
},
|
},
|
||||||
recursive_test_files => 1,
|
recursive_test_files => 1,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Release notes for SOAP::WSDL 2.00_28
|
Release notes for SOAP::WSDL 2.00_33
|
||||||
-------
|
-------
|
||||||
|
|
||||||
I'm proud to present a new pre-release version of SOAP::WSDL.
|
I'm proud to present a new pre-release version of SOAP::WSDL.
|
||||||
@@ -16,17 +16,17 @@ Features:
|
|||||||
o Automatically encodes perl data structures as message data
|
o Automatically encodes perl data structures as message data
|
||||||
o Automatically sets HTTP headers right
|
o Automatically sets HTTP headers right
|
||||||
* Efficient documentation
|
* Efficient documentation
|
||||||
o SOAP::WSDL::Manual guides you at getting your work done, not at
|
o SOAP::WSDL::Manual guides you at getting your work done, not at
|
||||||
the module's internals
|
the module's internals
|
||||||
* Thorough test suite
|
* Thorough test suite
|
||||||
o SOAP::WSDL is heavily regression tested, with a test coverage of
|
o SOAP::WSDL is heavily regression tested, with a test coverage of
|
||||||
over 95% (excluding documentation - you wouldn't want to read
|
over 95% (excluding documentation - you wouldn't want to read
|
||||||
through it all).
|
through it all).
|
||||||
* SOAP::Lite like look and feel
|
* SOAP::Lite like look and feel
|
||||||
o Where possible, SOAP::WSDL mimics SOAP::Lite's API to allow easy migrations
|
o Where possible, SOAP::WSDL mimics SOAP::Lite's API to allow easy migrations
|
||||||
* XML schema based class library for creating data objects
|
* XML schema based class library for creating data objects
|
||||||
* High-performance XML parser
|
* High-performance XML parser
|
||||||
* Plugin support. SOAP::WSDL can be extended through plugins in various aspects.
|
* Plugin support. SOAP::WSDL can be extended through plugins in various aspects.
|
||||||
The following plugins are supported:
|
The following plugins are supported:
|
||||||
o Transport plugins via SOAP::WSDL::Factory::Transport
|
o Transport plugins via SOAP::WSDL::Factory::Transport
|
||||||
o Serializer plugins via SOAP::WSDL::Factory::Serializer
|
o Serializer plugins via SOAP::WSDL::Factory::Serializer
|
||||||
@@ -34,15 +34,128 @@ Features:
|
|||||||
|
|
||||||
The following changes have been made:
|
The following changes have been made:
|
||||||
|
|
||||||
|
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
|
2.00_28
|
||||||
|
|
||||||
The following bugs have been fixed (the numbers in square brackets are the
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||||
|
|
||||||
* #32062: minor doc fixes
|
* #32062: minor doc fixes
|
||||||
* [ 1852988 ] Generated Interface POD is invalid
|
* [ 1852988 ] Generated Interface POD is invalid
|
||||||
* [ 1855583 ] t/SOAP/WSDL/XSD/Typelib/ComplexType.t requires Test::Warn
|
* [ 1855583 ] t/SOAP/WSDL/XSD/Typelib/ComplexType.t requires Test::Warn
|
||||||
|
|
||||||
The following uncategorized improvements have been made:
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
@@ -50,13 +163,13 @@ The following uncategorized improvements have been made:
|
|||||||
|
|
||||||
2.00_27
|
2.00_27
|
||||||
|
|
||||||
The following features were added (the numbers in square brackets are the
|
The following features were added (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||||
|
|
||||||
* [ 1850793 ] Add a to_hash_ref method
|
* [ 1850793 ] Add a to_hash_ref method
|
||||||
* [ 1844427 ] Support multiple parts in body
|
* [ 1844427 ] Support multiple parts in body
|
||||||
|
|
||||||
The following bugs have been fixed (the numbers in square brackets are the
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||||
|
|
||||||
@@ -74,10 +187,10 @@ The following uncategorized improvements have been made:
|
|||||||
|
|
||||||
2.00_26
|
2.00_26
|
||||||
|
|
||||||
The following features were added (the numbers in square brackets are the
|
The following features were added (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||||
|
|
||||||
The following bugs have been fixed (the numbers in square brackets are the
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||||
|
|
||||||
@@ -93,25 +206,25 @@ The following uncategorized improvements have been made:
|
|||||||
---
|
---
|
||||||
WARNING: INCOMPATIBLE CHANGE:
|
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.
|
upgrading from previous versions.
|
||||||
You probably need to re-generate all your interfaces.
|
You probably need to re-generate all your interfaces.
|
||||||
|
|
||||||
WARNING: INCOMPATIBLE CHANGE:
|
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.
|
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:
|
containing the string is printed or used like this:
|
||||||
|
|
||||||
my $value = "$simpleType";
|
my $value = "$simpleType";
|
||||||
|
|
||||||
Note that ComplexType objects still serialize to their XML on
|
Note that ComplexType objects still serialize to their XML on
|
||||||
stringification. This Change is due to the demands of applications
|
stringification. This Change is due to the demands of applications
|
||||||
embedding SOAP::WSDL::XSD::Typelib objects in templates - it would mean
|
embedding SOAP::WSDL::XSD::Typelib objects in templates - it would mean
|
||||||
a nasty ->get_value for every (simple) value.
|
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):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||||
|
|
||||||
* [ 1837347 ] Use Class::Std::Fast
|
* [ 1837347 ] Use Class::Std::Fast
|
||||||
@@ -120,7 +233,7 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
|||||||
for even faster XS implementations.
|
for even faster XS implementations.
|
||||||
* [ 1842436 ] Add SOAP Server
|
* [ 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):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||||
|
|
||||||
@@ -138,13 +251,13 @@ The following uncategorized improvements have been made:
|
|||||||
|
|
||||||
2.00_24
|
2.00_24
|
||||||
---
|
---
|
||||||
The following features were added (the numbers in square brackets are the
|
The following features were added (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||||
|
|
||||||
* [ 1832998 ] Make interface methods complain when called as class method
|
* [ 1832998 ] Make interface methods complain when called as class method
|
||||||
* [ 1826833 ] listify all XSD type objects when called as @{}
|
* [ 1826833 ] listify all XSD type objects when called as @{}
|
||||||
|
|
||||||
The following bugs have been fixed (the numbers in square brackets are the
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||||
|
|
||||||
@@ -153,7 +266,7 @@ The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
|||||||
* [ 1828240 ] POD Defects
|
* [ 1828240 ] POD Defects
|
||||||
* [ 1792348 ] 006_client.t requires SOAP::Lite (again)
|
* [ 1792348 ] 006_client.t requires SOAP::Lite (again)
|
||||||
|
|
||||||
The following uncategorized improvements have been made:
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
* The test suite has been improved
|
* The test suite has been improved
|
||||||
* Documentation has been improved
|
* Documentation has been improved
|
||||||
@@ -161,160 +274,160 @@ The following uncategorized improvements have been made:
|
|||||||
2.00_23
|
2.00_23
|
||||||
---
|
---
|
||||||
|
|
||||||
The following bugs have been fixed (the numbers in square brackets are the
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
|
||||||
* [ 1826382 ] nillable elements not serialized as xsi:nil
|
* [ 1826382 ] nillable elements not serialized as xsi:nil
|
||||||
* [ 1826337 ] Second element in complexType gets eaten up
|
* [ 1826337 ] Second element in complexType gets eaten up
|
||||||
* [ 1792348 ] 006_client.t requires SOAP::Lite (again)
|
* [ 1792348 ] 006_client.t requires SOAP::Lite (again)
|
||||||
|
|
||||||
The following uncategorized improvements have been made:
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
* Test for complexType containing element with atomic simpleType added
|
* Test for complexType containing element with atomic simpleType added
|
||||||
|
|
||||||
2.00_22
|
2.00_22
|
||||||
----
|
----
|
||||||
|
|
||||||
The following bugs have been fixed (the numbers in square brackets are the
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
|
||||||
* [ 1817697 ] Dots in service/port names lead to broken interfaces
|
* [ 1817697 ] Dots in service/port names lead to broken interfaces
|
||||||
* [ 1817699 ] Templates not found on all OS
|
* [ 1817699 ] Templates not found on all OS
|
||||||
|
|
||||||
The following uncategorized improvements have been made:
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
* Code cleanup. The XSD library has been cleaned up a bit. Should result
|
* Code cleanup. The XSD library has been cleaned up a bit. Should result
|
||||||
in a minor speedup in serializing and deserializing XML messages,
|
in a minor speedup in serializing and deserializing XML messages,
|
||||||
|
|
||||||
2.00_21 - not released
|
2.00_21 - not released
|
||||||
----
|
----
|
||||||
The following bugs have been fixed (the numbers in square brackets are the
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
|
||||||
* [ 1810058 ] .tt's pod indexed on CPAN (again)
|
* [ 1810058 ] .tt's pod indexed on CPAN (again)
|
||||||
* [ 1809284 ] Rename SOAP::WSDL::Deserializer::SOAP11 to ::XSD
|
* [ 1809284 ] Rename SOAP::WSDL::Deserializer::SOAP11 to ::XSD
|
||||||
|
|
||||||
The following uncategorized improvements have been made:
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
* Requires at least perl 5.8.0. This is due to a bug in perls before -
|
* Requires at least perl 5.8.0. This is due to a bug in perls before -
|
||||||
see http://aspn.activestate.com/ASPN/Mail/Message/perl5-porters/929746
|
see http://aspn.activestate.com/ASPN/Mail/Message/perl5-porters/929746
|
||||||
|
|
||||||
2.00_20
|
2.00_20
|
||||||
----
|
----
|
||||||
The following features were added (the numbers in square brackets are the
|
The following features were added (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||||
|
|
||||||
* [ 1815646 ] Only include last part of port name in interface
|
* [ 1815646 ] Only include last part of port name in interface
|
||||||
* [ 1815648 ] Methods with empty body cannot be called as ->method()
|
* [ 1815648 ] Methods with empty body cannot be called as ->method()
|
||||||
* [ 1815651 ] Empty complexType definitions not supported
|
* [ 1815651 ] Empty complexType definitions not supported
|
||||||
|
|
||||||
The following bugs have been fixed (the numbers in square brackets are the
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
|
||||||
* [ 1815643 ] ComplexTypes cannot be freezed/thawed
|
* [ 1815643 ] ComplexTypes cannot be freezed/thawed
|
||||||
|
|
||||||
The following uncategorized improvements have been made:
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
* WSDL definitions are decoded into utf8
|
* WSDL definitions are decoded into utf8
|
||||||
* fixed tests to use correct path on windows
|
* fixed tests to use correct path on windows
|
||||||
|
|
||||||
2.00_19
|
2.00_19
|
||||||
----
|
----
|
||||||
The following features were added (the numbers in square brackets are the
|
The following features were added (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||||
|
|
||||||
* [ 1810395 ] Implement complexType complexContent extension
|
* [ 1810395 ] Implement complexType complexContent extension
|
||||||
|
|
||||||
The following bugs have been fixed (the numbers in square brackets are the
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
|
||||||
* [ 1813144 ] Typemap not used in interface class
|
* [ 1813144 ] Typemap not used in interface class
|
||||||
* [ 1810058 ] .tt's pod indexed on CPAN
|
* [ 1810058 ] .tt's pod indexed on CPAN
|
||||||
|
|
||||||
The following uncategorized improvements have been made:
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
* Documentation improvements
|
* Documentation improvements
|
||||||
|
|
||||||
2.00_18
|
2.00_18
|
||||||
----
|
----
|
||||||
The following features were added (the numbers in square brackets are the
|
The following features were added (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||||
|
|
||||||
* [ 1790983 ] Create generator Plugin API
|
* [ 1790983 ] Create generator Plugin API
|
||||||
Generator factory is SOAP::WSDL::Factory::Generator
|
Generator factory is SOAP::WSDL::Factory::Generator
|
||||||
|
|
||||||
The following bugs have been fixed (the numbers in square brackets are the
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
|
||||||
* [ 1805252 ] t/SOAP/WSDL/XSD/Typelib/Builtin/004_time.t fails
|
* [ 1805252 ] t/SOAP/WSDL/XSD/Typelib/Builtin/004_time.t fails
|
||||||
The default timezone conversion has been fixed.
|
The default timezone conversion has been fixed.
|
||||||
|
|
||||||
The following uncategorized improvements have been made:
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
* Documentation improvements
|
* Documentation improvements
|
||||||
* Test updates
|
* Test updates
|
||||||
* readable() has been converted into a no-op, as it already had no effect
|
* readable() has been converted into a no-op, as it already had no effect
|
||||||
any more
|
any more
|
||||||
|
|
||||||
2.00_17
|
2.00_17
|
||||||
----
|
----
|
||||||
The following features were added (the numbers in square brackets are the
|
The following features were added (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||||
|
|
||||||
The following bugs have been fixed (the numbers in square brackets are the
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
|
||||||
* [ 1772617 ] SOAP Header not working
|
* [ 1772617 ] SOAP Header not working
|
||||||
Added header support. Currently, SOAP headers are only supported with
|
Added header support. Currently, SOAP headers are only supported with
|
||||||
the SOM or the XSD (SOAP11) serializer.
|
the SOM or the XSD (SOAP11) serializer.
|
||||||
|
|
||||||
* [ 1805238 ] Tests in t/SOAP/WSDL don't work when run from t/
|
* [ 1805238 ] Tests in t/SOAP/WSDL don't work when run from t/
|
||||||
|
|
||||||
* [ 1805241 ] explain() broken in SOAP::WSDL
|
* [ 1805241 ] explain() broken in SOAP::WSDL
|
||||||
explain has been removed from SOAP::WSDL
|
explain has been removed from SOAP::WSDL
|
||||||
|
|
||||||
The following uncategorized improvements have been made:
|
|
||||||
|
|
||||||
* Added limited support for complexType complexContent content model with
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
|
* Added limited support for complexType complexContent content model with
|
||||||
restriction variety.
|
restriction variety.
|
||||||
SOAP::WSDL now supports this XML Schema definition variant, although no
|
SOAP::WSDL now supports this XML Schema definition variant, although no
|
||||||
constraints are imposed on derived types yet.
|
constraints are imposed on derived types yet.
|
||||||
Derived types do not serialize with a xsi:type attribute (and the xsi:type
|
Derived types do not serialize with a xsi:type attribute (and the xsi:type
|
||||||
attribute is not recognized by the XML parser), so you cannot use derived
|
attribute is not recognized by the XML parser), so you cannot use derived
|
||||||
types as a substitute for theri parent, yet.
|
types as a substitute for theri parent, yet.
|
||||||
|
|
||||||
* Added support for complexType choice variety
|
* Added support for complexType choice variety
|
||||||
complexType definitions using the choice variety are now supported,
|
complexType definitions using the choice variety are now supported,
|
||||||
even though the content is not checked (if you pass in invalid data,
|
even though the content is not checked (if you pass in invalid data,
|
||||||
invalid XML will be generated).
|
invalid XML will be generated).
|
||||||
|
|
||||||
* Added Loopback Transport backend.
|
* Added Loopback Transport backend.
|
||||||
SOAP::WSDL::Tranport::Loopback just returns the request as respons, but
|
SOAP::WSDL::Tranport::Loopback just returns the request as respons, but
|
||||||
allows testing the whole chain from user interface to transport backend.
|
allows testing the whole chain from user interface to transport backend.
|
||||||
|
|
||||||
* Fixed SOAP::WSDL::Factory::Transport prefer user-registered
|
* Fixed SOAP::WSDL::Factory::Transport prefer user-registered
|
||||||
transport backend
|
transport backend
|
||||||
|
|
||||||
* Fixed set_soap_version method in SOAP::WSDL::Client.
|
* Fixed set_soap_version method in SOAP::WSDL::Client.
|
||||||
Re-setting the SOAP version now invalidates (resets) serializer and
|
Re-setting the SOAP version now invalidates (resets) serializer and
|
||||||
deserializer, but not the transport backend.
|
deserializer, but not the transport backend.
|
||||||
|
|
||||||
* Fixed SOAP::WSDL::XSD::Typelib::Builtin::boolean to return false
|
* Fixed SOAP::WSDL::XSD::Typelib::Builtin::boolean to return false
|
||||||
when false and true when true.
|
when false and true when true.
|
||||||
|
|
||||||
* SOAP::WSDL::XSD::Typelib::Builtin::normalizedString now replaces all
|
* SOAP::WSDL::XSD::Typelib::Builtin::normalizedString now replaces all
|
||||||
occurences of tab, newline and carriage return by whitespce on set_value.
|
occurences of tab, newline and carriage return by whitespce on set_value.
|
||||||
|
|
||||||
* Code cleanup
|
* Code cleanup
|
||||||
o Lots of orphan methods now replaced by the SOAP::WSDL::Generator
|
o Lots of orphan methods now replaced by the SOAP::WSDL::Generator
|
||||||
hierarchy have been removed.
|
hierarchy have been removed.
|
||||||
o Unused (and unusable) readable option checking has been removed in
|
o Unused (and unusable) readable option checking has been removed in
|
||||||
SOAP::WSDL::Serializer::SOAP11.
|
SOAP::WSDL::Serializer::SOAP11.
|
||||||
o Unused XML Schema facet attributes have been removed from XSD Builtin
|
o Unused XML Schema facet attributes have been removed from XSD Builtin
|
||||||
classes
|
classes
|
||||||
o Methods common to all expat parser classes have been factored out
|
o Methods common to all expat parser classes have been factored out
|
||||||
into a common base class.
|
into a common base class.
|
||||||
|
|
||||||
* XML serialization speedup for SOAP::WSDL::XSD::* objects
|
* XML serialization speedup for SOAP::WSDL::XSD::* objects
|
||||||
|
|
||||||
* Tests added to improve test coverage.
|
* Tests added to improve test coverage.
|
||||||
@@ -325,7 +438,7 @@ The following uncategorized improvements have been made:
|
|||||||
|
|
||||||
2.00_16
|
2.00_16
|
||||||
----
|
----
|
||||||
The following features were added (the numbers in square brackets are the
|
The following features were added (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||||
|
|
||||||
* [ 1761532 ] Support embedded atomic types
|
* [ 1761532 ] Support embedded atomic types
|
||||||
@@ -341,11 +454,11 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
|||||||
* [ 1803330 ] Create one interface per port
|
* [ 1803330 ] Create one interface per port
|
||||||
SOAP::WSDL now creates one interface per port, not one per service.
|
SOAP::WSDL now creates one interface per port, not one per service.
|
||||||
|
|
||||||
The following bugs have been fixed (the numbers in square brackets are the
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
|
||||||
* [ 1804441 ] parts from binding not regarded in SOAP::WSDL
|
* [ 1804441 ] parts from binding not regarded in SOAP::WSDL
|
||||||
SOAP::WSDL (interpreter mode) now respects the body parts specified in the
|
SOAP::WSDL (interpreter mode) now respects the body parts specified in the
|
||||||
binding.
|
binding.
|
||||||
|
|
||||||
* [ 1803763 ] nonNegativeInteger misspelled in Schema::Builtin
|
* [ 1803763 ] nonNegativeInteger misspelled in Schema::Builtin
|
||||||
@@ -353,35 +466,35 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
|||||||
* [ 1793965 ] _expand() does not work on non-root-node ns declarations
|
* [ 1793965 ] _expand() does not work on non-root-node ns declarations
|
||||||
|
|
||||||
* [ 1792348 ] 006_client.t requires SOAP::Lite in 2.00_15
|
* [ 1792348 ] 006_client.t requires SOAP::Lite in 2.00_15
|
||||||
SOAP::WSDL no longer attempts to load SOAP::WSDL::Deserializer::SOM when
|
SOAP::WSDL no longer attempts to load SOAP::WSDL::Deserializer::SOM when
|
||||||
no_dispatch is set.
|
no_dispatch is set.
|
||||||
006_client.t now sets outputxml(1), to be really sure.
|
006_client.t now sets outputxml(1), to be really sure.
|
||||||
|
|
||||||
The following uncategorized improvements have been made:
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
* Code generator only generates interface for the first port in a service
|
* Code generator only generates interface for the first port in a service
|
||||||
The code generator now generates interfaces for all ports.
|
The code generator now generates interfaces for all ports.
|
||||||
Note: The naming scheme has changed. It is now
|
Note: The naming scheme has changed. It is now
|
||||||
InterfacePrefix::Service::Port
|
InterfacePrefix::Service::Port
|
||||||
|
|
||||||
* XML Parser speedup
|
* XML Parser speedup
|
||||||
The XML parser has received a little speedup.
|
The XML parser has received a little speedup.
|
||||||
|
|
||||||
* A number of errors in parsing / traversing WSDL documents have been
|
* A number of errors in parsing / traversing WSDL documents have been
|
||||||
corrected.
|
corrected.
|
||||||
|
|
||||||
* Documentation has been improved
|
* Documentation has been improved
|
||||||
|
|
||||||
* A number of (incorrect, but passing) tests have been fixed.
|
* A number of (incorrect, but passing) tests have been fixed.
|
||||||
|
|
||||||
* Code cleanup: The SOAP::WSDL::SAX* modules are no longer included, as they
|
* Code cleanup: The SOAP::WSDL::SAX* modules are no longer included, as they
|
||||||
are not supported any more. They can still be found in SOAP::WSDL's
|
are not supported any more. They can still be found in SOAP::WSDL's
|
||||||
subversion repository in the attic directory, though.
|
subversion repository in the attic directory, though.
|
||||||
|
|
||||||
2.00_15
|
2.00_15
|
||||||
----
|
----
|
||||||
|
|
||||||
The following bugs have been fixed (the numbers in square brackets are the
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
|
||||||
* [ 1792321 ] 2.00_14 requires SOAP::Lite for passing tests
|
* [ 1792321 ] 2.00_14 requires SOAP::Lite for passing tests
|
||||||
@@ -389,7 +502,7 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
|||||||
2.00_14
|
2.00_14
|
||||||
----
|
----
|
||||||
|
|
||||||
The following bugs have been fixed (the numbers in square brackets are the
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
|
||||||
* [ 1792235 ] SOAP::WSDL::Transport::Test missing from 2.00_13
|
* [ 1792235 ] SOAP::WSDL::Transport::Test missing from 2.00_13
|
||||||
@@ -400,7 +513,7 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
|||||||
|
|
||||||
The following uncategorized improvements have been made:
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
* The ::SOM deserializer has been simplified to be just a subclass
|
* The ::SOM deserializer has been simplified to be just a subclass
|
||||||
of SOAP::Deserializer from SOAP::Lite
|
of SOAP::Deserializer from SOAP::Lite
|
||||||
* Factories now emit more useful error messages when no class is registered
|
* Factories now emit more useful error messages when no class is registered
|
||||||
for the protocol/soap_version requested
|
for the protocol/soap_version requested
|
||||||
@@ -411,36 +524,36 @@ The following uncategorized improvements have been made:
|
|||||||
|
|
||||||
2.00_13
|
2.00_13
|
||||||
----
|
----
|
||||||
The following features were added (the numbers in square brackets are the
|
The following features were added (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||||
|
|
||||||
* [ 1790619 ] Test transport backend
|
* [ 1790619 ] Test transport backend
|
||||||
A test transport backend has been implemented (SOAP::WSDL::Transport::Test).
|
A test transport backend has been implemented (SOAP::WSDL::Transport::Test).
|
||||||
It returns the contents from a file and discards the response.
|
It returns the contents from a file and discards the response.
|
||||||
The filename is determined from the soap_action field.
|
The filename is determined from the soap_action field.
|
||||||
|
|
||||||
* [ 1785196 ] Replace outputsom(1) by deserializer plugin
|
* [ 1785196 ] Replace outputsom(1) by deserializer plugin
|
||||||
outputsom(1) in SOAP::WSDL is now implemented via using the deserializer
|
outputsom(1) in SOAP::WSDL is now implemented via using the deserializer
|
||||||
plugin SOAP::WSDL::Deserializer::SOM.
|
plugin SOAP::WSDL::Deserializer::SOM.
|
||||||
|
|
||||||
* [1785195] Support deserializer plugins
|
* [1785195] Support deserializer plugins
|
||||||
Deserializer plugin API added via SOAP::WSDL::Factory::Deserializer.
|
Deserializer plugin API added via SOAP::WSDL::Factory::Deserializer.
|
||||||
|
|
||||||
The following bugs have been fixed (the numbers in square brackets are the
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
|
||||||
* [1789581] Support ComplexType mixed
|
* [1789581] Support ComplexType mixed
|
||||||
WSDL parser now supports using the mixed="true" attribute in complexType
|
WSDL parser now supports using the mixed="true" attribute in complexType
|
||||||
definitions. Mixed content in messages is only supported via SOAP::SOM yet.
|
definitions. Mixed content in messages is only supported via SOAP::SOM yet.
|
||||||
|
|
||||||
* [1787975] 016_client_object.t fails due to testing XML as string
|
* [1787975] 016_client_object.t fails due to testing XML as string
|
||||||
Removed string test.
|
Removed string test.
|
||||||
|
|
||||||
* [1787959] Test wsdl seems to be broken
|
* [1787959] Test wsdl seems to be broken
|
||||||
Corrected typo.
|
Corrected typo.
|
||||||
|
|
||||||
* [1787955] ::XSD::Typelib::date is broken
|
* [1787955] ::XSD::Typelib::date is broken
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::date now converts time-zoned dates properly,
|
SOAP::WSDL::XSD::Typelib::Builtin::date now converts time-zoned dates properly,
|
||||||
and adds the local time zone if none is given.
|
and adds the local time zone if none is given.
|
||||||
|
|
||||||
* [1785646] SOAPAction header not set from soap:operation soapAction
|
* [1785646] SOAPAction header not set from soap:operation soapAction
|
||||||
@@ -452,55 +565,55 @@ The following uncategorized improvements have been made:
|
|||||||
|
|
||||||
2.00_12
|
2.00_12
|
||||||
----
|
----
|
||||||
|
|
||||||
The following bugs have been fixed (the numbers in square brackets are the
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
|
||||||
* [1787146] SOAP::WSDL still uses XML::LibXML
|
* [1787146] SOAP::WSDL still uses XML::LibXML
|
||||||
The superficious usage of XML::LibXML has been removed. XML::LibXML with
|
The superficious usage of XML::LibXML has been removed. XML::LibXML with
|
||||||
sax filter has been replaced by SOAP::WSDL::Expat::WSDLParser.
|
sax filter has been replaced by SOAP::WSDL::Expat::WSDLParser.
|
||||||
|
|
||||||
* [1787054] Test suite requires XML::LibXML in 2.00_11
|
* [1787054] Test suite requires XML::LibXML in 2.00_11
|
||||||
The test suite no longer requires XML::LibXML to pass.
|
The test suite no longer requires XML::LibXML to pass.
|
||||||
|
|
||||||
* [1785678] SOAP envelope not checked for namespace
|
* [1785678] SOAP envelope not checked for namespace
|
||||||
The SOAP envelope is now checked for the correct namespace.
|
The SOAP envelope is now checked for the correct namespace.
|
||||||
|
|
||||||
* [1786644] SOAP::WSDL::Manual - doc error
|
* [1786644] SOAP::WSDL::Manual - doc error
|
||||||
Documentation improvements
|
Documentation improvements
|
||||||
|
|
||||||
The following uncategorized improvements have been made
|
The following uncategorized improvements have been made
|
||||||
|
|
||||||
* The SOAPAction header is now alway quoted (R1109 in WS-I BP 1.0).
|
* The SOAPAction header is now alway quoted (R1109 in WS-I BP 1.0).
|
||||||
|
|
||||||
2.00_11
|
2.00_11
|
||||||
----
|
----
|
||||||
|
|
||||||
The following features were added (the numbers in square brackets are the
|
The following features were added (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||||
|
|
||||||
* [1767963] Transport plugins via SOAP::WSDL::Factory::Transport.
|
* [1767963] Transport plugins via SOAP::WSDL::Factory::Transport.
|
||||||
SOAP::WSDL uses SOAP::Lite's tranport modules as default, with a
|
SOAP::WSDL uses SOAP::Lite's tranport modules as default, with a
|
||||||
lightweight HTTP(S) transport plugin as fallback.
|
lightweight HTTP(S) transport plugin as fallback.
|
||||||
Custom transport modules can be registered via SOAP::WSDL::Factory::Transport.
|
Custom transport modules can be registered via SOAP::WSDL::Factory::Transport.
|
||||||
|
|
||||||
* [ 1772730 ] Serializer plugins via SOAP::WSDL::Factory::Serializer
|
* [ 1772730 ] Serializer plugins via SOAP::WSDL::Factory::Serializer
|
||||||
The default serializer for SOAP1.1 is SOAP::WSDL::Serializer::SOAP11.
|
The default serializer for SOAP1.1 is SOAP::WSDL::Serializer::SOAP11.
|
||||||
Custom serializers classes can be registered via
|
Custom serializers classes can be registered via
|
||||||
SOAP::WSDL::Factory::Serializer or set via SOAP::WSDL's set_serializer
|
SOAP::WSDL::Factory::Serializer or set via SOAP::WSDL's set_serializer
|
||||||
method.
|
method.
|
||||||
|
|
||||||
The following bugs have been fixed (the numbers in square brackets are the
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
|
||||||
* [ 1764854 ] Port WSDL parser to expat and remove XML::LibXML dependency
|
* [ 1764854 ] Port WSDL parser to expat and remove XML::LibXML dependency
|
||||||
SOAP::WSDL now requires only XML::Parser to be installed.
|
SOAP::WSDL now requires only XML::Parser to be installed.
|
||||||
XML::LibXML is not required any more, though XML::LibXML based modules still
|
XML::LibXML is not required any more, though XML::LibXML based modules still
|
||||||
exist.
|
exist.
|
||||||
|
|
||||||
The following uncategorized improvements have been made
|
The following uncategorized improvements have been made
|
||||||
|
|
||||||
* The number of dependencies has been reduced. SOAP::WSDL no longer requires the
|
* The number of dependencies has been reduced. SOAP::WSDL no longer requires the
|
||||||
following modules to be installed:
|
following modules to be installed:
|
||||||
- XML::SAX::Base
|
- XML::SAX::Base
|
||||||
- XML::SAX::ParserFactory
|
- XML::SAX::ParserFactory
|
||||||
@@ -519,27 +632,27 @@ The following uncategorized improvements have been made
|
|||||||
|
|
||||||
2.00_09
|
2.00_09
|
||||||
----
|
----
|
||||||
* SOAP::WSDL::XSD::Typelib::Builtin::boolean objects now return their numerical
|
* SOAP::WSDL::XSD::Typelib::Builtin::boolean objects now return their numerical
|
||||||
value in bool context, not "true" or "false" (always true...)
|
value in bool context, not "true" or "false" (always true...)
|
||||||
* date/time test are now timezone-sensitive
|
* date/time test are now timezone-sensitive
|
||||||
* examples added
|
* examples added
|
||||||
|
|
||||||
2.00_08
|
2.00_08
|
||||||
---
|
---
|
||||||
* SOAP::WSDL::XSD::Typelib::ComplexType objects now check the class of their
|
* SOAP::WSDL::XSD::Typelib::ComplexType objects now check the class of their
|
||||||
child objects.
|
child objects.
|
||||||
This provides early feedback to developers.
|
This provides early feedback to developers.
|
||||||
* SOAP message parser can skip unwanted parts of the message to improve parsing
|
* SOAP message parser can skip unwanted parts of the message to improve parsing
|
||||||
speed - see SOAP::WSDL::Expat::MessageParser for details.
|
speed - see SOAP::WSDL::Expat::MessageParser for details.
|
||||||
* HTTP Content-Type is configurable
|
* HTTP Content-Type is configurable
|
||||||
* SOAP::WSDL::XSD::Typelib::ComplexType based objects accept any combination of
|
* SOAP::WSDL::XSD::Typelib::ComplexType based objects accept any combination of
|
||||||
hash refs, list refs and objects as parameter to set_value() and new().
|
hash refs, list refs and objects as parameter to set_value() and new().
|
||||||
* SOAP::WSDL::XSD::Typelib::Builtin::dateTime and ::date convert date
|
* SOAP::WSDL::XSD::Typelib::Builtin::dateTime and ::date convert date
|
||||||
strings into XML date strings
|
strings into XML date strings
|
||||||
* SOAP::WSDL::Definitions::create now
|
* SOAP::WSDL::Definitions::create now
|
||||||
- converts '.' in service names to '::' (.NET class separator to perl class
|
- converts '.' in service names to '::' (.NET class separator to perl class
|
||||||
separator)
|
separator)
|
||||||
- outputs Typemaps and Interface classes in UTF8 to allow proper inclusion
|
- outputs Typemaps and Interface classes in UTF8 to allow proper inclusion
|
||||||
of UTF8 documentation from WSDL
|
of UTF8 documentation from WSDL
|
||||||
* SOAP::WSDL::Definitions::create() includes doc in generated interface classes
|
* SOAP::WSDL::Definitions::create() includes doc in generated interface classes
|
||||||
* WSDLHandler now handles <wsdl:documentation> tags
|
* WSDLHandler now handles <wsdl:documentation> tags
|
||||||
@@ -550,7 +663,7 @@ The following uncategorized improvements have been made
|
|||||||
* Implemented a Code generator for creating SOAP interfaces based on WSDL definitions
|
* Implemented a Code generator for creating SOAP interfaces based on WSDL definitions
|
||||||
* Implemented a high-speed stream based SOAP message parser
|
* Implemented a high-speed stream based SOAP message parser
|
||||||
SOAP message parser returns a objects based on XML schema based class library
|
SOAP message parser returns a objects based on XML schema based class library
|
||||||
* Implemented a XML schema based class library
|
* Implemented a XML schema based class library
|
||||||
* Implemented a stream based WSDL parser.
|
* Implemented a stream based WSDL parser.
|
||||||
Parses WSDL into objects. Objects can serialize data, and explain how to use the
|
Parses WSDL into objects. Objects can serialize data, and explain how to use the
|
||||||
service(s) they make up (output documentation).
|
service(s) they make up (output documentation).
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ benchmark/01_expat.t
|
|||||||
benchmark/hello.pl
|
benchmark/hello.pl
|
||||||
benchmark/person.pl
|
benchmark/person.pl
|
||||||
benchmark/person.xml
|
benchmark/person.xml
|
||||||
|
benchmark/person_profile.pl
|
||||||
|
benchmark/person_single.pl
|
||||||
benchmark/XSD/01_anyType.t
|
benchmark/XSD/01_anyType.t
|
||||||
benchmark/XSD/02_anySimpleType.t
|
benchmark/XSD/02_anySimpleType.t
|
||||||
benchmark/XSD/03_string.t
|
benchmark/XSD/03_string.t
|
||||||
@@ -91,23 +93,37 @@ lib/SOAP/WSDL/Factory/Deserializer.pm
|
|||||||
lib/SOAP/WSDL/Factory/Generator.pm
|
lib/SOAP/WSDL/Factory/Generator.pm
|
||||||
lib/SOAP/WSDL/Factory/Serializer.pm
|
lib/SOAP/WSDL/Factory/Serializer.pm
|
||||||
lib/SOAP/WSDL/Factory/Transport.pm
|
lib/SOAP/WSDL/Factory/Transport.pm
|
||||||
|
lib/SOAP/WSDL/Generator/Iterator/WSDL11.pm
|
||||||
|
lib/SOAP/WSDL/Generator/PrefixResolver.pm
|
||||||
lib/SOAP/WSDL/Generator/Template.pm
|
lib/SOAP/WSDL/Generator/Template.pm
|
||||||
|
lib/SOAP/WSDL/Generator/Template/Plugin/XSD.pm
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD.pm
|
lib/SOAP/WSDL/Generator/Template/XSD.pm
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/_type_class.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/attribute.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/atomicTypes.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/atomicTypes.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/attributeSet.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/contentModel.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/contentModel.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/all.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/choice.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/complexContent.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/complexContent.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/content_model.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/restriction.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/restriction.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/simpleContent.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/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.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/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/complexType/variety.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/element.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/element.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/element/POD/contentModel.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/element/POD/structure.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.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/Interface/Body.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/Interface/Body.tt
|
||||||
@@ -119,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/Operation.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Part.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Part.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Type.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Type.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/POD/annotation.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/Server.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/Message.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/Server/POD/method_info.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/Server/POD/method_info.tt
|
||||||
@@ -128,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/atomicType.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/contentModel.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/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/list.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/restriction.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/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/restriction.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/union.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/Typemap.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/Typemap.tt
|
||||||
lib/SOAP/WSDL/Generator/Visitor.pm
|
lib/SOAP/WSDL/Generator/Visitor.pm
|
||||||
lib/SOAP/WSDL/Generator/Visitor/Typelib.pm
|
lib/SOAP/WSDL/Generator/Visitor/Typelib.pm
|
||||||
@@ -164,12 +184,29 @@ lib/SOAP/WSDL/Transport/Loopback.pm
|
|||||||
lib/SOAP/WSDL/Transport/Test.pm
|
lib/SOAP/WSDL/Transport/Test.pm
|
||||||
lib/SOAP/WSDL/TypeLookup.pm
|
lib/SOAP/WSDL/TypeLookup.pm
|
||||||
lib/SOAP/WSDL/Types.pm
|
lib/SOAP/WSDL/Types.pm
|
||||||
|
lib/SOAP/WSDL/XSD/Annotation.pm
|
||||||
|
lib/SOAP/WSDL/XSD/Attribute.pm
|
||||||
|
lib/SOAP/WSDL/XSD/AttributeGroup.pm
|
||||||
lib/SOAP/WSDL/XSD/Builtin.pm
|
lib/SOAP/WSDL/XSD/Builtin.pm
|
||||||
lib/SOAP/WSDL/XSD/ComplexType.pm
|
lib/SOAP/WSDL/XSD/ComplexType.pm
|
||||||
lib/SOAP/WSDL/XSD/Element.pm
|
lib/SOAP/WSDL/XSD/Element.pm
|
||||||
|
lib/SOAP/WSDL/XSD/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.pm
|
||||||
lib/SOAP/WSDL/XSD/Schema/Builtin.pm
|
lib/SOAP/WSDL/XSD/Schema/Builtin.pm
|
||||||
lib/SOAP/WSDL/XSD/SimpleType.pm
|
lib/SOAP/WSDL/XSD/SimpleType.pm
|
||||||
|
lib/SOAP/WSDL/XSD/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.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
|
||||||
@@ -220,12 +257,14 @@ lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
|
|||||||
lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
|
lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Element.pm
|
lib/SOAP/WSDL/XSD/Typelib/Element.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
||||||
|
lib/SOAP/WSDL/XSD/WhiteSpace.pm
|
||||||
LICENSE
|
LICENSE
|
||||||
Makefile.PL
|
Makefile.PL
|
||||||
MANIFEST This list of files
|
MANIFEST This list of files
|
||||||
META.yml
|
META.yml
|
||||||
MIGRATING
|
MIGRATING
|
||||||
README
|
README
|
||||||
|
SOAP-WSDL-2.00_32.tar
|
||||||
t/001_use.t
|
t/001_use.t
|
||||||
t/002_parse_wsdl.t
|
t/002_parse_wsdl.t
|
||||||
t/003_wsdl_based_serializer.t
|
t/003_wsdl_based_serializer.t
|
||||||
@@ -240,6 +279,7 @@ t/013_complexType.t
|
|||||||
t/016_client_object.t
|
t/016_client_object.t
|
||||||
t/017_generator.t
|
t/017_generator.t
|
||||||
t/020_storable.t
|
t/020_storable.t
|
||||||
|
t/095_copying.t
|
||||||
t/096_characters.t
|
t/096_characters.t
|
||||||
t/097_kwalitee.t
|
t/097_kwalitee.t
|
||||||
t/098_pod.t
|
t/098_pod.t
|
||||||
@@ -267,20 +307,31 @@ t/acceptance/wsdl/10_helloworld.asmx.xml
|
|||||||
t/acceptance/wsdl/11_helloworld.wsdl
|
t/acceptance/wsdl/11_helloworld.wsdl
|
||||||
t/acceptance/wsdl/contributed/Axis.wsdl
|
t/acceptance/wsdl/contributed/Axis.wsdl
|
||||||
t/acceptance/wsdl/contributed/ETest.wsdl
|
t/acceptance/wsdl/contributed/ETest.wsdl
|
||||||
|
t/acceptance/wsdl/contributed/gasquery.wsdl
|
||||||
t/acceptance/wsdl/contributed/OITest.wsdl
|
t/acceptance/wsdl/contributed/OITest.wsdl
|
||||||
t/acceptance/wsdl/contributed/tools.wsdl
|
t/acceptance/wsdl/contributed/tools.wsdl
|
||||||
t/acceptance/wsdl/elementAtomicComplexType.xml
|
t/acceptance/wsdl/elementAtomicComplexType.xml
|
||||||
t/acceptance/wsdl/email_account.wsdl
|
t/acceptance/wsdl/email_account.wsdl
|
||||||
t/acceptance/wsdl/generator_test.wsdl
|
t/acceptance/wsdl/generator_test.wsdl
|
||||||
|
t/acceptance/wsdl/generator_test_dot_names.wsdl
|
||||||
t/acceptance/wsdl/generator_unsupported_test.wsdl
|
t/acceptance/wsdl/generator_unsupported_test.wsdl
|
||||||
|
t/acceptance/wsdl/import.xsd
|
||||||
|
t/acceptance/wsdl/import_loop.xsd
|
||||||
t/acceptance/wsdl/message_gateway.wsdl
|
t/acceptance/wsdl/message_gateway.wsdl
|
||||||
|
t/acceptance/wsdl/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/contributed.wsdl
|
||||||
t/Expat/01_expat.t
|
|
||||||
t/Expat/03_wsdl.t
|
t/Expat/03_wsdl.t
|
||||||
t/lib/MyComplexType.pm
|
t/lib/MyComplexType.pm
|
||||||
t/lib/MyElement.pm
|
t/lib/MyElement.pm
|
||||||
t/lib/MySimpleType.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/Base.pm
|
||||||
t/lib/Typelib/TEnqueueMessage.pm
|
t/lib/Typelib/TEnqueueMessage.pm
|
||||||
t/lib/Typelib/TMessage.pm
|
t/lib/Typelib/TMessage.pm
|
||||||
@@ -303,21 +354,28 @@ t/SOAP/WSDL/05_simpleType-union.t
|
|||||||
t/SOAP/WSDL/06_keep_alive.t
|
t/SOAP/WSDL/06_keep_alive.t
|
||||||
t/SOAP/WSDL/11_helloworld.NET.t
|
t/SOAP/WSDL/11_helloworld.NET.t
|
||||||
t/SOAP/WSDL/12_binding.t
|
t/SOAP/WSDL/12_binding.t
|
||||||
|
t/SOAP/WSDL/Client.t
|
||||||
t/SOAP/WSDL/Client/Base.t
|
t/SOAP/WSDL/Client/Base.t
|
||||||
|
t/SOAP/WSDL/Definitions.t
|
||||||
t/SOAP/WSDL/Deserializer/Hash.t
|
t/SOAP/WSDL/Deserializer/Hash.t
|
||||||
t/SOAP/WSDL/Deserializer/SOM.t
|
t/SOAP/WSDL/Deserializer/SOM.t
|
||||||
t/SOAP/WSDL/Deserializer/XSD.t
|
t/SOAP/WSDL/Deserializer/XSD.t
|
||||||
t/SOAP/WSDL/Expat/Base.t
|
t/SOAP/WSDL/Expat/Base.t
|
||||||
|
t/SOAP/WSDL/Expat/MessageParser.t
|
||||||
|
t/SOAP/WSDL/Expat/WSDLParser.t
|
||||||
t/SOAP/WSDL/Factory/Deserializer.t
|
t/SOAP/WSDL/Factory/Deserializer.t
|
||||||
t/SOAP/WSDL/Factory/Serializer.t
|
t/SOAP/WSDL/Factory/Serializer.t
|
||||||
t/SOAP/WSDL/Factory/Transport.t
|
t/SOAP/WSDL/Factory/Transport.t
|
||||||
|
t/SOAP/WSDL/Generator/attr.pl
|
||||||
t/SOAP/WSDL/Generator/Template.t
|
t/SOAP/WSDL/Generator/Template.t
|
||||||
t/SOAP/WSDL/Generator/Visitor.t
|
t/SOAP/WSDL/Generator/Visitor.t
|
||||||
t/SOAP/WSDL/Generator/Visitor/Typemap.t
|
t/SOAP/WSDL/Generator/Visitor/Typemap.t
|
||||||
t/SOAP/WSDL/Generator/XCS.t
|
|
||||||
t/SOAP/WSDL/Generator/XSD.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/Generator/XSD_unsupported.t
|
||||||
t/SOAP/WSDL/Part.t
|
t/SOAP/WSDL/Part.t
|
||||||
|
t/SOAP/WSDL/PortType.t
|
||||||
t/SOAP/WSDL/Serializer/XSD.t
|
t/SOAP/WSDL/Serializer/XSD.t
|
||||||
t/SOAP/WSDL/Server.t
|
t/SOAP/WSDL/Server.t
|
||||||
t/SOAP/WSDL/Server/CGI.t
|
t/SOAP/WSDL/Server/CGI.t
|
||||||
@@ -326,9 +384,16 @@ t/SOAP/WSDL/Transport/02_HTTP.t
|
|||||||
t/SOAP/WSDL/Transport/acceptance/test2.xml
|
t/SOAP/WSDL/Transport/acceptance/test2.xml
|
||||||
t/SOAP/WSDL/Transport/acceptance/test3.xml
|
t/SOAP/WSDL/Transport/acceptance/test3.xml
|
||||||
t/SOAP/WSDL/Typelib/Fault11.t
|
t/SOAP/WSDL/Typelib/Fault11.t
|
||||||
|
t/SOAP/WSDL/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/ComplexType.t
|
||||||
t/SOAP/WSDL/XSD/Element.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/SimpleType.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Attribute.t
|
||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/01_constructors.t
|
t/SOAP/WSDL/XSD/Typelib/Builtin/01_constructors.t
|
||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.t
|
t/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.t
|
||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/anyType.t
|
t/SOAP/WSDL/XSD/Typelib/Builtin/anyType.t
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: SOAP-WSDL
|
name: SOAP-WSDL
|
||||||
version: 2.00_28
|
version: 2.00_33
|
||||||
author:
|
author:
|
||||||
- 'Martin Kutter <martin.kutter@fen-net.de>'
|
- 'Martin Kutter <martin.kutter@fen-net.de>'
|
||||||
abstract: SOAP with WSDL support
|
abstract: SOAP with WSDL support
|
||||||
@@ -8,13 +8,7 @@ license: artistic
|
|||||||
resources:
|
resources:
|
||||||
license: http://opensource.org/licenses/artistic-license.php
|
license: http://opensource.org/licenses/artistic-license.php
|
||||||
requires:
|
requires:
|
||||||
Class::Std::Fast: !!perl/hash:version
|
Class::Std::Fast: 0.0.5
|
||||||
original: v0.0.5
|
|
||||||
qv: 1
|
|
||||||
version:
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 5
|
|
||||||
Data::Dumper: 0
|
Data::Dumper: 0
|
||||||
Date::Format: 0
|
Date::Format: 0
|
||||||
Date::Parse: 0
|
Date::Parse: 0
|
||||||
@@ -25,12 +19,29 @@ requires:
|
|||||||
List::Util: 0
|
List::Util: 0
|
||||||
Template: 0
|
Template: 0
|
||||||
Term::ReadKey: 0
|
Term::ReadKey: 0
|
||||||
|
URI: 0
|
||||||
XML::Parser::Expat: 0
|
XML::Parser::Expat: 0
|
||||||
perl: 5.8.0
|
perl: 5.8.0
|
||||||
|
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:
|
provides:
|
||||||
SOAP::WSDL:
|
SOAP::WSDL:
|
||||||
file: lib/SOAP/WSDL.pm
|
file: lib/SOAP/WSDL.pm
|
||||||
version: 2.00_25
|
version: 2.00_33
|
||||||
SOAP::WSDL::Base:
|
SOAP::WSDL::Base:
|
||||||
file: lib/SOAP/WSDL/Base.pm
|
file: lib/SOAP/WSDL/Base.pm
|
||||||
version: 2.00_27
|
version: 2.00_27
|
||||||
@@ -41,10 +52,10 @@ provides:
|
|||||||
version: 2.00_27
|
version: 2.00_27
|
||||||
SOAP::WSDL::Client::Base:
|
SOAP::WSDL::Client::Base:
|
||||||
file: lib/SOAP/WSDL/Client/Base.pm
|
file: lib/SOAP/WSDL/Client/Base.pm
|
||||||
version: 2.00_25
|
version: 2.00_33
|
||||||
SOAP::WSDL::Definitions:
|
SOAP::WSDL::Definitions:
|
||||||
file: lib/SOAP/WSDL/Definitions.pm
|
file: lib/SOAP/WSDL/Definitions.pm
|
||||||
version: 2.00_27
|
version: 2.00_33
|
||||||
SOAP::WSDL::Deserializer::Hash:
|
SOAP::WSDL::Deserializer::Hash:
|
||||||
file: lib/SOAP/WSDL/Deserializer/Hash.pm
|
file: lib/SOAP/WSDL/Deserializer/Hash.pm
|
||||||
version: 2.00_25
|
version: 2.00_25
|
||||||
@@ -56,7 +67,7 @@ provides:
|
|||||||
version: 2.00_25
|
version: 2.00_25
|
||||||
SOAP::WSDL::Expat::Base:
|
SOAP::WSDL::Expat::Base:
|
||||||
file: lib/SOAP/WSDL/Expat/Base.pm
|
file: lib/SOAP/WSDL/Expat/Base.pm
|
||||||
version: 2.00_27
|
version: 2.00_32
|
||||||
SOAP::WSDL::Expat::Message2Hash:
|
SOAP::WSDL::Expat::Message2Hash:
|
||||||
file: lib/SOAP/WSDL/Expat/Message2Hash.pm
|
file: lib/SOAP/WSDL/Expat/Message2Hash.pm
|
||||||
version: 2.00_27
|
version: 2.00_27
|
||||||
@@ -77,10 +88,16 @@ provides:
|
|||||||
version: 2.00_24
|
version: 2.00_24
|
||||||
SOAP::WSDL::Factory::Transport:
|
SOAP::WSDL::Factory::Transport:
|
||||||
file: lib/SOAP/WSDL/Factory/Transport.pm
|
file: lib/SOAP/WSDL/Factory/Transport.pm
|
||||||
version: 2.00_25
|
version: 2.00_33
|
||||||
|
SOAP::WSDL::Generator::Iterator::WSDL11:
|
||||||
|
file: lib/SOAP/WSDL/Generator/Iterator/WSDL11.pm
|
||||||
|
SOAP::WSDL::Generator::PrefixResolver:
|
||||||
|
file: lib/SOAP/WSDL/Generator/PrefixResolver.pm
|
||||||
SOAP::WSDL::Generator::Template:
|
SOAP::WSDL::Generator::Template:
|
||||||
file: lib/SOAP/WSDL/Generator/Template.pm
|
file: lib/SOAP/WSDL/Generator/Template.pm
|
||||||
version: 2.00_25
|
version: v2.0033
|
||||||
|
SOAP::WSDL::Generator::Template::Plugin::XSD:
|
||||||
|
file: lib/SOAP/WSDL/Generator/Template/Plugin/XSD.pm
|
||||||
SOAP::WSDL::Generator::Template::XSD:
|
SOAP::WSDL::Generator::Template::XSD:
|
||||||
file: lib/SOAP/WSDL/Generator/Template/XSD.pm
|
file: lib/SOAP/WSDL/Generator/Template/XSD.pm
|
||||||
version: 2.00_27
|
version: 2.00_27
|
||||||
@@ -126,7 +143,7 @@ provides:
|
|||||||
version: 2.00_27
|
version: 2.00_27
|
||||||
SOAP::WSDL::Server::CGI:
|
SOAP::WSDL::Server::CGI:
|
||||||
file: lib/SOAP/WSDL/Server/CGI.pm
|
file: lib/SOAP/WSDL/Server/CGI.pm
|
||||||
version: 2.00_27
|
version: 2.00_33
|
||||||
SOAP::WSDL::Service:
|
SOAP::WSDL::Service:
|
||||||
file: lib/SOAP/WSDL/Service.pm
|
file: lib/SOAP/WSDL/Service.pm
|
||||||
SOAP::WSDL::Transport::HTTP:
|
SOAP::WSDL::Transport::HTTP:
|
||||||
@@ -139,24 +156,73 @@ provides:
|
|||||||
version: 2.00_25
|
version: 2.00_25
|
||||||
SOAP::WSDL::TypeLookup:
|
SOAP::WSDL::TypeLookup:
|
||||||
file: lib/SOAP/WSDL/TypeLookup.pm
|
file: lib/SOAP/WSDL/TypeLookup.pm
|
||||||
|
version: 2.00_31
|
||||||
SOAP::WSDL::Types:
|
SOAP::WSDL::Types:
|
||||||
file: lib/SOAP/WSDL/Types.pm
|
file: lib/SOAP/WSDL/Types.pm
|
||||||
|
SOAP::WSDL::XSD::Annotation:
|
||||||
|
file: lib/SOAP/WSDL/XSD/Annotation.pm
|
||||||
|
version: 2.00_33
|
||||||
|
SOAP::WSDL::XSD::Attribute:
|
||||||
|
file: lib/SOAP/WSDL/XSD/Attribute.pm
|
||||||
|
version: 2.00_29
|
||||||
|
SOAP::WSDL::XSD::AttributeGroup:
|
||||||
|
file: lib/SOAP/WSDL/XSD/AttributeGroup.pm
|
||||||
|
version: 2.00_29
|
||||||
SOAP::WSDL::XSD::Builtin:
|
SOAP::WSDL::XSD::Builtin:
|
||||||
file: lib/SOAP/WSDL/XSD/Builtin.pm
|
file: lib/SOAP/WSDL/XSD/Builtin.pm
|
||||||
SOAP::WSDL::XSD::ComplexType:
|
SOAP::WSDL::XSD::ComplexType:
|
||||||
file: lib/SOAP/WSDL/XSD/ComplexType.pm
|
file: lib/SOAP/WSDL/XSD/ComplexType.pm
|
||||||
version: 2.00_25
|
version: 2.00_33
|
||||||
SOAP::WSDL::XSD::Element:
|
SOAP::WSDL::XSD::Element:
|
||||||
file: lib/SOAP/WSDL/XSD/Element.pm
|
file: lib/SOAP/WSDL/XSD/Element.pm
|
||||||
version: 2.00_25
|
version: 2.00_25
|
||||||
|
SOAP::WSDL::XSD::Enumeration:
|
||||||
|
file: lib/SOAP/WSDL/XSD/Enumeration.pm
|
||||||
|
version: 2.00_33
|
||||||
|
SOAP::WSDL::XSD::Group:
|
||||||
|
file: lib/SOAP/WSDL/XSD/Group.pm
|
||||||
|
version: 2.00_33
|
||||||
|
SOAP::WSDL::XSD::Length:
|
||||||
|
file: lib/SOAP/WSDL/XSD/Length.pm
|
||||||
|
version: 2.00_33
|
||||||
|
SOAP::WSDL::XSD::MaxExclusive:
|
||||||
|
file: lib/SOAP/WSDL/XSD/MaxExclusive.pm
|
||||||
|
version: 2.00_33
|
||||||
|
SOAP::WSDL::XSD::MaxInclusive:
|
||||||
|
file: lib/SOAP/WSDL/XSD/MaxInclusive.pm
|
||||||
|
version: 2.00_33
|
||||||
|
SOAP::WSDL::XSD::MaxLength:
|
||||||
|
file: lib/SOAP/WSDL/XSD/MaxLength.pm
|
||||||
|
version: 2.00_33
|
||||||
|
SOAP::WSDL::XSD::MinExclusive:
|
||||||
|
file: lib/SOAP/WSDL/XSD/MinExclusive.pm
|
||||||
|
version: 2.00_33
|
||||||
|
SOAP::WSDL::XSD::MinInclusive:
|
||||||
|
file: lib/SOAP/WSDL/XSD/MinInclusive.pm
|
||||||
|
version: 2.00_33
|
||||||
|
SOAP::WSDL::XSD::MinLength:
|
||||||
|
file: lib/SOAP/WSDL/XSD/MinLength.pm
|
||||||
|
version: 2.00_33
|
||||||
|
SOAP::WSDL::XSD::Pattern:
|
||||||
|
file: lib/SOAP/WSDL/XSD/Pattern.pm
|
||||||
|
version: 2.00_33
|
||||||
SOAP::WSDL::XSD::Schema:
|
SOAP::WSDL::XSD::Schema:
|
||||||
file: lib/SOAP/WSDL/XSD/Schema.pm
|
file: lib/SOAP/WSDL/XSD/Schema.pm
|
||||||
version: 2.00_25
|
version: 2.00_33
|
||||||
SOAP::WSDL::XSD::Schema::Builtin:
|
SOAP::WSDL::XSD::Schema::Builtin:
|
||||||
file: lib/SOAP/WSDL/XSD/Schema/Builtin.pm
|
file: lib/SOAP/WSDL/XSD/Schema/Builtin.pm
|
||||||
SOAP::WSDL::XSD::SimpleType:
|
SOAP::WSDL::XSD::SimpleType:
|
||||||
file: lib/SOAP/WSDL/XSD/SimpleType.pm
|
file: lib/SOAP/WSDL/XSD/SimpleType.pm
|
||||||
version: 2.00_25
|
version: 2.00_25
|
||||||
|
SOAP::WSDL::XSD::TotalDigits:
|
||||||
|
file: lib/SOAP/WSDL/XSD/TotalDigits.pm
|
||||||
|
version: 2.00_33
|
||||||
|
SOAP::WSDL::XSD::Typelib::Attribute:
|
||||||
|
file: lib/SOAP/WSDL/XSD/Typelib/Attribute.pm
|
||||||
|
version: 2.00_29
|
||||||
|
SOAP::WSDL::XSD::Typelib::AttributeSet:
|
||||||
|
file: lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm
|
||||||
|
version: 2.00_29
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin:
|
SOAP::WSDL::XSD::Typelib::Builtin:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
|
||||||
version: 2.00_25
|
version: 2.00_25
|
||||||
@@ -184,6 +250,7 @@ provides:
|
|||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::anyType:
|
SOAP::WSDL::XSD::Typelib::Builtin::anyType:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
|
||||||
|
version: 2.00_29
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::anyURI:
|
SOAP::WSDL::XSD::Typelib::Builtin::anyURI:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::base64Binary:
|
SOAP::WSDL::XSD::Typelib::Builtin::base64Binary:
|
||||||
@@ -256,14 +323,17 @@ provides:
|
|||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType:
|
SOAP::WSDL::XSD::Typelib::ComplexType:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
|
||||||
version: 2.00_27
|
version: 2.00_33
|
||||||
SOAP::WSDL::XSD::Typelib::Element:
|
SOAP::WSDL::XSD::Typelib::Element:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Element.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Element.pm
|
||||||
version: 2.00_27
|
version: 2.00_29
|
||||||
SOAP::WSDL::XSD::Typelib::SimpleType:
|
SOAP::WSDL::XSD::Typelib::SimpleType:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
||||||
SOAP::WSDL::XSD::Typelib::SimpleType::restriction:
|
SOAP::WSDL::XSD::Typelib::SimpleType::restriction:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
||||||
|
SOAP::WSDL::XSD::WhiteSpace:
|
||||||
|
file: lib/SOAP/WSDL/XSD/WhiteSpace.pm
|
||||||
|
version: 2.00_33
|
||||||
generated_by: Module::Build version 0.2808
|
generated_by: Module::Build version 0.2808
|
||||||
meta-spec:
|
meta-spec:
|
||||||
url: http://module-build.sourceforge.net/META-spec-v1.2.html
|
url: http://module-build.sourceforge.net/META-spec-v1.2.html
|
||||||
|
|||||||
@@ -1,7 +1,36 @@
|
|||||||
MIGRATING
|
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.
|
2.00_25.
|
||||||
|
|
||||||
Migrating from 2.00_xx
|
Migrating from 2.00_xx
|
||||||
@@ -9,9 +38,9 @@ Migrating from 2.00_xx
|
|||||||
|
|
||||||
Background
|
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.
|
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.
|
no need to change anything in your (handwritten) code.
|
||||||
|
|
||||||
Generated interfaces
|
Generated interfaces
|
||||||
@@ -26,8 +55,8 @@ Typemaps
|
|||||||
|
|
||||||
SOAP::WSDL now tries to load all typemap classes at once from 2.00_25 on.
|
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
|
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
|
paths deeper than the path marked with __SKIP__ - if you don't, SOAP::WSDL
|
||||||
will try to load all correspondent classes.
|
will try to load all correspondent classes.
|
||||||
|
|
||||||
Migrating from 1.xx
|
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
|
for on the fly WSDL processing, nor does it use SOAP::Data objects for
|
||||||
encoding any more.
|
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.
|
SOAP::WSDL is the compatibility module for old interfaces.
|
||||||
|
|
||||||
Overloading
|
Overloading
|
||||||
|
|||||||
+1
-26
@@ -1,30 +1,5 @@
|
|||||||
# Note: this file was auto-generated by Module::Build::Compat version 0.03
|
# Note: this file was auto-generated by Module::Build::Compat version 0.03
|
||||||
|
use Module::Build::Compat 0.02;
|
||||||
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 $@;
|
|
||||||
|
|
||||||
Module::Build::Compat->run_build_pl(args => \@ARGV);
|
Module::Build::Compat->run_build_pl(args => \@ARGV);
|
||||||
require Module::Build;
|
require Module::Build;
|
||||||
|
|||||||
@@ -3,7 +3,25 @@ INTRO
|
|||||||
|
|
||||||
SOAP-WSDL provides a SOAP client with WSDL support.
|
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
|
INSTALLING
|
||||||
----------
|
----------
|
||||||
@@ -15,12 +33,12 @@ Use the following mantra:
|
|||||||
perl Build test
|
perl Build test
|
||||||
perl Build install
|
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
|
perl Makefile.PL
|
||||||
make
|
make
|
||||||
make test
|
make test
|
||||||
make install
|
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.
|
all tests provided with SOAP-WSDL.
|
||||||
Binary file not shown.
+28
-57
@@ -4,34 +4,10 @@ use lib '../../SOAP-WSDL_XS/blib/lib';
|
|||||||
use lib '../../SOAP-WSDL_XS/blib/arch';
|
use lib '../../SOAP-WSDL_XS/blib/arch';
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
package MyData;
|
|
||||||
my $XML;
|
|
||||||
sub xml {
|
|
||||||
return $XML if ($XML);
|
|
||||||
|
|
||||||
open my $fh, 'person.xml' or die 'cannot open data file';
|
|
||||||
$XML = join '', <$fh>;
|
|
||||||
close $fh;
|
|
||||||
return $XML;
|
|
||||||
}
|
|
||||||
|
|
||||||
package MyTransport;
|
|
||||||
use SOAP::WSDL::Factory::Transport;
|
|
||||||
SOAP::WSDL::Factory::Transport->register( http => __PACKAGE__ );
|
|
||||||
sub send_receive {
|
|
||||||
return MyData::xml();
|
|
||||||
}
|
|
||||||
sub new { return bless {}, 'MyTransport' };
|
|
||||||
|
|
||||||
package main;
|
|
||||||
|
|
||||||
use Benchmark qw(cmpthese);
|
use Benchmark qw(cmpthese);
|
||||||
|
|
||||||
# Do this BEFORE the client SOAP handlers are compiled!
|
|
||||||
use XML::Compile::Transport::SOAPHTTP();
|
use XML::Compile::Transport::SOAPHTTP();
|
||||||
use XML::Compile::SOAP::Tester ();
|
use XML::Compile::Util;
|
||||||
use XML::Compile::Util;#use Data::Dumper;
|
|
||||||
#print Dumper $result;
|
|
||||||
use XML::Compile::WSDL11;
|
use XML::Compile::WSDL11;
|
||||||
use XML::Simple;
|
use XML::Simple;
|
||||||
|
|
||||||
@@ -43,14 +19,9 @@ use SOAP::Lite;
|
|||||||
|
|
||||||
use MyInterfaces::TestService::TestPort;
|
use MyInterfaces::TestService::TestPort;
|
||||||
|
|
||||||
my $tester = XML::Compile::SOAP::Tester->new();
|
|
||||||
my $action = pack_type 'http://example.org', 'ListPerson';
|
|
||||||
my $compile = XML::Compile::WSDL11->new('../example/wsdl/Person.wsdl');
|
my $compile = XML::Compile::WSDL11->new('../example/wsdl/Person.wsdl');
|
||||||
|
|
||||||
$tester->actionCallback($action, \&MyData::xml);
|
|
||||||
|
|
||||||
my $call = $compile->compileClient('ListPerson');
|
my $call = $compile->compileClient('ListPerson');
|
||||||
my $result = $call->({ in => undef});
|
$call->({ in => undef});
|
||||||
|
|
||||||
# Initialize SOAP::Lite
|
# Initialize SOAP::Lite
|
||||||
my $deserializer = SOAP::Deserializer->new();
|
my $deserializer = SOAP::Deserializer->new();
|
||||||
@@ -60,17 +31,15 @@ my $soap = MyInterfaces::TestService::TestPort->new();
|
|||||||
# Load all classes - XML::Compile has created everything before, too
|
# Load all classes - XML::Compile has created everything before, too
|
||||||
$soap->ListPerson({});
|
$soap->ListPerson({});
|
||||||
|
|
||||||
|
my $lite = SOAP::Lite->new()->default_ns('http://www.example.org/benchmark/')
|
||||||
|
->proxy('http://localhost:81/soap-wsdl-test/person.pl');
|
||||||
|
$lite->on_action( sub { 'http://www.example.org/benchmark/ListPerson' } );
|
||||||
|
|
||||||
# # register for SOAP 1.1
|
# # register for SOAP 1.1
|
||||||
SOAP::WSDL::Factory::Deserializer->register('1.1' => 'SOAP::WSDL::Deserializer::XSD_XS' );
|
SOAP::WSDL::Factory::Deserializer->register('1.1' => 'SOAP::WSDL::Deserializer::XSD_XS' );
|
||||||
|
|
||||||
my $wsdl_xs = MyInterfaces::TestService::TestPort->new();
|
my $wsdl_xs = MyInterfaces::TestService::TestPort->new();
|
||||||
|
|
||||||
# trigger loading of XML Data
|
my $count = 70;
|
||||||
{
|
|
||||||
use bytes;
|
|
||||||
print "XML length (bytes): " . length( MyData::xml() ), "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
my @data = ();
|
my @data = ();
|
||||||
my $n = 0;
|
my $n = 0;
|
||||||
print "Benchmark conducted with
|
print "Benchmark conducted with
|
||||||
@@ -78,37 +47,39 @@ SOAP::Lite - $SOAP::Lite::VERSION
|
|||||||
SOAP::WSDL - $SOAP::WSDL::Client::VERSION
|
SOAP::WSDL - $SOAP::WSDL::Client::VERSION
|
||||||
SOAP::WSDL_XS - $SOAP::WSDL::Deserializer::XSD_XS::VERSION;
|
SOAP::WSDL_XS - $SOAP::WSDL::Deserializer::XSD_XS::VERSION;
|
||||||
XML::Compile::SOAP - $XML::Compile::SOAP::VERSION
|
XML::Compile::SOAP - $XML::Compile::SOAP::VERSION
|
||||||
XML::Simple - $XML::Simple::VERSION
|
|
||||||
|
|
||||||
Benchmark $n: Store result in private variable and destroy it
|
Benchmark $n: Store result in private variable and destroy it
|
||||||
";
|
";
|
||||||
$n++;
|
$n++;
|
||||||
cmpthese 300, {
|
cmpthese $count, {
|
||||||
'XML::Simple' => sub { my $result = XMLin( MyData::xml() )},
|
# 'XML::Simple' => sub { my $result = XMLin( MyData::xml() )},
|
||||||
'SOAP::WSDL' => sub { my $result = $soap->ListPerson({}) },
|
# 'SOAP::WSDL' => sub { my $result = $soap->ListPerson({}) },
|
||||||
'XML::Compile::SOAP' => sub { my $result = $call->() },
|
# 'XML::Compile' => sub { my $result = $call->() },
|
||||||
'SOAP::WSDL_XS' => sub { my $result = @data, $wsdl_xs->ListPerson({}) },
|
'SOAP::WSDL_XS' => sub { my $result = $wsdl_xs->ListPerson({}) },
|
||||||
'SOAP::Lite' => sub { my $result = $deserializer->deserialize( MyData::xml() )}
|
# 'SOAP::Lite' => sub { my $result = $deserializer->deserialize( MyData::xml() )},
|
||||||
|
# 'SOAP::Lite' => sub { my $som = $lite->call('ListPerson') },
|
||||||
};
|
};
|
||||||
|
|
||||||
print "Benchmark $n: Push result on list\n";
|
print "\nBenchmark $n: Push result on list\n";
|
||||||
$n++;
|
$n++;
|
||||||
cmpthese 500, {
|
cmpthese $count, {
|
||||||
'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
|
# 'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
|
||||||
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
|
# 'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
|
||||||
'XML::Compile::SOAP' => sub { push @data, $call->() },
|
# 'XML::Compile' => sub { push @data, $call->() },
|
||||||
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
|
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
|
||||||
'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
|
# 'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
|
||||||
|
# 'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
|
||||||
};
|
};
|
||||||
|
|
||||||
@data = ();
|
@data = ();
|
||||||
print "Benchmark $n: Play it again, Sam\n";
|
print "\nBenchmark $n: Play it again, Sam\n";
|
||||||
|
|
||||||
cmpthese 500, {
|
cmpthese $count, {
|
||||||
'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
|
# 'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
|
||||||
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
|
# 'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
|
||||||
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
|
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
|
||||||
'XML::Compile::SOAP' => sub { push @data, $call->() },
|
# 'XML::Compile' => sub { push @data, $call->() },
|
||||||
'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
|
# 'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
|
||||||
|
# 'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+222
-222
@@ -46,388 +46,388 @@
|
|||||||
</NewElement>
|
</NewElement>
|
||||||
<NewElement>
|
<NewElement>
|
||||||
<PersonID>
|
<PersonID>
|
||||||
<ID>1</ID>
|
<ID>2</ID>
|
||||||
</PersonID>
|
</PersonID>
|
||||||
<Salutation>Salutation0</Salutation>
|
<Salutation>Salutation2</Salutation>
|
||||||
<Name>Name0</Name>
|
<Name>Name2</Name>
|
||||||
<GivenName>Martin</GivenName>
|
<GivenName>Martin2</GivenName>
|
||||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
<DateOfBirth>1970-01-02</DateOfBirth>
|
||||||
<HomeAddress>
|
<HomeAddress>
|
||||||
<Street>Street 0</Street>
|
<Street>Street 2</Street>
|
||||||
<ZIP>00000</ZIP>
|
<ZIP>00002</ZIP>
|
||||||
<City>City0</City>
|
<City>City2</City>
|
||||||
<Country>Country0</Country>
|
<Country>Country2</Country>
|
||||||
<PhoneNumber>++499131123456</PhoneNumber>
|
<PhoneNumber>++4900000002</PhoneNumber>
|
||||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
<MobilePhoneNumber>++491700000002</MobilePhoneNumber>
|
||||||
</HomeAddress>
|
</HomeAddress>
|
||||||
<WorkAddress>
|
<WorkAddress>
|
||||||
<Street>Somestreet 23</Street>
|
<Street>Somestreet 2</Street>
|
||||||
<ZIP>12345</ZIP>
|
<ZIP>222222</ZIP>
|
||||||
<City>SomeCity</City>
|
<City>SomeCity2</City>
|
||||||
<Country>Germany</Country>
|
<Country>Germany</Country>
|
||||||
<PhoneNumber>++499131123456</PhoneNumber>
|
<PhoneNumber>++4920000002</PhoneNumber>
|
||||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
<MobilePhoneNumber>++4920000002</MobilePhoneNumber>
|
||||||
</WorkAddress>
|
</WorkAddress>
|
||||||
<Contracts>
|
<Contracts>
|
||||||
<Contract>
|
|
||||||
<ContractID>100000</ContractID>
|
|
||||||
<ContractName>SomeContract0</ContractName>
|
|
||||||
</Contract>
|
|
||||||
<Contract>
|
|
||||||
<ContractID>100001</ContractID>
|
|
||||||
<ContractName>SomeContract1</ContractName>
|
|
||||||
</Contract>
|
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100002</ContractID>
|
<ContractID>100002</ContractID>
|
||||||
<ContractName>SomeContract2</ContractName>
|
<ContractName>SomeContract2</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100003</ContractID>
|
<ContractID>100021</ContractID>
|
||||||
<ContractName>SomeContract3</ContractName>
|
<ContractName>SomeContract21</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100022</ContractID>
|
||||||
|
<ContractName>SomeContract22</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>1000023</ContractID>
|
||||||
|
<ContractName>SomeContract23</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
</Contracts>
|
</Contracts>
|
||||||
</NewElement>
|
</NewElement>
|
||||||
<NewElement>
|
<NewElement>
|
||||||
<PersonID>
|
<PersonID>
|
||||||
<ID>1</ID>
|
<ID>3</ID>
|
||||||
</PersonID>
|
</PersonID>
|
||||||
<Salutation>Salutation0</Salutation>
|
<Salutation>Salutation3</Salutation>
|
||||||
<Name>Name0</Name>
|
<Name>Name3</Name>
|
||||||
<GivenName>Martin</GivenName>
|
<GivenName>Martin3</GivenName>
|
||||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
<DateOfBirth>1970-01-03</DateOfBirth>
|
||||||
<HomeAddress>
|
<HomeAddress>
|
||||||
<Street>Street 0</Street>
|
<Street>Street 3</Street>
|
||||||
<ZIP>00000</ZIP>
|
<ZIP>00003</ZIP>
|
||||||
<City>City0</City>
|
<City>City3</City>
|
||||||
<Country>Country0</Country>
|
<Country>Country3</Country>
|
||||||
<PhoneNumber>++499131123456</PhoneNumber>
|
<PhoneNumber>++4900000003</PhoneNumber>
|
||||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
<MobilePhoneNumber>++491700000003</MobilePhoneNumber>
|
||||||
</HomeAddress>
|
</HomeAddress>
|
||||||
<WorkAddress>
|
<WorkAddress>
|
||||||
<Street>Somestreet 23</Street>
|
<Street>Somestreet 3</Street>
|
||||||
<ZIP>12345</ZIP>
|
<ZIP>333333</ZIP>
|
||||||
<City>SomeCity</City>
|
<City>SomeCity3</City>
|
||||||
<Country>Germany</Country>
|
<Country>Germany</Country>
|
||||||
<PhoneNumber>++499131123456</PhoneNumber>
|
<PhoneNumber>++4930000003</PhoneNumber>
|
||||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
<MobilePhoneNumber>++4930000003</MobilePhoneNumber>
|
||||||
</WorkAddress>
|
</WorkAddress>
|
||||||
<Contracts>
|
<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>
|
<Contract>
|
||||||
<ContractID>100003</ContractID>
|
<ContractID>100003</ContractID>
|
||||||
<ContractName>SomeContract3</ContractName>
|
<ContractName>SomeContract3</ContractName>
|
||||||
</Contract>
|
</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>
|
</Contracts>
|
||||||
</NewElement>
|
</NewElement>
|
||||||
<NewElement>
|
<NewElement>
|
||||||
<PersonID>
|
<PersonID>
|
||||||
<ID>1</ID>
|
<ID>4</ID>
|
||||||
</PersonID>
|
</PersonID>
|
||||||
<Salutation>Salutation0</Salutation>
|
<Salutation>Salutation4</Salutation>
|
||||||
<Name>Name0</Name>
|
<Name>Name4</Name>
|
||||||
<GivenName>Martin</GivenName>
|
<GivenName>Martin4</GivenName>
|
||||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
<DateOfBirth>1970-01-04</DateOfBirth>
|
||||||
<HomeAddress>
|
<HomeAddress>
|
||||||
<Street>Street 0</Street>
|
<Street>Street 4</Street>
|
||||||
<ZIP>00000</ZIP>
|
<ZIP>00004</ZIP>
|
||||||
<City>City0</City>
|
<City>City4</City>
|
||||||
<Country>Country0</Country>
|
<Country>Country4</Country>
|
||||||
<PhoneNumber>++499131123456</PhoneNumber>
|
<PhoneNumber>++4900000004</PhoneNumber>
|
||||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
<MobilePhoneNumber>++491700000004</MobilePhoneNumber>
|
||||||
</HomeAddress>
|
</HomeAddress>
|
||||||
<WorkAddress>
|
<WorkAddress>
|
||||||
<Street>Somestreet 23</Street>
|
<Street>Somestreet 4</Street>
|
||||||
<ZIP>12345</ZIP>
|
<ZIP>444444</ZIP>
|
||||||
<City>SomeCity</City>
|
<City>SomeCity4</City>
|
||||||
<Country>Germany</Country>
|
<Country>Germany</Country>
|
||||||
<PhoneNumber>++499131123456</PhoneNumber>
|
<PhoneNumber>++4940000004</PhoneNumber>
|
||||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
<MobilePhoneNumber>++4940000004</MobilePhoneNumber>
|
||||||
</WorkAddress>
|
</WorkAddress>
|
||||||
<Contracts>
|
<Contracts>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100000</ContractID>
|
<ContractID>100004</ContractID>
|
||||||
<ContractName>SomeContract0</ContractName>
|
<ContractName>SomeContract4</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100001</ContractID>
|
<ContractID>100041</ContractID>
|
||||||
<ContractName>SomeContract1</ContractName>
|
<ContractName>SomeContract41</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100002</ContractID>
|
<ContractID>100044</ContractID>
|
||||||
<ContractName>SomeContract2</ContractName>
|
<ContractName>SomeContract44</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100003</ContractID>
|
<ContractID>1000044</ContractID>
|
||||||
<ContractName>SomeContract3</ContractName>
|
<ContractName>SomeContract44</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
</Contracts>
|
</Contracts>
|
||||||
</NewElement>
|
</NewElement>
|
||||||
<NewElement>
|
<NewElement>
|
||||||
<PersonID>
|
<PersonID>
|
||||||
<ID>1</ID>
|
<ID>5</ID>
|
||||||
</PersonID>
|
</PersonID>
|
||||||
<Salutation>Salutation0</Salutation>
|
<Salutation>Salutation5</Salutation>
|
||||||
<Name>Name0</Name>
|
<Name>Name5</Name>
|
||||||
<GivenName>Martin</GivenName>
|
<GivenName>Martin5</GivenName>
|
||||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
<DateOfBirth>1970-01-05</DateOfBirth>
|
||||||
<HomeAddress>
|
<HomeAddress>
|
||||||
<Street>Street 0</Street>
|
<Street>Street 5</Street>
|
||||||
<ZIP>00000</ZIP>
|
<ZIP>00005</ZIP>
|
||||||
<City>City0</City>
|
<City>City5</City>
|
||||||
<Country>Country0</Country>
|
<Country>Country5</Country>
|
||||||
<PhoneNumber>++499131123456</PhoneNumber>
|
<PhoneNumber>++4900000005</PhoneNumber>
|
||||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
<MobilePhoneNumber>++491700000005</MobilePhoneNumber>
|
||||||
</HomeAddress>
|
</HomeAddress>
|
||||||
<WorkAddress>
|
<WorkAddress>
|
||||||
<Street>Somestreet 23</Street>
|
<Street>Somestreet 5</Street>
|
||||||
<ZIP>12345</ZIP>
|
<ZIP>555555</ZIP>
|
||||||
<City>SomeCity</City>
|
<City>SomeCity5</City>
|
||||||
<Country>Germany</Country>
|
<Country>Germany</Country>
|
||||||
<PhoneNumber>++499131123456</PhoneNumber>
|
<PhoneNumber>++4950000005</PhoneNumber>
|
||||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
<MobilePhoneNumber>++4950000005</MobilePhoneNumber>
|
||||||
</WorkAddress>
|
</WorkAddress>
|
||||||
<Contracts>
|
<Contracts>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100000</ContractID>
|
<ContractID>100005</ContractID>
|
||||||
<ContractName>SomeContract0</ContractName>
|
<ContractName>SomeContract5</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100001</ContractID>
|
<ContractID>100051</ContractID>
|
||||||
<ContractName>SomeContract1</ContractName>
|
<ContractName>SomeContract51</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100002</ContractID>
|
<ContractID>100055</ContractID>
|
||||||
<ContractName>SomeContract2</ContractName>
|
<ContractName>SomeContract55</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100003</ContractID>
|
<ContractID>1000053</ContractID>
|
||||||
<ContractName>SomeContract3</ContractName>
|
<ContractName>SomeContract53</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
</Contracts>
|
</Contracts>
|
||||||
</NewElement>
|
</NewElement>
|
||||||
<NewElement>
|
<NewElement>
|
||||||
<PersonID>
|
<PersonID>
|
||||||
<ID>1</ID>
|
<ID>6</ID>
|
||||||
</PersonID>
|
</PersonID>
|
||||||
<Salutation>Salutation0</Salutation>
|
<Salutation>Salutation6</Salutation>
|
||||||
<Name>Name0</Name>
|
<Name>Name6</Name>
|
||||||
<GivenName>Martin</GivenName>
|
<GivenName>Martin6</GivenName>
|
||||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
<DateOfBirth>1970-01-06</DateOfBirth>
|
||||||
<HomeAddress>
|
<HomeAddress>
|
||||||
<Street>Street 0</Street>
|
<Street>Street 6</Street>
|
||||||
<ZIP>00000</ZIP>
|
<ZIP>00006</ZIP>
|
||||||
<City>City0</City>
|
<City>City6</City>
|
||||||
<Country>Country0</Country>
|
<Country>Country6</Country>
|
||||||
<PhoneNumber>++499131123456</PhoneNumber>
|
<PhoneNumber>++4900000006</PhoneNumber>
|
||||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
<MobilePhoneNumber>++491700000006</MobilePhoneNumber>
|
||||||
</HomeAddress>
|
</HomeAddress>
|
||||||
<WorkAddress>
|
<WorkAddress>
|
||||||
<Street>Somestreet 23</Street>
|
<Street>Somestreet 6</Street>
|
||||||
<ZIP>12345</ZIP>
|
<ZIP>666666</ZIP>
|
||||||
<City>SomeCity</City>
|
<City>SomeCity6</City>
|
||||||
<Country>Germany</Country>
|
<Country>Germany</Country>
|
||||||
<PhoneNumber>++499131123456</PhoneNumber>
|
<PhoneNumber>++4960000006</PhoneNumber>
|
||||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
<MobilePhoneNumber>++4960000006</MobilePhoneNumber>
|
||||||
</WorkAddress>
|
</WorkAddress>
|
||||||
<Contracts>
|
<Contracts>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100000</ContractID>
|
<ContractID>100006</ContractID>
|
||||||
<ContractName>SomeContract0</ContractName>
|
<ContractName>SomeContract6</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100001</ContractID>
|
<ContractID>100061</ContractID>
|
||||||
<ContractName>SomeContract1</ContractName>
|
<ContractName>SomeContract61</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100002</ContractID>
|
<ContractID>100066</ContractID>
|
||||||
<ContractName>SomeContract2</ContractName>
|
<ContractName>SomeContract66</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100003</ContractID>
|
<ContractID>1000063</ContractID>
|
||||||
<ContractName>SomeContract3</ContractName>
|
<ContractName>SomeContract63</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
</Contracts>
|
</Contracts>
|
||||||
</NewElement>
|
</NewElement>
|
||||||
<NewElement>
|
<NewElement>
|
||||||
<PersonID>
|
<PersonID>
|
||||||
<ID>1</ID>
|
<ID>7</ID>
|
||||||
</PersonID>
|
</PersonID>
|
||||||
<Salutation>Salutation0</Salutation>
|
<Salutation>Salutation7</Salutation>
|
||||||
<Name>Name0</Name>
|
<Name>Name7</Name>
|
||||||
<GivenName>Martin</GivenName>
|
<GivenName>Martin7</GivenName>
|
||||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
<DateOfBirth>1970-01-07</DateOfBirth>
|
||||||
<HomeAddress>
|
<HomeAddress>
|
||||||
<Street>Street 0</Street>
|
<Street>Street 7</Street>
|
||||||
<ZIP>00000</ZIP>
|
<ZIP>00007</ZIP>
|
||||||
<City>City0</City>
|
<City>City7</City>
|
||||||
<Country>Country0</Country>
|
<Country>Country7</Country>
|
||||||
<PhoneNumber>++499131123456</PhoneNumber>
|
<PhoneNumber>++4900000007</PhoneNumber>
|
||||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
<MobilePhoneNumber>++491700000007</MobilePhoneNumber>
|
||||||
</HomeAddress>
|
</HomeAddress>
|
||||||
<WorkAddress>
|
<WorkAddress>
|
||||||
<Street>Somestreet 23</Street>
|
<Street>Somestreet 7</Street>
|
||||||
<ZIP>12345</ZIP>
|
<ZIP>777777</ZIP>
|
||||||
<City>SomeCity</City>
|
<City>SomeCity7</City>
|
||||||
<Country>Germany</Country>
|
<Country>Germany</Country>
|
||||||
<PhoneNumber>++499131123456</PhoneNumber>
|
<PhoneNumber>++4970000007</PhoneNumber>
|
||||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
<MobilePhoneNumber>++4970000007</MobilePhoneNumber>
|
||||||
</WorkAddress>
|
</WorkAddress>
|
||||||
<Contracts>
|
<Contracts>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100000</ContractID>
|
<ContractID>100007</ContractID>
|
||||||
<ContractName>SomeContract0</ContractName>
|
<ContractName>SomeContract7</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100001</ContractID>
|
<ContractID>100071</ContractID>
|
||||||
<ContractName>SomeContract1</ContractName>
|
<ContractName>SomeContract71</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100002</ContractID>
|
<ContractID>100077</ContractID>
|
||||||
<ContractName>SomeContract2</ContractName>
|
<ContractName>SomeContract77</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100003</ContractID>
|
<ContractID>1000073</ContractID>
|
||||||
<ContractName>SomeContract3</ContractName>
|
<ContractName>SomeContract73</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
</Contracts>
|
</Contracts>
|
||||||
</NewElement>
|
</NewElement>
|
||||||
<NewElement>
|
<NewElement>
|
||||||
<PersonID>
|
<PersonID>
|
||||||
<ID>1</ID>
|
<ID>8</ID>
|
||||||
</PersonID>
|
</PersonID>
|
||||||
<Salutation>Salutation0</Salutation>
|
<Salutation>Salutation8</Salutation>
|
||||||
<Name>Name0</Name>
|
<Name>Name8</Name>
|
||||||
<GivenName>Martin</GivenName>
|
<GivenName>Martin8</GivenName>
|
||||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
<DateOfBirth>1970-01-08</DateOfBirth>
|
||||||
<HomeAddress>
|
<HomeAddress>
|
||||||
<Street>Street 0</Street>
|
<Street>Street 8</Street>
|
||||||
<ZIP>00000</ZIP>
|
<ZIP>00008</ZIP>
|
||||||
<City>City0</City>
|
<City>City8</City>
|
||||||
<Country>Country0</Country>
|
<Country>Country8</Country>
|
||||||
<PhoneNumber>++499131123456</PhoneNumber>
|
<PhoneNumber>++4900000008</PhoneNumber>
|
||||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
<MobilePhoneNumber>++491700000008</MobilePhoneNumber>
|
||||||
</HomeAddress>
|
</HomeAddress>
|
||||||
<WorkAddress>
|
<WorkAddress>
|
||||||
<Street>Somestreet 23</Street>
|
<Street>Somestreet 8</Street>
|
||||||
<ZIP>12345</ZIP>
|
<ZIP>888888</ZIP>
|
||||||
<City>SomeCity</City>
|
<City>SomeCity8</City>
|
||||||
<Country>Germany</Country>
|
<Country>Germany</Country>
|
||||||
<PhoneNumber>++499131123456</PhoneNumber>
|
<PhoneNumber>++4980000008</PhoneNumber>
|
||||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
<MobilePhoneNumber>++4980000008</MobilePhoneNumber>
|
||||||
</WorkAddress>
|
</WorkAddress>
|
||||||
<Contracts>
|
<Contracts>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100000</ContractID>
|
<ContractID>100008</ContractID>
|
||||||
<ContractName>SomeContract0</ContractName>
|
<ContractName>SomeContract8</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100001</ContractID>
|
<ContractID>100081</ContractID>
|
||||||
<ContractName>SomeContract1</ContractName>
|
<ContractName>SomeContract81</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100002</ContractID>
|
<ContractID>100088</ContractID>
|
||||||
<ContractName>SomeContract2</ContractName>
|
<ContractName>SomeContract88</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100003</ContractID>
|
<ContractID>1000083</ContractID>
|
||||||
<ContractName>SomeContract3</ContractName>
|
<ContractName>SomeContract83</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
</Contracts>
|
</Contracts>
|
||||||
</NewElement>
|
</NewElement>
|
||||||
<NewElement>
|
<NewElement>
|
||||||
<PersonID>
|
<PersonID>
|
||||||
<ID>1</ID>
|
<ID>9</ID>
|
||||||
</PersonID>
|
</PersonID>
|
||||||
<Salutation>Salutation0</Salutation>
|
<Salutation>Salutation9</Salutation>
|
||||||
<Name>Name0</Name>
|
<Name>Name9</Name>
|
||||||
<GivenName>Martin</GivenName>
|
<GivenName>Martin9</GivenName>
|
||||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
<DateOfBirth>1970-01-09</DateOfBirth>
|
||||||
<HomeAddress>
|
<HomeAddress>
|
||||||
<Street>Street 0</Street>
|
<Street>Street 9</Street>
|
||||||
<ZIP>00000</ZIP>
|
<ZIP>00009</ZIP>
|
||||||
<City>City0</City>
|
<City>City9</City>
|
||||||
<Country>Country0</Country>
|
<Country>Country9</Country>
|
||||||
<PhoneNumber>++499131123456</PhoneNumber>
|
<PhoneNumber>++4900000009</PhoneNumber>
|
||||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
<MobilePhoneNumber>++491700000009</MobilePhoneNumber>
|
||||||
</HomeAddress>
|
</HomeAddress>
|
||||||
<WorkAddress>
|
<WorkAddress>
|
||||||
<Street>Somestreet 23</Street>
|
<Street>Somestreet 9</Street>
|
||||||
<ZIP>12345</ZIP>
|
<ZIP>999999</ZIP>
|
||||||
<City>SomeCity</City>
|
<City>SomeCity9</City>
|
||||||
<Country>Germany</Country>
|
<Country>Germany</Country>
|
||||||
<PhoneNumber>++499131123456</PhoneNumber>
|
<PhoneNumber>++4990000009</PhoneNumber>
|
||||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
<MobilePhoneNumber>++4990000009</MobilePhoneNumber>
|
||||||
</WorkAddress>
|
</WorkAddress>
|
||||||
<Contracts>
|
<Contracts>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100000</ContractID>
|
<ContractID>100009</ContractID>
|
||||||
<ContractName>SomeContract0</ContractName>
|
<ContractName>SomeContract9</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100001</ContractID>
|
<ContractID>100091</ContractID>
|
||||||
<ContractName>SomeContract1</ContractName>
|
<ContractName>SomeContract91</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100002</ContractID>
|
<ContractID>100099</ContractID>
|
||||||
<ContractName>SomeContract2</ContractName>
|
<ContractName>SomeContract99</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100003</ContractID>
|
<ContractID>1000093</ContractID>
|
||||||
<ContractName>SomeContract3</ContractName>
|
<ContractName>SomeContract93</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
</Contracts>
|
</Contracts>
|
||||||
</NewElement>
|
</NewElement>
|
||||||
<NewElement>
|
<NewElement>
|
||||||
<PersonID>
|
<PersonID>
|
||||||
<ID>1</ID>
|
<ID>10</ID>
|
||||||
</PersonID>
|
</PersonID>
|
||||||
<Salutation>Salutation0</Salutation>
|
<Salutation>Salutation10</Salutation>
|
||||||
<Name>Name0</Name>
|
<Name>Name10</Name>
|
||||||
<GivenName>Martin</GivenName>
|
<GivenName>Martin10</GivenName>
|
||||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
<DateOfBirth>1970-01-010</DateOfBirth>
|
||||||
<HomeAddress>
|
<HomeAddress>
|
||||||
<Street>Street 0</Street>
|
<Street>Street 10</Street>
|
||||||
<ZIP>00000</ZIP>
|
<ZIP>000010</ZIP>
|
||||||
<City>City0</City>
|
<City>City10</City>
|
||||||
<Country>Country0</Country>
|
<Country>Country10</Country>
|
||||||
<PhoneNumber>++499131123456</PhoneNumber>
|
<PhoneNumber>++49000000010</PhoneNumber>
|
||||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
<MobilePhoneNumber>++4917000000010</MobilePhoneNumber>
|
||||||
</HomeAddress>
|
</HomeAddress>
|
||||||
<WorkAddress>
|
<WorkAddress>
|
||||||
<Street>Somestreet 23</Street>
|
<Street>Somestreet 10</Street>
|
||||||
<ZIP>12345</ZIP>
|
<ZIP>101010101010</ZIP>
|
||||||
<City>SomeCity</City>
|
<City>SomeCity10</City>
|
||||||
<Country>Germany</Country>
|
<Country>Germany</Country>
|
||||||
<PhoneNumber>++499131123456</PhoneNumber>
|
<PhoneNumber>++491000000010</PhoneNumber>
|
||||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
<MobilePhoneNumber>++491000000010</MobilePhoneNumber>
|
||||||
</WorkAddress>
|
</WorkAddress>
|
||||||
<Contracts>
|
<Contracts>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100000</ContractID>
|
<ContractID>1000010</ContractID>
|
||||||
<ContractName>SomeContract0</ContractName>
|
<ContractName>SomeContract10</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100001</ContractID>
|
<ContractID>1000101</ContractID>
|
||||||
<ContractName>SomeContract1</ContractName>
|
<ContractName>SomeContract101</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100002</ContractID>
|
<ContractID>10001010</ContractID>
|
||||||
<ContractName>SomeContract2</ContractName>
|
<ContractName>SomeContract1010</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
<Contract>
|
<Contract>
|
||||||
<ContractID>100003</ContractID>
|
<ContractID>10000103</ContractID>
|
||||||
<ContractName>SomeContract3</ContractName>
|
<ContractName>SomeContract103</ContractName>
|
||||||
</Contract>
|
</Contract>
|
||||||
</Contracts>
|
</Contracts>
|
||||||
</NewElement>
|
</NewElement>
|
||||||
|
|||||||
@@ -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({})
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
+39
-38
@@ -19,14 +19,15 @@ my %opt = (
|
|||||||
proxy => undef,
|
proxy => undef,
|
||||||
generator => 'XSD',
|
generator => 'XSD',
|
||||||
server => 0,
|
server => 0,
|
||||||
|
namespace => 0,
|
||||||
);
|
);
|
||||||
|
|
||||||
{ # a block just to scope "no warnings"
|
{ # a block just to scope "no warnings"
|
||||||
no warnings qw(redefine);
|
no warnings qw(redefine);
|
||||||
|
|
||||||
*LWP::UserAgent::get_basic_credentials = sub {
|
*LWP::UserAgent::get_basic_credentials = sub {
|
||||||
my ($user, $password);
|
my ($user, $password);
|
||||||
# remove user from option if called, to force prompting for a user
|
# remove user from option if called, to force prompting for a user
|
||||||
# name the next time
|
# name the next time
|
||||||
print "URL requires authorization.\n";
|
print "URL requires authorization.\n";
|
||||||
if (not $user = delete $opt{user}) {
|
if (not $user = delete $opt{user}) {
|
||||||
@@ -34,19 +35,21 @@ my %opt = (
|
|||||||
ReadMode 1;
|
ReadMode 1;
|
||||||
$user = ReadLine();
|
$user = ReadLine();
|
||||||
ReadMode 0;
|
ReadMode 0;
|
||||||
|
chomp $user;
|
||||||
};
|
};
|
||||||
if (not $password = delete $opt{password}) {
|
if (not $password = delete $opt{password}) {
|
||||||
print 'Password:';
|
print 'Password:';
|
||||||
ReadMode 2;
|
ReadMode 2;
|
||||||
$user = ReadLine;
|
$password = ReadLine;
|
||||||
ReadMode 0;
|
ReadMode 0;
|
||||||
|
chomp $password;
|
||||||
};
|
};
|
||||||
return ($user, $password);
|
return ($user, $password);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
GetOptions(\%opt,
|
GetOptions(\%opt,
|
||||||
qw(
|
qw(
|
||||||
prefix|p=s
|
prefix|p=s
|
||||||
type_prefix|t=s
|
type_prefix|t=s
|
||||||
element_prefix|e=s
|
element_prefix|e=s
|
||||||
@@ -61,6 +64,7 @@ GetOptions(\%opt,
|
|||||||
password=s
|
password=s
|
||||||
generator=s
|
generator=s
|
||||||
server
|
server
|
||||||
|
namespaces|n
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -69,24 +73,21 @@ my $url = $ARGV[0];
|
|||||||
pod2usage( -exit => 1 , verbose => 2 ) if ($opt{help});
|
pod2usage( -exit => 1 , verbose => 2 ) if ($opt{help});
|
||||||
pod2usage( -exit => 1 , verbose => 1 ) if not ($url);
|
pod2usage( -exit => 1 , verbose => 1 ) if not ($url);
|
||||||
|
|
||||||
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
|
|
||||||
|
|
||||||
local $ENV{HTTP_PROXY} = $opt{proxy} if $opt{proxy};
|
local $ENV{HTTP_PROXY} = $opt{proxy} if $opt{proxy};
|
||||||
local $ENV{HTTPS_PROXY} = $opt{proxy} if $opt{proxy};
|
local $ENV{HTTPS_PROXY} = $opt{proxy} if $opt{proxy};
|
||||||
|
|
||||||
my $lwp = LWP::UserAgent->new(
|
my $lwp = LWP::UserAgent->new(
|
||||||
$opt{keep_alive}
|
$opt{keep_alive}
|
||||||
? ( keep_alive => 1 )
|
? ( keep_alive => 1 )
|
||||||
: ()
|
: ()
|
||||||
);
|
);
|
||||||
$lwp->env_proxy(); # get proxy from environment. Works for both http & https.
|
$lwp->env_proxy(); # get proxy from environment. Works for both http & https.
|
||||||
|
|
||||||
my $response = $lwp->get($url);
|
my $parser = SOAP::WSDL::Expat::WSDLParser->new({
|
||||||
die $response->message(), "\n" if $response->code != 200;
|
user_agent => $lwp,
|
||||||
|
});
|
||||||
|
|
||||||
my $xml = $response->content();
|
my $definitions = $parser->parse_uri( $url );
|
||||||
|
|
||||||
my $definitions = $parser->parse_string( $xml );
|
|
||||||
|
|
||||||
my %typemap = ();
|
my %typemap = ();
|
||||||
|
|
||||||
@@ -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_interface_prefix($opt{ interface_prefix }) if $generator->can('set_interface_prefix');
|
||||||
$generator->set_OUTPUT_PATH($opt{ base_path }) if $generator->can('set_OUTPUT_PATH');
|
$generator->set_OUTPUT_PATH($opt{ base_path }) if $generator->can('set_OUTPUT_PATH');
|
||||||
$generator->set_definitions($definitions) if $generator->can('set_definitions');
|
$generator->set_definitions($definitions) if $generator->can('set_definitions');
|
||||||
$generator->set_wsdl($xml) if $generator->can('set_wsdl');
|
# $generator->set_wsdl($xml) if $generator->can('set_wsdl');
|
||||||
|
|
||||||
# start with typelib, as errors will most likely occur here...
|
# start with typelib, as errors will most likely occur here...
|
||||||
$generator->generate();
|
$generator->generate();
|
||||||
@@ -136,33 +137,33 @@ wsdl2perl.pl - create perl bindings for SOAP webservices.
|
|||||||
NAME SHORT DESCRITPION
|
NAME SHORT DESCRITPION
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
prefix p Prefix for both type and element classes.
|
prefix p Prefix for both type and element classes.
|
||||||
type_prefix t Prefix for type classes.
|
type_prefix t Prefix for type classes.
|
||||||
Default: MyTypes
|
Default: MyTypes
|
||||||
element_prefix e Prefix for element classes.
|
element_prefix e Prefix for element classes.
|
||||||
Default: MyElements
|
Default: MyElements
|
||||||
typemap_prefix m Prefix for typemap classes.
|
typemap_prefix m Prefix for typemap classes.
|
||||||
Default: MyTypemaps
|
Default: MyTypemaps
|
||||||
interface_prefix i Prefix for interface classes.
|
interface_prefix i Prefix for interface classes.
|
||||||
Default: MyInterfaces
|
Default: MyInterfaces
|
||||||
base_path b Path to create classes in.
|
base_path b Path to create classes in.
|
||||||
Default: .
|
Default: .
|
||||||
typemap_include mi File to include in typemap. Must eval() to a valid
|
typemap_include mi File to include in typemap. Must eval() to a valid
|
||||||
perl hash (not a hash ref !).
|
perl hash (not a hash ref !).
|
||||||
proxy x HTTP(S) proxy to use (if any). wsdl2perl will also
|
proxy x HTTP(S) proxy to use (if any). wsdl2perl will also
|
||||||
use the proxy settings specified via the HTTP_PROXY
|
use the proxy settings specified via the HTTP_PROXY
|
||||||
and HTTPS_PROXY environment variables.
|
and HTTPS_PROXY environment variables.
|
||||||
keep_alive Use http keep_alive.
|
keep_alive Use http keep_alive.
|
||||||
user Username for HTTP authentication
|
user Username for HTTP authentication
|
||||||
password Password. wsdl2perl will prompt if not given.
|
password Password. wsdl2perl will prompt if not given.
|
||||||
generator g Generator to use.
|
generator g Generator to use.
|
||||||
Default: XSD
|
Default: XSD
|
||||||
server s Generate a server interface (currently only CGI
|
server s Generate a server interface (currently only CGI
|
||||||
supported)
|
supported)
|
||||||
help h Show help content
|
help h Show help content
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Generates a interface class for a SOAP web service described by a WSDL
|
Generates a interface class for a SOAP web service described by a WSDL
|
||||||
definition.
|
definition.
|
||||||
|
|
||||||
The following classes are created:
|
The following classes are created:
|
||||||
@@ -171,7 +172,7 @@ The following classes are created:
|
|||||||
|
|
||||||
=item * A interface class for every SOAP port in service
|
=item * A interface class for every SOAP port in service
|
||||||
|
|
||||||
Interface classes are what you will mainly deal with: They provide a method
|
Interface classes are what you will mainly deal with: They provide a method
|
||||||
for accessing every web service method.
|
for accessing every web service method.
|
||||||
|
|
||||||
If you chose to generate Server interfaces, a class for every SOAP port in
|
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
|
=item * A typemap for every service
|
||||||
|
|
||||||
Typemaps are used internally by SOAP::WSDL for parsing the SOAP message into
|
Typemaps are used internally by SOAP::WSDL for parsing the SOAP message into
|
||||||
object trees.
|
object trees.
|
||||||
|
|
||||||
If the WSDL definition is incomplete, you may need to add some lines to
|
If the WSDL definition is incomplete, you may need to add some lines to
|
||||||
your typemap. Especially definitions for faults are sometimes left out.
|
your typemap. Especially definitions for faults are sometimes left out.
|
||||||
|
|
||||||
Additional typemap content may be included by passing a file name as
|
Additional typemap content may be included by passing a file name as
|
||||||
typemap_include (mi) option.
|
typemap_include (mi) option.
|
||||||
|
|
||||||
=item * A type class for every element, complexType or simpleType definition
|
=item * A type class for every element, complexType or simpleType definition
|
||||||
@@ -197,7 +198,7 @@ typemap_include (mi) option.
|
|||||||
You may need to write additional type classes if your WSDL is incomplete.
|
You may need to write additional type classes if your WSDL is incomplete.
|
||||||
|
|
||||||
For writing your own lib classes, see L<SOAP::WSDL::XSD::Typelib::Element>,
|
For writing your own lib classes, see L<SOAP::WSDL::XSD::Typelib::Element>,
|
||||||
L<SOAP::WSDL::XSD::Typelib::ComplexType>
|
L<SOAP::WSDL::XSD::Typelib::ComplexType>
|
||||||
and L<SOAP::WSDL::XSD::Typelib::SimpleType>.
|
and L<SOAP::WSDL::XSD::Typelib::SimpleType>.
|
||||||
|
|
||||||
=back
|
=back
|
||||||
@@ -210,26 +211,26 @@ You need Crypt::SSLeay installed for accessing HTTPS URLs.
|
|||||||
|
|
||||||
=head2 Accessing protected documents
|
=head2 Accessing protected documents
|
||||||
|
|
||||||
Use the -u option for specifying the user name. You will be prompted for a
|
Use the -u option for specifying the user name. You will be prompted for a
|
||||||
password.
|
password.
|
||||||
|
|
||||||
Alternatively, you may specify a passowrd with --password on the command
|
Alternatively, you may specify a passowrd with --password on the command
|
||||||
line.
|
line.
|
||||||
|
|
||||||
=head2 Accessing documents protected by NTLM authentication
|
=head2 Accessing documents protected by NTLM authentication
|
||||||
|
|
||||||
Set the --keep_alive option.
|
Set the --keep_alive option.
|
||||||
|
|
||||||
Note that accessing documents protected by NTLM authentication is currently
|
Note that accessing documents protected by NTLM authentication is currently
|
||||||
untested, because I have no access to a system using NTLM authentication.
|
untested, because I have no access to a system using NTLM authentication.
|
||||||
If you try it, I would be glad if you could just drop me a note about
|
If you try it, I would be glad if you could just drop me a note about
|
||||||
success or failure.
|
success or failure.
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE
|
||||||
|
|
||||||
Copyright 2007 Martin Kutter.
|
Copyright 2007 Martin Kutter.
|
||||||
|
|
||||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||||
the same terms as perl itself
|
the same terms as perl itself
|
||||||
|
|
||||||
=head1 AUTHOR
|
=head1 AUTHOR
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/usr/bin/perl -w
|
#!/usr/bin/perl -w
|
||||||
|
package main;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use lib qw(../lib ../../lib);
|
use lib qw(../lib ../../lib);
|
||||||
|
|||||||
@@ -21,3 +21,4 @@ die $result if not $result;
|
|||||||
# I have to lookup the output parameter from the interface's POD - or try:
|
# I have to lookup the output parameter from the interface's POD - or try:
|
||||||
# Will die on bad method names with a list of available methods
|
# Will die on bad method names with a list of available methods
|
||||||
print $result->get_sayHelloResult(), "\n";
|
print $result->get_sayHelloResult(), "\n";
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/perl -w
|
#!/usr/bin/perl -w
|
||||||
use strict;
|
#use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use SOAP::Lite;
|
use SOAP::Lite +trace;
|
||||||
|
|
||||||
# I have to lookup the URL from the WSDL
|
# I have to lookup the URL from the WSDL
|
||||||
my $soap = SOAP::Lite->new(
|
my $soap = SOAP::Lite->new(
|
||||||
@@ -26,3 +26,4 @@ my $som = $soap->call(
|
|||||||
die $som->fault->{ faultstring } if ($som->fault);
|
die $som->fault->{ faultstring } if ($som->fault);
|
||||||
|
|
||||||
print $som->result, "\n";
|
print $som->result, "\n";
|
||||||
|
|
||||||
|
|||||||
+79
-18
@@ -14,7 +14,7 @@ use Class::Std::Fast;
|
|||||||
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
||||||
use LWP::UserAgent;
|
use LWP::UserAgent;
|
||||||
|
|
||||||
our $VERSION= '2.00_25';
|
our $VERSION= '2.00_33';
|
||||||
|
|
||||||
my %no_dispatch_of :ATTR(:name<no_dispatch>);
|
my %no_dispatch_of :ATTR(:name<no_dispatch>);
|
||||||
my %wsdl_of :ATTR(:name<wsdl>);
|
my %wsdl_of :ATTR(:name<wsdl>);
|
||||||
@@ -176,7 +176,7 @@ sub _wsdl_init_methods :PRIVATE {
|
|||||||
my $ns = $wsdl->get_targetNamespace();
|
my $ns = $wsdl->get_targetNamespace();
|
||||||
|
|
||||||
# get bindings, portType, message, part(s) - use private methods for clear separation...
|
# get bindings, portType, message, part(s) - use private methods for clear separation...
|
||||||
$self->_wsdl_get_service if not ($service_of{ $ident });
|
$self->_wsdl_get_service();
|
||||||
$self->_wsdl_get_portType();
|
$self->_wsdl_get_portType();
|
||||||
|
|
||||||
$method_info_of{ $ident } = {};
|
$method_info_of{ $ident } = {};
|
||||||
@@ -187,9 +187,10 @@ sub _wsdl_init_methods :PRIVATE {
|
|||||||
|
|
||||||
# get SOAP Action
|
# get SOAP Action
|
||||||
# SOAP-Action is a required HTTP Header, so we need to look it up...
|
# SOAP-Action is a required HTTP Header, so we need to look it up...
|
||||||
|
# There must be a soapAction uri - or the WSDL is invalid (and
|
||||||
|
# it's not us to prove that...)
|
||||||
my $soap_binding_operation = $binding_operation->get_operation()->[0];
|
my $soap_binding_operation = $binding_operation->get_operation()->[0];
|
||||||
$method->{ soap_action } = $soap_binding_operation ?
|
$method->{ soap_action } = $soap_binding_operation->get_soapAction();
|
||||||
$soap_binding_operation->get_soapAction() : $method;
|
|
||||||
|
|
||||||
# get parts
|
# get parts
|
||||||
# 1. get operation from port
|
# 1. get operation from port
|
||||||
@@ -204,7 +205,10 @@ sub _wsdl_init_methods :PRIVATE {
|
|||||||
my $message = $wsdl->find_message( $ns, $localname )
|
my $message = $wsdl->find_message( $ns, $localname )
|
||||||
or croak "Message {$ns}$localname not found in WSDL definition";
|
or croak "Message {$ns}$localname not found in WSDL definition";
|
||||||
|
|
||||||
if (my $body=$binding_operation->first_input()->first_body()) {
|
# Is body not required? So there must be one? Do we need the "if"?
|
||||||
|
# if (
|
||||||
|
my $body=$binding_operation->first_input()->first_body();
|
||||||
|
# {
|
||||||
if ($body->get_parts()) {
|
if ($body->get_parts()) {
|
||||||
$method->{ parts } = []; # make sure it's empty
|
$method->{ parts } = []; # make sure it's empty
|
||||||
my $message_part_ref = $message->get_part();
|
my $message_part_ref = $message->get_part();
|
||||||
@@ -216,7 +220,9 @@ sub _wsdl_init_methods :PRIVATE {
|
|||||||
grep { $_->get_name() eq $name } @{ $message_part_ref };
|
grep { $_->get_name() eq $name } @{ $message_part_ref };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
# }
|
||||||
|
# A body does not need to specify the parts of a messages.
|
||||||
|
# Use all of the message's parts if it does not.
|
||||||
$method->{ parts } ||= $message->get_part();
|
$method->{ parts } ||= $message->get_part();
|
||||||
|
|
||||||
# rpc / encoded methods may have a namespace specified.
|
# rpc / encoded methods may have a namespace specified.
|
||||||
@@ -324,12 +330,23 @@ read L<SOAP::WSDL::Manual>.
|
|||||||
For using an interpreting (thus slow and somewhat troublesome) WSDL based
|
For using an interpreting (thus slow and somewhat troublesome) WSDL based
|
||||||
SOAP client, which mimics L<SOAP::Lite|SOAP::Lite>'s API, read on.
|
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
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
my $soap = SOAP::WSDL->new(
|
my $soap = SOAP::WSDL->new(
|
||||||
wsdl => 'file://bla.wsdl',
|
wsdl => 'file://bla.wsdl',
|
||||||
);
|
);
|
||||||
|
|
||||||
my $result = $soap->call('MyMethod', %data);
|
my $result = $soap->call('MyMethod', %data);
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
@@ -436,7 +453,7 @@ Class resolver
|
|||||||
'Person/Name' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'Person/Name' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
'Person/FirstName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'Person/FirstName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
);
|
);
|
||||||
|
|
||||||
sub get_class { return $typemap{ $_[1] } };
|
sub get_class { return $typemap{ $_[1] } };
|
||||||
1;
|
1;
|
||||||
|
|
||||||
@@ -516,6 +533,28 @@ You may pass the servicename and portname as attributes to wsdlinit, though.
|
|||||||
|
|
||||||
=back
|
=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
|
=head1 Differences to SOAP::Lite
|
||||||
|
|
||||||
=head2 readable
|
=head2 readable
|
||||||
@@ -598,6 +637,18 @@ details.
|
|||||||
|
|
||||||
=over
|
=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
|
=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
|
SOAP::WSDL needs perl 5.8.0 or higher. This is due to a bug in perls
|
||||||
@@ -611,14 +662,16 @@ If you want this changed, email me a copy of the specs, please.
|
|||||||
|
|
||||||
=item * Incomplete XML Schema definitions support
|
=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
|
group
|
||||||
union
|
|
||||||
simpleContent
|
simpleContent
|
||||||
|
|
||||||
The following XML Schema definition content model is only partially
|
The following XML Schema definition content model is only partially
|
||||||
@@ -706,20 +759,29 @@ became v1.23)
|
|||||||
|
|
||||||
David Bussenschutt, Damian A. Martinez Gelabert, Dennis S. Hennen, Dan Horne,
|
David Bussenschutt, Damian A. Martinez Gelabert, Dennis S. Hennen, Dan Horne,
|
||||||
Peter Orvos, Mark Overmeer, Jon Robens, Isidro Vila Verde and Glenn Wood
|
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.
|
||||||
|
|
||||||
Andreas 'ac0v' Specht constantly asked for better performance.
|
Andreas 'ac0v' Specht constantly asked for better performance.
|
||||||
|
|
||||||
JT Justman provided early feedback for the 2.xx pre-releases.
|
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.
|
||||||
|
|
||||||
|
CPAN Testers have provided most valuable (automated) feedback. Thanks.
|
||||||
|
|
||||||
Numerous people sent me their real-world WSDL files for testing. Thank you.
|
Numerous people sent me their real-world WSDL files for testing. Thank you.
|
||||||
|
|
||||||
Paul Kulchenko and Byrne Reese wrote and maintained SOAP::Lite and
|
Paul Kulchenko and Byrne Reese wrote and maintained SOAP::Lite and
|
||||||
thus provided a base (and counterpart) for SOAP::WSDL.
|
thus provided a base (and counterpart) for SOAP::WSDL.
|
||||||
|
|
||||||
|
Mark Overmeer wrote XML::Compile::SOAP - competition is good for business.
|
||||||
|
|
||||||
=head1 LICENSE AND COPYRIGHT
|
=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
|
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||||
the same terms as perl itself
|
the same terms as perl itself
|
||||||
@@ -730,10 +792,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 477 $
|
$Rev: 583 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: WSDL.pm 477 2007-12-24 10:23:52Z kutterma $
|
$Id: WSDL.pm 583 2008-03-24 07:44:06Z kutterma $
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
+26
-9
@@ -7,16 +7,28 @@ use Carp qw(croak carp confess);
|
|||||||
|
|
||||||
our $VERSION='2.00_27';
|
our $VERSION='2.00_27';
|
||||||
|
|
||||||
my %id_of :ATTR(:name<id> :default<()>);
|
my %id_of :ATTR(:name<id> :default<()>);
|
||||||
my %name_of :ATTR(:name<name> :default<()>);
|
my %lang_of :ATTR(:name<lang> :default<()>);
|
||||||
my %documentation_of :ATTR(:name<documentation> :default<()>);
|
my %name_of :ATTR(:name<name> :default<()>);
|
||||||
my %targetNamespace_of :ATTR(:name<targetNamespace> :default<()>);
|
my %documentation_of :ATTR(:name<documentation> :default<()>);
|
||||||
my %xmlns_of :ATTR(:name<xmlns> :default<{}>);
|
my %annotation_of :ATTR(:name<annotation> :default<()>);
|
||||||
my %parent_of :ATTR(:name<parent> :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 {
|
sub START {
|
||||||
my ($self, $ident, $arg_ref) = @_;
|
my ($self, $ident, $arg_ref) = @_;
|
||||||
$xmlns_of{ $ident }->{ '#default' } = $self->get_xmlns()->{ '#default' };
|
$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 {
|
sub DEMOLISH {
|
||||||
@@ -87,7 +99,12 @@ sub AUTOMETHOD {
|
|||||||
return $result_ref->[0];
|
return $result_ref->[0];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
confess "$subname not found in class " . ref $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 {
|
sub init {
|
||||||
@@ -109,8 +126,8 @@ sub init {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub expand {
|
sub expand {
|
||||||
my ($self, , $qname) = @_;
|
my ($self, $qname) = @_;
|
||||||
my $ns_of = $self->get_xmlns();
|
my $ns_of = $self->namespaces();
|
||||||
if (not $qname=~m{:}xm) {
|
if (not $qname=~m{:}xm) {
|
||||||
die "un-prefixed element name <$qname> found, but no default namespace set\n"
|
die "un-prefixed element name <$qname> found, but no default namespace set\n"
|
||||||
if not defined $ns_of->{ '#default' };
|
if not defined $ns_of->{ '#default' };
|
||||||
|
|||||||
@@ -4,26 +4,36 @@ use warnings;
|
|||||||
use base 'SOAP::WSDL::Client';
|
use base 'SOAP::WSDL::Client';
|
||||||
use Scalar::Util qw(blessed);
|
use Scalar::Util qw(blessed);
|
||||||
|
|
||||||
our $VERSION = '2.00_25';
|
our $VERSION = '2.00_33';
|
||||||
|
|
||||||
sub call {
|
sub call {
|
||||||
my ($self, $method, $body, $header) = @_;
|
my ($self, $method, $body, $header) = @_;
|
||||||
|
|
||||||
|
# Treat non-objects special
|
||||||
if (not blessed $body) {
|
if (not blessed $body) {
|
||||||
|
|
||||||
|
# make sure there's something sensible in our body data
|
||||||
$body = {} if not defined $body;
|
$body = {} if not defined $body;
|
||||||
$body = ref $body eq 'ARRAY' ? $body : [ $body ];
|
$body = ref $body eq 'ARRAY' ? $body : [ $body ];
|
||||||
my $index = 0;
|
|
||||||
my @part_from;
|
my @body_from = @{ $body }; # make a copy
|
||||||
foreach my $part (@{ $body }) {
|
|
||||||
my $class = $method->{ body }->{ parts }->[$index];
|
# build list of parts as objects initialized with
|
||||||
|
# parameters given
|
||||||
|
my @part_from = ();
|
||||||
|
foreach my $class (@{ $method->{ body }->{ parts } }) {
|
||||||
eval "require $class" || die $@;
|
eval "require $class" || die $@;
|
||||||
push @part_from, $class->new($part);
|
push @part_from, $class->new(shift(@body_from) || {});
|
||||||
$index++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# it's either the first part or a list ref with all parts...
|
||||||
$body = $#part_from ? \@part_from : $part_from[0];
|
$body = $#part_from ? \@part_from : $part_from[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
# if we have a header
|
# if we have a header
|
||||||
if (%{ $method->{ header } }) {
|
if (%{ $method->{ header } }) {
|
||||||
|
|
||||||
|
# trat non object special - as above, but only for one
|
||||||
if (not blessed $header) {
|
if (not blessed $header) {
|
||||||
my $class = $method->{ header }->{ parts }->[0];
|
my $class = $method->{ header }->{ parts }->[0];
|
||||||
eval "require $class" || die $@;
|
eval "require $class" || die $@;
|
||||||
@@ -33,39 +43,6 @@ sub call {
|
|||||||
return $self->SUPER::call($method, $body, $header);
|
return $self->SUPER::call($method, $body, $header);
|
||||||
}
|
}
|
||||||
|
|
||||||
#sub __create_methods {
|
|
||||||
# my ($package, %info_of) = @_;
|
|
||||||
#
|
|
||||||
# no strict qw(refs);
|
|
||||||
# no warnings qw(redefine);
|
|
||||||
# for my $method (keys %info_of){
|
|
||||||
# my ($soap_action, @parts);
|
|
||||||
#
|
|
||||||
# # up to 2.00_10 we had list refs...
|
|
||||||
# if (ref $info_of{ $method }eq 'HASH') {
|
|
||||||
# @parts = @{ $info_of{ $method }->{ parts } };
|
|
||||||
# $soap_action = $info_of{ $method }->{ soap_action };
|
|
||||||
# }
|
|
||||||
# else {
|
|
||||||
# die "Pre-v2.00_10 Interfaces are no longer supported. Please re-generate your interface.";
|
|
||||||
# }
|
|
||||||
#
|
|
||||||
# *{ "$package\::$method" } = sub {
|
|
||||||
# my $self = shift;
|
|
||||||
# my @param = map {
|
|
||||||
# my $data = shift || {};
|
|
||||||
# eval "require $_";
|
|
||||||
# $_->new( $data );
|
|
||||||
# } @parts;
|
|
||||||
#
|
|
||||||
# return $self->SUPER::call( {
|
|
||||||
# operation => $method,
|
|
||||||
# soap_action => $soap_action,
|
|
||||||
# }, @param );
|
|
||||||
# }
|
|
||||||
# }
|
|
||||||
#}
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
@@ -101,9 +78,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 440 $
|
$Rev: 542 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: Base.pm 440 2007-12-04 22:24:33Z kutterma $
|
$Id: Base.pm 542 2008-02-18 09:38:06Z kutterma $
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -9,22 +9,22 @@ use List::Util qw(first);
|
|||||||
use Class::Std::Fast::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
our $VERSION='2.00_27';
|
our $VERSION='2.00_33';
|
||||||
|
|
||||||
my %types_of :ATTR(:name<types> :default<[]>);
|
my %types_of :ATTR(:name<types> :default<[]>);
|
||||||
my %message_of :ATTR(:name<message> :default<()>);
|
my %message_of :ATTR(:name<message> :default<[]>);
|
||||||
my %portType_of :ATTR(:name<portType> :default<()>);
|
my %portType_of :ATTR(:name<portType> :default<[]>);
|
||||||
my %binding_of :ATTR(:name<binding> :default<()>);
|
my %binding_of :ATTR(:name<binding> :default<[]>);
|
||||||
my %service_of :ATTR(:name<service> :default<()>);
|
my %service_of :ATTR(:name<service> :default<[]>);
|
||||||
my %namespace_of :ATTR(:name<namespace> :default<()>);
|
my %namespace_of :ATTR(:name<namespace> :default<()>);
|
||||||
|
|
||||||
# must be attr for Class::Std::Fast::Storable
|
# must be attr for Class::Std::Fast::Storable
|
||||||
my %attributes_of :ATTR();
|
my %attributes_of :ATTR();
|
||||||
%attributes_of = (
|
%attributes_of = (
|
||||||
binding => \%binding_of,
|
binding => \%binding_of,
|
||||||
message => \%message_of,
|
message => \%message_of,
|
||||||
portType => \%portType_of,
|
portType => \%portType_of,
|
||||||
service => \%service_of,
|
service => \%service_of,
|
||||||
);
|
);
|
||||||
|
|
||||||
# Function factory - we could be writing this method for all %attribute
|
# Function factory - we could be writing this method for all %attribute
|
||||||
@@ -118,9 +118,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 477 $
|
$Rev: 549 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: Definitions.pm 477 2007-12-24 10:23:52Z kutterma $
|
$Id: Definitions.pm 549 2008-02-20 10:14:26Z kutterma $
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Definitions.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Definitions.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -23,7 +23,8 @@ sub BUILD {
|
|||||||
sub deserialize {
|
sub deserialize {
|
||||||
my ($self, $content) = @_;
|
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 } );
|
$parser_of{ ${ $self } }->class_resolver( $class_resolver_of{ ident $self } );
|
||||||
eval { $parser_of{ ${ $self } }->parse_string( $content ) };
|
eval { $parser_of{ ${ $self } }->parse_string( $content ) };
|
||||||
if ($@) {
|
if ($@) {
|
||||||
@@ -98,9 +99,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 427 $
|
$Rev: 501 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: XSD.pm 427 2007-12-02 22:20:24Z kutterma $
|
$Id: XSD.pm 501 2008-01-26 20:23:32Z kutterma $
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/XSD.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/XSD.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -1,17 +1,73 @@
|
|||||||
package SOAP::WSDL::Expat::Base;
|
package SOAP::WSDL::Expat::Base;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
use URI;
|
||||||
use XML::Parser::Expat;
|
use XML::Parser::Expat;
|
||||||
|
|
||||||
our $VERSION = '2.00_27';
|
# TODO: convert to Class::Std::Fast based class - hash based classes suck.
|
||||||
|
|
||||||
|
our $VERSION = '2.00_32';
|
||||||
|
|
||||||
sub new {
|
sub new {
|
||||||
my ($class, $args) = @_;
|
my ($class, $arg_ref) = @_;
|
||||||
my $self = {};
|
my $self = {
|
||||||
|
data => undef,
|
||||||
|
};
|
||||||
bless $self, $class;
|
bless $self, $class;
|
||||||
|
|
||||||
|
$self->set_user_agent($arg_ref->{ user_agent })
|
||||||
|
if $arg_ref->{ user_agent };
|
||||||
|
$self->{ parsed } = $arg_ref->{ parsed } if $arg_ref->{ parsed };
|
||||||
|
|
||||||
return $self;
|
return $self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub clone {
|
||||||
|
my $self = shift;
|
||||||
|
my $class = ref $self;
|
||||||
|
my $clone = $class->new($self);
|
||||||
|
return $clone;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub set_uri { $_[0]->{ uri } = $_[1]; }
|
||||||
|
sub get_uri { return $_[0]->{ uri }; }
|
||||||
|
|
||||||
|
sub set_user_agent { $_[0]->{ user_agent } = $_[1]; }
|
||||||
|
sub get_user_agent { return $_[0]->{ user_agent }; }
|
||||||
|
|
||||||
|
sub set_parsed {
|
||||||
|
my ($self, $uri) = @_;
|
||||||
|
$self->{ parsed }->{ $uri } = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub is_parsed {
|
||||||
|
my ($self, $uri) = @_;
|
||||||
|
return exists $self->{ parsed }->{ $uri };
|
||||||
|
}
|
||||||
|
|
||||||
|
sub parse_uri {
|
||||||
|
my $self = shift;
|
||||||
|
my $uri = shift;
|
||||||
|
|
||||||
|
if ($self->is_parsed($uri)){
|
||||||
|
warn "$uri already imported. Ignoring it\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$self->set_parsed($uri);
|
||||||
|
|
||||||
|
$self->set_uri( $uri );
|
||||||
|
|
||||||
|
if (not $self->{ user_agent }) {
|
||||||
|
require LWP::UserAgent;
|
||||||
|
$self->{ user_agent } = LWP::UserAgent->new();
|
||||||
|
}
|
||||||
|
|
||||||
|
my $response = $self->{ user_agent }->get($uri);
|
||||||
|
die $response->message() if $response->code() ne '200';
|
||||||
|
return $self->parse( $response->content() );
|
||||||
|
}
|
||||||
|
|
||||||
sub parse {
|
sub parse {
|
||||||
eval {
|
eval {
|
||||||
$_[0]->_initialize( XML::Parser::Expat->new( Namespaces => 1 ) )->parse( $_[1] );
|
$_[0]->_initialize( XML::Parser::Expat->new( Namespaces => 1 ) )->parse( $_[1] );
|
||||||
|
|||||||
@@ -24,7 +24,8 @@ sub new {
|
|||||||
};
|
};
|
||||||
|
|
||||||
bless $self, $class;
|
bless $self, $class;
|
||||||
$self->load_classes() if ($args->{ class_resolver });
|
$self->load_classes() if ($args->{ class_resolver })
|
||||||
|
&& ! exists $LOADED_OF{ $self->{ class_resolver } };
|
||||||
return $self;
|
return $self;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,7 +33,8 @@ sub class_resolver {
|
|||||||
my $self = shift;
|
my $self = shift;
|
||||||
if (@_) {
|
if (@_) {
|
||||||
$self->{ class_resolver } = shift;
|
$self->{ class_resolver } = shift;
|
||||||
$self->load_classes();
|
$self->load_classes()
|
||||||
|
if ! exists $LOADED_OF{ $self->{ class_resolver } };
|
||||||
}
|
}
|
||||||
return $self->{ class_resolver };
|
return $self->{ class_resolver };
|
||||||
}
|
}
|
||||||
@@ -40,8 +42,6 @@ sub class_resolver {
|
|||||||
sub load_classes {
|
sub load_classes {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return if $LOADED_OF{ $self->{ class_resolver } };
|
|
||||||
|
|
||||||
for (values %{ $self->{ class_resolver }->get_typemap }) {
|
for (values %{ $self->{ class_resolver }->get_typemap }) {
|
||||||
no strict qw(refs);
|
no strict qw(refs);
|
||||||
my $class = $_;
|
my $class = $_;
|
||||||
@@ -117,7 +117,7 @@ sub _initialize {
|
|||||||
no strict qw(refs);
|
no strict qw(refs);
|
||||||
$parser->setHandlers(
|
$parser->setHandlers(
|
||||||
Start => sub {
|
Start => sub {
|
||||||
# my ($parser, $element, %_attrs) = @_;
|
# my ($parser, $element, %attrs) = @_;
|
||||||
|
|
||||||
$_leaf = 1; # believe we're a leaf node until we see an end
|
$_leaf = 1; # believe we're a leaf node until we see an end
|
||||||
|
|
||||||
@@ -128,7 +128,7 @@ sub _initialize {
|
|||||||
return &{$content_check{ $depth }}
|
return &{$content_check{ $depth }}
|
||||||
if exists $content_check{ $depth };
|
if exists $content_check{ $depth };
|
||||||
|
|
||||||
push @{ $path }, $_[1]; # step down in path
|
push @{ $path }, $_[1]; # step down in path
|
||||||
return if $skip; # skip inside __SKIP__
|
return if $skip; # skip inside __SKIP__
|
||||||
|
|
||||||
# resolve class of this element
|
# resolve class of this element
|
||||||
@@ -171,6 +171,9 @@ sub _initialize {
|
|||||||
$current = bless \$o, $_class;
|
$current = bless \$o, $_class;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# set attributes if there are any
|
||||||
|
$current->attr({ @_[2..$#_] }) if (@_ > 2);
|
||||||
|
|
||||||
$depth++;
|
$depth++;
|
||||||
return;
|
return;
|
||||||
},
|
},
|
||||||
@@ -292,8 +295,8 @@ the same terms as perl itself
|
|||||||
|
|
||||||
$Id: $
|
$Id: $
|
||||||
|
|
||||||
$LastChangedDate: 2007-12-24 11:23:52 +0100 (Mo, 24 Dez 2007) $
|
$LastChangedDate: 2008-03-29 22:38:55 +0100 (Sa, 29 Mrz 2008) $
|
||||||
$LastChangedRevision: 477 $
|
$LastChangedRevision: 585 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
|
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $
|
||||||
|
|||||||
@@ -5,7 +5,95 @@ use Carp;
|
|||||||
use SOAP::WSDL::TypeLookup;
|
use SOAP::WSDL::TypeLookup;
|
||||||
use base qw(SOAP::WSDL::Expat::Base);
|
use base qw(SOAP::WSDL::Expat::Base);
|
||||||
|
|
||||||
our $VERSION = q{2.00_27};
|
our $VERSION = q{2.00_32};
|
||||||
|
|
||||||
|
sub _import_children {
|
||||||
|
my ($self, $name, $imported, $importer, $import_namespace) = @_;
|
||||||
|
return if not $imported;
|
||||||
|
|
||||||
|
my $targetNamespace = $importer->get_targetNamespace();
|
||||||
|
my $push_method = "push_$name";
|
||||||
|
my $get_method = "get_$name";
|
||||||
|
no strict qw(refs);
|
||||||
|
my $value_ref = $imported->$get_method();
|
||||||
|
if ($value_ref) {
|
||||||
|
#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 {
|
sub _initialize {
|
||||||
my ($self, $parser) = @_;
|
my ($self, $parser) = @_;
|
||||||
@@ -65,7 +153,7 @@ sub _initialize {
|
|||||||
$current->init( _fixup_attrs($parser, %attrs) );
|
$current->init( _fixup_attrs($parser, %attrs) );
|
||||||
}
|
}
|
||||||
elsif ($action->{ type } eq 'METHOD') {
|
elsif ($action->{ type } eq 'METHOD') {
|
||||||
my $method = $action->{ method } || $localname;
|
my $method = $action->{ method };
|
||||||
|
|
||||||
no strict qw(refs);
|
no strict qw(refs);
|
||||||
# call method with
|
# call method with
|
||||||
@@ -81,6 +169,20 @@ sub _initialize {
|
|||||||
: _fixup_attrs($parser, %attrs)
|
: _fixup_attrs($parser, %attrs)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
elsif ($action->{type} eq 'HANDLER') {
|
||||||
|
my $method = $self->can($action->{method});
|
||||||
|
$method->($self, $current, %attrs);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
# TODO replace by hash lookup of known namespaces.
|
||||||
|
my $namespace = $parser->namespace($localname) || q{};
|
||||||
|
my $part = $namespace eq 'http://schemas.xmlsoap.org/wsdl/'
|
||||||
|
? 'WSDL 1.1'
|
||||||
|
: 'XML Schema';
|
||||||
|
|
||||||
|
warn "$part element <$localname> is not implemented yet"
|
||||||
|
if ($localname !~m{ \A (:? annotation | documentation ) \z }xms );
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
},
|
},
|
||||||
@@ -177,10 +279,10 @@ the same terms as perl itself
|
|||||||
|
|
||||||
=head1 Repository information
|
=head1 Repository information
|
||||||
|
|
||||||
$Id: $
|
$Id: WSDLParser.pm 549 2008-02-20 10:14:26Z kutterma $
|
||||||
|
|
||||||
$LastChangedDate: 2007-12-24 11:23:52 +0100 (Mo, 24 Dez 2007) $
|
$LastChangedDate: 2008-02-20 11:14:26 +0100 (Mi, 20 Feb 2008) $
|
||||||
$LastChangedRevision: 477 $
|
$LastChangedRevision: 549 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
|
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/WSDLParser.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/WSDLParser.pm $
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ sub register {
|
|||||||
|
|
||||||
sub get_deserializer {
|
sub get_deserializer {
|
||||||
my ($self, $args_of_ref) = @_;
|
my ($self, $args_of_ref) = @_;
|
||||||
|
$args_of_ref->{ soap_version } ||= '1.1';
|
||||||
# sanity check
|
# sanity check
|
||||||
die "no deserializer registered for SOAP version $args_of_ref->{ soap_version }"
|
die "no deserializer registered for SOAP version $args_of_ref->{ soap_version }"
|
||||||
if not exists ($DESERIALIZER{ $args_of_ref->{ soap_version } });
|
if not exists ($DESERIALIZER{ $args_of_ref->{ soap_version } });
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ sub register {
|
|||||||
|
|
||||||
sub get_serializer {
|
sub get_serializer {
|
||||||
my ($self, $args_of_ref) = @_;
|
my ($self, $args_of_ref) = @_;
|
||||||
|
$args_of_ref->{ soap_version } ||= '1.1';
|
||||||
# sanity check
|
# sanity check
|
||||||
die "no serializer registered for SOAP version $args_of_ref->{ soap_version }"
|
die "no serializer registered for SOAP version $args_of_ref->{ soap_version }"
|
||||||
if not exists ($SERIALIZER{ $args_of_ref->{ soap_version } });
|
if not exists ($SERIALIZER{ $args_of_ref->{ soap_version } });
|
||||||
@@ -138,9 +138,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 391 $
|
$Rev: 510 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: Serializer.pm 391 2007-11-17 21:56:13Z kutterma $
|
$Id: Serializer.pm 510 2008-01-29 08:03:46Z kutterma $
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Transport;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
our $VERSION='2.00_25';
|
our $VERSION='2.00_33';
|
||||||
|
|
||||||
# class data
|
# class data
|
||||||
my %registered_transport_of = ();
|
my %registered_transport_of = ();
|
||||||
@@ -12,7 +12,7 @@ my %registered_transport_of = ();
|
|||||||
my %SOAP_LITE_TRANSPORT_OF = (
|
my %SOAP_LITE_TRANSPORT_OF = (
|
||||||
ftp => 'SOAP::Transport::FTP',
|
ftp => 'SOAP::Transport::FTP',
|
||||||
http => 'SOAP::Transport::HTTP',
|
http => 'SOAP::Transport::HTTP',
|
||||||
https => 'SOAP::Transport::HTTPS',
|
https => 'SOAP::Transport::HTTP',
|
||||||
mailto => 'SOAP::Transport::MAILTO',
|
mailto => 'SOAP::Transport::MAILTO',
|
||||||
'local' => 'SOAP::Transport::LOCAL',
|
'local' => 'SOAP::Transport::LOCAL',
|
||||||
jabber => 'SOAP::Transport::JABBER',
|
jabber => 'SOAP::Transport::JABBER',
|
||||||
@@ -34,7 +34,7 @@ sub register {
|
|||||||
sub get_transport {
|
sub get_transport {
|
||||||
my ($class, $scheme, %attrs) = @_;
|
my ($class, $scheme, %attrs) = @_;
|
||||||
|
|
||||||
$scheme =~s{ \A ([^\:]+) \: .+ }{$1}smx;
|
$scheme =~s{ \A ([^\:]+) \: .+ }{$1}x;
|
||||||
|
|
||||||
if ($registered_transport_of{ $scheme }) {
|
if ($registered_transport_of{ $scheme }) {
|
||||||
no strict qw(refs);
|
no strict qw(refs);
|
||||||
@@ -96,12 +96,12 @@ SOAP::WSDL::Factory::Transport - Factory for retrieving transport objects
|
|||||||
# in transport class:
|
# in transport class:
|
||||||
package MyWickedTransport;
|
package MyWickedTransport;
|
||||||
use SOAP::WSDL::Factory::Transport;
|
use SOAP::WSDL::Factory::Transport;
|
||||||
|
|
||||||
# register class as transport module for httpr and https
|
# register class as transport module for httpr and https
|
||||||
# (httpr is "reliable http", a protocol developed by IBM).
|
# (httpr is "reliable http", a protocol developed by IBM).
|
||||||
SOAP::WSDL::Factory::Transport->register( 'httpr' , __PACKAGE__ );
|
SOAP::WSDL::Factory::Transport->register( 'httpr' , __PACKAGE__ );
|
||||||
SOAP::WSDL::Factory::Transport->register( 'https' , __PACKAGE__ );
|
SOAP::WSDL::Factory::Transport->register( 'https' , __PACKAGE__ );
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
SOAP::WSDL::Transport serves as factory for retrieving transport objects for
|
SOAP::WSDL::Transport serves as factory for retrieving transport objects for
|
||||||
@@ -207,10 +207,10 @@ classes in one file, and to follow this naming scheme:
|
|||||||
|
|
||||||
Module name:
|
Module name:
|
||||||
"SOAP::Transport::" . uc($scheme)
|
"SOAP::Transport::" . uc($scheme)
|
||||||
|
|
||||||
Client class (additional package in module):
|
Client class (additional package in module):
|
||||||
"SOAP::Transport::" . uc($scheme) . "::Client"
|
"SOAP::Transport::" . uc($scheme) . "::Client"
|
||||||
|
|
||||||
Server class (additional package in module):
|
Server class (additional package in module):
|
||||||
"SOAP::Transport::" . uc($scheme) . "::Client"
|
"SOAP::Transport::" . uc($scheme) . "::Client"
|
||||||
|
|
||||||
@@ -240,9 +240,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 459 $
|
$Rev: 579 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: Transport.pm 459 2007-12-16 16:00:14Z kutterma $
|
$Id: Transport.pm 579 2008-03-09 18:39:24Z kutterma $
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -0,0 +1,268 @@
|
|||||||
|
package SOAP::WSDL::Generator::Iterator::WSDL11;
|
||||||
|
use strict; use warnings;
|
||||||
|
use Class::Std::Fast;
|
||||||
|
|
||||||
|
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, but 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
|
||||||
@@ -0,0 +1,113 @@
|
|||||||
|
package SOAP::WSDL::Generator::PrefixResolver;
|
||||||
|
use strict; use warnings;
|
||||||
|
|
||||||
|
use Class::Std::Fast::Storable;
|
||||||
|
|
||||||
|
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) = @_;
|
||||||
|
return $prefix_of{ $$self }->{ $type }
|
||||||
|
if not defined($namespace);
|
||||||
|
return $namespace_prefix_map_of{ $$self }->{ $namespace }
|
||||||
|
|| ( ($namespace_map_of{ $$self }->{ $namespace })
|
||||||
|
? join ('::', $prefix_of{ $$self }->{ $type }, $namespace_map_of{ $$self }->{ $namespace })
|
||||||
|
: $prefix_of{ $$self }->{ $type }
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
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) prefis. 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.
|
||||||
|
|
||||||
|
Note that 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.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=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 strict;
|
||||||
use Template;
|
use Template;
|
||||||
use Class::Std::Fast::Storable;
|
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_33);
|
||||||
|
|
||||||
my %tt_of :ATTR(:get<tt>);
|
my %tt_of :ATTR(:get<tt>);
|
||||||
my %definitions_of :ATTR(:name<definitions> :default<()>);
|
my %definitions_of :ATTR(:name<definitions> :default<()>);
|
||||||
my %server_prefix_of :ATTR(:name<server_prefix> :default<MyServer>);
|
my %server_prefix_of :ATTR(:name<server_prefix> :default<MyServer>);
|
||||||
my %interface_prefix_of :ATTR(:name<interface_prefix> :default<MyInterfaces>);
|
my %interface_prefix_of :ATTR(:name<interface_prefix> :default<MyInterfaces>);
|
||||||
my %typemap_prefix_of :ATTR(:name<typemap_prefix> :default<MyTypemaps>);
|
my %typemap_prefix_of :ATTR(:name<typemap_prefix> :default<MyTypemaps>);
|
||||||
my %type_prefix_of :ATTR(:name<type_prefix> :default<MyTypes>);
|
my %type_prefix_of :ATTR(:name<type_prefix> :default<MyTypes>);
|
||||||
my %element_prefix_of :ATTR(:name<element_prefix> :default<MyElements>);
|
my %element_prefix_of :ATTR(:name<element_prefix> :default<MyElements>);
|
||||||
my %INCLUDE_PATH_of :ATTR(:name<INCLUDE_PATH> :default<()>);
|
my %attribute_prefix_of :ATTR(:name<attribute_prefix> :default<MyAttributes>);
|
||||||
my %EVAL_PERL_of :ATTR(:name<EVAL_PERL> :default<0>);
|
my %INCLUDE_PATH_of :ATTR(:name<INCLUDE_PATH> :default<()>);
|
||||||
my %RECURSION_of :ATTR(:name<RECURSION> :default<0>);
|
my %EVAL_PERL_of :ATTR(:name<EVAL_PERL> :default<0>);
|
||||||
my %OUTPUT_PATH_of :ATTR(:name<OUTPUT_PATH> :default<.>);
|
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 {
|
sub START {
|
||||||
my ($self, $ident, $arg_ref) = @_;
|
my ($self, $ident, $arg_ref) = @_;
|
||||||
@@ -25,29 +30,42 @@ sub _process :PROTECTED {
|
|||||||
my ($self, $template, $arg_ref, $output) = @_;
|
my ($self, $template, $arg_ref, $output) = @_;
|
||||||
my $ident = ident $self;
|
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,
|
DEBUG => 1,
|
||||||
EVAL_PERL => $EVAL_PERL_of{ $ident },
|
EVAL_PERL => $EVAL_PERL_of{ $ident },
|
||||||
RECURSION => $RECURSION_of{ $ident },
|
RECURSION => $RECURSION_of{ $ident },
|
||||||
INCLUDE_PATH => $INCLUDE_PATH_of{ $ident },
|
INCLUDE_PATH => $INCLUDE_PATH_of{ $ident },
|
||||||
OUTPUT_PATH => $OUTPUT_PATH_of{ $ident },
|
OUTPUT_PATH => $OUTPUT_PATH_of{ $ident },
|
||||||
)
|
PLUGIN_BASE => 'SOAP::WSDL::Generator::Template::Plugin',
|
||||||
if (not $tt_of{ $ident });
|
);
|
||||||
|
|
||||||
$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,
|
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 ,
|
NO_POD => delete $arg_ref->{ NO_POD } ? 1 : 0 ,
|
||||||
%{ $arg_ref }
|
%{ $arg_ref }
|
||||||
},
|
},
|
||||||
$output)
|
$output)
|
||||||
or die $INCLUDE_PATH_of{ $ident }, '\\', $template, ' ', $tt_of{ $ident }->error();
|
or croak $INCLUDE_PATH_of{ $ident }, '\\', $template, ' ', $tt->error();
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
@@ -0,0 +1,196 @@
|
|||||||
|
package SOAP::WSDL::Generator::Template::Plugin::XSD;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Carp qw(confess);
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
|
||||||
|
my %namespace_prefix_map_of :ATTR(:name<namespace_prefix_map> :default<{}>);
|
||||||
|
my %namespace_map_of :ATTR(:name<namespace_map> :default<{}>);
|
||||||
|
my %prefix_of :ATTR(:name<prefix> :default<()>);
|
||||||
|
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_namespace_map( $stash->{ context }->{ namespace_map });
|
||||||
|
# $self->set_namespace_prefix_map( $stash->{ context }->{ namespace_prefix_map });
|
||||||
|
# $self->set_prefix( $stash->{ context }->{ prefix });
|
||||||
|
$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_namespace_map( $arg_ref->{ namespace_map });
|
||||||
|
# $self->set_namespace_prefix_map( $arg_ref->{ namespace_prefix_map });
|
||||||
|
# $self->set_prefix( $arg_ref->{ prefix });
|
||||||
|
$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 _get_prefix {
|
||||||
|
# my ($self, $type, $namespace) = @_;
|
||||||
|
# return $prefix_of{ $$self }->{ $type }
|
||||||
|
# if not defined($namespace);
|
||||||
|
# return $namespace_prefix_map_of{ $$self }->{ $namespace }
|
||||||
|
# || ( ($namespace_map_of{ $$self }->{ $namespace })
|
||||||
|
# ? join ('::', $prefix_of{ $$self }->{ $type }, $namespace_map_of{ $$self }->{ $namespace })
|
||||||
|
# : $prefix_of{ $$self }->{ $type }
|
||||||
|
# );
|
||||||
|
#}
|
||||||
|
|
||||||
|
sub create_xsd_name {
|
||||||
|
my ($self,$element) = @_;
|
||||||
|
my $name = $self->_resolve_prefix($element) . '::'
|
||||||
|
. $element->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('::',
|
||||||
|
$self->_get_prefix('server', $server),
|
||||||
|
$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('::',
|
||||||
|
$self->_get_prefix('interface', $server),
|
||||||
|
$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
|
||||||
|
|
||||||
@@ -9,10 +9,11 @@ our $VERSION = q{2.00_27};
|
|||||||
|
|
||||||
use SOAP::WSDL::Generator::Visitor::Typemap;
|
use SOAP::WSDL::Generator::Visitor::Typemap;
|
||||||
use SOAP::WSDL::Generator::Visitor::Typelib;
|
use SOAP::WSDL::Generator::Visitor::Typelib;
|
||||||
|
use SOAP::WSDL::Generator::Template::Plugin::XSD;
|
||||||
use base qw(SOAP::WSDL::Generator::Template);
|
use base qw(SOAP::WSDL::Generator::Template);
|
||||||
|
|
||||||
my %output_of :ATTR(:name<output> :default<()>);
|
my %output_of :ATTR(:name<output> :default<()>);
|
||||||
my %typemap_of :ATTR(:name<typemap> :default<({})>);
|
my %typemap_of :ATTR(:name<typemap> :default<({})>);
|
||||||
|
|
||||||
sub BUILD {
|
sub BUILD {
|
||||||
my ($self, $ident, $arg_ref) = @_;
|
my ($self, $ident, $arg_ref) = @_;
|
||||||
@@ -50,89 +51,76 @@ sub generate {
|
|||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $opt = shift;
|
my $opt = shift;
|
||||||
$self->generate_typelib( $opt );
|
$self->generate_typelib( $opt );
|
||||||
# $self->generate_interface( $opt );
|
|
||||||
$self->generate_typemap( $opt );
|
$self->generate_typemap( $opt );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub generate_typelib {
|
sub generate_typelib {
|
||||||
my ($self, $arg_ref) = @_;
|
my ($self, $arg_ref) = @_;
|
||||||
# $output_of{ ident $self } = "";
|
|
||||||
my @schema = exists $arg_ref->{ schema }
|
my @schema = exists $arg_ref->{ schema }
|
||||||
? @{ $arg_ref->{schema} }
|
? @{ $arg_ref->{schema} }
|
||||||
: @{ $self->get_definitions()->first_types()->get_schema() };
|
: @{ $self->get_definitions()->first_types()->get_schema() };
|
||||||
for my $type (map { @{ $_->get_type() } , @{ $_->get_element() } } @schema[1..$#schema] ) {
|
for my $type (map {
|
||||||
|
@{ $_->get_type() } ,
|
||||||
|
@{ $_->get_element() },
|
||||||
|
@{ $_->get_attribute() }
|
||||||
|
} @schema[1..$#schema] ) {
|
||||||
$type->_accept( $self );
|
$type->_accept( $self );
|
||||||
}
|
}
|
||||||
# return $output_of{ ident $self };
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub _generate_interface {
|
||||||
|
my $self = shift;
|
||||||
|
my $arg_ref = shift;
|
||||||
|
my $template_name = delete $arg_ref->{ template_name };
|
||||||
|
my $prefix_method = delete $arg_ref->{ prefix_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->can($prefix_method)->($self),
|
||||||
|
$service->get_name(),
|
||||||
|
$port_name,
|
||||||
|
);
|
||||||
|
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 {
|
sub generate_server {
|
||||||
my $self = shift;
|
my ($self, $arg_ref) = @_;
|
||||||
my $ident = ident $self;
|
$arg_ref->{ template_name } = 'Server.tt';
|
||||||
my $arg_ref = shift;
|
$arg_ref->{ prefix_method } = 'get_server_prefix';
|
||||||
for my $service (@{ $self->get_definitions->get_service }) {
|
$self->_generate_interface($arg_ref);
|
||||||
for my $port (@{ $service->get_port() }) {
|
|
||||||
# Skip ports without (known) address
|
|
||||||
next if not $port->first_address;
|
|
||||||
next if not $port->first_address->isa('SOAP::WSDL::SOAP::Address');
|
|
||||||
|
|
||||||
my $port_name = $port->get_name;
|
|
||||||
$port_name =~s{ \A .+\. }{}xms;
|
|
||||||
my $output = $arg_ref->{ output }
|
|
||||||
? $arg_ref->{ output }
|
|
||||||
: $self->_generate_filename(
|
|
||||||
$self->get_server_prefix(),
|
|
||||||
$service->get_name(),
|
|
||||||
$port_name,
|
|
||||||
);
|
|
||||||
print "Creating interface class $output\n";
|
|
||||||
|
|
||||||
$self->_process('Server.tt',
|
|
||||||
{
|
|
||||||
service => $service,
|
|
||||||
port => $port,
|
|
||||||
NO_POD => $arg_ref->{ NO_POD } ? 1 : 0 ,
|
|
||||||
},
|
|
||||||
$output, binmode => ':utf8');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub generate_interface {
|
sub generate_client {
|
||||||
my $self = shift;
|
my ($self, $arg_ref) = @_;
|
||||||
my $ident = ident $self;
|
$arg_ref->{ template_name } = 'Interface.tt';
|
||||||
my $arg_ref = shift;
|
$arg_ref->{ prefix_method } = 'get_interface_prefix';
|
||||||
for my $service (@{ $self->get_definitions->get_service }) {
|
$self->_generate_interface($arg_ref);
|
||||||
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_interface;
|
||||||
|
*generate_interface = \&generate_client;
|
||||||
|
|
||||||
sub generate_typemap {
|
sub generate_typemap {
|
||||||
my ($self, $arg_ref) = @_;
|
my ($self, $arg_ref) = @_;
|
||||||
|
|
||||||
my $visitor = SOAP::WSDL::Generator::Visitor::Typemap->new({
|
my $visitor = SOAP::WSDL::Generator::Visitor::Typemap->new({
|
||||||
type_prefix => $self->get_type_prefix(),
|
type_prefix => $self->get_type_prefix(),
|
||||||
element_prefix => $self->get_element_prefix(),
|
element_prefix => $self->get_element_prefix(),
|
||||||
@@ -144,10 +132,35 @@ sub generate_typemap {
|
|||||||
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
%{ $typemap_of{ident $self }},
|
%{ $typemap_of{ident $self }},
|
||||||
}
|
},
|
||||||
|
resolver => 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 => {
|
||||||
|
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,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
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 }) {
|
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 }
|
my $output = $arg_ref->{ output }
|
||||||
? $arg_ref->{ output }
|
? $arg_ref->{ output }
|
||||||
: $self->_generate_filename( $self->get_typemap_prefix(), $service->get_name() );
|
: $self->_generate_filename( $self->get_typemap_prefix(), $service->get_name() );
|
||||||
@@ -171,6 +184,14 @@ sub _generate_filename :PRIVATE {
|
|||||||
return "$name.pm";
|
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_attribute_prefix(), $attribute->get_name() );
|
||||||
|
$self->_process('attribute.tt', { attribute => $attribute } , $output);
|
||||||
|
}
|
||||||
|
|
||||||
sub visit_XSD_Element {
|
sub visit_XSD_Element {
|
||||||
my ($self, $element) = @_;
|
my ($self, $element) = @_;
|
||||||
my $output = defined $output_of{ ident $self }
|
my $output = defined $output_of{ ident $self }
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
[% interface_name = interface_prefix _ '::'
|
[% USE XSD -%]
|
||||||
_ service.get_name.replace('\.', '::') _ '::'
|
[% interface_name = XSD.create_interface_name(service, port) -%]
|
||||||
_ port.get_name.replace('^.+\.','');
|
|
||||||
interface_name = interface_name.replace('-','_'); -%]
|
|
||||||
package [% interface_name %];
|
package [% interface_name %];
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
@@ -10,20 +8,20 @@ use Scalar::Util qw(blessed);
|
|||||||
use base qw(SOAP::WSDL::Client::Base);
|
use base qw(SOAP::WSDL::Client::Base);
|
||||||
|
|
||||||
# only load if it hasn't been loaded before
|
# only load if it hasn't been loaded before
|
||||||
require [% typemap_prefix %]::[% service.get_name.replace('\.', '::').replace('-', '_') %]
|
require [% XSD.create_typemap_name(service) %]
|
||||||
if not [% typemap_prefix %]::[% service.get_name.replace('\.', '::').replace('-', '_') %]->can('get_class');
|
if not [% XSD.create_typemap_name(service) %]->can('get_class');
|
||||||
|
|
||||||
sub START {
|
sub START {
|
||||||
$_[0]->set_proxy('[% port.first_address.get_location %]') if not $_[2]->{proxy};
|
$_[0]->set_proxy('[% port.first_address.get_location %]') if not $_[2]->{proxy};
|
||||||
$_[0]->set_class_resolver('[% typemap_prefix %]::[% service.get_name.replace('\.', '::').replace('-', '_') %]')
|
$_[0]->set_class_resolver('[% XSD.create_typemap_name(service) %]')
|
||||||
if not $_[2]->{class_resolver};
|
if not $_[2]->{class_resolver};
|
||||||
}
|
}
|
||||||
|
|
||||||
[% binding = definitions.find_binding( port.expand( port.get_binding ) );
|
[% binding = definitions.find_binding( port.expand( port.get_binding ) );
|
||||||
FOREACH operation = binding.get_operation;
|
FOREACH operation = binding.get_operation;
|
||||||
%][% INCLUDE Interface/Operation.tt %]
|
%][% INCLUDE Interface/Operation.tt %]
|
||||||
[%
|
|
||||||
|
|
||||||
|
[%
|
||||||
END;
|
END;
|
||||||
%]
|
%]
|
||||||
|
|
||||||
@@ -32,58 +30,62 @@ sub START {
|
|||||||
[% IF NO_POD; STOP; END %]
|
[% IF NO_POD; STOP; END %]
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||||
|
[% pod = BLOCK %]=pod[% END -%]
|
||||||
|
[% head1 = BLOCK %]=head1[% END -%]
|
||||||
|
[% head2 = BLOCK %]=head2[% END -%]
|
||||||
|
[% head3 = BLOCK %]=head3[% END -%]
|
||||||
|
|
||||||
=pod
|
[% pod %]
|
||||||
|
|
||||||
=head1 NAME
|
[% head1 %] NAME
|
||||||
|
|
||||||
[% interface_name %] - SOAP Interface for the [% service.get_name %] Web Service
|
[% interface_name %] - SOAP Interface for the [% service.get_name %] Web Service
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
[% head1 %] SYNOPSIS
|
||||||
|
|
||||||
use [% interface_name %];
|
use [% interface_name %];
|
||||||
my $interface = [% interface_name %]->new();
|
my $interface = [% interface_name %]->new();
|
||||||
|
|
||||||
my $response;
|
my $response;
|
||||||
[% FOREACH operation = binding.get_operation;
|
[% FOREACH operation = binding.get_operation;
|
||||||
%] $response = $interface->[% operation.get_name %]();
|
%] $response = $interface->[% operation.get_name %]();
|
||||||
[% END %]
|
[% END %]
|
||||||
|
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
|
||||||
|
[% head1 %] DESCRIPTION
|
||||||
|
|
||||||
SOAP Interface for the [% service.get_name %] web service
|
SOAP Interface for the [% service.get_name %] web service
|
||||||
located at [% port.first_address.get_location %].
|
located at [% port.first_address.get_location %].
|
||||||
|
|
||||||
=head1 SERVICE [% service.get_name %]
|
[% head1 %] SERVICE [% service.get_name %]
|
||||||
|
|
||||||
[% service.get_documentation %]
|
[% service.get_documentation %]
|
||||||
|
|
||||||
=head2 Port [% port.get_name %]
|
[% head2 %] Port [% port.get_name %]
|
||||||
|
|
||||||
[% port.get_documentation %]
|
[% port.get_documentation %]
|
||||||
|
|
||||||
=head1 METHODS
|
[% head1 %] METHODS
|
||||||
|
|
||||||
=head2 General methods
|
[% head2 %] General methods
|
||||||
|
|
||||||
=head3 new
|
[% head3 %] new
|
||||||
|
|
||||||
Constructor.
|
Constructor.
|
||||||
|
|
||||||
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
|
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
|
||||||
|
|
||||||
=head2 SOAP Service methods
|
[% head2 %] SOAP Service methods
|
||||||
|
|
||||||
[% INCLUDE Interface/POD/method_info.tt %]
|
[% INCLUDE Interface/POD/method_info.tt %]
|
||||||
|
|
||||||
|
|
||||||
[% FOREACH operation = binding.get_operation;
|
[% FOREACH operation = binding.get_operation;
|
||||||
%][% INCLUDE Interface/POD/Operation.tt %]
|
%][% INCLUDE Interface/POD/Operation.tt %]
|
||||||
[% END %]
|
[% END %]
|
||||||
|
|
||||||
=head1 AUTHOR
|
[% head1 %] AUTHOR
|
||||||
|
|
||||||
Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %]
|
Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %]
|
||||||
|
|
||||||
=pod
|
=cut
|
||||||
@@ -1,14 +1,12 @@
|
|||||||
[% RETURN IF NOT item;
|
[% RETURN IF NOT item;
|
||||||
type = definitions.find_portType( binding.expand( binding.get_type ) );
|
type = definitions.find_portType( binding.expand( binding.get_type ) );
|
||||||
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
|
port_op = type.find_operation( type.get_targetNamespace, operation.get_name );
|
||||||
message = definitions.find_message( port_op.first_input.expand( port_op.first_input.get_message ) );
|
message = definitions.find_message( port_op.first_input.expand( port_op.first_input.get_message ) );
|
||||||
part_from = message.get_part;
|
part_from = message.get_part;
|
||||||
PERL %]
|
PERL %]
|
||||||
my $item = $stash->{ item };
|
my $item = $stash->{ item };
|
||||||
my $def = $stash->{ definitions };
|
my $def = $stash->{ definitions };
|
||||||
my $part_from = $stash->{ part_from };
|
my $part_from = $stash->{ message }->get_part();
|
||||||
my $type_prefix = $stash->{ type_prefix };
|
|
||||||
my $element_prefix = $stash->{ element_prefix };
|
|
||||||
|
|
||||||
my @body_part_from = split m{\s}, $item->get_parts;
|
my @body_part_from = split m{\s}, $item->get_parts;
|
||||||
|
|
||||||
@@ -25,14 +23,17 @@
|
|||||||
my $name;
|
my $name;
|
||||||
($name = $part->get_element)
|
($name = $part->get_element)
|
||||||
? do {
|
? do {
|
||||||
$name =~s{ ^[^:]+: }{}xms;
|
my $element = $def->first_types->find_element($part->expand($name));
|
||||||
$element_prefix . '::' . $name;
|
my $resolver = $context->plugin('XSD');
|
||||||
}
|
$resolver->create_xsd_name($element);
|
||||||
|
|
||||||
|
}
|
||||||
: ($name = $part->get_type)
|
: ($name = $part->get_type)
|
||||||
? do {
|
? do {
|
||||||
$name =~s{ ^[^:]+: }{}xms;
|
my $element = $def->first_types->find_type($part->expand($name));
|
||||||
$type_prefix . '::' . $name;
|
my $resolver = $context->plugin('XSD');
|
||||||
}
|
$resolver->create_xsd_name($element);
|
||||||
|
}
|
||||||
: die "input must have either type or element"
|
: die "input must have either type or element"
|
||||||
}
|
}
|
||||||
: ()
|
: ()
|
||||||
@@ -44,13 +45,15 @@
|
|||||||
my $name;
|
my $name;
|
||||||
($name = $part->get_element)
|
($name = $part->get_element)
|
||||||
? do {
|
? do {
|
||||||
$name =~s{ ^[^:]+: }{}xms;
|
my $element = $def->first_types->find_element($part->expand($name));
|
||||||
"$element_prefix\::$name"
|
my $resolver = $context->plugin('XSD');
|
||||||
}
|
$resolver->create_xsd_name($element);
|
||||||
|
}
|
||||||
: ($name = $part->get_type)
|
: ($name = $part->get_type)
|
||||||
? do {
|
? do {
|
||||||
$name =~s{ ^[^:]+: }{}xms;
|
my $element = $def->first_types->find_type($part->expand($name));
|
||||||
"$type_prefix\::$name"
|
my $resolver = $context->plugin('XSD');
|
||||||
|
$resolver->create_xsd_name($element);
|
||||||
}
|
}
|
||||||
: die "input must have either type or element";
|
: die "input must have either type or element";
|
||||||
} @{ $part_from };
|
} @{ $part_from };
|
||||||
@@ -63,7 +66,10 @@
|
|||||||
$stash->{ parts } = \@parts;
|
$stash->{ parts } = \@parts;
|
||||||
|
|
||||||
[% END %]
|
[% END %]
|
||||||
'use' => '[% item.get_use %]',
|
[% IF item.get_use != 'literal';
|
||||||
namespace => '[% item.get_namespace %]',
|
THROW NOT_SUPPORTED "Body: SOAP::WSDL supports literal encoding only - ${ item.get_use } found";
|
||||||
encodingStyle => '[% item.get_encodingStyle %]',
|
END %]
|
||||||
parts => [qw( [% parts.join(' ') %] )],
|
'use' => '[% item.get_use %]',
|
||||||
|
namespace => '[% item.get_namespace %]',
|
||||||
|
encodingStyle => '[% item.get_encodingStyle %]',
|
||||||
|
parts => [qw( [% parts.join(' ') %] )],
|
||||||
@@ -19,19 +19,25 @@
|
|||||||
my $name;
|
my $name;
|
||||||
($name = $part->get_element)
|
($name = $part->get_element)
|
||||||
? do {
|
? do {
|
||||||
$name =~s{ ^[^:]+: }{}xms;
|
my $element = $def->first_types->find_element($part->expand($name));
|
||||||
$element_prefix . '::' . $name;
|
my $resolver = $context->plugin('XSD');
|
||||||
|
$resolver->create_xsd_name($element);
|
||||||
}
|
}
|
||||||
: ($name = $part->get_type)
|
: ($name = $part->get_type)
|
||||||
? do {
|
? do {
|
||||||
$name =~s{ ^[^:]+: }{}xms;
|
my $element = $def->first_types->find_type($part->expand($name));
|
||||||
$type_prefix . '::' . $name;
|
my $resolver = $context->plugin('XSD');
|
||||||
}
|
$resolver->create_xsd_name($element);
|
||||||
|
}
|
||||||
: die "input must have either type or element"
|
: die "input must have either type or element"
|
||||||
};
|
};
|
||||||
$stash->{ part_class } = $part_class;
|
$stash->{ part_class } = $part_class;
|
||||||
[% END;
|
[% 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 %]',
|
'use' => '[% item.get_use %]',
|
||||||
namespace => '[% item.get_namespace %]',
|
namespace => '[% item.get_namespace %]',
|
||||||
encodingStyle => '[% item.get_encodingStyle %]',
|
encodingStyle => '[% item.get_encodingStyle %]',
|
||||||
|
|||||||
@@ -4,7 +4,12 @@ sub [% operation.get_name %] {
|
|||||||
return $self->SUPER::call({
|
return $self->SUPER::call({
|
||||||
operation => '[% operation.get_name %]',
|
operation => '[% operation.get_name %]',
|
||||||
soap_action => '[% operation.first_operation.get_soapAction %]',
|
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 => {
|
body => {
|
||||||
[% INCLUDE Interface/Body.tt( item = operation.first_input.first_body ); %]
|
[% INCLUDE Interface/Body.tt( item = operation.first_input.first_body ); %]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
=head3 [% operation.get_name %]
|
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||||
|
[% head3 = BLOCK %]=head3[% END -%]
|
||||||
|
[% head3 %] [% operation.get_name %]
|
||||||
|
|
||||||
[% type = definitions.find_portType( binding.expand( binding.get_type ) );
|
[% type = definitions.find_portType( binding.expand( binding.get_type ) );
|
||||||
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
|
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
|
||||||
|
|||||||
@@ -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
|
You may pass any combination of objects, hash and list refs to these
|
||||||
methods, as long as you meet the structure.
|
methods, as long as you meet the structure.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
[% node.get_annotation.0.get_documentation %]
|
||||||
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
[% server_name = server_prefix _ '::'
|
[% USE XSD;
|
||||||
_ service.get_name.replace('\.', '::') _ '::'
|
server_name = XSD.create_server_name(service, port);
|
||||||
_ port.get_name.replace('^.+\.','');
|
-%]
|
||||||
server_name = server_name.replace('-','_'); -%]
|
|
||||||
package [% server_name %];
|
package [% server_name %];
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
@@ -10,8 +9,8 @@ use Scalar::Util qw(blessed);
|
|||||||
use base qw(SOAP::WSDL::Client::Base);
|
use base qw(SOAP::WSDL::Client::Base);
|
||||||
|
|
||||||
# only load if it hasn't been loaded before
|
# only load if it hasn't been loaded before
|
||||||
require [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]
|
require [% XSD.create_typemap_name(service) %]
|
||||||
if not [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]->can('get_class');
|
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_class_of :ATTR(:name<transport_class> :default<SOAP::WSDL::Server::CGI>);
|
||||||
my %transport_of :ATTR(:name<transport> :default<()>);
|
my %transport_of :ATTR(:name<transport> :default<()>);
|
||||||
@@ -31,13 +30,13 @@ sub START {
|
|||||||
or die "Cannot load transport class $transport_class_of{ $ident }: $@";
|
or die "Cannot load transport class $transport_class_of{ $ident }: $@";
|
||||||
$transport_of{ $ident } = $transport_class_of{ $ident }->new({
|
$transport_of{ $ident } = $transport_class_of{ $ident }->new({
|
||||||
action_map_ref => $action_map_ref,
|
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 },
|
dispatch_to => $dispatch_to{ $ident },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
sub handle {
|
sub handle {
|
||||||
$transport_of{ ${ $_[0] } }->handle();
|
$transport_of{ ${ shift @_ } }->handle(@_);
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
@@ -45,14 +44,19 @@ sub handle {
|
|||||||
[% IF NO_POD; STOP; END %]
|
[% IF NO_POD; STOP; END %]
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||||
|
[% pod = BLOCK %]=pod[% END -%]
|
||||||
|
[% head1 = BLOCK %]=head1[% END -%]
|
||||||
|
[% head2 = BLOCK %]=head2[% END -%]
|
||||||
|
[% head3 = BLOCK %]=head3[% END -%]
|
||||||
|
|
||||||
=pod
|
[% pod %]
|
||||||
|
|
||||||
=head1 NAME
|
[% head1 %] NAME
|
||||||
|
|
||||||
[% server_name %] - 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_name %];
|
use [% server_name %];
|
||||||
my $server = [% server_name %]->new({
|
my $server = [% server_name %]->new({
|
||||||
@@ -62,31 +66,31 @@ __END__
|
|||||||
$server->handle();
|
$server->handle();
|
||||||
|
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
[% head1 %] DESCRIPTION
|
||||||
|
|
||||||
SOAP Server handler for the [% service.get_name %] web service
|
SOAP Server handler for the [% service.get_name %] web service
|
||||||
located at [% port.first_address.get_location %].
|
located at [% port.first_address.get_location %].
|
||||||
|
|
||||||
=head1 SERVICE [% service.get_name %]
|
[% head1 %] SERVICE [% service.get_name %]
|
||||||
|
|
||||||
[% service.get_documentation %]
|
[% service.get_documentation %]
|
||||||
|
|
||||||
=head2 Port [% port.get_name %]
|
[% head2 %] Port [% port.get_name %]
|
||||||
|
|
||||||
[% port.get_documentation %]
|
[% port.get_documentation %]
|
||||||
|
|
||||||
=head1 METHODS
|
[% head1 %] METHODS
|
||||||
|
|
||||||
=head2 General methods
|
[% head2 %] General methods
|
||||||
|
|
||||||
=head3 new
|
[% head3 %] new
|
||||||
|
|
||||||
Constructor.
|
Constructor.
|
||||||
|
|
||||||
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.
|
implementing the SOAP Service methods listed below.
|
||||||
|
|
||||||
=head2 SOAP Service methods
|
[% head2 %] SOAP Service methods
|
||||||
|
|
||||||
[% INCLUDE Server/POD/method_info.tt %]
|
[% INCLUDE Server/POD/method_info.tt %]
|
||||||
|
|
||||||
@@ -94,7 +98,7 @@ implementing the SOAP Service methods listed below.
|
|||||||
%][% INCLUDE Server/POD/Operation.tt %]
|
%][% INCLUDE Server/POD/Operation.tt %]
|
||||||
[% END %]
|
[% END %]
|
||||||
|
|
||||||
=head1 AUTHOR
|
[% head1 %] AUTHOR
|
||||||
|
|
||||||
Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %]
|
Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %]
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
=head3 [% operation.get_name %]
|
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||||
|
[% head3 = BLOCK %]=head3[% END -%]
|
||||||
|
|
||||||
|
[% head3 %] [% operation.get_name %]
|
||||||
|
|
||||||
[% type = definitions.find_portType( binding.expand( binding.get_type ) );
|
[% type = definitions.find_portType( binding.expand( binding.get_type ) );
|
||||||
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
|
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
#element;
|
#element;
|
||||||
#STOP;
|
#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(
|
type = element.first_complexType || element.first_simpleType || definitions.first_types.find_type(
|
||||||
element.expand( element.get_type ) );
|
element.expand( element.get_type ) );
|
||||||
INCLUDE Interface/POD/Type.tt; %]
|
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 strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
@@ -18,13 +19,18 @@ sub get_typemap {
|
|||||||
|
|
||||||
__END__
|
__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('\.','::').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.
|
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 -%]
|
|
||||||
@@ -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.replace('\.','::').replace('-','_') %];
|
[% USE XSD -%]
|
||||||
|
package [% XSD.create_xsd_name(complexType) %];
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
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;
|
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.replace('\.','::').replace('-','_') %]
|
[% 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 %].
|
[% 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
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
methods:
|
methods:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
[% FOREACH element = complexType.get_element -%]
|
[% 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 %]
|
[% END %]
|
||||||
|
|
||||||
=head1 METHODS
|
=back
|
||||||
|
|
||||||
=head2 new
|
[% END -%]
|
||||||
|
|
||||||
|
[% head1 %] METHODS
|
||||||
|
|
||||||
|
[% head2 %] new
|
||||||
|
|
||||||
Constructor. The following data structure may be passed to new():
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
[% indent = ' '; INCLUDE complexType/POD/structure.tt %]
|
[% indent = ' '; INCLUDE complexType/POD/structure.tt %]
|
||||||
|
|
||||||
=head1 AUTHOR
|
[% INCLUDE complexType/POD/attributeSet.tt %]
|
||||||
|
|
||||||
|
[% head1 %] AUTHOR
|
||||||
|
|
||||||
Generated by SOAP::WSDL
|
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 _ ' ';
|
[%- indent = indent _ ' ';
|
||||||
FOREACH element = complexType.get_element %]
|
FOREACH element = complexType.get_element %]
|
||||||
[% indent %][% element.get_name %] => [% INCLUDE element/POD/structure.tt -%]
|
[% indent %][% element.get_name %] => [% INCLUDE element/POD/structure.tt -%]
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
[% 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 -%]
|
||||||
|
=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 %]{
|
[% indent %]{
|
||||||
[%- IF complexType.get_name %] # [% type_prefix %]::[% complexType.get_name %][% END %]
|
[%- IF complexType.get_name %] # [% XSD.create_xsd_name(complexType) %][% END %]
|
||||||
[%- indent = indent _ ' ' %]
|
[%- indent = indent _ ' ' %]
|
||||||
[% indent %]# One of the following elements.
|
[% indent %]# One of the following elements.
|
||||||
[% indent %]# No occurance checks yet, so be sure to pass just one...
|
[% indent %]# No occurance checks yet, so be sure to pass just one...
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
[% IF (complexType.get_variety == 'restriction');
|
[% IF (complexType.get_variety == 'restriction');
|
||||||
INCLUDE complexType/POD/restriction.tt(complexType = complexType);
|
INCLUDE complexType/POD/restriction.tt(complexType = complexType);
|
||||||
ELSIF (complexType.get_variety == 'sequence');
|
ELSIF (complexType.get_variety == 'extension');
|
||||||
THROW NOT_IMPLEMENTED, "${ complexType.get_name } - complexType complexContent extension not implemented yet";
|
#THROW NOT_IMPLEMENTED, "${ complexType.get_name } - complexType complexContent extension not implemented yet";
|
||||||
|
%]
|
||||||
|
# No documentation generated for complexContent / extension yet
|
||||||
|
[%
|
||||||
ELSE;
|
ELSE;
|
||||||
THROW UNKNOWN, "unknown variety ${ complexType.get_variety }";
|
THROW UNKNOWN, "unknown variety ${ complexType.get_variety }";
|
||||||
END;
|
END;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[% indent %]{
|
[% indent %]{
|
||||||
[%- IF complexType.get_name %] # [% type_prefix %]::[% complexType.get_name %][% END %]
|
[%- IF complexType.get_name %] # [% XSD.create_xsd_name(complexType) %][% END %]
|
||||||
[%- indent = indent _ ' ';
|
[%- indent = indent _ ' ';
|
||||||
FOREACH element = complexType.get_element %]
|
FOREACH element = complexType.get_element %]
|
||||||
[% indent %][% element.get_name %] => [% INCLUDE element/POD/structure.tt -%]
|
[% 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;
|
||||||
|
|
||||||
|
%]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# No documentation generated for simpleContent / extension yet
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
{
|
||||||
|
value => $some_value, # simple perl scalar. See below for restrictions
|
||||||
|
}
|
||||||
|
|
||||||
|
NOTE: This type is derived by restriction as complexType with simpleContent.
|
||||||
|
Documentation generation for this derivation method is experimental and may
|
||||||
|
be erroneous/incomplete.
|
||||||
|
|
||||||
|
This clase is derived from [%-
|
||||||
|
IF (name = complexType.get_base);
|
||||||
|
# type_name = complexType.expand( name );
|
||||||
|
-%]
|
||||||
|
[% XSD.create_xsd_name(complexType) %]
|
||||||
|
[% ELSE;
|
||||||
|
%] an atomic base type. Unfortunately there's no documentation generated
|
||||||
|
on atomic base types' base type yet.[%
|
||||||
|
END -%]
|
||||||
|
|
||||||
|
SOAP::WSDL's schema implementation does not validate data yet - however, the
|
||||||
|
following restrictions apply for this type's value:
|
||||||
|
|
||||||
|
[%- FOREACH facet = [
|
||||||
|
'length',
|
||||||
|
'minLength',
|
||||||
|
'maxLength',
|
||||||
|
'totalDigits',
|
||||||
|
'fractionDigits',
|
||||||
|
'minInclusive',
|
||||||
|
'maxInclusive',
|
||||||
|
'minExclusive',
|
||||||
|
'maxExclusive',
|
||||||
|
'pattern',
|
||||||
|
'enumeration'
|
||||||
|
];
|
||||||
|
IF (facet_method = complexType.can( "get_" _ facet ));
|
||||||
|
facet_value = facet_method( complexType );
|
||||||
|
IF (facet_value.size());
|
||||||
|
%]
|
||||||
|
[% IF (facet == 'enumeration');
|
||||||
|
%]valid values (enumeration)
|
||||||
|
[%- ELSE;
|
||||||
|
facet;
|
||||||
|
END -%]:[% FOREACH value = facet_value %] [% value.get_value; END -%]
|
||||||
|
[% END;
|
||||||
|
END;
|
||||||
|
END %]
|
||||||
@@ -7,7 +7,7 @@ ELSIF (complexType.get_variety == 'group');
|
|||||||
ELSIF (complexType.get_variety == 'choice');
|
ELSIF (complexType.get_variety == 'choice');
|
||||||
INCLUDE complexType/POD/choice.tt(complexType = complexType);
|
INCLUDE complexType/POD/choice.tt(complexType = complexType);
|
||||||
ELSIF (complexType.get_contentModel == 'simpleContent');
|
ELSIF (complexType.get_contentModel == 'simpleContent');
|
||||||
THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType simpleContent not implemented yet";
|
INCLUDE complexType/POD/structure/simpleContent.tt(complexType = complexType);
|
||||||
ELSIF (complexType.get_contentModel == 'complexContent');
|
ELSIF (complexType.get_contentModel == 'complexContent');
|
||||||
INCLUDE complexType/POD/complexContent.tt(complexType = complexType);
|
INCLUDE complexType/POD/complexContent.tt(complexType = complexType);
|
||||||
END %],
|
END -%],
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
[%- 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 -%]
|
||||||
|
[% END %]
|
||||||
|
[% indent.replace('\s{2}$', ''); %]}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{ value => $some_value }
|
||||||
@@ -8,7 +8,7 @@ Class::Std::initialize();
|
|||||||
atomic_types = {};
|
atomic_types = {};
|
||||||
|
|
||||||
FOREACH element = complexType.get_element %]
|
FOREACH element = complexType.get_element %]
|
||||||
my %[% element.get_name %]_of :ATTR(:get<[% element.get_name %]>);
|
my %[% XSD.perl_name(element.get_name) %]_of :ATTR(:get<[% XSD.perl_name(element.get_name) %]>);
|
||||||
[%- END %]
|
[%- END %]
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
__PACKAGE__->_factory(
|
||||||
@@ -18,27 +18,23 @@ __PACKAGE__->_factory(
|
|||||||
) ],
|
) ],
|
||||||
{
|
{
|
||||||
[% FOREACH element = complexType.get_element -%]
|
[% FOREACH element = complexType.get_element -%]
|
||||||
[% element.get_name %] => \%[% element.get_name %]_of,
|
'[% element.get_name %]' => \%[% XSD.perl_name(element.get_name) %]_of,
|
||||||
[% END -%]
|
[% END -%]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
[% FOREACH element = complexType.get_element;
|
[% FOREACH element = complexType.get_element;
|
||||||
IF (type = element.get_type);
|
IF (type = element.get_type);
|
||||||
element_type = complexType.expand( type );
|
element_type = definitions.first_types.find_type(complexType.expand( type )); -%]
|
||||||
IF (element_type.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
|
'[% element.get_name %]' => '[% XSD.create_xsd_name(element_type) %]',
|
||||||
[% element.get_name %] => 'SOAP::WSDL::XSD::Typelib::Builtin::[% element_type.1 %]',
|
[% ELSE;
|
||||||
[% ELSE -%]
|
|
||||||
[% element.get_name %] => '[% type_prefix %]::[% element_type.1 %]',
|
|
||||||
[% END;
|
|
||||||
ELSE;
|
|
||||||
IF (element.first_simpleType);
|
IF (element.first_simpleType);
|
||||||
atomic_types.${ element.get_name } = element.first_simpleType;
|
atomic_types.${ element.get_name } = element.first_simpleType;
|
||||||
ELSIF (element.first_complexType);
|
ELSIF (element.first_complexType);
|
||||||
atomic_types.${ element.get_name } = element.first_complexType;
|
atomic_types.${ element.get_name } = element.first_complexType;
|
||||||
ELSE;
|
ELSE;
|
||||||
THROW NOT_IMPLEMENTED , "Neither simple nor complex atomic type - don't know what to do with it";
|
THROW NOT_IMPLEMENTED , "Neither simple nor complex atomic type for element ${ element.get_name } - don't know what to do with it";
|
||||||
END; %]
|
END; %]
|
||||||
[% element.get_name %] => '[% type_prefix %]::[% complexType.get_name %]::_[% element.get_name %]',
|
'[% element.get_name %]' => '[% XSD.create_subpackage_name({ value => element }) %]',
|
||||||
[% END;
|
[% END;
|
||||||
END -%]
|
END -%]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
[% FOREACH type IN atomic_types; %]
|
[% FOREACH type IN atomic_types; %]
|
||||||
|
[%# TODO generate name create_name method %]
|
||||||
package [% type_prefix %]::[% complexType.get_name %]::_[% type.key %];
|
package [% XSD.create_subpackage_name(type); %];
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
[% IF (complexType.get_attribute.size) -%]
|
||||||
|
package [% XSD.create_xmlattr_name(complexType) %];
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::AttributeSet);
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
[% FOREACH element = complexType.get_attribute %]
|
||||||
|
my %[% element.get_name %]_of :ATTR(:get<[% element.get_name %]>);
|
||||||
|
[%- END %]
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
[%- FOREACH element = complexType.get_attribute %]
|
||||||
|
[% element.get_name -%]
|
||||||
|
[% END %]
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
[% FOREACH element = complexType.get_attribute -%]
|
||||||
|
[% element.get_name %] => \%[% element.get_name %]_of,
|
||||||
|
[% END -%]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
[% FOREACH element = complexType.get_attribute;
|
||||||
|
IF (type = element.get_type);
|
||||||
|
element_type = definitions.first_types.find_type(complexType.expand( type ));
|
||||||
|
-%]
|
||||||
|
[% element.get_name %] => '[% XSD.create_xsd_name(element_type) %]',
|
||||||
|
[%
|
||||||
|
ELSIF (ref = element.get_ref);
|
||||||
|
attribute = definitions.first_types.find_attribute( complexType.expand(ref) );
|
||||||
|
# element_type = definitions.get_types.0.find_type(complexType.expand( attribute.get_type ));
|
||||||
|
%]
|
||||||
|
[% attribute.get_name %] => '[% XSD.create_xsd_name(attribute) %]',
|
||||||
|
[% ELSIF (element.first_simpleType);
|
||||||
|
THROW NOT_IMPLEMENTED , "Attributes with atomic simpleType definition are not implemented yet";
|
||||||
|
atomic_types.${ element.get_name } = element.first_simpleType;
|
||||||
|
ELSE;
|
||||||
|
THROW NOT_IMPLEMENTED , "Neither simple nor complex atomic type for attribute ${ element.get_name } in ${ complexType.get_name } - don't know what to do with it";
|
||||||
|
END;
|
||||||
|
END -%]
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
[% END %]
|
||||||
@@ -2,6 +2,8 @@
|
|||||||
INCLUDE complexType/restriction.tt(complexType = complexType);
|
INCLUDE complexType/restriction.tt(complexType = complexType);
|
||||||
ELSIF (complexType.get_variety == 'sequence');
|
ELSIF (complexType.get_variety == 'sequence');
|
||||||
INCLUDE complexType/extension.tt(complexType = complexType);
|
INCLUDE complexType/extension.tt(complexType = complexType);
|
||||||
|
ELSIF (complexType.get_variety == 'all');
|
||||||
|
INCLUDE complexType/extension.tt(complexType = complexType);
|
||||||
ELSE;
|
ELSE;
|
||||||
THROW UNKNOWN, "unknown variety ${ complexType.get_variety }";
|
THROW UNKNOWN, "unknown variety ${ complexType.get_variety }";
|
||||||
END;
|
END;
|
||||||
|
|||||||
@@ -1,7 +1,19 @@
|
|||||||
|
[% IF (complexType.get_attribute.size) -%]
|
||||||
|
our $XML_ATTRIBUTE_CLASS = '[% XSD.create_xmlattr_name(complexType) %]';
|
||||||
|
[% ELSE -%]
|
||||||
|
our $XML_ATTRIBUTE_CLASS;
|
||||||
|
undef $XML_ATTRIBUTE_CLASS;
|
||||||
|
[% END %]
|
||||||
|
sub __get_attr_class {
|
||||||
|
return $XML_ATTRIBUTE_CLASS;
|
||||||
|
}
|
||||||
|
|
||||||
[% IF (complexType.get_contentModel == 'simpleContent');
|
[% IF (complexType.get_contentModel == 'simpleContent');
|
||||||
THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType simpleContent not implemented yet";
|
INCLUDE complexType/simpleContent.tt(complexType = complexType);
|
||||||
ELSIF (complexType.get_contentModel == 'complexContent');
|
ELSIF (complexType.get_contentModel == 'complexContent');
|
||||||
INCLUDE complexType/complexContent.tt(complexType = complexType);
|
INCLUDE complexType/complexContent.tt(complexType = complexType);
|
||||||
ELSE;
|
ELSE;
|
||||||
INCLUDE complexType/variety.tt(complexType = complexType);
|
INCLUDE complexType/variety.tt(complexType = complexType);
|
||||||
END %]
|
END -%]
|
||||||
|
|
||||||
|
[% INCLUDE complexType/attributeSet.tt %]
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ END;
|
|||||||
complexType.set_element( element_list );
|
complexType.set_element( element_list );
|
||||||
|
|
||||||
-%]
|
-%]
|
||||||
use base qw([% type_prefix %]::[% base_name.1.replace('\.', '::') %]);
|
use base qw([% XSD.create_xsd_name( base_type ) %]);
|
||||||
[%
|
[%
|
||||||
|
|
||||||
INCLUDE complexType/variety.tt(complexType = complexType);
|
INCLUDE complexType/variety.tt(complexType = complexType);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[% IF (base=complexType.get_base);
|
[% IF (base=complexType.get_base);
|
||||||
base_name=complexType.expand(base);
|
base_type=definitions.get_types.0.find_type(complexType.expand(base));
|
||||||
-%]
|
-%]
|
||||||
use base qw([% type_prefix %]::[% base_name.1.replace('\.', '::') %]);
|
use base qw([% XSD.create_xsd_type(base_type) %]);
|
||||||
[%
|
[%
|
||||||
ELSE;
|
ELSE;
|
||||||
THROW NOT_IMPLEMENTED, "restriction without base not supported";
|
THROW NOT_IMPLEMENTED, "restriction without base not supported";
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
[% IF (complexType.get_variety == 'restriction');
|
||||||
|
INCLUDE complexType/restriction.tt(complexType = complexType);
|
||||||
|
ELSIF (complexType.get_variety == 'extension');
|
||||||
|
INCLUDE complexType/simpleContent/extension.tt(complexType = complexType);
|
||||||
|
# THROW NOT_IMPLEMENTED, "${ complexType.get_name } - complexType simpleContent extension not implemented yet";
|
||||||
|
ELSE;
|
||||||
|
THROW UNKNOWN, "unknown variety ${ complexType.get_variety } in complexType name='${complexType.get_name}'";
|
||||||
|
END;
|
||||||
|
%]
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
[% IF (base=complexType.get_base);
|
||||||
|
base_type=definitions.get_types.0.find_type(complexType.expand(base));
|
||||||
|
-%]
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
[% XSD.create_xsd_name(base_type) %]
|
||||||
|
);
|
||||||
|
[%
|
||||||
|
ELSE;
|
||||||
|
THROW NOT_IMPLEMENTED, "extension without base not supported";
|
||||||
|
END %]
|
||||||
@@ -9,7 +9,12 @@ ELSIF (complexType.get_variety == 'choice');
|
|||||||
INCLUDE complexType/all.tt(complexType = complexType);
|
INCLUDE complexType/all.tt(complexType = complexType);
|
||||||
ELSIF (complexType.get_variety);
|
ELSIF (complexType.get_variety);
|
||||||
THROW NOT_IMPLEMENTED, "Unknown variety ${ complexType.get_variety } in ${ complexType.get_name } (${ element.get_name })";
|
THROW NOT_IMPLEMENTED, "Unknown variety ${ complexType.get_variety } in ${ complexType.get_name } (${ element.get_name })";
|
||||||
ELSE;
|
ELSE %]
|
||||||
# There's no variety - might be empty complexType
|
|
||||||
END;
|
# There's no variety - empty complexType
|
||||||
%]
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory();
|
||||||
|
|
||||||
|
[% END %]
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
package [% element_prefix %]::[% element.get_name.replace('\.','::') %];
|
[% USE XSD(context) %]
|
||||||
|
package [% XSD.create_xsd_name(element) %];
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
@@ -12,58 +13,77 @@ __PACKAGE__->__set_minOccurs([% element.get_minOccurs %]);
|
|||||||
__PACKAGE__->__set_maxOccurs([% element.get_maxOccurs %]);
|
__PACKAGE__->__set_maxOccurs([% element.get_maxOccurs %]);
|
||||||
__PACKAGE__->__set_ref([% IF element.get_ref; %]'[% element.get_ref %]'[% END %]);
|
__PACKAGE__->__set_ref([% IF element.get_ref; %]'[% element.get_ref %]'[% END %]);
|
||||||
|
|
||||||
[%- IF (type = element.get_type); -%]
|
[%- IF (type_name = element.get_type); -%]
|
||||||
use base qw(
|
use base qw(
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
[% INCLUDE _type_class.tt( type = type, node = element ) %]
|
[% type = definitions.get_types.0.find_type(element.expand(type_name));
|
||||||
|
XSD.create_xsd_name(type) %]
|
||||||
);
|
);
|
||||||
[%- ELSIF (ref = element.get_ref); -%]
|
|
||||||
|
}
|
||||||
|
[%- ELSIF (ref = element.get_ref);
|
||||||
|
ref_from = ref.split(':');
|
||||||
|
-%]
|
||||||
# element ref="[% ref %]"
|
# element ref="[% ref %]"
|
||||||
use base qw(
|
use base qw(
|
||||||
[% element_prefix %]::[% ref.split(':').1 %]
|
[% ref_element = definitions.get_types.0.find_element(element.expand(ref));
|
||||||
|
XSD.create_xsd_name( ref_element ); %]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
}
|
||||||
[%- ELSIF (simpleType = element.first_simpleType) %]
|
[%- ELSIF (simpleType = element.first_simpleType) %]
|
||||||
# atomic simpleType: <element><simpleType
|
# atomic simpleType: <element><simpleType
|
||||||
use base qw(
|
use base qw(
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
);
|
);
|
||||||
[% INCLUDE simpleType/contentModel.tt %]
|
[% INCLUDE simpleType/contentModel.tt -%]
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
[% ELSIF (complexType = element.first_complexType) %]
|
[% ELSIF (complexType = element.first_complexType) %]
|
||||||
use base qw(
|
use base qw(
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
);
|
);
|
||||||
[% INCLUDE complexType/contentModel.tt;
|
|
||||||
END %]
|
|
||||||
|
|
||||||
|
[% INCLUDE complexType/contentModel.tt -%]
|
||||||
|
|
||||||
} # end of BLOCK
|
} # end of BLOCK
|
||||||
|
|
||||||
|
[% END %]
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
# __END__
|
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||||
|
[% pod = BLOCK %]=pod[% END -%]
|
||||||
|
[% head1 = BLOCK %]=head1[% END -%]
|
||||||
|
[% head2 = BLOCK %]=head2[% END -%]
|
||||||
|
[% head3 = BLOCK %]=head3[% END -%]
|
||||||
|
|
||||||
=pod
|
[% pod %]
|
||||||
|
|
||||||
=head1 NAME
|
[% head1 %] NAME
|
||||||
|
|
||||||
[% element_prefix %]::[% element.get_name %]
|
[% XSD.create_xsd_name(element) %]
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
[% head1 %] DESCRIPTION
|
||||||
|
|
||||||
Perl data type class for the XML Schema defined element
|
Perl data type class for the XML Schema defined element
|
||||||
[% element.get_name %] from the namespace [% element.get_targetNamespace %].
|
[% element.get_name %] from the namespace [% element.get_targetNamespace %].
|
||||||
|
|
||||||
=head1 METHODS
|
[% INCLUDE POD/annotation.tt(node = element) %]
|
||||||
|
|
||||||
=head2 new
|
[% head1 %] METHODS
|
||||||
|
|
||||||
my $element = [% element_prefix %]::[% element.get_name %]->new($data);
|
[% head2 %] new
|
||||||
|
|
||||||
|
my $element = [% XSD.create_xsd_name(element) %]->new($data);
|
||||||
|
|
||||||
Constructor. The following data structure may be passed to new():
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
[% indent = ' '; INCLUDE element/POD/structure.tt; %]
|
[% indent = ' '; INCLUDE element/POD/structure.tt; %]
|
||||||
|
|
||||||
=head1 AUTHOR
|
[% head1 %] AUTHOR
|
||||||
|
|
||||||
Generated by SOAP::WSDL
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
[% IF (type = element.get_type);
|
||||||
|
ELSIF (simpleType = element.get_simpleType) %]
|
||||||
|
This XML element type class has a atomic simpleType as it's base:
|
||||||
|
[%
|
||||||
|
INCLUDE simpleType/POD/contentModel.tt(simpleType = simpleType);
|
||||||
|
ELSIF (simpleType = element.get_complexType);
|
||||||
|
ELSIF (ref_element = element.get_ref);
|
||||||
|
END %]
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
package [% type_prefix %]::[% simpleType.get_name.replace('\.','::').replace('-','_') %];
|
[% USE XSD(context) -%]
|
||||||
|
package [% XSD.create_xsd_name(simpleType) %];
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
@@ -11,34 +12,39 @@ sub get_xmlns { '[% simpleType.get_targetNamespace %]'};
|
|||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
=pod
|
__END__
|
||||||
|
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||||
|
[% pod = BLOCK %]=pod[% END -%]
|
||||||
|
[% head1 = BLOCK %]=head1[% END -%]
|
||||||
|
[% head2 = BLOCK %]=head2[% END -%]
|
||||||
|
[% head3 = BLOCK %]=head3[% END -%]
|
||||||
|
|
||||||
=head1 [% type_prefix %]::[% simpleType.get_name.replace('\.','::').replace('-','_') %]
|
[% pod %]
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
[% head1 %] NAME
|
||||||
|
|
||||||
|
[% XSD.create_name(simpleType) %]
|
||||||
|
|
||||||
|
[% head1 %] DESCRIPTION
|
||||||
|
|
||||||
Perl data type class for the XML Schema defined simpleType
|
Perl data type class for the XML Schema defined simpleType
|
||||||
[% simpleType.get_name %] from the namespace [% simpleType.get_targetNamespace %].
|
[% simpleType.get_name %] from the namespace [% simpleType.get_targetNamespace %].
|
||||||
|
|
||||||
[% IF (simpleType.get_variety == 'list');
|
[% INCLUDE POD/annotation.tt(node = simpleType) %]
|
||||||
INCLUDE simpleType/POD/list.tt;
|
|
||||||
ELSIF (simpleType.get_variety == 'restriction');
|
|
||||||
INCLUDE simpleType/POD/restriction.tt;
|
|
||||||
ELSE;
|
|
||||||
THROW NOT_IMPLEMENTED "simpleType union not implemented yet in $simpleType.get_name";
|
|
||||||
END %]
|
|
||||||
|
|
||||||
=head1 METHODS
|
[% INCLUDE simpleType/POD/contentModel.tt(simpleType = simpleType) %]
|
||||||
|
|
||||||
=head2 new
|
[% head1 %] METHODS
|
||||||
|
|
||||||
|
[% head2 %] new
|
||||||
|
|
||||||
Constructor.
|
Constructor.
|
||||||
|
|
||||||
=head2 get_value / set_value
|
[% head2 %] get_value / set_value
|
||||||
|
|
||||||
Getter and setter for the simpleType's value.
|
Getter and setter for the simpleType's value.
|
||||||
|
|
||||||
=head1 OVERLOADING
|
[% head1 %] OVERLOADING
|
||||||
|
|
||||||
Depending on the simple type's base type, the following operations are overloaded
|
Depending on the simple type's base type, the following operations are overloaded
|
||||||
|
|
||||||
@@ -48,7 +54,7 @@ Depending on the simple type's base type, the following operations are overloade
|
|||||||
|
|
||||||
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
|
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
|
||||||
|
|
||||||
=head1 AUTHOR
|
[% head1 %] AUTHOR
|
||||||
|
|
||||||
Generated by SOAP::WSDL
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
[% IF (simpleType.get_variety == 'list');
|
||||||
|
INCLUDE simpleType/POD/list.tt;
|
||||||
|
ELSIF (simpleType.get_variety == 'restriction');
|
||||||
|
INCLUDE simpleType/POD/restriction.tt;
|
||||||
|
ELSIF (simpleType.get_variety == 'union');
|
||||||
|
INCLUDE simpleType/POD/union.tt;
|
||||||
|
ELSE;
|
||||||
|
# THROW NOT_IMPLEMENTED "simpleType " _ simpleType.get_variety _ "not implemented yet in $simpleType.get_name";
|
||||||
|
END %]
|
||||||
@@ -1,13 +1,9 @@
|
|||||||
This clase is derived from
|
This clase is derived from
|
||||||
[%-
|
[%-
|
||||||
IF (name = simpleType.get_itemType);
|
IF (name = simpleType.get_itemType);
|
||||||
type_name = simpleType.expand( name );
|
type = definitions.get_types.0.find_type(simpleType.expand( name )); %]
|
||||||
IF (type_name.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
|
[% XSD.create_xsd_name(type) %]
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::[% type_name.1 %]
|
[% ELSE;
|
||||||
[% ELSE -%]
|
|
||||||
[% type_prefix %]::[% type_name.1 %]
|
|
||||||
[% END;
|
|
||||||
ELSE;
|
|
||||||
# THROW NOT_IMPLEMENTED "atomic simpleType list not implemented yet in $simpleType.get_name";
|
# THROW NOT_IMPLEMENTED "atomic simpleType list not implemented yet in $simpleType.get_name";
|
||||||
%] a atomic base type. Unfortunately there's no documenatation generation for atomic base types yet. [%
|
%] a atomic base type. Unfortunately there's no documenatation generation for atomic base types yet. [%
|
||||||
END -%].
|
END -%].
|
||||||
|
|||||||
@@ -1,12 +1,8 @@
|
|||||||
This clase is derived from [%-
|
This clase is derived from [%-
|
||||||
IF (name = simpleType.get_base);
|
IF (name = simpleType.get_base);
|
||||||
type_name = simpleType.expand( name );
|
type = definitions.get_types.0.find_type(simpleType.expand(name)); %]
|
||||||
IF (type_name.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
|
[% XSD.create_xsd_name(type); %]
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::[% type_name.1 %]
|
[% ELSE;
|
||||||
[% ELSE -%]
|
|
||||||
[% type_prefix %]::[% type_name.1 %]
|
|
||||||
[% END;
|
|
||||||
ELSE;
|
|
||||||
# THROW NOT_IMPLEMENTED "atomic simpleType restriction not implemented yet in $simpleType.get_name";
|
# THROW NOT_IMPLEMENTED "atomic simpleType restriction not implemented yet in $simpleType.get_name";
|
||||||
%] a atomic base type. Unfortunately there's no documenatation generation for atomic base types yet. [%
|
%] a atomic base type. Unfortunately there's no documenatation generation for atomic base types yet. [%
|
||||||
END -%]
|
END -%]
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
This type class is derived by union.
|
||||||
|
|
||||||
|
Derivation by union is not fully supported yet - value space constraints are
|
||||||
|
not checked yet.
|
||||||
|
|
||||||
|
The current implementation of union resorts to inheriting from the base type,
|
||||||
|
which means (quoted from the XML Schema specs): "If the <list> or <union>
|
||||||
|
alternative is chosen, then the simple ur-type definition·."
|
||||||
@@ -2,6 +2,8 @@
|
|||||||
INCLUDE simpleType/list.tt(simpleType = simpleType);
|
INCLUDE simpleType/list.tt(simpleType = simpleType);
|
||||||
ELSIF (simpleType.get_variety == 'restriction');
|
ELSIF (simpleType.get_variety == 'restriction');
|
||||||
INCLUDE simpleType/restriction.tt(type = simpleType);
|
INCLUDE simpleType/restriction.tt(type = simpleType);
|
||||||
|
ELSIF (simpleType.get_variety == 'union');
|
||||||
|
INCLUDE simpleType/union.tt(type = simpleType);
|
||||||
ELSE;
|
ELSE;
|
||||||
THROW NOT_IMPLEMENTED "${ element.get_name } - ${ simpleType.get_variety } not supported yet";
|
THROW NOT_IMPLEMENTED "${ element.get_name } - ${ simpleType.get_variety } not supported yet";
|
||||||
END %]
|
END %]
|
||||||
|
|||||||
@@ -1,17 +1,13 @@
|
|||||||
|
[% USE XSD %]
|
||||||
# list derivation
|
# list derivation
|
||||||
use base qw(
|
use base qw(
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::list
|
SOAP::WSDL::XSD::Typelib::Builtin::list
|
||||||
[%
|
[%
|
||||||
IF (name = simpleType.get_itemType);
|
IF (name = simpleType.get_itemType);
|
||||||
type_name = simpleType.expand( name );
|
type = definitions.get_types.0.find_type(simpleType.expand( name )); -%]
|
||||||
IF (type_name.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
|
[% XSD.create_xsd_name(type) %]
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::[% type_name.1 %]
|
|
||||||
);
|
);
|
||||||
[% ELSE -%]
|
[% ELSIF (type = simpleType.first_simpleType); %]
|
||||||
[% type_prefix %]::[% type_name.1 %]
|
|
||||||
);
|
|
||||||
[% END;
|
|
||||||
ELSIF (type = simpleType.first_simpleType); %]
|
|
||||||
);
|
);
|
||||||
|
|
||||||
[% INCLUDE simpleType/atomicType.tt(type = type);
|
[% INCLUDE simpleType/atomicType.tt(type = type);
|
||||||
|
|||||||
@@ -1,9 +1,14 @@
|
|||||||
# derivation by restriction
|
# derivation by restriction
|
||||||
[% IF (base = simpleType.get_base) -%]
|
[% IF (base = simpleType.get_base) -%]
|
||||||
use base qw(
|
use base qw(
|
||||||
[% INCLUDE _type_class.tt(type = base, node=simpleType) %]);
|
[%
|
||||||
|
base_type = definitions.get_types.0.find_type(simpleType.expand(base));
|
||||||
|
IF ! base_type;
|
||||||
|
THROW NOT_FOUND "No base type in " _ simpleType.get_parent.get_name;
|
||||||
|
END;
|
||||||
|
XSD.create_xsd_name(base_type) %]);
|
||||||
[% ELSIF (type = simpleType.first_simpleType() );
|
[% ELSIF (type = simpleType.first_simpleType() );
|
||||||
INCLUDE simpleType/atomicType.tt(type = type);
|
INCLUDE simpleType/atomicType.tt(type = type);
|
||||||
ELSE;
|
ELSE;
|
||||||
THROW "neither base nor atomic type - don't know what to do" %]
|
THROW "neither base nor atomic type - don't know what to do" %]
|
||||||
[% END %]
|
[% END %]
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# derivation by union
|
||||||
|
# union is not fully supported yet - value space constraints are not
|
||||||
|
# checked yet.
|
||||||
|
# This implementation of union resorts to the simplest possible base, which
|
||||||
|
# is: "If the <list> or <union> alternative is chosen, then the
|
||||||
|
# simple ur-type definition·."
|
||||||
|
#
|
||||||
|
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType
|
||||||
|
);
|
||||||
@@ -77,24 +77,24 @@ Visitor:
|
|||||||
|
|
||||||
package PersonVisitor;
|
package PersonVisitor;
|
||||||
use Class::Std; # handles all basic stuff like constructors etc.
|
use Class::Std; # handles all basic stuff like constructors etc.
|
||||||
|
|
||||||
sub visit_Person {
|
sub visit_Person {
|
||||||
my ( $self, $object ) = @_;
|
my ( $self, $object ) = @_;
|
||||||
print "Person name is ", $object->get_name(), "\n";
|
print "Person name is ", $object->get_name(), "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
package Person;
|
package Person;
|
||||||
use Class::Std;
|
use Class::Std;
|
||||||
my %name : ATTR(:name<name> :default<anonymous>);
|
my %name : ATTR(:name<name> :default<anonymous>);
|
||||||
|
|
||||||
sub accept { $_[1]->visit_Person( $_[0] ) }
|
sub accept { $_[1]->visit_Person( $_[0] ) }
|
||||||
|
|
||||||
package main;
|
package main;
|
||||||
my @person_from = ();
|
my @person_from = ();
|
||||||
for (qw(Gamma Helm Johnson Vlissides)) {
|
for (qw(Gamma Helm Johnson Vlissides)) {
|
||||||
push @person_from, Person->new( { name => $_ } );
|
push @person_from, Person->new( { name => $_ } );
|
||||||
}
|
}
|
||||||
|
|
||||||
my $visitor = PersonVisitor->new();
|
my $visitor = PersonVisitor->new();
|
||||||
for (@person_from) {
|
for (@person_from) {
|
||||||
$_->accept($visitor);
|
$_->accept($visitor);
|
||||||
@@ -269,7 +269,7 @@ SOAP::WSDL data classes:
|
|||||||
In your Visitor, you must implement visit_Foo methods for all classes you wish
|
In your Visitor, you must implement visit_Foo methods for all classes you wish
|
||||||
to visit.
|
to visit.
|
||||||
|
|
||||||
Currently, all SOAP::WSDL::Generator::Visitor implementations include their own
|
The SOAP::WSDL::Generator::Visitor implementations include part of their own
|
||||||
Iterator (which means they know how to find the next objects to visit). You
|
Iterator (which means they know how to find the next objects to visit). You
|
||||||
may or may not choose to implement a separate Iterator.
|
may or may not choose to implement a separate Iterator.
|
||||||
|
|
||||||
@@ -279,9 +279,12 @@ easy as writing something like this:
|
|||||||
my $visitor = MyVisitor->new();
|
my $visitor = MyVisitor->new();
|
||||||
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
|
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
|
||||||
my $definitions = $parser->parse_file('my.wsdl'):
|
my $definitions = $parser->parse_file('my.wsdl'):
|
||||||
|
|
||||||
$definitions->_accept( $visitor );
|
$definitions->_accept( $visitor );
|
||||||
|
|
||||||
|
If you need an iterator following the somewhat crude path of dependencies in
|
||||||
|
a WSDL1.1 definition, you might want to look at L<SOAP::WSDL::Generator::Iterator::WSDL11>.
|
||||||
|
|
||||||
=head1 REFERENCES
|
=head1 REFERENCES
|
||||||
|
|
||||||
=over
|
=over
|
||||||
@@ -296,10 +299,10 @@ Addison-Wesley Longman, Amsterdam.
|
|||||||
|
|
||||||
=head1 LICENSE AND COPYRIGHT
|
=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
|
This file is part of SOAP-WSDL. You may distribute/modify it under the same
|
||||||
the same terms as perl itself
|
terms as perl itself
|
||||||
|
|
||||||
=head1 AUTHOR
|
=head1 AUTHOR
|
||||||
|
|
||||||
@@ -307,9 +310,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 239 $
|
$Rev: 391 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: Client.pm 239 2007-09-11 09:45:42Z kutterma $
|
$Id: Client.pm 391 2007-11-17 21:56:13Z kutterma $
|
||||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
|
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -9,13 +9,11 @@ our $VERSION = q{2.00_25};
|
|||||||
|
|
||||||
my %path_of :ATTR(:name<path> :default<[]>);
|
my %path_of :ATTR(:name<path> :default<[]>);
|
||||||
my %typemap_of :ATTR(:name<typemap> :default<()>);
|
my %typemap_of :ATTR(:name<typemap> :default<()>);
|
||||||
my %type_prefix_of :ATTR(:name<type_prefix> :default<()>);
|
my %resolver_of :ATTR(:name<resolver> :default<()>);
|
||||||
my %element_prefix_of :ATTR(:name<element_prefix> :default<()>);
|
|
||||||
|
|
||||||
sub START {
|
sub START {
|
||||||
my ($self, $ident, $arg_ref) = @_;
|
my ($self, $ident, $arg_ref) = @_;
|
||||||
$type_prefix_of{ $ident } ||= 'MyTypes';
|
$resolver_of { $ident } = $arg_ref->{ resolver };
|
||||||
$element_prefix_of{ $ident } ||= 'MyElements';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub set_typemap_entry {
|
sub set_typemap_entry {
|
||||||
@@ -41,105 +39,6 @@ sub add_element_path {
|
|||||||
# . $element->get_name();
|
# . $element->get_name();
|
||||||
}
|
}
|
||||||
|
|
||||||
sub visit_Definitions {
|
|
||||||
my ( $self, $ident, $definitions ) = ( $_[0], ident $_[0], $_[1] );
|
|
||||||
|
|
||||||
$self->set_definitions( $definitions );
|
|
||||||
|
|
||||||
for ( @{ $definitions->get_service() } ){
|
|
||||||
$_->_accept($self);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub visit_Service {
|
|
||||||
my ( $self, $service ) = ( $_[0], $_[1] );
|
|
||||||
|
|
||||||
for ( @{ $service->get_port() } ) { $_->_accept($self); }
|
|
||||||
}
|
|
||||||
|
|
||||||
sub visit_Port {
|
|
||||||
my ( $self, $ident, $port ) = ( $_[0], ident $_[0], $_[1] );
|
|
||||||
|
|
||||||
# This is a false assumption - typemaps may be valid for non-soap
|
|
||||||
# bindings as well.
|
|
||||||
# TODO check and correct
|
|
||||||
return if not $port->first_address();
|
|
||||||
return if not $port->first_address()->isa('SOAP::WSDL::SOAP::Address');
|
|
||||||
|
|
||||||
my $binding = $self->get_definitions()
|
|
||||||
->find_binding( $port->expand( $port->get_binding() ) )
|
|
||||||
or die 'binding ' . $port->get_binding() . ' not found!';
|
|
||||||
|
|
||||||
$binding->_accept($self);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub visit_Binding {
|
|
||||||
my ( $self, $ident, $binding ) = ( $_[0], ident $_[0], $_[1] );
|
|
||||||
|
|
||||||
my $portType = $self->get_definitions()
|
|
||||||
->find_portType( $binding->expand( $binding->get_type ) )
|
|
||||||
or die 'portType not found: ' . $binding->binding_type;
|
|
||||||
|
|
||||||
for my $operation ( @{ $binding->get_operation() } ) {
|
|
||||||
my $name = $operation->get_name();
|
|
||||||
|
|
||||||
# get the equally named operation from the portType
|
|
||||||
my ($op) = grep { $_->get_name eq $name }
|
|
||||||
@{ $portType->get_operation() }
|
|
||||||
or die "operation <$name> not found";
|
|
||||||
|
|
||||||
# visit every input, output and fault message...
|
|
||||||
for ( @{ $op->get_input }, @{ $op->get_output }, @{ $op->get_fault } ) {
|
|
||||||
$_->_accept($self);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub visit_OpMessage {
|
|
||||||
my ( $self, $ident, $operation_message ) = ( $_[0], ident $_[0], $_[1] );
|
|
||||||
return if not( $operation_message->get_message() ); # we're in binding
|
|
||||||
|
|
||||||
# TODO maybe allow more messages && overloading by specifying name
|
|
||||||
|
|
||||||
# find message referenced in operation
|
|
||||||
my $message = $self->get_definitions()->find_message(
|
|
||||||
$operation_message->expand( $operation_message->get_message() ) );
|
|
||||||
|
|
||||||
for my $part ( @{ $message->get_part() } ) {
|
|
||||||
$part->_accept($self);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub visit_Part {
|
|
||||||
my ( $self, $ident, $part ) = ( $_[0], ident $_[0], $_[1] );
|
|
||||||
|
|
||||||
my $types_ref = $self->get_definitions()->first_types()
|
|
||||||
or warn "Empty part" . $part->get_name();
|
|
||||||
|
|
||||||
# resolve type
|
|
||||||
# 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
|
|
||||||
if ( my $type_name = $part->get_type ) {
|
|
||||||
# FIXME support RPC-style calls
|
|
||||||
die "unsupported global type <$type_name> found in part ". $part->get_name();
|
|
||||||
}
|
|
||||||
|
|
||||||
# TODO factor out iterator or replace by lookup (probably better)
|
|
||||||
if ( my $element_name = $part->get_element() ) {
|
|
||||||
my $element = $types_ref->find_element(
|
|
||||||
$part->expand($element_name) )
|
|
||||||
|| die "no element $element_name found for part " . $part->get_name();
|
|
||||||
$element->_accept($self);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
warn 'neither type nor element - do not know what to do for part '
|
|
||||||
. $part->get_name();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub process_referenced_type {
|
sub process_referenced_type {
|
||||||
my ( $self, $ns, $localname ) = @_;
|
my ( $self, $ns, $localname ) = @_;
|
||||||
return if not $localname;
|
return if not $localname;
|
||||||
@@ -149,18 +48,13 @@ sub process_referenced_type {
|
|||||||
# Caveat: visits type if it's a referenced type from the
|
# Caveat: visits type if it's a referenced type from the
|
||||||
# a ? b : c operation.
|
# a ? b : c operation.
|
||||||
my ($type, $typeclass);
|
my ($type, $typeclass);
|
||||||
if ( $ns eq 'http://www.w3.org/2001/XMLSchema' ) {
|
$type = $self->get_definitions()->first_types()->find_type( $ns, $localname );
|
||||||
$typeclass = "SOAP::WSDL::XSD::Typelib::Builtin::$localname";
|
$typeclass = $self->get_resolver()->create_xsd_name($type);
|
||||||
}
|
|
||||||
else {
|
|
||||||
$type = $self->get_definitions()->first_types()->find_type( $ns, $localname );
|
|
||||||
$typeclass = join( q{::}, $type_prefix_of{$ident}, $type->get_name() );
|
|
||||||
}
|
|
||||||
|
|
||||||
# set before to allow it to be used from inside _accept
|
# set before to allow it to be used from inside _accept
|
||||||
$self->set_typemap_entry($typeclass);
|
$self->set_typemap_entry($typeclass);
|
||||||
|
|
||||||
$type->_accept($self) if ($type);
|
$type->_accept($self) if ($ns ne 'http://www.w3.org/2001/XMLSchema');
|
||||||
|
|
||||||
# set afterwards again (just to be sure...)
|
# set afterwards again (just to be sure...)
|
||||||
$self->set_typemap_entry($typeclass);
|
$self->set_typemap_entry($typeclass);
|
||||||
@@ -202,17 +96,21 @@ sub visit_XSD_Element {
|
|||||||
if ($element->get_simpleType()) {
|
if ($element->get_simpleType()) {
|
||||||
# warn "simpleType " . $element->get_name();
|
# warn "simpleType " . $element->get_name();
|
||||||
my @path = @{ $path_of{ ${ $self } } };
|
my @path = @{ $path_of{ ${ $self } } };
|
||||||
my $typeclass = defined ($parent)
|
my $typeclass = $self->get_resolver()->create_subpackage_name($element);
|
||||||
? join '::_', $parent , $element->get_name()
|
# my $typeclass = defined ($parent)
|
||||||
: join q{::}, $element_prefix_of{$ident}, $element->get_name();
|
# ? join q{::_}, $parent , $element->get_name()
|
||||||
|
# : join q{::}, $self->resolver()->get_element_prefix( $element->get_targetNamespace), $element->get_name();
|
||||||
$self->set_typemap_entry($typeclass);
|
$self->set_typemap_entry($typeclass);
|
||||||
|
$typeclass =~s{\.}{::}g;
|
||||||
|
$typeclass =~s{\-}{_}g;
|
||||||
last SWITCH;
|
last SWITCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
# for atomic and complex types , and ref elements
|
# for atomic and complex types , and ref elements
|
||||||
my $typeclass = join q{::}, $element_prefix_of{$ident}, $element->get_name();
|
my $typeclass = $self->get_resolver()->create_subpackage_name($element);
|
||||||
$typeclass =~s{\.}{::}g;
|
# my $typeclass = join q{::}, $self->get_resolver()->get_element_prefix( $element->get_targetNamespace), $element->get_name();
|
||||||
$typeclass =~s{\-}{_}g;
|
# $typeclass =~s{\.}{::}g;
|
||||||
|
# $typeclass =~s{\-}{_}g;
|
||||||
$self->set_typemap_entry($typeclass);
|
$self->set_typemap_entry($typeclass);
|
||||||
|
|
||||||
$self->process_atomic_type( $element->first_complexType()
|
$self->process_atomic_type( $element->first_complexType()
|
||||||
@@ -226,9 +124,10 @@ sub visit_XSD_Element {
|
|||||||
# a normal (not atomic) type, we just override it here
|
# a normal (not atomic) type, we just override it here
|
||||||
if (not defined($parent)) {
|
if (not defined($parent)) {
|
||||||
# for atomic and complex types , and ref elements
|
# for atomic and complex types , and ref elements
|
||||||
my $typeclass = join q{::}, $element_prefix_of{$ident}, $element->get_name();
|
my $typeclass = $self->get_resolver()->create_xsd_name($element);
|
||||||
$typeclass =~s{\.}{::}g;
|
# my $typeclass = join q{::}, $self->get_resolver()->get_element_prefix($element->get_targetNamespace), $element->get_name();
|
||||||
$typeclass =~s{\-}{_}g;
|
# $typeclass =~s{\.}{::}g;
|
||||||
|
# $typeclass =~s{\-}{_}g;
|
||||||
$self->set_typemap_entry($typeclass);
|
$self->set_typemap_entry($typeclass);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -238,20 +137,35 @@ sub visit_XSD_Element {
|
|||||||
|
|
||||||
sub visit_XSD_ComplexType {
|
sub visit_XSD_ComplexType {
|
||||||
my ($self, $ident, $type) = ($_[0], ident $_[0], $_[1] );
|
my ($self, $ident, $type) = ($_[0], ident $_[0], $_[1] );
|
||||||
my $content_model = $type->get_flavor();
|
my $variety = $type->get_variety();
|
||||||
# TODO is this allowed ? or should we better die ?
|
my $content_model = $type->get_contentModel;
|
||||||
return if not $content_model; # empty complexType
|
return if not $variety; # empty complexType
|
||||||
|
return if ($content_model eq 'simpleContent');
|
||||||
|
|
||||||
if ( grep { $_ eq $content_model} qw(all sequence choice) )
|
if ( grep { $_ eq $variety} qw(all sequence choice) )
|
||||||
{
|
{
|
||||||
# visit child elements
|
# visit child elements
|
||||||
for (@{ $type->get_element() }) {
|
for (@{ $type->get_element() || [] }) {
|
||||||
$_->_accept( $self );
|
$_->_accept( $self );
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
warn "unsupported content model $content_model found in "
|
if (grep { $_ eq $variety } qw(restriction extension) ) {
|
||||||
|
# resolve base / get atomic type and run on elements
|
||||||
|
if (my $type_name = $type->get_base()) {
|
||||||
|
my $subtype = $self->get_definitions()
|
||||||
|
->first_types()->find_type( $type->expand($type_name) );
|
||||||
|
# visit child elements
|
||||||
|
for (@{ $subtype->get_element() || [] }) {
|
||||||
|
$_->_accept( $self );
|
||||||
|
}
|
||||||
|
# that's all for restriction
|
||||||
|
return if ($variety eq 'restriction');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
warn "unsupported content model $variety found in "
|
||||||
. "complex type " . $type->get_name()
|
. "complex type " . $type->get_name()
|
||||||
. " - typemap may be incomplete";
|
. " - typemap may be incomplete";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,15 +22,15 @@ service).
|
|||||||
|
|
||||||
=item * Write script
|
=item * Write script
|
||||||
|
|
||||||
use MyInterface::SERVICE_NAME::PORT_NAME;
|
use MyInterfaces::SERVICE_NAME::PORT_NAME;
|
||||||
my $service = MyInterface::SERVICE_NAME::PORT_NAME->new();
|
my $service = MyInterfaces::SERVICE_NAME::PORT_NAME->new();
|
||||||
|
|
||||||
my $result = $service->SERVICE_METHOD();
|
my $result = $service->SERVICE_METHOD();
|
||||||
die $result if not $result;
|
die $result if not $result;
|
||||||
|
|
||||||
print $result;
|
print $result;
|
||||||
|
|
||||||
C<perldoc MyInterface::SERVICE_NAME::PORT_NAME> should give you some overview
|
C<perldoc MyInterfaces::SERVICE_NAME::PORT_NAME> should give you some overview
|
||||||
about the service's interface structure.
|
about the service's interface structure.
|
||||||
|
|
||||||
The results of all calls to your service object's methods (except new) are
|
The results of all calls to your service object's methods (except new) are
|
||||||
@@ -103,9 +103,9 @@ included perldoc will be, too - if not, blame the web service author.
|
|||||||
|
|
||||||
=item * Write a perl script (or module) accessing the web service.
|
=item * Write a perl script (or module) accessing the web service.
|
||||||
|
|
||||||
use MyInterface::SERVICE_NAME;
|
use MyInterfaces::SERVICE_NAME::PORT_NAME;
|
||||||
my $service = MyInterface::SERVICE_NAME->new();
|
my $service = MyInterfaces::SERVICE_NAME::PORT_NAME->new();
|
||||||
|
|
||||||
my $result = $service->SERVICE_METHOD();
|
my $result = $service->SERVICE_METHOD();
|
||||||
die $result if not $result;
|
die $result if not $result;
|
||||||
print $result;
|
print $result;
|
||||||
@@ -264,7 +264,7 @@ method called "get_basic_credentials" to SOAP::WSDL::Transport::HTTP:
|
|||||||
When using SOAP::Transport::HTTP (SOAP::Lite is installed), do the same to
|
When using SOAP::Transport::HTTP (SOAP::Lite is installed), do the same to
|
||||||
this backend:
|
this backend:
|
||||||
|
|
||||||
*SOAP::Transport::HTTP::get_basic_credentials = sub {
|
*SOAP::Transport::HTTP::Client::get_basic_credentials = sub {
|
||||||
return ($user, $password);
|
return ($user, $password);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -34,11 +34,11 @@ considered as bugs.
|
|||||||
=item * RULES NOT APPLICABLE
|
=item * RULES NOT APPLICABLE
|
||||||
|
|
||||||
WS-I Basic Profile contains rules for web services as a whole. SOAP::WSDL only
|
WS-I Basic Profile contains rules for web services as a whole. SOAP::WSDL only
|
||||||
plays the part of one layer in a Web Service CONSUMER, thus does not implement
|
plays the part of one layer in a Web Service CONSUMER / RECEIVER, thus does
|
||||||
some parts the WS-I Basic Profile references.
|
not implement some parts the WS-I Basic Profile references.
|
||||||
|
|
||||||
This section contains rules not applicable for SOAP::WSDL, because they refer
|
This section contains rules not applicable for SOAP::WSDL, because they refer
|
||||||
parts to web service SOAP::WSDL does not implement.
|
to parts SOAP::WSDL does not implement.
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
@@ -427,9 +427,10 @@ TODO support rpc-literal bindings.
|
|||||||
In a DESCRIPTION the value of the location attribute of a wsdl:import element
|
In a DESCRIPTION the value of the location attribute of a wsdl:import element
|
||||||
SHOULD be treated as a hint.
|
SHOULD be treated as a hint.
|
||||||
|
|
||||||
SOAP::WSDL's schema parser does not handle import elements yet.
|
The wsdl:import element imports the referenced WSDL definition.
|
||||||
|
|
||||||
TODO implement support for wsdl:import in SOAP::WSDL::Expat::WSDLParser.
|
This is rather hard-wired and does not allow to specify a wsdl:import without
|
||||||
|
a resolvable location in SOAP::WSDL.
|
||||||
|
|
||||||
=head2 R4002
|
=head2 R4002
|
||||||
|
|
||||||
@@ -448,9 +449,7 @@ TODO Test whether UTF-16 works.
|
|||||||
The wsdl:documentation element MAY occur as a child of the wsdl:import
|
The wsdl:documentation element MAY occur as a child of the wsdl:import
|
||||||
element in a DESCRIPTION.
|
element in a DESCRIPTION.
|
||||||
|
|
||||||
SOAP::WSDL's schema parser does not handle import elements yet.
|
Not tested yet.
|
||||||
|
|
||||||
TODO implement support for wsdl:import in SOAP::WSDL::Expat::WSDLParser.
|
|
||||||
|
|
||||||
=head2 R2024
|
=head2 R2024
|
||||||
|
|
||||||
@@ -681,7 +680,11 @@ is Schema valid.
|
|||||||
A DESCRIPTION MUST only use the WSDL "import" statement to import another
|
A DESCRIPTION MUST only use the WSDL "import" statement to import another
|
||||||
WSDL description.
|
WSDL description.
|
||||||
|
|
||||||
SOAP::WSDL has no means of generating WSDL definitions
|
SOAP::WSDL (partially) supports the wsdl:import statement. The wsdl:include
|
||||||
|
statement is not supported.
|
||||||
|
|
||||||
|
It's the responsibility of the WSDL author to use only the wsdl:import
|
||||||
|
statement for importing WSDL descriptions.
|
||||||
|
|
||||||
=head2 R2002
|
=head2 R2002
|
||||||
|
|
||||||
@@ -1249,9 +1252,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 478 $
|
$Rev: 562 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: WS_I.pod 478 2007-12-27 14:15:01Z kutterma $
|
$Id: WS_I.pod 562 2008-02-22 20:32:17Z kutterma $
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/WS_I.pod $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/WS_I.pod $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
+219
-59
@@ -24,12 +24,12 @@ You can use SOAP::WSDL::XSD based classes just like any perl class - you may
|
|||||||
instantiate it, inherit from it etc.
|
instantiate it, inherit from it etc.
|
||||||
|
|
||||||
You should be aware, that SOAP::WSDL::XSD based classes are inside-out
|
You should be aware, that SOAP::WSDL::XSD based classes are inside-out
|
||||||
classes using Class::Std, though - things you would expect from hash-based
|
classes using Class::Std::Fast, though - things you would expect from
|
||||||
classes like using the blessed hash ref as data storage won't work.
|
hash-based classes like using the blessed hash ref as data storage won't work.
|
||||||
|
|
||||||
Moreover, most all SOAP::WSDL::XSD::Typelib based classes override
|
Moreover, most all SOAP::WSDL::XSD::Typelib based classes override
|
||||||
Class::Std's default constructor for speed - you should not expect BUILD or
|
Class::Std::Fast's default constructor for speed - you should not expect
|
||||||
START methods to work, unless you call them yourself (or define a new
|
BUILD or START methods to work, unless you call them yourself (or define a new
|
||||||
constructor).
|
constructor).
|
||||||
|
|
||||||
All SOAP::WSDL::XSD based complexType classes allow a hash ref matching their
|
All SOAP::WSDL::XSD based complexType classes allow a hash ref matching their
|
||||||
@@ -40,11 +40,15 @@ will work fine.
|
|||||||
All SOAP::WSDL::XSD based simpleType (and builtin) classes accept a single
|
All SOAP::WSDL::XSD based simpleType (and builtin) classes accept a single
|
||||||
hash ref with the only key "value" and the value to be set as value.
|
hash ref with the only key "value" and the value to be set as value.
|
||||||
|
|
||||||
|
=head2 Conversions
|
||||||
|
|
||||||
|
=head3 Array dereference
|
||||||
|
|
||||||
All SOAP::WSDL::XSD based classes overload arrayification - that is being
|
All SOAP::WSDL::XSD based classes overload arrayification - that is being
|
||||||
accessed as a list ref - with a method returning [ $self ].
|
accessed as a list ref - with a method returning [ $self ].
|
||||||
|
|
||||||
This means that you can safely use the results of get_ELEMENT calls on
|
This means that you can safely use the results of get_ELEMENT calls on
|
||||||
cmplexTypes as list refs (you'll have to check for definedness, though -
|
complexTypes as list refs (you'll have to check for definedness, though -
|
||||||
see L<SOAP::WSDL::XSD::Typelib::Builtin|SOAP::WSDL::XSD::Typelib::Builtin>
|
see L<SOAP::WSDL::XSD::Typelib::Builtin|SOAP::WSDL::XSD::Typelib::Builtin>
|
||||||
for details.
|
for details.
|
||||||
|
|
||||||
@@ -65,6 +69,32 @@ L<HTML::Template::Compiled|HTML::Template::Compiled>, where you could say
|
|||||||
<%/LOOP>
|
<%/LOOP>
|
||||||
<%IF%>
|
<%IF%>
|
||||||
|
|
||||||
|
Note that this does not work in HTML::Template::Compiled yet - the code
|
||||||
|
generated for the template checks UNIVERSAL::isa instead of dereferencing.
|
||||||
|
There's a ticket open in HTC to solve the issue.
|
||||||
|
|
||||||
|
=head3 as_hash_ref
|
||||||
|
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType based objects have a method as_hash_ref,
|
||||||
|
which returns the object's content as a hash reference.
|
||||||
|
|
||||||
|
This can be convenient for cloning:
|
||||||
|
|
||||||
|
my $class = ref $old;
|
||||||
|
my $clone = $class->new( $old->as_hash_ref() );
|
||||||
|
|
||||||
|
To convert from one type to another, you
|
||||||
|
can just say
|
||||||
|
|
||||||
|
my $new = MyTypes::NewType->new( $old->as_hash_ref() );
|
||||||
|
|
||||||
|
Of course this will only work if MyTypes::NewType has a superset of the old
|
||||||
|
object class' elements.
|
||||||
|
.
|
||||||
|
|
||||||
|
Future versions will restrict the data returned to the child element's data -
|
||||||
|
you should not expect XML attributes to be returned through hash refs.
|
||||||
|
|
||||||
=head1 HOW IT WORKS
|
=head1 HOW IT WORKS
|
||||||
|
|
||||||
=head2 Base classes
|
=head2 Base classes
|
||||||
@@ -275,10 +305,57 @@ XML Schema facets are not implemented yet.
|
|||||||
They will probably implemented some day by putting constant methods into
|
They will probably implemented some day by putting constant methods into
|
||||||
the correspondent classes.
|
the correspondent classes.
|
||||||
|
|
||||||
=head1 ATTRIBUTES
|
=head2 Attributes
|
||||||
|
|
||||||
|
The attribute set for a XML element (derived from anySimpleType or
|
||||||
|
complexType) is implemented as a sub-package of the element derived from
|
||||||
|
SOAP::WSDL::XSD::Typelib::AttributeSet.
|
||||||
|
|
||||||
|
The sub-package is named as the corresponding type or element package,
|
||||||
|
suffixed with C<XmlAttr>. The suffix "XmlAttr" has carefully been chosen to
|
||||||
|
avoid potential naming clashes: The name XmlAttr cannot be included as
|
||||||
|
element or type name in XML schemas - the XML standard bans the use of names
|
||||||
|
starting with "xml" (case-insensitive).
|
||||||
|
|
||||||
|
All XML attributes for a XML element are set- and retrievable via the method
|
||||||
|
C<attr>. The name is chosen to allow mimicing SOAP::Lite's behaviour, which
|
||||||
|
allows setting a SOAP::Data object's attributes via C<attr>.
|
||||||
|
|
||||||
|
my $attrSet = $obj->attr();
|
||||||
|
$obj->attr({
|
||||||
|
whitespace => 'preserve',
|
||||||
|
nillable => 1,
|
||||||
|
});
|
||||||
|
|
||||||
|
SOAP::WSDL::XSD::Typelib::AttributeSet is derived from
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType with content model C<all>. The
|
||||||
|
individual attributes can be set and retrieved via the respective set_FOO /
|
||||||
|
get_FOO methods.
|
||||||
|
|
||||||
|
The C<attr> method provides auto-vivification: An xml object's attribute set
|
||||||
|
is instantiated when accessed.
|
||||||
|
|
||||||
|
Auto-vivification is only triggered if there actually B<is> a set of
|
||||||
|
attributes for the class/object in question, so you may want to test
|
||||||
|
whether the result of ->attr is defined:
|
||||||
|
|
||||||
|
my $attr = $unknownObject->attr();
|
||||||
|
if (defined($attr)) {
|
||||||
|
$unknownObject->attr({
|
||||||
|
some => 'value',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
=head2 group
|
||||||
|
|
||||||
|
CAVEAT: Group resolution is not implemented yet.
|
||||||
|
|
||||||
|
XML Schema Group definitions are just treated as aliases that can be
|
||||||
|
inserted in complexType definitions by referencing them. That is, there's
|
||||||
|
no difference between a complexType with simpleContent and a sequence of
|
||||||
|
three elements, and a complexType with simpleContent referencing a group
|
||||||
|
containing the same sequence of elements.
|
||||||
|
|
||||||
XML attributes are not implemented yet. If you have a good idea on how to
|
|
||||||
implement them, feel free to email me a proposal.
|
|
||||||
|
|
||||||
=head1 CAVEATS
|
=head1 CAVEATS
|
||||||
|
|
||||||
@@ -286,7 +363,7 @@ implement them, feel free to email me a proposal.
|
|||||||
|
|
||||||
=item * START and BUILD are not being called
|
=item * START and BUILD are not being called
|
||||||
|
|
||||||
In contrast to "normal" Class::Std based objects, the classes of the
|
In contrast to "normal" Class::Std::Fast based objects, the classes of the
|
||||||
SOAP::WSDL::XSD::Typelib:: hierarchy (and all type and element classes
|
SOAP::WSDL::XSD::Typelib:: hierarchy (and all type and element classes
|
||||||
generated by SOAP::WSDL) override Class::Std's constructor for performance
|
generated by SOAP::WSDL) override Class::Std's constructor for performance
|
||||||
reasons.
|
reasons.
|
||||||
@@ -295,10 +372,10 @@ If you inherit from such a class and place a START or BUILD method in it,
|
|||||||
it will not get called - at least not unless you place something like this
|
it will not get called - at least not unless you place something like this
|
||||||
at the top of you code:
|
at the top of you code:
|
||||||
|
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
|
|
||||||
In this case, Class::Std::Storable will export a new() method into your class,
|
In this case, Class::Std::Fast::Storable will export a new() method into your
|
||||||
which in turn calls START and BUILD.
|
class, which in turn calls START and BUILD.
|
||||||
|
|
||||||
The constructors of all SOAP::WSDL::XSD::Typelib:: classes don't !
|
The constructors of all SOAP::WSDL::XSD::Typelib:: classes don't !
|
||||||
|
|
||||||
@@ -308,70 +385,153 @@ The constructors of all SOAP::WSDL::XSD::Typelib:: classes don't !
|
|||||||
|
|
||||||
The following XML Schema declaration elements are not supported yet:
|
The following XML Schema declaration elements are not supported yet:
|
||||||
|
|
||||||
|
=head2 XML Schema elements partially supported
|
||||||
|
|
||||||
|
=head3 Type definition elements
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item * Declaration elements
|
=item * simpleContent
|
||||||
|
|
||||||
attribute
|
simpleContent is only supported with a restriction or extension with a C<base>
|
||||||
notation
|
attribute. simpleContent declarations deriving from a atomic type are not
|
||||||
|
supported (yet).
|
||||||
=item * Type definition elements
|
|
||||||
|
|
||||||
simpleContent
|
|
||||||
union
|
|
||||||
|
|
||||||
=item * Content model definition elements
|
|
||||||
|
|
||||||
any
|
|
||||||
anyAttribute
|
|
||||||
attributeGroup
|
|
||||||
group
|
|
||||||
|
|
||||||
=item * Identity definition elements
|
|
||||||
|
|
||||||
field
|
|
||||||
key
|
|
||||||
keyref
|
|
||||||
selector
|
|
||||||
unique
|
|
||||||
|
|
||||||
=item * Inclusion elements
|
|
||||||
|
|
||||||
import
|
|
||||||
include
|
|
||||||
redefine
|
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
The following XML Schema declaration elements are supported, but have no
|
=head3 Inclusion elements
|
||||||
effect yet:
|
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item * Factes
|
=item * import
|
||||||
|
|
||||||
enumeration
|
The import includion element requires the schemaLocation attribute for
|
||||||
fractionDigits
|
resolving the XML schema to import. Support for the import element is
|
||||||
lenght
|
implemented in L<SOAP::WSDL::Expat::WSDLParser|SOAP::WSDL::Expat::WSDLParser>,
|
||||||
maxExclusive
|
so alternative parsers may or may not support the import element.
|
||||||
maxInclusiove
|
|
||||||
maxLength
|
|
||||||
minExclusive
|
|
||||||
minInclusive
|
|
||||||
minLength
|
|
||||||
pattern
|
|
||||||
totalDigits
|
|
||||||
whitespace
|
|
||||||
|
|
||||||
=item * Documentation elements
|
L<SOAP::WSDL::Expat::WSDLParser|SOAP::WSDL::Expat::WSDLParser> keeps track of
|
||||||
|
included schemas and prevents import loops.
|
||||||
|
|
||||||
appinfo
|
=back
|
||||||
|
|
||||||
|
=head3 Facets
|
||||||
|
|
||||||
|
The following XML Schema declaration elements are supported, but have no
|
||||||
|
effect yet.
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * enumeration
|
||||||
|
|
||||||
|
=item * fractionDigits
|
||||||
|
|
||||||
|
=item * lenght
|
||||||
|
|
||||||
|
=item * maxExclusive
|
||||||
|
|
||||||
|
=item * maxInclusiove
|
||||||
|
|
||||||
|
=item * maxLength
|
||||||
|
|
||||||
|
=item * minExclusive
|
||||||
|
|
||||||
|
=item * minInclusive
|
||||||
|
|
||||||
|
=item * minLength
|
||||||
|
|
||||||
|
=item * pattern
|
||||||
|
|
||||||
|
=item * totalDigits
|
||||||
|
|
||||||
|
=item * whitespace
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
|
||||||
|
=head2 XML Schema elements not implemented
|
||||||
|
|
||||||
|
=head3 Declaration elements
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * notation
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head3 Content model definition elements
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * any
|
||||||
|
|
||||||
|
The horror of each XML schema implementation: Just anything...
|
||||||
|
|
||||||
|
C<any> declarations are not supported yet.
|
||||||
|
|
||||||
|
=item * anyAttribute
|
||||||
|
|
||||||
|
=item * attributeGroup
|
||||||
|
|
||||||
|
C<attributeGroup> declarations actually just are macros for XML Schema
|
||||||
|
writers: Including an attributeGroup in a declaration has the same effect
|
||||||
|
as including all attributes in the group.
|
||||||
|
|
||||||
|
Just not implemented yet.
|
||||||
|
|
||||||
|
=item * group
|
||||||
|
|
||||||
|
The group definition element is not supported yet.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head3 Identity definition elements
|
||||||
|
|
||||||
|
These declaration elements don't declare XML elements, but apply identity
|
||||||
|
constraints. They have no effect yet.
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * field
|
||||||
|
|
||||||
|
=item * key
|
||||||
|
|
||||||
|
=item * keyref
|
||||||
|
|
||||||
|
=item * selector
|
||||||
|
|
||||||
|
=item * unique
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head3 Inclusion elements
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * include
|
||||||
|
|
||||||
|
Use of the include inclusion element is forbidden by the WS-I basic profile.
|
||||||
|
It is not supported (yet).
|
||||||
|
|
||||||
|
=item * redefine
|
||||||
|
|
||||||
|
Not supported (yet).
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head3 * Documentation elements
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * appinfo
|
||||||
|
|
||||||
|
The appinfo documentation element is ignored.
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE
|
||||||
|
|
||||||
Copyright 2007 Martin Kutter.
|
Copyright 2007,2008 Martin Kutter.
|
||||||
|
|
||||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||||
the same terms as perl itself
|
the same terms as perl itself
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ use warnings;
|
|||||||
use Class::Std::Fast::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
my %body_of :ATTR(:name<body> :default<[]>);
|
my %body_of :ATTR(:name<body> :default<[]>);
|
||||||
my %header_of :ATTR(:name<header> :default<[]>);
|
my %header_of :ATTR(:name<header> :default<[]>);
|
||||||
my %headerfault_of :ATTR(:name<headerfault> :default<[]>);
|
my %headerfault_of :ATTR(:name<headerfault> :default<[]>);
|
||||||
my %message_of :ATTR(:name<message> :default<()>);
|
my %message_of :ATTR(:name<message> :default<()>);
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ use warnings;
|
|||||||
use Class::Std::Fast::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use Scalar::Util qw(blessed);
|
use Scalar::Util qw(blessed);
|
||||||
our $VERSION=q{2.00_27};
|
our $VERSION=q{2.00_27};
|
||||||
|
use SOAP::WSDL::Factory::Serializer;
|
||||||
|
|
||||||
my $SOAP_NS = 'http://schemas.xmlsoap.org/soap/envelope/';
|
my $SOAP_NS = 'http://schemas.xmlsoap.org/soap/envelope/';
|
||||||
my $XML_INSTANCE_NS = 'http://www.w3.org/2001/XMLSchema-instance';
|
my $XML_INSTANCE_NS = 'http://www.w3.org/2001/XMLSchema-instance';
|
||||||
@@ -119,9 +120,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 477 $
|
$Rev: 510 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: XSD.pm 477 2007-12-24 10:23:52Z kutterma $
|
$Id: XSD.pm 510 2008-01-29 08:03:46Z kutterma $
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Serializer/XSD.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Serializer/XSD.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -162,7 +162,7 @@ hash keys.
|
|||||||
|
|
||||||
=head1 LICENSE AND COPYRIGHT
|
=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
|
This file is part of SOAP-WSDL. You may distribute/modify it under the same
|
||||||
terms as perl itself
|
terms as perl itself
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ use Class::Std::Fast::Storable;
|
|||||||
|
|
||||||
use base qw(SOAP::WSDL::Server);
|
use base qw(SOAP::WSDL::Server);
|
||||||
|
|
||||||
our $VERSION=q{2.00_27};
|
our $VERSION=q{2.00_33};
|
||||||
|
|
||||||
# mostly copied from SOAP::Lite. Unfortunately we can't use SOAP::Lite's CGI
|
# mostly copied from SOAP::Lite. Unfortunately we can't use SOAP::Lite's CGI
|
||||||
# server directly - we would have to swap out it's base class...
|
# server directly - we would have to swap out it's base class...
|
||||||
@@ -38,6 +38,8 @@ sub handle {
|
|||||||
|
|
||||||
my $content = q{};
|
my $content = q{};
|
||||||
my $buffer;
|
my $buffer;
|
||||||
|
|
||||||
|
# do wen need to use bytes; here ?
|
||||||
binmode(STDIN);
|
binmode(STDIN);
|
||||||
while (read(STDIN,$buffer,$length - length($content))) {
|
while (read(STDIN,$buffer,$length - length($content))) {
|
||||||
$content .= $buffer;
|
$content .= $buffer;
|
||||||
@@ -113,11 +115,64 @@ SOAP::WSDL::Server::CGI - CGI based SOAP server
|
|||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use MyServer::TestService::TestPort;
|
||||||
|
my $server = MyServer::TestService::TestPort->new({
|
||||||
|
dispatch_to => 'main',
|
||||||
|
transport_class => 'SOAP::WSDL::Server::CGI', # optional, default
|
||||||
|
});
|
||||||
|
$server->handle();
|
||||||
|
|
||||||
|
=head1 USAGE
|
||||||
|
|
||||||
|
To use SOAP::WSDL::Server::CGI efficiently, you should first create a server
|
||||||
|
interface using L<wsdl2perl.pl|wsdl2perl.pl>.
|
||||||
|
|
||||||
|
SOAP::WSDL::Server dispatches all calls to appropriately named methods in the
|
||||||
|
class or object set via C<dispatch_to>.
|
||||||
|
|
||||||
|
See the generated server class on details.
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Lightweight CGI based SOAP server. SOAP::WSDL::Server::CGI does not provide
|
||||||
|
the fancier things of CGI handling, like URL parsing, parameter extraction
|
||||||
|
or the like, but provides a basic SOAP server using SOAP::WSDL::Server.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head1 EXCEPTION HANDLING
|
||||||
|
|
||||||
|
SOAP::WSDL::CGI handles the following errors:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * XML parsing error
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
The proper way to throw a exception is just to die -
|
||||||
|
SOAP::WSDL::Server::CGI catches the exception and sends a SOAP Fault
|
||||||
|
back to the client.
|
||||||
|
|
||||||
|
If you want more control over the SOAP Fault sent to the client, you can
|
||||||
|
die with a SOAP::WSDL::SOAP::Fault11 object - or just let the
|
||||||
|
SOAP::Server's deserializer create one for you:
|
||||||
|
|
||||||
|
my $soap = MyServer::SomeService->new();
|
||||||
|
|
||||||
|
die $soap->get_deserializer()->generate_fault({
|
||||||
|
code => 'soap:Server',
|
||||||
|
role => 'urn:localhost',
|
||||||
|
message => "The error message to pas back",
|
||||||
|
detail => "Some details on the error",
|
||||||
|
});
|
||||||
|
|
||||||
|
You may use any other object as exception, provided it has a
|
||||||
|
serialize() method which returns the object's XML representation.
|
||||||
|
|
||||||
=head1 LICENSE AND COPYRIGHT
|
=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
|
This file is part of SOAP-WSDL. You may distribute/modify it under the same
|
||||||
terms as perl itself
|
terms as perl itself
|
||||||
|
|||||||
@@ -4,6 +4,6 @@ use warnings;
|
|||||||
use Class::Std::Fast::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
my %port_of :ATTR(:name<port> :default<()>);
|
my %port_of :ATTR(:name<port> :default<[]>);
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
+67
-14
@@ -2,9 +2,15 @@ package SOAP::WSDL::TypeLookup;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
my %TYPES = (
|
our $VERSION=q{2.00_31};
|
||||||
|
|
||||||
|
my %TYPE_FROM = (
|
||||||
# wsdl:
|
# wsdl:
|
||||||
'http://schemas.xmlsoap.org/wsdl/' => {
|
'http://schemas.xmlsoap.org/wsdl/' => {
|
||||||
|
'import' => {
|
||||||
|
type => 'HANDLER',
|
||||||
|
method => 'wsdl_import',
|
||||||
|
},
|
||||||
binding => {
|
binding => {
|
||||||
type => 'CLASS',
|
type => 'CLASS',
|
||||||
class => 'SOAP::WSDL::Binding',
|
class => 'SOAP::WSDL::Binding',
|
||||||
@@ -81,15 +87,21 @@ my %TYPES = (
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
'http://www.w3.org/2001/XMLSchema' => {
|
'http://www.w3.org/2001/XMLSchema' => {
|
||||||
|
'import' => {
|
||||||
|
type => 'HANDLER',
|
||||||
|
method => 'xml_schema_import',
|
||||||
|
},
|
||||||
schema => {
|
schema => {
|
||||||
type => 'CLASS',
|
type => 'CLASS',
|
||||||
class => 'SOAP::WSDL::XSD::Schema',
|
class => 'SOAP::WSDL::XSD::Schema',
|
||||||
},
|
},
|
||||||
attribute => {
|
attribute => {
|
||||||
type => 'SKIP' # not implemented yet
|
type => 'CLASS',
|
||||||
|
class => 'SOAP::WSDL::XSD::Attribute',
|
||||||
},
|
},
|
||||||
attributeGroup => {
|
attributeGroup => {
|
||||||
type => 'SKIP', # not implemented yet
|
type => 'CLASS',
|
||||||
|
class => 'SOAP::WSDL::XSD::AttributeGroup',
|
||||||
},
|
},
|
||||||
key => {
|
key => {
|
||||||
type => 'SKIP', # not implemented yet
|
type => 'SKIP', # not implemented yet
|
||||||
@@ -104,7 +116,12 @@ my %TYPES = (
|
|||||||
type => 'SKIP', # not implemented yet
|
type => 'SKIP', # not implemented yet
|
||||||
},
|
},
|
||||||
annotation => {
|
annotation => {
|
||||||
type => 'SKIP', # not implemented yet
|
type => 'CLASS', # not implemented yet
|
||||||
|
class => 'SOAP::WSDL::XSD::Annotation',
|
||||||
|
},
|
||||||
|
documentation => {
|
||||||
|
type => 'CONTENT',
|
||||||
|
method => 'set_documentation',
|
||||||
},
|
},
|
||||||
appinfo => {
|
appinfo => {
|
||||||
type => 'SKIP', # not implemented yet
|
type => 'SKIP', # not implemented yet
|
||||||
@@ -151,37 +168,73 @@ my %TYPES = (
|
|||||||
method => 'set_union',
|
method => 'set_union',
|
||||||
},
|
},
|
||||||
enumeration => {
|
enumeration => {
|
||||||
type => 'SKIP',
|
type => 'CLASS',
|
||||||
# method => 'push_enumeration',
|
class => 'SOAP::WSDL::XSD::Enumeration',
|
||||||
},
|
},
|
||||||
group => {
|
group => {
|
||||||
type => 'METHOD',
|
type => 'CLASS',
|
||||||
method => 'set_flavor',
|
class => 'SOAP::WSDL::XSD::Group',
|
||||||
value => 'group',
|
|
||||||
},
|
},
|
||||||
all => {
|
all => {
|
||||||
type => 'METHOD',
|
type => 'METHOD',
|
||||||
method => 'set_flavor',
|
method => 'set_variety',
|
||||||
value => 'all',
|
value => 'all',
|
||||||
},
|
},
|
||||||
choice => {
|
choice => {
|
||||||
type => 'METHOD',
|
type => 'METHOD',
|
||||||
method => 'set_flavor',
|
method => 'set_variety',
|
||||||
value => 'choice',
|
value => 'choice',
|
||||||
},
|
},
|
||||||
sequence => {
|
sequence => {
|
||||||
type => 'METHOD',
|
type => 'METHOD',
|
||||||
method => 'set_flavor',
|
method => 'set_variety',
|
||||||
value => 'sequence',
|
value => 'sequence',
|
||||||
},
|
},
|
||||||
|
value => {
|
||||||
|
type => 'SKIP',
|
||||||
|
},
|
||||||
|
minExclusive => {
|
||||||
|
type => 'CLASS',
|
||||||
|
class => 'SOAP::WSDL::XSD::MinExclusive',
|
||||||
|
},
|
||||||
|
maxExclusive => {
|
||||||
|
type => 'CLASS',
|
||||||
|
class => 'SOAP::WSDL::XSD::MaxExclusive',
|
||||||
|
},
|
||||||
|
minInclusive => {
|
||||||
|
type => 'CLASS',
|
||||||
|
class => 'SOAP::WSDL::XSD::MinInclusive',
|
||||||
|
},
|
||||||
|
maxInclusive => {
|
||||||
|
type => 'CLASS',
|
||||||
|
class => 'SOAP::WSDL::XSD::MaxInclusive',
|
||||||
|
},
|
||||||
|
maxLength => {
|
||||||
|
type => 'CLASS',
|
||||||
|
class => 'SOAP::WSDL::XSD::MaxLength',
|
||||||
|
},
|
||||||
|
minLength => {
|
||||||
|
type => 'CLASS',
|
||||||
|
class => 'SOAP::WSDL::XSD::MinLength',
|
||||||
|
},
|
||||||
|
totalDigits => {
|
||||||
|
type => 'CLASS',
|
||||||
|
class => 'SOAP::WSDL::XSD::TotalDigits',
|
||||||
|
},
|
||||||
|
fractionDigits => {
|
||||||
|
type => 'CLASS',
|
||||||
|
class => 'SOAP::WSDL::XSD::FractionDigits',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$TYPE_FROM{ 'http://www.w3.org/2000/10/XMLSchema' } = $TYPE_FROM{ 'http://www.w3.org/2001/XMLSchema' };
|
||||||
|
|
||||||
sub lookup {
|
sub lookup {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $namespace = shift || 'http://schemas.xmlsoap.org/wsdl/';
|
my $namespace = shift || 'http://schemas.xmlsoap.org/wsdl/';
|
||||||
my $name = shift;
|
my $name = shift;
|
||||||
return $TYPES{ $namespace }->{ $name };
|
return $TYPE_FROM{ $namespace }->{ $name };
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
@@ -23,6 +23,16 @@ sub find_type {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub find_attribute {
|
||||||
|
my ($self, $ns, $name) = @_;
|
||||||
|
($ns, $name) = @{ $ns } if ref $ns; # allow passing list refs
|
||||||
|
foreach my $schema (@{ $schema_of{ ident $self } }) {
|
||||||
|
my $type = $schema->find_attribute($ns, $name);
|
||||||
|
return $type if $type;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
sub find_element {
|
sub find_element {
|
||||||
my ($self, $ns, $name) = @_;
|
my ($self, $ns, $name) = @_;
|
||||||
($ns, $name) = @{ $ns } if ref $ns; # allow passing list refs
|
($ns, $name) = @{ $ns } if ref $ns; # allow passing list refs
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package SOAP::WSDL::XSD::Annotation;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
|
our $VERSION=q{2.00_33};
|
||||||
|
|
||||||
|
#<enumeration value="">
|
||||||
|
|
||||||
|
# id provided by Base
|
||||||
|
# name provided by Base
|
||||||
|
# annotation provided by Base
|
||||||
|
|
||||||
|
# may be defined as atomic simpleType
|
||||||
|
my %appinfo_of :ATTR(:name<appinfo> :default<()>);
|
||||||
|
|
||||||
|
# documentation provided by Base
|
||||||
|
|
||||||
|
1;
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package SOAP::WSDL::XSD::Attribute;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
|
our $VERSION=q{2.00_29};
|
||||||
|
|
||||||
|
#<attribute
|
||||||
|
# default = string
|
||||||
|
# fixed = string
|
||||||
|
# form = (qualified | unqualified)
|
||||||
|
# id = ID
|
||||||
|
# name = NCName
|
||||||
|
# ref = QName
|
||||||
|
# type = QName
|
||||||
|
# use = (optional | prohibited | required) : optional
|
||||||
|
# {any attributes with non-schema namespace . . .}>
|
||||||
|
# Content: (annotation?, (simpleType?))
|
||||||
|
#</attribute>
|
||||||
|
|
||||||
|
# id provided by Base
|
||||||
|
# name provided by Base
|
||||||
|
# annotation provided by Base
|
||||||
|
|
||||||
|
my %default_of :ATTR(:name<default> :default<()>);
|
||||||
|
my %fixed_of :ATTR(:name<fixed> :default<()>);
|
||||||
|
my %form_of :ATTR(:name<form> :default<()>);
|
||||||
|
|
||||||
|
my %type_of :ATTR(:name<type> :default<()>);
|
||||||
|
my %use_of :ATTR(:name<use> :default<()>);
|
||||||
|
my %ref_of :ATTR(:name<ref> :default<()>);
|
||||||
|
|
||||||
|
# may be defined as atomic simpleType
|
||||||
|
my %simpleType_of :ATTR(:name<simpleType> :default<()>);
|
||||||
|
|
||||||
|
1;
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package SOAP::WSDL::XSD::AttributeGroup;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
|
our $VERSION=q{2.00_29};
|
||||||
|
|
||||||
|
#<attributeGroup
|
||||||
|
# id = ID
|
||||||
|
# name = NCName
|
||||||
|
# ref = QName
|
||||||
|
# {any attributes with non-schema namespace . . .}>
|
||||||
|
# Content: (annotation?, ((attribute | attributeGroup)*, anyAttribute?))
|
||||||
|
#</attributeGroup>
|
||||||
|
|
||||||
|
# id provided by Base
|
||||||
|
# name provided by Base
|
||||||
|
# annotation provided by Base
|
||||||
|
|
||||||
|
my %ref_of :ATTR(:name<ref> :default<()>);
|
||||||
|
|
||||||
|
# may be defined as atomic simpleType
|
||||||
|
my %attribute_of :ATTR(:name<attribute> :default<()>);
|
||||||
|
my %attributeGroup_of :ATTR(:name<attributeGroup> :default<()>);
|
||||||
|
|
||||||
|
1;
|
||||||
@@ -18,7 +18,7 @@ sub serialize {
|
|||||||
my $prefix = $prefix_of{ $ns }
|
my $prefix = $prefix_of{ $ns }
|
||||||
|| die 'No prefix found for namespace '. $ns;
|
|| die 'No prefix found for namespace '. $ns;
|
||||||
$xml .= ' type="' . $prefix . ':'
|
$xml .= ' type="' . $prefix . ':'
|
||||||
. $self->get_name() . '"' if ($self->get_name() );
|
. $self->get_name() . '"';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (defined $value) {
|
if (defined $value) {
|
||||||
|
|||||||
@@ -6,31 +6,45 @@ use Class::Std::Fast::Storable;
|
|||||||
use Scalar::Util qw(blessed);
|
use Scalar::Util qw(blessed);
|
||||||
use base qw/SOAP::WSDL::Base/;
|
use base qw/SOAP::WSDL::Base/;
|
||||||
|
|
||||||
our $VERSION=q{2.00_25};
|
our $VERSION=q{2.00_33};
|
||||||
|
|
||||||
|
my %length_of :ATTR(:name<length> :default<[]>);
|
||||||
|
my %minLength_of :ATTR(:name<minLength> :default<[]>);
|
||||||
|
my %maxLength_of :ATTR(:name<maxLength> :default<[]>);
|
||||||
|
my %pattern_of :ATTR(:name<pattern> :default<[]>);
|
||||||
|
my %enumeration_of :ATTR(:name<enumeration> :default<[]>);
|
||||||
|
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<[]>);
|
||||||
|
my %totalDigits_of :ATTR(:name<totalDigits> :default<[]>);
|
||||||
|
my %fractionDigits_of :ATTR(:name<fractionDigits> :default<[]>);
|
||||||
|
my %minExclusive :ATTR(:name<minExclusive> :default<[]>);
|
||||||
|
my %minInclusive :ATTR(:name<minInclusive> :default<[]>);
|
||||||
|
my %maxExclusive :ATTR(:name<maxExclusive> :default<[]>);
|
||||||
|
my %maxInclusive :ATTR(:name<maxInclusive> :default<[]>);
|
||||||
|
|
||||||
my %annotation_of :ATTR(:name<annotation> :default<()>);
|
my %annotation_of :ATTR(:name<annotation> :default<()>);
|
||||||
|
my %attribute_of :ATTR(:name<attribute> :default<()>);
|
||||||
my %element_of :ATTR(:name<element> :default<()>);
|
my %element_of :ATTR(:name<element> :default<()>);
|
||||||
my %flavor_of :ATTR(:name<flavor> :default<()>);
|
my %group_of :ATTR(:name<group> :default<()>);
|
||||||
|
my %variety_of :ATTR(:name<variety> :default<()>);
|
||||||
my %base_of :ATTR(:name<base> :default<()>);
|
my %base_of :ATTR(:name<base> :default<()>);
|
||||||
my %itemType_of :ATTR(:name<itemType> :default<()>);
|
my %itemType_of :ATTR(:name<itemType> :default<()>);
|
||||||
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
|
||||||
my %abstract_of :ATTR(:name<abstract> :default<()>);
|
my %abstract_of :ATTR(:name<abstract> :default<()>);
|
||||||
my %mixed_of :ATTR(:name<mixed> :default<()>); # default is false
|
my %mixed_of :ATTR(:name<mixed> :default<()>); # default is false
|
||||||
|
|
||||||
# is set to simpleContent/complexContent
|
# is set to simpleContent/complexContent
|
||||||
my %content_model_of :ATTR(:name<contentModel> :default<NONE>);
|
my %content_model_of :ATTR(:name<contentModel> :default<NONE>);
|
||||||
|
|
||||||
sub get_variety; *get_variety = \&get_flavor;
|
sub get_flavor; *get_flavor = \&get_variety;
|
||||||
|
|
||||||
sub push_element {
|
sub push_element {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $element = shift;
|
my $element = shift;
|
||||||
if ($flavor_of{ ident $self } eq 'all')
|
if ($variety_of{ ident $self } eq 'all')
|
||||||
{
|
{
|
||||||
$element->set_minOccurs(0) if not defined ($element->get_minOccurs);
|
$element->set_minOccurs(0) if not defined ($element->get_minOccurs);
|
||||||
$element->set_maxOccurs(1) if not defined ($element->get_maxOccurs);
|
$element->set_maxOccurs(1) if not defined ($element->get_maxOccurs);
|
||||||
}
|
}
|
||||||
elsif ($flavor_of{ ident $self } eq 'sequence')
|
elsif ($variety_of{ ident $self } eq 'sequence')
|
||||||
{
|
{
|
||||||
$element->set_minOccurs(1) if not defined ($element->get_minOccurs);
|
$element->set_minOccurs(1) if not defined ($element->get_minOccurs);
|
||||||
$element->set_maxOccurs(1) if not defined ($element->get_maxOccurs);
|
$element->set_maxOccurs(1) if not defined ($element->get_maxOccurs);
|
||||||
@@ -41,14 +55,14 @@ sub push_element {
|
|||||||
sub set_restriction {
|
sub set_restriction {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $element = shift;
|
my $element = shift;
|
||||||
$flavor_of{ ident $self } = 'restriction';
|
$variety_of{ ident $self } = 'restriction';
|
||||||
$base_of{ ident $self } = $element->{ Value };
|
$base_of{ ident $self } = $element->{ Value };
|
||||||
}
|
}
|
||||||
|
|
||||||
sub set_extension {
|
sub set_extension {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $element = shift;
|
my $element = shift;
|
||||||
$flavor_of{ ident $self } = 'extension';
|
$variety_of{ ident $self } = 'extension';
|
||||||
$base_of{ ident $self } = $element->{ Value };
|
$base_of{ ident $self } = $element->{ Value };
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,7 +77,7 @@ sub serialize {
|
|||||||
|
|
||||||
$opt->{ indent } ||= q{};
|
$opt->{ indent } ||= q{};
|
||||||
$opt->{ attributes } ||= [];
|
$opt->{ attributes } ||= [];
|
||||||
my $flavor = $self->get_flavor();
|
my $variety = $self->get_variety();
|
||||||
my $xml = ($opt->{ readable }) ? $opt->{ indent } : q{}; # add indentation
|
my $xml = ($opt->{ readable }) ? $opt->{ indent } : q{}; # add indentation
|
||||||
|
|
||||||
|
|
||||||
@@ -77,17 +91,17 @@ sub serialize {
|
|||||||
delete $opt->{ attributes }; # don't propagate...
|
delete $opt->{ attributes }; # don't propagate...
|
||||||
|
|
||||||
if ( $opt->{ autotype }) {
|
if ( $opt->{ autotype }) {
|
||||||
my $ns = $self->get_targetNamespace();
|
my $ns = $self->get_targetNamespace();
|
||||||
# reverse namespace by prefix hash
|
# reverse namespace by prefix hash
|
||||||
my %prefix_of = reverse %{ $opt->{ namespace } };
|
my %prefix_of = reverse %{ $opt->{ namespace } };
|
||||||
my $prefix = $prefix_of{ $ns }
|
my $prefix = $prefix_of{ $ns }
|
||||||
|| die 'No prefix found for namespace '. $ns;
|
|| die 'No prefix found for namespace '. $ns;
|
||||||
$xml .= join q{}, " type=\"$prefix:", $self->get_name(), '" '
|
$xml .= join q{}, " type=\"$prefix:", $self->get_name(), '" '
|
||||||
if ($self->get_name() );
|
if ($self->get_name() );
|
||||||
}
|
}
|
||||||
$xml .= '>';
|
$xml .= '>';
|
||||||
$xml .= "\n" if ( $opt->{ readable } ); # add linebreak
|
$xml .= "\n" if ( $opt->{ readable } ); # add linebreak
|
||||||
if ( ($flavor eq "sequence") or ($flavor eq "all") ) {
|
if ( ($variety eq "sequence") or ($variety eq "all") ) {
|
||||||
$opt->{ indent } .= "\t";
|
$opt->{ indent } .= "\t";
|
||||||
for my $element (@{ $self->get_element() }) {
|
for my $element (@{ $self->get_element() }) {
|
||||||
# might be list - listify
|
# might be list - listify
|
||||||
@@ -113,7 +127,7 @@ sub serialize {
|
|||||||
$opt->{ indent } =~s/\t$//;
|
$opt->{ indent } =~s/\t$//;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
die "sorry, we just handle all and sequence types yet...";
|
die "sorry, we just handle all and sequence types yet...";
|
||||||
}
|
}
|
||||||
$xml .= $opt->{ indent } if ( $opt->{ readable } ); # add indentation
|
$xml .= $opt->{ indent } if ( $opt->{ readable } ); # add indentation
|
||||||
$xml .= '</' . $name . '>';
|
$xml .= '</' . $name . '>';
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ sub serialize {
|
|||||||
# TODO: implement final and substitutionGroup - maybe never implement
|
# TODO: implement final and substitutionGroup - maybe never implement
|
||||||
# substitutionGroup ?
|
# substitutionGroup ?
|
||||||
|
|
||||||
$name ||= $self->get_name();
|
$name = $self->get_name() if not ($name);
|
||||||
|
|
||||||
if ( $opt->{ qualify } ) {
|
if ( $opt->{ qualify } ) {
|
||||||
$opt->{ attributes } = [ ' xmlns="' . $self->get_targetNamespace .'"' ];
|
$opt->{ attributes } = [ ' xmlns="' . $self->get_targetNamespace .'"' ];
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package SOAP::WSDL::XSD::Enumeration;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
|
our $VERSION=q{2.00_33};
|
||||||
|
|
||||||
|
#<enumeration value="">
|
||||||
|
|
||||||
|
# id provided by Base
|
||||||
|
# name provided by Base
|
||||||
|
# annotation provided by Base
|
||||||
|
|
||||||
|
# may be defined as atomic simpleType
|
||||||
|
my %value_of :ATTR(:name<value> :default<()>);
|
||||||
|
|
||||||
|
1;
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package SOAP::WSDL::XSD::Pattern;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
|
our $VERSION=q{2.00_33};
|
||||||
|
|
||||||
|
#<pattern value="">
|
||||||
|
|
||||||
|
# id provided by Base
|
||||||
|
# name provided by Base
|
||||||
|
# annotation provided by Base
|
||||||
|
|
||||||
|
# may be defined as atomic simpleType
|
||||||
|
my %value_of :ATTR(:name<value> :default<()>);
|
||||||
|
|
||||||
|
1;
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package SOAP::WSDL::XSD::Group;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
|
our $VERSION=q{2.00_33};
|
||||||
|
|
||||||
|
#<xs:group name="myModelGroup">
|
||||||
|
# <xs:sequence>
|
||||||
|
# <xs:element ref="someThing"/>
|
||||||
|
# . . .
|
||||||
|
# </xs:sequence>
|
||||||
|
#</xs:group>
|
||||||
|
#
|
||||||
|
#<xs:complexType name="trivial">
|
||||||
|
# <xs:group ref="myModelGroup"/>
|
||||||
|
# <xs:attribute .../>
|
||||||
|
#</xs:complexType>
|
||||||
|
#
|
||||||
|
#<xs:complexType name="moreSo">
|
||||||
|
# <xs:choice>
|
||||||
|
# <xs:element ref="anotherThing"/>
|
||||||
|
# <xs:group ref="myModelGroup"/>
|
||||||
|
# </xs:choice>
|
||||||
|
# <xs:attribute .../>
|
||||||
|
#</xs:complexType>
|
||||||
|
|
||||||
|
my %ref_of :ATTR(:name<ref> :default<()>);
|
||||||
|
|
||||||
|
my %maxOccurs_of :ATTR(:name<maxOccurs> :default<()>);
|
||||||
|
my %minOccurs_of :ATTR(:name<minOccurs> :default<()>);
|
||||||
|
my %annotation_of :ATTR(:name<annotation> :default<()>);
|
||||||
|
my %element_of :ATTR(:name<element> :default<()>);
|
||||||
|
my %group_of :ATTR(:name<group> :default<()>);
|
||||||
|
my %variety_of :ATTR(:name<variety> :default<()>);
|
||||||
|
|
||||||
|
1;
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user