Compare commits

...
3 Commits
Author SHA1 Message Date
Martin Kutter 0cbf981665 import SOAP-WSDL 2.00_33 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_33
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_33.tar.gz
2009-12-12 19:48:28 -08:00
Martin Kutter 51db446428 import SOAP-WSDL 2.00_32 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_32
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_32.tar.gz
2009-12-12 19:48:24 -08:00
Martin Kutter f0b3bdc201 import SOAP-WSDL 2.00_31 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_31
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_31.tar.gz
2009-12-12 19:48:21 -08:00
178 changed files with 4643 additions and 1645 deletions
+9 -7
View File
@@ -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_29', 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,
+207 -111
View File
@@ -1,4 +1,4 @@
Release notes for SOAP::WSDL 2.00_29 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,9 +34,105 @@ 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 2.00_29
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/).
@@ -53,13 +149,13 @@ The following uncategorized improvements have been made:
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:
@@ -67,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/).
@@ -91,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/).
@@ -110,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
@@ -137,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/).
@@ -155,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/).
@@ -170,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
@@ -178,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.
@@ -342,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
@@ -358,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
@@ -370,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
@@ -406,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
@@ -417,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
@@ -428,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
@@ -469,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
@@ -536,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
@@ -567,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).
+56 -4
View File
@@ -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,9 +93,12 @@ 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
@@ -102,13 +107,23 @@ 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
@@ -120,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
@@ -129,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
@@ -165,13 +184,27 @@ 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/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/Attribute.pm
lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin.pm lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
@@ -224,13 +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
patches/Manual.diff
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
@@ -281,14 +315,23 @@ 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_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.wsdl
t/acceptance/wsdl/WSDLParser_import_loop.wsdl
t/contributed.wsdl t/contributed.wsdl
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
@@ -313,6 +356,7 @@ 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.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
@@ -322,14 +366,16 @@ 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_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
@@ -338,8 +384,14 @@ 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/Attribute.t
t/SOAP/WSDL/XSD/Typelib/Builtin/01_constructors.t t/SOAP/WSDL/XSD/Typelib/Builtin/01_constructors.t
+80 -19
View File
@@ -1,6 +1,6 @@
--- ---
name: SOAP-WSDL name: SOAP-WSDL
version: 2.00_29 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,32 +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_29 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: SOAP::WSDL::XSD::Attribute:
file: lib/SOAP/WSDL/XSD/Attribute.pm file: lib/SOAP/WSDL/XSD/Attribute.pm
version: 2.00_29 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: SOAP::WSDL::XSD::Typelib::Attribute:
file: lib/SOAP/WSDL/XSD/Typelib/Attribute.pm file: lib/SOAP/WSDL/XSD/Typelib/Attribute.pm
version: 2.00_29
SOAP::WSDL::XSD::Typelib::AttributeSet: SOAP::WSDL::XSD::Typelib::AttributeSet:
file: lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm 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
@@ -265,7 +323,7 @@ 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_29 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_29 version: 2.00_29
@@ -273,6 +331,9 @@ provides:
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
+35 -6
View File
@@ -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
View File
@@ -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;
+22 -4
View File
@@ -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.
+10 -11
View File
@@ -39,8 +39,7 @@ $lite->on_action( sub { 'http://www.example.org/benchmark/ListPerson' } );
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;
my $count = 100;
my @data = (); my @data = ();
my $n = 0; my $n = 0;
print "Benchmark conducted with print "Benchmark conducted with
@@ -54,22 +53,22 @@ Benchmark $n: Store result in private variable and destroy it
$n++; $n++;
cmpthese $count, { 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' => sub { my $result = $call->() }, # 'XML::Compile' => sub { my $result = $call->() },
'SOAP::WSDL_XS' => sub { my $result = $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') }, # 'SOAP::Lite' => sub { my $som = $lite->call('ListPerson') },
}; };
print "\nBenchmark $n: Push result on list\n"; print "\nBenchmark $n: Push result on list\n";
$n++; $n++;
cmpthese $count, { 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' => 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') }, # 'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
}; };
@data = (); @data = ();
@@ -77,10 +76,10 @@ print "\nBenchmark $n: Play it again, Sam\n";
cmpthese $count, { 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' => 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') }, # 'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
}; };
+19
View File
@@ -0,0 +1,19 @@
use lib '../lib';
use lib '../example/lib';
use lib '../../SOAP-WSDL_XS/blib/lib';
use lib '../../SOAP-WSDL_XS/blib/arch';
use strict;
# use Benchmark;
use SOAP::WSDL::Deserializer::XSD_XS;
use SOAP::WSDL::Factory::Deserializer;
# # register for SOAP 1.1
SOAP::WSDL::Factory::Deserializer->register('1.1' => 'SOAP::WSDL::Deserializer::XSD_XS' );
use MyInterfaces::TestService::TestPort;
my $soap = MyInterfaces::TestService::TestPort->new();
# Load all classes - XML::Compile has created everything before, too
if (@ARGV) { print $soap->ListPerson({}) }
else {
$soap->ListPerson({})
}
File diff suppressed because one or more lines are too long
+39 -38
View File
@@ -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 -1
View File
@@ -2,7 +2,7 @@
package main; package main;
use strict; use strict;
use warnings; use warnings;
#use lib qw(../lib ../../lib); use lib qw(../lib ../../lib);
use MyElements::ListPersonResponse; use MyElements::ListPersonResponse;
use MyServer::TestService::TestPort; use MyServer::TestService::TestPort;
my $server = MyServer::TestService::TestPort->new({ my $server = MyServer::TestService::TestPort->new({
+79 -18
View File
@@ -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
View File
@@ -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' };
+19 -42
View File
@@ -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
+13 -13
View File
@@ -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
+4 -3
View File
@@ -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
+59 -3
View File
@@ -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] );
+8 -7
View File
@@ -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 = $_;
@@ -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,7 @@ sub _initialize {
$current = bless \$o, $_class; $current = bless \$o, $_class;
} }
# set attributes if there are any
$current->attr({ @_[2..$#_] }) if (@_ > 2); $current->attr({ @_[2..$#_] }) if (@_ > 2);
$depth++; $depth++;
@@ -294,8 +295,8 @@ the same terms as perl itself
$Id: $ $Id: $
$LastChangedDate: 2008-01-19 13:57:57 +0100 (Sa, 19 Jan 2008) $ $LastChangedDate: 2008-03-29 22:38:55 +0100 (Sa, 29 Mrz 2008) $
$LastChangedRevision: 497 $ $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 $
+106 -4
View File
@@ -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_29}; 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) = @_;
@@ -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 $
+1 -1
View File
@@ -16,7 +16,7 @@ sub register {
sub get_deserializer { sub get_deserializer {
my ($self, $args_of_ref) = @_; my ($self, $args_of_ref) = @_;
$args_of_ref->{ soap_version } ||= '1.1';
# sanity check # sanity check
die "no deserializer registered for SOAP version $args_of_ref->{ soap_version }" die "no deserializer registered for SOAP version $args_of_ref->{ soap_version }"
if not exists ($DESERIALIZER{ $args_of_ref->{ soap_version } }); if not exists ($DESERIALIZER{ $args_of_ref->{ soap_version } });
+3 -3
View File
@@ -16,7 +16,7 @@ sub register {
sub get_serializer { sub get_serializer {
my ($self, $args_of_ref) = @_; my ($self, $args_of_ref) = @_;
$args_of_ref->{ soap_version } ||= '1.1';
# sanity check # sanity check
die "no serializer registered for SOAP version $args_of_ref->{ soap_version }" die "no serializer registered for SOAP version $args_of_ref->{ soap_version }"
if not exists ($SERIALIZER{ $args_of_ref->{ soap_version } }); if not exists ($SERIALIZER{ $args_of_ref->{ soap_version } });
@@ -138,9 +138,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 391 $ $Rev: 510 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Serializer.pm 391 2007-11-17 21:56:13Z kutterma $ $Id: Serializer.pm 510 2008-01-29 08:03:46Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
=cut =cut
+10 -10
View File
@@ -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
+268
View File
@@ -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
+113
View File
@@ -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
+40 -22
View File
@@ -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
+88 -67
View File
@@ -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;
%] %]
@@ -48,12 +46,12 @@ __END__
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
@@ -82,7 +80,6 @@ All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
[% 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 %]
@@ -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 ); %]
}, },
@@ -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;
@@ -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;
@@ -27,7 +28,7 @@ __END__
[% head1 %] NAME [% head1 %] NAME
[% typemap_prefix %]::[% service.get_name.replace('\.','::').replace('-', '_') %]; - typemap for ::[% service.get_name %]; [% XSD.create_typemap_name(service) %] - typemap for [% service.get_name %]
[% head1 %] DESCRIPTION [% head1 %] DESCRIPTION
@@ -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,14 +1,15 @@
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...
#-%] #-%]
package [% type_prefix %]::[% complexType.get_name.replace('\.','::').replace('-','_') %]::_ATTR; [% INCLUDE complexType/contentModel.tt %]
use base qw(SOAP::WSDL::XSD::Typelib::AttributeSet);
[% INCLUDE complexType/attributeSet.tt %]
1; 1;
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%] [%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
@@ -21,22 +22,35 @@ use base qw(SOAP::WSDL::XSD::Typelib::AttributeSet);
[% head1 %] NAME [% head1 %] NAME
[% type_prefix %]::[% complexType.get_name.replace('\.','::').replace('-','_') %] [% XSD.create_xsd_name(complexType) %]
[% head1 %] DESCRIPTION [% head1 %] DESCRIPTION
Perl data type class for the XML Schema defined complextype 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 %].
[% INCLUDE POD/annotation.tt(node = complexType) %]
[% IF (complexType.get_element); %]
[% head2 %] PROPERTIES [% 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 %]
=back
[% END -%]
[% head1 %] METHODS [% head1 %] METHODS
[% head2 %] new [% head2 %] new
@@ -45,6 +59,8 @@ Constructor. The following data structure may be passed to new():
[% indent = ' '; INCLUDE complexType/POD/structure.tt %] [% indent = ' '; INCLUDE complexType/POD/structure.tt %]
[% INCLUDE complexType/POD/attributeSet.tt %]
[% head1 %] AUTHOR [% 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;
{ {
@@ -1,12 +1,15 @@
{ # BLOCK to scope variables [% IF (complexType.get_attribute.size) -%]
[% package [% XSD.create_xmlattr_name(complexType) %];
use base qw(SOAP::WSDL::XSD::Typelib::AttributeSet);
FOREACH element = complexType.get_attribute %] { # BLOCK to scope variables
[% FOREACH element = complexType.get_attribute %]
my %[% element.get_name %]_of :ATTR(:get<[% element.get_name %]>); my %[% element.get_name %]_of :ATTR(:get<[% element.get_name %]>);
[%- END %] [%- END %]
__PACKAGE__->_factory( __PACKAGE__->_factory(
[ qw([% FOREACH element = complexType.get_attribute %] [ qw(
[%- FOREACH element = complexType.get_attribute %]
[% element.get_name -%] [% element.get_name -%]
[% END %] [% END %]
) ], ) ],
@@ -18,23 +21,24 @@ __PACKAGE__->_factory(
{ {
[% FOREACH element = complexType.get_attribute; [% FOREACH element = complexType.get_attribute;
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 %] => 'SOAP::WSDL::XSD::Typelib::Builtin::[% element_type.1 %]', [% element.get_name %] => '[% XSD.create_xsd_name(element_type) %]',
[% ELSE -%] [%
[% element.get_name %] => '[% type_prefix %]::[% element_type.1 %]', ELSIF (ref = element.get_ref);
[% END; attribute = definitions.first_types.find_attribute( complexType.expand(ref) );
ELSE; # element_type = definitions.get_types.0.find_type(complexType.expand( attribute.get_type ));
IF (element.first_simpleType); %]
[% attribute.get_name %] => '[% XSD.create_xsd_name(attribute) %]',
[% ELSIF (element.first_simpleType);
THROW NOT_IMPLEMENTED , "Attributes with atomic simpleType definition are not implemented yet"; THROW NOT_IMPLEMENTED , "Attributes with atomic simpleType definition are not implemented yet";
atomic_types.${ element.get_name } = element.first_simpleType; atomic_types.${ element.get_name } = element.first_simpleType;
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 attribute ${ element.get_name } in ${ complexType.get_name } - don't know what to do with it";
END; %] END;
[% element.get_name %] => '[% type_prefix %]::[% complexType.get_name %]::_[% element.get_name %]',
[% END;
END -%] END -%]
} }
); );
} # end BLOCK } # 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 %]
+15 -15
View File
@@ -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,17 +13,21 @@ __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 ); %]
); );
} }
@@ -40,16 +45,9 @@ 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 -%] [% INCLUDE complexType/contentModel.tt -%]
}
package [% element_prefix %]::[% element.get_name.replace('\.','::').replace('-','_') %]::_ATTR;
use base qw(SOAP::WSDL::XSD::Typelib::AttributeSet);
[% INCLUDE complexType/attributeSet.tt %]
[% ELSE %]
} # end of BLOCK } # end of BLOCK
[% END %] [% END %]
@@ -66,18 +64,20 @@ use base qw(SOAP::WSDL::XSD::Typelib::AttributeSet);
[% 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 %].
[% INCLUDE POD/annotation.tt(node = element) %]
[% head1 %] METHODS [% head1 %] METHODS
[% head2 %] new [% head2 %] new
my $element = [% element_prefix %]::[% element.get_name %]->new($data); 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():
@@ -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;
@@ -20,20 +21,18 @@ __END__
[% pod %] [% pod %]
[% head1 %] [% type_prefix %]::[% simpleType.get_name.replace('\.','::').replace('-','_') %] [% head1 %] NAME
[% XSD.create_name(simpleType) %]
[% head1 %] DESCRIPTION [% 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/contentModel.tt(simpleType = simpleType) %]
INCLUDE simpleType/POD/restriction.tt;
ELSE;
THROW NOT_IMPLEMENTED "simpleType union not implemented yet in $simpleType.get_name";
END %]
[% head1 %] METHODS [% head1 %] METHODS
@@ -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
);
+15 -12
View File
@@ -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
+39 -125
View File
@@ -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,11 +137,12 @@ 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() || [] }) {
@@ -251,7 +151,21 @@ sub visit_XSD_ComplexType {
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";
} }
+9 -9
View File
@@ -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);
}; };
+14 -11
View File
@@ -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
+158 -54
View File
@@ -305,18 +305,17 @@ 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
XML attributes are not implemented yet. The documentation below sketches
how XML attributes will be implemented in the future.
All XML attributes are derived from SOAP::WSDL::XSD::Typelib::Attribute.
The attribute set for a XML element (derived from anySimpleType or The attribute set for a XML element (derived from anySimpleType or
complexType) is implemented as a sub-package of the element derived from complexType) is implemented as a sub-package of the element derived from
SOAP::WSDL::XSD::Typelib::AttributeSet. SOAP::WSDL::XSD::Typelib::AttributeSet.
The sub-package is named as the top package, suffixed with C<_ATTR>. 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 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 C<attr>. The name is chosen to allow mimicing SOAP::Lite's behaviour, which
@@ -336,6 +335,28 @@ get_FOO methods.
The C<attr> method provides auto-vivification: An xml object's attribute set The C<attr> method provides auto-vivification: An xml object's attribute set
is instantiated when accessed. 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.
=head1 CAVEATS =head1 CAVEATS
=over =over
@@ -364,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 -4
View File
@@ -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;
+3 -2
View File
@@ -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
+1 -1
View File
@@ -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
+57 -2
View File
@@ -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
+1 -1
View File
@@ -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;
+65 -15
View File
@@ -2,11 +2,15 @@ package SOAP::WSDL::TypeLookup;
use strict; use strict;
use warnings; use warnings;
our $VERSION=q{2.00_29}; our $VERSION=q{2.00_31};
my %TYPES = ( 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',
@@ -83,16 +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 => 'CLASS', type => 'CLASS',
class => 'SOAP::WSDL::XSD::Attribute' # not implemented yet 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
@@ -107,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
@@ -154,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;
+10
View File
@@ -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
+20
View File
@@ -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;
+7 -4
View File
@@ -19,14 +19,17 @@ our $VERSION=q{2.00_29};
# Content: (annotation?, (simpleType?)) # Content: (annotation?, (simpleType?))
#</attribute> #</attribute>
# id provided by Base
# name provided by Base
# annotation provided by Base
my %default_of :ATTR(:name<default> :default<()>); my %default_of :ATTR(:name<default> :default<()>);
my %fixed_of :ATTR(:name<fixed> :default<()>); my %fixed_of :ATTR(:name<fixed> :default<()>);
my %form_of :ATTR(:name<form> :default<()>); my %form_of :ATTR(:name<form> :default<()>);
# id provided by Base
# name provided by Base
my %type_of :ATTR(:name<type> :default<()>); my %type_of :ATTR(:name<type> :default<()>);
my %use_of :ATTR(:name<use> :default<()>); my %use_of :ATTR(:name<use> :default<()>);
my %ref_of :ATTR(:name<ref> :default<()>);
# may be defined as atomic simpleType # may be defined as atomic simpleType
my %simpleType_of :ATTR(:name<simpleType> :default<()>); my %simpleType_of :ATTR(:name<simpleType> :default<()>);
+27
View File
@@ -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;
+1 -1
View File
@@ -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) {
+32 -19
View File
@@ -6,32 +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 %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);
@@ -42,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 };
} }
@@ -64,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
@@ -78,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
@@ -114,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 . '>';
+1 -1
View File
@@ -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 .'"' ];
+18
View File
@@ -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;
+18
View File
@@ -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;
+38
View File
@@ -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;
+18
View File
@@ -0,0 +1,18 @@
package SOAP::WSDL::XSD::Length;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::Base);
our $VERSION=q{2.00_33};
#<minExclusive 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;
+18
View File
@@ -0,0 +1,18 @@
package SOAP::WSDL::XSD::MaxExclusive;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::Base);
our $VERSION=q{2.00_33};
#<minExclusive 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;
+18
View File
@@ -0,0 +1,18 @@
package SOAP::WSDL::XSD::MaxInclusive;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::Base);
our $VERSION=q{2.00_33};
#<minExclusive 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;
+18
View File
@@ -0,0 +1,18 @@
package SOAP::WSDL::XSD::MaxLength;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::Base);
our $VERSION=q{2.00_33};
#<maxLength 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;
+18
View File
@@ -0,0 +1,18 @@
package SOAP::WSDL::XSD::MinExclusive;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::Base);
our $VERSION=q{2.00_33};
#<minExclusive 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;

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