Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f0b3bdc201 | ||
|
|
874251225f | ||
|
|
2bad767211 | ||
|
|
7ca2154ad6 |
7
Build.PL
7
Build.PL
@@ -5,11 +5,11 @@ $build = Module::Build->new(
|
||||
create_makefile_pl => 'passthrough',
|
||||
dist_abstract => 'SOAP with WSDL support',
|
||||
dist_name => 'SOAP-WSDL',
|
||||
dist_version => '2.00_27',
|
||||
dist_version => '2.00_31',
|
||||
module_name => 'SOAP::WSDL',
|
||||
license => 'artistic',
|
||||
requires => {
|
||||
# 5.6.x is way too buggy and has no unicode support
|
||||
# 5.6.x is way too buggy and has no unicode support
|
||||
# for us. SOAP-WSDL relies on unicode (WS-I demands it)
|
||||
# and triggers several 5.6 bugs...
|
||||
'perl' => q(5.8.0),
|
||||
@@ -24,6 +24,7 @@ $build = Module::Build->new(
|
||||
'LWP::UserAgent' => 0,
|
||||
'Template' => 0,
|
||||
'Term::ReadKey' => 0,
|
||||
'URI' => 0,
|
||||
'XML::Parser::Expat' => 0,
|
||||
},
|
||||
buildrequires => {
|
||||
@@ -39,7 +40,7 @@ $build = Module::Build->new(
|
||||
'File::Spec' => 0,
|
||||
'Storable' => 0,
|
||||
'Test::More' => 0,
|
||||
'Template' => 0,
|
||||
'Template' => 0,
|
||||
'XML::Parser::Expat' => 0,
|
||||
},
|
||||
recursive_test_files => 1,
|
||||
|
||||
289
Changes
289
Changes
@@ -1,4 +1,4 @@
|
||||
Release notes for SOAP::WSDL 2.00_27
|
||||
Release notes for SOAP::WSDL 2.00_31
|
||||
-------
|
||||
|
||||
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 sets HTTP headers right
|
||||
* Efficient documentation
|
||||
o SOAP::WSDL::Manual guides you at getting your work done, not at
|
||||
o SOAP::WSDL::Manual guides you at getting your work done, not at
|
||||
the module's internals
|
||||
* Thorough test suite
|
||||
o SOAP::WSDL is heavily regression tested, with a test coverage of
|
||||
over 95% (excluding documentation - you wouldn't want to read
|
||||
o SOAP::WSDL is heavily regression tested, with a test coverage of
|
||||
over 95% (excluding documentation - you wouldn't want to read
|
||||
through it all).
|
||||
* SOAP::Lite like look and feel
|
||||
o Where possible, SOAP::WSDL mimics SOAP::Lite's API to allow easy migrations
|
||||
* XML schema based class library for creating data objects
|
||||
* High-performance XML parser
|
||||
* Plugin support. SOAP::WSDL can be extended through plugins in various aspects.
|
||||
* Plugin support. SOAP::WSDL can be extended through plugins in various aspects.
|
||||
The following plugins are supported:
|
||||
o Transport plugins via SOAP::WSDL::Factory::Transport
|
||||
o Serializer plugins via SOAP::WSDL::Factory::Serializer
|
||||
@@ -34,15 +34,88 @@ Features:
|
||||
|
||||
The following changes have been made:
|
||||
|
||||
2.00_31 - Feb 11 2007
|
||||
|
||||
The following features were added (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||
|
||||
* [ 1883843 ] Support wsdl:import
|
||||
* [ 1883863 ] Support xsd:import
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
* The WSDL Parser now warns about unsupported WSDL / XML schema elements
|
||||
* Fixed path handling in t/006_client.t
|
||||
* Removed useless ms regex flag in SOAP::WSDL::Factory::Transport
|
||||
* The test suite has been improved
|
||||
|
||||
2.00_30 - unreleased
|
||||
|
||||
The following features were added (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||
|
||||
* [ 1875288 ] Support XML attributes (partial)
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||
|
||||
* [ 1876435 ] Test on perl-5.10 fails
|
||||
* #32611 empty complexType structure classes are missing 'use Class::Std::Fast::Storable'
|
||||
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
* ComplexType objects now accept { foo => undef } in constructor and handle
|
||||
it as non-present child element foo.
|
||||
* Updated test suite
|
||||
* Updated SOAP::WSDL::Client::Base to correctly handle SOAP calls with
|
||||
no parameters (empty parts)
|
||||
* Test on perl-5.10 fails when SOAP::Lite is not installed
|
||||
|
||||
2.00_29
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||
|
||||
* #32188: minor bug found and fixed in WSDL generation
|
||||
* [ 1871175 ] Can't delete attributes from ComplexType objects
|
||||
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
* Updated SOAP::WSDL::Manual::XSD
|
||||
* Removed pod directives from templates to avoid confusing CPAN's pod
|
||||
viewer
|
||||
* Initial (incomplete) XML attribute support
|
||||
* Updated test suite
|
||||
|
||||
2.00_28
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||
|
||||
* #32062: minor doc fixes
|
||||
* [ 1852988 ] Generated Interface POD is invalid
|
||||
* [ 1855583 ] t/SOAP/WSDL/XSD/Typelib/ComplexType.t requires Test::Warn
|
||||
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
* Updated SOAP::WSDL::Manual::WS_I to reflect new Server modules
|
||||
|
||||
2.00_27
|
||||
|
||||
The following features were added (the numbers in square brackets are the
|
||||
The following features were added (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||
|
||||
* [ 1850793 ] Add a to_hash_ref method
|
||||
* [ 1844427 ] Support multiple parts in body
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
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/).
|
||||
|
||||
@@ -60,10 +133,10 @@ The following uncategorized improvements have been made:
|
||||
|
||||
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):
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||
|
||||
@@ -79,25 +152,25 @@ The following uncategorized improvements have been made:
|
||||
---
|
||||
WARNING: INCOMPATIBLE CHANGE:
|
||||
|
||||
SOAP::WSDL now uses Class::Std::Fast. Read the MIGRATING guide for
|
||||
SOAP::WSDL now uses Class::Std::Fast. Read the MIGRATING guide for
|
||||
upgrading from previous versions.
|
||||
You probably need to re-generate all your interfaces.
|
||||
|
||||
WARNING: INCOMPATIBLE CHANGE:
|
||||
|
||||
SOAP::WSDL::XSD::Typelib::anySimpleType based objects no longer serialize
|
||||
SOAP::WSDL::XSD::Typelib::anySimpleType based objects no longer serialize
|
||||
to their XML value on stringification.
|
||||
This means that strings are no longer XML-escaped when the simpleType
|
||||
This means that strings are no longer XML-escaped when the simpleType
|
||||
containing the string is printed or used like this:
|
||||
|
||||
my $value = "$simpleType";
|
||||
|
||||
Note that ComplexType objects still serialize to their XML on
|
||||
stringification. This Change is due to the demands of applications
|
||||
embedding SOAP::WSDL::XSD::Typelib objects in templates - it would mean
|
||||
Note that ComplexType objects still serialize to their XML on
|
||||
stringification. This Change is due to the demands of applications
|
||||
embedding SOAP::WSDL::XSD::Typelib objects in templates - it would mean
|
||||
a nasty ->get_value for every (simple) value.
|
||||
|
||||
The following features were added (the numbers in square brackets are the
|
||||
The following features were added (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||
|
||||
* [ 1837347 ] Use Class::Std::Fast
|
||||
@@ -106,7 +179,7 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||
for even faster XS implementations.
|
||||
* [ 1842436 ] Add SOAP Server
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||
|
||||
@@ -124,13 +197,13 @@ The following uncategorized improvements have been made:
|
||||
|
||||
2.00_24
|
||||
---
|
||||
The following features were added (the numbers in square brackets are the
|
||||
The following features were added (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||
|
||||
* [ 1832998 ] Make interface methods complain when called as class method
|
||||
* [ 1826833 ] listify all XSD type objects when called as @{}
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||
|
||||
@@ -139,7 +212,7 @@ The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||
* [ 1828240 ] POD Defects
|
||||
* [ 1792348 ] 006_client.t requires SOAP::Lite (again)
|
||||
|
||||
The following uncategorized improvements have been made:
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
* The test suite has been improved
|
||||
* Documentation has been improved
|
||||
@@ -147,160 +220,160 @@ The following uncategorized improvements have been made:
|
||||
2.00_23
|
||||
---
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
|
||||
* [ 1826382 ] nillable elements not serialized as xsi:nil
|
||||
* [ 1826337 ] Second element in complexType gets eaten up
|
||||
* [ 1792348 ] 006_client.t requires SOAP::Lite (again)
|
||||
|
||||
The following uncategorized improvements have been made:
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
* Test for complexType containing element with atomic simpleType added
|
||||
|
||||
2.00_22
|
||||
----
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
|
||||
* [ 1817697 ] Dots in service/port names lead to broken interfaces
|
||||
* [ 1817699 ] Templates not found on all OS
|
||||
|
||||
The following uncategorized improvements have been made:
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
* Code cleanup. The XSD library has been cleaned up a bit. Should result
|
||||
* Code cleanup. The XSD library has been cleaned up a bit. Should result
|
||||
in a minor speedup in serializing and deserializing XML messages,
|
||||
|
||||
2.00_21 - not released
|
||||
----
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
|
||||
* [ 1810058 ] .tt's pod indexed on CPAN (again)
|
||||
* [ 1809284 ] Rename SOAP::WSDL::Deserializer::SOAP11 to ::XSD
|
||||
|
||||
The following uncategorized improvements have been made:
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
* Requires at least perl 5.8.0. This is due to a bug in perls before -
|
||||
* Requires at least perl 5.8.0. This is due to a bug in perls before -
|
||||
see http://aspn.activestate.com/ASPN/Mail/Message/perl5-porters/929746
|
||||
|
||||
2.00_20
|
||||
----
|
||||
The following features were added (the numbers in square brackets are the
|
||||
The following features were added (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||
|
||||
* [ 1815646 ] Only include last part of port name in interface
|
||||
* [ 1815648 ] Methods with empty body cannot be called as ->method()
|
||||
* [ 1815651 ] Empty complexType definitions not supported
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
|
||||
* [ 1815643 ] ComplexTypes cannot be freezed/thawed
|
||||
|
||||
The following uncategorized improvements have been made:
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
* WSDL definitions are decoded into utf8
|
||||
* fixed tests to use correct path on windows
|
||||
|
||||
2.00_19
|
||||
----
|
||||
The following features were added (the numbers in square brackets are the
|
||||
The following features were added (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||
|
||||
* [ 1810395 ] Implement complexType complexContent extension
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
|
||||
* [ 1813144 ] Typemap not used in interface class
|
||||
* [ 1810058 ] .tt's pod indexed on CPAN
|
||||
|
||||
The following uncategorized improvements have been made:
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
* Documentation improvements
|
||||
|
||||
2.00_18
|
||||
----
|
||||
The following features were added (the numbers in square brackets are the
|
||||
The following features were added (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||
|
||||
* [ 1790983 ] Create generator Plugin API
|
||||
Generator factory is SOAP::WSDL::Factory::Generator
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
|
||||
* [ 1805252 ] t/SOAP/WSDL/XSD/Typelib/Builtin/004_time.t fails
|
||||
The default timezone conversion has been fixed.
|
||||
|
||||
The following uncategorized improvements have been made:
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
* Documentation improvements
|
||||
* Test updates
|
||||
* readable() has been converted into a no-op, as it already had no effect
|
||||
* readable() has been converted into a no-op, as it already had no effect
|
||||
any more
|
||||
|
||||
2.00_17
|
||||
----
|
||||
The following features were added (the numbers in square brackets are the
|
||||
The following features were added (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
|
||||
* [ 1772617 ] SOAP Header not working
|
||||
Added header support. Currently, SOAP headers are only supported with
|
||||
Added header support. Currently, SOAP headers are only supported with
|
||||
the SOM or the XSD (SOAP11) serializer.
|
||||
|
||||
* [ 1805238 ] Tests in t/SOAP/WSDL don't work when run from t/
|
||||
|
||||
* [ 1805241 ] explain() broken in SOAP::WSDL
|
||||
explain has been removed from SOAP::WSDL
|
||||
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
* Added limited support for complexType complexContent content model with
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
* Added limited support for complexType complexContent content model with
|
||||
restriction variety.
|
||||
SOAP::WSDL now supports this XML Schema definition variant, although no
|
||||
constraints are imposed on derived types yet.
|
||||
Derived types do not serialize with a xsi:type attribute (and the xsi:type
|
||||
attribute is not recognized by the XML parser), so you cannot use derived
|
||||
Derived types do not serialize with a xsi:type attribute (and the xsi:type
|
||||
attribute is not recognized by the XML parser), so you cannot use derived
|
||||
types as a substitute for theri parent, yet.
|
||||
|
||||
* Added support for complexType choice variety
|
||||
complexType definitions using the choice variety are now supported,
|
||||
even though the content is not checked (if you pass in invalid data,
|
||||
even though the content is not checked (if you pass in invalid data,
|
||||
invalid XML will be generated).
|
||||
|
||||
* Added Loopback Transport backend.
|
||||
SOAP::WSDL::Tranport::Loopback just returns the request as respons, but
|
||||
SOAP::WSDL::Tranport::Loopback just returns the request as respons, but
|
||||
allows testing the whole chain from user interface to transport backend.
|
||||
|
||||
* Fixed SOAP::WSDL::Factory::Transport prefer user-registered
|
||||
* Fixed SOAP::WSDL::Factory::Transport prefer user-registered
|
||||
transport backend
|
||||
|
||||
* Fixed set_soap_version method in SOAP::WSDL::Client.
|
||||
Re-setting the SOAP version now invalidates (resets) serializer and
|
||||
Re-setting the SOAP version now invalidates (resets) serializer and
|
||||
deserializer, but not the transport backend.
|
||||
|
||||
* Fixed SOAP::WSDL::XSD::Typelib::Builtin::boolean to return false
|
||||
* Fixed SOAP::WSDL::XSD::Typelib::Builtin::boolean to return false
|
||||
when false and true when true.
|
||||
|
||||
* SOAP::WSDL::XSD::Typelib::Builtin::normalizedString now replaces all
|
||||
* SOAP::WSDL::XSD::Typelib::Builtin::normalizedString now replaces all
|
||||
occurences of tab, newline and carriage return by whitespce on set_value.
|
||||
|
||||
* Code cleanup
|
||||
o Lots of orphan methods now replaced by the SOAP::WSDL::Generator
|
||||
o Lots of orphan methods now replaced by the SOAP::WSDL::Generator
|
||||
hierarchy have been removed.
|
||||
o Unused (and unusable) readable option checking has been removed in
|
||||
o Unused (and unusable) readable option checking has been removed in
|
||||
SOAP::WSDL::Serializer::SOAP11.
|
||||
o Unused XML Schema facet attributes have been removed from XSD Builtin
|
||||
o Unused XML Schema facet attributes have been removed from XSD Builtin
|
||||
classes
|
||||
o Methods common to all expat parser classes have been factored out
|
||||
o Methods common to all expat parser classes have been factored out
|
||||
into a common base class.
|
||||
|
||||
|
||||
* XML serialization speedup for SOAP::WSDL::XSD::* objects
|
||||
|
||||
* Tests added to improve test coverage.
|
||||
@@ -311,7 +384,7 @@ The following uncategorized improvements have been made:
|
||||
|
||||
2.00_16
|
||||
----
|
||||
The following features were added (the numbers in square brackets are the
|
||||
The following features were added (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||
|
||||
* [ 1761532 ] Support embedded atomic types
|
||||
@@ -327,11 +400,11 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||
* [ 1803330 ] Create one interface per port
|
||||
SOAP::WSDL now creates one interface per port, not one per service.
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
|
||||
* [ 1804441 ] parts from binding not regarded in SOAP::WSDL
|
||||
SOAP::WSDL (interpreter mode) now respects the body parts specified in the
|
||||
SOAP::WSDL (interpreter mode) now respects the body parts specified in the
|
||||
binding.
|
||||
|
||||
* [ 1803763 ] nonNegativeInteger misspelled in Schema::Builtin
|
||||
@@ -339,35 +412,35 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
* [ 1793965 ] _expand() does not work on non-root-node ns declarations
|
||||
|
||||
* [ 1792348 ] 006_client.t requires SOAP::Lite in 2.00_15
|
||||
SOAP::WSDL no longer attempts to load SOAP::WSDL::Deserializer::SOM when
|
||||
SOAP::WSDL no longer attempts to load SOAP::WSDL::Deserializer::SOM when
|
||||
no_dispatch is set.
|
||||
006_client.t now sets outputxml(1), to be really sure.
|
||||
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
* Code generator only generates interface for the first port in a service
|
||||
The code generator now generates interfaces for all ports.
|
||||
Note: The naming scheme has changed. It is now
|
||||
InterfacePrefix::Service::Port
|
||||
|
||||
|
||||
* XML Parser speedup
|
||||
The XML parser has received a little speedup.
|
||||
|
||||
* A number of errors in parsing / traversing WSDL documents have been
|
||||
|
||||
* A number of errors in parsing / traversing WSDL documents have been
|
||||
corrected.
|
||||
|
||||
|
||||
* Documentation has been improved
|
||||
|
||||
|
||||
* A number of (incorrect, but passing) tests have been fixed.
|
||||
|
||||
* Code cleanup: The SOAP::WSDL::SAX* modules are no longer included, as they
|
||||
are not supported any more. They can still be found in SOAP::WSDL's
|
||||
* Code cleanup: The SOAP::WSDL::SAX* modules are no longer included, as they
|
||||
are not supported any more. They can still be found in SOAP::WSDL's
|
||||
subversion repository in the attic directory, though.
|
||||
|
||||
|
||||
2.00_15
|
||||
----
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
|
||||
* [ 1792321 ] 2.00_14 requires SOAP::Lite for passing tests
|
||||
@@ -375,7 +448,7 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
2.00_14
|
||||
----
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
|
||||
* [ 1792235 ] SOAP::WSDL::Transport::Test missing from 2.00_13
|
||||
@@ -386,7 +459,7 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
|
||||
The following uncategorized improvements have been made:
|
||||
|
||||
* The ::SOM deserializer has been simplified to be just a subclass
|
||||
* The ::SOM deserializer has been simplified to be just a subclass
|
||||
of SOAP::Deserializer from SOAP::Lite
|
||||
* Factories now emit more useful error messages when no class is registered
|
||||
for the protocol/soap_version requested
|
||||
@@ -397,36 +470,36 @@ The following uncategorized improvements have been made:
|
||||
|
||||
2.00_13
|
||||
----
|
||||
The following features were added (the numbers in square brackets are the
|
||||
The following features were added (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||
|
||||
* [ 1790619 ] Test transport backend
|
||||
A test transport backend has been implemented (SOAP::WSDL::Transport::Test).
|
||||
It returns the contents from a file and discards the response.
|
||||
The filename is determined from the soap_action field.
|
||||
|
||||
|
||||
* [ 1785196 ] Replace outputsom(1) by deserializer plugin
|
||||
outputsom(1) in SOAP::WSDL is now implemented via using the deserializer
|
||||
outputsom(1) in SOAP::WSDL is now implemented via using the deserializer
|
||||
plugin SOAP::WSDL::Deserializer::SOM.
|
||||
|
||||
* [1785195] Support deserializer plugins
|
||||
Deserializer plugin API added via SOAP::WSDL::Factory::Deserializer.
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
|
||||
* [1789581] Support ComplexType mixed
|
||||
WSDL parser now supports using the mixed="true" attribute in complexType
|
||||
WSDL parser now supports using the mixed="true" attribute in complexType
|
||||
definitions. Mixed content in messages is only supported via SOAP::SOM yet.
|
||||
|
||||
* [1787975] 016_client_object.t fails due to testing XML as string
|
||||
Removed string test.
|
||||
|
||||
|
||||
* [1787959] Test wsdl seems to be broken
|
||||
Corrected typo.
|
||||
|
||||
|
||||
* [1787955] ::XSD::Typelib::date is broken
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::date now converts time-zoned dates properly,
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::date now converts time-zoned dates properly,
|
||||
and adds the local time zone if none is given.
|
||||
|
||||
* [1785646] SOAPAction header not set from soap:operation soapAction
|
||||
@@ -438,55 +511,55 @@ The following uncategorized improvements have been made:
|
||||
|
||||
2.00_12
|
||||
----
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
|
||||
* [1787146] SOAP::WSDL still uses XML::LibXML
|
||||
The superficious usage of XML::LibXML has been removed. XML::LibXML with
|
||||
The superficious usage of XML::LibXML has been removed. XML::LibXML with
|
||||
sax filter has been replaced by SOAP::WSDL::Expat::WSDLParser.
|
||||
|
||||
|
||||
* [1787054] Test suite requires XML::LibXML in 2.00_11
|
||||
The test suite no longer requires XML::LibXML to pass.
|
||||
|
||||
* [1785678] SOAP envelope not checked for namespace
|
||||
The SOAP envelope is now checked for the correct namespace.
|
||||
|
||||
|
||||
* [1786644] SOAP::WSDL::Manual - doc error
|
||||
Documentation improvements
|
||||
|
||||
|
||||
The following uncategorized improvements have been made
|
||||
|
||||
* The SOAPAction header is now alway quoted (R1109 in WS-I BP 1.0).
|
||||
|
||||
|
||||
2.00_11
|
||||
----
|
||||
|
||||
The following features were added (the numbers in square brackets are the
|
||||
The following features were added (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||
|
||||
* [1767963] Transport plugins via SOAP::WSDL::Factory::Transport.
|
||||
SOAP::WSDL uses SOAP::Lite's tranport modules as default, with a
|
||||
SOAP::WSDL uses SOAP::Lite's tranport modules as default, with a
|
||||
lightweight HTTP(S) transport plugin as fallback.
|
||||
Custom transport modules can be registered via SOAP::WSDL::Factory::Transport.
|
||||
|
||||
* [ 1772730 ] Serializer plugins via SOAP::WSDL::Factory::Serializer
|
||||
* [ 1772730 ] Serializer plugins via SOAP::WSDL::Factory::Serializer
|
||||
The default serializer for SOAP1.1 is SOAP::WSDL::Serializer::SOAP11.
|
||||
Custom serializers classes can be registered via
|
||||
SOAP::WSDL::Factory::Serializer or set via SOAP::WSDL's set_serializer
|
||||
Custom serializers classes can be registered via
|
||||
SOAP::WSDL::Factory::Serializer or set via SOAP::WSDL's set_serializer
|
||||
method.
|
||||
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
The following bugs have been fixed (the numbers in square brackets are the
|
||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||
|
||||
* [ 1764854 ] Port WSDL parser to expat and remove XML::LibXML dependency
|
||||
SOAP::WSDL now requires only XML::Parser to be installed.
|
||||
XML::LibXML is not required any more, though XML::LibXML based modules still
|
||||
XML::LibXML is not required any more, though XML::LibXML based modules still
|
||||
exist.
|
||||
|
||||
The following uncategorized improvements have been made
|
||||
|
||||
* The number of dependencies has been reduced. SOAP::WSDL no longer requires the
|
||||
* The number of dependencies has been reduced. SOAP::WSDL no longer requires the
|
||||
following modules to be installed:
|
||||
- XML::SAX::Base
|
||||
- XML::SAX::ParserFactory
|
||||
@@ -505,27 +578,27 @@ The following uncategorized improvements have been made
|
||||
|
||||
2.00_09
|
||||
----
|
||||
* SOAP::WSDL::XSD::Typelib::Builtin::boolean objects now return their numerical
|
||||
* SOAP::WSDL::XSD::Typelib::Builtin::boolean objects now return their numerical
|
||||
value in bool context, not "true" or "false" (always true...)
|
||||
* date/time test are now timezone-sensitive
|
||||
* examples added
|
||||
|
||||
2.00_08
|
||||
---
|
||||
* SOAP::WSDL::XSD::Typelib::ComplexType objects now check the class of their
|
||||
* SOAP::WSDL::XSD::Typelib::ComplexType objects now check the class of their
|
||||
child objects.
|
||||
This provides early feedback to developers.
|
||||
* SOAP message parser can skip unwanted parts of the message to improve parsing
|
||||
* SOAP message parser can skip unwanted parts of the message to improve parsing
|
||||
speed - see SOAP::WSDL::Expat::MessageParser for details.
|
||||
* HTTP Content-Type is configurable
|
||||
* SOAP::WSDL::XSD::Typelib::ComplexType based objects accept any combination of
|
||||
* SOAP::WSDL::XSD::Typelib::ComplexType based objects accept any combination of
|
||||
hash refs, list refs and objects as parameter to set_value() and new().
|
||||
* SOAP::WSDL::XSD::Typelib::Builtin::dateTime and ::date convert date
|
||||
* SOAP::WSDL::XSD::Typelib::Builtin::dateTime and ::date convert date
|
||||
strings into XML date strings
|
||||
* SOAP::WSDL::Definitions::create now
|
||||
- converts '.' in service names to '::' (.NET class separator to perl class
|
||||
- converts '.' in service names to '::' (.NET class separator to perl class
|
||||
separator)
|
||||
- outputs Typemaps and Interface classes in UTF8 to allow proper inclusion
|
||||
- outputs Typemaps and Interface classes in UTF8 to allow proper inclusion
|
||||
of UTF8 documentation from WSDL
|
||||
* SOAP::WSDL::Definitions::create() includes doc in generated interface classes
|
||||
* WSDLHandler now handles <wsdl:documentation> tags
|
||||
@@ -536,7 +609,7 @@ The following uncategorized improvements have been made
|
||||
* Implemented a Code generator for creating SOAP interfaces based on WSDL definitions
|
||||
* Implemented a high-speed stream based SOAP message parser
|
||||
SOAP message parser returns a objects based on XML schema based class library
|
||||
* Implemented a XML schema based class library
|
||||
* Implemented a XML schema based class library
|
||||
* Implemented a stream based WSDL parser.
|
||||
Parses WSDL into objects. Objects can serialize data, and explain how to use the
|
||||
Parses WSDL into objects. Objects can serialize data, and explain how to use the
|
||||
service(s) they make up (output documentation).
|
||||
|
||||
22
MANIFEST
22
MANIFEST
@@ -2,6 +2,7 @@ benchmark/01_expat.t
|
||||
benchmark/hello.pl
|
||||
benchmark/person.pl
|
||||
benchmark/person.xml
|
||||
benchmark/person_profile.pl
|
||||
benchmark/XSD/01_anyType.t
|
||||
benchmark/XSD/02_anySimpleType.t
|
||||
benchmark/XSD/03_string.t
|
||||
@@ -97,6 +98,7 @@ lib/SOAP/WSDL/Generator/Template/XSD/_type_class.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/atomicTypes.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/attributeSet.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/contentModel.tt
|
||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt
|
||||
@@ -164,12 +166,15 @@ lib/SOAP/WSDL/Transport/Loopback.pm
|
||||
lib/SOAP/WSDL/Transport/Test.pm
|
||||
lib/SOAP/WSDL/TypeLookup.pm
|
||||
lib/SOAP/WSDL/Types.pm
|
||||
lib/SOAP/WSDL/XSD/Attribute.pm
|
||||
lib/SOAP/WSDL/XSD/Builtin.pm
|
||||
lib/SOAP/WSDL/XSD/ComplexType.pm
|
||||
lib/SOAP/WSDL/XSD/Element.pm
|
||||
lib/SOAP/WSDL/XSD/Schema.pm
|
||||
lib/SOAP/WSDL/XSD/Schema/Builtin.pm
|
||||
lib/SOAP/WSDL/XSD/SimpleType.pm
|
||||
lib/SOAP/WSDL/XSD/Typelib/Attribute.pm
|
||||
lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm
|
||||
lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
|
||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
|
||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
|
||||
@@ -240,6 +245,7 @@ t/013_complexType.t
|
||||
t/016_client_object.t
|
||||
t/017_generator.t
|
||||
t/020_storable.t
|
||||
t/095_copying.t
|
||||
t/096_characters.t
|
||||
t/097_kwalitee.t
|
||||
t/098_pod.t
|
||||
@@ -267,15 +273,20 @@ t/acceptance/wsdl/10_helloworld.asmx.xml
|
||||
t/acceptance/wsdl/11_helloworld.wsdl
|
||||
t/acceptance/wsdl/contributed/Axis.wsdl
|
||||
t/acceptance/wsdl/contributed/ETest.wsdl
|
||||
t/acceptance/wsdl/contributed/gasquery.wsdl
|
||||
t/acceptance/wsdl/contributed/OITest.wsdl
|
||||
t/acceptance/wsdl/contributed/tools.wsdl
|
||||
t/acceptance/wsdl/elementAtomicComplexType.xml
|
||||
t/acceptance/wsdl/email_account.wsdl
|
||||
t/acceptance/wsdl/generator_test.wsdl
|
||||
t/acceptance/wsdl/generator_test_dot_names.wsdl
|
||||
t/acceptance/wsdl/generator_unsupported_test.wsdl
|
||||
t/acceptance/wsdl/import.xsd
|
||||
t/acceptance/wsdl/message_gateway.wsdl
|
||||
t/acceptance/wsdl/WSDLParser-import.wsdl
|
||||
t/acceptance/wsdl/WSDLParser-imported.wsdl
|
||||
t/acceptance/wsdl/WSDLParser.wsdl
|
||||
t/contributed.wsdl
|
||||
t/Expat/01_expat.t
|
||||
t/Expat/03_wsdl.t
|
||||
t/lib/MyComplexType.pm
|
||||
t/lib/MyElement.pm
|
||||
@@ -303,11 +314,15 @@ t/SOAP/WSDL/05_simpleType-union.t
|
||||
t/SOAP/WSDL/06_keep_alive.t
|
||||
t/SOAP/WSDL/11_helloworld.NET.t
|
||||
t/SOAP/WSDL/12_binding.t
|
||||
t/SOAP/WSDL/Client.t
|
||||
t/SOAP/WSDL/Client/Base.t
|
||||
t/SOAP/WSDL/Definitions.t
|
||||
t/SOAP/WSDL/Deserializer/Hash.t
|
||||
t/SOAP/WSDL/Deserializer/SOM.t
|
||||
t/SOAP/WSDL/Deserializer/XSD.t
|
||||
t/SOAP/WSDL/Expat/Base.t
|
||||
t/SOAP/WSDL/Expat/MessageParser.t
|
||||
t/SOAP/WSDL/Expat/WSDLParser.t
|
||||
t/SOAP/WSDL/Factory/Deserializer.t
|
||||
t/SOAP/WSDL/Factory/Serializer.t
|
||||
t/SOAP/WSDL/Factory/Transport.t
|
||||
@@ -316,8 +331,10 @@ t/SOAP/WSDL/Generator/Visitor.t
|
||||
t/SOAP/WSDL/Generator/Visitor/Typemap.t
|
||||
t/SOAP/WSDL/Generator/XCS.t
|
||||
t/SOAP/WSDL/Generator/XSD.t
|
||||
t/SOAP/WSDL/Generator/XSD_dot_names.t
|
||||
t/SOAP/WSDL/Generator/XSD_unsupported.t
|
||||
t/SOAP/WSDL/Part.t
|
||||
t/SOAP/WSDL/PortType.t
|
||||
t/SOAP/WSDL/Serializer/XSD.t
|
||||
t/SOAP/WSDL/Server.t
|
||||
t/SOAP/WSDL/Server/CGI.t
|
||||
@@ -326,9 +343,12 @@ t/SOAP/WSDL/Transport/02_HTTP.t
|
||||
t/SOAP/WSDL/Transport/acceptance/test2.xml
|
||||
t/SOAP/WSDL/Transport/acceptance/test3.xml
|
||||
t/SOAP/WSDL/Typelib/Fault11.t
|
||||
t/SOAP/WSDL/XSD/Attribute.t
|
||||
t/SOAP/WSDL/XSD/ComplexType.t
|
||||
t/SOAP/WSDL/XSD/Element.t
|
||||
t/SOAP/WSDL/XSD/Schema.t
|
||||
t/SOAP/WSDL/XSD/SimpleType.t
|
||||
t/SOAP/WSDL/XSD/Typelib/Attribute.t
|
||||
t/SOAP/WSDL/XSD/Typelib/Builtin/01_constructors.t
|
||||
t/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.t
|
||||
t/SOAP/WSDL/XSD/Typelib/Builtin/anyType.t
|
||||
|
||||
40
META.yml
40
META.yml
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: SOAP-WSDL
|
||||
version: 2.00_27
|
||||
version: 2.00_31
|
||||
author:
|
||||
- 'Martin Kutter <martin.kutter@fen-net.de>'
|
||||
abstract: SOAP with WSDL support
|
||||
@@ -25,12 +25,13 @@ requires:
|
||||
List::Util: 0
|
||||
Template: 0
|
||||
Term::ReadKey: 0
|
||||
URI: 0
|
||||
XML::Parser::Expat: 0
|
||||
perl: 5.8.0
|
||||
provides:
|
||||
SOAP::WSDL:
|
||||
file: lib/SOAP/WSDL.pm
|
||||
version: 2.00_25
|
||||
version: 2.00_31
|
||||
SOAP::WSDL::Base:
|
||||
file: lib/SOAP/WSDL/Base.pm
|
||||
version: 2.00_27
|
||||
@@ -44,7 +45,7 @@ provides:
|
||||
version: 2.00_25
|
||||
SOAP::WSDL::Definitions:
|
||||
file: lib/SOAP/WSDL/Definitions.pm
|
||||
version: 2.00_25
|
||||
version: 2.00_27
|
||||
SOAP::WSDL::Deserializer::Hash:
|
||||
file: lib/SOAP/WSDL/Deserializer/Hash.pm
|
||||
version: 2.00_25
|
||||
@@ -56,13 +57,13 @@ provides:
|
||||
version: 2.00_25
|
||||
SOAP::WSDL::Expat::Base:
|
||||
file: lib/SOAP/WSDL/Expat/Base.pm
|
||||
version: 2.00_24
|
||||
version: 2.00_27
|
||||
SOAP::WSDL::Expat::Message2Hash:
|
||||
file: lib/SOAP/WSDL/Expat/Message2Hash.pm
|
||||
version: 2.00_24
|
||||
version: 2.00_27
|
||||
SOAP::WSDL::Expat::MessageParser:
|
||||
file: lib/SOAP/WSDL/Expat/MessageParser.pm
|
||||
version: 2.00_25
|
||||
version: 2.00_27
|
||||
SOAP::WSDL::Expat::MessageStreamParser:
|
||||
file: lib/SOAP/WSDL/Expat/MessageStreamParser.pm
|
||||
version: 2.00_24
|
||||
@@ -77,13 +78,13 @@ provides:
|
||||
version: 2.00_24
|
||||
SOAP::WSDL::Factory::Transport:
|
||||
file: lib/SOAP/WSDL/Factory/Transport.pm
|
||||
version: 2.00_25
|
||||
version: 2.00_31
|
||||
SOAP::WSDL::Generator::Template:
|
||||
file: lib/SOAP/WSDL/Generator/Template.pm
|
||||
version: 2.00_25
|
||||
SOAP::WSDL::Generator::Template::XSD:
|
||||
file: lib/SOAP/WSDL/Generator/Template/XSD.pm
|
||||
version: 2.00_25
|
||||
version: 2.00_27
|
||||
SOAP::WSDL::Generator::Visitor:
|
||||
file: lib/SOAP/WSDL/Generator/Visitor.pm
|
||||
version: 2.00_25
|
||||
@@ -120,13 +121,13 @@ provides:
|
||||
version: 2.00_25
|
||||
SOAP::WSDL::Serializer::XSD:
|
||||
file: lib/SOAP/WSDL/Serializer/XSD.pm
|
||||
version: 2.00_25
|
||||
version: 2.00_27
|
||||
SOAP::WSDL::Server:
|
||||
file: lib/SOAP/WSDL/Server.pm
|
||||
version: 2.00_25
|
||||
version: 2.00_27
|
||||
SOAP::WSDL::Server::CGI:
|
||||
file: lib/SOAP/WSDL/Server/CGI.pm
|
||||
version: 2.00_26
|
||||
version: 2.00_27
|
||||
SOAP::WSDL::Service:
|
||||
file: lib/SOAP/WSDL/Service.pm
|
||||
SOAP::WSDL::Transport::HTTP:
|
||||
@@ -139,13 +140,17 @@ provides:
|
||||
version: 2.00_25
|
||||
SOAP::WSDL::TypeLookup:
|
||||
file: lib/SOAP/WSDL/TypeLookup.pm
|
||||
version: 2.00_31
|
||||
SOAP::WSDL::Types:
|
||||
file: lib/SOAP/WSDL/Types.pm
|
||||
SOAP::WSDL::XSD::Attribute:
|
||||
file: lib/SOAP/WSDL/XSD/Attribute.pm
|
||||
version: 2.00_29
|
||||
SOAP::WSDL::XSD::Builtin:
|
||||
file: lib/SOAP/WSDL/XSD/Builtin.pm
|
||||
SOAP::WSDL::XSD::ComplexType:
|
||||
file: lib/SOAP/WSDL/XSD/ComplexType.pm
|
||||
version: 2.00_25
|
||||
version: 2.00_29
|
||||
SOAP::WSDL::XSD::Element:
|
||||
file: lib/SOAP/WSDL/XSD/Element.pm
|
||||
version: 2.00_25
|
||||
@@ -157,6 +162,12 @@ provides:
|
||||
SOAP::WSDL::XSD::SimpleType:
|
||||
file: lib/SOAP/WSDL/XSD/SimpleType.pm
|
||||
version: 2.00_25
|
||||
SOAP::WSDL::XSD::Typelib::Attribute:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/Attribute.pm
|
||||
version: 2.00_29
|
||||
SOAP::WSDL::XSD::Typelib::AttributeSet:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm
|
||||
version: 2.00_29
|
||||
SOAP::WSDL::XSD::Typelib::Builtin:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
|
||||
version: 2.00_25
|
||||
@@ -184,6 +195,7 @@ provides:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::anyType:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
|
||||
version: 2.00_29
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::anyURI:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::base64Binary:
|
||||
@@ -256,10 +268,10 @@ provides:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
|
||||
version: 2.00_25
|
||||
version: 2.00_31
|
||||
SOAP::WSDL::XSD::Typelib::Element:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/Element.pm
|
||||
version: 2.00_25
|
||||
version: 2.00_29
|
||||
SOAP::WSDL::XSD::Typelib::SimpleType:
|
||||
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
||||
SOAP::WSDL::XSD::Typelib::SimpleType::restriction:
|
||||
|
||||
18
MIGRATING
18
MIGRATING
@@ -1,7 +1,23 @@
|
||||
MIGRATING
|
||||
---------
|
||||
|
||||
This document describes how to migrate from 2.00_24 and before versions to
|
||||
MIGRATING FROM PRE-2.00_29
|
||||
--------------------------
|
||||
SOAP::WSDL 2.00_29 added experimental XML attribute support. The attribute
|
||||
support changed the code of the generated classes, which may now
|
||||
require the class SOAP::WSDL::XSD::Typelib::Attribute introduced in the same
|
||||
pre-release.
|
||||
|
||||
While interfaces generated with pre-releases back to 2.00_25 work without
|
||||
change, this does not hold true vice versa: Interfaces generated with
|
||||
2.00_29 and above won't work with older pre-releases.
|
||||
|
||||
You'll have to update SOAP::WSDL on all your machines.
|
||||
|
||||
MIGRATING FROM PRE-2.00_24
|
||||
--------------------------
|
||||
|
||||
This section describes how to migrate from 2.00_24 and before versions to
|
||||
2.00_25.
|
||||
|
||||
Migrating from 2.00_xx
|
||||
|
||||
@@ -4,34 +4,10 @@ use lib '../../SOAP-WSDL_XS/blib/lib';
|
||||
use lib '../../SOAP-WSDL_XS/blib/arch';
|
||||
use strict;
|
||||
|
||||
package MyData;
|
||||
my $XML;
|
||||
sub xml {
|
||||
return $XML if ($XML);
|
||||
|
||||
open my $fh, 'person.xml' or die 'cannot open data file';
|
||||
$XML = join '', <$fh>;
|
||||
close $fh;
|
||||
return $XML;
|
||||
}
|
||||
|
||||
package MyTransport;
|
||||
use SOAP::WSDL::Factory::Transport;
|
||||
SOAP::WSDL::Factory::Transport->register( http => __PACKAGE__ );
|
||||
sub send_receive {
|
||||
return MyData::xml();
|
||||
}
|
||||
sub new { return bless {}, 'MyTransport' };
|
||||
|
||||
package main;
|
||||
|
||||
use Benchmark qw(cmpthese);
|
||||
|
||||
# Do this BEFORE the client SOAP handlers are compiled!
|
||||
use XML::Compile::Transport::SOAPHTTP();
|
||||
use XML::Compile::SOAP::Tester ();
|
||||
use XML::Compile::Util;#use Data::Dumper;
|
||||
#print Dumper $result;
|
||||
use XML::Compile::Util;
|
||||
use XML::Compile::WSDL11;
|
||||
use XML::Simple;
|
||||
|
||||
@@ -43,14 +19,9 @@ use SOAP::Lite;
|
||||
|
||||
use MyInterfaces::TestService::TestPort;
|
||||
|
||||
my $tester = XML::Compile::SOAP::Tester->new();
|
||||
my $action = pack_type 'http://example.org', 'ListPerson';
|
||||
my $compile = XML::Compile::WSDL11->new('../example/wsdl/Person.wsdl');
|
||||
|
||||
$tester->actionCallback($action, \&MyData::xml);
|
||||
|
||||
my $call = $compile->compileClient('ListPerson');
|
||||
my $result = $call->({ in => undef});
|
||||
$call->({ in => undef});
|
||||
|
||||
# Initialize SOAP::Lite
|
||||
my $deserializer = SOAP::Deserializer->new();
|
||||
@@ -60,17 +31,16 @@ my $soap = MyInterfaces::TestService::TestPort->new();
|
||||
# Load all classes - XML::Compile has created everything before, too
|
||||
$soap->ListPerson({});
|
||||
|
||||
my $lite = SOAP::Lite->new()->default_ns('http://www.example.org/benchmark/')
|
||||
->proxy('http://localhost:81/soap-wsdl-test/person.pl');
|
||||
$lite->on_action( sub { 'http://www.example.org/benchmark/ListPerson' } );
|
||||
|
||||
# # register for SOAP 1.1
|
||||
SOAP::WSDL::Factory::Deserializer->register('1.1' => 'SOAP::WSDL::Deserializer::XSD_XS' );
|
||||
|
||||
my $wsdl_xs = MyInterfaces::TestService::TestPort->new();
|
||||
|
||||
# trigger loading of XML Data
|
||||
{
|
||||
use bytes;
|
||||
print "XML length (bytes): " . length( MyData::xml() ), "\n";
|
||||
}
|
||||
|
||||
my $count = 100;
|
||||
my @data = ();
|
||||
my $n = 0;
|
||||
print "Benchmark conducted with
|
||||
@@ -78,37 +48,39 @@ SOAP::Lite - $SOAP::Lite::VERSION
|
||||
SOAP::WSDL - $SOAP::WSDL::Client::VERSION
|
||||
SOAP::WSDL_XS - $SOAP::WSDL::Deserializer::XSD_XS::VERSION;
|
||||
XML::Compile::SOAP - $XML::Compile::SOAP::VERSION
|
||||
XML::Simple - $XML::Simple::VERSION
|
||||
|
||||
Benchmark $n: Store result in private variable and destroy it
|
||||
";
|
||||
$n++;
|
||||
cmpthese 300, {
|
||||
'XML::Simple' => sub { my $result = XMLin( MyData::xml() )},
|
||||
cmpthese $count, {
|
||||
# 'XML::Simple' => sub { my $result = XMLin( MyData::xml() )},
|
||||
'SOAP::WSDL' => sub { my $result = $soap->ListPerson({}) },
|
||||
'XML::Compile::SOAP' => sub { my $result = $call->() },
|
||||
'SOAP::WSDL_XS' => sub { my $result = @data, $wsdl_xs->ListPerson({}) },
|
||||
'SOAP::Lite' => sub { my $result = $deserializer->deserialize( MyData::xml() )}
|
||||
'XML::Compile' => sub { my $result = $call->() },
|
||||
'SOAP::WSDL_XS' => sub { my $result = $wsdl_xs->ListPerson({}) },
|
||||
# 'SOAP::Lite' => sub { my $result = $deserializer->deserialize( MyData::xml() )},
|
||||
'SOAP::Lite' => sub { my $som = $lite->call('ListPerson') },
|
||||
};
|
||||
|
||||
print "Benchmark $n: Push result on list\n";
|
||||
print "\nBenchmark $n: Push result on list\n";
|
||||
$n++;
|
||||
cmpthese 500, {
|
||||
'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
|
||||
cmpthese $count, {
|
||||
# 'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
|
||||
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
|
||||
'XML::Compile::SOAP' => sub { push @data, $call->() },
|
||||
'XML::Compile' => sub { push @data, $call->() },
|
||||
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
|
||||
'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
|
||||
# 'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
|
||||
'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
|
||||
};
|
||||
|
||||
@data = ();
|
||||
print "Benchmark $n: Play it again, Sam\n";
|
||||
print "\nBenchmark $n: Play it again, Sam\n";
|
||||
|
||||
cmpthese 500, {
|
||||
'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
|
||||
cmpthese $count, {
|
||||
# 'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
|
||||
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
|
||||
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
|
||||
'XML::Compile::SOAP' => sub { push @data, $call->() },
|
||||
'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
|
||||
'XML::Compile' => sub { push @data, $call->() },
|
||||
# 'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
|
||||
'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
|
||||
};
|
||||
|
||||
|
||||
@@ -46,388 +46,388 @@
|
||||
</NewElement>
|
||||
<NewElement>
|
||||
<PersonID>
|
||||
<ID>1</ID>
|
||||
<ID>2</ID>
|
||||
</PersonID>
|
||||
<Salutation>Salutation0</Salutation>
|
||||
<Name>Name0</Name>
|
||||
<GivenName>Martin</GivenName>
|
||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
||||
<Salutation>Salutation2</Salutation>
|
||||
<Name>Name2</Name>
|
||||
<GivenName>Martin2</GivenName>
|
||||
<DateOfBirth>1970-01-02</DateOfBirth>
|
||||
<HomeAddress>
|
||||
<Street>Street 0</Street>
|
||||
<ZIP>00000</ZIP>
|
||||
<City>City0</City>
|
||||
<Country>Country0</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<Street>Street 2</Street>
|
||||
<ZIP>00002</ZIP>
|
||||
<City>City2</City>
|
||||
<Country>Country2</Country>
|
||||
<PhoneNumber>++4900000002</PhoneNumber>
|
||||
<MobilePhoneNumber>++491700000002</MobilePhoneNumber>
|
||||
</HomeAddress>
|
||||
<WorkAddress>
|
||||
<Street>Somestreet 23</Street>
|
||||
<ZIP>12345</ZIP>
|
||||
<City>SomeCity</City>
|
||||
<Street>Somestreet 2</Street>
|
||||
<ZIP>222222</ZIP>
|
||||
<City>SomeCity2</City>
|
||||
<Country>Germany</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<PhoneNumber>++4920000002</PhoneNumber>
|
||||
<MobilePhoneNumber>++4920000002</MobilePhoneNumber>
|
||||
</WorkAddress>
|
||||
<Contracts>
|
||||
<Contract>
|
||||
<ContractID>100000</ContractID>
|
||||
<ContractName>SomeContract0</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100001</ContractID>
|
||||
<ContractName>SomeContract1</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100002</ContractID>
|
||||
<ContractName>SomeContract2</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100003</ContractID>
|
||||
<ContractName>SomeContract3</ContractName>
|
||||
<ContractID>100021</ContractID>
|
||||
<ContractName>SomeContract21</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100022</ContractID>
|
||||
<ContractName>SomeContract22</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>1000023</ContractID>
|
||||
<ContractName>SomeContract23</ContractName>
|
||||
</Contract>
|
||||
</Contracts>
|
||||
</NewElement>
|
||||
<NewElement>
|
||||
<PersonID>
|
||||
<ID>1</ID>
|
||||
<ID>3</ID>
|
||||
</PersonID>
|
||||
<Salutation>Salutation0</Salutation>
|
||||
<Name>Name0</Name>
|
||||
<GivenName>Martin</GivenName>
|
||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
||||
<Salutation>Salutation3</Salutation>
|
||||
<Name>Name3</Name>
|
||||
<GivenName>Martin3</GivenName>
|
||||
<DateOfBirth>1970-01-03</DateOfBirth>
|
||||
<HomeAddress>
|
||||
<Street>Street 0</Street>
|
||||
<ZIP>00000</ZIP>
|
||||
<City>City0</City>
|
||||
<Country>Country0</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<Street>Street 3</Street>
|
||||
<ZIP>00003</ZIP>
|
||||
<City>City3</City>
|
||||
<Country>Country3</Country>
|
||||
<PhoneNumber>++4900000003</PhoneNumber>
|
||||
<MobilePhoneNumber>++491700000003</MobilePhoneNumber>
|
||||
</HomeAddress>
|
||||
<WorkAddress>
|
||||
<Street>Somestreet 23</Street>
|
||||
<ZIP>12345</ZIP>
|
||||
<City>SomeCity</City>
|
||||
<Street>Somestreet 3</Street>
|
||||
<ZIP>333333</ZIP>
|
||||
<City>SomeCity3</City>
|
||||
<Country>Germany</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<PhoneNumber>++4930000003</PhoneNumber>
|
||||
<MobilePhoneNumber>++4930000003</MobilePhoneNumber>
|
||||
</WorkAddress>
|
||||
<Contracts>
|
||||
<Contract>
|
||||
<ContractID>100000</ContractID>
|
||||
<ContractName>SomeContract0</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100001</ContractID>
|
||||
<ContractName>SomeContract1</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100002</ContractID>
|
||||
<ContractName>SomeContract2</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100003</ContractID>
|
||||
<ContractName>SomeContract3</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100031</ContractID>
|
||||
<ContractName>SomeContract31</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100033</ContractID>
|
||||
<ContractName>SomeContract33</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>1000033</ContractID>
|
||||
<ContractName>SomeContract33</ContractName>
|
||||
</Contract>
|
||||
</Contracts>
|
||||
</NewElement>
|
||||
<NewElement>
|
||||
<PersonID>
|
||||
<ID>1</ID>
|
||||
<ID>4</ID>
|
||||
</PersonID>
|
||||
<Salutation>Salutation0</Salutation>
|
||||
<Name>Name0</Name>
|
||||
<GivenName>Martin</GivenName>
|
||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
||||
<Salutation>Salutation4</Salutation>
|
||||
<Name>Name4</Name>
|
||||
<GivenName>Martin4</GivenName>
|
||||
<DateOfBirth>1970-01-04</DateOfBirth>
|
||||
<HomeAddress>
|
||||
<Street>Street 0</Street>
|
||||
<ZIP>00000</ZIP>
|
||||
<City>City0</City>
|
||||
<Country>Country0</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<Street>Street 4</Street>
|
||||
<ZIP>00004</ZIP>
|
||||
<City>City4</City>
|
||||
<Country>Country4</Country>
|
||||
<PhoneNumber>++4900000004</PhoneNumber>
|
||||
<MobilePhoneNumber>++491700000004</MobilePhoneNumber>
|
||||
</HomeAddress>
|
||||
<WorkAddress>
|
||||
<Street>Somestreet 23</Street>
|
||||
<ZIP>12345</ZIP>
|
||||
<City>SomeCity</City>
|
||||
<Street>Somestreet 4</Street>
|
||||
<ZIP>444444</ZIP>
|
||||
<City>SomeCity4</City>
|
||||
<Country>Germany</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<PhoneNumber>++4940000004</PhoneNumber>
|
||||
<MobilePhoneNumber>++4940000004</MobilePhoneNumber>
|
||||
</WorkAddress>
|
||||
<Contracts>
|
||||
<Contract>
|
||||
<ContractID>100000</ContractID>
|
||||
<ContractName>SomeContract0</ContractName>
|
||||
<ContractID>100004</ContractID>
|
||||
<ContractName>SomeContract4</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100001</ContractID>
|
||||
<ContractName>SomeContract1</ContractName>
|
||||
<ContractID>100041</ContractID>
|
||||
<ContractName>SomeContract41</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100002</ContractID>
|
||||
<ContractName>SomeContract2</ContractName>
|
||||
<ContractID>100044</ContractID>
|
||||
<ContractName>SomeContract44</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100003</ContractID>
|
||||
<ContractName>SomeContract3</ContractName>
|
||||
<ContractID>1000044</ContractID>
|
||||
<ContractName>SomeContract44</ContractName>
|
||||
</Contract>
|
||||
</Contracts>
|
||||
</NewElement>
|
||||
<NewElement>
|
||||
<PersonID>
|
||||
<ID>1</ID>
|
||||
<ID>5</ID>
|
||||
</PersonID>
|
||||
<Salutation>Salutation0</Salutation>
|
||||
<Name>Name0</Name>
|
||||
<GivenName>Martin</GivenName>
|
||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
||||
<Salutation>Salutation5</Salutation>
|
||||
<Name>Name5</Name>
|
||||
<GivenName>Martin5</GivenName>
|
||||
<DateOfBirth>1970-01-05</DateOfBirth>
|
||||
<HomeAddress>
|
||||
<Street>Street 0</Street>
|
||||
<ZIP>00000</ZIP>
|
||||
<City>City0</City>
|
||||
<Country>Country0</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<Street>Street 5</Street>
|
||||
<ZIP>00005</ZIP>
|
||||
<City>City5</City>
|
||||
<Country>Country5</Country>
|
||||
<PhoneNumber>++4900000005</PhoneNumber>
|
||||
<MobilePhoneNumber>++491700000005</MobilePhoneNumber>
|
||||
</HomeAddress>
|
||||
<WorkAddress>
|
||||
<Street>Somestreet 23</Street>
|
||||
<ZIP>12345</ZIP>
|
||||
<City>SomeCity</City>
|
||||
<Street>Somestreet 5</Street>
|
||||
<ZIP>555555</ZIP>
|
||||
<City>SomeCity5</City>
|
||||
<Country>Germany</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<PhoneNumber>++4950000005</PhoneNumber>
|
||||
<MobilePhoneNumber>++4950000005</MobilePhoneNumber>
|
||||
</WorkAddress>
|
||||
<Contracts>
|
||||
<Contract>
|
||||
<ContractID>100000</ContractID>
|
||||
<ContractName>SomeContract0</ContractName>
|
||||
<ContractID>100005</ContractID>
|
||||
<ContractName>SomeContract5</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100001</ContractID>
|
||||
<ContractName>SomeContract1</ContractName>
|
||||
<ContractID>100051</ContractID>
|
||||
<ContractName>SomeContract51</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100002</ContractID>
|
||||
<ContractName>SomeContract2</ContractName>
|
||||
<ContractID>100055</ContractID>
|
||||
<ContractName>SomeContract55</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100003</ContractID>
|
||||
<ContractName>SomeContract3</ContractName>
|
||||
<ContractID>1000053</ContractID>
|
||||
<ContractName>SomeContract53</ContractName>
|
||||
</Contract>
|
||||
</Contracts>
|
||||
</NewElement>
|
||||
<NewElement>
|
||||
<PersonID>
|
||||
<ID>1</ID>
|
||||
<ID>6</ID>
|
||||
</PersonID>
|
||||
<Salutation>Salutation0</Salutation>
|
||||
<Name>Name0</Name>
|
||||
<GivenName>Martin</GivenName>
|
||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
||||
<Salutation>Salutation6</Salutation>
|
||||
<Name>Name6</Name>
|
||||
<GivenName>Martin6</GivenName>
|
||||
<DateOfBirth>1970-01-06</DateOfBirth>
|
||||
<HomeAddress>
|
||||
<Street>Street 0</Street>
|
||||
<ZIP>00000</ZIP>
|
||||
<City>City0</City>
|
||||
<Country>Country0</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<Street>Street 6</Street>
|
||||
<ZIP>00006</ZIP>
|
||||
<City>City6</City>
|
||||
<Country>Country6</Country>
|
||||
<PhoneNumber>++4900000006</PhoneNumber>
|
||||
<MobilePhoneNumber>++491700000006</MobilePhoneNumber>
|
||||
</HomeAddress>
|
||||
<WorkAddress>
|
||||
<Street>Somestreet 23</Street>
|
||||
<ZIP>12345</ZIP>
|
||||
<City>SomeCity</City>
|
||||
<Street>Somestreet 6</Street>
|
||||
<ZIP>666666</ZIP>
|
||||
<City>SomeCity6</City>
|
||||
<Country>Germany</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<PhoneNumber>++4960000006</PhoneNumber>
|
||||
<MobilePhoneNumber>++4960000006</MobilePhoneNumber>
|
||||
</WorkAddress>
|
||||
<Contracts>
|
||||
<Contract>
|
||||
<ContractID>100000</ContractID>
|
||||
<ContractName>SomeContract0</ContractName>
|
||||
<ContractID>100006</ContractID>
|
||||
<ContractName>SomeContract6</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100001</ContractID>
|
||||
<ContractName>SomeContract1</ContractName>
|
||||
<ContractID>100061</ContractID>
|
||||
<ContractName>SomeContract61</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100002</ContractID>
|
||||
<ContractName>SomeContract2</ContractName>
|
||||
<ContractID>100066</ContractID>
|
||||
<ContractName>SomeContract66</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100003</ContractID>
|
||||
<ContractName>SomeContract3</ContractName>
|
||||
<ContractID>1000063</ContractID>
|
||||
<ContractName>SomeContract63</ContractName>
|
||||
</Contract>
|
||||
</Contracts>
|
||||
</NewElement>
|
||||
<NewElement>
|
||||
<PersonID>
|
||||
<ID>1</ID>
|
||||
<ID>7</ID>
|
||||
</PersonID>
|
||||
<Salutation>Salutation0</Salutation>
|
||||
<Name>Name0</Name>
|
||||
<GivenName>Martin</GivenName>
|
||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
||||
<Salutation>Salutation7</Salutation>
|
||||
<Name>Name7</Name>
|
||||
<GivenName>Martin7</GivenName>
|
||||
<DateOfBirth>1970-01-07</DateOfBirth>
|
||||
<HomeAddress>
|
||||
<Street>Street 0</Street>
|
||||
<ZIP>00000</ZIP>
|
||||
<City>City0</City>
|
||||
<Country>Country0</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<Street>Street 7</Street>
|
||||
<ZIP>00007</ZIP>
|
||||
<City>City7</City>
|
||||
<Country>Country7</Country>
|
||||
<PhoneNumber>++4900000007</PhoneNumber>
|
||||
<MobilePhoneNumber>++491700000007</MobilePhoneNumber>
|
||||
</HomeAddress>
|
||||
<WorkAddress>
|
||||
<Street>Somestreet 23</Street>
|
||||
<ZIP>12345</ZIP>
|
||||
<City>SomeCity</City>
|
||||
<Street>Somestreet 7</Street>
|
||||
<ZIP>777777</ZIP>
|
||||
<City>SomeCity7</City>
|
||||
<Country>Germany</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<PhoneNumber>++4970000007</PhoneNumber>
|
||||
<MobilePhoneNumber>++4970000007</MobilePhoneNumber>
|
||||
</WorkAddress>
|
||||
<Contracts>
|
||||
<Contract>
|
||||
<ContractID>100000</ContractID>
|
||||
<ContractName>SomeContract0</ContractName>
|
||||
<ContractID>100007</ContractID>
|
||||
<ContractName>SomeContract7</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100001</ContractID>
|
||||
<ContractName>SomeContract1</ContractName>
|
||||
<ContractID>100071</ContractID>
|
||||
<ContractName>SomeContract71</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100002</ContractID>
|
||||
<ContractName>SomeContract2</ContractName>
|
||||
<ContractID>100077</ContractID>
|
||||
<ContractName>SomeContract77</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100003</ContractID>
|
||||
<ContractName>SomeContract3</ContractName>
|
||||
<ContractID>1000073</ContractID>
|
||||
<ContractName>SomeContract73</ContractName>
|
||||
</Contract>
|
||||
</Contracts>
|
||||
</NewElement>
|
||||
<NewElement>
|
||||
<PersonID>
|
||||
<ID>1</ID>
|
||||
<ID>8</ID>
|
||||
</PersonID>
|
||||
<Salutation>Salutation0</Salutation>
|
||||
<Name>Name0</Name>
|
||||
<GivenName>Martin</GivenName>
|
||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
||||
<Salutation>Salutation8</Salutation>
|
||||
<Name>Name8</Name>
|
||||
<GivenName>Martin8</GivenName>
|
||||
<DateOfBirth>1970-01-08</DateOfBirth>
|
||||
<HomeAddress>
|
||||
<Street>Street 0</Street>
|
||||
<ZIP>00000</ZIP>
|
||||
<City>City0</City>
|
||||
<Country>Country0</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<Street>Street 8</Street>
|
||||
<ZIP>00008</ZIP>
|
||||
<City>City8</City>
|
||||
<Country>Country8</Country>
|
||||
<PhoneNumber>++4900000008</PhoneNumber>
|
||||
<MobilePhoneNumber>++491700000008</MobilePhoneNumber>
|
||||
</HomeAddress>
|
||||
<WorkAddress>
|
||||
<Street>Somestreet 23</Street>
|
||||
<ZIP>12345</ZIP>
|
||||
<City>SomeCity</City>
|
||||
<Street>Somestreet 8</Street>
|
||||
<ZIP>888888</ZIP>
|
||||
<City>SomeCity8</City>
|
||||
<Country>Germany</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<PhoneNumber>++4980000008</PhoneNumber>
|
||||
<MobilePhoneNumber>++4980000008</MobilePhoneNumber>
|
||||
</WorkAddress>
|
||||
<Contracts>
|
||||
<Contract>
|
||||
<ContractID>100000</ContractID>
|
||||
<ContractName>SomeContract0</ContractName>
|
||||
<ContractID>100008</ContractID>
|
||||
<ContractName>SomeContract8</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100001</ContractID>
|
||||
<ContractName>SomeContract1</ContractName>
|
||||
<ContractID>100081</ContractID>
|
||||
<ContractName>SomeContract81</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100002</ContractID>
|
||||
<ContractName>SomeContract2</ContractName>
|
||||
<ContractID>100088</ContractID>
|
||||
<ContractName>SomeContract88</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100003</ContractID>
|
||||
<ContractName>SomeContract3</ContractName>
|
||||
<ContractID>1000083</ContractID>
|
||||
<ContractName>SomeContract83</ContractName>
|
||||
</Contract>
|
||||
</Contracts>
|
||||
</NewElement>
|
||||
<NewElement>
|
||||
<PersonID>
|
||||
<ID>1</ID>
|
||||
<ID>9</ID>
|
||||
</PersonID>
|
||||
<Salutation>Salutation0</Salutation>
|
||||
<Name>Name0</Name>
|
||||
<GivenName>Martin</GivenName>
|
||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
||||
<Salutation>Salutation9</Salutation>
|
||||
<Name>Name9</Name>
|
||||
<GivenName>Martin9</GivenName>
|
||||
<DateOfBirth>1970-01-09</DateOfBirth>
|
||||
<HomeAddress>
|
||||
<Street>Street 0</Street>
|
||||
<ZIP>00000</ZIP>
|
||||
<City>City0</City>
|
||||
<Country>Country0</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<Street>Street 9</Street>
|
||||
<ZIP>00009</ZIP>
|
||||
<City>City9</City>
|
||||
<Country>Country9</Country>
|
||||
<PhoneNumber>++4900000009</PhoneNumber>
|
||||
<MobilePhoneNumber>++491700000009</MobilePhoneNumber>
|
||||
</HomeAddress>
|
||||
<WorkAddress>
|
||||
<Street>Somestreet 23</Street>
|
||||
<ZIP>12345</ZIP>
|
||||
<City>SomeCity</City>
|
||||
<Street>Somestreet 9</Street>
|
||||
<ZIP>999999</ZIP>
|
||||
<City>SomeCity9</City>
|
||||
<Country>Germany</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<PhoneNumber>++4990000009</PhoneNumber>
|
||||
<MobilePhoneNumber>++4990000009</MobilePhoneNumber>
|
||||
</WorkAddress>
|
||||
<Contracts>
|
||||
<Contract>
|
||||
<ContractID>100000</ContractID>
|
||||
<ContractName>SomeContract0</ContractName>
|
||||
<ContractID>100009</ContractID>
|
||||
<ContractName>SomeContract9</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100001</ContractID>
|
||||
<ContractName>SomeContract1</ContractName>
|
||||
<ContractID>100091</ContractID>
|
||||
<ContractName>SomeContract91</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100002</ContractID>
|
||||
<ContractName>SomeContract2</ContractName>
|
||||
<ContractID>100099</ContractID>
|
||||
<ContractName>SomeContract99</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100003</ContractID>
|
||||
<ContractName>SomeContract3</ContractName>
|
||||
<ContractID>1000093</ContractID>
|
||||
<ContractName>SomeContract93</ContractName>
|
||||
</Contract>
|
||||
</Contracts>
|
||||
</NewElement>
|
||||
<NewElement>
|
||||
<PersonID>
|
||||
<ID>1</ID>
|
||||
<ID>10</ID>
|
||||
</PersonID>
|
||||
<Salutation>Salutation0</Salutation>
|
||||
<Name>Name0</Name>
|
||||
<GivenName>Martin</GivenName>
|
||||
<DateOfBirth>1970-01-01</DateOfBirth>
|
||||
<Salutation>Salutation10</Salutation>
|
||||
<Name>Name10</Name>
|
||||
<GivenName>Martin10</GivenName>
|
||||
<DateOfBirth>1970-01-010</DateOfBirth>
|
||||
<HomeAddress>
|
||||
<Street>Street 0</Street>
|
||||
<ZIP>00000</ZIP>
|
||||
<City>City0</City>
|
||||
<Country>Country0</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<Street>Street 10</Street>
|
||||
<ZIP>000010</ZIP>
|
||||
<City>City10</City>
|
||||
<Country>Country10</Country>
|
||||
<PhoneNumber>++49000000010</PhoneNumber>
|
||||
<MobilePhoneNumber>++4917000000010</MobilePhoneNumber>
|
||||
</HomeAddress>
|
||||
<WorkAddress>
|
||||
<Street>Somestreet 23</Street>
|
||||
<ZIP>12345</ZIP>
|
||||
<City>SomeCity</City>
|
||||
<Street>Somestreet 10</Street>
|
||||
<ZIP>101010101010</ZIP>
|
||||
<City>SomeCity10</City>
|
||||
<Country>Germany</Country>
|
||||
<PhoneNumber>++499131123456</PhoneNumber>
|
||||
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||
<PhoneNumber>++491000000010</PhoneNumber>
|
||||
<MobilePhoneNumber>++491000000010</MobilePhoneNumber>
|
||||
</WorkAddress>
|
||||
<Contracts>
|
||||
<Contract>
|
||||
<ContractID>100000</ContractID>
|
||||
<ContractName>SomeContract0</ContractName>
|
||||
<ContractID>1000010</ContractID>
|
||||
<ContractName>SomeContract10</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100001</ContractID>
|
||||
<ContractName>SomeContract1</ContractName>
|
||||
<ContractID>1000101</ContractID>
|
||||
<ContractName>SomeContract101</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100002</ContractID>
|
||||
<ContractName>SomeContract2</ContractName>
|
||||
<ContractID>10001010</ContractID>
|
||||
<ContractName>SomeContract1010</ContractName>
|
||||
</Contract>
|
||||
<Contract>
|
||||
<ContractID>100003</ContractID>
|
||||
<ContractName>SomeContract3</ContractName>
|
||||
<ContractID>10000103</ContractID>
|
||||
<ContractName>SomeContract103</ContractName>
|
||||
</Contract>
|
||||
</Contracts>
|
||||
</NewElement>
|
||||
|
||||
11
benchmark/person_profile.pl
Normal file
11
benchmark/person_profile.pl
Normal file
@@ -0,0 +1,11 @@
|
||||
use lib '../lib';
|
||||
use lib '../example/lib';
|
||||
use lib '../../SOAP-WSDL_XS/blib/lib';
|
||||
use lib '../../SOAP-WSDL_XS/blib/arch';
|
||||
use strict;
|
||||
|
||||
use MyInterfaces::TestService::TestPort;
|
||||
|
||||
my $soap = MyInterfaces::TestService::TestPort->new();
|
||||
# Load all classes - XML::Compile has created everything before, too
|
||||
for (1..100) { $soap->ListPerson({}) };
|
||||
@@ -23,10 +23,10 @@ my %opt = (
|
||||
|
||||
{ # a block just to scope "no warnings"
|
||||
no warnings qw(redefine);
|
||||
|
||||
|
||||
*LWP::UserAgent::get_basic_credentials = sub {
|
||||
my ($user, $password);
|
||||
# remove user from option if called, to force prompting for a user
|
||||
# remove user from option if called, to force prompting for a user
|
||||
# name the next time
|
||||
print "URL requires authorization.\n";
|
||||
if (not $user = delete $opt{user}) {
|
||||
@@ -39,14 +39,14 @@ my %opt = (
|
||||
print 'Password:';
|
||||
ReadMode 2;
|
||||
$user = ReadLine;
|
||||
ReadMode 0;
|
||||
ReadMode 0;
|
||||
};
|
||||
return ($user, $password);
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
GetOptions(\%opt,
|
||||
qw(
|
||||
qw(
|
||||
prefix|p=s
|
||||
type_prefix|t=s
|
||||
element_prefix|e=s
|
||||
@@ -69,24 +69,21 @@ my $url = $ARGV[0];
|
||||
pod2usage( -exit => 1 , verbose => 2 ) if ($opt{help});
|
||||
pod2usage( -exit => 1 , verbose => 1 ) if not ($url);
|
||||
|
||||
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
|
||||
|
||||
local $ENV{HTTP_PROXY} = $opt{proxy} if $opt{proxy};
|
||||
local $ENV{HTTPS_PROXY} = $opt{proxy} if $opt{proxy};
|
||||
|
||||
my $lwp = LWP::UserAgent->new(
|
||||
$opt{keep_alive}
|
||||
? ( keep_alive => 1 )
|
||||
my $lwp = LWP::UserAgent->new(
|
||||
$opt{keep_alive}
|
||||
? ( keep_alive => 1 )
|
||||
: ()
|
||||
);
|
||||
$lwp->env_proxy(); # get proxy from environment. Works for both http & https.
|
||||
|
||||
my $response = $lwp->get($url);
|
||||
die $response->message(), "\n" if $response->code != 200;
|
||||
my $parser = SOAP::WSDL::Expat::WSDLParser->new({
|
||||
user_agent => $lwp,
|
||||
});
|
||||
|
||||
my $xml = $response->content();
|
||||
|
||||
my $definitions = $parser->parse_string( $xml );
|
||||
my $definitions = $parser->parse_uri( $url );
|
||||
|
||||
my %typemap = ();
|
||||
|
||||
@@ -112,7 +109,7 @@ $generator->set_element_prefix($opt{ element_prefix }) if $generator->can('set_e
|
||||
$generator->set_interface_prefix($opt{ interface_prefix }) if $generator->can('set_interface_prefix');
|
||||
$generator->set_OUTPUT_PATH($opt{ base_path }) if $generator->can('set_OUTPUT_PATH');
|
||||
$generator->set_definitions($definitions) if $generator->can('set_definitions');
|
||||
$generator->set_wsdl($xml) if $generator->can('set_wsdl');
|
||||
# $generator->set_wsdl($xml) if $generator->can('set_wsdl');
|
||||
|
||||
# start with typelib, as errors will most likely occur here...
|
||||
$generator->generate();
|
||||
@@ -136,33 +133,33 @@ wsdl2perl.pl - create perl bindings for SOAP webservices.
|
||||
NAME SHORT DESCRITPION
|
||||
----------------------------------------------------------------------------
|
||||
prefix p Prefix for both type and element classes.
|
||||
type_prefix t Prefix for type classes.
|
||||
type_prefix t Prefix for type classes.
|
||||
Default: MyTypes
|
||||
element_prefix e Prefix for element classes.
|
||||
element_prefix e Prefix for element classes.
|
||||
Default: MyElements
|
||||
typemap_prefix m Prefix for typemap classes.
|
||||
typemap_prefix m Prefix for typemap classes.
|
||||
Default: MyTypemaps
|
||||
interface_prefix i Prefix for interface classes.
|
||||
Default: MyInterfaces
|
||||
base_path b Path to create classes in.
|
||||
Default: .
|
||||
typemap_include mi File to include in typemap. Must eval() to a valid
|
||||
typemap_include mi File to include in typemap. Must eval() to a valid
|
||||
perl hash (not a hash ref !).
|
||||
proxy x HTTP(S) proxy to use (if any). wsdl2perl will also
|
||||
proxy x HTTP(S) proxy to use (if any). wsdl2perl will also
|
||||
use the proxy settings specified via the HTTP_PROXY
|
||||
and HTTPS_PROXY environment variables.
|
||||
keep_alive Use http keep_alive.
|
||||
user Username for HTTP authentication
|
||||
password Password. wsdl2perl will prompt if not given.
|
||||
generator g Generator to use.
|
||||
Default: XSD
|
||||
generator g Generator to use.
|
||||
Default: XSD
|
||||
server s Generate a server interface (currently only CGI
|
||||
supported)
|
||||
help h Show help content
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Generates a interface class for a SOAP web service described by a WSDL
|
||||
Generates a interface class for a SOAP web service described by a WSDL
|
||||
definition.
|
||||
|
||||
The following classes are created:
|
||||
@@ -171,7 +168,7 @@ The following classes are created:
|
||||
|
||||
=item * A interface class for every SOAP port in service
|
||||
|
||||
Interface classes are what you will mainly deal with: They provide a method
|
||||
Interface classes are what you will mainly deal with: They provide a method
|
||||
for accessing every web service method.
|
||||
|
||||
If you chose to generate Server interfaces, a class for every SOAP port in
|
||||
@@ -183,13 +180,13 @@ to dispatch calls to.
|
||||
|
||||
=item * A typemap for every service
|
||||
|
||||
Typemaps are used internally by SOAP::WSDL for parsing the SOAP message into
|
||||
object trees.
|
||||
Typemaps are used internally by SOAP::WSDL for parsing the SOAP message into
|
||||
object trees.
|
||||
|
||||
If the WSDL definition is incomplete, you may need to add some lines to
|
||||
If the WSDL definition is incomplete, you may need to add some lines to
|
||||
your typemap. Especially definitions for faults are sometimes left out.
|
||||
|
||||
Additional typemap content may be included by passing a file name as
|
||||
Additional typemap content may be included by passing a file name as
|
||||
typemap_include (mi) option.
|
||||
|
||||
=item * A type class for every element, complexType or simpleType definition
|
||||
@@ -197,7 +194,7 @@ typemap_include (mi) option.
|
||||
You may need to write additional type classes if your WSDL is incomplete.
|
||||
|
||||
For writing your own lib classes, see L<SOAP::WSDL::XSD::Typelib::Element>,
|
||||
L<SOAP::WSDL::XSD::Typelib::ComplexType>
|
||||
L<SOAP::WSDL::XSD::Typelib::ComplexType>
|
||||
and L<SOAP::WSDL::XSD::Typelib::SimpleType>.
|
||||
|
||||
=back
|
||||
@@ -210,26 +207,26 @@ You need Crypt::SSLeay installed for accessing HTTPS URLs.
|
||||
|
||||
=head2 Accessing protected documents
|
||||
|
||||
Use the -u option for specifying the user name. You will be prompted for a
|
||||
password.
|
||||
Use the -u option for specifying the user name. You will be prompted for a
|
||||
password.
|
||||
|
||||
Alternatively, you may specify a passowrd with --password on the command
|
||||
Alternatively, you may specify a passowrd with --password on the command
|
||||
line.
|
||||
|
||||
=head2 Accessing documents protected by NTLM authentication
|
||||
|
||||
Set the --keep_alive option.
|
||||
|
||||
Note that accessing documents protected by NTLM authentication is currently
|
||||
Note that accessing documents protected by NTLM authentication is currently
|
||||
untested, because I have no access to a system using NTLM authentication.
|
||||
If you try it, I would be glad if you could just drop me a note about
|
||||
success or failure.
|
||||
If you try it, I would be glad if you could just drop me a note about
|
||||
success or failure.
|
||||
|
||||
=head1 LICENSE
|
||||
|
||||
Copyright 2007 Martin Kutter.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
#!/usr/bin/perl -w
|
||||
package main;
|
||||
use strict;
|
||||
use warnings;
|
||||
use lib qw(../lib ../../lib);
|
||||
#use lib qw(../lib ../../lib);
|
||||
use MyElements::ListPersonResponse;
|
||||
use MyServer::TestService::TestPort;
|
||||
my $server = MyServer::TestService::TestPort->new({
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use lib 'lib'; # just needed because interface lies here
|
||||
use lib 'lib'; # just needed because interface lies here
|
||||
|
||||
# I have to generate the interface using wsdl2perl.pl before
|
||||
use MyInterfaces::HelloWorld::HelloWorldSoap;
|
||||
@@ -21,3 +21,4 @@ die $result if not $result;
|
||||
# I have to lookup the output parameter from the interface's POD - or try:
|
||||
# Will die on bad method names with a list of available methods
|
||||
print $result->get_sayHelloResult(), "\n";
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
#use strict;
|
||||
use warnings;
|
||||
use SOAP::Lite;
|
||||
use SOAP::Lite +trace;
|
||||
|
||||
# I have to lookup the URL from the WSDL
|
||||
my $soap = SOAP::Lite->new(
|
||||
@@ -13,15 +13,17 @@ $soap->on_action( sub { "urn:HelloWorld#sayHello" });
|
||||
$soap->autotype(0);
|
||||
|
||||
# I have to lookup the top level element's namespace from the WSDL
|
||||
$soap->default_ns('urn:HelloWorld');
|
||||
|
||||
# I have to encode all parameters as SOAP::Data objects
|
||||
# I have to know the order of parameters
|
||||
my $som = $soap->call(
|
||||
SOAP::Data->name("sayHello")
|
||||
->attr({ xmlns => 'urn:HelloWorld' }),
|
||||
"sayHello",
|
||||
SOAP::Data->name('name')->value( $ARGV[1] || '"Your name"'),
|
||||
SOAP::Data->name('givenName')->value( $ARGV[0] || '"Your given name"'),
|
||||
);
|
||||
|
||||
die $som->fault->{ faultstring } if ($som->fault);
|
||||
|
||||
print $som->result, "\n";
|
||||
print $som->result, "\n";
|
||||
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
use strict;
|
||||
use warnings;
|
||||
use lib 'lib';
|
||||
use MyInterfaces::TestService::TestPort;
|
||||
|
||||
my $soap = MyInterfaces::TestService::TestPort->new();
|
||||
$soap->outputxml(1);
|
||||
my $result = $soap->ListPerson({});
|
||||
|
||||
# print "Found " . scalar @{ $result->get_out->get_NewElement } . " persons\n";
|
||||
my $result = $soap->ListPerson({})
|
||||
or die "error calling SOAP method";
|
||||
|
||||
print "Found " . @{ $result->get_out()->get_NewElement } . " persons\n";
|
||||
|
||||
print $result;
|
||||
|
||||
@@ -1,107 +1,121 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><wsdl:definitions name="benchmark" targetNamespace="http://www.example.org/benchmark/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://www.example.org/benchmark/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
|
||||
<wsdl:types><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/benchmark/">
|
||||
<xsd:element name="ListPerson">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="in" type="tns:Person" maxOccurs="1" minOccurs="0"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="ListPersonResponse">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="out" type="tns:ArrayOfPerson"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:complexType name="Person">
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<wsdl:definitions name="benchmark"
|
||||
targetNamespace="http://www.example.org/benchmark/"
|
||||
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
|
||||
xmlns:tns="http://www.example.org/benchmark/"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
|
||||
<wsdl:types>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
targetNamespace="http://www.example.org/benchmark/">
|
||||
|
||||
<xsd:sequence>
|
||||
<xsd:element name="PersonID" type="tns:PersonID"></xsd:element>
|
||||
<xsd:element name="Salutation" type="xsd:string"></xsd:element>
|
||||
<xsd:element name="Name" type="xsd:string"></xsd:element>
|
||||
<xsd:element name="GivenName" type="xsd:string"></xsd:element>
|
||||
<xsd:element name="DateOfBirth" type="xsd:date"></xsd:element>
|
||||
<xsd:element name="HomeAddress" type="tns:Address"
|
||||
maxOccurs="1" minOccurs="1">
|
||||
</xsd:element>
|
||||
<xsd:element name="WorkAddress" type="tns:Address"
|
||||
maxOccurs="1" minOccurs="0">
|
||||
</xsd:element>
|
||||
<xsd:element name="Contracts" type="tns:ArrayOfContract"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:element name="ListPerson">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="in" type="tns:Person"
|
||||
maxOccurs="1" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
|
||||
<xsd:simpleType name="PhoneNumber">
|
||||
<xsd:restriction base="xsd:string">
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:element name="ListPersonResponse">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="out" type="tns:ArrayOfPerson" />
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:complexType name="Person">
|
||||
|
||||
<xsd:complexType name="ArrayOfPerson">
|
||||
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:element name="NewElement" type="tns:Person" maxOccurs="unbounded" minOccurs="0"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="PersonID" type="tns:PersonID" />
|
||||
<xsd:element name="Salutation" type="xsd:string" />
|
||||
<xsd:element name="Name" type="xsd:string" />
|
||||
<xsd:element name="GivenName" type="xsd:string" />
|
||||
<xsd:element name="DateOfBirth" type="xsd:date" />
|
||||
<xsd:element name="HomeAddress" type="tns:Address"
|
||||
maxOccurs="1" minOccurs="1" />
|
||||
<xsd:element name="WorkAddress" type="tns:Address"
|
||||
maxOccurs="1" minOccurs="0" />
|
||||
<xsd:element name="Contracts"
|
||||
type="tns:ArrayOfContract" />
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="PersonID">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="ID" type="xsd:int"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:simpleType name="PhoneNumber">
|
||||
<xsd:restriction base="xsd:string"></xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
|
||||
<xsd:complexType name="Address">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="Street" type="xsd:string"></xsd:element>
|
||||
<xsd:element name="ZIP" type="xsd:string"></xsd:element>
|
||||
<xsd:element name="City" type="xsd:string"></xsd:element>
|
||||
<xsd:element name="Country" type="xsd:string"></xsd:element>
|
||||
<xsd:element name="PhoneNumber" type="tns:PhoneNumber"></xsd:element>
|
||||
<xsd:element name="MobilePhoneNumber" type="tns:PhoneNumber"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="ArrayOfPerson">
|
||||
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:element name="NewElement" type="tns:Person"
|
||||
maxOccurs="unbounded" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="ArrayOfContract">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="Contract" type="tns:Contract" maxOccurs="unbounded" minOccurs="0"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="PersonID">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="ID" type="xsd:int"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="Contract">
|
||||
<xsd:complexType name="Address">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="Street" type="xsd:string" />
|
||||
<xsd:element name="ZIP" type="xsd:string" />
|
||||
<xsd:element name="City" type="xsd:string" />
|
||||
<xsd:element name="Country" type="xsd:string" />
|
||||
<xsd:element name="PhoneNumber" type="tns:PhoneNumber" />
|
||||
<xsd:element name="MobilePhoneNumber" type="tns:PhoneNumber" />
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:sequence>
|
||||
<xsd:element name="ContractID" type="xsd:long"></xsd:element>
|
||||
<xsd:element name="ContractName" type="xsd:string"></xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:schema></wsdl:types>
|
||||
<xsd:complexType name="ArrayOfContract">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="Contract" type="tns:Contract"
|
||||
maxOccurs="unbounded" minOccurs="0">
|
||||
</xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="Contract">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="ContractID" type="xsd:long" />
|
||||
<xsd:element name="ContractName" type="xsd:string" />
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:schema>
|
||||
</wsdl:types>
|
||||
<wsdl:message name="ListPersonRequest">
|
||||
<wsdl:part name="parameters" element="tns:ListPerson"></wsdl:part>
|
||||
<wsdl:part name="parameters" element="tns:ListPerson" />
|
||||
</wsdl:message>
|
||||
<wsdl:message name="ListPersonResponse">
|
||||
<wsdl:part name="parameters" element="tns:ListPersonResponse"></wsdl:part>
|
||||
<wsdl:part name="parameters" element="tns:ListPersonResponse" />
|
||||
</wsdl:message>
|
||||
<wsdl:portType name="NewPortType">
|
||||
<wsdl:operation name="ListPerson">
|
||||
<wsdl:input message="tns:ListPersonRequest"></wsdl:input>
|
||||
<wsdl:output message="tns:ListPersonResponse"></wsdl:output>
|
||||
</wsdl:operation>
|
||||
<wsdl:operation name="ListPerson">
|
||||
<wsdl:input message="tns:ListPersonRequest"></wsdl:input>
|
||||
<wsdl:output message="tns:ListPersonResponse"></wsdl:output>
|
||||
</wsdl:operation>
|
||||
</wsdl:portType>
|
||||
<wsdl:binding name="NewBinding" type="tns:NewPortType">
|
||||
<soap:binding style="document"
|
||||
transport="http://schemas.xmlsoap.org/soap/http" />
|
||||
<wsdl:operation name="ListPerson">
|
||||
<soap:operation
|
||||
soapAction="http://www.example.org/benchmark/ListPerson" />
|
||||
<wsdl:input>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:input>
|
||||
<wsdl:output>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:output>
|
||||
</wsdl:operation>
|
||||
<soap:binding style="document"
|
||||
transport="http://schemas.xmlsoap.org/soap/http" />
|
||||
<wsdl:operation name="ListPerson">
|
||||
<soap:operation
|
||||
soapAction="http://www.example.org/benchmark/ListPerson" />
|
||||
<wsdl:input>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:input>
|
||||
<wsdl:output>
|
||||
<soap:body use="literal" />
|
||||
</wsdl:output>
|
||||
</wsdl:operation>
|
||||
</wsdl:binding>
|
||||
<wsdl:service name="TestService">
|
||||
<wsdl:port name="TestPort" binding="tns:NewBinding">
|
||||
<soap:address location="http://localhost:81/soap-wsdl-test/person.pl"></soap:address>
|
||||
</wsdl:port>
|
||||
</wsdl:service></wsdl:definitions>
|
||||
<wsdl:port name="TestPort" binding="tns:NewBinding">
|
||||
<soap:address
|
||||
location="http://localhost:81/soap-wsdl-test/person.pl"></soap:address>
|
||||
</wsdl:port>
|
||||
</wsdl:service>
|
||||
</wsdl:definitions>
|
||||
@@ -14,7 +14,7 @@ use Class::Std::Fast;
|
||||
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
||||
use LWP::UserAgent;
|
||||
|
||||
our $VERSION= '2.00_25';
|
||||
our $VERSION= '2.00_31';
|
||||
|
||||
my %no_dispatch_of :ATTR(:name<no_dispatch>);
|
||||
my %wsdl_of :ATTR(:name<wsdl>);
|
||||
@@ -176,7 +176,7 @@ sub _wsdl_init_methods :PRIVATE {
|
||||
my $ns = $wsdl->get_targetNamespace();
|
||||
|
||||
# get bindings, portType, message, part(s) - use private methods for clear separation...
|
||||
$self->_wsdl_get_service if not ($service_of{ $ident });
|
||||
$self->_wsdl_get_service();
|
||||
$self->_wsdl_get_portType();
|
||||
|
||||
$method_info_of{ $ident } = {};
|
||||
@@ -187,9 +187,10 @@ sub _wsdl_init_methods :PRIVATE {
|
||||
|
||||
# get SOAP Action
|
||||
# SOAP-Action is a required HTTP Header, so we need to look it up...
|
||||
# There must be a soapAction uri - or the WSDL is invalid (and
|
||||
# it's not us to prove that...)
|
||||
my $soap_binding_operation = $binding_operation->get_operation()->[0];
|
||||
$method->{ soap_action } = $soap_binding_operation ?
|
||||
$soap_binding_operation->get_soapAction() : $method;
|
||||
$method->{ soap_action } = $soap_binding_operation->get_soapAction();
|
||||
|
||||
# get parts
|
||||
# 1. get operation from port
|
||||
@@ -204,7 +205,10 @@ sub _wsdl_init_methods :PRIVATE {
|
||||
my $message = $wsdl->find_message( $ns, $localname )
|
||||
or croak "Message {$ns}$localname not found in WSDL definition";
|
||||
|
||||
if (my $body=$binding_operation->first_input()->first_body()) {
|
||||
# Is body not required? So there must be one? Do we need the "if"?
|
||||
# if (
|
||||
my $body=$binding_operation->first_input()->first_body();
|
||||
# {
|
||||
if ($body->get_parts()) {
|
||||
$method->{ parts } = []; # make sure it's empty
|
||||
my $message_part_ref = $message->get_part();
|
||||
@@ -216,7 +220,9 @@ sub _wsdl_init_methods :PRIVATE {
|
||||
grep { $_->get_name() eq $name } @{ $message_part_ref };
|
||||
}
|
||||
}
|
||||
}
|
||||
# }
|
||||
# A body does not need to specify the parts of a messages.
|
||||
# Use all of the message's parts if it does not.
|
||||
$method->{ parts } ||= $message->get_part();
|
||||
|
||||
# rpc / encoded methods may have a namespace specified.
|
||||
@@ -329,7 +335,7 @@ SOAP client, which mimics L<SOAP::Lite|SOAP::Lite>'s API, read on.
|
||||
my $soap = SOAP::WSDL->new(
|
||||
wsdl => 'file://bla.wsdl',
|
||||
);
|
||||
|
||||
|
||||
my $result = $soap->call('MyMethod', %data);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
@@ -436,7 +442,7 @@ Class resolver
|
||||
'Person/Name' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
'Person/FirstName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
);
|
||||
|
||||
|
||||
sub get_class { return $typemap{ $_[1] } };
|
||||
1;
|
||||
|
||||
@@ -669,12 +675,12 @@ The following facets have no influence yet:
|
||||
|
||||
=item * L<SOAP::Lite|SOAP::Lite>
|
||||
|
||||
Full featured SOAP-library, little WSDL support. Supports rpc-encoded style
|
||||
Full featured SOAP-library, little WSDL support. Supports rpc-encoded style
|
||||
only. Many protocols supported.
|
||||
|
||||
=item * L<XML::Compile::WSDL|XML::Compile::WSDL> / L<XML::Compile::SOAP|XML::Compile::SOAP>
|
||||
|
||||
Creates parser/generator functions for SOAP messages. Includes SOAP Client
|
||||
Creates parser/generator functions for SOAP messages. Includes SOAP Client
|
||||
and Server implementatios.
|
||||
|
||||
You might want to give it a try, especially if you need to adhere very
|
||||
@@ -730,9 +736,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 457 $
|
||||
$Rev: 524 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: WSDL.pm 457 2007-12-16 08:02:06Z kutterma $
|
||||
$Id: WSDL.pm 524 2008-02-10 23:24:43Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -8,22 +8,32 @@ our $VERSION = '2.00_25';
|
||||
|
||||
sub call {
|
||||
my ($self, $method, $body, $header) = @_;
|
||||
|
||||
# Treat non-objects special
|
||||
if (not blessed $body) {
|
||||
|
||||
# make sure there's something sensible in our body data
|
||||
$body = {} if not defined $body;
|
||||
$body = ref $body eq 'ARRAY' ? $body : [ $body ];
|
||||
my $index = 0;
|
||||
my @part_from;
|
||||
foreach my $part (@{ $body }) {
|
||||
my $class = $method->{ body }->{ parts }->[$index];
|
||||
|
||||
my @body_from = @{ $body }; # make a copy
|
||||
|
||||
# build list of parts as objects initialized with
|
||||
# parameters given
|
||||
my @part_from = ();
|
||||
foreach my $class (@{ $method->{ body }->{ parts } }) {
|
||||
eval "require $class" || die $@;
|
||||
push @part_from, $class->new($part);
|
||||
$index++;
|
||||
push @part_from, $class->new(shift(@body_from) || {});
|
||||
}
|
||||
|
||||
# it's either the first part or a list ref with all parts...
|
||||
$body = $#part_from ? \@part_from : $part_from[0];
|
||||
}
|
||||
|
||||
# if we have a header
|
||||
if (%{ $method->{ header } }) {
|
||||
|
||||
# trat non object special - as above, but only for one
|
||||
if (not blessed $header) {
|
||||
my $class = $method->{ header }->{ parts }->[0];
|
||||
eval "require $class" || die $@;
|
||||
@@ -33,39 +43,6 @@ sub call {
|
||||
return $self->SUPER::call($method, $body, $header);
|
||||
}
|
||||
|
||||
#sub __create_methods {
|
||||
# my ($package, %info_of) = @_;
|
||||
#
|
||||
# no strict qw(refs);
|
||||
# no warnings qw(redefine);
|
||||
# for my $method (keys %info_of){
|
||||
# my ($soap_action, @parts);
|
||||
#
|
||||
# # up to 2.00_10 we had list refs...
|
||||
# if (ref $info_of{ $method }eq 'HASH') {
|
||||
# @parts = @{ $info_of{ $method }->{ parts } };
|
||||
# $soap_action = $info_of{ $method }->{ soap_action };
|
||||
# }
|
||||
# else {
|
||||
# die "Pre-v2.00_10 Interfaces are no longer supported. Please re-generate your interface.";
|
||||
# }
|
||||
#
|
||||
# *{ "$package\::$method" } = sub {
|
||||
# my $self = shift;
|
||||
# my @param = map {
|
||||
# my $data = shift || {};
|
||||
# eval "require $_";
|
||||
# $_->new( $data );
|
||||
# } @parts;
|
||||
#
|
||||
# return $self->SUPER::call( {
|
||||
# operation => $method,
|
||||
# soap_action => $soap_action,
|
||||
# }, @param );
|
||||
# }
|
||||
# }
|
||||
#}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
@@ -101,9 +78,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 440 $
|
||||
$Rev: 501 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Base.pm 440 2007-12-04 22:24:33Z kutterma $
|
||||
$Id: Base.pm 501 2008-01-26 20:23:32Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -9,7 +9,7 @@ use List::Util qw(first);
|
||||
use Class::Std::Fast::Storable;
|
||||
use base qw(SOAP::WSDL::Base);
|
||||
|
||||
our $VERSION='2.00_25';
|
||||
our $VERSION='2.00_27';
|
||||
|
||||
my %types_of :ATTR(:name<types> :default<[]>);
|
||||
my %message_of :ATTR(:name<message> :default<()>);
|
||||
@@ -105,7 +105,7 @@ Returns the message matching the namespace/localname pair passed as arguments.
|
||||
Accessors/Mutators for accessing / setting the E<gt>typesE<lt> child
|
||||
element(s).
|
||||
|
||||
=head1 LICENSE and COPYRIGHT
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright 2004-2007 Martin Kutter.
|
||||
|
||||
@@ -118,9 +118,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 431 $
|
||||
$Rev: 477 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Definitions.pm 431 2007-12-03 19:39:11Z kutterma $
|
||||
$Id: Definitions.pm 477 2007-12-24 10:23:52Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Definitions.pm $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -23,7 +23,8 @@ sub BUILD {
|
||||
sub deserialize {
|
||||
my ($self, $content) = @_;
|
||||
|
||||
$parser_of{ ${ $self } } ||= SOAP::WSDL::Expat::MessageParser->new();
|
||||
$parser_of{ ${ $self } } = SOAP::WSDL::Expat::MessageParser->new()
|
||||
if not $parser_of{ ${ $self } };
|
||||
$parser_of{ ${ $self } }->class_resolver( $class_resolver_of{ ident $self } );
|
||||
eval { $parser_of{ ${ $self } }->parse_string( $content ) };
|
||||
if ($@) {
|
||||
@@ -98,9 +99,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 427 $
|
||||
$Rev: 501 $
|
||||
$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 $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,17 +1,47 @@
|
||||
package SOAP::WSDL::Expat::Base;
|
||||
use strict;
|
||||
use warnings;
|
||||
use URI;
|
||||
use XML::Parser::Expat;
|
||||
|
||||
our $VERSION = '2.00_24';
|
||||
# TODO: convert to Class::Std::Fast based class - hash based classes suck.
|
||||
|
||||
our $VERSION = '2.00_27';
|
||||
|
||||
sub new {
|
||||
my ($class, $args) = @_;
|
||||
my ($class, $arg_ref) = @_;
|
||||
my $self = {};
|
||||
bless $self, $class;
|
||||
|
||||
$self->set_user_agent($arg_ref->{ user_agent })
|
||||
if $arg_ref->{ user_agent };
|
||||
|
||||
return $self;
|
||||
}
|
||||
|
||||
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 parse_uri {
|
||||
my $self = shift;
|
||||
my $uri = shift;
|
||||
$self->set_uri( $uri );
|
||||
|
||||
if (not $self->{ user_agent }) {
|
||||
require LWP::UserAgent;
|
||||
$self->{ user_agent } = LWP::UserAgent->new();
|
||||
}
|
||||
|
||||
my $response = $self->{ user_agent }->get($uri);
|
||||
|
||||
die $response->message() if $response->code() ne '200';
|
||||
return $self->parse( $response->content() );
|
||||
}
|
||||
|
||||
sub parse {
|
||||
eval {
|
||||
$_[0]->_initialize( XML::Parser::Expat->new( Namespaces => 1 ) )->parse( $_[1] );
|
||||
@@ -41,4 +71,38 @@ sub get_data {
|
||||
return $_[0]->{ data };
|
||||
}
|
||||
|
||||
1;
|
||||
1;
|
||||
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SOAP::WSDL::Expat::Base - Base class for XML::Parser::Expat based XML parsers
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Base class for XML::Parser::Expat based XML parsers. All XML::SAX::Expat based
|
||||
parsers in SOAP::WSDL inherit from this class.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Replace the whitespace by @ for E-Mail Address.
|
||||
|
||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright 2004-2007 Martin Kutter.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself
|
||||
|
||||
=head1 Repository information
|
||||
|
||||
$Id: $
|
||||
|
||||
$LastChangedDate: 2007-09-10 18:19:23 +0200 (Mo, 10 Sep 2007) $
|
||||
$LastChangedRevision: 218 $
|
||||
$LastChangedBy: kutterma $
|
||||
|
||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $
|
||||
|
||||
@@ -4,7 +4,7 @@ use strict;
|
||||
use warnings;
|
||||
use base qw(SOAP::WSDL::Expat::Base);
|
||||
|
||||
our $VERSION = '2.00_24';
|
||||
our $VERSION = '2.00_27';
|
||||
|
||||
sub _initialize {
|
||||
my ($self, $parser) = @_;
|
||||
@@ -113,13 +113,16 @@ Replace the whitespace by @ for E-Mail Address.
|
||||
|
||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 COPYING
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
This module may be used under the same terms as perl itself.
|
||||
Copyright 2004-2007 Martin Kutter.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself
|
||||
|
||||
=head1 Repository information
|
||||
|
||||
$ID: $
|
||||
$Id: $
|
||||
|
||||
$LastChangedDate: 2007-09-10 18:19:23 +0200 (Mo, 10 Sep 2007) $
|
||||
$LastChangedRevision: 218 $
|
||||
|
||||
@@ -4,7 +4,7 @@ use strict;
|
||||
use warnings;
|
||||
use Carp qw(croak confess);
|
||||
|
||||
our $VERSION = q{2.00_25};
|
||||
our $VERSION = q{2.00_27};
|
||||
|
||||
use SOAP::WSDL::XSD::Typelib::Builtin;
|
||||
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
||||
@@ -117,7 +117,7 @@ sub _initialize {
|
||||
no strict qw(refs);
|
||||
$parser->setHandlers(
|
||||
Start => sub {
|
||||
# my ($parser, $element, %_attrs) = @_;
|
||||
# my ($parser, $element, %attrs) = @_;
|
||||
|
||||
$_leaf = 1; # believe we're a leaf node until we see an end
|
||||
|
||||
@@ -128,7 +128,7 @@ sub _initialize {
|
||||
return &{$content_check{ $depth }}
|
||||
if exists $content_check{ $depth };
|
||||
|
||||
push @{ $path }, $_[1]; # step down in path
|
||||
push @{ $path }, $_[1]; # step down in path
|
||||
return if $skip; # skip inside __SKIP__
|
||||
|
||||
# resolve class of this element
|
||||
@@ -171,6 +171,9 @@ sub _initialize {
|
||||
$current = bless \$o, $_class;
|
||||
}
|
||||
|
||||
# set attributes if there are any
|
||||
$current->attr({ @_[2..$#_] }) if (@_ > 2);
|
||||
|
||||
$depth++;
|
||||
return;
|
||||
},
|
||||
@@ -260,7 +263,7 @@ See L<SOAP::WSDL::Manual::Parser> for details.
|
||||
Sometimes there's unneccessary information transported in SOAP messages.
|
||||
|
||||
To skip XML nodes (including all child nodes), just edit the type map for
|
||||
the message, set the type map entry to '__SKIP__', and comment out all
|
||||
the message, set the type map entry to '__SKIP__', and comment out all
|
||||
child elements you want to skip.
|
||||
|
||||
=head1 Bugs and Limitations
|
||||
@@ -281,16 +284,19 @@ Replace the whitespace by @ for E-Mail Address.
|
||||
|
||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 COPYING
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
This module may be used under the same terms as perl itself.
|
||||
Copyright 2004-2007 Martin Kutter.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself
|
||||
|
||||
=head1 Repository information
|
||||
|
||||
$ID: $
|
||||
$Id: $
|
||||
|
||||
$LastChangedDate: 2007-12-07 21:04:06 +0100 (Fr, 07 Dez 2007) $
|
||||
$LastChangedRevision: 444 $
|
||||
$LastChangedDate: 2008-02-02 10:19:45 +0100 (Sa, 02 Feb 2008) $
|
||||
$LastChangedRevision: 516 $
|
||||
$LastChangedBy: kutterma $
|
||||
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $
|
||||
|
||||
@@ -56,22 +56,22 @@ See L<SOAP::WSDL::Manual::Parser> for details.
|
||||
|
||||
See SOAP::WSDL::Expat::MessageParser
|
||||
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright 2007 Martin Kutter. All rights reserved.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribte/modify it under
|
||||
the same terms as perl itself
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright 2007 Martin Kutter.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 391 $
|
||||
$Rev: 477 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: MessageStreamParser.pm 391 2007-11-17 21:56:13Z kutterma $
|
||||
$Id: MessageStreamParser.pm 477 2007-12-24 10:23:52Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageStreamParser.pm $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -5,7 +5,57 @@ use Carp;
|
||||
use SOAP::WSDL::TypeLookup;
|
||||
use base qw(SOAP::WSDL::Expat::Base);
|
||||
|
||||
our $VERSION = q{2.00_27};
|
||||
our $VERSION = q{2.00_31};
|
||||
|
||||
sub _import_children {
|
||||
my ($self, $name, $imported, $importer, $import_namespace) = @_;
|
||||
my $targetNamespace = $importer->get_targetNamespace();
|
||||
my $push_method = "push_$name";
|
||||
my $get_method = "get_$name";
|
||||
no strict qw(refs);
|
||||
my $value_ref = $imported->$get_method();
|
||||
if ($value_ref) {
|
||||
$value_ref = [ $value_ref ] if (not ref $value_ref eq 'ARRAY');
|
||||
# set xmlns - can be different from parent
|
||||
for (@{ $value_ref }) {
|
||||
# fixup targetNamespace, but don't override
|
||||
$_->set_targetNamespace( $import_namespace )
|
||||
if ( ($import_namespace ne $targetNamespace) && ! $_->get_targetNamespace);
|
||||
# update parent...
|
||||
$_->set_parent( $importer );
|
||||
}
|
||||
# push elements into importing WSDL
|
||||
$importer->$push_method(@{ $value_ref });
|
||||
}
|
||||
}
|
||||
|
||||
sub xml_schema_import {
|
||||
my $self = shift;
|
||||
my $schema = shift;
|
||||
my $parser = ref($self)->new();
|
||||
my %attr_of = @_;
|
||||
my $import_namespace = $attr_of{ namespace };
|
||||
my $uri = URI->new_abs($attr_of{schemaLocation}, $self->get_uri() );
|
||||
my $import = $parser->parse_uri($uri);
|
||||
|
||||
for my $name ( qw(type element group) ) {
|
||||
$self->_import_children( $name, $import, $schema, $import_namespace);
|
||||
}
|
||||
}
|
||||
|
||||
sub wsdl_import {
|
||||
my $self = shift;
|
||||
my $definitions = shift;
|
||||
my $parser = ref($self)->new();
|
||||
my %attr_of = @_;
|
||||
my $import_namespace = $attr_of{ namespace };
|
||||
my $uri = URI->new_abs($attr_of{location}, $self->get_uri() );
|
||||
|
||||
my $import = $parser->parse_uri($uri);
|
||||
for my $name ( qw(types message binding portType service) ) {
|
||||
$self->_import_children( $name, $import, $definitions, $import_namespace);
|
||||
}
|
||||
}
|
||||
|
||||
sub _initialize {
|
||||
my ($self, $parser) = @_;
|
||||
@@ -65,7 +115,7 @@ sub _initialize {
|
||||
$current->init( _fixup_attrs($parser, %attrs) );
|
||||
}
|
||||
elsif ($action->{ type } eq 'METHOD') {
|
||||
my $method = $action->{ method } || $localname;
|
||||
my $method = $action->{ method };
|
||||
|
||||
no strict qw(refs);
|
||||
# call method with
|
||||
@@ -81,6 +131,20 @@ sub _initialize {
|
||||
: _fixup_attrs($parser, %attrs)
|
||||
);
|
||||
}
|
||||
elsif ($action->{type} eq 'HANDLER') {
|
||||
my $method = $self->can($action->{method});
|
||||
$method->($self, $current, %attrs);
|
||||
}
|
||||
else {
|
||||
# TODO replace by hash lookup of known namespaces.
|
||||
my $namespace = $parser->namespace($localname) || q{};
|
||||
my $part = $namespace eq 'http://schemas.xmlsoap.org/wsdl/'
|
||||
? 'WSDL 1.1'
|
||||
: 'XML Schema';
|
||||
|
||||
warn "$part element <$localname> is not implemented yet"
|
||||
if ($localname !~m{ \A (:? annotation | documentation ) \z }xms );
|
||||
}
|
||||
|
||||
return;
|
||||
},
|
||||
@@ -145,3 +209,43 @@ sub _fixup_attrs {
|
||||
|
||||
1;
|
||||
|
||||
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SOAP::WSDL::Expat::WSDLParser - Parse WSDL files into object trees
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
|
||||
$parser->parse( $xml );
|
||||
my $obj = $parser->get_data();
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
WSDL parser used by SOAP::WSDL.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Replace the whitespace by @ for E-Mail Address.
|
||||
|
||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright 2004-2007 Martin Kutter.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself
|
||||
|
||||
=head1 Repository information
|
||||
|
||||
$Id: $
|
||||
|
||||
$LastChangedDate: 2008-02-11 00:14:27 +0100 (Mo, 11 Feb 2008) $
|
||||
$LastChangedRevision: 522 $
|
||||
$LastChangedBy: kutterma $
|
||||
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/WSDLParser.pm $
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ sub register {
|
||||
|
||||
sub get_deserializer {
|
||||
my ($self, $args_of_ref) = @_;
|
||||
|
||||
$args_of_ref->{ soap_version } ||= '1.1';
|
||||
# sanity check
|
||||
die "no deserializer registered for SOAP version $args_of_ref->{ soap_version }"
|
||||
if not exists ($DESERIALIZER{ $args_of_ref->{ soap_version } });
|
||||
@@ -137,7 +137,7 @@ passed as a single hash ref:
|
||||
|
||||
Copyright 2007 Martin Kutter. All rights reserved.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribte/modify it under
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
@@ -155,7 +155,7 @@ Set user-defined typemap snippet
|
||||
|
||||
Copyright 2007 Martin Kutter. All rights reserved.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribte/modify it under
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
@@ -16,7 +16,7 @@ sub register {
|
||||
|
||||
sub get_serializer {
|
||||
my ($self, $args_of_ref) = @_;
|
||||
|
||||
$args_of_ref->{ soap_version } ||= '1.1';
|
||||
# sanity check
|
||||
die "no serializer registered for SOAP version $args_of_ref->{ soap_version }"
|
||||
if not exists ($SERIALIZER{ $args_of_ref->{ soap_version } });
|
||||
@@ -138,9 +138,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 391 $
|
||||
$Rev: 510 $
|
||||
$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 $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Transport;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
our $VERSION='2.00_25';
|
||||
our $VERSION='2.00_31';
|
||||
|
||||
# class data
|
||||
my %registered_transport_of = ();
|
||||
@@ -34,7 +34,7 @@ sub register {
|
||||
sub get_transport {
|
||||
my ($class, $scheme, %attrs) = @_;
|
||||
|
||||
$scheme =~s{ \A ([^\:]+) \: .+ }{$1}smx;
|
||||
$scheme =~s{ \A ([^\:]+) \: .+ }{$1}x;
|
||||
|
||||
if ($registered_transport_of{ $scheme }) {
|
||||
no strict qw(refs);
|
||||
@@ -96,12 +96,12 @@ SOAP::WSDL::Factory::Transport - Factory for retrieving transport objects
|
||||
# in transport class:
|
||||
package MyWickedTransport;
|
||||
use SOAP::WSDL::Factory::Transport;
|
||||
|
||||
|
||||
# register class as transport module for httpr and https
|
||||
# (httpr is "reliable http", a protocol developed by IBM).
|
||||
SOAP::WSDL::Factory::Transport->register( 'httpr' , __PACKAGE__ );
|
||||
SOAP::WSDL::Factory::Transport->register( 'https' , __PACKAGE__ );
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SOAP::WSDL::Transport serves as factory for retrieving transport objects for
|
||||
@@ -207,10 +207,10 @@ classes in one file, and to follow this naming scheme:
|
||||
|
||||
Module name:
|
||||
"SOAP::Transport::" . uc($scheme)
|
||||
|
||||
|
||||
Client class (additional package in module):
|
||||
"SOAP::Transport::" . uc($scheme) . "::Client"
|
||||
|
||||
|
||||
Server class (additional package in module):
|
||||
"SOAP::Transport::" . uc($scheme) . "::Client"
|
||||
|
||||
@@ -240,9 +240,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 459 $
|
||||
$Rev: 524 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Transport.pm 459 2007-12-16 16:00:14Z kutterma $
|
||||
$Id: Transport.pm 524 2008-02-10 23:24:43Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $
|
||||
|
||||
|
||||
=cut
|
||||
|
||||
@@ -5,7 +5,7 @@ use Class::Std::Fast::Storable;
|
||||
use File::Basename;
|
||||
use File::Spec;
|
||||
|
||||
our $VERSION = q{2.00_25};
|
||||
our $VERSION = q{2.00_27};
|
||||
|
||||
use SOAP::WSDL::Generator::Visitor::Typemap;
|
||||
use SOAP::WSDL::Generator::Visitor::Typelib;
|
||||
@@ -57,8 +57,8 @@ sub generate {
|
||||
sub generate_typelib {
|
||||
my ($self, $arg_ref) = @_;
|
||||
# $output_of{ ident $self } = "";
|
||||
my @schema = exists $arg_ref->{ schema }
|
||||
? @{ $arg_ref->{schema} }
|
||||
my @schema = exists $arg_ref->{ schema }
|
||||
? @{ $arg_ref->{schema} }
|
||||
: @{ $self->get_definitions()->first_types()->get_schema() };
|
||||
for my $type (map { @{ $_->get_type() } , @{ $_->get_element() } } @schema[1..$#schema] ) {
|
||||
$type->_accept( $self );
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
package [% interface_prefix %]::[% service.get_name.replace('\.', '::').replace('-', '_') %]::[% port.get_name.replace('^.+\.','').replace('-', '_') %];
|
||||
[% interface_name = interface_prefix _ '::'
|
||||
_ service.get_name.replace('\.', '::') _ '::'
|
||||
_ port.get_name.replace('^.+\.','');
|
||||
interface_name = interface_name.replace('-','_'); -%]
|
||||
package [% interface_name %];
|
||||
use strict;
|
||||
use warnings;
|
||||
use Class::Std::Fast::Storable;
|
||||
@@ -28,18 +32,22 @@ sub START {
|
||||
[% IF NO_POD; STOP; END %]
|
||||
|
||||
__END__
|
||||
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||
[% pod = BLOCK %]=pod[% END -%]
|
||||
[% head1 = BLOCK %]=head1[% END -%]
|
||||
[% head2 = BLOCK %]=head2[% END -%]
|
||||
[% head3 = BLOCK %]=head3[% END -%]
|
||||
|
||||
=pod
|
||||
[% pod %]
|
||||
|
||||
=head1 NAME
|
||||
[% head1 %] NAME
|
||||
|
||||
[% interface_name %] - SOAP Interface for the [% service.get_name %] Web Service
|
||||
|
||||
[% interface_prefix %]::[% service.get_name.replace('\.', '::').replace('-', '_') %]::[% port.get_name.replace('\.', '::').replace('-', '_') %] - SOAP Interface for the [% service.get_name %] Web Service
|
||||
[% head1 %] SYNOPSIS
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use [% interface_prefix %]::[% service.get_name.replace('\.', '::').replace('-', '_') %]::[% port.get_name.replace('\.', '::').replace('-', '_') %];
|
||||
my $interface = [% interface_prefix %]::[% service.get_name.replace('\.', '::').replace('-', '_') %]::[% port.get_name.replace('\.', '::').replace('-', '_') %]->new();
|
||||
use [% interface_name %];
|
||||
my $interface = [% interface_name %]->new();
|
||||
|
||||
my $response;
|
||||
[% FOREACH operation = binding.get_operation;
|
||||
@@ -47,30 +55,30 @@ __END__
|
||||
[% END %]
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
[% head1 %] DESCRIPTION
|
||||
|
||||
SOAP Interface for the [% service.get_name %] web service
|
||||
located at [% port.first_address.get_location %].
|
||||
|
||||
=head1 SERVICE [% service.get_name %]
|
||||
[% head1 %] SERVICE [% service.get_name %]
|
||||
|
||||
[% service.get_documentation %]
|
||||
|
||||
=head2 Port [% port.get_name %]
|
||||
[% head2 %] Port [% port.get_name %]
|
||||
|
||||
[% port.get_documentation %]
|
||||
|
||||
=head1 METHODS
|
||||
[% head1 %] METHODS
|
||||
|
||||
=head2 General methods
|
||||
[% head2 %] General methods
|
||||
|
||||
=head3 new
|
||||
[% head3 %] new
|
||||
|
||||
Constructor.
|
||||
|
||||
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
|
||||
|
||||
=head2 SOAP Service methods
|
||||
[% head2 %] SOAP Service methods
|
||||
|
||||
[% INCLUDE Interface/POD/method_info.tt %]
|
||||
|
||||
@@ -79,8 +87,8 @@ All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
|
||||
%][% INCLUDE Interface/POD/Operation.tt %]
|
||||
[% END %]
|
||||
|
||||
=head1 AUTHOR
|
||||
[% head1 %] AUTHOR
|
||||
|
||||
Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %]
|
||||
|
||||
=pod
|
||||
=cut
|
||||
@@ -1,4 +1,6 @@
|
||||
=head3 [% operation.get_name %]
|
||||
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||
[% head3 = BLOCK %]=head3[% END -%]
|
||||
[% head3 %] [% operation.get_name %]
|
||||
|
||||
[% type = definitions.find_portType( binding.expand( binding.get_type ) );
|
||||
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
package [% server_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('^.+\.','') %];
|
||||
[% server_name = server_prefix _ '::'
|
||||
_ service.get_name.replace('\.', '::') _ '::'
|
||||
_ port.get_name.replace('^.+\.','');
|
||||
server_name = server_name.replace('-','_'); -%]
|
||||
package [% server_name %];
|
||||
use strict;
|
||||
use warnings;
|
||||
use Class::Std::Fast::Storable;
|
||||
@@ -23,7 +27,7 @@ my $action_map_ref = {
|
||||
|
||||
sub START {
|
||||
my ($self, $ident, $arg_ref) = @_;
|
||||
eval "require $transport_class_of{ $ident }"
|
||||
eval "require $transport_class_of{ $ident }"
|
||||
or die "Cannot load transport class $transport_class_of{ $ident }: $@";
|
||||
$transport_of{ $ident } = $transport_class_of{ $ident }->new({
|
||||
action_map_ref => $action_map_ref,
|
||||
@@ -41,48 +45,53 @@ sub handle {
|
||||
[% IF NO_POD; STOP; END %]
|
||||
|
||||
__END__
|
||||
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||
[% pod = BLOCK %]=pod[% END -%]
|
||||
[% head1 = BLOCK %]=head1[% END -%]
|
||||
[% head2 = BLOCK %]=head2[% END -%]
|
||||
[% head3 = BLOCK %]=head3[% END -%]
|
||||
|
||||
=pod
|
||||
[% pod %]
|
||||
|
||||
=head1 NAME
|
||||
[% head1 %] NAME
|
||||
|
||||
[% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %] - SOAP Server Class for the [% service.get_name %] Web Service
|
||||
[% server_name %] - SOAP Server Class for the [% service.get_name %] Web Service
|
||||
|
||||
=head1 SYNOPSIS
|
||||
[% head1 %] SYNOPSIS
|
||||
|
||||
use [% server_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %];
|
||||
my $server = [% server_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %]->new({
|
||||
use [% server_name %];
|
||||
my $server = [% server_name %]->new({
|
||||
dispatch_to => 'My::Handler::Class',
|
||||
transport_class => 'SOAP::WSDL::Server::CGI', # optional, default
|
||||
});
|
||||
$server->handle();
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
[% head1 %] DESCRIPTION
|
||||
|
||||
SOAP Server handler for the [% service.get_name %] web service
|
||||
located at [% port.first_address.get_location %].
|
||||
|
||||
=head1 SERVICE [% service.get_name %]
|
||||
[% head1 %] SERVICE [% service.get_name %]
|
||||
|
||||
[% service.get_documentation %]
|
||||
|
||||
=head2 Port [% port.get_name %]
|
||||
[% head2 %] Port [% port.get_name %]
|
||||
|
||||
[% port.get_documentation %]
|
||||
|
||||
=head1 METHODS
|
||||
[% head1 %] METHODS
|
||||
|
||||
=head2 General methods
|
||||
[% head2 %] General methods
|
||||
|
||||
=head3 new
|
||||
[% head3 %] new
|
||||
|
||||
Constructor.
|
||||
|
||||
The C<dispatch_to> argument is mandatory. It must be a class or object
|
||||
The C<dispatch_to> argument is mandatory. It must be a class or object
|
||||
implementing the SOAP Service methods listed below.
|
||||
|
||||
=head2 SOAP Service methods
|
||||
[% head2 %] SOAP Service methods
|
||||
|
||||
[% INCLUDE Server/POD/method_info.tt %]
|
||||
|
||||
@@ -90,7 +99,7 @@ implementing the SOAP Service methods listed below.
|
||||
%][% INCLUDE Server/POD/Operation.tt %]
|
||||
[% END %]
|
||||
|
||||
=head1 AUTHOR
|
||||
[% head1 %] AUTHOR
|
||||
|
||||
Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %]
|
||||
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
=head3 [% operation.get_name %]
|
||||
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||
[% head3 = BLOCK %]=head3[% END -%]
|
||||
|
||||
[% head3 %] [% operation.get_name %]
|
||||
|
||||
[% type = definitions.find_portType( binding.expand( binding.get_type ) );
|
||||
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
|
||||
@@ -8,8 +11,8 @@ port_op.get_documentation %]
|
||||
my ($self, $body, $header) = @_;
|
||||
# body is a ??? object - sorry, POD not implemented yet
|
||||
# header is a ??? object - sorry, POD not implemented yet
|
||||
|
||||
|
||||
# do something with body and header...
|
||||
|
||||
|
||||
return [% INCLUDE Server/POD/Message.tt %]
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#element;
|
||||
#STOP;
|
||||
-%]
|
||||
[% element_prefix %]::[% element.get_name.replace('\.', '::') %]->new([%
|
||||
[% element_prefix %]::[% element.get_name.replace('\.', '::') %]->new([%
|
||||
type = element.first_complexType || element.first_simpleType || definitions.first_types.find_type(
|
||||
element.expand( element.get_type ) );
|
||||
INCLUDE Interface/POD/Type.tt; %]
|
||||
|
||||
@@ -18,13 +18,18 @@ sub get_typemap {
|
||||
|
||||
__END__
|
||||
|
||||
=pod
|
||||
__END__
|
||||
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||
[% pod = BLOCK %]=pod[% END -%]
|
||||
[% head1 = BLOCK %]=head1[% END -%]
|
||||
|
||||
=head1 NAME
|
||||
[% pod %]
|
||||
|
||||
[% head1 %] NAME
|
||||
|
||||
[% typemap_prefix %]::[% service.get_name.replace('\.','::').replace('-', '_') %]; - typemap for ::[% service.get_name %];
|
||||
|
||||
=head1 DESCRIPTION
|
||||
[% head1 %] DESCRIPTION
|
||||
|
||||
Typemap created by SOAP::WSDL for map-based SOAP message parsers.
|
||||
|
||||
|
||||
@@ -6,20 +6,29 @@ use warnings;
|
||||
# Don't include any perl source here - there may be sub-packages...
|
||||
#-%]
|
||||
|
||||
package [% type_prefix %]::[% complexType.get_name.replace('\.','::').replace('-','_') %]::_ATTR;
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::AttributeSet);
|
||||
[% INCLUDE complexType/attributeSet.tt %]
|
||||
1;
|
||||
|
||||
=pod
|
||||
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||
[% pod = BLOCK %]=pod[% END -%]
|
||||
[% head1 = BLOCK %]=head1[% END -%]
|
||||
[% head2 = BLOCK %]=head2[% END -%]
|
||||
[% head3 = BLOCK %]=head3[% END -%]
|
||||
|
||||
=head1 NAME
|
||||
[% pod %]
|
||||
|
||||
[% head1 %] NAME
|
||||
|
||||
[% type_prefix %]::[% complexType.get_name.replace('\.','::').replace('-','_') %]
|
||||
|
||||
=head1 DESCRIPTION
|
||||
[% head1 %] DESCRIPTION
|
||||
|
||||
Perl data type class for the XML Schema defined complextype
|
||||
[% complexType.get_name %] from the namespace [% complexType.get_targetNamespace %].
|
||||
|
||||
=head2 PROPERTIES
|
||||
[% head2 %] PROPERTIES
|
||||
|
||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||
methods:
|
||||
@@ -28,15 +37,15 @@ methods:
|
||||
[% element.get_name %]
|
||||
[% END %]
|
||||
|
||||
=head1 METHODS
|
||||
[% head1 %] METHODS
|
||||
|
||||
=head2 new
|
||||
[% head2 %] new
|
||||
|
||||
Constructor. The following data structure may be passed to new():
|
||||
|
||||
[% indent = ' '; INCLUDE complexType/POD/structure.tt %]
|
||||
|
||||
=head1 AUTHOR
|
||||
[% head1 %] AUTHOR
|
||||
|
||||
Generated by SOAP::WSDL
|
||||
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
{ # BLOCK to scope variables
|
||||
[%
|
||||
|
||||
FOREACH element = complexType.get_attribute %]
|
||||
my %[% element.get_name %]_of :ATTR(:get<[% element.get_name %]>);
|
||||
[%- END %]
|
||||
|
||||
__PACKAGE__->_factory(
|
||||
[ qw([% FOREACH element = complexType.get_attribute %]
|
||||
[% element.get_name -%]
|
||||
[% END %]
|
||||
) ],
|
||||
{
|
||||
[% FOREACH element = complexType.get_attribute -%]
|
||||
[% element.get_name %] => \%[% element.get_name %]_of,
|
||||
[% END -%]
|
||||
},
|
||||
{
|
||||
[% FOREACH element = complexType.get_attribute;
|
||||
IF (type = element.get_type);
|
||||
element_type = complexType.expand( type );
|
||||
IF (element_type.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
|
||||
[% element.get_name %] => 'SOAP::WSDL::XSD::Typelib::Builtin::[% element_type.1 %]',
|
||||
[% ELSE -%]
|
||||
[% element.get_name %] => '[% type_prefix %]::[% element_type.1 %]',
|
||||
[% END;
|
||||
ELSE;
|
||||
IF (element.first_simpleType);
|
||||
THROW NOT_IMPLEMENTED , "Attributes with atomic simpleType definition are not implemented yet";
|
||||
atomic_types.${ element.get_name } = element.first_simpleType;
|
||||
ELSE;
|
||||
THROW NOT_IMPLEMENTED , "Neither simple nor complex atomic type - don't know what to do with it";
|
||||
END; %]
|
||||
[% element.get_name %] => '[% type_prefix %]::[% complexType.get_name %]::_[% element.get_name %]',
|
||||
[% END;
|
||||
END -%]
|
||||
}
|
||||
);
|
||||
|
||||
} # end BLOCK
|
||||
@@ -9,7 +9,12 @@ ELSIF (complexType.get_variety == 'choice');
|
||||
INCLUDE complexType/all.tt(complexType = complexType);
|
||||
ELSIF (complexType.get_variety);
|
||||
THROW NOT_IMPLEMENTED, "Unknown variety ${ complexType.get_variety } in ${ complexType.get_name } (${ element.get_name })";
|
||||
ELSE;
|
||||
# There's no variety - might be empty complexType
|
||||
END;
|
||||
%]
|
||||
ELSE %]
|
||||
|
||||
# There's no variety - empty complexType
|
||||
use Class::Std::Fast::Storable constructor => 'none';
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
__PACKAGE__->_factory();
|
||||
|
||||
[% END %]
|
||||
@@ -17,45 +17,65 @@ use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
[% INCLUDE _type_class.tt( type = type, node = element ) %]
|
||||
);
|
||||
|
||||
}
|
||||
[%- ELSIF (ref = element.get_ref); -%]
|
||||
# element ref="[% ref %]"
|
||||
use base qw(
|
||||
[% element_prefix %]::[% ref.split(':').1 %]
|
||||
);
|
||||
|
||||
}
|
||||
[%- ELSIF (simpleType = element.first_simpleType) %]
|
||||
# atomic simpleType: <element><simpleType
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
);
|
||||
[% INCLUDE simpleType/contentModel.tt %]
|
||||
[% INCLUDE simpleType/contentModel.tt -%]
|
||||
|
||||
}
|
||||
|
||||
[% ELSIF (complexType = element.first_complexType) %]
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
);
|
||||
[% INCLUDE complexType/contentModel.tt;
|
||||
END %]
|
||||
[% 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 %]
|
||||
|
||||
1;
|
||||
|
||||
# __END__
|
||||
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||
[% pod = BLOCK %]=pod[% END -%]
|
||||
[% head1 = BLOCK %]=head1[% END -%]
|
||||
[% head2 = BLOCK %]=head2[% END -%]
|
||||
[% head3 = BLOCK %]=head3[% END -%]
|
||||
|
||||
=pod
|
||||
[% pod %]
|
||||
|
||||
=head1 NAME
|
||||
[% head1 %] NAME
|
||||
|
||||
[% element_prefix %]::[% element.get_name %]
|
||||
|
||||
=head1 DESCRIPTION
|
||||
[% head1 %] DESCRIPTION
|
||||
|
||||
Perl data type class for the XML Schema defined element
|
||||
[% element.get_name %] from the namespace [% element.get_targetNamespace %].
|
||||
|
||||
=head1 METHODS
|
||||
[% head1 %] METHODS
|
||||
|
||||
=head2 new
|
||||
[% head2 %] new
|
||||
|
||||
my $element = [% element_prefix %]::[% element.get_name %]->new($data);
|
||||
|
||||
@@ -63,7 +83,7 @@ Constructor. The following data structure may be passed to new():
|
||||
|
||||
[% indent = ' '; INCLUDE element/POD/structure.tt; %]
|
||||
|
||||
=head1 AUTHOR
|
||||
[% head1 %] AUTHOR
|
||||
|
||||
Generated by SOAP::WSDL
|
||||
|
||||
|
||||
@@ -11,11 +11,18 @@ sub get_xmlns { '[% simpleType.get_targetNamespace %]'};
|
||||
|
||||
1;
|
||||
|
||||
=pod
|
||||
__END__
|
||||
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
|
||||
[% pod = BLOCK %]=pod[% END -%]
|
||||
[% head1 = BLOCK %]=head1[% END -%]
|
||||
[% head2 = BLOCK %]=head2[% END -%]
|
||||
[% head3 = BLOCK %]=head3[% END -%]
|
||||
|
||||
=head1 [% type_prefix %]::[% simpleType.get_name.replace('\.','::').replace('-','_') %]
|
||||
[% pod %]
|
||||
|
||||
=head1 DESCRIPTION
|
||||
[% head1 %] [% type_prefix %]::[% simpleType.get_name.replace('\.','::').replace('-','_') %]
|
||||
|
||||
[% head1 %] DESCRIPTION
|
||||
|
||||
Perl data type class for the XML Schema defined simpleType
|
||||
[% simpleType.get_name %] from the namespace [% simpleType.get_targetNamespace %].
|
||||
@@ -28,17 +35,17 @@ ELSE;
|
||||
THROW NOT_IMPLEMENTED "simpleType union not implemented yet in $simpleType.get_name";
|
||||
END %]
|
||||
|
||||
=head1 METHODS
|
||||
[% head1 %] METHODS
|
||||
|
||||
=head2 new
|
||||
[% head2 %] new
|
||||
|
||||
Constructor.
|
||||
|
||||
=head2 get_value / set_value
|
||||
[% head2 %] get_value / set_value
|
||||
|
||||
Getter and setter for the simpleType's value.
|
||||
|
||||
=head1 OVERLOADING
|
||||
[% head1 %] OVERLOADING
|
||||
|
||||
Depending on the simple type's base type, the following operations are overloaded
|
||||
|
||||
@@ -48,7 +55,7 @@ Depending on the simple type's base type, the following operations are overloade
|
||||
|
||||
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
|
||||
|
||||
=head1 AUTHOR
|
||||
[% head1 %] AUTHOR
|
||||
|
||||
Generated by SOAP::WSDL
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ SOAP::WSDL::Generator::Visitor - SOAP::WSDL's Visitor-based Code Generator
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SOAP::WSDL featores a code generating facility. This code generation facility
|
||||
SOAP::WSDL features a code generating facility. This code generation facility
|
||||
(in fact there are several of them) is implemented as Visitor to
|
||||
SOAP::WSDL::Base-derived objects.
|
||||
|
||||
@@ -186,8 +186,8 @@ mimicing .NET's .asmx example pages.
|
||||
|
||||
=back
|
||||
|
||||
All these behaviours could well (and has historically been) implemented in the
|
||||
classes holding the WSDL data. This made these classes rather bloated, and
|
||||
All these behaviours could well be (and have historically been) implemented in
|
||||
the classes holding the WSDL data. This made these classes rather bloated, and
|
||||
made it hard to change behaviour (like, supporting SOAP Headers,
|
||||
supporting atomic types and other features which were missing from early
|
||||
versions of SOAP::WSDL).
|
||||
|
||||
@@ -245,7 +245,7 @@ sub visit_XSD_ComplexType {
|
||||
if ( grep { $_ eq $content_model} qw(all sequence choice) )
|
||||
{
|
||||
# visit child elements
|
||||
for (@{ $type->get_element() }) {
|
||||
for (@{ $type->get_element() || [] }) {
|
||||
$_->_accept( $self );
|
||||
}
|
||||
return;
|
||||
|
||||
@@ -111,7 +111,7 @@ included perldoc will be, too - if not, blame the web service author.
|
||||
print $result;
|
||||
|
||||
The above handling of errors ("die $result if not $result") may look a bit
|
||||
strange - it is due to the nature of the
|
||||
strange - it is due to the nature of the
|
||||
L<SOAP::WSDL::SOAP::Typelib::Fault11|SOAP::WSDL::SOAP::Typelib::Fault11>
|
||||
objects SOAP::WSDL uses for signalling failure.
|
||||
|
||||
@@ -232,7 +232,7 @@ L<SOAP::WSDL::Manual::Parser> will tell you how to create a typemap class.
|
||||
|
||||
=head1 Creating a SOAP Server
|
||||
|
||||
Creating a SOAP server works just like creating a client - just add the
|
||||
Creating a SOAP server works just like creating a client - just add the
|
||||
C<--server> or C<-s> option to the call to C<wsdl2perl.pl>.
|
||||
|
||||
perl wsdl2perl.pl -s -b BASE_DIR URL
|
||||
|
||||
@@ -34,11 +34,11 @@ considered as bugs.
|
||||
=item * RULES NOT APPLICABLE
|
||||
|
||||
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
|
||||
some parts the WS-I Basic Profile references.
|
||||
plays the part of one layer in a Web Service CONSUMER / RECEIVER, thus does
|
||||
not implement some parts the WS-I Basic Profile references.
|
||||
|
||||
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
|
||||
|
||||
@@ -84,7 +84,7 @@ SOAP::WSDL::Expat::MessageParser allows the use of XML Declarations.
|
||||
the soap:Body element.
|
||||
|
||||
SOAP::WSDL::Serializer::SOAP11 does not emit children of soap:Envelope following
|
||||
the soap:Body element. Other serializers may behave differentls.
|
||||
the soap:Body element. Other serializers may behave different.
|
||||
|
||||
=head2 R1012
|
||||
|
||||
@@ -302,6 +302,73 @@ SOAP::WSDL::Expat::MessageParser checks the namespace of the SOAP envelope.
|
||||
SOAP::WSDL::Expat::MessageParser does not check that Envelope is the root
|
||||
element, yet.
|
||||
|
||||
=head2 R1110
|
||||
|
||||
An INSTANCE MAY accept connections on TCP port 80 (HTTP)
|
||||
|
||||
SOAP::WSDL::Server::CGI may be used in a web server listening at port 80.
|
||||
|
||||
=head2 R1124
|
||||
|
||||
An INSTANCE MUST use a 2xx HTTP status code for responses that
|
||||
indicate a successful outcome of a request.
|
||||
|
||||
SOAP::WSDL::Server::CGI sends a 2xx HTTP status code for successful requests.
|
||||
|
||||
=head2 R1111
|
||||
|
||||
An INSTANCE SHOULD use a "200 OK" HTTP status code for responses
|
||||
that contain a SOAP message that is not a SOAP fault.
|
||||
|
||||
SOAP::WSDL::Server::CGI does this.
|
||||
|
||||
=head2 R1112
|
||||
|
||||
An INSTANCE SHOULD use either a "200 OK" or "202 Accepted" HTTP
|
||||
status code for a response that does do not contain a SOAP message
|
||||
but indicates successful HTTP outcome of a request.
|
||||
|
||||
SOAP::WSDL::Server::CGI does this.
|
||||
|
||||
=head2 R1130
|
||||
|
||||
An INSTANCE MUST use HTTP status code "307 Temporary Redirect"
|
||||
when redirecting a request to a different endpoint.
|
||||
|
||||
SOAP::WSDL::Server::CGI has no means of redirecting. The web server running
|
||||
a SOAP::WSDL::Server::CGI script is responsible for redirecting with a 307
|
||||
HTTP status code.
|
||||
|
||||
=head2 R1125
|
||||
|
||||
An INSTANCE MUST use a 4xx HTTP status code for responses that indicate
|
||||
a problem with the format of the request.
|
||||
|
||||
SOAP::WSDL does this.
|
||||
|
||||
=head2 R1113
|
||||
|
||||
An INSTANCE SHOULD use a "400 Bad Request "HTTP status code, if the
|
||||
request message is a malformed HTTP request, or not well-formed XML.
|
||||
|
||||
SOAP::WSDL does this.
|
||||
|
||||
=head2 R1114
|
||||
|
||||
An INSTANCE SHOULD use a "405 Method not Allowed" HTTP status code if the
|
||||
request method was not "POST".
|
||||
|
||||
SOAP::WSDL does this.
|
||||
|
||||
=head2 R1115
|
||||
|
||||
An INSTANCE SHOULD use a "415 Unsupported Media Type" HTTP status code if
|
||||
the Content-Type HTTP request header did not have a value consistent with
|
||||
the value specified for the corresponding binding of the input message.
|
||||
|
||||
SOAP::WSDL::Server::CGI does not support any content type other than text/xml
|
||||
and application/xml yet.
|
||||
|
||||
|
||||
=head1 RULES NOT CONFIRMED
|
||||
|
||||
@@ -310,7 +377,7 @@ element, yet.
|
||||
A RECEIVER MUST accept messages that include the Unicode Byte Order Mark
|
||||
(BOM).
|
||||
|
||||
May automatically work with XML::Parser::Expat, but is not testet yet.
|
||||
May automatically work with XML::Parser::Expat, but is not tested yet.
|
||||
|
||||
TODO write test. If not confirmed, add encoding support.
|
||||
|
||||
@@ -339,6 +406,8 @@ TODO add processing of arbitrary attributes to SOAP::WSDL::SOAP::Typelib::Fault1
|
||||
A RECEIVER MUST accept fault messages that carry an xml:lang attribute on
|
||||
the faultstring element.
|
||||
|
||||
SOAP::WSDL::Expat::MessageParser currently ignores all attributes.
|
||||
|
||||
TODO add processing of the xml:lang attribute to SOAP::WSDL::SOAP::Typelib::Fault11
|
||||
|
||||
=head2 R1007
|
||||
@@ -358,9 +427,10 @@ TODO support rpc-literal bindings.
|
||||
In a DESCRIPTION the value of the location attribute of a wsdl:import element
|
||||
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.
|
||||
|
||||
=head2 R4002
|
||||
|
||||
@@ -379,9 +449,7 @@ TODO Test whether UTF-16 works.
|
||||
The wsdl:documentation element MAY occur as a child of the wsdl:import
|
||||
element in a DESCRIPTION.
|
||||
|
||||
SOAP::WSDL's schema parser does not handle import elements yet.
|
||||
|
||||
TODO implement support for wsdl:import in SOAP::WSDL::Expat::WSDLParser.
|
||||
Not tested yet.
|
||||
|
||||
=head2 R2024
|
||||
|
||||
@@ -555,94 +623,37 @@ SOAP::WSDL does not check mandatory header blocks yet.
|
||||
|
||||
SOAP::WSDL does not check mandatory header blocks yet.
|
||||
|
||||
=head2 R1110
|
||||
|
||||
An INSTANCE MAY accept connections on TCP port 80 (HTTP)
|
||||
|
||||
SOAP::WSDL does not act as server yet.
|
||||
|
||||
=head2 R1124
|
||||
|
||||
An INSTANCE MUST use a 2xx HTTP status code for responses that
|
||||
indicate a successful outcome of a request.
|
||||
|
||||
SOAP::WSDL does not act as server yet.
|
||||
|
||||
=head2 R1111
|
||||
|
||||
An INSTANCE SHOULD use a "200 OK" HTTP status code for responses
|
||||
that contain a SOAP message that is not a SOAP fault.
|
||||
|
||||
SOAP::WSDL does not act as server yet.
|
||||
|
||||
=head2 R1112
|
||||
|
||||
An INSTANCE SHOULD use either a "200 OK" or "202 Accepted" HTTP
|
||||
status code for a response that does do not contain a SOAP message
|
||||
but indicates successful HTTP outcome of a request.
|
||||
|
||||
SOAP::WSDL does not act as server yet.
|
||||
|
||||
=head2 R1130
|
||||
|
||||
An INSTANCE MUST use HTTP status code "307 Temporary Redirect"
|
||||
when redirecting a request to a different endpoint.
|
||||
|
||||
SOAP::WSDL does not act as server yet.
|
||||
|
||||
=head2 R1125
|
||||
|
||||
An INSTANCE MUST use a 4xx HTTP status code for responses that indicate
|
||||
a problem with the format of the request.
|
||||
|
||||
SOAP::WSDL does not act as server yet.
|
||||
|
||||
=head2 R1113
|
||||
|
||||
An INSTANCE SHOULD use a "400 Bad Request "HTTP status code, if the
|
||||
request message is a malformed HTTP request, or not well-formed XML.
|
||||
|
||||
SOAP::WSDL does not act as server yet.
|
||||
|
||||
=head2 R1114
|
||||
|
||||
An INSTANCE SHOULD use a "405 Method not Allowed" HTTP status code if the
|
||||
request method was not "POST".
|
||||
|
||||
SOAP::WSDL does not act as server yet.
|
||||
|
||||
=head2 R1115
|
||||
|
||||
An INSTANCE SHOULD use a "415 Unsupported Media Type" HTTP status code if
|
||||
the Content-Type HTTP request header did not have a value consistent with
|
||||
the value specified for the corresponding binding of the input message.
|
||||
|
||||
SOAP::WSDL does not act as server yet.
|
||||
|
||||
=head2 R1120
|
||||
|
||||
An INSTANCE MAY use the HTTP state mechanism ("Cookies").
|
||||
|
||||
SOAP::WSDL does not act as server yet.
|
||||
SOAP::WSDL::Server::CGI does not use cookies. A web server running a
|
||||
SOAP::WSDL::Server::CGI script may use cookies..
|
||||
|
||||
=head2 R1122
|
||||
|
||||
An INSTANCE using Cookies SHOULD conform to RFC2965.
|
||||
|
||||
SOAP::WSDL does not act as server yet.
|
||||
|
||||
SOAP::WSDL::Server::CGI does not use cookies. A web server running a
|
||||
SOAP::WSDL::Server::CGI script may use cookies..
|
||||
|
||||
=head2 R1121
|
||||
|
||||
An INSTANCE SHOULD NOT require consumer support for Cookies in order to
|
||||
function correctly
|
||||
|
||||
SOAP::WSDL does not act as server yet.
|
||||
|
||||
SOAP::WSDL::Server::CGI does not use cookies. A web server running a
|
||||
SOAP::WSDL::Server::CGI script may use cookies.
|
||||
|
||||
=head2 R1123
|
||||
|
||||
The value of the cookie MUST be considered to be opaque by the CONSUMER.
|
||||
|
||||
SOAP::WSDL does not act as server yet.
|
||||
|
||||
SOAP::WSDL::Server::CGI does not use cookies. A web server running a
|
||||
SOAP::WSDL::Server::CGI script may use cookies.
|
||||
|
||||
=head2 R2028
|
||||
|
||||
@@ -669,7 +680,11 @@ is Schema valid.
|
||||
A DESCRIPTION MUST only use the WSDL "import" statement to import another
|
||||
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 (yet).
|
||||
|
||||
It's the responsibility of the WSDL author to use only the wsdl:import
|
||||
statement for importing WSDL descriptions.
|
||||
|
||||
=head2 R2002
|
||||
|
||||
@@ -1237,9 +1252,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 391 $
|
||||
$Rev: 514 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: WS_I.pod 391 2007-11-17 21:56:13Z kutterma $
|
||||
$Id: WS_I.pod 514 2008-01-31 19:57:52Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/WS_I.pod $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -24,12 +24,12 @@ You can use SOAP::WSDL::XSD based classes just like any perl class - you may
|
||||
instantiate it, inherit from it etc.
|
||||
|
||||
You should be aware, that SOAP::WSDL::XSD based classes are inside-out
|
||||
classes using Class::Std, though - things you would expect from hash-based
|
||||
classes like using the blessed hash ref as data storage won't work.
|
||||
classes using Class::Std::Fast, though - things you would expect from
|
||||
hash-based classes like using the blessed hash ref as data storage won't work.
|
||||
|
||||
Moreover, most all SOAP::WSDL::XSD::Typelib based classes override
|
||||
Class::Std's default constructor for speed - you should not expect BUILD or
|
||||
START methods to work, unless you call them yourself (or define a new
|
||||
Class::Std::Fast's default constructor for speed - you should not expect
|
||||
BUILD or START methods to work, unless you call them yourself (or define a new
|
||||
constructor).
|
||||
|
||||
All SOAP::WSDL::XSD based complexType classes allow a hash ref matching their
|
||||
@@ -40,11 +40,15 @@ will work fine.
|
||||
All SOAP::WSDL::XSD based simpleType (and builtin) classes accept a single
|
||||
hash ref with the only key "value" and the value to be set as value.
|
||||
|
||||
=head2 Conversions
|
||||
|
||||
=head3 Array dereference
|
||||
|
||||
All SOAP::WSDL::XSD based classes overload arrayification - that is being
|
||||
accessed as a list ref - with a method returning [ $self ].
|
||||
|
||||
This means that you can safely use the results of get_ELEMENT calls on
|
||||
cmplexTypes as list refs (you'll have to check for definedness, though -
|
||||
complexTypes as list refs (you'll have to check for definedness, though -
|
||||
see L<SOAP::WSDL::XSD::Typelib::Builtin|SOAP::WSDL::XSD::Typelib::Builtin>
|
||||
for details.
|
||||
|
||||
@@ -65,6 +69,32 @@ L<HTML::Template::Compiled|HTML::Template::Compiled>, where you could say
|
||||
<%/LOOP>
|
||||
<%IF%>
|
||||
|
||||
Note that this does not work in HTML::Template::Compiled yet - the code
|
||||
generated for the template checks UNIVERSAL::isa instead of dereferencing.
|
||||
There's a ticket open in HTC to solve the issue.
|
||||
|
||||
=head3 as_hash_ref
|
||||
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType based objects have a method as_hash_ref,
|
||||
which returns the object's content as a hash reference.
|
||||
|
||||
This can be convenient for cloning:
|
||||
|
||||
my $class = ref $old;
|
||||
my $clone = $class->new( $old->as_hash_ref() );
|
||||
|
||||
To convert from one type to another, you
|
||||
can just say
|
||||
|
||||
my $new = MyTypes::NewType->new( $old->as_hash_ref() );
|
||||
|
||||
Of course this will only work if MyTypes::NewType has a superset of the old
|
||||
object class' elements.
|
||||
.
|
||||
|
||||
Future versions will restrict the data returned to the child element's data -
|
||||
you should not expect XML attributes to be returned through hash refs.
|
||||
|
||||
=head1 HOW IT WORKS
|
||||
|
||||
=head2 Base classes
|
||||
@@ -277,8 +307,34 @@ the correspondent classes.
|
||||
|
||||
=head1 ATTRIBUTES
|
||||
|
||||
XML attributes are not implemented yet. If you have a good idea on how to
|
||||
implement them, feel free to email me a proposal.
|
||||
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
|
||||
complexType) is implemented as a sub-package of the element derived from
|
||||
SOAP::WSDL::XSD::Typelib::AttributeSet.
|
||||
|
||||
The sub-package is named as the top package, suffixed with C<_ATTR>.
|
||||
|
||||
All XML attributes for a XML element are set- and retrievable via the method
|
||||
C<attr>. The name is chosen to allow mimicing SOAP::Lite's behaviour, which
|
||||
allows setting a SOAP::Data object's attributes via C<attr>.
|
||||
|
||||
my $attrSet = $obj->attr();
|
||||
$obj->attr({
|
||||
whitespace => 'preserve',
|
||||
nillable => 1,
|
||||
});
|
||||
|
||||
SOAP::WSDL::XSD::Typelib::AttributeSet is derived from
|
||||
SOAP::WSDL::XSD::Typelib::ComplexType with content model C<all>. The
|
||||
individual attributes can be set and retrieved via the respective set_FOO /
|
||||
get_FOO methods.
|
||||
|
||||
The C<attr> method provides auto-vivification: An xml object's attribute set
|
||||
is instantiated when accessed.
|
||||
|
||||
=head1 CAVEATS
|
||||
|
||||
@@ -286,7 +342,7 @@ implement them, feel free to email me a proposal.
|
||||
|
||||
=item * START and BUILD are not being called
|
||||
|
||||
In contrast to "normal" Class::Std based objects, the classes of the
|
||||
In contrast to "normal" Class::Std::Fast based objects, the classes of the
|
||||
SOAP::WSDL::XSD::Typelib:: hierarchy (and all type and element classes
|
||||
generated by SOAP::WSDL) override Class::Std's constructor for performance
|
||||
reasons.
|
||||
@@ -295,10 +351,10 @@ If you inherit from such a class and place a START or BUILD method in it,
|
||||
it will not get called - at least not unless you place something like this
|
||||
at the top of you code:
|
||||
|
||||
use Class::Std::Storable;
|
||||
use Class::Std::Fast::Storable;
|
||||
|
||||
In this case, Class::Std::Storable will export a new() method into your class,
|
||||
which in turn calls START and BUILD.
|
||||
In this case, Class::Std::Fast::Storable will export a new() method into your
|
||||
class, which in turn calls START and BUILD.
|
||||
|
||||
The constructors of all SOAP::WSDL::XSD::Typelib:: classes don't !
|
||||
|
||||
|
||||
@@ -4,7 +4,8 @@ use strict;
|
||||
use warnings;
|
||||
use Class::Std::Fast::Storable;
|
||||
use Scalar::Util qw(blessed);
|
||||
our $VERSION=q{2.00_25};
|
||||
our $VERSION=q{2.00_27};
|
||||
use SOAP::WSDL::Factory::Serializer;
|
||||
|
||||
my $SOAP_NS = 'http://schemas.xmlsoap.org/soap/envelope/';
|
||||
my $XML_INSTANCE_NS = 'http://www.w3.org/2001/XMLSchema-instance';
|
||||
@@ -62,10 +63,10 @@ sub serialize_body {
|
||||
return join ( q{},
|
||||
"<$opt->{ namespace }->{ $SOAP_NS }\:Body>",
|
||||
defined $data
|
||||
? ref $data eq 'ARRAY'
|
||||
? ref $data eq 'ARRAY'
|
||||
? join q{}, map { blessed $_ ? $_->serialize_qualified() : () } @{ $data }
|
||||
: blessed $data
|
||||
? $data->serialize_qualified
|
||||
: blessed $data
|
||||
? $data->serialize_qualified()
|
||||
: ()
|
||||
: (),
|
||||
"</$opt->{ namespace }->{ $SOAP_NS }\:Body>",
|
||||
@@ -119,9 +120,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 444 $
|
||||
$Rev: 510 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: XSD.pm 444 2007-12-07 20:04:06Z 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 $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -6,7 +6,7 @@ use Scalar::Util qw(blessed);
|
||||
use SOAP::WSDL::Factory::Deserializer;
|
||||
use SOAP::WSDL::Factory::Serializer;
|
||||
|
||||
our $VERSION = q{2.00_25};
|
||||
our $VERSION = q{2.00_27};
|
||||
|
||||
my %dispatch_to_of :ATTR(:name<dispatch_to> :default<()>);
|
||||
my %action_map_ref_of :ATTR(:name<action_map_ref> :default<{}>);
|
||||
@@ -28,7 +28,7 @@ sub handle {
|
||||
soap_version => '1.1'
|
||||
});
|
||||
|
||||
# TODO: factor out dispatcher logic into dispatcher factory + dispatcher
|
||||
# TODO: factor out dispatcher logic into dispatcher factory + dispatcher
|
||||
# classes
|
||||
# $dispatcher_of{ $ident } ||= SOAP::WSDL::Factory::Dispatcher->get_dispatcher({});
|
||||
|
||||
@@ -143,12 +143,12 @@ SOAP::WSDL::Server basically follows the architecture sketched below
|
||||
| Handler |
|
||||
-------------------------------------
|
||||
|
||||
All of the components (Transport class, deserializer, dispatcher and
|
||||
All of the components (Transport class, deserializer, dispatcher and
|
||||
serializer) are implemented as plugins.
|
||||
|
||||
The architecture is not implemented as planned yet, but the dispatcher is
|
||||
The architecture is not implemented as planned yet, but the dispatcher is
|
||||
currently part of SOAP::WSDL::Server, which aggregates serializer and
|
||||
deserializer, and is subclassed by transport classes (of which
|
||||
deserializer, and is subclassed by transport classes (of which
|
||||
SOAP::WSDL::Server::CGI is the only implemented one yet).
|
||||
|
||||
The dispatcher is currently based on the SOAPAction header. This does not
|
||||
|
||||
@@ -12,13 +12,13 @@ use Class::Std::Fast::Storable;
|
||||
|
||||
use base qw(SOAP::WSDL::Server);
|
||||
|
||||
our $VERSION=q{2.00_26};
|
||||
our $VERSION=q{2.00_27};
|
||||
|
||||
# mostly copied from SOAP::Lite. Unfortunately we can't use SOAP::Lite's CGI
|
||||
# server directly - we would have to swap out it's base class...
|
||||
#
|
||||
# This should be a warning for us: We should not handle methods via inheritance,
|
||||
# but via some plugin mechanism, to allow alternative handlers to be plugge
|
||||
# but via some plugin mechanism, to allow alternative handlers to be plugged
|
||||
# in.
|
||||
|
||||
sub handle {
|
||||
@@ -26,7 +26,7 @@ sub handle {
|
||||
my $response;
|
||||
my $length = $ENV{'CONTENT_LENGTH'} || 0;
|
||||
|
||||
if (!$length) {
|
||||
if (!$length) {
|
||||
$response = HTTP::Response->new(411); # LENGTH REQUIRED
|
||||
$self->_output($response);
|
||||
return;
|
||||
@@ -37,7 +37,7 @@ sub handle {
|
||||
}
|
||||
|
||||
my $content = q{};
|
||||
my $buffer;
|
||||
my $buffer;
|
||||
binmode(STDIN);
|
||||
while (read(STDIN,$buffer,$length - length($content))) {
|
||||
$content .= $buffer;
|
||||
@@ -47,10 +47,10 @@ sub handle {
|
||||
$ENV{'REQUEST_METHOD'} || '' => $ENV{'SCRIPT_NAME'},
|
||||
HTTP::Headers->new(
|
||||
map {
|
||||
(/^HTTP_(.+)/i
|
||||
? ($1=~m/SOAPACTION/)
|
||||
(/^HTTP_(.+)/i
|
||||
? ($1=~m/SOAPACTION/)
|
||||
?('SOAPAction')
|
||||
:($1)
|
||||
:($1)
|
||||
: $_
|
||||
) => $ENV{$_}
|
||||
} keys %ENV),
|
||||
@@ -93,15 +93,14 @@ sub _output :PRIVATE {
|
||||
my ($self, $response) = @_;
|
||||
# imitate nph- cgi for IIS (pointed by Murray Nesbitt)
|
||||
my $status = defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/
|
||||
? $ENV{SERVER_PROTOCOL} || 'HTTP/1.0'
|
||||
? $ENV{SERVER_PROTOCOL} || 'HTTP/1.0'
|
||||
: 'Status:';
|
||||
|
||||
my $code = $response->code;
|
||||
binmode(STDOUT);
|
||||
binmode(STDOUT);
|
||||
print STDOUT "$status $code ", HTTP::Status::status_message($code)
|
||||
, "\015\012", $response->headers_as_string("\015\012")
|
||||
, "\015\012", $response->content;
|
||||
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
@@ -2,9 +2,15 @@ package SOAP::WSDL::TypeLookup;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
our $VERSION=q{2.00_31};
|
||||
|
||||
my %TYPES = (
|
||||
# wsdl:
|
||||
'http://schemas.xmlsoap.org/wsdl/' => {
|
||||
'import' => {
|
||||
type => 'HANDLER',
|
||||
method => 'wsdl_import',
|
||||
},
|
||||
binding => {
|
||||
type => 'CLASS',
|
||||
class => 'SOAP::WSDL::Binding',
|
||||
@@ -81,12 +87,17 @@ my %TYPES = (
|
||||
}
|
||||
},
|
||||
'http://www.w3.org/2001/XMLSchema' => {
|
||||
'import' => {
|
||||
type => 'HANDLER',
|
||||
method => 'xml_schema_import',
|
||||
},
|
||||
schema => {
|
||||
type => 'CLASS',
|
||||
class => 'SOAP::WSDL::XSD::Schema',
|
||||
},
|
||||
attribute => {
|
||||
type => 'SKIP' # not implemented yet
|
||||
type => 'CLASS',
|
||||
class => 'SOAP::WSDL::XSD::Attribute' # not implemented yet
|
||||
},
|
||||
attributeGroup => {
|
||||
type => 'SKIP', # not implemented yet
|
||||
|
||||
34
lib/SOAP/WSDL/XSD/Attribute.pm
Normal file
34
lib/SOAP/WSDL/XSD/Attribute.pm
Normal file
@@ -0,0 +1,34 @@
|
||||
package SOAP::WSDL::XSD::Attribute;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Class::Std::Fast::Storable constructor => 'none';
|
||||
use base qw(SOAP::WSDL::Base);
|
||||
|
||||
our $VERSION=q{2.00_29};
|
||||
|
||||
#<attribute
|
||||
# default = string
|
||||
# fixed = string
|
||||
# form = (qualified | unqualified)
|
||||
# id = ID
|
||||
# name = NCName
|
||||
# ref = QName
|
||||
# type = QName
|
||||
# use = (optional | prohibited | required) : optional
|
||||
# {any attributes with non-schema namespace . . .}>
|
||||
# Content: (annotation?, (simpleType?))
|
||||
#</attribute>
|
||||
|
||||
|
||||
my %default_of :ATTR(:name<default> :default<()>);
|
||||
my %fixed_of :ATTR(:name<fixed> :default<()>);
|
||||
my %form_of :ATTR(:name<form> :default<()>);
|
||||
# id provided by Base
|
||||
# name provided by Base
|
||||
my %type_of :ATTR(:name<type> :default<()>);
|
||||
my %use_of :ATTR(:name<use> :default<()>);
|
||||
|
||||
# may be defined as atomic simpleType
|
||||
my %simpleType_of :ATTR(:name<simpleType> :default<()>);
|
||||
|
||||
1;
|
||||
@@ -18,7 +18,7 @@ sub serialize {
|
||||
my $prefix = $prefix_of{ $ns }
|
||||
|| die 'No prefix found for namespace '. $ns;
|
||||
$xml .= ' type="' . $prefix . ':'
|
||||
. $self->get_name() . '"' if ($self->get_name() );
|
||||
. $self->get_name() . '"';
|
||||
}
|
||||
|
||||
if (defined $value) {
|
||||
|
||||
@@ -6,9 +6,10 @@ use Class::Std::Fast::Storable;
|
||||
use Scalar::Util qw(blessed);
|
||||
use base qw/SOAP::WSDL::Base/;
|
||||
|
||||
our $VERSION=q{2.00_25};
|
||||
our $VERSION=q{2.00_29};
|
||||
|
||||
my %annotation_of :ATTR(:name<annotation> :default<()>);
|
||||
my %attribute_of :ATTR(:name<attribute> :default<()>);
|
||||
my %element_of :ATTR(:name<element> :default<()>);
|
||||
my %flavor_of :ATTR(:name<flavor> :default<()>);
|
||||
my %base_of :ATTR(:name<base> :default<()>);
|
||||
|
||||
@@ -53,7 +53,7 @@ sub serialize {
|
||||
# TODO: implement final and substitutionGroup - maybe never implement
|
||||
# substitutionGroup ?
|
||||
|
||||
$name ||= $self->get_name();
|
||||
$name = $self->get_name() if not ($name);
|
||||
|
||||
if ( $opt->{ qualify } ) {
|
||||
$opt->{ attributes } = [ ' xmlns="' . $self->get_targetNamespace .'"' ];
|
||||
|
||||
19
lib/SOAP/WSDL/XSD/Typelib/Attribute.pm
Normal file
19
lib/SOAP/WSDL/XSD/Typelib/Attribute.pm
Normal file
@@ -0,0 +1,19 @@
|
||||
package SOAP::WSDL::XSD::Typelib::Attribute;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::Element);
|
||||
|
||||
our $VERSION=q{2.00_29};
|
||||
|
||||
sub start_tag {
|
||||
# my ($self, $opt, $value) = @_;
|
||||
return q{} if (@_ < 3);
|
||||
return qq{ $_[1]->{ name }="}
|
||||
}
|
||||
|
||||
sub end_tag {
|
||||
return q{"};
|
||||
}
|
||||
|
||||
1;
|
||||
16
lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm
Normal file
16
lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm
Normal file
@@ -0,0 +1,16 @@
|
||||
package SOAP::WSDL::XSD::Typelib::AttributeSet;
|
||||
use strict;
|
||||
use warnings;
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
our $VERSION=q{2.00_29};
|
||||
|
||||
sub serialize {
|
||||
# we work on @_ for performance.
|
||||
$_[1] ||= {}; # $option_ref
|
||||
|
||||
return ${ $_[0]->_serialize({ attr => 1 }) };
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
@@ -409,11 +409,11 @@ Replace whitespace by @ in e-mail address.
|
||||
|
||||
Martin Kutter E<gt>martin.kutter fen-net.deE<lt>
|
||||
|
||||
=head1 Licenxe
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright 2004-2007 Martin Kutter.
|
||||
|
||||
This library is free software, you may distribute/modify it under the
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under the
|
||||
same terms as perl itself
|
||||
|
||||
=cut
|
||||
|
||||
@@ -3,14 +3,17 @@ use strict;
|
||||
use warnings;
|
||||
use Class::Std::Fast::Storable constructor => 'none';
|
||||
|
||||
our $VERSION = q{2.00_29};
|
||||
|
||||
sub get_xmlns { 'http://www.w3.org/2001/XMLSchema' };
|
||||
|
||||
# use $_[1] for performance
|
||||
sub start_tag {
|
||||
return q{} if not $#_; # return if no second argument ($opt)
|
||||
if ($_[1]->{ name }) {
|
||||
return "<$_[1]->{name} />" if $_[1]->{ empty };
|
||||
return "<$_[1]->{name} >";
|
||||
return qq{ $_[1]->{name}="} if $_[1]->{ attr };
|
||||
return "<$_[1]->{name}/>" if $_[1]->{ empty };
|
||||
return "<$_[1]->{name}>";
|
||||
}
|
||||
return q{};
|
||||
}
|
||||
@@ -18,10 +21,14 @@ sub start_tag {
|
||||
# use $_[1] for performance
|
||||
sub end_tag {
|
||||
return $_[1] && defined $_[1]->{ name }
|
||||
? "</$_[1]->{name} >"
|
||||
? $_[1]->{ attr }
|
||||
? q{"}
|
||||
: "</$_[1]->{name}>"
|
||||
: q{};
|
||||
};
|
||||
|
||||
sub serialize_attr {};
|
||||
|
||||
sub serialize { q{} };
|
||||
|
||||
sub serialize_qualified :STRINGIFY {
|
||||
|
||||
@@ -3,6 +3,7 @@ use strict;
|
||||
use warnings;
|
||||
use Date::Parse;
|
||||
use Date::Format;
|
||||
use Time::Zone;
|
||||
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
|
||||
|
||||
@@ -16,13 +17,17 @@ sub set_value {
|
||||
[\+\-] \d{2} \: \d{2} $
|
||||
}xms
|
||||
);
|
||||
|
||||
no warnings qw(uninitialized);
|
||||
# strptime sets empty values to undef - and strftime doesn't like that...
|
||||
my @time_from = map { ! defined $_ ? 0 : $_ } strptime($_[1]);
|
||||
|
||||
undef $time_from[$#time_from];
|
||||
|
||||
my $time_str = strftime( '%Y-%m-%dT%H:%M:%S%z', @time_from );
|
||||
my $time_str = do { # no warnings;
|
||||
strftime( '%Y-%m-%dT%H:%M:%S%z', @time_from );
|
||||
};
|
||||
|
||||
# insert : in timezone info
|
||||
substr $time_str, -2, 0, ':';
|
||||
$_[0]->SUPER::set_value($time_str);
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ require Class::Std::Fast::Storable;
|
||||
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anyType);
|
||||
|
||||
our $VERSION = '2.00_25';
|
||||
our $VERSION = '2.00_31';
|
||||
|
||||
my %ELEMENTS_FROM;
|
||||
my %ATTRIBUTES_OF;
|
||||
@@ -39,6 +39,30 @@ sub AUTOMETHOD {
|
||||
. "\n"
|
||||
}
|
||||
|
||||
# Attribute handling
|
||||
my %xml_attr_of :ATTR();
|
||||
|
||||
sub attr {
|
||||
my $self = shift;
|
||||
my $class = ref $self;
|
||||
|
||||
# disable strictness - in perl 5.10 %{ "$foo\::_bar" } triggers a
|
||||
# symbolic reference error with strictness enabled
|
||||
no strict qw(refs);
|
||||
die "$class has no attributes" if not defined %{ "$class\::_ATTR::"};
|
||||
if (@_) {
|
||||
# setter
|
||||
return $xml_attr_of{ $$self } = "$class\::_ATTR"->new(@_);
|
||||
}
|
||||
return $xml_attr_of{ $$self } if exists $xml_attr_of{ $$self };
|
||||
return $xml_attr_of{ $$self } = "$class\::_ATTR"->new();
|
||||
}
|
||||
|
||||
sub serialize_attr {
|
||||
return q{} if not $xml_attr_of{ ${ $_[0] } };
|
||||
$_[0]->attr()->serialize();
|
||||
}
|
||||
|
||||
sub as_hash_ref {
|
||||
my $self = shift;
|
||||
my $attributes_ref = $ATTRIBUTES_OF{ ref $self };
|
||||
@@ -128,6 +152,10 @@ sub _factory {
|
||||
# lists but don't do yet - oh my !
|
||||
|
||||
*{ "$class\::set_$name" } = sub {
|
||||
if (not $#_) {
|
||||
delete $attribute_ref->{ ${ $_[0] } };
|
||||
return;
|
||||
};
|
||||
my $is_ref = ref $_[1];
|
||||
$attribute_ref->{ ${ $_[0] } } = ($is_ref)
|
||||
? ($is_ref eq 'ARRAY')
|
||||
@@ -152,7 +180,7 @@ sub _factory {
|
||||
: die croak "cannot use $is_ref reference as value for $name - $type required"
|
||||
|
||||
# not $is_ref
|
||||
: $type->new({ value => $_[1] });
|
||||
: defined $_[1] ? $type->new({ value => $_[1] }) : () ;
|
||||
return;
|
||||
};
|
||||
|
||||
@@ -177,10 +205,6 @@ sub _factory {
|
||||
push @{ $attribute_ref->{ ${ $_[0]} } }, $_[1];
|
||||
return;
|
||||
};
|
||||
|
||||
# TODO: remove this alias - we don't use it, and it's pretty much
|
||||
# misleading...
|
||||
*{ "$class\::$name" } = *{ "$class\::add_$name" };
|
||||
}
|
||||
|
||||
# TODO Could be moved as normal method into base class, e.g. here.
|
||||
@@ -202,8 +226,8 @@ sub _factory {
|
||||
}
|
||||
: $_ =~ m{ \A # beginning of string
|
||||
xmlns # xmlns
|
||||
}xms
|
||||
? do {}
|
||||
}xms # get_elements is inlined for performance.
|
||||
? ()
|
||||
: do { use Data::Dumper;
|
||||
croak "unknown field $_ in $class. Valid fields are:\n"
|
||||
. join(', ', @{ $ELEMENTS_FROM{ $class } }) . "\n"
|
||||
@@ -212,23 +236,25 @@ sub _factory {
|
||||
return $self;
|
||||
};
|
||||
|
||||
|
||||
# this serialize method works fine for <all> and <sequence>
|
||||
# this _serialize method works fine for <all> and <sequence>
|
||||
# complextypes, as well as for <restriction><all> or
|
||||
# <restriction><sequence>.
|
||||
# <restriction><sequence>, and attribute sets.
|
||||
#
|
||||
# But what about choice, extension ?
|
||||
#
|
||||
# Triggers XML attribute serialization if the options hash ref contains
|
||||
# a attr element with a true value.
|
||||
*{ "$class\::_serialize" } = sub {
|
||||
my $ident = ${ $_[0]};
|
||||
my $option_ref = $_[1];
|
||||
# return concatenated return value of serialize call of all
|
||||
# elements retrieved from get_elements expanding list refs.
|
||||
# get_elements is inlined for performance.
|
||||
return join q{} , map {
|
||||
return \join q{} , map {
|
||||
my $element = $ATTRIBUTES_OF{ $class }->{ $_ }->{ $ident };
|
||||
|
||||
# do we have some content
|
||||
if (defined $element) {
|
||||
$element = [ $element ]
|
||||
if not ref $element eq 'ARRAY';
|
||||
$element = [ $element ] if not ref $element eq 'ARRAY';
|
||||
my $name = $_;
|
||||
|
||||
map {
|
||||
@@ -240,9 +266,9 @@ sub _factory {
|
||||
# serialize complextype elments (of other types) with their
|
||||
# serializer, but add element tags around.
|
||||
else {
|
||||
join q{}, $_->start_tag({ name => $name })
|
||||
join q{}, $_->start_tag({ name => $name , %{ $option_ref } })
|
||||
, $_->serialize()
|
||||
, $_->end_tag({ name => $name });
|
||||
, $_->end_tag({ name => $name , %{ $option_ref } });
|
||||
}
|
||||
} @{ $element }
|
||||
}
|
||||
@@ -251,17 +277,20 @@ sub _factory {
|
||||
}
|
||||
} (@{ $ELEMENTS_FROM{ $class } });
|
||||
};
|
||||
}
|
||||
|
||||
*{ "$class\::serialize" } = sub {
|
||||
$_[1] ||= {}; # maybe even replace by assigning a constant var
|
||||
sub serialize {
|
||||
# we work on @_ for performance.
|
||||
$_[1] ||= {}; # $option_ref
|
||||
|
||||
# do we have a empty element ?
|
||||
return $_[0]->start_tag({ %{ $_[1] }, empty => 1 })
|
||||
if not defined $ELEMENTS_FROM{ $class } or not @{ $ELEMENTS_FROM{ $class } };
|
||||
return join q{}, $_[0]->start_tag($_[1]),
|
||||
$_[0]->_serialize(), $_[0]->end_tag();
|
||||
}
|
||||
# get content first (pass by reference to avoid copying)
|
||||
my $content_ref = $_[0]->_serialize($_[1]); # option_ref
|
||||
|
||||
# do we have a empty element ?
|
||||
return $_[0]->start_tag({ %{ $_[1] }, empty => 1 })
|
||||
if not length ${ $content_ref };
|
||||
|
||||
return join q{}, $_[0]->start_tag($_[1]), ${ $content_ref }, $_[0]->end_tag();
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -281,24 +310,24 @@ To subclass, write a package like this:
|
||||
package MyComplexType;
|
||||
use Class::Std::Fast::Storable constructor => 'none';
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
|
||||
# we only need the :get attribute qualifier.
|
||||
# set and init_arg are automatically created by
|
||||
# SOAP::WSDL::XSD::Typelib::ComplexType
|
||||
my %first_attr_of :ATTR(:get<first_attr> :default<()>);
|
||||
my %second_attr_of :ATTR(:get<second_attr> :default<()>);
|
||||
my %third_attr_of :ATTR(:get<third_attr> :default<()>);
|
||||
|
||||
|
||||
# the order of elements in a complexType
|
||||
my @elements_from = qw(first_attr second_attr third_attr);
|
||||
|
||||
|
||||
# references to the private hashes
|
||||
my %attribute_of = (
|
||||
first_attr => \%first_attr_of,
|
||||
second_attr => \%second_attr_of,
|
||||
third_attr => \%third_attr_of,
|
||||
);
|
||||
|
||||
|
||||
# classes_of: Classes the child elements should be of
|
||||
my %classes_of = (
|
||||
first_attr => 'My::FirstElement',
|
||||
@@ -339,14 +368,14 @@ complain, too.
|
||||
Examples:
|
||||
|
||||
my $obj = MyClass->new({ MyName => $value });
|
||||
|
||||
|
||||
my $obj = MyClass->new({
|
||||
MyName => {
|
||||
DeepName => $value,
|
||||
},
|
||||
MySecondName => $value,
|
||||
});
|
||||
|
||||
|
||||
my $obj = MyClass->new({
|
||||
MyName => [
|
||||
{ DeepName => $value },
|
||||
@@ -380,6 +409,13 @@ This means you may set element properties by passing
|
||||
|
||||
Examples are similar to the examples provided for new() above.
|
||||
|
||||
Note that you cannot delete a property by setting it to undef - this sets
|
||||
the property to a empty property object (with vaue undef).
|
||||
|
||||
To delete a property, say
|
||||
|
||||
$obj->set_FOO();
|
||||
|
||||
=head2 as_hash_ref
|
||||
|
||||
Returns a hash ref representation of the complexType object
|
||||
@@ -412,10 +448,10 @@ No facets are implemented yet.
|
||||
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright (c) 2007 Martin Kutter. All rights reserved.
|
||||
Copyright 2007 Martin Kutter.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||
the same terms as perl itself.
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under the same
|
||||
terms as perl itself
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
@@ -423,9 +459,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 452 $
|
||||
$Rev: 524 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: ComplexType.pm 452 2007-12-12 14:46:54Z kutterma $
|
||||
$Id: ComplexType.pm 524 2008-02-10 23:24:43Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm $
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
#!/usr/bin/perl
|
||||
package SOAP::WSDL::XSD::Typelib::Element;
|
||||
use Class::Std::Fast::Storable constructor => 'none';
|
||||
use strict;
|
||||
|
||||
our $VERSION=q{2.00_25};
|
||||
our $VERSION=q{2.00_29};
|
||||
|
||||
my %NAME;
|
||||
my %NILLABLE;
|
||||
@@ -37,6 +38,7 @@ BLOCK: {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
# use $_[0] and $_[1] for speed.
|
||||
|
||||
sub start_tag {
|
||||
@@ -46,17 +48,18 @@ sub start_tag {
|
||||
|
||||
if ($_[1]->{ nil }) {
|
||||
return q{} if not $NILLABLE{ ref $_[0] };
|
||||
push @attr_from, 'xsi:nil="true"';
|
||||
push @attr_from, q{ xsi:nil="true"};
|
||||
$ending = '/>';
|
||||
}
|
||||
if ($_[1]->{qualified}) {
|
||||
push @attr_from, 'xmlns="' . $_[0]->get_xmlns . '"';
|
||||
push @attr_from, q{ xmlns="} . $_[0]->get_xmlns() . q{"};
|
||||
}
|
||||
push @attr_from, $_[0]->serialize_attr();
|
||||
|
||||
# do we need to check for name ? Element ref="" should have it's own
|
||||
# start_tag. If we don't need to check, we can speed things up
|
||||
return join q{ }, "<$_[1]->{ name }" , @attr_from , $ending if $_[1]->{ name };
|
||||
return join q{ }, "<$NAME{ ref $_[0]}" , @attr_from , $ending;
|
||||
return join q{}, "<$_[1]->{ name }" , @attr_from , $ending if $_[1]->{ name };
|
||||
return join q{}, "<$NAME{ ref $_[0]}" , @attr_from , $ending;
|
||||
}
|
||||
|
||||
# use $_[0] and $_[1] for speed.
|
||||
@@ -159,4 +162,24 @@ namespace combination (Default for SOAP::WSDL::Envelope).
|
||||
|
||||
=back
|
||||
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright 2004-2007 Martin Kutter.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under the same
|
||||
terms as perl itself
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
$Rev: 498 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: Element.pm 498 2008-01-20 22:47:18Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Typelib/Element.pm $
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
|
||||
@@ -116,15 +116,23 @@ No facets are implemented yet.
|
||||
|
||||
=back
|
||||
|
||||
=head1 LICENSE AND COPYRIGHT
|
||||
|
||||
Copyright 2004-2007 Martin Kutter.
|
||||
|
||||
This file is part of SOAP-WSDL. You may distribute/modify it under the same
|
||||
terms as perl itself
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Replace whitespace by @ in e-mail address.
|
||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||
|
||||
Martin Kutter E<gt>martin.kutter fen-net.deE<lt>
|
||||
=head1 REPOSITORY INFORMATION
|
||||
|
||||
=head1 COPYING
|
||||
|
||||
This library is free software, you may distribute/modify it under the
|
||||
same terms as perl itself
|
||||
$Rev: 477 $
|
||||
$LastChangedBy: kutterma $
|
||||
$Id: SimpleType.pm 477 2007-12-24 10:23:52Z kutterma $
|
||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm $
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
@@ -4,23 +4,26 @@ use warnings;
|
||||
use diagnostics;
|
||||
use Test::More tests => 17; # qw/no_plan/; # TODO: change to tests => N;
|
||||
use lib '../lib';
|
||||
|
||||
use File::Spec;
|
||||
use File::Basename qw(dirname);
|
||||
eval {
|
||||
require Test::XML;
|
||||
import Test::XML
|
||||
};
|
||||
|
||||
use Cwd;
|
||||
|
||||
my $path = cwd;
|
||||
$path =~s|\/t\/?$||; # allow running from t/ and above (Build test)
|
||||
my $path = File::Spec->rel2abs( dirname __FILE__ );
|
||||
my ($volume, $dir) = File::Spec->splitpath($path, 1);
|
||||
my @dir_from = File::Spec->splitdir($dir);
|
||||
unshift @dir_from, $volume if $volume;
|
||||
my $url = join '/', @dir_from;
|
||||
|
||||
use_ok(qw/SOAP::WSDL/);
|
||||
|
||||
my $soap = SOAP::WSDL->new(
|
||||
wsdl => 'file:///' . $path .'/t/acceptance/wsdl/006_sax_client.wsdl',
|
||||
outputxml => 1, # required, if not set ::SOM serializer will be loaded on
|
||||
# call
|
||||
my $soap;
|
||||
$soap = SOAP::WSDL->new(
|
||||
wsdl => 'file:///' . $url .'/acceptance/wsdl/006_sax_client.wsdl',
|
||||
outputxml => 1, # required, if not set ::SOM serializer will be loaded
|
||||
)->wsdlinit();
|
||||
|
||||
$soap->servicename('MessageGateway');
|
||||
@@ -96,7 +99,7 @@ SKIP: {
|
||||
'MMessageContent' => 'TestContent for Message' ,
|
||||
}
|
||||
}
|
||||
);
|
||||
);
|
||||
ok $result->isa('SOAP::SOM');
|
||||
is $result->result()->{MMessageContent}, 'TestContent for Message';
|
||||
is $result->result()->{MRecipientURI}, 'mailto:test@example.com';
|
||||
|
||||
@@ -12,7 +12,7 @@ use_ok qw( MyElement );
|
||||
my $obj = MyElement->new({ value => 'test'});
|
||||
ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType')
|
||||
, 'inherited class';
|
||||
is $obj->serialize_qualified(), '<MyElementName xmlns="urn:Test" >test</MyElementName>', 'stringification';
|
||||
is $obj->serialize_qualified(), '<MyElementName xmlns="urn:Test">test</MyElementName>', 'stringification';
|
||||
|
||||
$obj = MyAtomicComplexTypeElement->new({ test=> 'Test', test2 => 'Test2'});
|
||||
ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
|
||||
@@ -21,8 +21,8 @@ ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
|
||||
ok $obj->get_test->isa('SOAP::WSDL::XSD::Typelib::Builtin::string')
|
||||
, 'element isa';
|
||||
|
||||
is $obj->serialize_qualified, '<MyAtomicComplexTypeElement xmlns="urn:Test" ><test >Test</test>'
|
||||
. '<test2 >Test2</test2></MyAtomicComplexTypeElement>'
|
||||
is $obj->serialize_qualified, '<MyAtomicComplexTypeElement xmlns="urn:Test"><test>Test</test>'
|
||||
. '<test2>Test2</test2></MyAtomicComplexTypeElement>'
|
||||
, 'stringification';
|
||||
|
||||
$obj = MyElement->new({ value => undef});
|
||||
@@ -34,14 +34,14 @@ ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType')
|
||||
$obj = MyAtomicComplexTypeElement->new({ test=> 'Test', test2 => [ 'Test2', 'Test3' ]});
|
||||
ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
|
||||
, 'inherited class';
|
||||
is $obj, '<MyAtomicComplexTypeElement xmlns="urn:Test" ><test >Test</test>'
|
||||
. '<test2 >Test2</test2>'
|
||||
. '<test2 >Test3</test2>'
|
||||
is $obj, '<MyAtomicComplexTypeElement xmlns="urn:Test"><test>Test</test>'
|
||||
. '<test2>Test2</test2>'
|
||||
. '<test2>Test3</test2>'
|
||||
. '</MyAtomicComplexTypeElement>'
|
||||
, 'multi value stringification';
|
||||
|
||||
ok $obj = MyComplexTypeElement->new({ MyTestName => 'test' });
|
||||
is $obj->serialize_qualified(), '<MyComplexTypeElement xmlns="urn:Test" ><MyTestName >test</MyTestName ></MyComplexTypeElement>';
|
||||
is $obj->serialize_qualified(), '<MyComplexTypeElement xmlns="urn:Test"><MyTestName>test</MyTestName></MyComplexTypeElement>';
|
||||
|
||||
__END__
|
||||
|
||||
|
||||
@@ -12,12 +12,12 @@ use_ok qw( MyComplexType );
|
||||
my $obj = MyComplexType->new({ MyTestName => 'test' });
|
||||
ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
|
||||
, 'inherited class';
|
||||
is $obj, '<MyTestName >test</MyTestName >', 'stringification';
|
||||
is $obj, '<MyTestName>test</MyTestName>', 'stringification';
|
||||
|
||||
$obj = MyComplexType->new({ MyTestName => [ 'test', 'test2' ] });
|
||||
ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
|
||||
, 'inherited class';
|
||||
is $obj, '<MyTestName >test</MyTestName ><MyTestName >test2</MyTestName >',
|
||||
is $obj, '<MyTestName>test</MyTestName><MyTestName>test2</MyTestName>',
|
||||
'stringification';
|
||||
|
||||
# try on the fly factory
|
||||
@@ -36,7 +36,7 @@ is $obj, '<MyTestName >test</MyTestName ><MyTestName >test2</MyTestName >',
|
||||
$obj = MyComplexType2->new({ MyTestName => [ 'test', 'test2' ] });
|
||||
ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
|
||||
, 'inherited class (on the fly-factory object)';
|
||||
is $obj, '<MyTestName >test</MyTestName><MyTestName >test2</MyTestName>',
|
||||
is $obj, '<MyTestName>test</MyTestName><MyTestName>test2</MyTestName>',
|
||||
'stringification (on the fly-factory object)';
|
||||
|
||||
# TODO factor out into complexType test
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/perl
|
||||
use Test::More tests => 9;
|
||||
use Test::More tests => 10;
|
||||
use strict;
|
||||
use lib 'lib/';
|
||||
use lib '../lib/';
|
||||
@@ -20,8 +20,8 @@ ok $obj->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType')
|
||||
ok $obj->get_test->isa('SOAP::WSDL::XSD::Typelib::Builtin::string')
|
||||
, 'element isa';
|
||||
|
||||
is $obj, '<MyAtomicComplexTypeElement xmlns="urn:Test" ><test >Test</test>'
|
||||
. '<test2 >Test2</test2></MyAtomicComplexTypeElement>'
|
||||
is $obj, '<MyAtomicComplexTypeElement xmlns="urn:Test"><test>Test</test>'
|
||||
. '<test2>Test2</test2></MyAtomicComplexTypeElement>'
|
||||
, 'stringification';
|
||||
|
||||
my $soap = SOAP::WSDL::Client->new( {
|
||||
@@ -48,16 +48,23 @@ ok $result->isa('SOAP::WSDL::SOAP::Typelib::Fault11'),
|
||||
'return fault on impossible call';
|
||||
ok ! $result, 'fault is false in boolean context';
|
||||
|
||||
package FakeResolver;
|
||||
|
||||
sub get_class {
|
||||
my %class_list = (
|
||||
# $soap->no_dispatch(1);
|
||||
ok ! $soap->call('Test'), 'second call';
|
||||
|
||||
package FakeResolver;
|
||||
my %class_list = (
|
||||
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
|
||||
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
||||
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyType',
|
||||
);
|
||||
sub get_class {
|
||||
|
||||
return $class_list{ $_[1] };
|
||||
}
|
||||
|
||||
sub get_typemap {
|
||||
return \%class_list;
|
||||
}
|
||||
|
||||
62
t/095_copying.t
Normal file
62
t/095_copying.t
Normal file
@@ -0,0 +1,62 @@
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More;
|
||||
use File::Find;
|
||||
if ( not $ENV{TEST_AUTHOR} ) {
|
||||
my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
|
||||
plan( skip_all => $msg );
|
||||
}
|
||||
|
||||
require Test::Pod::Content;
|
||||
import Test::Pod::Content;
|
||||
|
||||
my $dir = 'blib/lib';
|
||||
if (-d '../t') {
|
||||
$dir = '../lib';
|
||||
}
|
||||
|
||||
my @filelist = ();
|
||||
find( \&filelist, $dir);
|
||||
|
||||
sub filelist {
|
||||
my $name = $_;
|
||||
return if (-d $name);
|
||||
return if $File::Find::name =~m{\.svn}x;
|
||||
return if $File::Find::name !~m{\.pm$}x;
|
||||
|
||||
# skip builtin XSD types - they contain no pod
|
||||
return if $File::Find::name =~m{SOAP/WSDL/XSD/Typelib/Builtin/.+}xms;
|
||||
# skip data classes - they contain no pod
|
||||
return if $File::Find::name =~m{SOAP/WSDL/Base\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/Binding\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/Message\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/Operation\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/OpMessage\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/Part\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/Port\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/PortType\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/SOAP/Address\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/SOAP/Body\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/SOAP/Header\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/SOAP/HeaderFault\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/SOAP/Operation\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/Service\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/TypeLookup\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/Types\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/XSD/Builtin\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/XSD/ComplexType\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/XSD/SimpleType\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/XSD/Element\.pm$}xms;
|
||||
return if $File::Find::name =~m{SOAP/WSDL/XSD/Schema\.pm$}xms;
|
||||
|
||||
push @filelist, $File::Find::name;
|
||||
}
|
||||
|
||||
plan tests => scalar @filelist;
|
||||
|
||||
for my $file (sort @filelist) {
|
||||
pod_section_like( $file, 'LICENSE AND COPYRIGHT', qr{ This \s file \s is \s part \s of
|
||||
\s SOAP-WSDL\. \s You \s may \s distribute/modify \s it \s under \s
|
||||
the \s same \s terms \s as \s perl \s itself
|
||||
}xms, "$file License notice");
|
||||
}
|
||||
@@ -2,11 +2,11 @@ use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 12;
|
||||
use File::Spec;
|
||||
use File::Basename;
|
||||
use File::Basename qw(dirname);
|
||||
use_ok qw(SOAP::WSDL);
|
||||
|
||||
my $path = File::Spec->rel2abs(dirname( __FILE__ ) );
|
||||
|
||||
$path =~s{\\}{/}xmsg; # fix for windows
|
||||
my $soap = SOAP::WSDL->new();
|
||||
$soap->wsdl("file://$path/WSDL_NOT_FOUND.wsdl");
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use Test::More tests => 7;
|
||||
use Test::More tests => 10;
|
||||
use strict;
|
||||
use warnings;
|
||||
use diagnostics;
|
||||
@@ -28,4 +28,13 @@ ok( $soap->wsdlinit(), 'parsed WSDL' );
|
||||
|
||||
ok( $soap->wsdlinit( servicename => 'testService', portname => 'testPort'), 'parsed WSDL' );
|
||||
|
||||
ok( ($soap->portname() eq 'testPort' ), 'found port passed to wsdlinit');
|
||||
ok( ($soap->portname() eq 'testPort' ), 'found port passed to wsdlinit');
|
||||
|
||||
ok( $soap = SOAP::WSDL->new(
|
||||
wsdl => 'file://' . $url . '/../../acceptance/wsdl/02_port.wsdl'
|
||||
), 'Instantiated object' );
|
||||
|
||||
ok( $soap->wsdlinit() );
|
||||
$soap->outputxml(1);
|
||||
eval { $soap->call('test') };
|
||||
like $@, qr{type \s tns:testSimpleType1 \s , \s urn:simpleType \s not \s found}xms;
|
||||
@@ -1,4 +1,4 @@
|
||||
use Test::More tests => 8;
|
||||
use Test::More tests => 9;
|
||||
use strict;
|
||||
use warnings;
|
||||
use lib '../lib';
|
||||
@@ -28,7 +28,11 @@ ok( $soap = SOAP::WSDL->new(
|
||||
), 'Instantiated object' );
|
||||
|
||||
#3
|
||||
$soap->readable(1);
|
||||
SKIP: {
|
||||
skip 'Cannot test warning without Test::Warn', 1 if not (eval "require Test::Warn");
|
||||
Test::Warn::warning_like( sub { $soap->readable(1) },
|
||||
qr{\A 'readable' \s has \s no \s effect \s any \s more}xms);
|
||||
}
|
||||
$soap->outputxml(1);
|
||||
|
||||
ok( $soap->wsdlinit(
|
||||
@@ -36,15 +40,15 @@ ok( $soap->wsdlinit(
|
||||
), 'parsed WSDL' );
|
||||
$soap->no_dispatch(1);
|
||||
|
||||
ok ($xml = $soap->call('test',
|
||||
ok ($xml = $soap->call('test',
|
||||
testElement1 => 'Test'
|
||||
), 'Serialized (simple) element' );
|
||||
|
||||
ok ($xml = $soap->call('testRef',
|
||||
ok ($xml = $soap->call('testRef',
|
||||
testElementRef => 'Test'
|
||||
), 'Serialized (simple) element' );
|
||||
|
||||
like $xml
|
||||
like $xml
|
||||
, qr{<testElementRef\s\sxmlns="urn:Test">Test</testElementRef></SOAP-ENV:Body></SOAP-ENV:Envelope>}
|
||||
, 'element ref serialization result'
|
||||
;
|
||||
@@ -52,10 +56,10 @@ like $xml
|
||||
TODO: {
|
||||
local $TODO="implement min/maxOccurs checks";
|
||||
|
||||
eval {
|
||||
$xml = $soap->call('test',
|
||||
eval {
|
||||
$xml = $soap->call('test',
|
||||
testAll => [ 'Test 2', 'Test 3' ]
|
||||
);
|
||||
);
|
||||
};
|
||||
|
||||
ok( ($@ =~m/illegal\snumber\sof\selements/),
|
||||
@@ -63,7 +67,7 @@ TODO: {
|
||||
);
|
||||
|
||||
eval {
|
||||
$xml = $soap->call('test', testAll => undef );
|
||||
$xml = $soap->call('test', testAll => undef );
|
||||
};
|
||||
ok($@, 'Died on illegal number of elements (not enough)');
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
use strict;
|
||||
use warnings;
|
||||
use lib '../../../lib';
|
||||
use Test::More tests => 4;
|
||||
use SOAP::WSDL;
|
||||
@@ -11,17 +12,13 @@ my @dir_from = File::Spec->splitdir($dir);
|
||||
unshift @dir_from, $volume if $volume;
|
||||
my $url = join '/', @dir_from;
|
||||
|
||||
|
||||
print "# Using SOAP::WSDL Version $SOAP::WSDL::VERSION\n";
|
||||
|
||||
# chdir to my location
|
||||
my $soap = undef;
|
||||
|
||||
my $path = File::Spec->rel2abs( dirname __FILE__ );
|
||||
|
||||
my $proxy = 'http://127.0.0.1/testPort';
|
||||
|
||||
|
||||
ok( $soap = SOAP::WSDL->new(
|
||||
wsdl => 'file://' . $url . '/../../acceptance/wsdl/02_port.wsdl'
|
||||
) );
|
||||
|
||||
37
t/SOAP/WSDL/Client.t
Normal file
37
t/SOAP/WSDL/Client.t
Normal file
@@ -0,0 +1,37 @@
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 8; #qw(no_plan);
|
||||
|
||||
use_ok qw(SOAP::WSDL::Client);
|
||||
|
||||
ok my $client = SOAP::WSDL::Client->new();
|
||||
|
||||
ok $client = SOAP::WSDL::Client->new({
|
||||
proxy => 'http://localhost',
|
||||
});
|
||||
|
||||
is $client->get_endpoint(), 'http://localhost';
|
||||
|
||||
$client->no_dispatch(1);
|
||||
$client->set_serializer('main');
|
||||
my $serialize = $client->call({
|
||||
operation => 'testMethod'
|
||||
}, { foo => 'bar'}, { bar => 'baz'});
|
||||
is $serialize->{ body }->{ foo }, 'bar';
|
||||
is $serialize->{ header }->{ bar }, 'baz';
|
||||
|
||||
# Old calling style compatibility test - foo => bar is body...
|
||||
$serialize = $client->call({
|
||||
operation => 'testMethod'
|
||||
}, foo => 'bar');
|
||||
is $serialize->{ body }->{ foo }, 'bar';
|
||||
|
||||
# Old calling style compatibility test - foo => bar is body...
|
||||
$serialize = $client->call('testMethod', foo => 'bar');
|
||||
is $serialize->{ body }->{ foo }, 'bar';
|
||||
|
||||
|
||||
sub serialize {
|
||||
my $self = shift;
|
||||
return shift;
|
||||
}
|
||||
@@ -4,11 +4,9 @@ use Class::Std::Fast;
|
||||
package main;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More qw(no_plan);
|
||||
use Test::More tests => 21;
|
||||
use_ok qw(SOAP::WSDL::Client::Base);
|
||||
|
||||
my $client = SOAP::WSDL::Client::Base->new();
|
||||
|
||||
{
|
||||
no warnings qw(redefine once);
|
||||
*SOAP::WSDL::Client::call = sub { is $_[1]->{ operation }, 'sayHello', 'Called method';
|
||||
@@ -16,35 +14,41 @@ my $client = SOAP::WSDL::Client::Base->new();
|
||||
};
|
||||
}
|
||||
|
||||
my $client = SOAP::WSDL::Client::Base->new();
|
||||
|
||||
my @result = $client->call({
|
||||
operation => 'sayHello',
|
||||
soap_action => 'urn:HelloWorld#sayHello',
|
||||
style => 'document',
|
||||
body => {
|
||||
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => '',
|
||||
encodingStyle => '',
|
||||
parts => [qw( SOAP::WSDL::XSD::Typelib::Builtin::string )],
|
||||
parts => [qw( SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||
)],
|
||||
},
|
||||
header => {
|
||||
parts => [qw( SOAP::WSDL::XSD::Typelib::Builtin::string )],
|
||||
parts => [qw( SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||
|
||||
)],
|
||||
},
|
||||
headerfault => {
|
||||
|
||||
|
||||
}
|
||||
}, { value => 'Body' }, { value => 'Header' });
|
||||
|
||||
is $result[0], 'Body';
|
||||
is $result[0]->[0], 'Body';
|
||||
is $result[1], 'Header';
|
||||
isa_ok $result[0], 'SOAP::WSDL::XSD::Typelib::Builtin::string';
|
||||
isa_ok $result[0]->[0], 'SOAP::WSDL::XSD::Typelib::Builtin::string';
|
||||
|
||||
@result = $client->call({
|
||||
operation => 'sayHello',
|
||||
soap_action => 'urn:HelloWorld#sayHello',
|
||||
style => 'document',
|
||||
body => {
|
||||
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => '',
|
||||
encodingStyle => '',
|
||||
@@ -54,12 +58,107 @@ isa_ok $result[0], 'SOAP::WSDL::XSD::Typelib::Builtin::string';
|
||||
parts => [qw( SOAP::WSDL::XSD::Typelib::Builtin::string )],
|
||||
},
|
||||
headerfault => {
|
||||
|
||||
|
||||
}
|
||||
}, SOAP::WSDL::XSD::Typelib::Builtin::string->new({ value => 'Body2' }),
|
||||
}, SOAP::WSDL::XSD::Typelib::Builtin::string->new({ value => 'Body2' }),
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::string->new({ value => 'Header2' })
|
||||
);
|
||||
|
||||
is $result[0], 'Body2';
|
||||
is $result[1], 'Header2';
|
||||
isa_ok $result[1], 'SOAP::WSDL::XSD::Typelib::Builtin::string';
|
||||
|
||||
# Call with more body parts than parameters. Body parts are empty
|
||||
@result = $client->call({
|
||||
operation => 'sayHello',
|
||||
soap_action => 'urn:HelloWorld#sayHello',
|
||||
style => 'document',
|
||||
body => {
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => '',
|
||||
encodingStyle => '',
|
||||
parts => [qw( SOAP::WSDL::XSD::Typelib::Builtin::string )],
|
||||
},
|
||||
header => {
|
||||
parts => [qw( SOAP::WSDL::XSD::Typelib::Builtin::string )],
|
||||
},
|
||||
headerfault => {
|
||||
|
||||
}
|
||||
}, [],
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::string->new({ value => 'Header2' })
|
||||
);
|
||||
|
||||
isa_ok $result[0], 'SOAP::WSDL::XSD::Typelib::Builtin::string';
|
||||
is $result[0], undef;
|
||||
is $result[1], 'Header2';
|
||||
isa_ok $result[1], 'SOAP::WSDL::XSD::Typelib::Builtin::string';
|
||||
|
||||
# Call with more body parts than parameters. Body parts are empty
|
||||
# No header
|
||||
@result = $client->call({
|
||||
operation => 'sayHello',
|
||||
soap_action => 'urn:HelloWorld#sayHello',
|
||||
style => 'document',
|
||||
body => {
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => '',
|
||||
encodingStyle => '',
|
||||
parts => [qw( SOAP::WSDL::XSD::Typelib::Builtin::string )],
|
||||
},
|
||||
header => {
|
||||
},
|
||||
headerfault => {
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
isa_ok $result[0], 'SOAP::WSDL::XSD::Typelib::Builtin::string';
|
||||
is $result[0], undef;
|
||||
|
||||
eval { $client->call({
|
||||
operation => 'sayHello',
|
||||
soap_action => 'urn:HelloWorld#sayHello',
|
||||
style => 'document',
|
||||
body => {
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => '',
|
||||
encodingStyle => '',
|
||||
parts => [qw( SomeStupidClassYouProbablyDontHaveOnYourSystem )],
|
||||
},
|
||||
header => {
|
||||
},
|
||||
headerfault => {
|
||||
|
||||
}
|
||||
})
|
||||
};
|
||||
like $@, qr{ Can't \s locate }xms;
|
||||
|
||||
isa_ok $result[0], 'SOAP::WSDL::XSD::Typelib::Builtin::string';
|
||||
is $result[0], undef;
|
||||
|
||||
eval { $client->call({
|
||||
operation => 'sayHello',
|
||||
soap_action => 'urn:HelloWorld#sayHello',
|
||||
style => 'document',
|
||||
body => {
|
||||
|
||||
'use' => 'literal',
|
||||
namespace => '',
|
||||
encodingStyle => '',
|
||||
parts => [qw( SOAP::WSDL::XSD::Typelib::Builtin::string )],
|
||||
},
|
||||
header => {
|
||||
parts => [qw( SomeOtherStupidClassYouProbablyDontHaveOnYourSystem )],
|
||||
},
|
||||
headerfault => {
|
||||
|
||||
}
|
||||
})
|
||||
};
|
||||
# die $@;
|
||||
like $@, qr{ Can't \s locate }xms;
|
||||
32
t/SOAP/WSDL/Definitions.t
Normal file
32
t/SOAP/WSDL/Definitions.t
Normal file
@@ -0,0 +1,32 @@
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 4;
|
||||
|
||||
use SOAP::WSDL::PortType;
|
||||
use_ok qw(SOAP::WSDL::Definitions);
|
||||
|
||||
my $obj = SOAP::WSDL::Definitions->new({
|
||||
portType => [
|
||||
SOAP::WSDL::PortType->new({
|
||||
name => 'foo',
|
||||
targetNamespace => 'bar',
|
||||
}),
|
||||
SOAP::WSDL::PortType->new({
|
||||
name => 'foo',
|
||||
targetNamespace => 'baz',
|
||||
}),
|
||||
SOAP::WSDL::PortType->new({
|
||||
name => 'foobar',
|
||||
targetNamespace => 'bar',
|
||||
}),
|
||||
]
|
||||
});
|
||||
|
||||
|
||||
my $found= $obj->find_portType('bar', 'foobar');
|
||||
is $found->get_name(), 'foobar', 'found PortType';
|
||||
$found = $obj->find_portType('baz', 'foo');
|
||||
is $found->get_name(), 'foo', 'found PortType';
|
||||
|
||||
$found = $obj->find_portType('baz', 'foobar');
|
||||
is $found, undef, 'find_PortType returns undef on unknown PortType';
|
||||
@@ -19,7 +19,7 @@ my $data = $som->match('/a')->valueof;
|
||||
is $data->{ c } , 3;
|
||||
|
||||
SKIP: {
|
||||
skip "SOAP::Lite > 0.69 required" , 2 if ($SOAP::Lite::VERSION < 0.69);
|
||||
skip "SOAP::Lite > 0.69 required" , 2 if ($SOAP::Lite::VERSION lt '0.69');
|
||||
is $data->{ b }->[0] , 1, "array values - SOAP::Lite $SOAP::Lite::VERSION";;
|
||||
is $data->{ b }->[1] , 2, "array values - SOAP::Lite $SOAP::Lite::VERSION";;
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ package TestResolver;
|
||||
sub get_typemap { {} };
|
||||
|
||||
package main;
|
||||
use Test::More tests => 8;
|
||||
use Test::More tests => 9;
|
||||
|
||||
use SOAP::WSDL::Deserializer::XSD;
|
||||
|
||||
@@ -24,4 +24,7 @@ is $fault->get_faultcode(), 'soap:Client';
|
||||
|
||||
isa_ok $obj->deserialize('rubbeldiekatz'), 'SOAP::WSDL::SOAP::Typelib::Fault11';
|
||||
isa_ok $obj->deserialize('<zumsel></zumsel>'), 'SOAP::WSDL::SOAP::Typelib::Fault11';
|
||||
isa_ok $obj->deserialize('<Envelope xmlns="huchmampf"></Envelope>'), 'SOAP::WSDL::SOAP::Typelib::Fault11';
|
||||
isa_ok $obj->deserialize('<Envelope xmlns="huchmampf"></Envelope>'), 'SOAP::WSDL::SOAP::Typelib::Fault11';
|
||||
is $obj->deserialize('<SOAP-ENV:Envelope
|
||||
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
|
||||
<SOAP-ENV:Body ></SOAP-ENV:Body></SOAP-ENV:Envelope>'), undef, 'Deserialize empty envelope';
|
||||
@@ -1,6 +1,6 @@
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 3;
|
||||
use Test::More tests => 5;
|
||||
use_ok qw(SOAP::WSDL::Expat::Base);
|
||||
|
||||
my $parser = SOAP::WSDL::Expat::Base->new();
|
||||
@@ -9,4 +9,13 @@ eval { $parser->parse('Foobar')};
|
||||
ok $@;
|
||||
|
||||
eval { $parser->parsefile('Foobar')};
|
||||
ok $@;
|
||||
ok $@;
|
||||
|
||||
|
||||
$parser = SOAP::WSDL::Expat::Base->new({
|
||||
user_agent => 'foo',
|
||||
});
|
||||
|
||||
is $parser->get_user_agent(), 'foo';
|
||||
$parser->set_user_agent('bar');
|
||||
is $parser->get_user_agent(), 'bar';
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 2;
|
||||
use Test::More tests => 4;
|
||||
use lib '../../../../lib';
|
||||
use lib '../../../../t/lib';
|
||||
use lib 't/lib';
|
||||
use lib '../lib';
|
||||
use lib 'lib';
|
||||
use lib 't/lib';
|
||||
|
||||
use_ok(qw/SOAP::WSDL::Expat::MessageParser/);
|
||||
|
||||
@@ -26,10 +28,34 @@ my $parser = SOAP::WSDL::Expat::MessageParser->new({
|
||||
|
||||
$parser->parse( $xml );
|
||||
|
||||
is $parser->get_data(), q{<MyAtomicComplexTypeElement xmlns="urn:Test" >}
|
||||
. q{<test >Test</test><test2 >Test2</test2></MyAtomicComplexTypeElement>}
|
||||
is $parser->get_data(), q{<MyAtomicComplexTypeElement xmlns="urn:Test">}
|
||||
. q{<test>Test</test><test2>Test2</test2></MyAtomicComplexTypeElement>}
|
||||
, 'Content comparison';
|
||||
|
||||
my $xml_attr = q{<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
|
||||
<SOAP-ENV:Body><MyElementAttrs xmlns="urn:Test" test="Test" test2="Test2">
|
||||
<test>Test</test>
|
||||
<test2 > </test2>
|
||||
</MyElementAttrs></SOAP-ENV:Body></SOAP-ENV:Envelope>};
|
||||
|
||||
$parser->parse($xml_attr);
|
||||
|
||||
is $parser->get_data(),
|
||||
q{<MyElementAttrs xmlns="urn:Test" test="Test" test2="Test2"><test>Test</test></MyElementAttrs>},
|
||||
'Content with attributes';
|
||||
|
||||
my $xml_error = q{<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
|
||||
<SOAP-ENV:Body><MyElementAttrs xmlns="urn:Test" test="Test" test2="Test2">
|
||||
<test>Test</test>
|
||||
<test2 ></test2>
|
||||
<foo>Bar</foo>
|
||||
</MyElementAttrs></SOAP-ENV:Body></SOAP-ENV:Envelope>};
|
||||
|
||||
eval { $parser->parse($xml_error) };
|
||||
like $@, qr{\A Cannot \s resolve \s class \s for \s MyElementAttrs/foo }x, 'XML error';
|
||||
|
||||
# data classes reside in t/lib/Typelib/
|
||||
BEGIN {
|
||||
package FakeResolver;
|
||||
@@ -41,6 +67,9 @@ BEGIN {
|
||||
'MyAtomicComplexTypeElement/foo' => '__SKIP__',
|
||||
# 'MyAtomicComplexTypeElement/foo/bar' => 'MyFooElement',
|
||||
# 'MyAtomicComplexTypeElement/foo/baz' => 'MyFooElement',
|
||||
'MyElementAttrs' => 'MyElementAttrs',
|
||||
'MyElementAttrs/test' => 'MyTestElement',
|
||||
'MyElementAttrs/test2' => 'MyTestElement2',
|
||||
);
|
||||
|
||||
sub new { return bless {}, 'FakeResolver' };
|
||||
@@ -50,9 +79,7 @@ BEGIN {
|
||||
sub get_class {
|
||||
my $name = join('/', @{ $_[1] });
|
||||
return ($class_list{ $name }) ? $class_list{ $name }
|
||||
: warn "no class found for $name";
|
||||
: undef;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
};
|
||||
64
t/SOAP/WSDL/Expat/WSDLParser.t
Normal file
64
t/SOAP/WSDL/Expat/WSDLParser.t
Normal file
@@ -0,0 +1,64 @@
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 10; #qw(no_plan);
|
||||
use File::Spec;
|
||||
use File::Basename;
|
||||
|
||||
my $path = File::Spec->rel2abs( dirname __FILE__ );
|
||||
|
||||
use_ok qw( SOAP::WSDL::Expat::WSDLParser);
|
||||
|
||||
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
|
||||
|
||||
my $definitions = $parser->parse_file(
|
||||
"$path/../../../acceptance/wsdl/WSDLParser.wsdl"
|
||||
);
|
||||
|
||||
use Data::Dumper;
|
||||
my $schema = $definitions->first_types()->get_schema()->[1];
|
||||
my $attr = $schema->get_element()->[0]->first_complexType->first_attribute();
|
||||
ok $attr->get_name('testAttribute');
|
||||
ok $attr->get_type('xs:string');
|
||||
|
||||
|
||||
use SOAP::WSDL::Generator::Template::XSD;
|
||||
my $generator = SOAP::WSDL::Generator::Template::XSD->new({
|
||||
definitions => $definitions,
|
||||
type_prefix => 'Foo',
|
||||
element_prefix => 'Foo',
|
||||
typemap_prefix => 'Foo',
|
||||
OUTPUT_PATH => "$path/testlib",
|
||||
});
|
||||
|
||||
#my $code = "";
|
||||
#$generator->set_output(\$code);
|
||||
#$generator->generate_typelib();
|
||||
#{
|
||||
# eval $code;
|
||||
# ok !$@;
|
||||
# print $@ if $@;
|
||||
#}
|
||||
|
||||
$definitions = $parser->parse_uri(
|
||||
"file://$path/../../../acceptance/wsdl/WSDLParser-import.wsdl"
|
||||
);
|
||||
|
||||
ok my $service = $definitions->first_service();
|
||||
is $service->get_name(), 'Service1', 'wsdl:import service name';
|
||||
is $definitions->first_binding()->get_name(), 'Service1Soap', 'wsdl:import binding name';
|
||||
|
||||
ok my $schema_from_ref = $definitions->first_types()->get_schema();
|
||||
is @{ $schema_from_ref }, 2, 'got builtin and imported schema';
|
||||
ok @{ $schema_from_ref->[1]->get_element } > 0;
|
||||
is $schema_from_ref->[1]->get_element->[0]->get_name(), 'sayHello';
|
||||
|
||||
__END__
|
||||
|
||||
$generator->set_type_prefix('MyTypes');
|
||||
$generator->set_element_prefix('MyElements');
|
||||
$generator->set_typemap_prefix('MyTypemaps');
|
||||
$generator->set_interface_prefix('MyInterfaces');
|
||||
|
||||
$generator->set_output(undef);
|
||||
$generator->generate();
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 5;
|
||||
use Test::More tests => 6;
|
||||
use Scalar::Util qw(blessed);
|
||||
use SOAP::WSDL::Factory::Transport;
|
||||
|
||||
eval { SOAP::WSDL::Factory::Transport->get_transport('') };
|
||||
like $@, qr{^no transport};
|
||||
|
||||
|
||||
eval { SOAP::WSDL::Factory::Transport->get_transport('zumsl') };
|
||||
like $@, qr{^no transport};
|
||||
|
||||
@@ -12,7 +16,7 @@ ok blessed $obj;
|
||||
|
||||
SOAP::WSDL::Factory::Transport->register('zumsl', 'Hope_You_Have_No_Such_Package_Installed');
|
||||
|
||||
eval { SOAP::WSDL::Factory::Transport->get_transport('zumsl') };
|
||||
eval { SOAP::WSDL::Factory::Transport->get_transport('zumsl:foo') };
|
||||
like $@, qr{^Cannot load};
|
||||
|
||||
eval { SOAP::WSDL::Factory::Transport->register( \'zumsl', 'Foo') };
|
||||
|
||||
@@ -44,7 +44,7 @@ print $@ if $@;
|
||||
# print $output;
|
||||
__END__
|
||||
|
||||
my $tt = Template->new(
|
||||
my $tt = Template->new(
|
||||
DEBUG => 1,
|
||||
EVAL_PERL => 1,
|
||||
RECURSION => 1,
|
||||
@@ -53,7 +53,7 @@ my $tt = Template->new(
|
||||
|
||||
foreach my $service (@{ $definitions->get_service }) {
|
||||
my $output;
|
||||
$tt->process( 'Interface.tt', {
|
||||
$tt->process( 'Interface.tt', {
|
||||
definitions => $definitions,
|
||||
service => $service,
|
||||
interface_prefix => 'MyInterface',
|
||||
@@ -62,8 +62,8 @@ foreach my $service (@{ $definitions->get_service }) {
|
||||
element_prefix => 'MyElement',
|
||||
}, \$output);
|
||||
die $tt->error if $tt->error();
|
||||
|
||||
|
||||
ok eval $output, 'eval output';
|
||||
|
||||
|
||||
print $output;
|
||||
};
|
||||
@@ -11,7 +11,7 @@ eval { require XML::LibXML }
|
||||
|
||||
plan skip_all => 'XML::Compile::WSDL11 is not functional yet';
|
||||
|
||||
plan tests => qw(no_plan);
|
||||
plan qw(no_plan);
|
||||
|
||||
my $path = File::Spec->rel2abs( dirname __FILE__ );
|
||||
|
||||
@@ -20,6 +20,8 @@ my $xml = $libxml->parse_file("$path/../../../acceptance/wsdl/generator_test.wsd
|
||||
|
||||
my $wsdl = XML::Compile::WSDL11->new($xml);
|
||||
my $schemas = $wsdl->schemas;
|
||||
my $operation = $wsdl->operation('testHeader');
|
||||
ok my $operation = $wsdl->operation('testHeader');
|
||||
|
||||
my $client = $operation->prepareClient();
|
||||
#die Dumper $operation;
|
||||
#
|
||||
#my $client = $operation->prepareClient();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use Test::More tests => 38;
|
||||
use Test::More tests => 41;
|
||||
use File::Basename qw(dirname);
|
||||
use File::Spec;
|
||||
use File::Path;
|
||||
@@ -149,5 +149,12 @@ is $ct_east->get_testAtomicSimpleTypeElement2->get_value(), 23;
|
||||
isa_ok($ct_east->get_testAtomicSimpleTypeElement2,
|
||||
'MyTypes::testComplexTypeElementAtomicSimpleType::_testAtomicSimpleTypeElement2');
|
||||
|
||||
ok eval { require MyElements::testElementCompletelyEmptyComplex; }
|
||||
, 'load MyElements::testElementCompletelyEmptyComplex';
|
||||
ok my $empty = MyElements::testElementCompletelyEmptyComplex->new();
|
||||
|
||||
is $empty->serialize_qualified(), '<testElementCompletelyEmptyComplex xmlns="urn:Test"/>'
|
||||
, 'serialize empty';
|
||||
|
||||
|
||||
rmtree "$path/testlib";
|
||||
|
||||
100
t/SOAP/WSDL/Generator/XSD_dot_names.t
Normal file
100
t/SOAP/WSDL/Generator/XSD_dot_names.t
Normal file
@@ -0,0 +1,100 @@
|
||||
use Test::More tests => 12;
|
||||
use File::Basename qw(dirname);
|
||||
use File::Spec;
|
||||
use File::Path;
|
||||
|
||||
my $path = File::Spec->rel2abs( dirname __FILE__ );
|
||||
|
||||
use_ok qw(SOAP::WSDL::Generator::Visitor::Typelib);
|
||||
use_ok qw(SOAP::WSDL::Generator::Template::XSD);
|
||||
|
||||
use SOAP::WSDL::Expat::WSDLParser;
|
||||
|
||||
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
|
||||
|
||||
my $definitions = $parser->parse_file(
|
||||
"$path/../../../acceptance/wsdl/generator_test_dot_names.wsdl"
|
||||
#"$path/../../../acceptance/wsdl/elementAtomicComplexType.xml"
|
||||
);
|
||||
|
||||
my $generator = SOAP::WSDL::Generator::Template::XSD->new({
|
||||
definitions => $definitions,
|
||||
type_prefix => 'Foo',
|
||||
element_prefix => 'Foo',
|
||||
typemap_prefix => 'Foo',
|
||||
OUTPUT_PATH => "$path/testlib",
|
||||
});
|
||||
|
||||
my $code = "";
|
||||
$generator->set_output(\$code);
|
||||
$generator->generate_typelib();
|
||||
{
|
||||
eval $code;
|
||||
ok !$@;
|
||||
print $@ if $@;
|
||||
}
|
||||
# print $code;
|
||||
|
||||
|
||||
$generator->set_type_prefix('MyTypes');
|
||||
$generator->set_element_prefix('MyElements');
|
||||
$generator->set_typemap_prefix('MyTypemaps');
|
||||
$generator->set_interface_prefix('MyInterfaces');
|
||||
|
||||
$generator->set_output(undef);
|
||||
$generator->generate();
|
||||
#$generator->generate_typelib();
|
||||
#$generator->generate_typemap();
|
||||
|
||||
if (eval { require Test::Warn; }) {
|
||||
Test::Warn::warning_like( sub { $generator->generate_interface() },
|
||||
qr{\A Multiple \s parts \s detected \s in \s message \s testMultiPartWarning}xms);
|
||||
}
|
||||
else {
|
||||
$generator->generate_interface();
|
||||
SKIP: { skip 'Cannot test warnings without Test::Warn', 1 };
|
||||
}
|
||||
|
||||
$generator->generate_server();
|
||||
|
||||
eval "use lib '$path/testlib'";
|
||||
|
||||
use_ok qw(MyInterfaces::My::SOAP::testService::testPort);
|
||||
use_ok qw(MyServer::My::SOAP::testService::testPort);
|
||||
SKIP: {
|
||||
eval { require Test::Pod::Content; }
|
||||
or skip 'Cannot test pod content without Test::Pod::Content', 6;
|
||||
Test::Pod::Content::pod_section_like(
|
||||
'MyInterfaces::My::SOAP::testService::testPort',
|
||||
'NAME',
|
||||
qr{^MyInterfaces::My::SOAP::testService::testPort \s - \s}xms,
|
||||
'Pod NAME section');
|
||||
Test::Pod::Content::pod_section_like(
|
||||
'MyInterfaces::My::SOAP::testService::testPort',
|
||||
'SYNOPSIS',
|
||||
qr{use \s MyInterfaces::My::SOAP::testService::testPort}xms,
|
||||
'Pod SYNOPSIS section');
|
||||
Test::Pod::Content::pod_section_like(
|
||||
'MyInterfaces::My::SOAP::testService::testPort',
|
||||
'SYNOPSIS',
|
||||
qr{\s MyInterfaces::My::SOAP::testService::testPort->new\(}xms,
|
||||
'Pod SYNOPSIS section');
|
||||
|
||||
Test::Pod::Content::pod_section_like(
|
||||
'MyServer::My::SOAP::testService::testPort',
|
||||
'NAME',
|
||||
qr{^MyServer::My::SOAP::testService::testPort \s - \s}xms,
|
||||
'Pod NAME section');
|
||||
Test::Pod::Content::pod_section_like(
|
||||
'MyServer::My::SOAP::testService::testPort',
|
||||
'SYNOPSIS',
|
||||
qr{use \s MyServer::My::SOAP::testService::testPort}xms,
|
||||
'Pod SYNOPSIS section');
|
||||
Test::Pod::Content::pod_section_like(
|
||||
'MyServer::My::SOAP::testService::testPort',
|
||||
'SYNOPSIS',
|
||||
qr{\s MyServer::My::SOAP::testService::testPort->new\(}xms,
|
||||
'Pod SYNOPSIS section');
|
||||
}
|
||||
|
||||
rmtree "$path/testlib";
|
||||
32
t/SOAP/WSDL/PortType.t
Normal file
32
t/SOAP/WSDL/PortType.t
Normal file
@@ -0,0 +1,32 @@
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 4;
|
||||
|
||||
use SOAP::WSDL::Operation;
|
||||
use_ok qw(SOAP::WSDL::PortType);
|
||||
|
||||
my $portType = SOAP::WSDL::PortType->new({
|
||||
operation => [
|
||||
SOAP::WSDL::Operation->new({
|
||||
name => 'foo',
|
||||
targetNamespace => 'bar',
|
||||
}),
|
||||
SOAP::WSDL::Operation->new({
|
||||
name => 'foo',
|
||||
targetNamespace => 'baz',
|
||||
}),
|
||||
SOAP::WSDL::Operation->new({
|
||||
name => 'foobar',
|
||||
targetNamespace => 'bar',
|
||||
}),
|
||||
]
|
||||
});
|
||||
|
||||
|
||||
my $operation = $portType->find_operation('bar', 'foobar');
|
||||
is $operation->get_name(), 'foobar', 'found operation';
|
||||
$operation = $portType->find_operation('baz', 'foo');
|
||||
is $operation->get_name(), 'foo', 'found operation';
|
||||
|
||||
$operation = $portType->find_operation('baz', 'foobar');
|
||||
is $operation, undef, 'find_operation returns undef on unknown operation';
|
||||
@@ -10,4 +10,11 @@ like $serializer->serialize(), qr{<SOAP-ENV:Body></SOAP-ENV:Body>}, 'empty body'
|
||||
like $serializer->serialize({ body => {} }), qr{<SOAP-ENV:Body></SOAP-ENV:Body>}, 'empty body';
|
||||
like $serializer->serialize({ body => [] }), qr{<SOAP-ENV:Body></SOAP-ENV:Body>}, 'empty body';
|
||||
like $serializer->serialize({ header => {}, body => [] }),
|
||||
qr{<SOAP-ENV:Header></SOAP-ENV:Header><SOAP-ENV:Body></SOAP-ENV:Body>}, 'empty header and body';
|
||||
qr{<SOAP-ENV:Header></SOAP-ENV:Header><SOAP-ENV:Body></SOAP-ENV:Body>}, 'empty header and body';
|
||||
like $serializer->serialize({ header => {}, body => [] , options => {
|
||||
namespace => {
|
||||
'http://schemas.xmlsoap.org/soap/envelope/' => 'SOAP',
|
||||
'http://www.w3.org/2001/XMLSchema-instance' => 'xsi',
|
||||
}
|
||||
} }),
|
||||
qr{<SOAP:Header></SOAP:Header><SOAP:Body></SOAP:Body>}, 'empty header and body';
|
||||
@@ -55,8 +55,13 @@ eval { $server->handle($request) };
|
||||
like $@, qr{\A Not \s implemented:}x, 'Not implemented fault caught';
|
||||
|
||||
|
||||
$server->set_action_map_ref({ Test => 'test'});
|
||||
ok $server->handle($request);
|
||||
|
||||
$server->set_deserializer('MyDeserializer2');
|
||||
eval { $server->handle(HTTP::Request->new()) };
|
||||
like $@, qr{\A Error \s deserializing}x, 'Error deserializing caught';
|
||||
|
||||
sub test {
|
||||
return;
|
||||
}
|
||||
@@ -11,7 +11,7 @@ use Test::More;
|
||||
eval "require IO::Scalar"
|
||||
or plan skip_all => 'IO::Scalar required for testing...';
|
||||
|
||||
plan tests => 8;
|
||||
plan tests => 12;
|
||||
|
||||
use_ok(SOAP::WSDL::Server);
|
||||
use_ok(SOAP::WSDL::Server::CGI);
|
||||
@@ -30,51 +30,113 @@ $server->set_action_map_ref({
|
||||
my $output = q{};
|
||||
my $fh = IO::Scalar->new(\$output);
|
||||
my $stdout = *STDOUT;
|
||||
my $stdin = *STDIN;
|
||||
|
||||
*STDOUT = $fh;
|
||||
{
|
||||
local %ENV;
|
||||
$server->handle();
|
||||
|
||||
like $output, qr{ \A Status: \s 411 \s Length \s Required}x;
|
||||
$output = q{};
|
||||
|
||||
$ENV{'CONTENT_LENGTH'} = '0e0';
|
||||
$server->handle();
|
||||
|
||||
like $output, qr{ Error \s deserializing }xsm;
|
||||
$output = q{};
|
||||
|
||||
$server->set_action_map_ref({
|
||||
'foo' => 'bar',
|
||||
});
|
||||
$server->set_dispatch_to( 'HandlerClass' );
|
||||
|
||||
$server->handle();
|
||||
like $output, qr{no \s element \s found}xms;
|
||||
$output = q{};
|
||||
|
||||
$ENV{REQUEST_METHOD} = 'POST';
|
||||
$ENV{HTTP_SOAPACTION} = 'test';
|
||||
$server->handle();
|
||||
like $output, qr{no \s element \s found}xms;
|
||||
$output = q{};
|
||||
|
||||
delete $ENV{HTTP_SOAPACTION};
|
||||
|
||||
$ENV{EXPECT} = 'Foo';
|
||||
$ENV{HTTP_SOAPAction} = 'foo';
|
||||
$server->handle();
|
||||
|
||||
like $output, qr{no \s element \s found}xms;
|
||||
$output = q{};
|
||||
|
||||
$ENV{EXPECT} = '100-Continue';
|
||||
$ENV{HTTP_SOAPAction} = 'foo';
|
||||
$server->handle();
|
||||
like $output, qr{100 \s Continue}xms;
|
||||
$output = q{};
|
||||
|
||||
delete $ENV{EXPECT};
|
||||
|
||||
my $input = 'Foobar';
|
||||
my $ih = IO::Scalar->new(\$input);
|
||||
$ih->seek(0);
|
||||
*STDIN = $ih;
|
||||
|
||||
# my $buffer;
|
||||
# read(*STDIN, $buffer, 6);
|
||||
# die $buffer;
|
||||
$ENV{HTTP_SOAPAction} = 'bar';
|
||||
$ENV{CONTENT_LENGTH} = 6;
|
||||
$server->handle();
|
||||
like $output, qr{ Error \s deserializing \s message}xms;
|
||||
$output = q{};
|
||||
$ih->seek(0);
|
||||
|
||||
$server->handle();
|
||||
|
||||
like $output, qr{ \A Status: \s 411 \s Length \s Required}x;
|
||||
$output = q{};
|
||||
|
||||
$ENV{'CONTENT_LENGTH'} = '0e0';
|
||||
$server->handle();
|
||||
|
||||
like $output, qr{ Error \s deserializing }xsm;
|
||||
$output = q{};
|
||||
|
||||
$server->set_action_map_ref({
|
||||
'foo' => 'bar',
|
||||
});
|
||||
$server->set_dispatch_to( 'HandlerClass' );
|
||||
|
||||
$server->handle();
|
||||
like $output, qr{no \s element \s found}xms;
|
||||
$output = q{};
|
||||
|
||||
$ENV{REQUEST_METHOD} = 'POST';
|
||||
$ENV{HTTP_SOAPACTION} = 'test';
|
||||
$server->handle();
|
||||
like $output, qr{no \s element \s found}xms;
|
||||
$output = q{};
|
||||
|
||||
delete $ENV{HTTP_SOAPACTION};
|
||||
|
||||
$ENV{EXPECT} = 'Foo';
|
||||
$ENV{HTTP_SOAPAction} = 'foo';
|
||||
$server->handle();
|
||||
|
||||
like $output, qr{no \s element \s found}xms;
|
||||
$output = q{};
|
||||
|
||||
$ENV{EXPECT} = '100-Continue';
|
||||
$ENV{HTTP_SOAPAction} = 'foo';
|
||||
$server->handle();
|
||||
like $output, qr{100 \s Continue}xms;
|
||||
$output = q{};
|
||||
$input = q{<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
|
||||
<SOAP-ENV:Body></SOAP-ENV:Body></SOAP-ENV:Envelope>};
|
||||
$ENV{HTTP_SOAPAction} = 'bar';
|
||||
$ENV{CONTENT_LENGTH} = length $input;
|
||||
$server->handle();
|
||||
# die $output;
|
||||
like $output, qr{ Not \s found:}xms;
|
||||
$output = q{};
|
||||
$ih->seek(0);
|
||||
|
||||
|
||||
$server->set_dispatch_to( 'HandlerClass' );
|
||||
$server->set_action_map_ref({
|
||||
'bar' => 'bar',
|
||||
});
|
||||
$input = q{<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
|
||||
<SOAP-ENV:Body></SOAP-ENV:Body></SOAP-ENV:Envelope>};
|
||||
$ENV{HTTP_SOAPAction} = q{"bar"};
|
||||
$ENV{CONTENT_LENGTH} = length $input;
|
||||
$server->handle();
|
||||
use Data::Dumper;
|
||||
like $output, qr{ \A Status: \s 200 \s OK}xms;
|
||||
$output = q{};
|
||||
$ih->seek(0);
|
||||
|
||||
|
||||
$server->set_dispatch_to( 'HandlerClass' );
|
||||
$server->set_action_map_ref({
|
||||
'bar' => 'bar',
|
||||
});
|
||||
$input = q{<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
|
||||
<SOAP-ENV:Body></SOAP-ENV:Body></SOAP-ENV:Envelope>};
|
||||
$ENV{SERVER_SOFTWARE} ='IIS Foobar';
|
||||
$ENV{HTTP_SOAPAction} = q{"bar"};
|
||||
$ENV{CONTENT_LENGTH} = length $input;
|
||||
$server->handle();
|
||||
use Data::Dumper;
|
||||
like $output, qr{ \A HTTP/1.0 \s 200 \s OK}xms;
|
||||
$output = q{};
|
||||
$ih->seek(0);
|
||||
|
||||
}
|
||||
|
||||
# restore handles
|
||||
*STDOUT = $stdout;
|
||||
|
||||
*STDIN = $stdin;
|
||||
# print $output;
|
||||
40
t/SOAP/WSDL/XSD/Attribute.t
Normal file
40
t/SOAP/WSDL/XSD/Attribute.t
Normal file
@@ -0,0 +1,40 @@
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 2; #qw(no_plan);
|
||||
|
||||
use_ok qw(SOAP::WSDL::XSD::Attribute);
|
||||
|
||||
use SOAP::WSDL::Expat::WSDLParser;
|
||||
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
|
||||
|
||||
my $xml = q{<s:schema elementFormDefault="qualified"
|
||||
targetNamespace="urn:HelloWorld" xmlns:s="http://www.w3.org/2001/XMLSchema">
|
||||
<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>
|
||||
|
||||
<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>
|
||||
};
|
||||
|
||||
my $schema = $parser->parse($xml);
|
||||
|
||||
is $schema->find_element('urn:HelloWorld', 'sayHello')
|
||||
->first_complexType()
|
||||
->first_attribute()->get_name(),
|
||||
'testAttr', 'found attribute';
|
||||
@@ -1,11 +1,11 @@
|
||||
package Foo;
|
||||
sub serialize {
|
||||
return "serialized $_[1] $_[2]";
|
||||
return "serialized $_[1] $_[2]" . join ' ', @{$_[3]->{ attributes } || [] } if $_[3];
|
||||
}
|
||||
package main;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 12;
|
||||
use Test::More tests => 16;
|
||||
|
||||
use_ok qw(SOAP::WSDL::XSD::Element);
|
||||
|
||||
@@ -16,6 +16,9 @@ is $element->first_simpleType(), undef;
|
||||
$element->set_simpleType('Foo');
|
||||
is $element->first_simpleType(), 'Foo';
|
||||
|
||||
is $element->serialize('Foobar', 'Bar', { namespace => {} } ), 'serialized Foobar Bar';
|
||||
is $element->serialize('Foobar', undef, { namespace => {} } ), 'serialized Foobar ';
|
||||
|
||||
$element->set_simpleType( [ 'Foo', 'Bar' ]);
|
||||
is $element->first_simpleType(), 'Foo';
|
||||
|
||||
@@ -30,6 +33,13 @@ is $element->first_complexType(), 'Foo';
|
||||
$element->set_default('Foo');
|
||||
is $element->serialize('Foobar', undef, { namespace => {} } ), 'serialized Foobar Foo';
|
||||
|
||||
$element->set_targetNamespace('urn:foobar');
|
||||
is $element->serialize('Foobar', undef, { namespace => {}, qualify => 1 } ), 'serialized Foobar Foo xmlns="urn:foobar"';
|
||||
|
||||
$element->set_targetNamespace('urn:foobar');
|
||||
is $element->serialize('Foobar', 'Bar', { namespace => {}, qualify => 1 } ), 'serialized Foobar Bar xmlns="urn:foobar"';
|
||||
|
||||
|
||||
$element->set_name('Bar');
|
||||
is $element->serialize(undef, undef, { namespace => {} } ), 'serialized Bar Foo';
|
||||
|
||||
|
||||
32
t/SOAP/WSDL/XSD/Schema.t
Normal file
32
t/SOAP/WSDL/XSD/Schema.t
Normal file
@@ -0,0 +1,32 @@
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 4;
|
||||
|
||||
use SOAP::WSDL::XSD::Element;
|
||||
use_ok qw(SOAP::WSDL::XSD::Schema);
|
||||
|
||||
my $obj = SOAP::WSDL::XSD::Schema->new({
|
||||
element => [
|
||||
SOAP::WSDL::XSD::Element->new({
|
||||
name => 'foo',
|
||||
targetNamespace => 'bar',
|
||||
}),
|
||||
SOAP::WSDL::XSD::Element->new({
|
||||
name => 'foo',
|
||||
targetNamespace => 'baz',
|
||||
}),
|
||||
SOAP::WSDL::XSD::Element->new({
|
||||
name => 'foobar',
|
||||
targetNamespace => 'bar',
|
||||
}),
|
||||
]
|
||||
});
|
||||
|
||||
|
||||
my $found= $obj->find_element('bar', 'foobar');
|
||||
is $found->get_name(), 'foobar', 'found Element';
|
||||
$found = $obj->find_element('baz', 'foo');
|
||||
is $found->get_name(), 'foo', 'found Element';
|
||||
|
||||
$found = $obj->find_element('baz', 'foobar');
|
||||
is $found, undef, 'find_Element returns undef on unknown Element';
|
||||
7
t/SOAP/WSDL/XSD/Typelib/Attribute.t
Normal file
7
t/SOAP/WSDL/XSD/Typelib/Attribute.t
Normal file
@@ -0,0 +1,7 @@
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 3; #qw(no_plan);
|
||||
|
||||
use_ok qw(SOAP::WSDL::XSD::Typelib::Attribute);
|
||||
is SOAP::WSDL::XSD::Typelib::Attribute->start_tag(), '';
|
||||
is SOAP::WSDL::XSD::Typelib::Attribute->start_tag({ name => 'foo'}, 'bar'), q{ foo="};
|
||||
@@ -24,8 +24,8 @@ is $obj->get_value(), 'test1', 'get_value';
|
||||
is $obj->get_xmlns(), 'http://www.w3.org/2001/XMLSchema', 'get_xmlns';
|
||||
|
||||
|
||||
is $obj->start_tag({ name => 'test' }), '<test >', 'start_tag';
|
||||
is $obj->end_tag({ name => 'test' }), '</test >', 'end_tag';
|
||||
is $obj->start_tag({ name => 'test' }), '<test>', 'start_tag';
|
||||
is $obj->end_tag({ name => 'test' }), '</test>', 'end_tag';
|
||||
|
||||
ok $obj->set_value('test'), 'set_value';
|
||||
is $obj->get_value(), 'test', 'get_value';
|
||||
@@ -54,7 +54,7 @@ is $obj->get_value(), 'test2', 'get_value on attr value';
|
||||
|
||||
$obj->set_value(undef);
|
||||
|
||||
is $obj->serialize({ name => 'foo' }), '<foo ></foo >'
|
||||
is $obj->serialize({ name => 'foo' }), '<foo></foo>'
|
||||
, 'serialize undef value with name';
|
||||
is $obj->serialize(), q{}, 'serialize undef value without name';
|
||||
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Test::More tests => 3;
|
||||
use Test::More tests => 5;
|
||||
use Scalar::Util qw(blessed);
|
||||
use_ok qw(SOAP::WSDL::XSD::Typelib::Builtin::anyType);
|
||||
|
||||
is SOAP::WSDL::XSD::Typelib::Builtin::anyType->get_xmlns(), 'http://www.w3.org/2001/XMLSchema', 'get_xmlns';
|
||||
is SOAP::WSDL::XSD::Typelib::Builtin::anyType->serialize(), q{}, 'serialize to empty';
|
||||
|
||||
is SOAP::WSDL::XSD::Typelib::Builtin::anyType->start_tag(), q{}, 'serialize to empty';
|
||||
is SOAP::WSDL::XSD::Typelib::Builtin::anyType->start_tag({ name => 'foo'}), q{<foo>}, 'serialize with name';
|
||||
exit 0;
|
||||
|
||||
__END__
|
||||
|
||||
@@ -46,7 +46,7 @@ is "$bool", '0', 'stringification';
|
||||
|
||||
ok $bool->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType'), 'inheritance';
|
||||
|
||||
is $bool->serialize({ name => 'test'}), '<test >false</test >';
|
||||
is $bool->serialize({ name => 'test'}), '<test>false</test>';
|
||||
is $bool->serialize(), 'false';
|
||||
|
||||
$bool->delete_value();
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
use Test::More tests => 30;
|
||||
use strict;
|
||||
use Carp qw(cluck);
|
||||
|
||||
$SIG{__WARN__} = sub { cluck @_ };
|
||||
use warnings;
|
||||
#use Carp qw(cluck);
|
||||
#
|
||||
#$SIG{__WARN__} = sub { cluck @_ };
|
||||
#use warnings;
|
||||
use lib '../lib';
|
||||
use Date::Format;
|
||||
use Date::Parse;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use Test::More tests => 7;
|
||||
use strict;
|
||||
use warnings;
|
||||
use lib '../lib';
|
||||
use Test::More tests => 7;
|
||||
use Date::Parse;
|
||||
use Date::Format;
|
||||
|
||||
|
||||
@@ -20,5 +20,5 @@ is $obj->serialize, '& "Aber" <test>'
|
||||
, 'escape text on serialization';
|
||||
|
||||
is $obj->serialize({ name => 'test'})
|
||||
, '<test >& "Aber" <test></test >'
|
||||
, '<test>& "Aber" <test></test>'
|
||||
, 'Serialization with name';
|
||||
@@ -19,5 +19,5 @@ is $obj->serialize(), '& "Aber" <test>'
|
||||
, 'escape text on serialization';
|
||||
|
||||
is $obj->serialize({ name => 'test'})
|
||||
, '<test >& "Aber" <test></test >'
|
||||
, '<test>& "Aber" <test></test>'
|
||||
, 'Serialization with name';
|
||||
@@ -9,22 +9,48 @@ package MyEmptyType2;
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
__PACKAGE__->_factory();
|
||||
|
||||
package MyType;
|
||||
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
|
||||
my %test_of :ATTR(:get<test>);
|
||||
|
||||
__PACKAGE__->_factory(
|
||||
[ 'test' ],
|
||||
{
|
||||
test => \%test_of,
|
||||
},
|
||||
{
|
||||
test => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
}
|
||||
package MyAttribute;
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::Attribute
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||
);
|
||||
|
||||
package MyType;
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
{
|
||||
my %test_of :ATTR(:get<test>);
|
||||
|
||||
__PACKAGE__->_factory(
|
||||
[ 'test' ],
|
||||
{ test => \%test_of, },
|
||||
{ test => 'SOAP::WSDL::XSD::Typelib::Builtin::string', }
|
||||
);
|
||||
}
|
||||
|
||||
package MyElement;
|
||||
use base qw(
|
||||
SOAP::WSDL::XSD::Typelib::Element
|
||||
MyType
|
||||
);
|
||||
|
||||
__PACKAGE__->__set_name( 'MyElement' );
|
||||
|
||||
package MyElement::_ATTR;
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::AttributeSet);
|
||||
{
|
||||
my %test_of :ATTR(:get<test>);
|
||||
my %test2_of :ATTR(:get<test2>);
|
||||
__PACKAGE__->_factory(
|
||||
[ 'test', 'test2' ],
|
||||
{
|
||||
test => \%test_of,
|
||||
test2 => \%test2_of,
|
||||
},
|
||||
{
|
||||
test => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||
test2 => 'MyAttribute',
|
||||
}
|
||||
);
|
||||
}
|
||||
package MyType2;
|
||||
|
||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||
@@ -42,21 +68,18 @@ __PACKAGE__->_factory(
|
||||
);
|
||||
|
||||
package main;
|
||||
use Test::More tests => 100;
|
||||
use Test::More tests => 109;
|
||||
use Storable;
|
||||
|
||||
my $have_warn = eval { use Test::Warn; 1; };
|
||||
my $have_warn = eval { require Test::Warn; import Test::Warn; 1; };
|
||||
|
||||
my $obj;
|
||||
|
||||
$obj = MyEmptyType->new();
|
||||
is $obj->serialize, '';
|
||||
is $obj->serialize({ name => 'test'}), '<test />';
|
||||
|
||||
$obj = MyEmptyType2->new();
|
||||
is $obj->serialize, '';
|
||||
is $obj->serialize({ name => 'test'}), '<test />';
|
||||
|
||||
for my $class (qw{MyEmptyType MyEmptyType2}) {
|
||||
$obj = $class->new();
|
||||
is $obj->serialize, '', "$class object serializes to q{}";
|
||||
is $obj->serialize({ name => 'test'}), '<test/>', "$class object serializes to <test/> with name=test";
|
||||
}
|
||||
|
||||
$obj = MyType->new({});
|
||||
isa_ok $obj, 'MyType';
|
||||
@@ -67,7 +90,7 @@ is scalar keys %{ $hash_of_ref }, 0;
|
||||
|
||||
SKIP: {
|
||||
skip 'Cannot test warnings without Test::Warn', 1 if not $have_warn;
|
||||
warning_is { $obj->add_test() } 'attempting to add empty value to MyType';
|
||||
warning_is( sub { $obj->add_test() }, 'attempting to add empty value to MyType' );
|
||||
}
|
||||
|
||||
$obj = MyType->new({ test => 'Test1'});
|
||||
@@ -75,16 +98,17 @@ isa_ok $obj, 'MyType';
|
||||
isa_ok $obj->get_test, 'SOAP::WSDL::XSD::Typelib::Builtin::string';
|
||||
is $obj->get_test, 'Test1', 'element content';
|
||||
|
||||
$obj = MyType->new({
|
||||
test => SOAP::WSDL::XSD::Typelib::Builtin::string->new({
|
||||
$obj = MyType->new({
|
||||
test => SOAP::WSDL::XSD::Typelib::Builtin::string->new({
|
||||
value => 'Test2'
|
||||
})
|
||||
});
|
||||
|
||||
isa_ok $obj, 'MyType';
|
||||
isa_ok $obj->get_test, 'SOAP::WSDL::XSD::Typelib::Builtin::string';
|
||||
is $obj->get_test, 'Test2', 'element content';
|
||||
|
||||
$obj = MyType->new({
|
||||
$obj = MyType->new({
|
||||
test => { value => 'Test2' } # just a trick - pass it unaltered to new...
|
||||
});
|
||||
isa_ok $obj, 'MyType';
|
||||
@@ -94,17 +118,18 @@ is $obj->get_test, 'Test2', 'element content';
|
||||
$hash_of_ref = $obj->as_hash_ref();
|
||||
is $hash_of_ref->{ test }, 'Test2';
|
||||
|
||||
$obj = MyType->new({
|
||||
$obj = MyType->new({
|
||||
test => [
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::string->new({
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::string->new({
|
||||
value => 'Test'
|
||||
}),
|
||||
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::string->new({
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::string->new({
|
||||
value => 'Test2'
|
||||
})
|
||||
],
|
||||
});
|
||||
|
||||
isa_ok $obj, 'MyType';
|
||||
isa_ok $obj->get_test, 'ARRAY';
|
||||
is $obj->get_test()->[0], 'Test', 'element content (list content [0])';
|
||||
@@ -128,24 +153,21 @@ is $nested->get_test->[0], $obj;
|
||||
$nested = MyType2->new({
|
||||
test => {
|
||||
test => [
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::string->new({
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::string->new({
|
||||
value => 'Test'
|
||||
}),
|
||||
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::string->new({
|
||||
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::string->new({
|
||||
value => 'Test2'
|
||||
})
|
||||
],
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
$hash_of_ref = $nested->as_hash_ref();
|
||||
is $hash_of_ref->{ test }->{ test }->[1], 'Test2';
|
||||
|
||||
|
||||
# isnt $nested->get_test->[0], $obj, 'element identity';
|
||||
|
||||
$obj = MyType->new();
|
||||
isa_ok $obj, 'MyType';
|
||||
is $obj->get_test, undef, 'undefined element content';
|
||||
@@ -168,7 +190,32 @@ for my $count (1..5) {
|
||||
}
|
||||
}
|
||||
|
||||
# TODO - remove after *{ "$class\::$name"" } methods are gone
|
||||
$obj->set_test();
|
||||
is $obj->get_test, (), 'removed element content';
|
||||
|
||||
$obj = MyEmptyType->new();
|
||||
eval {
|
||||
isa_ok $obj->attr() , 'SOAP::WSDL::XSD::Typelib::AttributeSet';
|
||||
};
|
||||
like $@, qr{\s has \s no \s attributes}x;
|
||||
|
||||
$obj = MyElement->new();
|
||||
isa_ok $obj->attr() , 'SOAP::WSDL::XSD::Typelib::AttributeSet';
|
||||
|
||||
my $attr = $obj->attr({ test => 'TestAttribute',
|
||||
test2 => 'TestAttribute2'
|
||||
});
|
||||
isa_ok $attr, 'SOAP::WSDL::XSD::Typelib::AttributeSet';
|
||||
is $attr->serialize(), q{ test="TestAttribute" test2="TestAttribute2"}, 'attribute serialization';
|
||||
|
||||
is $obj->serialize(),
|
||||
q{<MyElement test="TestAttribute" test2="TestAttribute2"/>},
|
||||
'Serialization with attributes';
|
||||
|
||||
$obj->attr()->set_test2('test');
|
||||
is $obj->serialize(),
|
||||
q{<MyElement test="TestAttribute" test2="test"/>},
|
||||
'Serialization with attributes';
|
||||
|
||||
$obj = MyType->new();
|
||||
|
||||
@@ -181,14 +228,12 @@ is $obj->get_test, undef;
|
||||
eval { $foo = @{ $obj->get_test() } };
|
||||
if (! $@) {
|
||||
is $foo, undef;
|
||||
# like $warnings, qr{ uninitialized \s value \s in array \s dereference }x, 'undef warning';
|
||||
}
|
||||
}
|
||||
else {
|
||||
like $@ , qr{Can't \s use \s an \s undefined}x, 'get_ELEMENT still undef on ARRAYIFY';
|
||||
# pass 'failed array dereference';
|
||||
}
|
||||
|
||||
$obj->test(
|
||||
$obj->set_test(
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::string->new({ value => 'TestString0'})
|
||||
);
|
||||
}
|
||||
@@ -197,15 +242,15 @@ eval { is @{ $obj->get_test() }, 1, 'ARRAYIFY get_ELEMENT' };
|
||||
fail 'cannot ARRAYIFY get_ELEMENT' if ($@);
|
||||
|
||||
my @serialized = (
|
||||
'<test >TestString0</test ><test >TestString1</test >',
|
||||
'<test >TestString0</test ><test >TestString1</test ><test >TestString2</test >',
|
||||
'<test >TestString0</test ><test >TestString1</test ><test >TestString2</test ><test >TestString3</test >',
|
||||
'<test >TestString0</test ><test >TestString1</test ><test >TestString2</test ><test >TestString3</test ><test >TestString4</test >',
|
||||
'<test >TestString0</test ><test >TestString1</test ><test >TestString2</test ><test >TestString3</test ><test >TestString4</test ><test >TestString5</test >',
|
||||
'<test>TestString0</test><test>TestString1</test>',
|
||||
'<test>TestString0</test><test>TestString1</test><test>TestString2</test>',
|
||||
'<test>TestString0</test><test>TestString1</test><test>TestString2</test><test>TestString3</test>',
|
||||
'<test>TestString0</test><test>TestString1</test><test>TestString2</test><test>TestString3</test><test>TestString4</test>',
|
||||
'<test>TestString0</test><test>TestString1</test><test>TestString2</test><test>TestString3</test><test>TestString4</test><test>TestString5</test>',
|
||||
);
|
||||
|
||||
for my $count (1..5) {
|
||||
$obj->test(
|
||||
$obj->add_test(
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::string->new({ value => "TestString$count" })
|
||||
);
|
||||
|
||||
@@ -216,14 +261,18 @@ for my $count (1..5) {
|
||||
is $obj->get_test->[$index], "TestString$index";
|
||||
}
|
||||
is $obj->serialize(), $serialized[$count -1];
|
||||
|
||||
|
||||
}
|
||||
|
||||
my $clone = Storable::thaw( Storable::freeze( $obj ));
|
||||
is $clone->get_test()->[0], 'TestString0';
|
||||
|
||||
## failure tests
|
||||
|
||||
eval {
|
||||
$obj = MyType->new({
|
||||
$obj = MyType->new({
|
||||
test => [
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::string->new({
|
||||
SOAP::WSDL::XSD::Typelib::Builtin::string->new({
|
||||
value => 'Test'
|
||||
}),
|
||||
|
||||
@@ -234,15 +283,22 @@ eval {
|
||||
like $@, qr{cannot \s use \s CODE}xms;
|
||||
|
||||
eval {
|
||||
$obj = MyType->new({
|
||||
$obj = MyType->new({
|
||||
test => \&CORE::die,
|
||||
});
|
||||
};
|
||||
like $@, qr{cannot \s use \s CODE}xms;
|
||||
|
||||
# TODO ignore XMLNS (for now)
|
||||
$obj = MyType->new({ xmlns => 'fubar'});
|
||||
ok defined $obj;
|
||||
TODO: {
|
||||
local $TODO = "Support XML namespaces";
|
||||
is $obj->get_xmlns(), 'fubar';
|
||||
}
|
||||
|
||||
eval {
|
||||
$obj = MyType->new({
|
||||
$obj = MyType->new({
|
||||
foobar => 'fubar'
|
||||
});
|
||||
};
|
||||
@@ -258,16 +314,13 @@ like $@, qr{Can't \s locate \s object \s method}x;
|
||||
eval { MyType->new({ FOO => 42 }) };
|
||||
like $@, qr{unknown \s field \s}xm;
|
||||
|
||||
my $clone = Storable::thaw( Storable::freeze( $obj ));
|
||||
is $clone->get_test()->[0], 'TestString0';
|
||||
|
||||
eval { SOAP::WSDL::XSD::Typelib::ComplexType::AUTOMETHOD() };
|
||||
like $@, qr{Cannot \s call}xm;
|
||||
|
||||
|
||||
eval { SOAP::WSDL::XSD::Typelib::ComplexType->_factory([], { test => {} }, {}) };
|
||||
like $@, qr{ No \s class \s given \s for \s }xms;
|
||||
|
||||
eval { SOAP::WSDL::XSD::Typelib::ComplexType->_factory([], { test => {} }, { test => 'HopeItDoesntExistOnYourSystem'}) };
|
||||
like $@, qr{ Can't \s locate \s HopeItDoesntExistOnYourSystem.pm }xms;
|
||||
|
||||
# print Dumper
|
||||
|
||||
@@ -10,7 +10,7 @@ __PACKAGE__->__set_name('MyElement');
|
||||
__PACKAGE__->__set_nillable(1);
|
||||
|
||||
package main;
|
||||
use Test::More tests => 11;
|
||||
use Test::More tests => 12;
|
||||
|
||||
my $obj;
|
||||
|
||||
@@ -25,8 +25,8 @@ isa_ok $obj, 'MyElement';
|
||||
is $obj->get_value(), 'Test';
|
||||
|
||||
$obj->set_value(undef);
|
||||
is $obj->serialize_qualified, '<MyElement xsi:nil="true" xmlns="http://www.w3.org/2001/XMLSchema" />';
|
||||
|
||||
is $obj->serialize_qualified, '<MyElement xsi:nil="true" xmlns="http://www.w3.org/2001/XMLSchema"/>';
|
||||
is $obj->serialize, '<MyElement xsi:nil="true"/>';
|
||||
$obj->__set_nillable(0);
|
||||
is $obj->__get_nillable(), 0;
|
||||
|
||||
@@ -35,7 +35,7 @@ like $@, qr{Cannot \s call}xms;
|
||||
eval { SOAP::WSDL::XSD::Typelib::Element::__set_nillable() };
|
||||
like $@, qr{Cannot \s call}xms;
|
||||
|
||||
is $obj->start_tag({empty => 1}), '<MyElement />';
|
||||
is $obj->start_tag({empty => 1}), '<MyElement/>';
|
||||
is $obj->start_tag({nil => 1}), '', 'empty string with nil option and NILLABLE false';
|
||||
$obj->set_value('Test');
|
||||
|
||||
|
||||
20
t/acceptance/wsdl/WSDLParser-import.wsdl
Normal file
20
t/acceptance/wsdl/WSDLParser-import.wsdl
Normal file
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
|
||||
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
|
||||
xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="urn:HelloWorld"
|
||||
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
|
||||
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
|
||||
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
|
||||
targetNamespace="urn:HelloWorld"
|
||||
xmlns="http://schemas.xmlsoap.org/wsdl/">
|
||||
<import namespace="urn:HelloWorld" location="WSDLParser-imported.wsdl"/>
|
||||
|
||||
<service name="Service1">
|
||||
<port name="Service1Soap" binding="s0:Service1Soap">
|
||||
<soap:address
|
||||
location="http://localhost:81/soap-wsdl-test/helloworld.pl" />
|
||||
</port>
|
||||
</service>
|
||||
|
||||
</definitions>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user