Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
874251225f | ||
|
|
2bad767211 | ||
|
|
7ca2154ad6 | ||
|
|
eb096ad88e | ||
|
|
3cfeebae54 | ||
|
|
a9033164e6 | ||
|
|
84b53d9261 | ||
|
|
b955c5ad79 | ||
|
|
080b211e4e | ||
|
|
fa4d5dd884 | ||
|
|
3d11524449 | ||
|
|
21efa286af | ||
|
|
008d06b72a | ||
|
|
c6a48ba84b | ||
|
|
30be0da3dc | ||
|
|
2347a88353 | ||
|
|
9e85f63aa0 | ||
|
|
7ba2f93e44 | ||
|
|
099c83b6bc | ||
|
|
f63138fc87 | ||
|
|
fd0854e34a | ||
|
|
c2da74b5ae | ||
|
|
7ba1959888 | ||
|
|
a554e87f49 | ||
|
|
312f3d6bbd |
@@ -1,40 +1,53 @@
|
|||||||
use Module::Build;
|
use Module::Build;
|
||||||
Module::Build->new(
|
use version;
|
||||||
dist_abstract => 'SOAP with WSDL support',
|
$build = Module::Build->new(
|
||||||
dist_name => 'SOAP-WSDL',
|
dist_author => 'Martin Kutter <martin.kutter@fen-net.de>',
|
||||||
dist_version => '2.00_07',
|
create_makefile_pl => 'passthrough',
|
||||||
module_name => 'SOAP::WSDL',
|
dist_abstract => 'SOAP with WSDL support',
|
||||||
license => 'artistic',
|
dist_name => 'SOAP-WSDL',
|
||||||
requires => {
|
dist_version => '2.00_29',
|
||||||
'Class::Std' => q/v0.0.8/,
|
module_name => 'SOAP::WSDL',
|
||||||
'Class::Std::Storable' => 0,
|
license => 'artistic',
|
||||||
'SOAP::Lite' => 0,
|
requires => {
|
||||||
'List::Util' => 0,
|
# 5.6.x is way too buggy and has no unicode support
|
||||||
'File::Basename' => 0,
|
# for us. SOAP-WSDL relies on unicode (WS-I demands it)
|
||||||
'File::Path' => 0,
|
# and triggers several 5.6 bugs...
|
||||||
'XML::XPath' => 0,
|
'perl' => q(5.8.0),
|
||||||
'XML::LibXML' => 0,
|
'Class::Std::Fast' => qv(0.0.5),
|
||||||
'XML::SAX::Base' => 0,
|
'Data::Dumper' => 0,
|
||||||
'XML::SAX::ParserFactory' => 0,
|
'Date::Parse' => 0,
|
||||||
'XML::Parser::Expat' => 0,
|
'Date::Format' => 0,
|
||||||
},
|
'File::Basename' => 0,
|
||||||
buildrequires => {
|
'File::Path' => 0,
|
||||||
'Benchmark' => 0,
|
'Getopt::Long' => 0,
|
||||||
'Cwd' => 0,
|
'List::Util' => 0,
|
||||||
'Test::More' => 0,
|
'LWP::UserAgent' => 0,
|
||||||
'SOAP::Lite' => 0,
|
'Template' => 0,
|
||||||
'Class::Std' => 0.0.8,
|
'Term::ReadKey' => 0,
|
||||||
'Class::Std::Storable' => 0,
|
'XML::Parser::Expat' => 0,
|
||||||
'List::Util' => 0,
|
},
|
||||||
'File::Basename' => 0,
|
buildrequires => {
|
||||||
'File::Path' => 0,
|
'Class::Std::Fast' => qv(0.0.5),
|
||||||
'XML::Simple' => 0,
|
'Cwd' => 0,
|
||||||
'XML::LibXML' => 0,
|
'Date::Parse' => 0,
|
||||||
'XML::Parser::Expat' => 0,
|
'Date::Format' => 0,
|
||||||
'XML::SAX::Base' => 0,
|
'Getopt::Long' => 0,
|
||||||
'XML::SAX::ParserFactory' => 0,
|
'List::Util' => 0,
|
||||||
'Pod::Simple::Text' => 0,
|
'LWP::UserAgent' => 0,
|
||||||
'XML::SAX::ParserFactory' => 0,
|
'File::Basename' => 0,
|
||||||
},
|
'File::Path' => 0,
|
||||||
recursive_test_files => 1,
|
'File::Spec' => 0,
|
||||||
)->create_build_script;
|
'Storable' => 0,
|
||||||
|
'Test::More' => 0,
|
||||||
|
'Template' => 0,
|
||||||
|
'XML::Parser::Expat' => 0,
|
||||||
|
},
|
||||||
|
recursive_test_files => 1,
|
||||||
|
meta_add => {
|
||||||
|
no_index => {
|
||||||
|
directory => 'lib/SOAP/WSDL/Generator/Template/XSD/',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
$build->add_build_element('tt');
|
||||||
|
$build->create_build_script;
|
||||||
|
|||||||
@@ -0,0 +1,573 @@
|
|||||||
|
Release notes for SOAP::WSDL 2.00_29
|
||||||
|
-------
|
||||||
|
|
||||||
|
I'm proud to present a new pre-release version of SOAP::WSDL.
|
||||||
|
|
||||||
|
SOAP::WSDL is a toolkit for creating WSDL-based SOAP client interfaces in perl.
|
||||||
|
|
||||||
|
Features:
|
||||||
|
|
||||||
|
* WSDL based SOAP client
|
||||||
|
o SOAP1.1 support
|
||||||
|
o Supports document/literal message style/encoding
|
||||||
|
* Code generator for generating WSDL-based interface classes
|
||||||
|
o Generated code includes usage documentation for the web service interface
|
||||||
|
* Easy-to use API
|
||||||
|
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
|
||||||
|
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
|
||||||
|
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.
|
||||||
|
The following plugins are supported:
|
||||||
|
o Transport plugins via SOAP::WSDL::Factory::Transport
|
||||||
|
o Serializer plugins via SOAP::WSDL::Factory::Serializer
|
||||||
|
o Deserializer plugins via SOAP::WSDL::Factory::Serializer
|
||||||
|
|
||||||
|
The following changes have been made:
|
||||||
|
|
||||||
|
2.00_29
|
||||||
|
|
||||||
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||||
|
|
||||||
|
* #32188: minor bug found and fixed in WSDL generation
|
||||||
|
* [ 1871175 ] Can't delete attributes from ComplexType objects
|
||||||
|
|
||||||
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
|
* Updated SOAP::WSDL::Manual::XSD
|
||||||
|
* Removed pod directives from templates to avoid confusing CPAN's pod
|
||||||
|
viewer
|
||||||
|
* Initial (incomplete) XML attribute support
|
||||||
|
* Updated test suite
|
||||||
|
|
||||||
|
2.00_28
|
||||||
|
|
||||||
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||||
|
|
||||||
|
* #32062: minor doc fixes
|
||||||
|
* [ 1852988 ] Generated Interface POD is invalid
|
||||||
|
* [ 1855583 ] t/SOAP/WSDL/XSD/Typelib/ComplexType.t requires Test::Warn
|
||||||
|
|
||||||
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
|
* Updated SOAP::WSDL::Manual::WS_I to reflect new Server modules
|
||||||
|
|
||||||
|
2.00_27
|
||||||
|
|
||||||
|
The following features were added (the numbers in square brackets are the
|
||||||
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||||
|
|
||||||
|
* [ 1850793 ] Add a to_hash_ref method
|
||||||
|
* [ 1844427 ] Support multiple parts in body
|
||||||
|
|
||||||
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||||
|
|
||||||
|
* [ 1850795 ] attributes referencing types in default namespace throw
|
||||||
|
* [ 1844458 ] Add warning when generating Interface with multiple parts
|
||||||
|
* [ 1843841 ] Grammar/typos in Manual.pod
|
||||||
|
* [ 1843799 ] ./Build test fails due to testcount mismatch not IO::Scalar
|
||||||
|
* [ 1845077 ] Top level simpleType elements don't serialize correctly
|
||||||
|
|
||||||
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
|
* Fixed serializing complexType elements with no elements to empty element
|
||||||
|
* Enhanced test suite
|
||||||
|
* Documentation improvements
|
||||||
|
|
||||||
|
2.00_26
|
||||||
|
|
||||||
|
The following features were added (the numbers in square brackets are the
|
||||||
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||||
|
|
||||||
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||||
|
|
||||||
|
* [ 1843195 ] t/013_complexType.t still requires Class::Std::Storable
|
||||||
|
* [ 1843590 ] Tests broken on Cygwin
|
||||||
|
|
||||||
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
|
* Added examples
|
||||||
|
* Added Content-length header to CGI output
|
||||||
|
|
||||||
|
2.00_25
|
||||||
|
---
|
||||||
|
WARNING: INCOMPATIBLE CHANGE:
|
||||||
|
|
||||||
|
SOAP::WSDL now uses Class::Std::Fast. Read the MIGRATING guide for
|
||||||
|
upgrading from previous versions.
|
||||||
|
You probably need to re-generate all your interfaces.
|
||||||
|
|
||||||
|
WARNING: INCOMPATIBLE CHANGE:
|
||||||
|
|
||||||
|
SOAP::WSDL::XSD::Typelib::anySimpleType based objects no longer serialize
|
||||||
|
to their XML value on stringification.
|
||||||
|
This means that strings are no longer XML-escaped when the simpleType
|
||||||
|
containing the string is printed or used like this:
|
||||||
|
|
||||||
|
my $value = "$simpleType";
|
||||||
|
|
||||||
|
Note that ComplexType objects still serialize to their XML on
|
||||||
|
stringification. This Change is due to the demands of applications
|
||||||
|
embedding SOAP::WSDL::XSD::Typelib objects in templates - it would mean
|
||||||
|
a nasty ->get_value for every (simple) value.
|
||||||
|
|
||||||
|
The following features were added (the numbers in square brackets are the
|
||||||
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||||
|
|
||||||
|
* [ 1837347 ] Use Class::Std::Fast
|
||||||
|
Class::Std::Fast allows optimizations which almost double SOAP::WSDL's
|
||||||
|
performance and reduce code size. Class::Std::Fast also opens the door
|
||||||
|
for even faster XS implementations.
|
||||||
|
* [ 1842436 ] Add SOAP Server
|
||||||
|
|
||||||
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||||
|
|
||||||
|
* [ 1842418 ] Message parser eats up whitespaces between entities
|
||||||
|
* [ 1839820 ] encoding parameter of Content-Type header set incorrectly
|
||||||
|
* [ 1839851 ] token in UPPERCASE in default typemap
|
||||||
|
* [ 1839690 ] Can't use two prefixes for namespace in WSDL
|
||||||
|
* [ 1839833 ] incorrect encoding/decoding of double-quote
|
||||||
|
|
||||||
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
|
* Errors in typemap generation have been fixed
|
||||||
|
* XML parser speedups
|
||||||
|
* The test suite has been improved
|
||||||
|
|
||||||
|
2.00_24
|
||||||
|
---
|
||||||
|
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
|
||||||
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
|
||||||
|
|
||||||
|
* #30685: Error in MessageParser when using __SKIP__ in typemap
|
||||||
|
* [ 1831398 ] Badd class names for atomic typed elements
|
||||||
|
* [ 1828240 ] POD Defects
|
||||||
|
* [ 1792348 ] 006_client.t requires SOAP::Lite (again)
|
||||||
|
|
||||||
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
|
* The test suite has been improved
|
||||||
|
* Documentation has been improved
|
||||||
|
|
||||||
|
2.00_23
|
||||||
|
---
|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|
* 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
|
||||||
|
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:
|
||||||
|
|
||||||
|
* 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
|
||||||
|
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:
|
||||||
|
|
||||||
|
* 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
|
||||||
|
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
|
||||||
|
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:
|
||||||
|
|
||||||
|
* 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
|
||||||
|
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
|
||||||
|
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:
|
||||||
|
|
||||||
|
* Documentation improvements
|
||||||
|
|
||||||
|
2.00_18
|
||||||
|
----
|
||||||
|
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
|
||||||
|
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:
|
||||||
|
|
||||||
|
* Documentation improvements
|
||||||
|
* Test updates
|
||||||
|
* 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
|
||||||
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||||
|
|
||||||
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
|
||||||
|
* [ 1772617 ] SOAP Header not working
|
||||||
|
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
|
||||||
|
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
|
||||||
|
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,
|
||||||
|
invalid XML will be generated).
|
||||||
|
|
||||||
|
* Added Loopback Transport backend.
|
||||||
|
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
|
||||||
|
transport backend
|
||||||
|
|
||||||
|
* Fixed set_soap_version method in SOAP::WSDL::Client.
|
||||||
|
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
|
||||||
|
when false and true when true.
|
||||||
|
|
||||||
|
* 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
|
||||||
|
hierarchy have been removed.
|
||||||
|
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
|
||||||
|
classes
|
||||||
|
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.
|
||||||
|
|
||||||
|
* A few documentation errors have been fixed
|
||||||
|
|
||||||
|
* Misspelled default Typemap and Interface prefixes have been corrected
|
||||||
|
|
||||||
|
2.00_16
|
||||||
|
----
|
||||||
|
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
|
||||||
|
SOAP::WSDL now supports a greater variety of XML Schema type definitions.
|
||||||
|
Note that XML Schema support is still incomplete, though.
|
||||||
|
|
||||||
|
* [ 1797943 ] Create Perl Hash Deserializer
|
||||||
|
There's a new deserializer which outputs perl hashes as data structures.
|
||||||
|
Much like XML::Simple, but faster. No XML Attribute support, though.
|
||||||
|
|
||||||
|
* [ 1797678 ] Move Code generator from WSDL::Definitions to separate class
|
||||||
|
|
||||||
|
* [ 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
|
||||||
|
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
|
||||||
|
binding.
|
||||||
|
|
||||||
|
* [ 1803763 ] nonNegativeInteger misspelled in Schema::Builtin
|
||||||
|
|
||||||
|
* [ 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
|
||||||
|
no_dispatch is set.
|
||||||
|
006_client.t now sets outputxml(1), to be really sure.
|
||||||
|
|
||||||
|
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
|
||||||
|
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
|
||||||
|
subversion repository in the attic directory, though.
|
||||||
|
|
||||||
|
2.00_15
|
||||||
|
----
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
2.00_14
|
||||||
|
----
|
||||||
|
|
||||||
|
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
|
||||||
|
The package has been re-added
|
||||||
|
|
||||||
|
* [ 1792221 ] class_resolver not set from ::Client in 2.00_13
|
||||||
|
Changed to set class_resolver correctly.
|
||||||
|
|
||||||
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
|
* 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
|
||||||
|
* Documentation has been improved
|
||||||
|
- refined ::Factory:: modules' documentation
|
||||||
|
* Several tests have been added
|
||||||
|
* XSD classes have been improved for testability
|
||||||
|
|
||||||
|
2.00_13
|
||||||
|
----
|
||||||
|
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
|
||||||
|
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
|
||||||
|
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
|
||||||
|
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,
|
||||||
|
and adds the local time zone if none is given.
|
||||||
|
|
||||||
|
* [1785646] SOAPAction header not set from soap:operation soapAction
|
||||||
|
SOAP::WSDL now sets the SOAPAction header correctly.
|
||||||
|
|
||||||
|
The following uncategorized improvements have been made:
|
||||||
|
|
||||||
|
* Documentation improvements
|
||||||
|
|
||||||
|
2.00_12
|
||||||
|
----
|
||||||
|
|
||||||
|
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
|
||||||
|
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
|
||||||
|
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
|
||||||
|
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
|
||||||
|
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
|
||||||
|
method.
|
||||||
|
|
||||||
|
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
|
||||||
|
exist.
|
||||||
|
|
||||||
|
The following uncategorized improvements have been made
|
||||||
|
|
||||||
|
* The number of dependencies has been reduced. SOAP::WSDL no longer requires the
|
||||||
|
following modules to be installed:
|
||||||
|
- XML::SAX::Base
|
||||||
|
- XML::SAX::ParserFactory
|
||||||
|
- Pod::Simple::Text
|
||||||
|
- XML::LibXML
|
||||||
|
|
||||||
|
* The missing prerequisite Template has been added.
|
||||||
|
* Documentation has been improved:
|
||||||
|
- WS-I Compliance document added.
|
||||||
|
|
||||||
|
|
||||||
|
2.00_10
|
||||||
|
----
|
||||||
|
* Changed Makefile.PL to use Module::Build (passthrough mode)
|
||||||
|
* fixed element ref="" handling
|
||||||
|
|
||||||
|
2.00_09
|
||||||
|
----
|
||||||
|
* 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
|
||||||
|
child objects.
|
||||||
|
This provides early feedback to developers.
|
||||||
|
* 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
|
||||||
|
hash refs, list refs and objects as parameter to set_value() and new().
|
||||||
|
* 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
|
||||||
|
separator)
|
||||||
|
- 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
|
||||||
|
* fixed explain in SimpleType, ComplexType and Element
|
||||||
|
|
||||||
|
2.00_07 and below
|
||||||
|
---
|
||||||
|
* 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 stream based WSDL parser.
|
||||||
|
Parses WSDL into objects. Objects can serialize data, and explain how to use the
|
||||||
|
service(s) they make up (output documentation).
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
HACKING
|
||||||
|
=======
|
||||||
|
|
||||||
Development of SOAP::WSDL takes place on sourceforge.net.
|
Development of SOAP::WSDL takes place on sourceforge.net.
|
||||||
|
|
||||||
There's a svn repository available at
|
There's a svn repository available at
|
||||||
@@ -11,35 +14,118 @@ so if you feel your changes are urgent, please set up a sourceforge account
|
|||||||
and ask me for commit permissions on the repository - I will happily accept
|
and ask me for commit permissions on the repository - I will happily accept
|
||||||
you as co-author.
|
you as co-author.
|
||||||
|
|
||||||
The (my) current roadmap for SOAP::WSDL is:
|
TODO shows the current roadmap.
|
||||||
|
|
||||||
1.* Development of the 1.* tree has stopped - I won't get past 1.2x anymore...
|
SOAP-WSDL CODING GUIDELINES
|
||||||
2.* WSDL -> Perl Class factory with offline WSDL processing
|
===========================
|
||||||
|
|
||||||
2.01
|
DESIGN PRINCIPLES
|
||||||
- WSDL support for the most common type definitions
|
-----------------
|
||||||
- Online-facility (SOAP::WSDL) using WSDL object tree directly
|
|
||||||
- usable code generator
|
|
||||||
- full namespace support when processing WSDL
|
|
||||||
- high performance when parsing WSDL messages - get nearly as fast as
|
|
||||||
XML::Simple...
|
|
||||||
|
|
||||||
2.02
|
SOAP-WSDL is designed for the following principles:
|
||||||
- Support for Apache-SOAP datatypes
|
|
||||||
- support for embedded atomic simpleType/complexType definitions
|
|
||||||
- Caching of WSDL object tree + generated code (when using SOAP::WSDL).
|
|
||||||
- Online-facility (SOAP::WSDL) using code generator via cache directory
|
|
||||||
|
|
||||||
Somewhere on the TODO list (in no particular order):
|
1. SPEED
|
||||||
|
A SOAP toolkit is useless, if it's not fast enough. Therefore SOAP::WSDL aims
|
||||||
|
at always being fast enough.
|
||||||
|
|
||||||
- validation
|
Please benchmark any contributions - if they slow down SOAP-WSDL (especially
|
||||||
- typemaps for use with the type="tns:MyComplexType" XML attribute
|
the XML parsing part), you should have good reasons.
|
||||||
- external entities support when parsing WSDL
|
|
||||||
- support all these XML Schema variants
|
|
||||||
- support creating XML Schmema definitions via SOAP::WSDL::XSD::* ('minimal conformant')
|
|
||||||
- support other Schema definition languages than XML::Schema (maybe RelaxNG?)
|
|
||||||
- factor out SOAP::WSDL::XSD into it's own namespace (maybe just XSD ?)
|
|
||||||
|
|
||||||
July 2007,
|
2. USABILITY
|
||||||
|
SOAP-WSDL is designed user-friendly. It tells the user whether it's
|
||||||
|
capable of handling some WSDL or not, it gives friendly error messages, and
|
||||||
|
if a user happens to call a non-existant method on XSD objects, they croak
|
||||||
|
with a list of available methods to ease development.
|
||||||
|
|
||||||
|
3. EXTENSIBILITY
|
||||||
|
If you plan an extension, look if the extension itself should be extensible,
|
||||||
|
and which extension points to use.
|
||||||
|
|
||||||
|
Creating new extension points is highly appreciated.
|
||||||
|
|
||||||
|
4. MAINTAINABILITY
|
||||||
|
SOAP::Lite unfortunately shows where a toolkit can go without focus on
|
||||||
|
maintainability. SOAP::WSDL tries to be highly maintainable and easy to
|
||||||
|
understand.
|
||||||
|
|
||||||
|
CODING STYLE
|
||||||
|
------------
|
||||||
|
|
||||||
|
The principles above dictate a clear, but not too lengthy coding style.
|
||||||
|
|
||||||
|
SOAP::WSDL's coding style in principle follows Perl Best Practices by
|
||||||
|
Damian Conway, but allows deviances for speed reasons
|
||||||
|
|
||||||
|
The following guidelines apply:
|
||||||
|
|
||||||
|
- Testing
|
||||||
|
* SOAP::WSDL has a test coverage of >95% and aims at 100%. Please write
|
||||||
|
a test first.
|
||||||
|
* Use author tests for testing guidelines. Disable author tests for
|
||||||
|
users - it's time consuming and of no use to have users run author tests.
|
||||||
|
|
||||||
|
- Indentation and formatting
|
||||||
|
* indent with spaces.
|
||||||
|
* indent 4 characters per level
|
||||||
|
* use \n (LF) for newlines, not CRLF
|
||||||
|
* use blank lines to separate paragraphs
|
||||||
|
* Coding style is similar to K&R (opening brace on last line, closing
|
||||||
|
brace on new line. No cuddled else)
|
||||||
|
* No trailing spaces allowed (except to indicate a blank line in a POD
|
||||||
|
source block)
|
||||||
|
|
||||||
|
- Flow control
|
||||||
|
* postfix if is allowed for single statements only. Preferably for flow
|
||||||
|
control only.
|
||||||
|
* postfix for, while, until are not allowed.
|
||||||
|
* unless is not allowed at all. Use if not.
|
||||||
|
* goto is only allowed for jumping into subs. Nothing else.
|
||||||
|
* redo, next, last etc. are preferred over goto.
|
||||||
|
|
||||||
|
- Strictness and Warnings
|
||||||
|
* always use strict and warnings. Switch off for the smallest block
|
||||||
|
possible, but switch of if there's a reason (don't let tools like
|
||||||
|
perlcritic fool you: no strict qw(refs); is often required.
|
||||||
|
|
||||||
|
- Naming
|
||||||
|
* variable names are lower case with _ separating words, except when
|
||||||
|
a XML Schema, SOAP, or WSDL name is name-giving (don't force portType to
|
||||||
|
become port_type)
|
||||||
|
* hashes should be named FOO_of, lists FOO_from, references FOO_ref.
|
||||||
|
* package names are CamelCase, except when a XML, SOAP or WSDL name is
|
||||||
|
name-giving (don't force 'int' to become 'Int'. However, simpleType
|
||||||
|
becomes SimpleType).
|
||||||
|
|
||||||
|
- Subroutines
|
||||||
|
* Subroutines shouldn't be more than around 50 lines long
|
||||||
|
* @_ should be unpacked. Deviances are allowed for speed reasons. If
|
||||||
|
you're not unpacking @_ in a sub of say, 5 lines or more, please comment
|
||||||
|
what you're doing.
|
||||||
|
* Always return. Always return. A single "return" allows perl to execute
|
||||||
|
the subroutine in question in void context, which saves it from putting
|
||||||
|
it's result in a temporary variable. Always return.
|
||||||
|
|
||||||
|
- POD and comments
|
||||||
|
* Comment extensively. Comments are the maintainer (and core developer's)
|
||||||
|
documentation - aid them where possible (your're probably doing yourself
|
||||||
|
a favor by adding extensive comments).
|
||||||
|
* Comment either in blocks or as hanging side comments (especially when
|
||||||
|
commenting @_ access).
|
||||||
|
Example:
|
||||||
|
|
||||||
|
sub baz {
|
||||||
|
# @_ not unpacked for speed reasons. Read:
|
||||||
|
# my ($self, $something, %args_of) = @_;
|
||||||
|
|
||||||
|
$_[0]->bar($_[1]); # read as $self->bar($something);
|
||||||
|
$_[0]->foo($_[2..$#]); # read as $self->foo(%args_of);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
* POD is located at end of file, preferably after __END__
|
||||||
|
* Complete POD coverage is essential. However, if the package in question
|
||||||
|
is used internally only, it's better to omit the POD completely - too many
|
||||||
|
PODs to look at confuse the average CPAN user.
|
||||||
|
|
||||||
|
July - November 2007,
|
||||||
|
|
||||||
Martin Kutter
|
Martin Kutter
|
||||||
@@ -1,9 +1,24 @@
|
|||||||
|
benchmark/01_expat.t
|
||||||
|
benchmark/hello.pl
|
||||||
|
benchmark/person.pl
|
||||||
|
benchmark/person.xml
|
||||||
|
benchmark/XSD/01_anyType.t
|
||||||
|
benchmark/XSD/02_anySimpleType.t
|
||||||
|
benchmark/XSD/03_string.t
|
||||||
bin/wsdl2perl.pl
|
bin/wsdl2perl.pl
|
||||||
Build.PL
|
Build.PL
|
||||||
CHANGES
|
Changes
|
||||||
|
example/cgi-bin/helloworld.pl
|
||||||
|
example/cgi-bin/person.pl
|
||||||
example/fortune.pl
|
example/fortune.pl
|
||||||
|
example/genericbarcode.pl
|
||||||
|
example/hello.pl
|
||||||
|
example/hello_compile.pl
|
||||||
|
example/hello_lite.pl
|
||||||
example/lib/MyElements/CountCookies.pm
|
example/lib/MyElements/CountCookies.pm
|
||||||
example/lib/MyElements/CountCookiesResponse.pm
|
example/lib/MyElements/CountCookiesResponse.pm
|
||||||
|
example/lib/MyElements/GenerateBarCode.pm
|
||||||
|
example/lib/MyElements/GenerateBarCodeResponse.pm
|
||||||
example/lib/MyElements/GetCitiesByCountry.pm
|
example/lib/MyElements/GetCitiesByCountry.pm
|
||||||
example/lib/MyElements/GetCitiesByCountryResponse.pm
|
example/lib/MyElements/GetCitiesByCountryResponse.pm
|
||||||
example/lib/MyElements/GetFortuneCookie.pm
|
example/lib/MyElements/GetFortuneCookie.pm
|
||||||
@@ -13,17 +28,50 @@ example/lib/MyElements/GetSpecificCookieResponse.pm
|
|||||||
example/lib/MyElements/GetWeather.pm
|
example/lib/MyElements/GetWeather.pm
|
||||||
example/lib/MyElements/GetWeatherResponse.pm
|
example/lib/MyElements/GetWeatherResponse.pm
|
||||||
example/lib/MyElements/int.pm
|
example/lib/MyElements/int.pm
|
||||||
|
example/lib/MyElements/ListPerson.pm
|
||||||
|
example/lib/MyElements/ListPersonResponse.pm
|
||||||
example/lib/MyElements/readNodeCount.pm
|
example/lib/MyElements/readNodeCount.pm
|
||||||
example/lib/MyElements/readNodeCountResponse.pm
|
example/lib/MyElements/readNodeCountResponse.pm
|
||||||
|
example/lib/MyElements/sayHello.pm
|
||||||
|
example/lib/MyElements/sayHelloResponse.pm
|
||||||
example/lib/MyElements/string.pm
|
example/lib/MyElements/string.pm
|
||||||
example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie.pm
|
example/lib/MyInterfaces/BarCode/BarCodeSoap.pm
|
||||||
example/lib/MyInterfaces/GlobalWeather.pm
|
example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie/FullerData_x0020_Fortune_x0020_CookieSoap.pm
|
||||||
|
example/lib/MyInterfaces/GlobalWeather/GlobalWeatherSoap.pm
|
||||||
|
example/lib/MyInterfaces/HelloWorld/HelloWorldSoap.pm
|
||||||
|
example/lib/MyInterfaces/TestService/TestPort.pm
|
||||||
|
example/lib/MyServer/HelloWorld/HelloWorldSoap.pm
|
||||||
|
example/lib/MyServer/TestService/TestPort.pm
|
||||||
|
example/lib/MyTypemaps/BarCode.pm
|
||||||
example/lib/MyTypemaps/FullerData_x0020_Fortune_x0020_Cookie.pm
|
example/lib/MyTypemaps/FullerData_x0020_Fortune_x0020_Cookie.pm
|
||||||
example/lib/MyTypemaps/GlobalWeather.pm
|
example/lib/MyTypemaps/GlobalWeather.pm
|
||||||
|
example/lib/MyTypemaps/HelloWorld.pm
|
||||||
|
example/lib/MyTypemaps/TestService.pm
|
||||||
|
example/lib/MyTypes/Address.pm
|
||||||
|
example/lib/MyTypes/ArrayOfContract.pm
|
||||||
|
example/lib/MyTypes/ArrayOfPerson.pm
|
||||||
|
example/lib/MyTypes/BarCodeData.pm
|
||||||
|
example/lib/MyTypes/BarcodeOption.pm
|
||||||
|
example/lib/MyTypes/BarcodeType.pm
|
||||||
|
example/lib/MyTypes/CheckSumMethod.pm
|
||||||
|
example/lib/MyTypes/Contract.pm
|
||||||
|
example/lib/MyTypes/ImageFormats.pm
|
||||||
|
example/lib/MyTypes/Person.pm
|
||||||
|
example/lib/MyTypes/PersonID.pm
|
||||||
|
example/lib/MyTypes/PhoneNumber.pm
|
||||||
|
example/lib/MyTypes/ShowTextPosition.pm
|
||||||
|
example/lib/MyTypes/test2.pm
|
||||||
|
example/lib/MyTypes/testExtended.pm
|
||||||
|
example/person.pl
|
||||||
|
example/person_compile.pl
|
||||||
|
example/visitor/visitor.pl
|
||||||
example/weather.pl
|
example/weather.pl
|
||||||
|
example/weather_wsdl.pl
|
||||||
|
example/wsdl/11_helloworld.wsdl
|
||||||
example/wsdl/FortuneCookie.xml
|
example/wsdl/FortuneCookie.xml
|
||||||
example/wsdl/genericbarcode.xml
|
example/wsdl/genericbarcode.xml
|
||||||
example/wsdl/globalweather.xml
|
example/wsdl/globalweather.xml
|
||||||
|
example/wsdl/Person.wsdl
|
||||||
HACKING
|
HACKING
|
||||||
lib/SOAP/WSDL.pm
|
lib/SOAP/WSDL.pm
|
||||||
lib/SOAP/WSDL/Base.pm
|
lib/SOAP/WSDL/Base.pm
|
||||||
@@ -31,31 +79,101 @@ lib/SOAP/WSDL/Binding.pm
|
|||||||
lib/SOAP/WSDL/Client.pm
|
lib/SOAP/WSDL/Client.pm
|
||||||
lib/SOAP/WSDL/Client/Base.pm
|
lib/SOAP/WSDL/Client/Base.pm
|
||||||
lib/SOAP/WSDL/Definitions.pm
|
lib/SOAP/WSDL/Definitions.pm
|
||||||
lib/SOAP/WSDL/Envelope.pm
|
lib/SOAP/WSDL/Deserializer/Hash.pm
|
||||||
|
lib/SOAP/WSDL/Deserializer/SOM.pm
|
||||||
|
lib/SOAP/WSDL/Deserializer/XSD.pm
|
||||||
|
lib/SOAP/WSDL/Expat/Base.pm
|
||||||
|
lib/SOAP/WSDL/Expat/Message2Hash.pm
|
||||||
lib/SOAP/WSDL/Expat/MessageParser.pm
|
lib/SOAP/WSDL/Expat/MessageParser.pm
|
||||||
lib/SOAP/WSDL/Expat/MessageStreamParser.pm
|
lib/SOAP/WSDL/Expat/MessageStreamParser.pm
|
||||||
|
lib/SOAP/WSDL/Expat/WSDLParser.pm
|
||||||
|
lib/SOAP/WSDL/Factory/Deserializer.pm
|
||||||
|
lib/SOAP/WSDL/Factory/Generator.pm
|
||||||
|
lib/SOAP/WSDL/Factory/Serializer.pm
|
||||||
|
lib/SOAP/WSDL/Factory/Transport.pm
|
||||||
|
lib/SOAP/WSDL/Generator/Template.pm
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD.pm
|
||||||
|
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
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/all.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/choice.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/complexContent.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/restriction.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/structure.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/restriction.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/variety.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/element.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/element/POD/structure.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Interface.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Interface/Body.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Interface/Header.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Interface/Operation.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Element.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Message.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/method_info.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Operation.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Part.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Type.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Server.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Server/POD/Message.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Server/POD/method_info.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Server/POD/Operation.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Server/POD/OutPart.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/simpleType.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/atomicType.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/contentModel.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/list.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/list.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/restriction.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/structure.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/restriction.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/Typemap.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Visitor.pm
|
||||||
|
lib/SOAP/WSDL/Generator/Visitor/Typelib.pm
|
||||||
|
lib/SOAP/WSDL/Generator/Visitor/Typemap.pm
|
||||||
lib/SOAP/WSDL/Manual.pod
|
lib/SOAP/WSDL/Manual.pod
|
||||||
|
lib/SOAP/WSDL/Manual/Deserializer.pod
|
||||||
lib/SOAP/WSDL/Manual/Glossary.pod
|
lib/SOAP/WSDL/Manual/Glossary.pod
|
||||||
|
lib/SOAP/WSDL/Manual/Parser.pod
|
||||||
|
lib/SOAP/WSDL/Manual/Serializer.pod
|
||||||
|
lib/SOAP/WSDL/Manual/WS_I.pod
|
||||||
|
lib/SOAP/WSDL/Manual/XSD.pod
|
||||||
lib/SOAP/WSDL/Message.pm
|
lib/SOAP/WSDL/Message.pm
|
||||||
lib/SOAP/WSDL/Operation.pm
|
lib/SOAP/WSDL/Operation.pm
|
||||||
lib/SOAP/WSDL/OpMessage.pm
|
lib/SOAP/WSDL/OpMessage.pm
|
||||||
lib/SOAP/WSDL/Parser.pod
|
|
||||||
lib/SOAP/WSDL/Part.pm
|
lib/SOAP/WSDL/Part.pm
|
||||||
lib/SOAP/WSDL/Port.pm
|
lib/SOAP/WSDL/Port.pm
|
||||||
lib/SOAP/WSDL/PortType.pm
|
lib/SOAP/WSDL/PortType.pm
|
||||||
lib/SOAP/WSDL/SAX/MessageHandler.pm
|
lib/SOAP/WSDL/Serializer/XSD.pm
|
||||||
lib/SOAP/WSDL/SAX/WSDLHandler.pm
|
lib/SOAP/WSDL/Server.pm
|
||||||
|
lib/SOAP/WSDL/Server/CGI.pm
|
||||||
lib/SOAP/WSDL/Service.pm
|
lib/SOAP/WSDL/Service.pm
|
||||||
|
lib/SOAP/WSDL/SOAP/Address.pm
|
||||||
|
lib/SOAP/WSDL/SOAP/Body.pm
|
||||||
|
lib/SOAP/WSDL/SOAP/Header.pm
|
||||||
|
lib/SOAP/WSDL/SOAP/HeaderFault.pm
|
||||||
|
lib/SOAP/WSDL/SOAP/Operation.pm
|
||||||
lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm
|
lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm
|
||||||
lib/SOAP/WSDL/SoapOperation.pm
|
lib/SOAP/WSDL/Transport/HTTP.pm
|
||||||
|
lib/SOAP/WSDL/Transport/Loopback.pm
|
||||||
|
lib/SOAP/WSDL/Transport/Test.pm
|
||||||
lib/SOAP/WSDL/TypeLookup.pm
|
lib/SOAP/WSDL/TypeLookup.pm
|
||||||
lib/SOAP/WSDL/Types.pm
|
lib/SOAP/WSDL/Types.pm
|
||||||
|
lib/SOAP/WSDL/XSD/Attribute.pm
|
||||||
|
lib/SOAP/WSDL/XSD/Builtin.pm
|
||||||
lib/SOAP/WSDL/XSD/ComplexType.pm
|
lib/SOAP/WSDL/XSD/ComplexType.pm
|
||||||
lib/SOAP/WSDL/XSD/Element.pm
|
lib/SOAP/WSDL/XSD/Element.pm
|
||||||
lib/SOAP/WSDL/XSD/Primitive.pm
|
|
||||||
lib/SOAP/WSDL/XSD/Schema.pm
|
lib/SOAP/WSDL/XSD/Schema.pm
|
||||||
lib/SOAP/WSDL/XSD/Schema/Builtin.pm
|
lib/SOAP/WSDL/XSD/Schema/Builtin.pm
|
||||||
lib/SOAP/WSDL/XSD/SimpleType.pm
|
lib/SOAP/WSDL/XSD/SimpleType.pm
|
||||||
|
lib/SOAP/WSDL/XSD/Typelib/Attribute.pm
|
||||||
|
lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
|
||||||
@@ -107,14 +225,16 @@ lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
|
|||||||
lib/SOAP/WSDL/XSD/Typelib/Element.pm
|
lib/SOAP/WSDL/XSD/Typelib/Element.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
||||||
LICENSE
|
LICENSE
|
||||||
MANIFEST
|
Makefile.PL
|
||||||
|
MANIFEST This list of files
|
||||||
META.yml
|
META.yml
|
||||||
|
MIGRATING
|
||||||
|
patches/Manual.diff
|
||||||
README
|
README
|
||||||
t/001_use.t
|
t/001_use.t
|
||||||
t/002_sax.t
|
t/002_parse_wsdl.t
|
||||||
t/003_sax_serializer.t
|
t/003_wsdl_based_serializer.t
|
||||||
t/004_sax_wsdl.t
|
t/004_parse_wsdl.t
|
||||||
t/005_sax_contributed_wsdl.t
|
|
||||||
t/006_client.t
|
t/006_client.t
|
||||||
t/007_envelope.t
|
t/007_envelope.t
|
||||||
t/008_client_wsdl_complexType.t
|
t/008_client_wsdl_complexType.t
|
||||||
@@ -122,12 +242,14 @@ t/009_data_classes.t
|
|||||||
t/011_simpleType.t
|
t/011_simpleType.t
|
||||||
t/012_element.t
|
t/012_element.t
|
||||||
t/013_complexType.t
|
t/013_complexType.t
|
||||||
t/014_sax_typelib.t
|
|
||||||
t/015_to_typemap.t
|
|
||||||
t/016_client_object.t
|
t/016_client_object.t
|
||||||
t/017_generator.t
|
t/017_generator.t
|
||||||
t/020_storable.t
|
t/020_storable.t
|
||||||
|
t/095_copying.t
|
||||||
|
t/096_characters.t
|
||||||
|
t/097_kwalitee.t
|
||||||
t/098_pod.t
|
t/098_pod.t
|
||||||
|
t/099_pod_coverage.t
|
||||||
t/acceptance/results/03_complexType-all.xml
|
t/acceptance/results/03_complexType-all.xml
|
||||||
t/acceptance/results/03_complexType-sequence.xml
|
t/acceptance/results/03_complexType-sequence.xml
|
||||||
t/acceptance/results/04_element-simpleType.xml
|
t/acceptance/results/04_element-simpleType.xml
|
||||||
@@ -140,6 +262,7 @@ t/acceptance/wsdl/006_sax_client.wsdl
|
|||||||
t/acceptance/wsdl/008_complexType.wsdl
|
t/acceptance/wsdl/008_complexType.wsdl
|
||||||
t/acceptance/wsdl/02_port.wsdl
|
t/acceptance/wsdl/02_port.wsdl
|
||||||
t/acceptance/wsdl/03_complexType-all.wsdl
|
t/acceptance/wsdl/03_complexType-all.wsdl
|
||||||
|
t/acceptance/wsdl/03_complexType-element-ref.wsdl
|
||||||
t/acceptance/wsdl/03_complexType-sequence.wsdl
|
t/acceptance/wsdl/03_complexType-sequence.wsdl
|
||||||
t/acceptance/wsdl/04_element-simpleType.wsdl
|
t/acceptance/wsdl/04_element-simpleType.wsdl
|
||||||
t/acceptance/wsdl/04_element.wsdl
|
t/acceptance/wsdl/04_element.wsdl
|
||||||
@@ -150,10 +273,18 @@ t/acceptance/wsdl/10_helloworld.asmx.xml
|
|||||||
t/acceptance/wsdl/11_helloworld.wsdl
|
t/acceptance/wsdl/11_helloworld.wsdl
|
||||||
t/acceptance/wsdl/contributed/Axis.wsdl
|
t/acceptance/wsdl/contributed/Axis.wsdl
|
||||||
t/acceptance/wsdl/contributed/ETest.wsdl
|
t/acceptance/wsdl/contributed/ETest.wsdl
|
||||||
|
t/acceptance/wsdl/contributed/gasquery.wsdl
|
||||||
t/acceptance/wsdl/contributed/OITest.wsdl
|
t/acceptance/wsdl/contributed/OITest.wsdl
|
||||||
t/acceptance/wsdl/contributed/tools.wsdl
|
t/acceptance/wsdl/contributed/tools.wsdl
|
||||||
|
t/acceptance/wsdl/elementAtomicComplexType.xml
|
||||||
t/acceptance/wsdl/email_account.wsdl
|
t/acceptance/wsdl/email_account.wsdl
|
||||||
t/Expat/01_expat.t
|
t/acceptance/wsdl/generator_test.wsdl
|
||||||
|
t/acceptance/wsdl/generator_test_dot_names.wsdl
|
||||||
|
t/acceptance/wsdl/generator_unsupported_test.wsdl
|
||||||
|
t/acceptance/wsdl/message_gateway.wsdl
|
||||||
|
t/acceptance/wsdl/WSDLParser.wsdl
|
||||||
|
t/contributed.wsdl
|
||||||
|
t/Expat/03_wsdl.t
|
||||||
t/lib/MyComplexType.pm
|
t/lib/MyComplexType.pm
|
||||||
t/lib/MyElement.pm
|
t/lib/MyElement.pm
|
||||||
t/lib/MySimpleType.pm
|
t/lib/MySimpleType.pm
|
||||||
@@ -161,11 +292,13 @@ t/lib/Test/SOAPMessage.pm
|
|||||||
t/lib/Typelib/Base.pm
|
t/lib/Typelib/Base.pm
|
||||||
t/lib/Typelib/TEnqueueMessage.pm
|
t/lib/Typelib/TEnqueueMessage.pm
|
||||||
t/lib/Typelib/TMessage.pm
|
t/lib/Typelib/TMessage.pm
|
||||||
|
t/SOAP/WSDL.t
|
||||||
t/SOAP/WSDL/01_use.t
|
t/SOAP/WSDL/01_use.t
|
||||||
t/SOAP/WSDL/02_port.t
|
t/SOAP/WSDL/02_port.t
|
||||||
t/SOAP/WSDL/03_complexType-all.t
|
t/SOAP/WSDL/03_complexType-all.t
|
||||||
t/SOAP/WSDL/03_complexType-choice.t
|
t/SOAP/WSDL/03_complexType-choice.t
|
||||||
t/SOAP/WSDL/03_complexType-complexContent.t
|
t/SOAP/WSDL/03_complexType-complexContent.t
|
||||||
|
t/SOAP/WSDL/03_complexType-element-ref.t
|
||||||
t/SOAP/WSDL/03_complexType-group.t
|
t/SOAP/WSDL/03_complexType-group.t
|
||||||
t/SOAP/WSDL/03_complexType-sequence.t
|
t/SOAP/WSDL/03_complexType-sequence.t
|
||||||
t/SOAP/WSDL/03_complexType-simpleContent.t
|
t/SOAP/WSDL/03_complexType-simpleContent.t
|
||||||
@@ -175,8 +308,87 @@ t/SOAP/WSDL/04_element.t
|
|||||||
t/SOAP/WSDL/05_simpleType-list.t
|
t/SOAP/WSDL/05_simpleType-list.t
|
||||||
t/SOAP/WSDL/05_simpleType-restriction.t
|
t/SOAP/WSDL/05_simpleType-restriction.t
|
||||||
t/SOAP/WSDL/05_simpleType-union.t
|
t/SOAP/WSDL/05_simpleType-union.t
|
||||||
t/SOAP/WSDL/10_performance.t
|
t/SOAP/WSDL/06_keep_alive.t
|
||||||
t/SOAP/WSDL/11_helloworld.NET.t
|
t/SOAP/WSDL/11_helloworld.NET.t
|
||||||
t/SOAP/WSDL/12_binding.pl
|
t/SOAP/WSDL/12_binding.t
|
||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/001_string.t
|
t/SOAP/WSDL/Client.t
|
||||||
|
t/SOAP/WSDL/Client/Base.t
|
||||||
|
t/SOAP/WSDL/Deserializer/Hash.t
|
||||||
|
t/SOAP/WSDL/Deserializer/SOM.t
|
||||||
|
t/SOAP/WSDL/Deserializer/XSD.t
|
||||||
|
t/SOAP/WSDL/Expat/Base.t
|
||||||
|
t/SOAP/WSDL/Expat/MessageParser.t
|
||||||
|
t/SOAP/WSDL/Expat/WSDLParser.t
|
||||||
|
t/SOAP/WSDL/Factory/Deserializer.t
|
||||||
|
t/SOAP/WSDL/Factory/Serializer.t
|
||||||
|
t/SOAP/WSDL/Factory/Transport.t
|
||||||
|
t/SOAP/WSDL/Generator/Template.t
|
||||||
|
t/SOAP/WSDL/Generator/Visitor.t
|
||||||
|
t/SOAP/WSDL/Generator/Visitor/Typemap.t
|
||||||
|
t/SOAP/WSDL/Generator/XCS.t
|
||||||
|
t/SOAP/WSDL/Generator/XSD.t
|
||||||
|
t/SOAP/WSDL/Generator/XSD_dot_names.t
|
||||||
|
t/SOAP/WSDL/Generator/XSD_unsupported.t
|
||||||
|
t/SOAP/WSDL/Part.t
|
||||||
|
t/SOAP/WSDL/Serializer/XSD.t
|
||||||
|
t/SOAP/WSDL/Server.t
|
||||||
|
t/SOAP/WSDL/Server/CGI.t
|
||||||
|
t/SOAP/WSDL/Transport/01_Test.t
|
||||||
|
t/SOAP/WSDL/Transport/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/ComplexType.t
|
||||||
|
t/SOAP/WSDL/XSD/Element.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
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/base64Binary.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/boolean.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/byte.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/date.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/decimal.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/double.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/float.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/hexBinary.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/ID.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/IDREF.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/IDREFS.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/int.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/integer.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/language.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/list.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/long.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/Name.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/NCName.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/negativeInteger.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKEN.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKENS.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/nonNegativeInteger.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/nonPositiveInteger.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/normalizedString.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/NOTATION.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/positiveInteger.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/short.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/string.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/time.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/token.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/unsignedByte.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/unsignedInt.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/unsignedLong.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/ComplexType.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Element.t
|
||||||
|
t/SOAP/WSDL_1.wsdl
|
||||||
|
t/SOAP/WSDL_EMPTY_DEFINITIONS.wsdl
|
||||||
|
t/SOAP/WSDL_NO_BINDING.wsdl
|
||||||
|
t/SOAP/WSDL_NO_MESSAGE.wsdl
|
||||||
|
t/SOAP/WSDL_NO_PORTTYPE.wsdl
|
||||||
|
t/test.wsdl
|
||||||
|
TEST_COVERAGE
|
||||||
TODO
|
TODO
|
||||||
|
|||||||
@@ -1,45 +1,97 @@
|
|||||||
---
|
---
|
||||||
name: SOAP-WSDL
|
name: SOAP-WSDL
|
||||||
version: 2.00_07
|
version: 2.00_29
|
||||||
author:
|
author:
|
||||||
|
- 'Martin Kutter <martin.kutter@fen-net.de>'
|
||||||
abstract: SOAP with WSDL support
|
abstract: SOAP with WSDL support
|
||||||
license: artistic
|
license: artistic
|
||||||
|
resources:
|
||||||
|
license: http://opensource.org/licenses/artistic-license.php
|
||||||
requires:
|
requires:
|
||||||
Class::Std: v0.0.8
|
Class::Std::Fast: !!perl/hash:version
|
||||||
Class::Std::Storable: 0
|
original: v0.0.5
|
||||||
|
qv: 1
|
||||||
|
version:
|
||||||
|
- 0
|
||||||
|
- 0
|
||||||
|
- 5
|
||||||
|
Data::Dumper: 0
|
||||||
|
Date::Format: 0
|
||||||
|
Date::Parse: 0
|
||||||
File::Basename: 0
|
File::Basename: 0
|
||||||
File::Path: 0
|
File::Path: 0
|
||||||
|
Getopt::Long: 0
|
||||||
|
LWP::UserAgent: 0
|
||||||
List::Util: 0
|
List::Util: 0
|
||||||
SOAP::Lite: 0
|
Template: 0
|
||||||
XML::LibXML: 0
|
Term::ReadKey: 0
|
||||||
XML::Parser::Expat: 0
|
XML::Parser::Expat: 0
|
||||||
XML::SAX::Base: 0
|
perl: 5.8.0
|
||||||
XML::SAX::ParserFactory: 0
|
|
||||||
XML::XPath: 0
|
|
||||||
generated_by: Module::Build version 0.2808
|
|
||||||
meta-spec:
|
|
||||||
url: http://module-build.sourceforge.net/META-spec-v1.2.html
|
|
||||||
version: 1.2
|
|
||||||
provides:
|
provides:
|
||||||
SOAP::WSDL:
|
SOAP::WSDL:
|
||||||
file: lib/SOAP/WSDL.pm
|
file: lib/SOAP/WSDL.pm
|
||||||
version: 2.00_05
|
version: 2.00_25
|
||||||
SOAP::WSDL::Base:
|
SOAP::WSDL::Base:
|
||||||
file: lib/SOAP/WSDL/Base.pm
|
file: lib/SOAP/WSDL/Base.pm
|
||||||
|
version: 2.00_27
|
||||||
SOAP::WSDL::Binding:
|
SOAP::WSDL::Binding:
|
||||||
file: lib/SOAP/WSDL/Binding.pm
|
file: lib/SOAP/WSDL/Binding.pm
|
||||||
SOAP::WSDL::Client:
|
SOAP::WSDL::Client:
|
||||||
file: lib/SOAP/WSDL/Client.pm
|
file: lib/SOAP/WSDL/Client.pm
|
||||||
|
version: 2.00_27
|
||||||
SOAP::WSDL::Client::Base:
|
SOAP::WSDL::Client::Base:
|
||||||
file: lib/SOAP/WSDL/Client/Base.pm
|
file: lib/SOAP/WSDL/Client/Base.pm
|
||||||
|
version: 2.00_25
|
||||||
SOAP::WSDL::Definitions:
|
SOAP::WSDL::Definitions:
|
||||||
file: lib/SOAP/WSDL/Definitions.pm
|
file: lib/SOAP/WSDL/Definitions.pm
|
||||||
SOAP::WSDL::Envelope:
|
version: 2.00_27
|
||||||
file: lib/SOAP/WSDL/Envelope.pm
|
SOAP::WSDL::Deserializer::Hash:
|
||||||
|
file: lib/SOAP/WSDL/Deserializer/Hash.pm
|
||||||
|
version: 2.00_25
|
||||||
|
SOAP::WSDL::Deserializer::SOM:
|
||||||
|
file: lib/SOAP/WSDL/Deserializer/SOM.pm
|
||||||
|
version: 2.00_24
|
||||||
|
SOAP::WSDL::Deserializer::XSD:
|
||||||
|
file: lib/SOAP/WSDL/Deserializer/XSD.pm
|
||||||
|
version: 2.00_25
|
||||||
|
SOAP::WSDL::Expat::Base:
|
||||||
|
file: lib/SOAP/WSDL/Expat/Base.pm
|
||||||
|
version: 2.00_27
|
||||||
|
SOAP::WSDL::Expat::Message2Hash:
|
||||||
|
file: lib/SOAP/WSDL/Expat/Message2Hash.pm
|
||||||
|
version: 2.00_27
|
||||||
SOAP::WSDL::Expat::MessageParser:
|
SOAP::WSDL::Expat::MessageParser:
|
||||||
file: lib/SOAP/WSDL/Expat/MessageParser.pm
|
file: lib/SOAP/WSDL/Expat/MessageParser.pm
|
||||||
|
version: 2.00_27
|
||||||
SOAP::WSDL::Expat::MessageStreamParser:
|
SOAP::WSDL::Expat::MessageStreamParser:
|
||||||
file: lib/SOAP/WSDL/Expat/MessageStreamParser.pm
|
file: lib/SOAP/WSDL/Expat/MessageStreamParser.pm
|
||||||
|
version: 2.00_24
|
||||||
|
SOAP::WSDL::Factory::Deserializer:
|
||||||
|
file: lib/SOAP/WSDL/Factory/Deserializer.pm
|
||||||
|
version: 2.00_24
|
||||||
|
SOAP::WSDL::Factory::Generator:
|
||||||
|
file: lib/SOAP/WSDL/Factory/Generator.pm
|
||||||
|
version: 2.00_24
|
||||||
|
SOAP::WSDL::Factory::Serializer:
|
||||||
|
file: lib/SOAP/WSDL/Factory/Serializer.pm
|
||||||
|
version: 2.00_24
|
||||||
|
SOAP::WSDL::Factory::Transport:
|
||||||
|
file: lib/SOAP/WSDL/Factory/Transport.pm
|
||||||
|
version: 2.00_25
|
||||||
|
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_27
|
||||||
|
SOAP::WSDL::Generator::Visitor:
|
||||||
|
file: lib/SOAP/WSDL/Generator/Visitor.pm
|
||||||
|
version: 2.00_25
|
||||||
|
SOAP::WSDL::Generator::Visitor::Typelib:
|
||||||
|
file: lib/SOAP/WSDL/Generator/Visitor/Typelib.pm
|
||||||
|
SOAP::WSDL::Generator::Visitor::Typemap:
|
||||||
|
file: lib/SOAP/WSDL/Generator/Visitor/Typemap.pm
|
||||||
|
version: 2.00_25
|
||||||
SOAP::WSDL::Message:
|
SOAP::WSDL::Message:
|
||||||
file: lib/SOAP/WSDL/Message.pm
|
file: lib/SOAP/WSDL/Message.pm
|
||||||
SOAP::WSDL::OpMessage:
|
SOAP::WSDL::OpMessage:
|
||||||
@@ -52,32 +104,70 @@ provides:
|
|||||||
file: lib/SOAP/WSDL/Port.pm
|
file: lib/SOAP/WSDL/Port.pm
|
||||||
SOAP::WSDL::PortType:
|
SOAP::WSDL::PortType:
|
||||||
file: lib/SOAP/WSDL/PortType.pm
|
file: lib/SOAP/WSDL/PortType.pm
|
||||||
SOAP::WSDL::SAX::MessageHandler:
|
SOAP::WSDL::SOAP::Address:
|
||||||
file: lib/SOAP/WSDL/SAX/MessageHandler.pm
|
file: lib/SOAP/WSDL/SOAP/Address.pm
|
||||||
|
SOAP::WSDL::SOAP::Body:
|
||||||
|
file: lib/SOAP/WSDL/SOAP/Body.pm
|
||||||
|
SOAP::WSDL::SOAP::Header:
|
||||||
|
file: lib/SOAP/WSDL/SOAP/Header.pm
|
||||||
|
SOAP::WSDL::SOAP::HeaderFault:
|
||||||
|
file: lib/SOAP/WSDL/SOAP/HeaderFault.pm
|
||||||
|
SOAP::WSDL::SOAP::Operation:
|
||||||
|
file: lib/SOAP/WSDL/SOAP/Operation.pm
|
||||||
|
version: 2.00_25
|
||||||
SOAP::WSDL::SOAP::Typelib::Fault11:
|
SOAP::WSDL::SOAP::Typelib::Fault11:
|
||||||
file: lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm
|
file: lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm
|
||||||
|
version: 2.00_25
|
||||||
|
SOAP::WSDL::Serializer::XSD:
|
||||||
|
file: lib/SOAP/WSDL/Serializer/XSD.pm
|
||||||
|
version: 2.00_27
|
||||||
|
SOAP::WSDL::Server:
|
||||||
|
file: lib/SOAP/WSDL/Server.pm
|
||||||
|
version: 2.00_27
|
||||||
|
SOAP::WSDL::Server::CGI:
|
||||||
|
file: lib/SOAP/WSDL/Server/CGI.pm
|
||||||
|
version: 2.00_27
|
||||||
SOAP::WSDL::Service:
|
SOAP::WSDL::Service:
|
||||||
file: lib/SOAP/WSDL/Service.pm
|
file: lib/SOAP/WSDL/Service.pm
|
||||||
SOAP::WSDL::SoapOperation:
|
SOAP::WSDL::Transport::HTTP:
|
||||||
file: lib/SOAP/WSDL/SoapOperation.pm
|
file: lib/SOAP/WSDL/Transport/HTTP.pm
|
||||||
|
SOAP::WSDL::Transport::Loopback:
|
||||||
|
file: lib/SOAP/WSDL/Transport/Loopback.pm
|
||||||
|
version: 2.00_25
|
||||||
|
SOAP::WSDL::Transport::Test:
|
||||||
|
file: lib/SOAP/WSDL/Transport/Test.pm
|
||||||
|
version: 2.00_25
|
||||||
SOAP::WSDL::TypeLookup:
|
SOAP::WSDL::TypeLookup:
|
||||||
file: lib/SOAP/WSDL/TypeLookup.pm
|
file: lib/SOAP/WSDL/TypeLookup.pm
|
||||||
|
version: 2.00_29
|
||||||
SOAP::WSDL::Types:
|
SOAP::WSDL::Types:
|
||||||
file: lib/SOAP/WSDL/Types.pm
|
file: lib/SOAP/WSDL/Types.pm
|
||||||
|
SOAP::WSDL::XSD::Attribute:
|
||||||
|
file: lib/SOAP/WSDL/XSD/Attribute.pm
|
||||||
|
version: 2.00_29
|
||||||
|
SOAP::WSDL::XSD::Builtin:
|
||||||
|
file: lib/SOAP/WSDL/XSD/Builtin.pm
|
||||||
SOAP::WSDL::XSD::ComplexType:
|
SOAP::WSDL::XSD::ComplexType:
|
||||||
file: lib/SOAP/WSDL/XSD/ComplexType.pm
|
file: lib/SOAP/WSDL/XSD/ComplexType.pm
|
||||||
|
version: 2.00_25
|
||||||
SOAP::WSDL::XSD::Element:
|
SOAP::WSDL::XSD::Element:
|
||||||
file: lib/SOAP/WSDL/XSD/Element.pm
|
file: lib/SOAP/WSDL/XSD/Element.pm
|
||||||
SOAP::WSDL::XSD::Primitive:
|
version: 2.00_25
|
||||||
file: lib/SOAP/WSDL/XSD/Primitive.pm
|
|
||||||
SOAP::WSDL::XSD::Schema:
|
SOAP::WSDL::XSD::Schema:
|
||||||
file: lib/SOAP/WSDL/XSD/Schema.pm
|
file: lib/SOAP/WSDL/XSD/Schema.pm
|
||||||
|
version: 2.00_25
|
||||||
SOAP::WSDL::XSD::Schema::Builtin:
|
SOAP::WSDL::XSD::Schema::Builtin:
|
||||||
file: lib/SOAP/WSDL/XSD/Schema/Builtin.pm
|
file: lib/SOAP/WSDL/XSD/Schema/Builtin.pm
|
||||||
SOAP::WSDL::XSD::SimpleType:
|
SOAP::WSDL::XSD::SimpleType:
|
||||||
file: lib/SOAP/WSDL/XSD/SimpleType.pm
|
file: lib/SOAP/WSDL/XSD/SimpleType.pm
|
||||||
|
version: 2.00_25
|
||||||
|
SOAP::WSDL::XSD::Typelib::Attribute:
|
||||||
|
file: lib/SOAP/WSDL/XSD/Typelib/Attribute.pm
|
||||||
|
SOAP::WSDL::XSD::Typelib::AttributeSet:
|
||||||
|
file: lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin:
|
SOAP::WSDL::XSD::Typelib::Builtin:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
|
||||||
|
version: 2.00_25
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::ENTITY:
|
SOAP::WSDL::XSD::Typelib::Builtin::ENTITY:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::ID:
|
SOAP::WSDL::XSD::Typelib::Builtin::ID:
|
||||||
@@ -102,12 +192,14 @@ provides:
|
|||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::anyType:
|
SOAP::WSDL::XSD::Typelib::Builtin::anyType:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
|
||||||
|
version: 2.00_29
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::anyURI:
|
SOAP::WSDL::XSD::Typelib::Builtin::anyURI:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::base64Binary:
|
SOAP::WSDL::XSD::Typelib::Builtin::base64Binary:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/base64Binary.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/base64Binary.pm
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::boolean:
|
SOAP::WSDL::XSD::Typelib::Builtin::boolean:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/boolean.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/boolean.pm
|
||||||
|
version: 2.00_23
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::byte:
|
SOAP::WSDL::XSD::Typelib::Builtin::byte:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/byte.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/byte.pm
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::date:
|
SOAP::WSDL::XSD::Typelib::Builtin::date:
|
||||||
@@ -160,6 +252,7 @@ provides:
|
|||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/string.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/string.pm
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::time:
|
SOAP::WSDL::XSD::Typelib::Builtin::time:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/time.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/time.pm
|
||||||
|
version: 2.00_25
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::token:
|
SOAP::WSDL::XSD::Typelib::Builtin::token:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/token.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/token.pm
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::unsignedByte:
|
SOAP::WSDL::XSD::Typelib::Builtin::unsignedByte:
|
||||||
@@ -172,11 +265,17 @@ provides:
|
|||||||
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType:
|
SOAP::WSDL::XSD::Typelib::ComplexType:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
|
||||||
|
version: 2.00_29
|
||||||
SOAP::WSDL::XSD::Typelib::Element:
|
SOAP::WSDL::XSD::Typelib::Element:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/Element.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/Element.pm
|
||||||
|
version: 2.00_29
|
||||||
SOAP::WSDL::XSD::Typelib::SimpleType:
|
SOAP::WSDL::XSD::Typelib::SimpleType:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
||||||
SOAP::WSDL::XSD::Typelib::SimpleType::restriction:
|
SOAP::WSDL::XSD::Typelib::SimpleType::restriction:
|
||||||
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
||||||
resources:
|
generated_by: Module::Build version 0.2808
|
||||||
license: http://opensource.org/licenses/artistic-license.php
|
meta-spec:
|
||||||
|
url: http://module-build.sourceforge.net/META-spec-v1.2.html
|
||||||
|
version: 1.2
|
||||||
|
no_index:
|
||||||
|
directory: lib/SOAP/WSDL/Generator/Template/XSD/
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
MIGRATING
|
||||||
|
---------
|
||||||
|
|
||||||
|
This document describes how to migrate from 2.00_24 and before versions to
|
||||||
|
2.00_25.
|
||||||
|
|
||||||
|
Migrating from 2.00_xx
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Background
|
||||||
|
|
||||||
|
SOAP::WSDL 2.00_xx has used Class::Std as base for its inside out objects
|
||||||
|
up to 2.00_24. For performance reasons, now Class::Std::Fast is used.
|
||||||
|
As Class::Std::Fast is a drop-in replacement for Class::Std, there should be
|
||||||
|
no need to change anything in your (handwritten) code.
|
||||||
|
|
||||||
|
Generated interfaces
|
||||||
|
|
||||||
|
SOAP::WSDL's internal structure has changed, and this change needs to
|
||||||
|
be reflected in all generated classes.
|
||||||
|
|
||||||
|
This means you have to re-generate your interfaces (in case you use generated
|
||||||
|
interfaces)
|
||||||
|
|
||||||
|
Typemaps
|
||||||
|
|
||||||
|
SOAP::WSDL now tries to load all typemap classes at once from 2.00_25 on.
|
||||||
|
|
||||||
|
If you use __SKIP__ in your typemaps, you'll have to comment out all
|
||||||
|
path deeper than the path marked with __SKIP__ - if you don't, SOAP::WSDL
|
||||||
|
will try to load all correspondent classes.
|
||||||
|
|
||||||
|
Migrating from 1.xx
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
Background
|
||||||
|
|
||||||
|
SOAP::WSDL uses a custom WSDL parser and serializer. It does not rely on XPath
|
||||||
|
for on the fly WSDL processing, nor does it use SOAP::Data objects for
|
||||||
|
encoding any more.
|
||||||
|
|
||||||
|
You should be able to use your wxisting code under most circumstances.
|
||||||
|
SOAP::WSDL is the compatibility module for old interfaces.
|
||||||
|
|
||||||
|
Overloading
|
||||||
|
|
||||||
|
Message overloading (as introduced in 1.23) is not supported any more.
|
||||||
|
|
||||||
|
Message overloading is prohibited by the WS-I basic profile, therefore
|
||||||
|
SOAP::WSDL does not implement it any more.
|
||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
# Note: this file was auto-generated by Module::Build::Compat version 0.03
|
||||||
|
|
||||||
|
unless (eval "use Module::Build::Compat 0.02; 1" ) {
|
||||||
|
print "This module requires Module::Build to install itself.\n";
|
||||||
|
|
||||||
|
require ExtUtils::MakeMaker;
|
||||||
|
my $yn = ExtUtils::MakeMaker::prompt
|
||||||
|
(' Install Module::Build now from CPAN?', 'y');
|
||||||
|
|
||||||
|
unless ($yn =~ /^y/i) {
|
||||||
|
die " *** Cannot install without Module::Build. Exiting ...\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
require Cwd;
|
||||||
|
require File::Spec;
|
||||||
|
require CPAN;
|
||||||
|
|
||||||
|
# Save this 'cause CPAN will chdir all over the place.
|
||||||
|
my $cwd = Cwd::cwd();
|
||||||
|
|
||||||
|
CPAN::Shell->install('Module::Build::Compat');
|
||||||
|
CPAN::Shell->expand("Module", "Module::Build::Compat")->uptodate
|
||||||
|
or die "Couldn't install Module::Build, giving up.\n";
|
||||||
|
|
||||||
|
chdir $cwd or die "Cannot chdir() back to $cwd: $!";
|
||||||
|
}
|
||||||
|
eval "use Module::Build::Compat 0.02; 1" or die $@;
|
||||||
|
|
||||||
|
Module::Build::Compat->run_build_pl(args => \@ARGV);
|
||||||
|
require Module::Build;
|
||||||
|
Module::Build::Compat->write_makefile(build_class => 'Module::Build');
|
||||||
@@ -1,2 +1,26 @@
|
|||||||
|
INTRO
|
||||||
|
-----
|
||||||
|
|
||||||
|
SOAP-WSDL provides a SOAP client with WSDL support.
|
||||||
|
|
||||||
This is a developer release - everything may (and most things will) change.
|
This is a developer release - everything may (and most things will) change.
|
||||||
|
|
||||||
|
INSTALLING
|
||||||
|
----------
|
||||||
|
|
||||||
|
Use the following mantra:
|
||||||
|
|
||||||
|
perl Build.PL
|
||||||
|
perl Build
|
||||||
|
perl Build test
|
||||||
|
perl Build install
|
||||||
|
|
||||||
|
If you don't have Module::Build installed, you may also use
|
||||||
|
|
||||||
|
perl Makefile.PL
|
||||||
|
make
|
||||||
|
make test
|
||||||
|
make install
|
||||||
|
|
||||||
|
Note that Module::Build is the recommended installer - make will not run
|
||||||
|
all tests provided with SOAP-WSDL.
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# Unfortunately, Build testcover reports test coverage wrong.
|
||||||
|
#
|
||||||
|
# To get a complete coverage report, just run this file as a shell script
|
||||||
|
# on a linux box (or execute the equivalent commands on another OS):
|
||||||
|
|
||||||
|
cd t/
|
||||||
|
|
||||||
|
find . -type f -name '*.t' | xargs -n 1 /usr/bin/perl -MDevel::Cover=-silent,1,-summary,0 -I../lib
|
||||||
|
|
||||||
|
cover -ignore_re \.t$ -ignore_re ^lib -coverage="statement" -coverage=condition -coverage=subroutine -coverage="branch"
|
||||||
|
|
||||||
@@ -1,27 +1,24 @@
|
|||||||
- remove benchmarks from tests. Create benchmark/ directory and store benchmarks in.
|
TODO list for SOAP::WSDL
|
||||||
- SOAP::WSDL::Definitions::create creates bad interface docs. Fix it.
|
|
||||||
- add tests for SOAP::WSDL::Definitions::create
|
|
||||||
- test for correct creation
|
|
||||||
- test against web service (fullerdata.com?)
|
|
||||||
- Improve docs
|
|
||||||
- Remove SOAP::Lite dependency - for now, just support HTTP(s) via LWP::UserAgent.
|
|
||||||
- write inheritance Test for all XSD::Typelib::Builtin::* classes
|
|
||||||
- Check & probably fix simpleType support.
|
|
||||||
The WS at http://www.webservicex.net/genericbarcode.asmx?wsdl should make up a good example for simpleType
|
|
||||||
definitions.
|
|
||||||
- update all Builtin Types to new constructor BEGIN block (Class::Std unfortunately is way slow)
|
|
||||||
- DONE.
|
|
||||||
- Remove useless (but on CPAN annoying) doc from Builtin::* classes
|
|
||||||
- DONE
|
|
||||||
- add example WS scripts
|
|
||||||
- DONE.
|
|
||||||
- SOAP::WSDL::XSD::Typelib::Builtin::string does not unescape XML builtin entities on get_value()
|
|
||||||
- WONTFIX.
|
|
||||||
Entities are unescaped by XML parser.
|
|
||||||
If you want the plain value, you have to use get_value, as XML conversion is overloaded on stringification.
|
|
||||||
- Make callin WS easier: implent WS-I-based SOAP::WSDL::Client::WSI
|
|
||||||
- WONTFIX - SOAP::WSDL::Base should behave equal
|
|
||||||
- add capability to create request objects based on input part definitions to SOAP::WSDL::Client::Base
|
|
||||||
- DONE.
|
|
||||||
|
|
||||||
|
2.00 Pre-releases
|
||||||
|
--------
|
||||||
|
|
||||||
|
* Act as SOAP Server [ 1842436 ]
|
||||||
|
|
||||||
|
2.1 release
|
||||||
|
--------
|
||||||
|
* Support namespaces in SOAP message payload [ 1809057 ]
|
||||||
|
|
||||||
|
* Support the xsi:type attribute on derived types on the wire [ 1809059 ]
|
||||||
|
|
||||||
|
* SOAP1.2 support [ 1803331 ]
|
||||||
|
|
||||||
|
2.2 release
|
||||||
|
--------
|
||||||
|
* XML schema support ("minimal conformant") [ 1764845 ]
|
||||||
|
|
||||||
|
* Support SOAP attachments
|
||||||
|
|
||||||
|
3.0 release
|
||||||
|
--------
|
||||||
|
We're not thinking that far ahead right now.
|
||||||
|
|||||||
@@ -0,0 +1,130 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
%DB::packages=(SOAP::WSDL::Expat::MessageParser => 1);
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use lib '../lib';
|
||||||
|
use lib '../../Class-Std-Fast/lib';
|
||||||
|
use lib '../t/lib';
|
||||||
|
# use SOAP::WSDL::SAX::MessageHandler;
|
||||||
|
|
||||||
|
use Benchmark qw(cmpthese timethese);
|
||||||
|
use SOAP::WSDL::Expat::MessageParser;
|
||||||
|
use SOAP::WSDL::Expat::Message2Hash;
|
||||||
|
use SOAP::Lite;
|
||||||
|
use XML::Simple;
|
||||||
|
use XML::LibXML;
|
||||||
|
use MyComplexType;
|
||||||
|
use MyElement;
|
||||||
|
use MySimpleType;
|
||||||
|
|
||||||
|
my $xml = q{<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
|
||||||
|
<SOAP-ENV:Body>
|
||||||
|
<MyAtomicComplexTypeElement xmlns="urn:Test" >
|
||||||
|
<test>
|
||||||
|
<test2 >Test2</test2>
|
||||||
|
<test2 >Test2</test2>
|
||||||
|
<test2 >Test2</test2>
|
||||||
|
<test2 >Test2</test2>
|
||||||
|
<test2 >Test2</test2>
|
||||||
|
<test2 >Test2</test2>
|
||||||
|
<test2 >Test2</test2>
|
||||||
|
<test2 >Test2</test2>
|
||||||
|
<test2 >Test2</test2>
|
||||||
|
<test2 >Test2</test2>
|
||||||
|
<test2 >Test2</test2>
|
||||||
|
<test2 >Test2</test2>
|
||||||
|
<test2 >Test55</test2>
|
||||||
|
</test>
|
||||||
|
</MyAtomicComplexTypeElement>
|
||||||
|
</SOAP-ENV:Body></SOAP-ENV:Envelope>};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
my $parser = SOAP::WSDL::Expat::MessageParser->new({
|
||||||
|
class_resolver => 'FakeResolver'
|
||||||
|
});
|
||||||
|
|
||||||
|
my $hash_parser = SOAP::WSDL::Expat::Message2Hash->new();
|
||||||
|
|
||||||
|
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
|
||||||
|
|
||||||
|
print "xml length: ${ \length $xml } bytes\n";
|
||||||
|
|
||||||
|
my $libxml = XML::LibXML->new();
|
||||||
|
$libxml->keep_blanks(0);
|
||||||
|
my @data;
|
||||||
|
|
||||||
|
my $deserializer = SOAP::Deserializer->new();
|
||||||
|
|
||||||
|
sub libxml_test {
|
||||||
|
my $dom = $libxml->parse_string( $xml );
|
||||||
|
push @data, dom2hash( $dom->firstChild );
|
||||||
|
};
|
||||||
|
|
||||||
|
sub dom2hash {
|
||||||
|
for ($_[0]->childNodes) {
|
||||||
|
if (exists $_[1]->{ $_->nodeName }) {
|
||||||
|
if (ref $_[1]->{ $_->nodeName } eq 'ARRAY') {
|
||||||
|
if ($_->nodeName eq '#text') {
|
||||||
|
push @{ $_[1] } ,$_->textContent;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
push @{ $_[1]->{ $_->nodeName } }, dom2hash( $_, {} );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if ($_->nodeName eq '#text') {
|
||||||
|
$_[1] = [ $_[1], $_->textContent() ];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$_[1]->{ $_->nodeName } = [ $_[1]->{ $_->nodeName } ,
|
||||||
|
dom2hash( $_, {} ) ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if ($_->nodeName eq '#text') {
|
||||||
|
$_[1] = $_->textContent();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$_[1]->{ $_->nodeName } = dom2hash( $_, {} );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $_[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
cmpthese 5000,
|
||||||
|
{
|
||||||
|
'SOAP::WSDL (Hash)' => sub { push @data, $hash_parser->parse( $xml ) },
|
||||||
|
'SOAP::WSDL (XSD)' => sub { push @data, $parser->parse( $xml ) },
|
||||||
|
'XML::Simple (Hash)' => sub { push @data, XMLin $xml },
|
||||||
|
'XML::LibXML (DOM)' => sub { push @data, $libxml->parse_string( $xml ) },
|
||||||
|
'XML::LibXML (Hash)' => \&libxml_test,
|
||||||
|
'SOAP::Lite' => sub { push @data, $deserializer->deserialize( $xml ) },
|
||||||
|
};
|
||||||
|
|
||||||
|
# data classes reside in t/lib/Typelib/
|
||||||
|
BEGIN {
|
||||||
|
package FakeResolver;
|
||||||
|
{
|
||||||
|
my %class_list = (
|
||||||
|
'MyAtomicComplexTypeElement' => 'MyAtomicComplexTypeElement',
|
||||||
|
'MyAtomicComplexTypeElement/test' => 'MyAtomicComplexTypeElement',
|
||||||
|
'MyAtomicComplexTypeElement/test/test2' => 'MyTestElement2',
|
||||||
|
);
|
||||||
|
|
||||||
|
sub get_typemap { return \%class_list; };
|
||||||
|
|
||||||
|
sub get_map { return \%class_list };
|
||||||
|
|
||||||
|
sub new { return bless {}, 'FakeResolver' };
|
||||||
|
|
||||||
|
sub get_class {
|
||||||
|
my $name = join('/', @{ $_[1] });
|
||||||
|
return ($class_list{ $name }) ? $class_list{ $name }
|
||||||
|
: warn "no class found for $name";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Benchmark;
|
||||||
|
use lib '../../lib';
|
||||||
|
use SOAP::WSDL::XSD::Typelib::Builtin::anyType;
|
||||||
|
|
||||||
|
my $obj = SOAP::WSDL::XSD::Typelib::Builtin::anyType->new();
|
||||||
|
|
||||||
|
timethese 10000, {
|
||||||
|
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anyType->new() },
|
||||||
|
};
|
||||||
|
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Benchmark;
|
||||||
|
use lib '../../lib';
|
||||||
|
use lib '../../../Class-Std-Fast/lib';
|
||||||
|
|
||||||
|
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
||||||
|
|
||||||
|
my $obj = SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new();
|
||||||
|
|
||||||
|
timethese 10000, {
|
||||||
|
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new() },
|
||||||
|
'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new({
|
||||||
|
value => 'Teststring'
|
||||||
|
}) },
|
||||||
|
'set_FOO' => sub { $obj->set_value('Test') },
|
||||||
|
};
|
||||||
|
|
||||||
|
my $data;
|
||||||
|
timethese 1000000, {
|
||||||
|
'set_FOO' => sub { $obj->set_value('Test') },
|
||||||
|
'get_FOO' => sub { $data = $obj->get_value() },
|
||||||
|
};
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
Benchmark: timing 10000 iterations of new, new + params, set_FOO...
|
||||||
|
new: 0 wallclock secs ( 0.83 usr + 0.00 sys = 0.83 CPU) @ 12048.19/s (n=10000)
|
||||||
|
new + params: 1 wallclock secs ( 0.58 usr + 0.00 sys = 0.58 CPU) @ 17241.38/s (n=10000)
|
||||||
|
set_FOO: 0 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU) @ 1000000.00/s (n=10000)
|
||||||
|
(warning: too few iterations for a reliable count)
|
||||||
|
Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
|
||||||
|
get_FOO: 1 wallclock secs ( 1.79 usr + 0.01 sys = 1.80 CPU) @ 555555.56/s (n=1000000)
|
||||||
|
set_FOO: 2 wallclock secs ( 1.44 usr + 0.03 sys = 1.47 CPU) @ 680272.11/s (n=1000000)
|
||||||
|
|
||||||
|
## Fast:
|
||||||
|
Benchmark: timing 10000 iterations of new, new + params, set_FOO...
|
||||||
|
new: 1 wallclock secs ( 0.67 usr + 0.01 sys = 0.68 CPU) @ 14705.88/s (n=10000)
|
||||||
|
new + params: 1 wallclock secs ( 0.54 usr + 0.00 sys = 0.54 CPU) @ 18518.52/s (n=10000)
|
||||||
|
set_FOO: 0 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU) @ 1000000.00/s (n=10000)
|
||||||
|
(warning: too few iterations for a reliable count)
|
||||||
|
Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
|
||||||
|
get_FOO: 2 wallclock secs ( 1.11 usr + 0.00 sys = 1.11 CPU) @ 900900.90/s (n=1000000)
|
||||||
|
set_FOO: 2 wallclock secs ( 0.80 usr + 0.00 sys = 0.80 CPU) @ 1250000.00/s (n=1000000)
|
||||||
|
|
||||||
|
## Fast qw(2);
|
||||||
|
Benchmark: timing 10000 iterations of new, new + params, set_FOO...
|
||||||
|
new: 1 wallclock secs ( 0.17 usr + 0.00 sys = 0.17 CPU) @ 58823.53/s (n=10000)
|
||||||
|
(warning: too few iterations for a reliable count)
|
||||||
|
new + params: 0 wallclock secs ( 0.19 usr + 0.00 sys = 0.19 CPU) @ 52631.58/s (n=10000)
|
||||||
|
(warning: too few iterations for a reliable count)
|
||||||
|
set_FOO: 0 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU) @ 1000000.00/s (n=10000)
|
||||||
|
(warning: too few iterations for a reliable count)
|
||||||
|
Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
|
||||||
|
get_FOO: 1 wallclock secs ( 1.12 usr + 0.00 sys = 1.12 CPU) @ 892857.14/s (n=1000000)
|
||||||
|
set_FOO: 0 wallclock secs ( 0.80 usr + 0.01 sys = 0.81 CPU) @ 1234567.90/s (n=1000000)
|
||||||
|
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Benchmark;
|
||||||
|
use lib '../../lib';
|
||||||
|
use lib '../../../Class-Std-Fast/lib';
|
||||||
|
|
||||||
|
use SOAP::WSDL::XSD::Typelib::Builtin::string;
|
||||||
|
|
||||||
|
my $obj = SOAP::WSDL::XSD::Typelib::Builtin::string->new();
|
||||||
|
|
||||||
|
timethese 20000, {
|
||||||
|
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new() },
|
||||||
|
'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new({
|
||||||
|
value => 'Teststring'
|
||||||
|
}) },
|
||||||
|
};
|
||||||
|
|
||||||
|
$obj->set_value('Foobar');
|
||||||
|
timethese 20000, {
|
||||||
|
serialize => sub { $obj->serialize() }
|
||||||
|
};
|
||||||
|
|
||||||
|
my $data;
|
||||||
|
timethese 1000000, {
|
||||||
|
'set_FOO' => sub { $obj->set_value('Test') },
|
||||||
|
'get_FOO' => sub { $data = $obj->get_value() },
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
Benchmark: timing 20000 iterations of new, new + params...
|
||||||
|
new: 1 wallclock secs ( 0.41 usr + 0.00 sys = 0.41 CPU) @ 48780.49/s (n=20000)
|
||||||
|
new + params: 1 wallclock secs ( 0.53 usr + 0.01 sys = 0.54 CPU) @ 37037.04/s (n=20000)
|
||||||
|
Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
|
||||||
|
get_FOO: 2 wallclock secs ( 1.43 usr + 0.01 sys = 1.44 CPU) @ 694444.44/s (n=1000000)
|
||||||
|
set_FOO: 0 wallclock secs ( 1.43 usr + 0.01 sys = 1.44 CPU) @ 694444.44/s (n=1000000)
|
||||||
|
|
||||||
|
|
||||||
|
::Fast
|
||||||
|
---
|
||||||
|
Benchmark: timing 20000 iterations of new, new + params...
|
||||||
|
new: 0 wallclock secs ( 0.44 usr + 0.01 sys = 0.45 CPU) @ 44444.44/s (n=20000)
|
||||||
|
new + params: 1 wallclock secs ( 0.55 usr + 0.00 sys = 0.55 CPU) @ 36363.64/s (n=20000)
|
||||||
|
Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
|
||||||
|
get_FOO: 0 wallclock secs ( 0.81 usr + 0.00 sys = 0.81 CPU) @ 1234567.90/s (n=1000000)
|
||||||
|
set_FOO: 2 wallclock secs ( 0.87 usr + 0.01 sys = 0.88 CPU) @ 1136363.64/s (n=1000000)
|
||||||
|
|
||||||
|
::Fast with inlined ID
|
||||||
|
Benchmark: timing 20000 iterations of new, new + params...
|
||||||
|
new: 0 wallclock secs ( 0.41 usr + 0.00 sys = 0.41 CPU) @ 48780.49/s (n=20000)
|
||||||
|
new + params: 1 wallclock secs ( 0.52 usr + 0.00 sys = 0.52 CPU) @ 38461.54/s (n=20000)
|
||||||
|
Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
|
||||||
|
get_FOO: 2 wallclock secs ( 0.80 usr + 0.00 sys = 0.80 CPU) @ 1250000.00/s (n=1000000)
|
||||||
|
set_FOO: 2 wallclock secs ( 0.89 usr + -0.01 sys = 0.88 CPU) @ 1136363.64/s (n=1000000)
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use lib '../example/lib';
|
||||||
|
use lib '/home/martin/workspace/SOAP-WSDL-Fast_XS/blib/lib';
|
||||||
|
use lib '/home/martin/workspace/SOAP-WSDL-Fast_XS/blib/arch';
|
||||||
|
use SOAP::Lite;
|
||||||
|
use XML::Compile::WSDL11;
|
||||||
|
use XML::Compile::Transport::SOAPHTTP;
|
||||||
|
use MyInterfaces::HelloWorld::HelloWorldSoap;
|
||||||
|
use SOAP::WSDL::Deserializer::XSD_XS;
|
||||||
|
use Benchmark qw(cmpthese);
|
||||||
|
|
||||||
|
my $lite = SOAP::Lite->new(
|
||||||
|
proxy => 'http://localhost:81/soap-wsdl-test/helloworld.pl'
|
||||||
|
);
|
||||||
|
|
||||||
|
$lite->on_action( sub { "urn:HelloWorld#sayHello" });
|
||||||
|
$lite->autotype(0);
|
||||||
|
|
||||||
|
my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new();
|
||||||
|
|
||||||
|
my $soap_xs = MyInterfaces::HelloWorld::HelloWorldSoap->new();
|
||||||
|
$soap_xs->set_deserializer( SOAP::WSDL::Deserializer::XSD_XS->new() );
|
||||||
|
|
||||||
|
my @result;
|
||||||
|
|
||||||
|
sub wsdl_bench {
|
||||||
|
push @result, $soap->sayHello({
|
||||||
|
name => $ARGV[1] || '"Your name"',
|
||||||
|
givenName => $ARGV[0] || '"Your given name"',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
sub wsdl_xs_bench {
|
||||||
|
push @result, $soap_xs->sayHello({
|
||||||
|
name => $ARGV[1] || '"Your name"',
|
||||||
|
givenName => $ARGV[0] || '"Your given name"',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
my $wsdl = XML::Compile::WSDL11->new('../example/wsdl/11_helloworld.wsdl');
|
||||||
|
my $call = $wsdl->compileClient('sayHello');
|
||||||
|
|
||||||
|
sub compile_bench {
|
||||||
|
push @result, $call->(
|
||||||
|
name => $ARGV[1] || '"Your name"',
|
||||||
|
givenName => $ARGV[0] || '"Your given name"',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub lite_bench {
|
||||||
|
push @result, $lite->call(
|
||||||
|
SOAP::Data->name("sayHello")
|
||||||
|
->attr({ xmlns => 'urn:HelloWorld' }),
|
||||||
|
SOAP::Data->name('name')->value( $ARGV[1] || '"Your name"'),
|
||||||
|
SOAP::Data->name('givenName')->value( $ARGV[0] || '"Your given name"'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
wsdl_bench();
|
||||||
|
wsdl_xs_bench();
|
||||||
|
|
||||||
|
cmpthese 150, {
|
||||||
|
'SOAP::WSDL' => \&wsdl_bench,
|
||||||
|
'SOAP::WSDL_XS' => \&wsdl_xs_bench,
|
||||||
|
'XML::Compile' => \&compile_bench,
|
||||||
|
# 'SOAP::Lite' => \&lite_bench,
|
||||||
|
}
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
use lib '../lib';
|
||||||
|
use lib '../example/lib';
|
||||||
|
use lib '../../SOAP-WSDL_XS/blib/lib';
|
||||||
|
use lib '../../SOAP-WSDL_XS/blib/arch';
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
use Benchmark qw(cmpthese);
|
||||||
|
|
||||||
|
use XML::Compile::Transport::SOAPHTTP();
|
||||||
|
use XML::Compile::Util;
|
||||||
|
use XML::Compile::WSDL11;
|
||||||
|
use XML::Simple;
|
||||||
|
|
||||||
|
use SOAP::WSDL::Deserializer::XSD_XS;
|
||||||
|
use SOAP::WSDL::Factory::Deserializer;
|
||||||
|
|
||||||
|
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
|
||||||
|
use SOAP::Lite;
|
||||||
|
|
||||||
|
use MyInterfaces::TestService::TestPort;
|
||||||
|
|
||||||
|
my $compile = XML::Compile::WSDL11->new('../example/wsdl/Person.wsdl');
|
||||||
|
my $call = $compile->compileClient('ListPerson');
|
||||||
|
$call->({ in => undef});
|
||||||
|
|
||||||
|
# Initialize SOAP::Lite
|
||||||
|
my $deserializer = SOAP::Deserializer->new();
|
||||||
|
|
||||||
|
# Initialize SOAP::WSDL interface
|
||||||
|
my $soap = MyInterfaces::TestService::TestPort->new();
|
||||||
|
# Load all classes - XML::Compile has created everything before, too
|
||||||
|
$soap->ListPerson({});
|
||||||
|
|
||||||
|
my $lite = SOAP::Lite->new()->default_ns('http://www.example.org/benchmark/')
|
||||||
|
->proxy('http://localhost:81/soap-wsdl-test/person.pl');
|
||||||
|
$lite->on_action( sub { 'http://www.example.org/benchmark/ListPerson' } );
|
||||||
|
|
||||||
|
# # register for SOAP 1.1
|
||||||
|
SOAP::WSDL::Factory::Deserializer->register('1.1' => 'SOAP::WSDL::Deserializer::XSD_XS' );
|
||||||
|
my $wsdl_xs = MyInterfaces::TestService::TestPort->new();
|
||||||
|
|
||||||
|
# trigger loading of XML Data
|
||||||
|
my $count = 100;
|
||||||
|
my @data = ();
|
||||||
|
my $n = 0;
|
||||||
|
print "Benchmark conducted with
|
||||||
|
SOAP::Lite - $SOAP::Lite::VERSION
|
||||||
|
SOAP::WSDL - $SOAP::WSDL::Client::VERSION
|
||||||
|
SOAP::WSDL_XS - $SOAP::WSDL::Deserializer::XSD_XS::VERSION;
|
||||||
|
XML::Compile::SOAP - $XML::Compile::SOAP::VERSION
|
||||||
|
|
||||||
|
Benchmark $n: Store result in private variable and destroy it
|
||||||
|
";
|
||||||
|
$n++;
|
||||||
|
cmpthese $count, {
|
||||||
|
# 'XML::Simple' => sub { my $result = XMLin( MyData::xml() )},
|
||||||
|
'SOAP::WSDL' => sub { my $result = $soap->ListPerson({}) },
|
||||||
|
'XML::Compile' => sub { my $result = $call->() },
|
||||||
|
'SOAP::WSDL_XS' => sub { my $result = $wsdl_xs->ListPerson({}) },
|
||||||
|
# 'SOAP::Lite' => sub { my $result = $deserializer->deserialize( MyData::xml() )},
|
||||||
|
'SOAP::Lite' => sub { my $som = $lite->call('ListPerson') },
|
||||||
|
};
|
||||||
|
|
||||||
|
print "\nBenchmark $n: Push result on list\n";
|
||||||
|
$n++;
|
||||||
|
cmpthese $count, {
|
||||||
|
# 'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
|
||||||
|
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
|
||||||
|
'XML::Compile' => sub { push @data, $call->() },
|
||||||
|
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
|
||||||
|
# 'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
|
||||||
|
'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
|
||||||
|
};
|
||||||
|
|
||||||
|
@data = ();
|
||||||
|
print "\nBenchmark $n: Play it again, Sam\n";
|
||||||
|
|
||||||
|
cmpthese $count, {
|
||||||
|
# 'XML::Simple' => sub { push @data, XMLin( MyData::xml() )},
|
||||||
|
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
|
||||||
|
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
|
||||||
|
'XML::Compile' => sub { push @data, $call->() },
|
||||||
|
# 'SOAP::Lite' => sub { push @data, $deserializer->deserialize( MyData::xml() )}
|
||||||
|
'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
|
||||||
|
};
|
||||||
|
|
||||||
@@ -0,0 +1,437 @@
|
|||||||
|
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body>
|
||||||
|
<ListPersonResponse xmlns="http://www.example.org/benchmark/">
|
||||||
|
<out>
|
||||||
|
<NewElement>
|
||||||
|
<PersonID>
|
||||||
|
<ID>1</ID>
|
||||||
|
</PersonID>
|
||||||
|
<Salutation>Salutation0</Salutation>
|
||||||
|
<Name>Name0</Name>
|
||||||
|
<GivenName>Martin</GivenName>
|
||||||
|
<DateOfBirth>1970-01-01</DateOfBirth>
|
||||||
|
<HomeAddress>
|
||||||
|
<Street>Street 0</Street>
|
||||||
|
<ZIP>00000</ZIP>
|
||||||
|
<City>City0</City>
|
||||||
|
<Country>Country0</Country>
|
||||||
|
<PhoneNumber>++499131123456</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||||
|
</HomeAddress>
|
||||||
|
<WorkAddress>
|
||||||
|
<Street>Somestreet 23</Street>
|
||||||
|
<ZIP>12345</ZIP>
|
||||||
|
<City>SomeCity</City>
|
||||||
|
<Country>Germany</Country>
|
||||||
|
<PhoneNumber>++499131123456</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
|
||||||
|
</WorkAddress>
|
||||||
|
<Contracts>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100000</ContractID>
|
||||||
|
<ContractName>SomeContract0</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100001</ContractID>
|
||||||
|
<ContractName>SomeContract1</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100002</ContractID>
|
||||||
|
<ContractName>SomeContract2</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100003</ContractID>
|
||||||
|
<ContractName>SomeContract3</ContractName>
|
||||||
|
</Contract>
|
||||||
|
</Contracts>
|
||||||
|
</NewElement>
|
||||||
|
<NewElement>
|
||||||
|
<PersonID>
|
||||||
|
<ID>2</ID>
|
||||||
|
</PersonID>
|
||||||
|
<Salutation>Salutation2</Salutation>
|
||||||
|
<Name>Name2</Name>
|
||||||
|
<GivenName>Martin2</GivenName>
|
||||||
|
<DateOfBirth>1970-01-02</DateOfBirth>
|
||||||
|
<HomeAddress>
|
||||||
|
<Street>Street 2</Street>
|
||||||
|
<ZIP>00002</ZIP>
|
||||||
|
<City>City2</City>
|
||||||
|
<Country>Country2</Country>
|
||||||
|
<PhoneNumber>++4900000002</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++491700000002</MobilePhoneNumber>
|
||||||
|
</HomeAddress>
|
||||||
|
<WorkAddress>
|
||||||
|
<Street>Somestreet 2</Street>
|
||||||
|
<ZIP>222222</ZIP>
|
||||||
|
<City>SomeCity2</City>
|
||||||
|
<Country>Germany</Country>
|
||||||
|
<PhoneNumber>++4920000002</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++4920000002</MobilePhoneNumber>
|
||||||
|
</WorkAddress>
|
||||||
|
<Contracts>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100002</ContractID>
|
||||||
|
<ContractName>SomeContract2</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100021</ContractID>
|
||||||
|
<ContractName>SomeContract21</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100022</ContractID>
|
||||||
|
<ContractName>SomeContract22</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>1000023</ContractID>
|
||||||
|
<ContractName>SomeContract23</ContractName>
|
||||||
|
</Contract>
|
||||||
|
</Contracts>
|
||||||
|
</NewElement>
|
||||||
|
<NewElement>
|
||||||
|
<PersonID>
|
||||||
|
<ID>3</ID>
|
||||||
|
</PersonID>
|
||||||
|
<Salutation>Salutation3</Salutation>
|
||||||
|
<Name>Name3</Name>
|
||||||
|
<GivenName>Martin3</GivenName>
|
||||||
|
<DateOfBirth>1970-01-03</DateOfBirth>
|
||||||
|
<HomeAddress>
|
||||||
|
<Street>Street 3</Street>
|
||||||
|
<ZIP>00003</ZIP>
|
||||||
|
<City>City3</City>
|
||||||
|
<Country>Country3</Country>
|
||||||
|
<PhoneNumber>++4900000003</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++491700000003</MobilePhoneNumber>
|
||||||
|
</HomeAddress>
|
||||||
|
<WorkAddress>
|
||||||
|
<Street>Somestreet 3</Street>
|
||||||
|
<ZIP>333333</ZIP>
|
||||||
|
<City>SomeCity3</City>
|
||||||
|
<Country>Germany</Country>
|
||||||
|
<PhoneNumber>++4930000003</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++4930000003</MobilePhoneNumber>
|
||||||
|
</WorkAddress>
|
||||||
|
<Contracts>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100003</ContractID>
|
||||||
|
<ContractName>SomeContract3</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100031</ContractID>
|
||||||
|
<ContractName>SomeContract31</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100033</ContractID>
|
||||||
|
<ContractName>SomeContract33</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>1000033</ContractID>
|
||||||
|
<ContractName>SomeContract33</ContractName>
|
||||||
|
</Contract>
|
||||||
|
</Contracts>
|
||||||
|
</NewElement>
|
||||||
|
<NewElement>
|
||||||
|
<PersonID>
|
||||||
|
<ID>4</ID>
|
||||||
|
</PersonID>
|
||||||
|
<Salutation>Salutation4</Salutation>
|
||||||
|
<Name>Name4</Name>
|
||||||
|
<GivenName>Martin4</GivenName>
|
||||||
|
<DateOfBirth>1970-01-04</DateOfBirth>
|
||||||
|
<HomeAddress>
|
||||||
|
<Street>Street 4</Street>
|
||||||
|
<ZIP>00004</ZIP>
|
||||||
|
<City>City4</City>
|
||||||
|
<Country>Country4</Country>
|
||||||
|
<PhoneNumber>++4900000004</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++491700000004</MobilePhoneNumber>
|
||||||
|
</HomeAddress>
|
||||||
|
<WorkAddress>
|
||||||
|
<Street>Somestreet 4</Street>
|
||||||
|
<ZIP>444444</ZIP>
|
||||||
|
<City>SomeCity4</City>
|
||||||
|
<Country>Germany</Country>
|
||||||
|
<PhoneNumber>++4940000004</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++4940000004</MobilePhoneNumber>
|
||||||
|
</WorkAddress>
|
||||||
|
<Contracts>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100004</ContractID>
|
||||||
|
<ContractName>SomeContract4</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100041</ContractID>
|
||||||
|
<ContractName>SomeContract41</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100044</ContractID>
|
||||||
|
<ContractName>SomeContract44</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>1000044</ContractID>
|
||||||
|
<ContractName>SomeContract44</ContractName>
|
||||||
|
</Contract>
|
||||||
|
</Contracts>
|
||||||
|
</NewElement>
|
||||||
|
<NewElement>
|
||||||
|
<PersonID>
|
||||||
|
<ID>5</ID>
|
||||||
|
</PersonID>
|
||||||
|
<Salutation>Salutation5</Salutation>
|
||||||
|
<Name>Name5</Name>
|
||||||
|
<GivenName>Martin5</GivenName>
|
||||||
|
<DateOfBirth>1970-01-05</DateOfBirth>
|
||||||
|
<HomeAddress>
|
||||||
|
<Street>Street 5</Street>
|
||||||
|
<ZIP>00005</ZIP>
|
||||||
|
<City>City5</City>
|
||||||
|
<Country>Country5</Country>
|
||||||
|
<PhoneNumber>++4900000005</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++491700000005</MobilePhoneNumber>
|
||||||
|
</HomeAddress>
|
||||||
|
<WorkAddress>
|
||||||
|
<Street>Somestreet 5</Street>
|
||||||
|
<ZIP>555555</ZIP>
|
||||||
|
<City>SomeCity5</City>
|
||||||
|
<Country>Germany</Country>
|
||||||
|
<PhoneNumber>++4950000005</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++4950000005</MobilePhoneNumber>
|
||||||
|
</WorkAddress>
|
||||||
|
<Contracts>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100005</ContractID>
|
||||||
|
<ContractName>SomeContract5</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100051</ContractID>
|
||||||
|
<ContractName>SomeContract51</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100055</ContractID>
|
||||||
|
<ContractName>SomeContract55</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>1000053</ContractID>
|
||||||
|
<ContractName>SomeContract53</ContractName>
|
||||||
|
</Contract>
|
||||||
|
</Contracts>
|
||||||
|
</NewElement>
|
||||||
|
<NewElement>
|
||||||
|
<PersonID>
|
||||||
|
<ID>6</ID>
|
||||||
|
</PersonID>
|
||||||
|
<Salutation>Salutation6</Salutation>
|
||||||
|
<Name>Name6</Name>
|
||||||
|
<GivenName>Martin6</GivenName>
|
||||||
|
<DateOfBirth>1970-01-06</DateOfBirth>
|
||||||
|
<HomeAddress>
|
||||||
|
<Street>Street 6</Street>
|
||||||
|
<ZIP>00006</ZIP>
|
||||||
|
<City>City6</City>
|
||||||
|
<Country>Country6</Country>
|
||||||
|
<PhoneNumber>++4900000006</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++491700000006</MobilePhoneNumber>
|
||||||
|
</HomeAddress>
|
||||||
|
<WorkAddress>
|
||||||
|
<Street>Somestreet 6</Street>
|
||||||
|
<ZIP>666666</ZIP>
|
||||||
|
<City>SomeCity6</City>
|
||||||
|
<Country>Germany</Country>
|
||||||
|
<PhoneNumber>++4960000006</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++4960000006</MobilePhoneNumber>
|
||||||
|
</WorkAddress>
|
||||||
|
<Contracts>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100006</ContractID>
|
||||||
|
<ContractName>SomeContract6</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100061</ContractID>
|
||||||
|
<ContractName>SomeContract61</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100066</ContractID>
|
||||||
|
<ContractName>SomeContract66</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>1000063</ContractID>
|
||||||
|
<ContractName>SomeContract63</ContractName>
|
||||||
|
</Contract>
|
||||||
|
</Contracts>
|
||||||
|
</NewElement>
|
||||||
|
<NewElement>
|
||||||
|
<PersonID>
|
||||||
|
<ID>7</ID>
|
||||||
|
</PersonID>
|
||||||
|
<Salutation>Salutation7</Salutation>
|
||||||
|
<Name>Name7</Name>
|
||||||
|
<GivenName>Martin7</GivenName>
|
||||||
|
<DateOfBirth>1970-01-07</DateOfBirth>
|
||||||
|
<HomeAddress>
|
||||||
|
<Street>Street 7</Street>
|
||||||
|
<ZIP>00007</ZIP>
|
||||||
|
<City>City7</City>
|
||||||
|
<Country>Country7</Country>
|
||||||
|
<PhoneNumber>++4900000007</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++491700000007</MobilePhoneNumber>
|
||||||
|
</HomeAddress>
|
||||||
|
<WorkAddress>
|
||||||
|
<Street>Somestreet 7</Street>
|
||||||
|
<ZIP>777777</ZIP>
|
||||||
|
<City>SomeCity7</City>
|
||||||
|
<Country>Germany</Country>
|
||||||
|
<PhoneNumber>++4970000007</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++4970000007</MobilePhoneNumber>
|
||||||
|
</WorkAddress>
|
||||||
|
<Contracts>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100007</ContractID>
|
||||||
|
<ContractName>SomeContract7</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100071</ContractID>
|
||||||
|
<ContractName>SomeContract71</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100077</ContractID>
|
||||||
|
<ContractName>SomeContract77</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>1000073</ContractID>
|
||||||
|
<ContractName>SomeContract73</ContractName>
|
||||||
|
</Contract>
|
||||||
|
</Contracts>
|
||||||
|
</NewElement>
|
||||||
|
<NewElement>
|
||||||
|
<PersonID>
|
||||||
|
<ID>8</ID>
|
||||||
|
</PersonID>
|
||||||
|
<Salutation>Salutation8</Salutation>
|
||||||
|
<Name>Name8</Name>
|
||||||
|
<GivenName>Martin8</GivenName>
|
||||||
|
<DateOfBirth>1970-01-08</DateOfBirth>
|
||||||
|
<HomeAddress>
|
||||||
|
<Street>Street 8</Street>
|
||||||
|
<ZIP>00008</ZIP>
|
||||||
|
<City>City8</City>
|
||||||
|
<Country>Country8</Country>
|
||||||
|
<PhoneNumber>++4900000008</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++491700000008</MobilePhoneNumber>
|
||||||
|
</HomeAddress>
|
||||||
|
<WorkAddress>
|
||||||
|
<Street>Somestreet 8</Street>
|
||||||
|
<ZIP>888888</ZIP>
|
||||||
|
<City>SomeCity8</City>
|
||||||
|
<Country>Germany</Country>
|
||||||
|
<PhoneNumber>++4980000008</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++4980000008</MobilePhoneNumber>
|
||||||
|
</WorkAddress>
|
||||||
|
<Contracts>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100008</ContractID>
|
||||||
|
<ContractName>SomeContract8</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100081</ContractID>
|
||||||
|
<ContractName>SomeContract81</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100088</ContractID>
|
||||||
|
<ContractName>SomeContract88</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>1000083</ContractID>
|
||||||
|
<ContractName>SomeContract83</ContractName>
|
||||||
|
</Contract>
|
||||||
|
</Contracts>
|
||||||
|
</NewElement>
|
||||||
|
<NewElement>
|
||||||
|
<PersonID>
|
||||||
|
<ID>9</ID>
|
||||||
|
</PersonID>
|
||||||
|
<Salutation>Salutation9</Salutation>
|
||||||
|
<Name>Name9</Name>
|
||||||
|
<GivenName>Martin9</GivenName>
|
||||||
|
<DateOfBirth>1970-01-09</DateOfBirth>
|
||||||
|
<HomeAddress>
|
||||||
|
<Street>Street 9</Street>
|
||||||
|
<ZIP>00009</ZIP>
|
||||||
|
<City>City9</City>
|
||||||
|
<Country>Country9</Country>
|
||||||
|
<PhoneNumber>++4900000009</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++491700000009</MobilePhoneNumber>
|
||||||
|
</HomeAddress>
|
||||||
|
<WorkAddress>
|
||||||
|
<Street>Somestreet 9</Street>
|
||||||
|
<ZIP>999999</ZIP>
|
||||||
|
<City>SomeCity9</City>
|
||||||
|
<Country>Germany</Country>
|
||||||
|
<PhoneNumber>++4990000009</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++4990000009</MobilePhoneNumber>
|
||||||
|
</WorkAddress>
|
||||||
|
<Contracts>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100009</ContractID>
|
||||||
|
<ContractName>SomeContract9</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100091</ContractID>
|
||||||
|
<ContractName>SomeContract91</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>100099</ContractID>
|
||||||
|
<ContractName>SomeContract99</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>1000093</ContractID>
|
||||||
|
<ContractName>SomeContract93</ContractName>
|
||||||
|
</Contract>
|
||||||
|
</Contracts>
|
||||||
|
</NewElement>
|
||||||
|
<NewElement>
|
||||||
|
<PersonID>
|
||||||
|
<ID>10</ID>
|
||||||
|
</PersonID>
|
||||||
|
<Salutation>Salutation10</Salutation>
|
||||||
|
<Name>Name10</Name>
|
||||||
|
<GivenName>Martin10</GivenName>
|
||||||
|
<DateOfBirth>1970-01-010</DateOfBirth>
|
||||||
|
<HomeAddress>
|
||||||
|
<Street>Street 10</Street>
|
||||||
|
<ZIP>000010</ZIP>
|
||||||
|
<City>City10</City>
|
||||||
|
<Country>Country10</Country>
|
||||||
|
<PhoneNumber>++49000000010</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++4917000000010</MobilePhoneNumber>
|
||||||
|
</HomeAddress>
|
||||||
|
<WorkAddress>
|
||||||
|
<Street>Somestreet 10</Street>
|
||||||
|
<ZIP>101010101010</ZIP>
|
||||||
|
<City>SomeCity10</City>
|
||||||
|
<Country>Germany</Country>
|
||||||
|
<PhoneNumber>++491000000010</PhoneNumber>
|
||||||
|
<MobilePhoneNumber>++491000000010</MobilePhoneNumber>
|
||||||
|
</WorkAddress>
|
||||||
|
<Contracts>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>1000010</ContractID>
|
||||||
|
<ContractName>SomeContract10</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>1000101</ContractID>
|
||||||
|
<ContractName>SomeContract101</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>10001010</ContractID>
|
||||||
|
<ContractName>SomeContract1010</ContractName>
|
||||||
|
</Contract>
|
||||||
|
<Contract>
|
||||||
|
<ContractID>10000103</ContractID>
|
||||||
|
<ContractName>SomeContract103</ContractName>
|
||||||
|
</Contract>
|
||||||
|
</Contracts>
|
||||||
|
</NewElement>
|
||||||
|
</out>
|
||||||
|
</ListPersonResponse>
|
||||||
|
</SOAP-ENV:Body>
|
||||||
|
</SOAP-ENV:Envelope>
|
||||||
+139
-34
@@ -1,34 +1,66 @@
|
|||||||
#!/usr/bin/perl -w
|
#!/usr/bin/perl -w
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Fcntl;
|
|
||||||
use IO::File;
|
|
||||||
use Pod::Usage;
|
use Pod::Usage;
|
||||||
use Getopt::Long;
|
use Getopt::Long;
|
||||||
use LWP::Simple qw(get);
|
use LWP::UserAgent;
|
||||||
use SOAP::WSDL::SAX::WSDLHandler;
|
use SOAP::WSDL::Expat::WSDLParser;
|
||||||
use XML::LibXML;
|
use SOAP::WSDL::Factory::Generator;
|
||||||
|
use Term::ReadKey;
|
||||||
|
|
||||||
my %opt = (
|
my %opt = (
|
||||||
url => '',
|
url => '',
|
||||||
prefix => undef,
|
prefix => undef,
|
||||||
type_prefix => 'MyTypes::',
|
type_prefix => 'MyTypes',
|
||||||
element_prefix => 'MyElements::',
|
element_prefix => 'MyElements',
|
||||||
typemap_prefix => 'MyTypemaps::',
|
typemap_prefix => 'MyTypemaps',
|
||||||
interface_prefix => 'MyInterfaces::',
|
interface_prefix => 'MyInterfaces',
|
||||||
base_path => 'lib/',
|
base_path => 'lib/',
|
||||||
|
proxy => undef,
|
||||||
|
generator => 'XSD',
|
||||||
|
server => 0,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
{ # a block just to scope "no warnings"
|
||||||
|
no warnings qw(redefine);
|
||||||
|
|
||||||
|
*LWP::UserAgent::get_basic_credentials = sub {
|
||||||
|
my ($user, $password);
|
||||||
|
# remove user from option if called, to force prompting for a user
|
||||||
|
# name the next time
|
||||||
|
print "URL requires authorization.\n";
|
||||||
|
if (not $user = delete $opt{user}) {
|
||||||
|
print 'User name:';
|
||||||
|
ReadMode 1;
|
||||||
|
$user = ReadLine();
|
||||||
|
ReadMode 0;
|
||||||
|
};
|
||||||
|
if (not $password = delete $opt{password}) {
|
||||||
|
print 'Password:';
|
||||||
|
ReadMode 2;
|
||||||
|
$user = ReadLine;
|
||||||
|
ReadMode 0;
|
||||||
|
};
|
||||||
|
return ($user, $password);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
GetOptions(\%opt,
|
GetOptions(\%opt,
|
||||||
qw(
|
qw(
|
||||||
url|u=s
|
|
||||||
prefix|p=s
|
prefix|p=s
|
||||||
type_prefix|t=s
|
type_prefix|t=s
|
||||||
element_prefix|e=s
|
element_prefix|e=s
|
||||||
typemap_prefix|m=s
|
typemap_prefix|m=s
|
||||||
|
interface_prefix|i=s
|
||||||
base_path|b=s
|
base_path|b=s
|
||||||
typemap_include|mi=s
|
typemap_include|mi=s
|
||||||
help|h
|
help|h
|
||||||
|
proxy|x=s
|
||||||
|
keep_alive
|
||||||
|
user=s
|
||||||
|
password=s
|
||||||
|
generator=s
|
||||||
|
server
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -37,25 +69,56 @@ my $url = $ARGV[0];
|
|||||||
pod2usage( -exit => 1 , verbose => 2 ) if ($opt{help});
|
pod2usage( -exit => 1 , verbose => 2 ) if ($opt{help});
|
||||||
pod2usage( -exit => 1 , verbose => 1 ) if not ($url);
|
pod2usage( -exit => 1 , verbose => 1 ) if not ($url);
|
||||||
|
|
||||||
my $handler = SOAP::WSDL::SAX::WSDLHandler->new();
|
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
|
||||||
my $parser = XML::LibXML->new();
|
|
||||||
|
|
||||||
my $xml = get($url) or die "Could not load WSDL schema $url\n";
|
local $ENV{HTTP_PROXY} = $opt{proxy} if $opt{proxy};
|
||||||
|
local $ENV{HTTPS_PROXY} = $opt{proxy} if $opt{proxy};
|
||||||
|
|
||||||
$parser->set_handler( $handler );
|
my $lwp = LWP::UserAgent->new(
|
||||||
$parser->parse_string( $xml );
|
$opt{keep_alive}
|
||||||
|
? ( keep_alive => 1 )
|
||||||
|
: ()
|
||||||
|
);
|
||||||
|
$lwp->env_proxy(); # get proxy from environment. Works for both http & https.
|
||||||
|
|
||||||
my $wsdl = $handler->get_data();
|
my $response = $lwp->get($url);
|
||||||
|
die $response->message(), "\n" if $response->code != 200;
|
||||||
|
|
||||||
|
my $xml = $response->content();
|
||||||
|
|
||||||
|
my $definitions = $parser->parse_string( $xml );
|
||||||
|
|
||||||
|
my %typemap = ();
|
||||||
|
|
||||||
if ($opt{typemap_include}) {
|
if ($opt{typemap_include}) {
|
||||||
my $fh = IO::File->new($opt{typemap_include} , O_RDONLY)
|
die "$opt{typemap_include} not found " if not -f $opt{typemap_include};
|
||||||
or die "cannot open typemap_include file $opt{typemap_include}\n";
|
%typemap = do $opt{typemap_include};
|
||||||
$opt{custom_types} = join q{}, $fh->getlines();
|
|
||||||
$fh->close();
|
|
||||||
delete $opt{typemap_include};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$wsdl->create({ %opt });
|
my $generator = SOAP::WSDL::Factory::Generator->get_generator({ type => $opt{'generator'} });
|
||||||
|
|
||||||
|
if (%typemap) {
|
||||||
|
if ($generator->can('set_typemap')) {
|
||||||
|
$generator->set_typemap( \%typemap );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
warn "Typemap snippet given, but generator does not support it\n";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$generator->set_type_prefix( $opt{ type_prefix }) if $generator->can('set_type_prefix');
|
||||||
|
$generator->set_typemap_prefix( $opt{ typemap_prefix }) if $generator->can('set_typemap_prefix');
|
||||||
|
$generator->set_element_prefix($opt{ element_prefix }) if $generator->can('set_element_prefix');
|
||||||
|
$generator->set_interface_prefix($opt{ interface_prefix }) if $generator->can('set_interface_prefix');
|
||||||
|
$generator->set_OUTPUT_PATH($opt{ base_path }) if $generator->can('set_OUTPUT_PATH');
|
||||||
|
$generator->set_definitions($definitions) if $generator->can('set_definitions');
|
||||||
|
$generator->set_wsdl($xml) if $generator->can('set_wsdl');
|
||||||
|
|
||||||
|
# start with typelib, as errors will most likely occur here...
|
||||||
|
$generator->generate();
|
||||||
|
$generator->generate_interface() if ! $opt{server};
|
||||||
|
$generator->generate_server() if $opt{server};
|
||||||
|
__END__
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
@@ -73,17 +136,28 @@ wsdl2perl.pl - create perl bindings for SOAP webservices.
|
|||||||
NAME SHORT DESCRITPION
|
NAME SHORT DESCRITPION
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
prefix p Prefix for both type and element classes.
|
prefix p Prefix for both type and element classes.
|
||||||
type_prefix t Prefix for type classes. Should end with '::'
|
type_prefix t Prefix for type classes.
|
||||||
Default: MyTypes::
|
Default: MyTypes
|
||||||
element_prefix e Prefix for element classes. Should end with '::'
|
element_prefix e Prefix for element classes.
|
||||||
Default: MyElements::
|
Default: MyElements
|
||||||
typemap_prefix m Prefix for typemap classes. Should end with '::'
|
typemap_prefix m Prefix for typemap classes.
|
||||||
Default: MyTypemaps::
|
Default: MyTypemaps
|
||||||
interface_prefix i Prefix for interface classes. Should end with '::'
|
interface_prefix i Prefix for interface classes.
|
||||||
Default: MyInterfaces::
|
Default: MyInterfaces
|
||||||
base_path b Path to create classes in.
|
base_path b Path to create classes in.
|
||||||
Default: ./lib
|
Default: .
|
||||||
typemap_include mi File to include in typemap.
|
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
|
||||||
|
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
|
||||||
|
server s Generate a server interface (currently only CGI
|
||||||
|
supported)
|
||||||
help h Show help content
|
help h Show help content
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
@@ -95,11 +169,18 @@ The following classes are created:
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item * A interface class for every service
|
=item * A interface class for every SOAP port in service
|
||||||
|
|
||||||
Interface classes are what you will mainly deal with: They provide a method
|
Interface classes are what you will mainly deal with: They provide a method
|
||||||
for accessing every web service method.
|
for accessing every web service method.
|
||||||
|
|
||||||
|
If you chose to generate Server interfaces, a class for every SOAP port in
|
||||||
|
every Web service.
|
||||||
|
|
||||||
|
You'll have to implement a method for each of the implemented methods. You
|
||||||
|
may implement these methods in the CGI script / handler, or in any class
|
||||||
|
to dispatch calls to.
|
||||||
|
|
||||||
=item * A typemap for every service
|
=item * A typemap for every service
|
||||||
|
|
||||||
Typemaps are used internally by SOAP::WSDL for parsing the SOAP message into
|
Typemaps are used internally by SOAP::WSDL for parsing the SOAP message into
|
||||||
@@ -116,10 +197,34 @@ typemap_include (mi) option.
|
|||||||
You may need to write additional type classes if your WSDL is incomplete.
|
You may need to write additional type classes if your WSDL is incomplete.
|
||||||
|
|
||||||
For writing your own lib classes, see L<SOAP::WSDL::XSD::Typelib::Element>,
|
For writing your own lib classes, see L<SOAP::WSDL::XSD::Typelib::Element>,
|
||||||
L<SOAP::WSDL::XSD::Typelib::ComplexType> and L<SOAP::WSDL::XSD::Typelib::SimpleType>.
|
L<SOAP::WSDL::XSD::Typelib::ComplexType>
|
||||||
|
and L<SOAP::WSDL::XSD::Typelib::SimpleType>.
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
|
=head1 TROUBLESHOOTING
|
||||||
|
|
||||||
|
=head2 Accessing HTTPS URLs
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
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
|
||||||
|
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.
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE
|
||||||
|
|
||||||
Copyright 2007 Martin Kutter.
|
Copyright 2007 Martin Kutter.
|
||||||
|
|||||||
Executable
+56
@@ -0,0 +1,56 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use lib '../../lib';
|
||||||
|
use lib '../lib';
|
||||||
|
use MyServer::HelloWorld::HelloWorldSoap;
|
||||||
|
|
||||||
|
my $soap = MyServer::HelloWorld::HelloWorldSoap->new({
|
||||||
|
dispatch_to => 'main',
|
||||||
|
});
|
||||||
|
|
||||||
|
$soap->handle();
|
||||||
|
|
||||||
|
sub sayHello {
|
||||||
|
my ($self, $body, $header) = @_;
|
||||||
|
my $name = $body->get_name();
|
||||||
|
my $givenName = $body->get_givenName();
|
||||||
|
|
||||||
|
return MyElements::sayHelloResponse->new({
|
||||||
|
sayHelloResult => "Hello $givenName $name"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
helloworld.pl - a simple CGI-based SOAP server implementing the service from
|
||||||
|
in examples/wsdl/helloworld.wsdl
|
||||||
|
|
||||||
|
=head1 USAGE
|
||||||
|
|
||||||
|
Before using this script, you should secure your webserver. The easiest way
|
||||||
|
to do so is to let it listen to 127.0.0.1 only.
|
||||||
|
|
||||||
|
Then make a ScriptAlias named /soap-wsdl-test/ pointing at the directory
|
||||||
|
this file lies in.
|
||||||
|
|
||||||
|
For my apache, it looks like this:
|
||||||
|
|
||||||
|
ScriptAlias /soap-wsdl-test/ /home/martin/workspace/SOAP-WSDL/example/cgi-bin/
|
||||||
|
<Directory "/home/martin/workspace/SOAP-WSDL/example/cgi-bin">
|
||||||
|
AllowOverride None
|
||||||
|
Options +ExecCGI -MultiViews
|
||||||
|
Order allow,deny
|
||||||
|
Allow from all
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
Then run the helloworld.pl from the examples directory. It should print
|
||||||
|
|
||||||
|
Hello World
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
Executable
+84
@@ -0,0 +1,84 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
package main;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
#use lib qw(../lib ../../lib);
|
||||||
|
use MyElements::ListPersonResponse;
|
||||||
|
use MyServer::TestService::TestPort;
|
||||||
|
my $server = MyServer::TestService::TestPort->new({
|
||||||
|
dispatch_to => 'main',
|
||||||
|
transport_class => 'SOAP::WSDL::Server::CGI', # optional, default
|
||||||
|
});
|
||||||
|
$server->handle();
|
||||||
|
|
||||||
|
sub ListPerson {
|
||||||
|
my ($self, $body, $header) = @_;
|
||||||
|
# body is a ??? object - sorry, POD not implemented yet
|
||||||
|
# header is a ??? object - sorry, POD not implemented yet
|
||||||
|
|
||||||
|
# do something with body and header...
|
||||||
|
|
||||||
|
my %person = (
|
||||||
|
PersonID => { # MyTypes::PersonID
|
||||||
|
ID => 1, # int
|
||||||
|
},
|
||||||
|
Salutation => 'Salutation0', # string
|
||||||
|
Name => 'Name0', # string
|
||||||
|
GivenName => 'Martin', # string
|
||||||
|
DateOfBirth => '1970-01-01', # date
|
||||||
|
HomeAddress => { # MyTypes::Address
|
||||||
|
Street => 'Street 0', # string
|
||||||
|
ZIP => '00000', # string
|
||||||
|
City => 'City0', # string
|
||||||
|
Country => 'Country0', # string
|
||||||
|
PhoneNumber => '++499131123456', # PhoneNumber
|
||||||
|
MobilePhoneNumber => '++49150123456', # PhoneNumber
|
||||||
|
},
|
||||||
|
WorkAddress => { # MyTypes::Address
|
||||||
|
Street => 'Somestreet 23', # string
|
||||||
|
ZIP => '12345', # string
|
||||||
|
City => 'SomeCity', # string
|
||||||
|
Country => 'Germany', # string
|
||||||
|
PhoneNumber => '++499131123456', # PhoneNumber
|
||||||
|
MobilePhoneNumber => '++49150123456', # PhoneNumber
|
||||||
|
},
|
||||||
|
Contracts => { # MyTypes::ArrayOfContract
|
||||||
|
Contract => [
|
||||||
|
{ # MyTypes::Contract
|
||||||
|
ContractID => 100000, # long
|
||||||
|
ContractName => 'SomeContract0', # string
|
||||||
|
},
|
||||||
|
{ # MyTypes::Contract
|
||||||
|
ContractID => 100001, # long
|
||||||
|
ContractName => 'SomeContract1', # string
|
||||||
|
},
|
||||||
|
{ # MyTypes::Contract
|
||||||
|
ContractID => 100002, # long
|
||||||
|
ContractName => 'SomeContract2', # string
|
||||||
|
},
|
||||||
|
{ # MyTypes::Contract
|
||||||
|
ContractID => 100003, # long
|
||||||
|
ContractName => 'SomeContract3', # string
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
return MyElements::ListPersonResponse->new( {
|
||||||
|
out => { # MyTypes::ArrayOfPerson
|
||||||
|
NewElement => [
|
||||||
|
{ %person },
|
||||||
|
{ %person },
|
||||||
|
{ %person },
|
||||||
|
{ %person },
|
||||||
|
{ %person },
|
||||||
|
{ %person },
|
||||||
|
{ %person },
|
||||||
|
{ %person },
|
||||||
|
{ %person },
|
||||||
|
{ %person },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
+32
-18
@@ -10,24 +10,38 @@
|
|||||||
# Eigene Dateien/Martin/SOAP-WSDL/trunk/bin/FortuneCookie.xml"
|
# Eigene Dateien/Martin/SOAP-WSDL/trunk/bin/FortuneCookie.xml"
|
||||||
|
|
||||||
use lib 'lib/';
|
use lib 'lib/';
|
||||||
use MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie;
|
use MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap;
|
||||||
use MyElements::GetFortuneCookie;
|
my $cookieService = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap->new();
|
||||||
my $cookieService = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie->new();
|
|
||||||
|
|
||||||
my $cookie = $cookieService->GetFortuneCookie();
|
my $cookie;
|
||||||
|
$cookie = $cookieService->GetFortuneCookie()
|
||||||
|
or die "$cookie";
|
||||||
|
|
||||||
if ($cookie) {
|
print $cookie->get_GetFortuneCookieResult()->get_value, "\n\n";
|
||||||
print $cookie->get_GetFortuneCookieResult()->get_value, "\n";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
print $cookie;
|
|
||||||
}
|
|
||||||
|
|
||||||
$cookie = $cookieService->GetSpecificCookie({ index => 23 });
|
$cookie = $cookieService->GetSpecificCookie({ index => 23 })
|
||||||
if ($cookie) {
|
or die "$cookie";
|
||||||
print $cookie
|
|
||||||
->get_GetSpecificCookieResult(), "\n";
|
print $cookie->get_GetSpecificCookieResult(), "\n";
|
||||||
}
|
|
||||||
else {
|
# print $cookie;
|
||||||
print $cookie;
|
|
||||||
}
|
|
||||||
|
=for demo:
|
||||||
|
|
||||||
|
# the same in SOAP lite (second call)
|
||||||
|
#
|
||||||
|
|
||||||
|
use SOAP::Lite;
|
||||||
|
|
||||||
|
my $lite = SOAP::Lite->new()->on_action(sub { join '/', @_ } )
|
||||||
|
->proxy('http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx');
|
||||||
|
|
||||||
|
$lite->call(
|
||||||
|
SOAP::Data->name('GetSpecificCookie')
|
||||||
|
->attr({ 'xmlns', 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }),
|
||||||
|
SOAP::Data->name('index')->value(23)
|
||||||
|
);
|
||||||
|
|
||||||
|
die $soap->message() if ($soap->fault());
|
||||||
|
print $soap->result();
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
use lib 'lib';
|
||||||
|
use lib '../lib';
|
||||||
|
use MyInterfaces::BarCode::BarCodeSoap;
|
||||||
|
my $interface = MyInterfaces::BarCode::BarCodeSoap->new();
|
||||||
|
my $barcode = $interface->GenerateBarCode( {
|
||||||
|
BarCodeParam => { # MyTypes::BarCodeData
|
||||||
|
Height => 42, # int
|
||||||
|
Width => 120, # int
|
||||||
|
Angle => 90, # int
|
||||||
|
Ratio => 1, # int
|
||||||
|
Module => 1, # int
|
||||||
|
Left => 10, # int
|
||||||
|
Top => 10, # int
|
||||||
|
CheckSum => 0, # boolean
|
||||||
|
FontName => 'Arial', # string
|
||||||
|
BarColor => 'black', # string
|
||||||
|
BGColor => 'white', # string
|
||||||
|
FontSize => 6.25, # float
|
||||||
|
barcodeOption => 'Both', # BarcodeOption
|
||||||
|
barcodeType => 'CodeMSI', # BarcodeType
|
||||||
|
checkSumMethod => 'None', # CheckSumMethod
|
||||||
|
showTextPosition => 'TopLeft', # ShowTextPosition
|
||||||
|
BarCodeImageFormat => 'PNG', # ImageFormats
|
||||||
|
},
|
||||||
|
BarCodeText => 'JustSomeText', # string
|
||||||
|
},
|
||||||
|
);
|
||||||
|
die $barcode if not ($barcode);
|
||||||
|
print $barcode;
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use lib 'lib'; # just needed because interface lies here
|
||||||
|
|
||||||
|
# I have to generate the interface using wsdl2perl.pl before
|
||||||
|
use MyInterfaces::HelloWorld::HelloWorldSoap;
|
||||||
|
|
||||||
|
# I instantiate a interface class.
|
||||||
|
my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new();
|
||||||
|
|
||||||
|
# I have to lookup the method and synopsis from the interface's pod
|
||||||
|
my $result = $soap->sayHello({
|
||||||
|
name => $ARGV[1] || '"Your name"',
|
||||||
|
givenName => $ARGV[0] || '"Your given name"',
|
||||||
|
});
|
||||||
|
|
||||||
|
# SOAP::WSDL::SOAP::Typelib::Fault11 objects are false, but serialize to XML
|
||||||
|
die $result if not $result;
|
||||||
|
|
||||||
|
# I have to lookup the output parameter from the interface's POD - or try:
|
||||||
|
# Will die on bad method names with a list of available methods
|
||||||
|
print $result->get_sayHelloResult(), "\n";
|
||||||
|
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use XML::Compile::WSDL11;
|
||||||
|
use XML::Compile::Transport::SOAPHTTP;
|
||||||
|
|
||||||
|
# I need access to the WSDL around - or use Data::Dumper::Streamer
|
||||||
|
# for serializing the generated closures into (big) perl files
|
||||||
|
my $wsdl = XML::Compile::WSDL11->new('wsdl/11_helloworld.wsdl');
|
||||||
|
|
||||||
|
# I compile a interface method for a single SOAP method from the WSDL
|
||||||
|
# I have to lookup the method names from the WSDL
|
||||||
|
my $call = $wsdl->compileClient('sayHello');
|
||||||
|
|
||||||
|
# I have to lookup the parameters from the WSDL - can be quite tricky
|
||||||
|
my $result = $call->(
|
||||||
|
name => $ARGV[1] || '"Your name"',
|
||||||
|
givenName => $ARGV[0] || '"Your given name"',
|
||||||
|
);
|
||||||
|
|
||||||
|
# XML::Compile::SOAP's client just returns undef in case of failure
|
||||||
|
die "Error calling soap method" if not defined $result;
|
||||||
|
|
||||||
|
# I have to lookup the output parameters from the WSDL - or try Data::Dumper
|
||||||
|
print $result->{ parameters }->{ sayHelloResult }, "\n";
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
#use strict;
|
||||||
|
use warnings;
|
||||||
|
use SOAP::Lite +trace;
|
||||||
|
|
||||||
|
# I have to lookup the URL from the WSDL
|
||||||
|
my $soap = SOAP::Lite->new(
|
||||||
|
proxy => 'http://localhost:81/soap-wsdl-test/helloworld.pl'
|
||||||
|
);
|
||||||
|
|
||||||
|
# I have to lookup the SOAPAction from the WSDL
|
||||||
|
$soap->on_action( sub { "urn:HelloWorld#sayHello" });
|
||||||
|
$soap->autotype(0);
|
||||||
|
|
||||||
|
# I have to lookup the top level element's namespace from the WSDL
|
||||||
|
$soap->default_ns('urn:HelloWorld');
|
||||||
|
|
||||||
|
# I have to encode all parameters as SOAP::Data objects
|
||||||
|
# I have to know the order of parameters
|
||||||
|
my $som = $soap->call(
|
||||||
|
"sayHello",
|
||||||
|
SOAP::Data->name('name')->value( $ARGV[1] || '"Your name"'),
|
||||||
|
SOAP::Data->name('givenName')->value( $ARGV[0] || '"Your given name"'),
|
||||||
|
);
|
||||||
|
|
||||||
|
die $som->fault->{ faultstring } if ($som->fault);
|
||||||
|
|
||||||
|
print $som->result, "\n";
|
||||||
|
|
||||||
@@ -1,29 +1,8 @@
|
|||||||
package MyElements::CountCookies;
|
package MyElements::CountCookies;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use warnings;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
|
||||||
|
|
||||||
# atomic complexType
|
|
||||||
# <element name="CountCookies"><complexType> definition
|
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
|
||||||
use base qw(
|
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
|
||||||
[ qw() ],
|
|
||||||
{
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
||||||
|
|
||||||
@@ -31,41 +10,45 @@ __PACKAGE__->__set_name('CountCookies');
|
|||||||
__PACKAGE__->__set_nillable();
|
__PACKAGE__->__set_nillable();
|
||||||
__PACKAGE__->__set_minOccurs();
|
__PACKAGE__->__set_minOccurs();
|
||||||
__PACKAGE__->__set_maxOccurs();
|
__PACKAGE__->__set_maxOccurs();
|
||||||
__PACKAGE__->__set_ref('');
|
__PACKAGE__->__set_ref();
|
||||||
|
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
__END__
|
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::CountCookies
|
=head1 NAME
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
MyElements::CountCookies
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element CountCookies.
|
Perl data type class for the XML Schema defined element
|
||||||
|
CountCookies from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 METHODS
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
=head2 new
|
||||||
methods:
|
|
||||||
|
|
||||||
|
my $element = MyElements::CountCookies->new($data);
|
||||||
|
|
||||||
=head1 Object structure
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
,
|
||||||
|
|
||||||
Structure as perl hash:
|
=head1 AUTHOR
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
|
||||||
(look for classes of the same name in your typleib).
|
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
|
||||||
tree.
|
|
||||||
|
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,37 +1,8 @@
|
|||||||
package MyElements::CountCookiesResponse;
|
package MyElements::CountCookiesResponse;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use warnings;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
|
||||||
|
|
||||||
# atomic complexType
|
|
||||||
# <element name="CountCookiesResponse"><complexType> definition
|
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
|
||||||
use base qw(
|
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
my %CountCookiesResult_of :ATTR(:get<CountCookiesResult>);
|
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
|
||||||
[ qw(
|
|
||||||
CountCookiesResult
|
|
||||||
) ],
|
|
||||||
{
|
|
||||||
CountCookiesResult => \%CountCookiesResult_of,
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
|
|
||||||
CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
||||||
|
|
||||||
@@ -39,47 +10,72 @@ __PACKAGE__->__set_name('CountCookiesResponse');
|
|||||||
__PACKAGE__->__set_nillable();
|
__PACKAGE__->__set_nillable();
|
||||||
__PACKAGE__->__set_minOccurs();
|
__PACKAGE__->__set_minOccurs();
|
||||||
__PACKAGE__->__set_maxOccurs();
|
__PACKAGE__->__set_maxOccurs();
|
||||||
__PACKAGE__->__set_ref('');
|
__PACKAGE__->__set_ref();
|
||||||
|
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %CountCookiesResult_of :ATTR(:get<CountCookiesResult>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
CountCookiesResult
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
CountCookiesResult => \%CountCookiesResult_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
__END__
|
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::CountCookiesResponse
|
=head1 NAME
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
MyElements::CountCookiesResponse
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element CountCookiesResponse.
|
Perl data type class for the XML Schema defined element
|
||||||
|
CountCookiesResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 METHODS
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
=head2 new
|
||||||
methods:
|
|
||||||
|
|
||||||
CountCookiesResult
|
my $element = MyElements::CountCookiesResponse->new($data);
|
||||||
|
|
||||||
=head1 Object structure
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
{
|
||||||
|
CountCookiesResult => $some_value, # int
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
Structure as perl hash:
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
|
||||||
(look for classes of the same name in your typleib).
|
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
|
||||||
tree.
|
|
||||||
|
|
||||||
'CountCookiesResponse'=> {
|
|
||||||
'CountCookiesResult' => $someValue,
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,104 @@
|
|||||||
|
package MyElements::GenerateBarCode;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
sub get_xmlns { 'http://www.webservicex.net/' }
|
||||||
|
|
||||||
|
__PACKAGE__->__set_name('GenerateBarCode');
|
||||||
|
__PACKAGE__->__set_nillable();
|
||||||
|
__PACKAGE__->__set_minOccurs();
|
||||||
|
__PACKAGE__->__set_maxOccurs();
|
||||||
|
__PACKAGE__->__set_ref();
|
||||||
|
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %BarCodeParam_of :ATTR(:get<BarCodeParam>);
|
||||||
|
my %BarCodeText_of :ATTR(:get<BarCodeText>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
BarCodeParam
|
||||||
|
BarCodeText
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
BarCodeParam => \%BarCodeParam_of,
|
||||||
|
BarCodeText => \%BarCodeText_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BarCodeParam => 'MyTypes::BarCodeData',
|
||||||
|
BarCodeText => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyElements::GenerateBarCode
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined element
|
||||||
|
GenerateBarCode from the namespace http://www.webservicex.net/.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
my $element = MyElements::GenerateBarCode->new($data);
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
{
|
||||||
|
BarCodeParam => { # MyTypes::BarCodeData
|
||||||
|
Height => $some_value, # int
|
||||||
|
Width => $some_value, # int
|
||||||
|
Angle => $some_value, # int
|
||||||
|
Ratio => $some_value, # int
|
||||||
|
Module => $some_value, # int
|
||||||
|
Left => $some_value, # int
|
||||||
|
Top => $some_value, # int
|
||||||
|
CheckSum => $some_value, # boolean
|
||||||
|
FontName => $some_value, # string
|
||||||
|
BarColor => $some_value, # string
|
||||||
|
BGColor => $some_value, # string
|
||||||
|
FontSize => $some_value, # float
|
||||||
|
barcodeOption => $some_value, # BarcodeOption
|
||||||
|
barcodeType => $some_value, # BarcodeType
|
||||||
|
checkSumMethod => $some_value, # CheckSumMethod
|
||||||
|
showTextPosition => $some_value, # ShowTextPosition
|
||||||
|
BarCodeImageFormat => $some_value, # ImageFormats
|
||||||
|
},
|
||||||
|
BarCodeText => $some_value, # string
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
package MyElements::GenerateBarCodeResponse;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
sub get_xmlns { 'http://www.webservicex.net/' }
|
||||||
|
|
||||||
|
__PACKAGE__->__set_name('GenerateBarCodeResponse');
|
||||||
|
__PACKAGE__->__set_nillable();
|
||||||
|
__PACKAGE__->__set_minOccurs();
|
||||||
|
__PACKAGE__->__set_maxOccurs();
|
||||||
|
__PACKAGE__->__set_ref();
|
||||||
|
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %GenerateBarCodeResult_of :ATTR(:get<GenerateBarCodeResult>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
GenerateBarCodeResult
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
GenerateBarCodeResult => \%GenerateBarCodeResult_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
GenerateBarCodeResult => 'SOAP::WSDL::XSD::Typelib::Builtin::base64Binary',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyElements::GenerateBarCodeResponse
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined element
|
||||||
|
GenerateBarCodeResponse from the namespace http://www.webservicex.net/.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
my $element = MyElements::GenerateBarCodeResponse->new($data);
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
{
|
||||||
|
GenerateBarCodeResult => $some_value, # base64Binary
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -1,37 +1,8 @@
|
|||||||
package MyElements::GetCitiesByCountry;
|
package MyElements::GetCitiesByCountry;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use warnings;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
|
||||||
|
|
||||||
# atomic complexType
|
|
||||||
# <element name="GetCitiesByCountry"><complexType> definition
|
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
|
||||||
use base qw(
|
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
my %CountryName_of :ATTR(:get<CountryName>);
|
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
|
||||||
[ qw(
|
|
||||||
CountryName
|
|
||||||
) ],
|
|
||||||
{
|
|
||||||
CountryName => \%CountryName_of,
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
|
|
||||||
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.webserviceX.NET' }
|
sub get_xmlns { 'http://www.webserviceX.NET' }
|
||||||
|
|
||||||
@@ -39,47 +10,72 @@ __PACKAGE__->__set_name('GetCitiesByCountry');
|
|||||||
__PACKAGE__->__set_nillable();
|
__PACKAGE__->__set_nillable();
|
||||||
__PACKAGE__->__set_minOccurs();
|
__PACKAGE__->__set_minOccurs();
|
||||||
__PACKAGE__->__set_maxOccurs();
|
__PACKAGE__->__set_maxOccurs();
|
||||||
__PACKAGE__->__set_ref('');
|
__PACKAGE__->__set_ref();
|
||||||
|
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %CountryName_of :ATTR(:get<CountryName>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
CountryName
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
CountryName => \%CountryName_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
__END__
|
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::GetCitiesByCountry
|
=head1 NAME
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
MyElements::GetCitiesByCountry
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element GetCitiesByCountry.
|
Perl data type class for the XML Schema defined element
|
||||||
|
GetCitiesByCountry from the namespace http://www.webserviceX.NET.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 METHODS
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
=head2 new
|
||||||
methods:
|
|
||||||
|
|
||||||
CountryName
|
my $element = MyElements::GetCitiesByCountry->new($data);
|
||||||
|
|
||||||
=head1 Object structure
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
{
|
||||||
|
CountryName => $some_value, # string
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
Structure as perl hash:
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
|
||||||
(look for classes of the same name in your typleib).
|
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
|
||||||
tree.
|
|
||||||
|
|
||||||
'GetCitiesByCountry'=> {
|
|
||||||
'CountryName' => $someValue,
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,37 +1,8 @@
|
|||||||
package MyElements::GetCitiesByCountryResponse;
|
package MyElements::GetCitiesByCountryResponse;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use warnings;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
|
||||||
|
|
||||||
# atomic complexType
|
|
||||||
# <element name="GetCitiesByCountryResponse"><complexType> definition
|
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
|
||||||
use base qw(
|
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
my %GetCitiesByCountryResult_of :ATTR(:get<GetCitiesByCountryResult>);
|
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
|
||||||
[ qw(
|
|
||||||
GetCitiesByCountryResult
|
|
||||||
) ],
|
|
||||||
{
|
|
||||||
GetCitiesByCountryResult => \%GetCitiesByCountryResult_of,
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
|
|
||||||
GetCitiesByCountryResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.webserviceX.NET' }
|
sub get_xmlns { 'http://www.webserviceX.NET' }
|
||||||
|
|
||||||
@@ -39,47 +10,72 @@ __PACKAGE__->__set_name('GetCitiesByCountryResponse');
|
|||||||
__PACKAGE__->__set_nillable();
|
__PACKAGE__->__set_nillable();
|
||||||
__PACKAGE__->__set_minOccurs();
|
__PACKAGE__->__set_minOccurs();
|
||||||
__PACKAGE__->__set_maxOccurs();
|
__PACKAGE__->__set_maxOccurs();
|
||||||
__PACKAGE__->__set_ref('');
|
__PACKAGE__->__set_ref();
|
||||||
|
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %GetCitiesByCountryResult_of :ATTR(:get<GetCitiesByCountryResult>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
GetCitiesByCountryResult
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
GetCitiesByCountryResult => \%GetCitiesByCountryResult_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
GetCitiesByCountryResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
__END__
|
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::GetCitiesByCountryResponse
|
=head1 NAME
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
MyElements::GetCitiesByCountryResponse
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element GetCitiesByCountryResponse.
|
Perl data type class for the XML Schema defined element
|
||||||
|
GetCitiesByCountryResponse from the namespace http://www.webserviceX.NET.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 METHODS
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
=head2 new
|
||||||
methods:
|
|
||||||
|
|
||||||
GetCitiesByCountryResult
|
my $element = MyElements::GetCitiesByCountryResponse->new($data);
|
||||||
|
|
||||||
=head1 Object structure
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
GetCitiesByCountryResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
{
|
||||||
|
GetCitiesByCountryResult => $some_value, # string
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
Structure as perl hash:
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
|
||||||
(look for classes of the same name in your typleib).
|
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
|
||||||
tree.
|
|
||||||
|
|
||||||
'GetCitiesByCountryResponse'=> {
|
|
||||||
'GetCitiesByCountryResult' => $someValue,
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,29 +1,8 @@
|
|||||||
package MyElements::GetFortuneCookie;
|
package MyElements::GetFortuneCookie;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use warnings;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
|
||||||
|
|
||||||
# atomic complexType
|
|
||||||
# <element name="GetFortuneCookie"><complexType> definition
|
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
|
||||||
use base qw(
|
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
|
||||||
[ qw() ],
|
|
||||||
{
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
||||||
|
|
||||||
@@ -31,41 +10,45 @@ __PACKAGE__->__set_name('GetFortuneCookie');
|
|||||||
__PACKAGE__->__set_nillable();
|
__PACKAGE__->__set_nillable();
|
||||||
__PACKAGE__->__set_minOccurs();
|
__PACKAGE__->__set_minOccurs();
|
||||||
__PACKAGE__->__set_maxOccurs();
|
__PACKAGE__->__set_maxOccurs();
|
||||||
__PACKAGE__->__set_ref('');
|
__PACKAGE__->__set_ref();
|
||||||
|
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
__END__
|
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::GetFortuneCookie
|
=head1 NAME
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
MyElements::GetFortuneCookie
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element GetFortuneCookie.
|
Perl data type class for the XML Schema defined element
|
||||||
|
GetFortuneCookie from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 METHODS
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
=head2 new
|
||||||
methods:
|
|
||||||
|
|
||||||
|
my $element = MyElements::GetFortuneCookie->new($data);
|
||||||
|
|
||||||
=head1 Object structure
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
,
|
||||||
|
|
||||||
Structure as perl hash:
|
=head1 AUTHOR
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
|
||||||
(look for classes of the same name in your typleib).
|
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
|
||||||
tree.
|
|
||||||
|
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,37 +1,8 @@
|
|||||||
package MyElements::GetFortuneCookieResponse;
|
package MyElements::GetFortuneCookieResponse;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use warnings;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
|
||||||
|
|
||||||
# atomic complexType
|
|
||||||
# <element name="GetFortuneCookieResponse"><complexType> definition
|
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
|
||||||
use base qw(
|
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
my %GetFortuneCookieResult_of :ATTR(:get<GetFortuneCookieResult>);
|
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
|
||||||
[ qw(
|
|
||||||
GetFortuneCookieResult
|
|
||||||
) ],
|
|
||||||
{
|
|
||||||
GetFortuneCookieResult => \%GetFortuneCookieResult_of,
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
|
|
||||||
GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
||||||
|
|
||||||
@@ -39,47 +10,72 @@ __PACKAGE__->__set_name('GetFortuneCookieResponse');
|
|||||||
__PACKAGE__->__set_nillable();
|
__PACKAGE__->__set_nillable();
|
||||||
__PACKAGE__->__set_minOccurs();
|
__PACKAGE__->__set_minOccurs();
|
||||||
__PACKAGE__->__set_maxOccurs();
|
__PACKAGE__->__set_maxOccurs();
|
||||||
__PACKAGE__->__set_ref('');
|
__PACKAGE__->__set_ref();
|
||||||
|
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %GetFortuneCookieResult_of :ATTR(:get<GetFortuneCookieResult>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
GetFortuneCookieResult
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
GetFortuneCookieResult => \%GetFortuneCookieResult_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
__END__
|
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::GetFortuneCookieResponse
|
=head1 NAME
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
MyElements::GetFortuneCookieResponse
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element GetFortuneCookieResponse.
|
Perl data type class for the XML Schema defined element
|
||||||
|
GetFortuneCookieResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 METHODS
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
=head2 new
|
||||||
methods:
|
|
||||||
|
|
||||||
GetFortuneCookieResult
|
my $element = MyElements::GetFortuneCookieResponse->new($data);
|
||||||
|
|
||||||
=head1 Object structure
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
{
|
||||||
|
GetFortuneCookieResult => $some_value, # string
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
Structure as perl hash:
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
|
||||||
(look for classes of the same name in your typleib).
|
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
|
||||||
tree.
|
|
||||||
|
|
||||||
'GetFortuneCookieResponse'=> {
|
|
||||||
'GetFortuneCookieResult' => $someValue,
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,37 +1,8 @@
|
|||||||
package MyElements::GetSpecificCookie;
|
package MyElements::GetSpecificCookie;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use warnings;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
|
||||||
|
|
||||||
# atomic complexType
|
|
||||||
# <element name="GetSpecificCookie"><complexType> definition
|
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
|
||||||
use base qw(
|
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
my %index_of :ATTR(:get<index>);
|
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
|
||||||
[ qw(
|
|
||||||
index
|
|
||||||
) ],
|
|
||||||
{
|
|
||||||
index => \%index_of,
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
|
|
||||||
index => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
||||||
|
|
||||||
@@ -39,47 +10,72 @@ __PACKAGE__->__set_name('GetSpecificCookie');
|
|||||||
__PACKAGE__->__set_nillable();
|
__PACKAGE__->__set_nillable();
|
||||||
__PACKAGE__->__set_minOccurs();
|
__PACKAGE__->__set_minOccurs();
|
||||||
__PACKAGE__->__set_maxOccurs();
|
__PACKAGE__->__set_maxOccurs();
|
||||||
__PACKAGE__->__set_ref('');
|
__PACKAGE__->__set_ref();
|
||||||
|
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %index_of :ATTR(:get<index>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
index
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
index => \%index_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
index => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
__END__
|
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::GetSpecificCookie
|
=head1 NAME
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
MyElements::GetSpecificCookie
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element GetSpecificCookie.
|
Perl data type class for the XML Schema defined element
|
||||||
|
GetSpecificCookie from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 METHODS
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
=head2 new
|
||||||
methods:
|
|
||||||
|
|
||||||
index
|
my $element = MyElements::GetSpecificCookie->new($data);
|
||||||
|
|
||||||
=head1 Object structure
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
index => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
{
|
||||||
|
index => $some_value, # int
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
Structure as perl hash:
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
|
||||||
(look for classes of the same name in your typleib).
|
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
|
||||||
tree.
|
|
||||||
|
|
||||||
'GetSpecificCookie'=> {
|
|
||||||
'index' => $someValue,
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,37 +1,8 @@
|
|||||||
package MyElements::GetSpecificCookieResponse;
|
package MyElements::GetSpecificCookieResponse;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use warnings;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
|
||||||
|
|
||||||
# atomic complexType
|
|
||||||
# <element name="GetSpecificCookieResponse"><complexType> definition
|
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
|
||||||
use base qw(
|
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
my %GetSpecificCookieResult_of :ATTR(:get<GetSpecificCookieResult>);
|
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
|
||||||
[ qw(
|
|
||||||
GetSpecificCookieResult
|
|
||||||
) ],
|
|
||||||
{
|
|
||||||
GetSpecificCookieResult => \%GetSpecificCookieResult_of,
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
|
|
||||||
GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
||||||
|
|
||||||
@@ -39,47 +10,72 @@ __PACKAGE__->__set_name('GetSpecificCookieResponse');
|
|||||||
__PACKAGE__->__set_nillable();
|
__PACKAGE__->__set_nillable();
|
||||||
__PACKAGE__->__set_minOccurs();
|
__PACKAGE__->__set_minOccurs();
|
||||||
__PACKAGE__->__set_maxOccurs();
|
__PACKAGE__->__set_maxOccurs();
|
||||||
__PACKAGE__->__set_ref('');
|
__PACKAGE__->__set_ref();
|
||||||
|
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %GetSpecificCookieResult_of :ATTR(:get<GetSpecificCookieResult>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
GetSpecificCookieResult
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
GetSpecificCookieResult => \%GetSpecificCookieResult_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
__END__
|
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::GetSpecificCookieResponse
|
=head1 NAME
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
MyElements::GetSpecificCookieResponse
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element GetSpecificCookieResponse.
|
Perl data type class for the XML Schema defined element
|
||||||
|
GetSpecificCookieResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 METHODS
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
=head2 new
|
||||||
methods:
|
|
||||||
|
|
||||||
GetSpecificCookieResult
|
my $element = MyElements::GetSpecificCookieResponse->new($data);
|
||||||
|
|
||||||
=head1 Object structure
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
{
|
||||||
|
GetSpecificCookieResult => $some_value, # string
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
Structure as perl hash:
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
|
||||||
(look for classes of the same name in your typleib).
|
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
|
||||||
tree.
|
|
||||||
|
|
||||||
'GetSpecificCookieResponse'=> {
|
|
||||||
'GetSpecificCookieResult' => $someValue,
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,45 +1,8 @@
|
|||||||
package MyElements::GetWeather;
|
package MyElements::GetWeather;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use warnings;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
|
||||||
|
|
||||||
# atomic complexType
|
|
||||||
# <element name="GetWeather"><complexType> definition
|
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
|
||||||
use base qw(
|
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
my %CityName_of :ATTR(:get<CityName>);
|
|
||||||
|
|
||||||
my %CountryName_of :ATTR(:get<CountryName>);
|
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
|
||||||
[ qw(
|
|
||||||
CityName
|
|
||||||
|
|
||||||
CountryName
|
|
||||||
) ],
|
|
||||||
{
|
|
||||||
CityName => \%CityName_of,
|
|
||||||
CountryName => \%CountryName_of,
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
|
|
||||||
CityName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
|
||||||
|
|
||||||
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.webserviceX.NET' }
|
sub get_xmlns { 'http://www.webserviceX.NET' }
|
||||||
|
|
||||||
@@ -47,51 +10,77 @@ __PACKAGE__->__set_name('GetWeather');
|
|||||||
__PACKAGE__->__set_nillable();
|
__PACKAGE__->__set_nillable();
|
||||||
__PACKAGE__->__set_minOccurs();
|
__PACKAGE__->__set_minOccurs();
|
||||||
__PACKAGE__->__set_maxOccurs();
|
__PACKAGE__->__set_maxOccurs();
|
||||||
__PACKAGE__->__set_ref('');
|
__PACKAGE__->__set_ref();
|
||||||
|
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %CityName_of :ATTR(:get<CityName>);
|
||||||
|
my %CountryName_of :ATTR(:get<CountryName>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
CityName
|
||||||
|
CountryName
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
CityName => \%CityName_of,
|
||||||
|
CountryName => \%CountryName_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
CityName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
__END__
|
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::GetWeather
|
=head1 NAME
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
MyElements::GetWeather
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element GetWeather.
|
Perl data type class for the XML Schema defined element
|
||||||
|
GetWeather from the namespace http://www.webserviceX.NET.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 METHODS
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
=head2 new
|
||||||
methods:
|
|
||||||
|
|
||||||
CityName
|
my $element = MyElements::GetWeather->new($data);
|
||||||
CountryName
|
|
||||||
|
|
||||||
=head1 Object structure
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
CityName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
{
|
||||||
|
CityName => $some_value, # string
|
||||||
|
CountryName => $some_value, # string
|
||||||
|
},
|
||||||
|
|
||||||
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
|
||||||
Structure as perl hash:
|
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
|
||||||
(look for classes of the same name in your typleib).
|
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
|
||||||
tree.
|
|
||||||
|
|
||||||
'GetWeather'=> {
|
|
||||||
'CityName' => $someValue,
|
|
||||||
'CountryName' => $someValue,
|
|
||||||
},
|
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,37 +1,8 @@
|
|||||||
package MyElements::GetWeatherResponse;
|
package MyElements::GetWeatherResponse;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use warnings;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
|
||||||
|
|
||||||
# atomic complexType
|
|
||||||
# <element name="GetWeatherResponse"><complexType> definition
|
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
|
||||||
use base qw(
|
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
my %GetWeatherResult_of :ATTR(:get<GetWeatherResult>);
|
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
|
||||||
[ qw(
|
|
||||||
GetWeatherResult
|
|
||||||
) ],
|
|
||||||
{
|
|
||||||
GetWeatherResult => \%GetWeatherResult_of,
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
|
|
||||||
GetWeatherResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.webserviceX.NET' }
|
sub get_xmlns { 'http://www.webserviceX.NET' }
|
||||||
|
|
||||||
@@ -39,47 +10,72 @@ __PACKAGE__->__set_name('GetWeatherResponse');
|
|||||||
__PACKAGE__->__set_nillable();
|
__PACKAGE__->__set_nillable();
|
||||||
__PACKAGE__->__set_minOccurs();
|
__PACKAGE__->__set_minOccurs();
|
||||||
__PACKAGE__->__set_maxOccurs();
|
__PACKAGE__->__set_maxOccurs();
|
||||||
__PACKAGE__->__set_ref('');
|
__PACKAGE__->__set_ref();
|
||||||
|
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %GetWeatherResult_of :ATTR(:get<GetWeatherResult>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
GetWeatherResult
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
GetWeatherResult => \%GetWeatherResult_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
GetWeatherResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
__END__
|
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::GetWeatherResponse
|
=head1 NAME
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
MyElements::GetWeatherResponse
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element GetWeatherResponse.
|
Perl data type class for the XML Schema defined element
|
||||||
|
GetWeatherResponse from the namespace http://www.webserviceX.NET.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 METHODS
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
=head2 new
|
||||||
methods:
|
|
||||||
|
|
||||||
GetWeatherResult
|
my $element = MyElements::GetWeatherResponse->new($data);
|
||||||
|
|
||||||
=head1 Object structure
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
GetWeatherResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
{
|
||||||
|
GetWeatherResult => $some_value, # string
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
Structure as perl hash:
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
|
||||||
(look for classes of the same name in your typleib).
|
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
|
||||||
tree.
|
|
||||||
|
|
||||||
'GetWeatherResponse'=> {
|
|
||||||
'GetWeatherResult' => $someValue,
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,111 @@
|
|||||||
|
package MyElements::ListPerson;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
sub get_xmlns { 'http://www.example.org/benchmark/' }
|
||||||
|
|
||||||
|
__PACKAGE__->__set_name('ListPerson');
|
||||||
|
__PACKAGE__->__set_nillable();
|
||||||
|
__PACKAGE__->__set_minOccurs();
|
||||||
|
__PACKAGE__->__set_maxOccurs();
|
||||||
|
__PACKAGE__->__set_ref();
|
||||||
|
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %in_of :ATTR(:get<in>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
in
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
in => \%in_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
in => 'MyTypes::Person',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyElements::ListPerson
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined element
|
||||||
|
ListPerson from the namespace http://www.example.org/benchmark/.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
my $element = MyElements::ListPerson->new($data);
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
{
|
||||||
|
in => { # MyTypes::Person
|
||||||
|
PersonID => { # MyTypes::PersonID
|
||||||
|
ID => $some_value, # int
|
||||||
|
},
|
||||||
|
Salutation => $some_value, # string
|
||||||
|
Name => $some_value, # string
|
||||||
|
GivenName => $some_value, # string
|
||||||
|
DateOfBirth => $some_value, # date
|
||||||
|
HomeAddress => { # MyTypes::Address
|
||||||
|
Street => $some_value, # string
|
||||||
|
ZIP => $some_value, # string
|
||||||
|
City => $some_value, # string
|
||||||
|
Country => $some_value, # string
|
||||||
|
PhoneNumber => $some_value, # PhoneNumber
|
||||||
|
MobilePhoneNumber => $some_value, # PhoneNumber
|
||||||
|
},
|
||||||
|
WorkAddress => { # MyTypes::Address
|
||||||
|
Street => $some_value, # string
|
||||||
|
ZIP => $some_value, # string
|
||||||
|
City => $some_value, # string
|
||||||
|
Country => $some_value, # string
|
||||||
|
PhoneNumber => $some_value, # PhoneNumber
|
||||||
|
MobilePhoneNumber => $some_value, # PhoneNumber
|
||||||
|
},
|
||||||
|
Contracts => { # MyTypes::ArrayOfContract
|
||||||
|
Contract => { # MyTypes::Contract
|
||||||
|
ContractID => $some_value, # long
|
||||||
|
ContractName => $some_value, # string
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,113 @@
|
|||||||
|
package MyElements::ListPersonResponse;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
sub get_xmlns { 'http://www.example.org/benchmark/' }
|
||||||
|
|
||||||
|
__PACKAGE__->__set_name('ListPersonResponse');
|
||||||
|
__PACKAGE__->__set_nillable();
|
||||||
|
__PACKAGE__->__set_minOccurs();
|
||||||
|
__PACKAGE__->__set_maxOccurs();
|
||||||
|
__PACKAGE__->__set_ref();
|
||||||
|
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %out_of :ATTR(:get<out>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
out
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
out => \%out_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
out => 'MyTypes::ArrayOfPerson',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyElements::ListPersonResponse
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined element
|
||||||
|
ListPersonResponse from the namespace http://www.example.org/benchmark/.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
my $element = MyElements::ListPersonResponse->new($data);
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
{
|
||||||
|
out => { # MyTypes::ArrayOfPerson
|
||||||
|
NewElement => { # MyTypes::Person
|
||||||
|
PersonID => { # MyTypes::PersonID
|
||||||
|
ID => $some_value, # int
|
||||||
|
},
|
||||||
|
Salutation => $some_value, # string
|
||||||
|
Name => $some_value, # string
|
||||||
|
GivenName => $some_value, # string
|
||||||
|
DateOfBirth => $some_value, # date
|
||||||
|
HomeAddress => { # MyTypes::Address
|
||||||
|
Street => $some_value, # string
|
||||||
|
ZIP => $some_value, # string
|
||||||
|
City => $some_value, # string
|
||||||
|
Country => $some_value, # string
|
||||||
|
PhoneNumber => $some_value, # PhoneNumber
|
||||||
|
MobilePhoneNumber => $some_value, # PhoneNumber
|
||||||
|
},
|
||||||
|
WorkAddress => { # MyTypes::Address
|
||||||
|
Street => $some_value, # string
|
||||||
|
ZIP => $some_value, # string
|
||||||
|
City => $some_value, # string
|
||||||
|
Country => $some_value, # string
|
||||||
|
PhoneNumber => $some_value, # PhoneNumber
|
||||||
|
MobilePhoneNumber => $some_value, # PhoneNumber
|
||||||
|
},
|
||||||
|
Contracts => { # MyTypes::ArrayOfContract
|
||||||
|
Contract => { # MyTypes::Contract
|
||||||
|
ContractID => $some_value, # long
|
||||||
|
ContractName => $some_value, # string
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -1,17 +1,8 @@
|
|||||||
package MyElements::int;
|
package MyElements::int;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use warnings;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
|
||||||
|
|
||||||
#
|
|
||||||
# <element name="int" type="s:int"/> definition
|
|
||||||
#
|
|
||||||
|
|
||||||
use base qw(
|
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::int
|
|
||||||
);
|
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
||||||
|
|
||||||
@@ -19,42 +10,43 @@ __PACKAGE__->__set_name('int');
|
|||||||
__PACKAGE__->__set_nillable();
|
__PACKAGE__->__set_nillable();
|
||||||
__PACKAGE__->__set_minOccurs();
|
__PACKAGE__->__set_minOccurs();
|
||||||
__PACKAGE__->__set_maxOccurs();
|
__PACKAGE__->__set_maxOccurs();
|
||||||
__PACKAGE__->__set_ref('');
|
__PACKAGE__->__set_ref();
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::Builtin::int
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
__END__
|
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::int
|
=head1 NAME
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
MyElements::int
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element int.
|
Perl data type class for the XML Schema defined element
|
||||||
|
int from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 METHODS
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
=head2 new
|
||||||
methods:
|
|
||||||
|
|
||||||
|
my $element = MyElements::int->new($data);
|
||||||
|
|
||||||
=head1 Object structure
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
$some_value, # int
|
||||||
|
|
||||||
Structure as perl hash:
|
=head1 AUTHOR
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
|
||||||
(look for classes of the same name in your typleib).
|
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
|
||||||
tree.
|
|
||||||
|
|
||||||
'int' => $someValue,
|
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,29 +1,8 @@
|
|||||||
package MyElements::readNodeCount;
|
package MyElements::readNodeCount;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use warnings;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
|
||||||
|
|
||||||
# atomic complexType
|
|
||||||
# <element name="readNodeCount"><complexType> definition
|
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
|
||||||
use base qw(
|
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
|
||||||
[ qw() ],
|
|
||||||
{
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
||||||
|
|
||||||
@@ -31,41 +10,45 @@ __PACKAGE__->__set_name('readNodeCount');
|
|||||||
__PACKAGE__->__set_nillable();
|
__PACKAGE__->__set_nillable();
|
||||||
__PACKAGE__->__set_minOccurs();
|
__PACKAGE__->__set_minOccurs();
|
||||||
__PACKAGE__->__set_maxOccurs();
|
__PACKAGE__->__set_maxOccurs();
|
||||||
__PACKAGE__->__set_ref('');
|
__PACKAGE__->__set_ref();
|
||||||
|
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
__END__
|
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::readNodeCount
|
=head1 NAME
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
MyElements::readNodeCount
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element readNodeCount.
|
Perl data type class for the XML Schema defined element
|
||||||
|
readNodeCount from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 METHODS
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
=head2 new
|
||||||
methods:
|
|
||||||
|
|
||||||
|
my $element = MyElements::readNodeCount->new($data);
|
||||||
|
|
||||||
=head1 Object structure
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
,
|
||||||
|
|
||||||
Structure as perl hash:
|
=head1 AUTHOR
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
|
||||||
(look for classes of the same name in your typleib).
|
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
|
||||||
tree.
|
|
||||||
|
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,37 +1,8 @@
|
|||||||
package MyElements::readNodeCountResponse;
|
package MyElements::readNodeCountResponse;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use warnings;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
|
||||||
|
|
||||||
# atomic complexType
|
|
||||||
# <element name="readNodeCountResponse"><complexType> definition
|
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
|
||||||
use base qw(
|
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
my %readNodeCountResult_of :ATTR(:get<readNodeCountResult>);
|
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
|
||||||
[ qw(
|
|
||||||
readNodeCountResult
|
|
||||||
) ],
|
|
||||||
{
|
|
||||||
readNodeCountResult => \%readNodeCountResult_of,
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
|
|
||||||
readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
||||||
|
|
||||||
@@ -39,47 +10,72 @@ __PACKAGE__->__set_name('readNodeCountResponse');
|
|||||||
__PACKAGE__->__set_nillable();
|
__PACKAGE__->__set_nillable();
|
||||||
__PACKAGE__->__set_minOccurs();
|
__PACKAGE__->__set_minOccurs();
|
||||||
__PACKAGE__->__set_maxOccurs();
|
__PACKAGE__->__set_maxOccurs();
|
||||||
__PACKAGE__->__set_ref('');
|
__PACKAGE__->__set_ref();
|
||||||
|
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %readNodeCountResult_of :ATTR(:get<readNodeCountResult>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
readNodeCountResult
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
readNodeCountResult => \%readNodeCountResult_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
__END__
|
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::readNodeCountResponse
|
=head1 NAME
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
MyElements::readNodeCountResponse
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element readNodeCountResponse.
|
Perl data type class for the XML Schema defined element
|
||||||
|
readNodeCountResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 METHODS
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
=head2 new
|
||||||
methods:
|
|
||||||
|
|
||||||
readNodeCountResult
|
my $element = MyElements::readNodeCountResponse->new($data);
|
||||||
|
|
||||||
=head1 Object structure
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
{
|
||||||
|
readNodeCountResult => $some_value, # int
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
Structure as perl hash:
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
|
||||||
(look for classes of the same name in your typleib).
|
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
|
||||||
tree.
|
|
||||||
|
|
||||||
'readNodeCountResponse'=> {
|
|
||||||
'readNodeCountResult' => $someValue,
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,86 @@
|
|||||||
|
package MyElements::sayHello;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
sub get_xmlns { 'urn:HelloWorld' }
|
||||||
|
|
||||||
|
__PACKAGE__->__set_name('sayHello');
|
||||||
|
__PACKAGE__->__set_nillable();
|
||||||
|
__PACKAGE__->__set_minOccurs();
|
||||||
|
__PACKAGE__->__set_maxOccurs();
|
||||||
|
__PACKAGE__->__set_ref();
|
||||||
|
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %name_of :ATTR(:get<name>);
|
||||||
|
my %givenName_of :ATTR(:get<givenName>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
name
|
||||||
|
givenName
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
name => \%name_of,
|
||||||
|
givenName => \%givenName_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
givenName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyElements::sayHello
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined element
|
||||||
|
sayHello from the namespace urn:HelloWorld.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
my $element = MyElements::sayHello->new($data);
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
{
|
||||||
|
name => $some_value, # string
|
||||||
|
givenName => $some_value, # string
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
package MyElements::sayHelloResponse;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
sub get_xmlns { 'urn:HelloWorld' }
|
||||||
|
|
||||||
|
__PACKAGE__->__set_name('sayHelloResponse');
|
||||||
|
__PACKAGE__->__set_nillable();
|
||||||
|
__PACKAGE__->__set_minOccurs();
|
||||||
|
__PACKAGE__->__set_maxOccurs();
|
||||||
|
__PACKAGE__->__set_ref();
|
||||||
|
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %sayHelloResult_of :ATTR(:get<sayHelloResult>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
sayHelloResult
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
sayHelloResult => \%sayHelloResult_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sayHelloResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyElements::sayHelloResponse
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined element
|
||||||
|
sayHelloResponse from the namespace urn:HelloWorld.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
my $element = MyElements::sayHelloResponse->new($data);
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
{
|
||||||
|
sayHelloResult => $some_value, # string
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -1,60 +1,52 @@
|
|||||||
package MyElements::string;
|
package MyElements::string;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use warnings;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
|
||||||
|
|
||||||
#
|
{ # BLOCK to scope variables
|
||||||
# <element name="string" type="s:string"/> definition
|
|
||||||
#
|
|
||||||
|
|
||||||
use base qw(
|
sub get_xmlns { 'http://www.webserviceX.NET' }
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::string
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
|
||||||
|
|
||||||
__PACKAGE__->__set_name('string');
|
__PACKAGE__->__set_name('string');
|
||||||
__PACKAGE__->__set_nillable(true);
|
__PACKAGE__->__set_nillable(true);
|
||||||
__PACKAGE__->__set_minOccurs();
|
__PACKAGE__->__set_minOccurs();
|
||||||
__PACKAGE__->__set_maxOccurs();
|
__PACKAGE__->__set_maxOccurs();
|
||||||
__PACKAGE__->__set_ref('');
|
__PACKAGE__->__set_ref();
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
|
SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
} # end of BLOCK
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
# __END__
|
||||||
__END__
|
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::string
|
=head1 NAME
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
MyElements::string
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element string.
|
Perl data type class for the XML Schema defined element
|
||||||
|
string from the namespace http://www.webserviceX.NET.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 METHODS
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
=head2 new
|
||||||
methods:
|
|
||||||
|
|
||||||
|
my $element = MyElements::string->new($data);
|
||||||
|
|
||||||
=head1 Object structure
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
$some_value, # string
|
||||||
|
|
||||||
Structure as perl hash:
|
=head1 AUTHOR
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
|
||||||
(look for classes of the same name in your typleib).
|
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
|
||||||
tree.
|
|
||||||
|
|
||||||
'string' => $someValue,
|
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,135 @@
|
|||||||
|
package MyInterfaces::BarCode::BarCodeSoap;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable;
|
||||||
|
use Scalar::Util qw(blessed);
|
||||||
|
use base qw(SOAP::WSDL::Client::Base);
|
||||||
|
|
||||||
|
# only load if it hasn't been loaded before
|
||||||
|
require MyTypemaps::BarCode
|
||||||
|
if not MyTypemaps::BarCode->can('get_class');
|
||||||
|
|
||||||
|
sub START {
|
||||||
|
$_[0]->set_proxy('http://www.webservicex.net/genericbarcode.asmx') if not $_[2]->{proxy};
|
||||||
|
$_[0]->set_class_resolver('MyTypemaps::BarCode')
|
||||||
|
if not $_[2]->{class_resolver};
|
||||||
|
}
|
||||||
|
|
||||||
|
sub GenerateBarCode {
|
||||||
|
my ($self, $body, $header) = @_;
|
||||||
|
die "GenerateBarCode must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||||
|
return $self->SUPER::call({
|
||||||
|
operation => 'GenerateBarCode',
|
||||||
|
soap_action => 'http://www.webservicex.net/GenerateBarCode',
|
||||||
|
style => 'document',
|
||||||
|
body => {
|
||||||
|
|
||||||
|
'use' => 'literal',
|
||||||
|
namespace => '',
|
||||||
|
encodingStyle => '',
|
||||||
|
parts => [qw( MyElements::GenerateBarCode )],
|
||||||
|
},
|
||||||
|
header => {
|
||||||
|
|
||||||
|
},
|
||||||
|
headerfault => {
|
||||||
|
|
||||||
|
}
|
||||||
|
}, $body, $header);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
|
||||||
|
MyInterfaces::BarCode::BarCodeSoap - SOAP Interface for the BarCode Web Service
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use MyInterfaces::BarCode::BarCodeSoap;
|
||||||
|
my $interface = MyInterfaces::BarCode::BarCodeSoap->new();
|
||||||
|
|
||||||
|
my $response;
|
||||||
|
$response = $interface->GenerateBarCode();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP Interface for the BarCode web service
|
||||||
|
located at http://www.webservicex.net/genericbarcode.asmx.
|
||||||
|
|
||||||
|
=head1 SERVICE BarCode
|
||||||
|
|
||||||
|
Barcode generator
|
||||||
|
|
||||||
|
=head2 Port BarCodeSoap
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 General methods
|
||||||
|
|
||||||
|
=head3 new
|
||||||
|
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
|
||||||
|
|
||||||
|
=head2 SOAP Service methods
|
||||||
|
|
||||||
|
Method synopsis is displayed with hash refs as parameters.
|
||||||
|
|
||||||
|
The commented class names in the method's parameters denote that objects
|
||||||
|
of the corresponding class can be passed instead of the marked hash ref.
|
||||||
|
|
||||||
|
You may pass any combination of objects, hash and list refs to these
|
||||||
|
methods, as long as you meet the structure.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head3 GenerateBarCode
|
||||||
|
|
||||||
|
WebserviceX.NET barcode library that provides the means to create barcodes for printing and display in any internet enabled applications. This web service supports Code 128, Industrial 2 of 5, Interleaved 2 of 5, Code 2 5 Matrix, Code 39, Code 39 Extended, Code 93, Code 93 Extended, Codabar, EAN13, EAN8, MSI, Postnet, Supp2, Supp5, UPC A, UPC E0 and UPC E1 barcode formats. This Barcodes returns byte image. It supports following image format JPEG, GIF, PNG, BMP, EMF, EXIF, ICON, MEMORY BMP, TIFF and WMF.
|
||||||
|
|
||||||
|
$interface->GenerateBarCode( {
|
||||||
|
BarCodeParam => { # MyTypes::BarCodeData
|
||||||
|
Height => $some_value, # int
|
||||||
|
Width => $some_value, # int
|
||||||
|
Angle => $some_value, # int
|
||||||
|
Ratio => $some_value, # int
|
||||||
|
Module => $some_value, # int
|
||||||
|
Left => $some_value, # int
|
||||||
|
Top => $some_value, # int
|
||||||
|
CheckSum => $some_value, # boolean
|
||||||
|
FontName => $some_value, # string
|
||||||
|
BarColor => $some_value, # string
|
||||||
|
BGColor => $some_value, # string
|
||||||
|
FontSize => $some_value, # float
|
||||||
|
barcodeOption => $some_value, # BarcodeOption
|
||||||
|
barcodeType => $some_value, # BarcodeType
|
||||||
|
checkSumMethod => $some_value, # CheckSumMethod
|
||||||
|
showTextPosition => $some_value, # ShowTextPosition
|
||||||
|
BarCodeImageFormat => $some_value, # ImageFormats
|
||||||
|
},
|
||||||
|
BarCodeText => $some_value, # string
|
||||||
|
},,
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL on Sun Dec 16 20:10:20 2007
|
||||||
|
|
||||||
|
=pod
|
||||||
@@ -1,327 +0,0 @@
|
|||||||
package MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie;
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
use MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie;
|
|
||||||
use base 'SOAP::WSDL::Client::Base';
|
|
||||||
|
|
||||||
sub new {
|
|
||||||
my $class = shift;
|
|
||||||
my $arg_ref = shift || {};
|
|
||||||
my $self = $class->SUPER::new({
|
|
||||||
class_resolver => 'MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie',
|
|
||||||
proxy => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx',
|
|
||||||
%{ $arg_ref }
|
|
||||||
});
|
|
||||||
return bless $self, $class;
|
|
||||||
}
|
|
||||||
|
|
||||||
__PACKAGE__->__create_methods(
|
|
||||||
GetSpecificCookie => [ 'MyElements::GetSpecificCookie', ],
|
|
||||||
CountCookies => [ 'MyElements::CountCookies', ],
|
|
||||||
readNodeCount => [ 'MyElements::readNodeCount', ],
|
|
||||||
GetFortuneCookie => [ 'MyElements::GetFortuneCookie', ],
|
|
||||||
|
|
||||||
);
|
|
||||||
|
|
||||||
1;
|
|
||||||
|
|
||||||
__END__
|
|
||||||
|
|
||||||
=pod
|
|
||||||
|
|
||||||
=head1 NAME
|
|
||||||
|
|
||||||
MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie - SOAP interface to FullerData_x0020_Fortune_x0020_Cookie at
|
|
||||||
http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx
|
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
|
||||||
|
|
||||||
my $interface = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie->new();
|
|
||||||
my $CountCookies = $interface->CountCookies();
|
|
||||||
|
|
||||||
|
|
||||||
=head1 Service FullerData_x0020_Fortune_x0020_Cookie
|
|
||||||
|
|
||||||
=head2 Service information:
|
|
||||||
|
|
||||||
Port name: FullerData_x0020_Fortune_x0020_CookieSoap
|
|
||||||
Binding: tns:FullerData_x0020_Fortune_x0020_CookieSoap
|
|
||||||
Location: http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx
|
|
||||||
|
|
||||||
=head2 SOAP Operations
|
|
||||||
|
|
||||||
B<Note:>
|
|
||||||
|
|
||||||
Input, output and fault messages are stated as perl hash refs.
|
|
||||||
|
|
||||||
These are only for informational purposes - the actual implementation
|
|
||||||
normally uses object trees, not hash refs, though the input messages
|
|
||||||
may be passed to the respective methods as hash refs and will be
|
|
||||||
converted to object trees automatically.
|
|
||||||
|
|
||||||
|
|
||||||
=head3 readNodeCount
|
|
||||||
|
|
||||||
B<Input Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 GetFortuneCookie
|
|
||||||
|
|
||||||
B<Input Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 CountCookies
|
|
||||||
|
|
||||||
B<Input Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 GetSpecificCookie
|
|
||||||
|
|
||||||
B<Input Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head2 Service information:
|
|
||||||
|
|
||||||
Port name: FullerData_x0020_Fortune_x0020_CookieHttpGet
|
|
||||||
Binding: tns:FullerData_x0020_Fortune_x0020_CookieHttpGet
|
|
||||||
Location:
|
|
||||||
|
|
||||||
=head2 SOAP Operations
|
|
||||||
|
|
||||||
B<Note:>
|
|
||||||
|
|
||||||
Input, output and fault messages are stated as perl hash refs.
|
|
||||||
|
|
||||||
These are only for informational purposes - the actual implementation
|
|
||||||
normally uses object trees, not hash refs, though the input messages
|
|
||||||
may be passed to the respective methods as hash refs and will be
|
|
||||||
converted to object trees automatically.
|
|
||||||
|
|
||||||
|
|
||||||
=head3 readNodeCount
|
|
||||||
|
|
||||||
B<Input Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 GetFortuneCookie
|
|
||||||
|
|
||||||
B<Input Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 CountCookies
|
|
||||||
|
|
||||||
B<Input Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 GetSpecificCookie
|
|
||||||
|
|
||||||
B<Input Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head2 Service information:
|
|
||||||
|
|
||||||
Port name: FullerData_x0020_Fortune_x0020_CookieHttpPost
|
|
||||||
Binding: tns:FullerData_x0020_Fortune_x0020_CookieHttpPost
|
|
||||||
Location:
|
|
||||||
|
|
||||||
=head2 SOAP Operations
|
|
||||||
|
|
||||||
B<Note:>
|
|
||||||
|
|
||||||
Input, output and fault messages are stated as perl hash refs.
|
|
||||||
|
|
||||||
These are only for informational purposes - the actual implementation
|
|
||||||
normally uses object trees, not hash refs, though the input messages
|
|
||||||
may be passed to the respective methods as hash refs and will be
|
|
||||||
converted to object trees automatically.
|
|
||||||
|
|
||||||
|
|
||||||
=head3 readNodeCount
|
|
||||||
|
|
||||||
B<Input Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 GetFortuneCookie
|
|
||||||
|
|
||||||
B<Input Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 CountCookies
|
|
||||||
|
|
||||||
B<Input Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 GetSpecificCookie
|
|
||||||
|
|
||||||
B<Input Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
+209
@@ -0,0 +1,209 @@
|
|||||||
|
package MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable;
|
||||||
|
use Scalar::Util qw(blessed);
|
||||||
|
use base qw(SOAP::WSDL::Client::Base);
|
||||||
|
|
||||||
|
# only load if it hasn't been loaded before
|
||||||
|
require MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie
|
||||||
|
if not MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie->can('get_class');
|
||||||
|
|
||||||
|
sub START {
|
||||||
|
$_[0]->set_proxy('http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx') if not $_[2]->{proxy};
|
||||||
|
$_[0]->set_class_resolver('MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie')
|
||||||
|
if not $_[2]->{class_resolver};
|
||||||
|
}
|
||||||
|
|
||||||
|
sub readNodeCount {
|
||||||
|
my ($self, $body, $header) = @_;
|
||||||
|
die "readNodeCount must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||||
|
return $self->SUPER::call({
|
||||||
|
operation => 'readNodeCount',
|
||||||
|
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/readNodeCount',
|
||||||
|
style => 'document',
|
||||||
|
body => {
|
||||||
|
|
||||||
|
'use' => 'literal',
|
||||||
|
namespace => '',
|
||||||
|
encodingStyle => '',
|
||||||
|
parts => [qw( MyElements::readNodeCount )],
|
||||||
|
},
|
||||||
|
header => {
|
||||||
|
|
||||||
|
},
|
||||||
|
headerfault => {
|
||||||
|
|
||||||
|
}
|
||||||
|
}, $body, $header);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub GetFortuneCookie {
|
||||||
|
my ($self, $body, $header) = @_;
|
||||||
|
die "GetFortuneCookie must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||||
|
return $self->SUPER::call({
|
||||||
|
operation => 'GetFortuneCookie',
|
||||||
|
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetFortuneCookie',
|
||||||
|
style => 'document',
|
||||||
|
body => {
|
||||||
|
|
||||||
|
'use' => 'literal',
|
||||||
|
namespace => '',
|
||||||
|
encodingStyle => '',
|
||||||
|
parts => [qw( MyElements::GetFortuneCookie )],
|
||||||
|
},
|
||||||
|
header => {
|
||||||
|
|
||||||
|
},
|
||||||
|
headerfault => {
|
||||||
|
|
||||||
|
}
|
||||||
|
}, $body, $header);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub CountCookies {
|
||||||
|
my ($self, $body, $header) = @_;
|
||||||
|
die "CountCookies must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||||
|
return $self->SUPER::call({
|
||||||
|
operation => 'CountCookies',
|
||||||
|
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/CountCookies',
|
||||||
|
style => 'document',
|
||||||
|
body => {
|
||||||
|
|
||||||
|
'use' => 'literal',
|
||||||
|
namespace => '',
|
||||||
|
encodingStyle => '',
|
||||||
|
parts => [qw( MyElements::CountCookies )],
|
||||||
|
},
|
||||||
|
header => {
|
||||||
|
|
||||||
|
},
|
||||||
|
headerfault => {
|
||||||
|
|
||||||
|
}
|
||||||
|
}, $body, $header);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub GetSpecificCookie {
|
||||||
|
my ($self, $body, $header) = @_;
|
||||||
|
die "GetSpecificCookie must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||||
|
return $self->SUPER::call({
|
||||||
|
operation => 'GetSpecificCookie',
|
||||||
|
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetSpecificCookie',
|
||||||
|
style => 'document',
|
||||||
|
body => {
|
||||||
|
|
||||||
|
'use' => 'literal',
|
||||||
|
namespace => '',
|
||||||
|
encodingStyle => '',
|
||||||
|
parts => [qw( MyElements::GetSpecificCookie )],
|
||||||
|
},
|
||||||
|
header => {
|
||||||
|
|
||||||
|
},
|
||||||
|
headerfault => {
|
||||||
|
|
||||||
|
}
|
||||||
|
}, $body, $header);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
|
||||||
|
MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap - SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie Web Service
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap;
|
||||||
|
my $interface = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap->new();
|
||||||
|
|
||||||
|
my $response;
|
||||||
|
$response = $interface->readNodeCount();
|
||||||
|
$response = $interface->GetFortuneCookie();
|
||||||
|
$response = $interface->CountCookies();
|
||||||
|
$response = $interface->GetSpecificCookie();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie web service
|
||||||
|
located at http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
|
||||||
|
|
||||||
|
=head1 SERVICE FullerData_x0020_Fortune_x0020_Cookie
|
||||||
|
|
||||||
|
Simple XML-based fortune cookie
|
||||||
|
|
||||||
|
=head2 Port FullerData_x0020_Fortune_x0020_CookieSoap
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 General methods
|
||||||
|
|
||||||
|
=head3 new
|
||||||
|
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
|
||||||
|
|
||||||
|
=head2 SOAP Service methods
|
||||||
|
|
||||||
|
Method synopsis is displayed with hash refs as parameters.
|
||||||
|
|
||||||
|
The commented class names in the method's parameters denote that objects
|
||||||
|
of the corresponding class can be passed instead of the marked hash ref.
|
||||||
|
|
||||||
|
You may pass any combination of objects, hash and list refs to these
|
||||||
|
methods, as long as you meet the structure.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head3 readNodeCount
|
||||||
|
|
||||||
|
Display the number of nodes specified in fortune XML document
|
||||||
|
|
||||||
|
$interface->readNodeCount(,,
|
||||||
|
);
|
||||||
|
|
||||||
|
=head3 GetFortuneCookie
|
||||||
|
|
||||||
|
Get a random fortune cookie from the XML document
|
||||||
|
|
||||||
|
$interface->GetFortuneCookie(,,
|
||||||
|
);
|
||||||
|
|
||||||
|
=head3 CountCookies
|
||||||
|
|
||||||
|
Count the actual number of nodes in the XML document of fortunes
|
||||||
|
|
||||||
|
$interface->CountCookies(,,
|
||||||
|
);
|
||||||
|
|
||||||
|
=head3 GetSpecificCookie
|
||||||
|
|
||||||
|
Get a specific cookie by the XML node number
|
||||||
|
|
||||||
|
$interface->GetSpecificCookie( {
|
||||||
|
index => $some_value, # int
|
||||||
|
},,
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL on Sun Dec 16 19:58:30 2007
|
||||||
|
|
||||||
|
=pod
|
||||||
@@ -1,259 +0,0 @@
|
|||||||
package MyInterfaces::GlobalWeather;
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
use MyTypemaps::GlobalWeather;
|
|
||||||
use base 'SOAP::WSDL::Client::Base';
|
|
||||||
|
|
||||||
sub new {
|
|
||||||
my $class = shift;
|
|
||||||
my $arg_ref = shift || {};
|
|
||||||
my $self = $class->SUPER::new({
|
|
||||||
class_resolver => 'MyTypemaps::GlobalWeather',
|
|
||||||
proxy => 'http://www.webservicex.net/globalweather.asmx',
|
|
||||||
%{ $arg_ref }
|
|
||||||
});
|
|
||||||
return bless $self, $class;
|
|
||||||
}
|
|
||||||
|
|
||||||
__PACKAGE__->__create_methods(
|
|
||||||
GetWeather => [ 'MyElements::GetWeather', ],
|
|
||||||
GetCitiesByCountry => [ 'MyElements::GetCitiesByCountry', ],
|
|
||||||
|
|
||||||
);
|
|
||||||
|
|
||||||
1;
|
|
||||||
|
|
||||||
__END__
|
|
||||||
|
|
||||||
=pod
|
|
||||||
|
|
||||||
=head1 NAME
|
|
||||||
|
|
||||||
MyInterfaces::GlobalWeather - SOAP interface to GlobalWeather at
|
|
||||||
http://www.webservicex.net/globalweather.asmx
|
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
|
||||||
|
|
||||||
my $interface = MyInterfaces::GlobalWeather->new();
|
|
||||||
my $GetCitiesByCountry = $interface->GetCitiesByCountry();
|
|
||||||
|
|
||||||
|
|
||||||
=head1 Service GlobalWeather
|
|
||||||
|
|
||||||
=head2 Service information:
|
|
||||||
|
|
||||||
Port name: GlobalWeatherSoap
|
|
||||||
Binding: tns:GlobalWeatherSoap
|
|
||||||
Location: http://www.webservicex.net/globalweather.asmx
|
|
||||||
|
|
||||||
=head2 SOAP Operations
|
|
||||||
|
|
||||||
B<Note:>
|
|
||||||
|
|
||||||
Input, output and fault messages are stated as perl hash refs.
|
|
||||||
|
|
||||||
These are only for informational purposes - the actual implementation
|
|
||||||
normally uses object trees, not hash refs, though the input messages
|
|
||||||
may be passed to the respective methods as hash refs and will be
|
|
||||||
converted to object trees automatically.
|
|
||||||
|
|
||||||
|
|
||||||
=head3 GetWeather
|
|
||||||
|
|
||||||
B<Input Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
'GetWeather'=> {
|
|
||||||
'CityName' => $someValue,
|
|
||||||
'CountryName' => $someValue,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
'GetWeather'=> {
|
|
||||||
'CityName' => $someValue,
|
|
||||||
'CountryName' => $someValue,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 GetCitiesByCountry
|
|
||||||
|
|
||||||
B<Input Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
'GetWeather'=> {
|
|
||||||
'CityName' => $someValue,
|
|
||||||
'CountryName' => $someValue,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
'GetWeather'=> {
|
|
||||||
'CityName' => $someValue,
|
|
||||||
'CountryName' => $someValue,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head2 Service information:
|
|
||||||
|
|
||||||
Port name: GlobalWeatherHttpGet
|
|
||||||
Binding: tns:GlobalWeatherHttpGet
|
|
||||||
Location:
|
|
||||||
|
|
||||||
=head2 SOAP Operations
|
|
||||||
|
|
||||||
B<Note:>
|
|
||||||
|
|
||||||
Input, output and fault messages are stated as perl hash refs.
|
|
||||||
|
|
||||||
These are only for informational purposes - the actual implementation
|
|
||||||
normally uses object trees, not hash refs, though the input messages
|
|
||||||
may be passed to the respective methods as hash refs and will be
|
|
||||||
converted to object trees automatically.
|
|
||||||
|
|
||||||
|
|
||||||
=head3 GetWeather
|
|
||||||
|
|
||||||
B<Input Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
'GetWeather'=> {
|
|
||||||
'CityName' => $someValue,
|
|
||||||
'CountryName' => $someValue,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
'GetWeather'=> {
|
|
||||||
'CityName' => $someValue,
|
|
||||||
'CountryName' => $someValue,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 GetCitiesByCountry
|
|
||||||
|
|
||||||
B<Input Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
'GetWeather'=> {
|
|
||||||
'CityName' => $someValue,
|
|
||||||
'CountryName' => $someValue,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
'GetWeather'=> {
|
|
||||||
'CityName' => $someValue,
|
|
||||||
'CountryName' => $someValue,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head2 Service information:
|
|
||||||
|
|
||||||
Port name: GlobalWeatherHttpPost
|
|
||||||
Binding: tns:GlobalWeatherHttpPost
|
|
||||||
Location:
|
|
||||||
|
|
||||||
=head2 SOAP Operations
|
|
||||||
|
|
||||||
B<Note:>
|
|
||||||
|
|
||||||
Input, output and fault messages are stated as perl hash refs.
|
|
||||||
|
|
||||||
These are only for informational purposes - the actual implementation
|
|
||||||
normally uses object trees, not hash refs, though the input messages
|
|
||||||
may be passed to the respective methods as hash refs and will be
|
|
||||||
converted to object trees automatically.
|
|
||||||
|
|
||||||
|
|
||||||
=head3 GetWeather
|
|
||||||
|
|
||||||
B<Input Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
'GetWeather'=> {
|
|
||||||
'CityName' => $someValue,
|
|
||||||
'CountryName' => $someValue,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
'GetWeather'=> {
|
|
||||||
'CityName' => $someValue,
|
|
||||||
'CountryName' => $someValue,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 GetCitiesByCountry
|
|
||||||
|
|
||||||
B<Input Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
'GetWeather'=> {
|
|
||||||
'CityName' => $someValue,
|
|
||||||
'CountryName' => $someValue,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
|
||||||
|
|
||||||
{
|
|
||||||
'GetWeather'=> {
|
|
||||||
'CityName' => $someValue,
|
|
||||||
'CountryName' => $someValue,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
@@ -0,0 +1,150 @@
|
|||||||
|
package MyInterfaces::GlobalWeather::GlobalWeatherSoap;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable;
|
||||||
|
use Scalar::Util qw(blessed);
|
||||||
|
use base qw(SOAP::WSDL::Client::Base);
|
||||||
|
|
||||||
|
# only load if it hasn't been loaded before
|
||||||
|
require MyTypemaps::GlobalWeather
|
||||||
|
if not MyTypemaps::GlobalWeather->can('get_class');
|
||||||
|
|
||||||
|
sub START {
|
||||||
|
$_[0]->set_proxy('http://www.webservicex.net/globalweather.asmx') if not $_[2]->{proxy};
|
||||||
|
$_[0]->set_class_resolver('MyTypemaps::GlobalWeather')
|
||||||
|
if not $_[2]->{class_resolver};
|
||||||
|
}
|
||||||
|
|
||||||
|
sub GetWeather {
|
||||||
|
my ($self, $body, $header) = @_;
|
||||||
|
die "GetWeather must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||||
|
return $self->SUPER::call({
|
||||||
|
operation => 'GetWeather',
|
||||||
|
soap_action => 'http://www.webserviceX.NET/GetWeather',
|
||||||
|
style => 'document',
|
||||||
|
body => {
|
||||||
|
|
||||||
|
'use' => 'literal',
|
||||||
|
namespace => '',
|
||||||
|
encodingStyle => '',
|
||||||
|
parts => [qw( MyElements::GetWeather )],
|
||||||
|
},
|
||||||
|
header => {
|
||||||
|
|
||||||
|
},
|
||||||
|
headerfault => {
|
||||||
|
|
||||||
|
}
|
||||||
|
}, $body, $header);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub GetCitiesByCountry {
|
||||||
|
my ($self, $body, $header) = @_;
|
||||||
|
die "GetCitiesByCountry must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||||
|
return $self->SUPER::call({
|
||||||
|
operation => 'GetCitiesByCountry',
|
||||||
|
soap_action => 'http://www.webserviceX.NET/GetCitiesByCountry',
|
||||||
|
style => 'document',
|
||||||
|
body => {
|
||||||
|
|
||||||
|
'use' => 'literal',
|
||||||
|
namespace => '',
|
||||||
|
encodingStyle => '',
|
||||||
|
parts => [qw( MyElements::GetCitiesByCountry )],
|
||||||
|
},
|
||||||
|
header => {
|
||||||
|
|
||||||
|
},
|
||||||
|
headerfault => {
|
||||||
|
|
||||||
|
}
|
||||||
|
}, $body, $header);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
|
||||||
|
MyInterfaces::GlobalWeather::GlobalWeatherSoap - SOAP Interface for the GlobalWeather Web Service
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use MyInterfaces::GlobalWeather::GlobalWeatherSoap;
|
||||||
|
my $interface = MyInterfaces::GlobalWeather::GlobalWeatherSoap->new();
|
||||||
|
|
||||||
|
my $response;
|
||||||
|
$response = $interface->GetWeather();
|
||||||
|
$response = $interface->GetCitiesByCountry();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP Interface for the GlobalWeather web service
|
||||||
|
located at http://www.webservicex.net/globalweather.asmx.
|
||||||
|
|
||||||
|
=head1 SERVICE GlobalWeather
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head2 Port GlobalWeatherSoap
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 General methods
|
||||||
|
|
||||||
|
=head3 new
|
||||||
|
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
|
||||||
|
|
||||||
|
=head2 SOAP Service methods
|
||||||
|
|
||||||
|
Method synopsis is displayed with hash refs as parameters.
|
||||||
|
|
||||||
|
The commented class names in the method's parameters denote that objects
|
||||||
|
of the corresponding class can be passed instead of the marked hash ref.
|
||||||
|
|
||||||
|
You may pass any combination of objects, hash and list refs to these
|
||||||
|
methods, as long as you meet the structure.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head3 GetWeather
|
||||||
|
|
||||||
|
Get weather report for all major cities around the world.
|
||||||
|
|
||||||
|
$interface->GetWeather( {
|
||||||
|
CityName => $some_value, # string
|
||||||
|
CountryName => $some_value, # string
|
||||||
|
},,
|
||||||
|
);
|
||||||
|
|
||||||
|
=head3 GetCitiesByCountry
|
||||||
|
|
||||||
|
Get all major cities by country name(full / part).
|
||||||
|
|
||||||
|
$interface->GetCitiesByCountry( {
|
||||||
|
CountryName => $some_value, # string
|
||||||
|
},,
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL on Sun Dec 16 20:05:01 2007
|
||||||
|
|
||||||
|
=pod
|
||||||
@@ -0,0 +1,113 @@
|
|||||||
|
package MyInterfaces::HelloWorld::HelloWorldSoap;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable;
|
||||||
|
use Scalar::Util qw(blessed);
|
||||||
|
use base qw(SOAP::WSDL::Client::Base);
|
||||||
|
|
||||||
|
# only load if it hasn't been loaded before
|
||||||
|
require MyTypemaps::HelloWorld
|
||||||
|
if not MyTypemaps::HelloWorld->can('get_class');
|
||||||
|
|
||||||
|
sub START {
|
||||||
|
$_[0]->set_proxy('http://localhost:81/soap-wsdl-test/helloworld.pl') if not $_[2]->{proxy};
|
||||||
|
$_[0]->set_class_resolver('MyTypemaps::HelloWorld')
|
||||||
|
if not $_[2]->{class_resolver};
|
||||||
|
}
|
||||||
|
|
||||||
|
sub sayHello {
|
||||||
|
my ($self, $body, $header) = @_;
|
||||||
|
die "sayHello must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||||
|
return $self->SUPER::call({
|
||||||
|
operation => 'sayHello',
|
||||||
|
soap_action => 'urn:HelloWorld#sayHello',
|
||||||
|
style => 'document',
|
||||||
|
body => {
|
||||||
|
|
||||||
|
'use' => 'literal',
|
||||||
|
namespace => '',
|
||||||
|
encodingStyle => '',
|
||||||
|
parts => [qw( MyElements::sayHello )],
|
||||||
|
},
|
||||||
|
header => {
|
||||||
|
|
||||||
|
},
|
||||||
|
headerfault => {
|
||||||
|
|
||||||
|
}
|
||||||
|
}, $body, $header);
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
|
||||||
|
MyInterfaces::HelloWorld::HelloWorldSoap - SOAP Interface for the HelloWorld Web Service
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use MyInterfaces::HelloWorld::HelloWorldSoap;
|
||||||
|
my $interface = MyInterfaces::HelloWorld::HelloWorldSoap->new();
|
||||||
|
|
||||||
|
my $response;
|
||||||
|
$response = $interface->sayHello();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP Interface for the HelloWorld web service
|
||||||
|
located at http://localhost:81/soap-wsdl-test/helloworld.pl.
|
||||||
|
|
||||||
|
=head1 SERVICE HelloWorld
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head2 Port HelloWorldSoap
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 General methods
|
||||||
|
|
||||||
|
=head3 new
|
||||||
|
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
|
||||||
|
|
||||||
|
=head2 SOAP Service methods
|
||||||
|
|
||||||
|
Method synopsis is displayed with hash refs as parameters.
|
||||||
|
|
||||||
|
The commented class names in the method's parameters denote that objects
|
||||||
|
of the corresponding class can be passed instead of the marked hash ref.
|
||||||
|
|
||||||
|
You may pass any combination of objects, hash and list refs to these
|
||||||
|
methods, as long as you meet the structure.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head3 sayHello
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$interface->sayHello( {
|
||||||
|
name => $some_value, # string
|
||||||
|
givenName => $some_value, # string
|
||||||
|
},,
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL on Sat Dec 1 19:51:31 2007
|
||||||
|
|
||||||
|
=pod
|
||||||
@@ -0,0 +1,146 @@
|
|||||||
|
package MyInterfaces::TestService::TestPort;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable;
|
||||||
|
use Scalar::Util qw(blessed);
|
||||||
|
use base qw(SOAP::WSDL::Client::Base);
|
||||||
|
|
||||||
|
# only load if it hasn't been loaded before
|
||||||
|
require MyTypemaps::TestService
|
||||||
|
if not MyTypemaps::TestService->can('get_class');
|
||||||
|
|
||||||
|
sub START {
|
||||||
|
$_[0]->set_proxy('http://localhost:81/soap-wsdl-test/person.pl') if not $_[2]->{proxy};
|
||||||
|
$_[0]->set_class_resolver('MyTypemaps::TestService')
|
||||||
|
if not $_[2]->{class_resolver};
|
||||||
|
}
|
||||||
|
|
||||||
|
sub ListPerson {
|
||||||
|
my ($self, $body, $header) = @_;
|
||||||
|
die "ListPerson must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||||
|
return $self->SUPER::call({
|
||||||
|
operation => 'ListPerson',
|
||||||
|
soap_action => 'http://www.example.org/benchmark/ListPerson',
|
||||||
|
style => 'document',
|
||||||
|
body => {
|
||||||
|
|
||||||
|
'use' => 'literal',
|
||||||
|
namespace => '',
|
||||||
|
encodingStyle => '',
|
||||||
|
parts => [qw( MyElements::ListPerson )],
|
||||||
|
},
|
||||||
|
header => {
|
||||||
|
|
||||||
|
},
|
||||||
|
headerfault => {
|
||||||
|
|
||||||
|
}
|
||||||
|
}, $body, $header);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
|
||||||
|
MyInterfaces::TestService::TestPort - SOAP Interface for the TestService Web Service
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use MyInterfaces::TestService::TestPort;
|
||||||
|
my $interface = MyInterfaces::TestService::TestPort->new();
|
||||||
|
|
||||||
|
my $response;
|
||||||
|
$response = $interface->ListPerson();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP Interface for the TestService web service
|
||||||
|
located at http://localhost:81/soap-wsdl-test/person.pl.
|
||||||
|
|
||||||
|
=head1 SERVICE TestService
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head2 Port TestPort
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 General methods
|
||||||
|
|
||||||
|
=head3 new
|
||||||
|
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
|
||||||
|
|
||||||
|
=head2 SOAP Service methods
|
||||||
|
|
||||||
|
Method synopsis is displayed with hash refs as parameters.
|
||||||
|
|
||||||
|
The commented class names in the method's parameters denote that objects
|
||||||
|
of the corresponding class can be passed instead of the marked hash ref.
|
||||||
|
|
||||||
|
You may pass any combination of objects, hash and list refs to these
|
||||||
|
methods, as long as you meet the structure.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head3 ListPerson
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$interface->ListPerson( {
|
||||||
|
in => { # MyTypes::Person
|
||||||
|
PersonID => { # MyTypes::PersonID
|
||||||
|
ID => $some_value, # int
|
||||||
|
},
|
||||||
|
Salutation => $some_value, # string
|
||||||
|
Name => $some_value, # string
|
||||||
|
GivenName => $some_value, # string
|
||||||
|
DateOfBirth => $some_value, # date
|
||||||
|
HomeAddress => { # MyTypes::Address
|
||||||
|
Street => $some_value, # string
|
||||||
|
ZIP => $some_value, # string
|
||||||
|
City => $some_value, # string
|
||||||
|
Country => $some_value, # string
|
||||||
|
PhoneNumber => $some_value, # PhoneNumber
|
||||||
|
MobilePhoneNumber => $some_value, # PhoneNumber
|
||||||
|
},
|
||||||
|
WorkAddress => { # MyTypes::Address
|
||||||
|
Street => $some_value, # string
|
||||||
|
ZIP => $some_value, # string
|
||||||
|
City => $some_value, # string
|
||||||
|
Country => $some_value, # string
|
||||||
|
PhoneNumber => $some_value, # PhoneNumber
|
||||||
|
MobilePhoneNumber => $some_value, # PhoneNumber
|
||||||
|
},
|
||||||
|
Contracts => { # MyTypes::ArrayOfContract
|
||||||
|
Contract => { # MyTypes::Contract
|
||||||
|
ContractID => $some_value, # long
|
||||||
|
ContractName => $some_value, # string
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},,
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL on Mon Dec 3 22:20:49 2007
|
||||||
|
|
||||||
|
=pod
|
||||||
@@ -0,0 +1,113 @@
|
|||||||
|
package MyServer::HelloWorld::HelloWorldSoap;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable;
|
||||||
|
use Scalar::Util qw(blessed);
|
||||||
|
use base qw(SOAP::WSDL::Client::Base);
|
||||||
|
|
||||||
|
# only load if it hasn't been loaded before
|
||||||
|
require MyTypemaps::HelloWorld
|
||||||
|
if not MyTypemaps::HelloWorld->can('get_class');
|
||||||
|
|
||||||
|
my %transport_class_of :ATTR(:name<transport_class> :default<SOAP::WSDL::Server::CGI>);
|
||||||
|
my %transport_of :ATTR(:name<transport> :default<()>);
|
||||||
|
my %dispatch_to :ATTR(:name<dispatch_to>);
|
||||||
|
|
||||||
|
my $action_map_ref = {
|
||||||
|
'urn:HelloWorld#sayHello' => 'sayHello',
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
sub START {
|
||||||
|
my ($self, $ident, $arg_ref) = @_;
|
||||||
|
eval "require $transport_class_of{ $ident }"
|
||||||
|
or die "Cannot load transport class $transport_class_of{ $ident }: $@";
|
||||||
|
$transport_of{ $ident } = $transport_class_of{ $ident }->new({
|
||||||
|
action_map_ref => $action_map_ref,
|
||||||
|
class_resolver => 'MyTypemaps::HelloWorld',
|
||||||
|
dispatch_to => $dispatch_to{ $ident },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
sub handle {
|
||||||
|
$transport_of{ ${ $_[0] } }->handle();
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyInterfaces::HelloWorld::HelloWorldSoap - SOAP Server Class for the HelloWorld Web Service
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use MyServer::HelloWorld::HelloWorldSoap;
|
||||||
|
my $server = MyServer::HelloWorld::HelloWorldSoap->new({
|
||||||
|
dispatch_to => 'My::Handler::Class',
|
||||||
|
transport_class => 'SOAP::WSDL::Server::CGI', # optional, default
|
||||||
|
});
|
||||||
|
$server->handle();
|
||||||
|
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP Server handler for the HelloWorld web service
|
||||||
|
located at http://localhost:81/soap-wsdl-test/helloworld.pl.
|
||||||
|
|
||||||
|
=head1 SERVICE HelloWorld
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head2 Port HelloWorldSoap
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 General methods
|
||||||
|
|
||||||
|
=head3 new
|
||||||
|
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
The C<dispatch_to> argument is mandatory. It must be a class or object
|
||||||
|
implementing the SOAP Service methods listed below.
|
||||||
|
|
||||||
|
=head2 SOAP Service methods
|
||||||
|
|
||||||
|
Your dispatch_to class has to implement the following methods:
|
||||||
|
|
||||||
|
The examples below serve as copy-and-paste prototypes to use in your
|
||||||
|
class.
|
||||||
|
|
||||||
|
=head3 sayHello
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sub sayHello(
|
||||||
|
my ($self, $body, $header) = @_;
|
||||||
|
# body is a ??? object - sorry, POD not implemented yet
|
||||||
|
# header is a ??? object - sorry, POD not implemented yet
|
||||||
|
|
||||||
|
# do something with body and header...
|
||||||
|
|
||||||
|
return MyElements::sayHelloResponse->new( {
|
||||||
|
sayHelloResult => $some_value, # string
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL on Sun Dec 2 01:20:36 2007
|
||||||
|
|
||||||
|
=pod
|
||||||
@@ -0,0 +1,145 @@
|
|||||||
|
package MyServer::TestService::TestPort;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable;
|
||||||
|
use Scalar::Util qw(blessed);
|
||||||
|
use base qw(SOAP::WSDL::Client::Base);
|
||||||
|
|
||||||
|
# only load if it hasn't been loaded before
|
||||||
|
require MyTypemaps::TestService
|
||||||
|
if not MyTypemaps::TestService->can('get_class');
|
||||||
|
|
||||||
|
my %transport_class_of :ATTR(:name<transport_class> :default<SOAP::WSDL::Server::CGI>);
|
||||||
|
my %transport_of :ATTR(:name<transport> :default<()>);
|
||||||
|
my %dispatch_to :ATTR(:name<dispatch_to>);
|
||||||
|
|
||||||
|
my $action_map_ref = {
|
||||||
|
'http://www.example.org/benchmark/ListPerson' => 'ListPerson',
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
sub START {
|
||||||
|
my ($self, $ident, $arg_ref) = @_;
|
||||||
|
eval "require $transport_class_of{ $ident }"
|
||||||
|
or die "Cannot load transport class $transport_class_of{ $ident }: $@";
|
||||||
|
$transport_of{ $ident } = $transport_class_of{ $ident }->new({
|
||||||
|
action_map_ref => $action_map_ref,
|
||||||
|
class_resolver => 'MyTypemaps::TestService',
|
||||||
|
dispatch_to => $dispatch_to{ $ident },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
sub handle {
|
||||||
|
$transport_of{ ${ $_[0] } }->handle();
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyInterfaces::TestService::TestPort - SOAP Server Class for the TestService Web Service
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use MyServer::TestService::TestPort;
|
||||||
|
my $server = MyServer::TestService::TestPort->new({
|
||||||
|
dispatch_to => 'My::Handler::Class',
|
||||||
|
transport_class => 'SOAP::WSDL::Server::CGI', # optional, default
|
||||||
|
});
|
||||||
|
$server->handle();
|
||||||
|
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP Server handler for the TestService web service
|
||||||
|
located at http://localhost:81/soap-wsdl-test/person.pl.
|
||||||
|
|
||||||
|
=head1 SERVICE TestService
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head2 Port TestPort
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 General methods
|
||||||
|
|
||||||
|
=head3 new
|
||||||
|
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
The C<dispatch_to> argument is mandatory. It must be a class or object
|
||||||
|
implementing the SOAP Service methods listed below.
|
||||||
|
|
||||||
|
=head2 SOAP Service methods
|
||||||
|
|
||||||
|
Your dispatch_to class has to implement the following methods:
|
||||||
|
|
||||||
|
The examples below serve as copy-and-paste prototypes to use in your
|
||||||
|
class.
|
||||||
|
|
||||||
|
=head3 ListPerson
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sub ListPerson {
|
||||||
|
my ($self, $body, $header) = @_;
|
||||||
|
# body is a ??? object - sorry, POD not implemented yet
|
||||||
|
# header is a ??? object - sorry, POD not implemented yet
|
||||||
|
|
||||||
|
# do something with body and header...
|
||||||
|
|
||||||
|
return MyElements::ListPersonResponse->new( {
|
||||||
|
out => { # MyTypes::ArrayOfPerson
|
||||||
|
NewElement => { # MyTypes::Person
|
||||||
|
PersonID => { # MyTypes::PersonID
|
||||||
|
ID => $some_value, # int
|
||||||
|
},
|
||||||
|
Salutation => $some_value, # string
|
||||||
|
Name => $some_value, # string
|
||||||
|
GivenName => $some_value, # string
|
||||||
|
DateOfBirth => $some_value, # date
|
||||||
|
HomeAddress => { # MyTypes::Address
|
||||||
|
Street => $some_value, # string
|
||||||
|
ZIP => $some_value, # string
|
||||||
|
City => $some_value, # string
|
||||||
|
Country => $some_value, # string
|
||||||
|
PhoneNumber => $some_value, # PhoneNumber
|
||||||
|
MobilePhoneNumber => $some_value, # PhoneNumber
|
||||||
|
},
|
||||||
|
WorkAddress => { # MyTypes::Address
|
||||||
|
Street => $some_value, # string
|
||||||
|
ZIP => $some_value, # string
|
||||||
|
City => $some_value, # string
|
||||||
|
Country => $some_value, # string
|
||||||
|
PhoneNumber => $some_value, # PhoneNumber
|
||||||
|
MobilePhoneNumber => $some_value, # PhoneNumber
|
||||||
|
},
|
||||||
|
Contracts => { # MyTypes::ArrayOfContract
|
||||||
|
Contract => { # MyTypes::Contract
|
||||||
|
ContractID => $some_value, # long
|
||||||
|
ContractName => $some_value, # string
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL on Mon Dec 3 22:20:32 2007
|
||||||
|
|
||||||
|
=pod
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
package MyTypemaps::BarCode;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
our $typemap_1 = {
|
||||||
|
'GenerateBarCode/BarCodeText' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'GenerateBarCode/BarCodeParam/BarColor' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'GenerateBarCode/BarCodeParam/barcodeOption' => 'MyTypes::BarcodeOption',
|
||||||
|
'GenerateBarCode/BarCodeParam/Left' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
||||||
|
'GenerateBarCode' => 'MyElements::GenerateBarCode',
|
||||||
|
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'GenerateBarCode/BarCodeParam/Angle' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
'GenerateBarCode/BarCodeParam/Width' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
|
||||||
|
'GenerateBarCode/BarCodeParam/BarCodeImageFormat' => 'MyTypes::ImageFormats',
|
||||||
|
'GenerateBarCode/BarCodeParam/BGColor' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'GenerateBarCode/BarCodeParam/Ratio' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
|
||||||
|
'GenerateBarCode/BarCodeParam/Height' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
'GenerateBarCode/BarCodeParam/CheckSum' => 'SOAP::WSDL::XSD::Typelib::Builtin::boolean',
|
||||||
|
'GenerateBarCode/BarCodeParam/checkSumMethod' => 'MyTypes::CheckSumMethod',
|
||||||
|
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'GenerateBarCode/BarCodeParam/barcodeType' => 'MyTypes::BarcodeType',
|
||||||
|
'GenerateBarCode/BarCodeParam/FontSize' => 'SOAP::WSDL::XSD::Typelib::Builtin::float',
|
||||||
|
'GenerateBarCode/BarCodeParam/Top' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
'GenerateBarCodeResponse/GenerateBarCodeResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::base64Binary',
|
||||||
|
'GenerateBarCodeResponse' => 'MyElements::GenerateBarCodeResponse',
|
||||||
|
'GenerateBarCode/BarCodeParam/Module' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
'GenerateBarCode/BarCodeParam/showTextPosition' => 'MyTypes::ShowTextPosition',
|
||||||
|
'GenerateBarCode/BarCodeParam' => 'MyTypes::BarCodeData',
|
||||||
|
'GenerateBarCode/BarCodeParam/FontName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string'
|
||||||
|
};
|
||||||
|
;
|
||||||
|
|
||||||
|
sub get_class {
|
||||||
|
my $name = join '/', @{ $_[1] };
|
||||||
|
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
|
||||||
|
return $typemap_1->{ $name };
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_typemap {
|
||||||
|
return $typemap_1;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyTypemaps::BarCode; - typemap for ::BarCode;
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Typemap created by SOAP::WSDL for map-based SOAP message parsers.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -2,48 +2,51 @@ package MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
my %typemap = (
|
our $typemap_1 = {
|
||||||
'readNodeCount' => 'MyElements::readNodeCount',
|
'GetFortuneCookie' => 'MyElements::GetFortuneCookie',
|
||||||
'readNodeCountResponse' => 'MyElements::readNodeCountResponse',
|
'CountCookiesResponse/CountCookiesResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
# atomic complex type (sequence)
|
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
||||||
'readNodeCountResponse/readNodeCountResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
'readNodeCountResponse/readNodeCountResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
'CountCookiesResponse' => 'MyElements::CountCookiesResponse',
|
||||||
# end atomic complex type (sequence)
|
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
'GetFortuneCookie' => 'MyElements::GetFortuneCookie',
|
'GetSpecificCookieResponse' => 'MyElements::GetSpecificCookieResponse',
|
||||||
'GetFortuneCookieResponse' => 'MyElements::GetFortuneCookieResponse',
|
'GetFortuneCookieResponse' => 'MyElements::GetFortuneCookieResponse',
|
||||||
# atomic complex type (sequence)
|
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
|
||||||
'GetFortuneCookieResponse/GetFortuneCookieResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'GetSpecificCookie' => 'MyElements::GetSpecificCookie',
|
||||||
|
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
|
||||||
# end atomic complex type (sequence)
|
'CountCookies' => 'MyElements::CountCookies',
|
||||||
'CountCookies' => 'MyElements::CountCookies',
|
'GetSpecificCookie/index' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
'CountCookiesResponse' => 'MyElements::CountCookiesResponse',
|
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
# atomic complex type (sequence)
|
'GetFortuneCookieResponse/GetFortuneCookieResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
'CountCookiesResponse/CountCookiesResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
'GetSpecificCookieResponse/GetSpecificCookieResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'readNodeCount' => 'MyElements::readNodeCount',
|
||||||
# end atomic complex type (sequence)
|
'readNodeCountResponse' => 'MyElements::readNodeCountResponse'
|
||||||
'GetSpecificCookie' => 'MyElements::GetSpecificCookie',
|
};
|
||||||
# atomic complex type (sequence)
|
;
|
||||||
'GetSpecificCookie/index' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
|
||||||
|
|
||||||
# end atomic complex type (sequence)
|
|
||||||
'GetSpecificCookieResponse' => 'MyElements::GetSpecificCookieResponse',
|
|
||||||
# atomic complex type (sequence)
|
|
||||||
'GetSpecificCookieResponse/GetSpecificCookieResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
|
||||||
# end atomic complex type (sequence)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
);
|
|
||||||
|
|
||||||
sub get_class {
|
sub get_class {
|
||||||
my $name = join '/', @{ $_[1] };
|
my $name = join '/', @{ $_[1] };
|
||||||
exists $typemap{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
|
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
|
||||||
return $typemap{ $name };
|
return $typemap_1->{ $name };
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_typemap {
|
||||||
|
return $typemap_1;
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie; - typemap for ::FullerData_x0020_Fortune_x0020_Cookie;
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Typemap created by SOAP::WSDL for map-based SOAP message parsers.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -2,44 +2,47 @@ package MyTypemaps::GlobalWeather;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
my %typemap = (
|
our $typemap_1 = {
|
||||||
'GetWeather' => 'MyElements::GetWeather',
|
'GetWeatherResponse/GetWeatherResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
# atomic complex type (sequence)
|
'GetWeather' => 'MyElements::GetWeather',
|
||||||
'GetWeather/CityName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'GetCitiesByCountryResponse/GetCitiesByCountryResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
'GetWeather/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
|
||||||
|
'GetWeatherResponse' => 'MyElements::GetWeatherResponse',
|
||||||
# end atomic complex type (sequence)
|
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
'GetWeatherResponse' => 'MyElements::GetWeatherResponse',
|
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
||||||
# atomic complex type (sequence)
|
'GetWeather/CityName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
'GetWeatherResponse/GetWeatherResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'GetCitiesByCountry' => 'MyElements::GetCitiesByCountry',
|
||||||
|
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
# end atomic complex type (sequence)
|
'GetCitiesByCountry/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
'GetCitiesByCountry' => 'MyElements::GetCitiesByCountry',
|
'GetWeather/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
# atomic complex type (sequence)
|
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
|
||||||
'GetCitiesByCountry/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'GetCitiesByCountryResponse' => 'MyElements::GetCitiesByCountryResponse'
|
||||||
|
};
|
||||||
# end atomic complex type (sequence)
|
;
|
||||||
'GetCitiesByCountryResponse' => 'MyElements::GetCitiesByCountryResponse',
|
|
||||||
# atomic complex type (sequence)
|
|
||||||
'GetCitiesByCountryResponse/GetCitiesByCountryResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
|
||||||
# end atomic complex type (sequence)
|
|
||||||
Fault => 'SOAP::WSDL::SOAP::Typelib::Fault11',
|
|
||||||
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
|
||||||
);
|
|
||||||
|
|
||||||
sub get_class {
|
sub get_class {
|
||||||
my $name = join '/', @{ $_[1] };
|
my $name = join '/', @{ $_[1] };
|
||||||
exists $typemap{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
|
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
|
||||||
return $typemap{ $name };
|
return $typemap_1->{ $name };
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_typemap {
|
||||||
|
return $typemap_1;
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyTypemaps::GlobalWeather; - typemap for ::GlobalWeather;
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Typemap created by SOAP::WSDL for map-based SOAP message parsers.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package MyTypemaps::HelloWorld;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
our $typemap_1 = {
|
||||||
|
'sayHello/givenName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'sayHelloResponse' => 'MyElements::sayHelloResponse',
|
||||||
|
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
|
||||||
|
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'sayHelloResponse/sayHelloResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
||||||
|
'sayHello' => 'MyElements::sayHello',
|
||||||
|
'sayHello/name' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11'
|
||||||
|
};
|
||||||
|
;
|
||||||
|
|
||||||
|
sub get_class {
|
||||||
|
my $name = join '/', @{ $_[1] };
|
||||||
|
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
|
||||||
|
return $typemap_1->{ $name };
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_typemap {
|
||||||
|
return $typemap_1;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyTypemaps::HelloWorld; - typemap for ::HelloWorld;
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Typemap created by SOAP::WSDL for map-based SOAP message parsers.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
package MyTypemaps::TestService;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
our $typemap_1 = {
|
||||||
|
'ListPersonResponse/out/NewElement/WorkAddress/Street' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPerson/in/Contracts' => 'MyTypes::ArrayOfContract',
|
||||||
|
'ListPerson/in/HomeAddress/PhoneNumber' => 'MyTypes::PhoneNumber',
|
||||||
|
'ListPersonResponse/out/NewElement/HomeAddress' => 'MyTypes::Address',
|
||||||
|
'ListPersonResponse/out/NewElement/Contracts/Contract' => 'MyTypes::Contract',
|
||||||
|
'ListPersonResponse/out/NewElement/HomeAddress/ZIP' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPerson/in/WorkAddress/City' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPerson/in/HomeAddress' => 'MyTypes::Address',
|
||||||
|
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
||||||
|
'ListPerson/in/HomeAddress/City' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPersonResponse/out/NewElement/WorkAddress/PhoneNumber' => 'MyTypes::PhoneNumber',
|
||||||
|
'ListPerson/in/WorkAddress/ZIP' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPersonResponse/out/NewElement/Contracts' => 'MyTypes::ArrayOfContract',
|
||||||
|
'ListPerson/in/WorkAddress/Street' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPerson/in' => 'MyTypes::Person',
|
||||||
|
'ListPersonResponse/out/NewElement/GivenName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPersonResponse/out/NewElement/HomeAddress/PhoneNumber' => 'MyTypes::PhoneNumber',
|
||||||
|
'ListPersonResponse/out/NewElement/HomeAddress/City' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPersonResponse/out/NewElement' => 'MyTypes::Person',
|
||||||
|
'ListPerson/in/PersonID/ID' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
'ListPerson/in/HomeAddress/Street' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPersonResponse/out/NewElement/PersonID/ID' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
'ListPerson/in/HomeAddress/Country' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPerson/in/GivenName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPerson/in/HomeAddress/MobilePhoneNumber' => 'MyTypes::PhoneNumber',
|
||||||
|
'ListPerson/in/Name' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPersonResponse/out/NewElement/PersonID' => 'MyTypes::PersonID',
|
||||||
|
'ListPersonResponse/out/NewElement/WorkAddress/MobilePhoneNumber' => 'MyTypes::PhoneNumber',
|
||||||
|
'ListPersonResponse/out' => 'MyTypes::ArrayOfPerson',
|
||||||
|
'ListPerson/in/Contracts/Contract' => 'MyTypes::Contract',
|
||||||
|
'ListPersonResponse/out/NewElement/Name' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPersonResponse/out/NewElement/WorkAddress/ZIP' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPerson/in/DateOfBirth' => 'SOAP::WSDL::XSD::Typelib::Builtin::date',
|
||||||
|
'ListPersonResponse/out/NewElement/HomeAddress/MobilePhoneNumber' => 'MyTypes::PhoneNumber',
|
||||||
|
'ListPersonResponse/out/NewElement/HomeAddress/Country' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPersonResponse/out/NewElement/HomeAddress/Street' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPersonResponse/out/NewElement/Contracts/Contract/ContractName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
|
||||||
|
'ListPerson/in/Contracts/Contract/ContractName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPersonResponse' => 'MyElements::ListPersonResponse',
|
||||||
|
'ListPersonResponse/out/NewElement/Salutation' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPersonResponse/out/NewElement/WorkAddress/City' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
|
||||||
|
'ListPerson' => 'MyElements::ListPerson',
|
||||||
|
'ListPerson/in/Salutation' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPerson/in/WorkAddress/MobilePhoneNumber' => 'MyTypes::PhoneNumber',
|
||||||
|
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPerson/in/WorkAddress/Country' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPerson/in/PersonID' => 'MyTypes::PersonID',
|
||||||
|
'ListPerson/in/HomeAddress/ZIP' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPersonResponse/out/NewElement/WorkAddress' => 'MyTypes::Address',
|
||||||
|
'ListPersonResponse/out/NewElement/DateOfBirth' => 'SOAP::WSDL::XSD::Typelib::Builtin::date',
|
||||||
|
'ListPerson/in/WorkAddress/PhoneNumber' => 'MyTypes::PhoneNumber',
|
||||||
|
'ListPersonResponse/out/NewElement/WorkAddress/Country' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'ListPersonResponse/out/NewElement/Contracts/Contract/ContractID' => 'SOAP::WSDL::XSD::Typelib::Builtin::long',
|
||||||
|
'ListPerson/in/Contracts/Contract/ContractID' => 'SOAP::WSDL::XSD::Typelib::Builtin::long',
|
||||||
|
'ListPerson/in/WorkAddress' => 'MyTypes::Address'
|
||||||
|
};
|
||||||
|
;
|
||||||
|
|
||||||
|
sub get_class {
|
||||||
|
my $name = join '/', @{ $_[1] };
|
||||||
|
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
|
||||||
|
return $typemap_1->{ $name };
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_typemap {
|
||||||
|
return $typemap_1;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyTypemaps::TestService; - typemap for ::TestService;
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Typemap created by SOAP::WSDL for map-based SOAP message parsers.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
package MyTypes::Address;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %Street_of :ATTR(:get<Street>);
|
||||||
|
my %ZIP_of :ATTR(:get<ZIP>);
|
||||||
|
my %City_of :ATTR(:get<City>);
|
||||||
|
my %Country_of :ATTR(:get<Country>);
|
||||||
|
my %PhoneNumber_of :ATTR(:get<PhoneNumber>);
|
||||||
|
my %MobilePhoneNumber_of :ATTR(:get<MobilePhoneNumber>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
Street
|
||||||
|
ZIP
|
||||||
|
City
|
||||||
|
Country
|
||||||
|
PhoneNumber
|
||||||
|
MobilePhoneNumber
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
Street => \%Street_of,
|
||||||
|
ZIP => \%ZIP_of,
|
||||||
|
City => \%City_of,
|
||||||
|
Country => \%Country_of,
|
||||||
|
PhoneNumber => \%PhoneNumber_of,
|
||||||
|
MobilePhoneNumber => \%MobilePhoneNumber_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Street => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
ZIP => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
City => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
Country => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
PhoneNumber => 'MyTypes::PhoneNumber',
|
||||||
|
MobilePhoneNumber => 'MyTypes::PhoneNumber',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyTypes::Address
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined complextype
|
||||||
|
Address from the namespace http://www.example.org/benchmark/.
|
||||||
|
|
||||||
|
=head2 PROPERTIES
|
||||||
|
|
||||||
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
|
methods:
|
||||||
|
|
||||||
|
Street
|
||||||
|
ZIP
|
||||||
|
City
|
||||||
|
Country
|
||||||
|
PhoneNumber
|
||||||
|
MobilePhoneNumber
|
||||||
|
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
{ # MyTypes::Address
|
||||||
|
Street => $some_value, # string
|
||||||
|
ZIP => $some_value, # string
|
||||||
|
City => $some_value, # string
|
||||||
|
Country => $some_value, # string
|
||||||
|
PhoneNumber => $some_value, # PhoneNumber
|
||||||
|
MobilePhoneNumber => $some_value, # PhoneNumber
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
package MyTypes::ArrayOfContract;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %Contract_of :ATTR(:get<Contract>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
Contract
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
Contract => \%Contract_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Contract => 'MyTypes::Contract',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyTypes::ArrayOfContract
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined complextype
|
||||||
|
ArrayOfContract from the namespace http://www.example.org/benchmark/.
|
||||||
|
|
||||||
|
=head2 PROPERTIES
|
||||||
|
|
||||||
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
|
methods:
|
||||||
|
|
||||||
|
Contract
|
||||||
|
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
{ # MyTypes::ArrayOfContract
|
||||||
|
Contract => { # MyTypes::Contract
|
||||||
|
ContractID => $some_value, # long
|
||||||
|
ContractName => $some_value, # string
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
package MyTypes::ArrayOfPerson;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %NewElement_of :ATTR(:get<NewElement>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
NewElement
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
NewElement => \%NewElement_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
NewElement => 'MyTypes::Person',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyTypes::ArrayOfPerson
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined complextype
|
||||||
|
ArrayOfPerson from the namespace http://www.example.org/benchmark/.
|
||||||
|
|
||||||
|
=head2 PROPERTIES
|
||||||
|
|
||||||
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
|
methods:
|
||||||
|
|
||||||
|
NewElement
|
||||||
|
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
{ # MyTypes::ArrayOfPerson
|
||||||
|
NewElement => { # MyTypes::Person
|
||||||
|
PersonID => { # MyTypes::PersonID
|
||||||
|
ID => $some_value, # int
|
||||||
|
},
|
||||||
|
Salutation => $some_value, # string
|
||||||
|
Name => $some_value, # string
|
||||||
|
GivenName => $some_value, # string
|
||||||
|
DateOfBirth => $some_value, # date
|
||||||
|
HomeAddress => { # MyTypes::Address
|
||||||
|
Street => $some_value, # string
|
||||||
|
ZIP => $some_value, # string
|
||||||
|
City => $some_value, # string
|
||||||
|
Country => $some_value, # string
|
||||||
|
PhoneNumber => $some_value, # PhoneNumber
|
||||||
|
MobilePhoneNumber => $some_value, # PhoneNumber
|
||||||
|
},
|
||||||
|
WorkAddress => { # MyTypes::Address
|
||||||
|
Street => $some_value, # string
|
||||||
|
ZIP => $some_value, # string
|
||||||
|
City => $some_value, # string
|
||||||
|
Country => $some_value, # string
|
||||||
|
PhoneNumber => $some_value, # PhoneNumber
|
||||||
|
MobilePhoneNumber => $some_value, # PhoneNumber
|
||||||
|
},
|
||||||
|
Contracts => { # MyTypes::ArrayOfContract
|
||||||
|
Contract => { # MyTypes::Contract
|
||||||
|
ContractID => $some_value, # long
|
||||||
|
ContractName => $some_value, # string
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,164 @@
|
|||||||
|
package MyTypes::BarCodeData;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %Height_of :ATTR(:get<Height>);
|
||||||
|
my %Width_of :ATTR(:get<Width>);
|
||||||
|
my %Angle_of :ATTR(:get<Angle>);
|
||||||
|
my %Ratio_of :ATTR(:get<Ratio>);
|
||||||
|
my %Module_of :ATTR(:get<Module>);
|
||||||
|
my %Left_of :ATTR(:get<Left>);
|
||||||
|
my %Top_of :ATTR(:get<Top>);
|
||||||
|
my %CheckSum_of :ATTR(:get<CheckSum>);
|
||||||
|
my %FontName_of :ATTR(:get<FontName>);
|
||||||
|
my %BarColor_of :ATTR(:get<BarColor>);
|
||||||
|
my %BGColor_of :ATTR(:get<BGColor>);
|
||||||
|
my %FontSize_of :ATTR(:get<FontSize>);
|
||||||
|
my %barcodeOption_of :ATTR(:get<barcodeOption>);
|
||||||
|
my %barcodeType_of :ATTR(:get<barcodeType>);
|
||||||
|
my %checkSumMethod_of :ATTR(:get<checkSumMethod>);
|
||||||
|
my %showTextPosition_of :ATTR(:get<showTextPosition>);
|
||||||
|
my %BarCodeImageFormat_of :ATTR(:get<BarCodeImageFormat>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
Height
|
||||||
|
Width
|
||||||
|
Angle
|
||||||
|
Ratio
|
||||||
|
Module
|
||||||
|
Left
|
||||||
|
Top
|
||||||
|
CheckSum
|
||||||
|
FontName
|
||||||
|
BarColor
|
||||||
|
BGColor
|
||||||
|
FontSize
|
||||||
|
barcodeOption
|
||||||
|
barcodeType
|
||||||
|
checkSumMethod
|
||||||
|
showTextPosition
|
||||||
|
BarCodeImageFormat
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
Height => \%Height_of,
|
||||||
|
Width => \%Width_of,
|
||||||
|
Angle => \%Angle_of,
|
||||||
|
Ratio => \%Ratio_of,
|
||||||
|
Module => \%Module_of,
|
||||||
|
Left => \%Left_of,
|
||||||
|
Top => \%Top_of,
|
||||||
|
CheckSum => \%CheckSum_of,
|
||||||
|
FontName => \%FontName_of,
|
||||||
|
BarColor => \%BarColor_of,
|
||||||
|
BGColor => \%BGColor_of,
|
||||||
|
FontSize => \%FontSize_of,
|
||||||
|
barcodeOption => \%barcodeOption_of,
|
||||||
|
barcodeType => \%barcodeType_of,
|
||||||
|
checkSumMethod => \%checkSumMethod_of,
|
||||||
|
showTextPosition => \%showTextPosition_of,
|
||||||
|
BarCodeImageFormat => \%BarCodeImageFormat_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Height => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
Width => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
Angle => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
Ratio => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
Module => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
Left => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
Top => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
CheckSum => 'SOAP::WSDL::XSD::Typelib::Builtin::boolean',
|
||||||
|
FontName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
BarColor => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
BGColor => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
FontSize => 'SOAP::WSDL::XSD::Typelib::Builtin::float',
|
||||||
|
barcodeOption => 'MyTypes::BarcodeOption',
|
||||||
|
barcodeType => 'MyTypes::BarcodeType',
|
||||||
|
checkSumMethod => 'MyTypes::CheckSumMethod',
|
||||||
|
showTextPosition => 'MyTypes::ShowTextPosition',
|
||||||
|
BarCodeImageFormat => 'MyTypes::ImageFormats',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyTypes::BarCodeData
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined complextype
|
||||||
|
BarCodeData from the namespace http://www.webservicex.net/.
|
||||||
|
|
||||||
|
=head2 PROPERTIES
|
||||||
|
|
||||||
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
|
methods:
|
||||||
|
|
||||||
|
Height
|
||||||
|
Width
|
||||||
|
Angle
|
||||||
|
Ratio
|
||||||
|
Module
|
||||||
|
Left
|
||||||
|
Top
|
||||||
|
CheckSum
|
||||||
|
FontName
|
||||||
|
BarColor
|
||||||
|
BGColor
|
||||||
|
FontSize
|
||||||
|
barcodeOption
|
||||||
|
barcodeType
|
||||||
|
checkSumMethod
|
||||||
|
showTextPosition
|
||||||
|
BarCodeImageFormat
|
||||||
|
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
{ # MyTypes::BarCodeData
|
||||||
|
Height => $some_value, # int
|
||||||
|
Width => $some_value, # int
|
||||||
|
Angle => $some_value, # int
|
||||||
|
Ratio => $some_value, # int
|
||||||
|
Module => $some_value, # int
|
||||||
|
Left => $some_value, # int
|
||||||
|
Top => $some_value, # int
|
||||||
|
CheckSum => $some_value, # boolean
|
||||||
|
FontName => $some_value, # string
|
||||||
|
BarColor => $some_value, # string
|
||||||
|
BGColor => $some_value, # string
|
||||||
|
FontSize => $some_value, # float
|
||||||
|
barcodeOption => $some_value, # BarcodeOption
|
||||||
|
barcodeType => $some_value, # BarcodeType
|
||||||
|
checkSumMethod => $some_value, # CheckSumMethod
|
||||||
|
showTextPosition => $some_value, # ShowTextPosition
|
||||||
|
BarCodeImageFormat => $some_value, # ImageFormats
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
package MyTypes::BarcodeOption;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
sub get_xmlns { 'http://www.webservicex.net/'};
|
||||||
|
|
||||||
|
# derivation by restriction
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 MyTypes::BarcodeOption
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined simpleType
|
||||||
|
BarcodeOption from the namespace http://www.webservicex.net/.
|
||||||
|
|
||||||
|
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||||
|
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
|
||||||
|
like it's base type.
|
||||||
|
|
||||||
|
# Description of restrictions not implemented yet.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
=head2 get_value / set_value
|
||||||
|
|
||||||
|
Getter and setter for the simpleType's value.
|
||||||
|
|
||||||
|
=head1 OVERLOADING
|
||||||
|
|
||||||
|
Depending on the simple type's base type, the following operations are overloaded
|
||||||
|
|
||||||
|
Stringification
|
||||||
|
Numerification
|
||||||
|
Boolification
|
||||||
|
|
||||||
|
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
package MyTypes::BarcodeType;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
sub get_xmlns { 'http://www.webservicex.net/'};
|
||||||
|
|
||||||
|
# derivation by restriction
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 MyTypes::BarcodeType
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined simpleType
|
||||||
|
BarcodeType from the namespace http://www.webservicex.net/.
|
||||||
|
|
||||||
|
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||||
|
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
|
||||||
|
like it's base type.
|
||||||
|
|
||||||
|
# Description of restrictions not implemented yet.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
=head2 get_value / set_value
|
||||||
|
|
||||||
|
Getter and setter for the simpleType's value.
|
||||||
|
|
||||||
|
=head1 OVERLOADING
|
||||||
|
|
||||||
|
Depending on the simple type's base type, the following operations are overloaded
|
||||||
|
|
||||||
|
Stringification
|
||||||
|
Numerification
|
||||||
|
Boolification
|
||||||
|
|
||||||
|
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
package MyTypes::CheckSumMethod;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
sub get_xmlns { 'http://www.webservicex.net/'};
|
||||||
|
|
||||||
|
# derivation by restriction
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 MyTypes::CheckSumMethod
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined simpleType
|
||||||
|
CheckSumMethod from the namespace http://www.webservicex.net/.
|
||||||
|
|
||||||
|
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||||
|
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
|
||||||
|
like it's base type.
|
||||||
|
|
||||||
|
# Description of restrictions not implemented yet.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
=head2 get_value / set_value
|
||||||
|
|
||||||
|
Getter and setter for the simpleType's value.
|
||||||
|
|
||||||
|
=head1 OVERLOADING
|
||||||
|
|
||||||
|
Depending on the simple type's base type, the following operations are overloaded
|
||||||
|
|
||||||
|
Stringification
|
||||||
|
Numerification
|
||||||
|
Boolification
|
||||||
|
|
||||||
|
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
package MyTypes::Contract;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %ContractID_of :ATTR(:get<ContractID>);
|
||||||
|
my %ContractName_of :ATTR(:get<ContractName>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
ContractID
|
||||||
|
ContractName
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
ContractID => \%ContractID_of,
|
||||||
|
ContractName => \%ContractName_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ContractID => 'SOAP::WSDL::XSD::Typelib::Builtin::long',
|
||||||
|
ContractName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyTypes::Contract
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined complextype
|
||||||
|
Contract from the namespace http://www.example.org/benchmark/.
|
||||||
|
|
||||||
|
=head2 PROPERTIES
|
||||||
|
|
||||||
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
|
methods:
|
||||||
|
|
||||||
|
ContractID
|
||||||
|
ContractName
|
||||||
|
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
{ # MyTypes::Contract
|
||||||
|
ContractID => $some_value, # long
|
||||||
|
ContractName => $some_value, # string
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
package MyTypes::ImageFormats;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
sub get_xmlns { 'http://www.webservicex.net/'};
|
||||||
|
|
||||||
|
# derivation by restriction
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 MyTypes::ImageFormats
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined simpleType
|
||||||
|
ImageFormats from the namespace http://www.webservicex.net/.
|
||||||
|
|
||||||
|
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||||
|
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
|
||||||
|
like it's base type.
|
||||||
|
|
||||||
|
# Description of restrictions not implemented yet.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
=head2 get_value / set_value
|
||||||
|
|
||||||
|
Getter and setter for the simpleType's value.
|
||||||
|
|
||||||
|
=head1 OVERLOADING
|
||||||
|
|
||||||
|
Depending on the simple type's base type, the following operations are overloaded
|
||||||
|
|
||||||
|
Stringification
|
||||||
|
Numerification
|
||||||
|
Boolification
|
||||||
|
|
||||||
|
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
package MyTypes::Person;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %PersonID_of :ATTR(:get<PersonID>);
|
||||||
|
my %Salutation_of :ATTR(:get<Salutation>);
|
||||||
|
my %Name_of :ATTR(:get<Name>);
|
||||||
|
my %GivenName_of :ATTR(:get<GivenName>);
|
||||||
|
my %DateOfBirth_of :ATTR(:get<DateOfBirth>);
|
||||||
|
my %HomeAddress_of :ATTR(:get<HomeAddress>);
|
||||||
|
my %WorkAddress_of :ATTR(:get<WorkAddress>);
|
||||||
|
my %Contracts_of :ATTR(:get<Contracts>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
PersonID
|
||||||
|
Salutation
|
||||||
|
Name
|
||||||
|
GivenName
|
||||||
|
DateOfBirth
|
||||||
|
HomeAddress
|
||||||
|
WorkAddress
|
||||||
|
Contracts
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
PersonID => \%PersonID_of,
|
||||||
|
Salutation => \%Salutation_of,
|
||||||
|
Name => \%Name_of,
|
||||||
|
GivenName => \%GivenName_of,
|
||||||
|
DateOfBirth => \%DateOfBirth_of,
|
||||||
|
HomeAddress => \%HomeAddress_of,
|
||||||
|
WorkAddress => \%WorkAddress_of,
|
||||||
|
Contracts => \%Contracts_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PersonID => 'MyTypes::PersonID',
|
||||||
|
Salutation => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
Name => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
GivenName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
DateOfBirth => 'SOAP::WSDL::XSD::Typelib::Builtin::date',
|
||||||
|
HomeAddress => 'MyTypes::Address',
|
||||||
|
WorkAddress => 'MyTypes::Address',
|
||||||
|
Contracts => 'MyTypes::ArrayOfContract',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyTypes::Person
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined complextype
|
||||||
|
Person from the namespace http://www.example.org/benchmark/.
|
||||||
|
|
||||||
|
=head2 PROPERTIES
|
||||||
|
|
||||||
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
|
methods:
|
||||||
|
|
||||||
|
PersonID
|
||||||
|
Salutation
|
||||||
|
Name
|
||||||
|
GivenName
|
||||||
|
DateOfBirth
|
||||||
|
HomeAddress
|
||||||
|
WorkAddress
|
||||||
|
Contracts
|
||||||
|
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
{ # MyTypes::Person
|
||||||
|
PersonID => { # MyTypes::PersonID
|
||||||
|
ID => $some_value, # int
|
||||||
|
},
|
||||||
|
Salutation => $some_value, # string
|
||||||
|
Name => $some_value, # string
|
||||||
|
GivenName => $some_value, # string
|
||||||
|
DateOfBirth => $some_value, # date
|
||||||
|
HomeAddress => { # MyTypes::Address
|
||||||
|
Street => $some_value, # string
|
||||||
|
ZIP => $some_value, # string
|
||||||
|
City => $some_value, # string
|
||||||
|
Country => $some_value, # string
|
||||||
|
PhoneNumber => $some_value, # PhoneNumber
|
||||||
|
MobilePhoneNumber => $some_value, # PhoneNumber
|
||||||
|
},
|
||||||
|
WorkAddress => { # MyTypes::Address
|
||||||
|
Street => $some_value, # string
|
||||||
|
ZIP => $some_value, # string
|
||||||
|
City => $some_value, # string
|
||||||
|
Country => $some_value, # string
|
||||||
|
PhoneNumber => $some_value, # PhoneNumber
|
||||||
|
MobilePhoneNumber => $some_value, # PhoneNumber
|
||||||
|
},
|
||||||
|
Contracts => { # MyTypes::ArrayOfContract
|
||||||
|
Contract => { # MyTypes::Contract
|
||||||
|
ContractID => $some_value, # long
|
||||||
|
ContractName => $some_value, # string
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
package MyTypes::PersonID;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %ID_of :ATTR(:get<ID>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
ID
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
ID => \%ID_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyTypes::PersonID
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined complextype
|
||||||
|
PersonID from the namespace http://www.example.org/benchmark/.
|
||||||
|
|
||||||
|
=head2 PROPERTIES
|
||||||
|
|
||||||
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
|
methods:
|
||||||
|
|
||||||
|
ID
|
||||||
|
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
{ # MyTypes::PersonID
|
||||||
|
ID => $some_value, # int
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
package MyTypes::PhoneNumber;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
sub get_xmlns { 'http://www.example.org/benchmark/'};
|
||||||
|
|
||||||
|
# derivation by restriction
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 MyTypes::PhoneNumber
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined simpleType
|
||||||
|
PhoneNumber from the namespace http://www.example.org/benchmark/.
|
||||||
|
|
||||||
|
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||||
|
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
|
||||||
|
like it's base type.
|
||||||
|
|
||||||
|
# Description of restrictions not implemented yet.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
=head2 get_value / set_value
|
||||||
|
|
||||||
|
Getter and setter for the simpleType's value.
|
||||||
|
|
||||||
|
=head1 OVERLOADING
|
||||||
|
|
||||||
|
Depending on the simple type's base type, the following operations are overloaded
|
||||||
|
|
||||||
|
Stringification
|
||||||
|
Numerification
|
||||||
|
Boolification
|
||||||
|
|
||||||
|
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
package MyTypes::ShowTextPosition;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
sub get_xmlns { 'http://www.webservicex.net/'};
|
||||||
|
|
||||||
|
# derivation by restriction
|
||||||
|
use base qw(
|
||||||
|
SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 MyTypes::ShowTextPosition
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined simpleType
|
||||||
|
ShowTextPosition from the namespace http://www.webservicex.net/.
|
||||||
|
|
||||||
|
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||||
|
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
|
||||||
|
like it's base type.
|
||||||
|
|
||||||
|
# Description of restrictions not implemented yet.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
=head2 get_value / set_value
|
||||||
|
|
||||||
|
Getter and setter for the simpleType's value.
|
||||||
|
|
||||||
|
=head1 OVERLOADING
|
||||||
|
|
||||||
|
Depending on the simple type's base type, the following operations are overloaded
|
||||||
|
|
||||||
|
Stringification
|
||||||
|
Numerification
|
||||||
|
Boolification
|
||||||
|
|
||||||
|
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
package MyTypes::test2;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %name_of :ATTR(:get<name>);
|
||||||
|
my %givenName_of :ATTR(:get<givenName>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
name
|
||||||
|
givenName
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
name => \%name_of,
|
||||||
|
givenName => \%givenName_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
givenName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyTypes::test2
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined complextype
|
||||||
|
test2 from the namespace urn:HelloWorld.
|
||||||
|
|
||||||
|
=head2 PROPERTIES
|
||||||
|
|
||||||
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
|
methods:
|
||||||
|
|
||||||
|
name
|
||||||
|
givenName
|
||||||
|
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
{ # MyTypes::test2
|
||||||
|
name => $some_value, # string
|
||||||
|
givenName => $some_value, # string
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
package MyTypes::testExtended;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable constructor => 'none';
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
Class::Std::initialize();
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
|
my %extend_of :ATTR(:get<extend>);
|
||||||
|
|
||||||
|
__PACKAGE__->_factory(
|
||||||
|
[ qw(
|
||||||
|
extend
|
||||||
|
) ],
|
||||||
|
{
|
||||||
|
extend => \%extend_of,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
extend => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} # end BLOCK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
MyTypes::testExtended
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Perl data type class for the XML Schema defined complextype
|
||||||
|
testExtended from the namespace urn:HelloWorld.
|
||||||
|
|
||||||
|
=head2 PROPERTIES
|
||||||
|
|
||||||
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
|
methods:
|
||||||
|
|
||||||
|
extend
|
||||||
|
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
{ # MyTypes::testExtended
|
||||||
|
extend => $some_value, # string
|
||||||
|
},
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Generated by SOAP::WSDL
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use lib 'lib';
|
||||||
|
use MyInterfaces::TestService::TestPort;
|
||||||
|
|
||||||
|
my $soap = MyInterfaces::TestService::TestPort->new();
|
||||||
|
|
||||||
|
my $result = $soap->ListPerson({})
|
||||||
|
or die "error calling SOAP method";
|
||||||
|
|
||||||
|
print "Found " . @{ $result->get_out()->get_NewElement } . " persons\n";
|
||||||
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use XML::Compile::WSDL11;
|
||||||
|
use XML::Compile::Transport::SOAPHTTP;
|
||||||
|
|
||||||
|
my $wsdl = XML::Compile::WSDL11->new('wsdl/Person.wsdl');
|
||||||
|
|
||||||
|
# I have to lookup the methods from the WSDL
|
||||||
|
my $call = $wsdl->compileClient('ListPerson');
|
||||||
|
|
||||||
|
# I have to lookup the parameters from the WSDL
|
||||||
|
my $result = $call->({ in => undef});
|
||||||
|
|
||||||
|
die "Error calling soap method" if not defined $result;
|
||||||
|
|
||||||
|
# I have to lookup the output parameters from the WSDL - or try Dumper
|
||||||
|
#use Data::Dumper;
|
||||||
|
#print Dumper $result;
|
||||||
|
|
||||||
|
print "Found ", scalar @{ $result->{ parameters }->{ out }->{ seq_NewElement }->[0]->{ NewElement } } , " persons\n";
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package PersonVisitor;
|
||||||
|
use Class::Std; # handles all basic stuff like constructors etc.
|
||||||
|
|
||||||
|
sub visit_Person {
|
||||||
|
my ( $self, $object ) = @_;
|
||||||
|
print "Person name is ", $object->get_name(), "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
package Person;
|
||||||
|
use Class::Std;
|
||||||
|
my %name : ATTR(:name<name> :default<anonymous>);
|
||||||
|
|
||||||
|
sub accept { $_[1]->visit_Person( $_[0] ) }
|
||||||
|
|
||||||
|
package main;
|
||||||
|
my @person_from = ();
|
||||||
|
for (qw(Gamma Helm Johnson Vlissides)) {
|
||||||
|
push @person_from, Person->new( { name => $_ } );
|
||||||
|
}
|
||||||
|
|
||||||
|
my $visitor = PersonVisitor->new();
|
||||||
|
for (@person_from) {
|
||||||
|
$_->accept($visitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
+14
-11
@@ -1,19 +1,22 @@
|
|||||||
# Accessing the fortune cookie service at
|
# Accessing the globalweather service at
|
||||||
# www.webservicex.net/GlobalWeather/GlobalWeather.asmx
|
# www.webservicex.net/GlobalWeather/GlobalWeather.asmx
|
||||||
#
|
#
|
||||||
# I have no connection to www.webservicex.net
|
# Note that the GlobalWeather web service returns a (quoted) XML structure -
|
||||||
|
# don't be surprised by the response's format.
|
||||||
#
|
#
|
||||||
|
# I have no connection to www.webservicex.net
|
||||||
# Use this script at your own risk.
|
# Use this script at your own risk.
|
||||||
|
#
|
||||||
|
# This script demonstrates the use of a interface generated by wsdl2perl.pl
|
||||||
|
|
||||||
use lib 'lib/';
|
use lib 'lib/';
|
||||||
use MyInterfaces::GlobalWeather;
|
use MyInterfaces::GlobalWeather::GlobalWeatherSoap;
|
||||||
my $webservice = MyInterfaces::GlobalWeather->new();
|
my $weather = MyInterfaces::GlobalWeather::GlobalWeatherSoap->new();
|
||||||
|
my $result = $weather->GetWeather({ CountryName => 'Germany', CityName => 'Munich' });
|
||||||
|
|
||||||
my $result = $webservice->GetWeather({ CountryName => 'Germany', CityName => 'Munich' });
|
# boolean comparison overloaded
|
||||||
|
die $result->get_faultstring()->get_value() if not ($result);
|
||||||
|
|
||||||
if ($result) {
|
# The result is a XML string
|
||||||
print $result->get_GetWeatherResult()->get_value(), "\n";
|
# use get_value to avoid automatic entity encoding
|
||||||
}
|
print $result->get_GetWeatherResult()->get_value , "\n";
|
||||||
else {
|
|
||||||
print $result;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
# Accessing the globalweather service at
|
||||||
|
# www.webservicex.net/GlobalWeather/GlobalWeather.asmx
|
||||||
|
#
|
||||||
|
# Note that the GlobalWeather web service returns a (quoted) XML structure -
|
||||||
|
# don't be surprised by the response's format.
|
||||||
|
#
|
||||||
|
# I have no connection to www.webservicex.net
|
||||||
|
# Use this script at your own risk.
|
||||||
|
#
|
||||||
|
# This script demonstrates the use of SOAP::WSDL in SOAP::Lite style.
|
||||||
|
|
||||||
|
use lib 'lib/';
|
||||||
|
use lib '../lib';
|
||||||
|
use File::Basename qw(dirname);
|
||||||
|
use File::Spec;
|
||||||
|
my $path = File::Spec->rel2abs( dirname __FILE__);
|
||||||
|
|
||||||
|
# SOAP::WSDL variant
|
||||||
|
use SOAP::WSDL;
|
||||||
|
my $soap = SOAP::WSDL->new();
|
||||||
|
my $som = $soap->wsdl("file:///$path/wsdl/globalweather.xml")
|
||||||
|
->call('GetWeather', GetWeather =>
|
||||||
|
{ CountryName => 'Germany', CityName => 'Munich' }
|
||||||
|
);
|
||||||
|
|
||||||
|
die "Error" if $som->fault();
|
||||||
|
print $som->result();
|
||||||
|
|
||||||
|
# SOAP::Lite variant:
|
||||||
|
# Note that you have to look both the proxy and the xmlns attribute
|
||||||
|
# set on the GetWeather SOAP::Data object from the WSDL.
|
||||||
|
|
||||||
|
use SOAP::Lite +trace;
|
||||||
|
$soap = SOAP::Lite->new()->on_action( sub { join'/', @_ } )
|
||||||
|
->proxy("http://www.webservicex.net/globalweather.asmx"); # from WSDL
|
||||||
|
$som = $soap->call(
|
||||||
|
SOAP::Data->name('GetWeather')
|
||||||
|
->attr({ xmlns => 'http://www.webserviceX.NET' }), # from WSDL
|
||||||
|
SOAP::Data->name('CountryName')->value('Germany'),
|
||||||
|
SOAP::Data->name('CityName')->value('Munich')
|
||||||
|
);
|
||||||
|
die "Error" if $som->fault();
|
||||||
|
print $som->result();
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
|
||||||
|
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
|
||||||
|
xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="urn:HelloWorld"
|
||||||
|
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
|
||||||
|
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
|
||||||
|
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
|
||||||
|
targetNamespace="urn:HelloWorld"
|
||||||
|
xmlns="http://schemas.xmlsoap.org/wsdl/">
|
||||||
|
<types>
|
||||||
|
<s:schema elementFormDefault="qualified"
|
||||||
|
targetNamespace="urn:HelloWorld">
|
||||||
|
<s:element name="sayHello">
|
||||||
|
<s:complexType>
|
||||||
|
<s:sequence>
|
||||||
|
<s:element minOccurs="0" maxOccurs="1"
|
||||||
|
name="name" type="s:string" />
|
||||||
|
<s:element minOccurs="0" maxOccurs="1"
|
||||||
|
name="givenName" type="s:string" nillable="1" />
|
||||||
|
</s:sequence>
|
||||||
|
</s:complexType>
|
||||||
|
</s:element>
|
||||||
|
|
||||||
|
<s:element name="sayHelloResponse">
|
||||||
|
<s:complexType>
|
||||||
|
<s:sequence>
|
||||||
|
<s:element minOccurs="0" maxOccurs="1"
|
||||||
|
name="sayHelloResult" type="s:string" />
|
||||||
|
</s:sequence>
|
||||||
|
</s:complexType>
|
||||||
|
</s:element>
|
||||||
|
|
||||||
|
<s:complexType name="test2">
|
||||||
|
<s:sequence>
|
||||||
|
<s:element minOccurs="0" maxOccurs="1" name="name"
|
||||||
|
type="s:string" />
|
||||||
|
|
||||||
|
<s:element minOccurs="0" maxOccurs="1"
|
||||||
|
name="givenName" type="s:string" />
|
||||||
|
</s:sequence>
|
||||||
|
</s:complexType>
|
||||||
|
|
||||||
|
<s:complexType name="testExtended">
|
||||||
|
<s:extension base="s0:test2">
|
||||||
|
<s:sequence>
|
||||||
|
<s:element minOccurs="0" maxOccurs="1"
|
||||||
|
name="extend" type="s:string" />
|
||||||
|
</s:sequence>
|
||||||
|
</s:extension>
|
||||||
|
</s:complexType>
|
||||||
|
</s:schema>
|
||||||
|
</types>
|
||||||
|
|
||||||
|
<message name="sayHelloSoapIn">
|
||||||
|
<part name="parameters" element="s0:sayHello" />
|
||||||
|
</message>
|
||||||
|
|
||||||
|
<message name="sayHelloSoapOut">
|
||||||
|
<part name="parameters" element="s0:sayHelloResponse" />
|
||||||
|
</message>
|
||||||
|
|
||||||
|
<portType name="Service1Soap">
|
||||||
|
<operation name="sayHello">
|
||||||
|
<input message="s0:sayHelloSoapIn" />
|
||||||
|
|
||||||
|
<output message="s0:sayHelloSoapOut" />
|
||||||
|
</operation>
|
||||||
|
</portType>
|
||||||
|
|
||||||
|
<binding name="Service1Soap" type="s0:Service1Soap">
|
||||||
|
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
|
||||||
|
style="document" />
|
||||||
|
|
||||||
|
<operation name="sayHello">
|
||||||
|
<soap:operation soapAction="urn:HelloWorld#sayHello"
|
||||||
|
style="document" />
|
||||||
|
|
||||||
|
<input>
|
||||||
|
<soap:body use="literal" />
|
||||||
|
</input>
|
||||||
|
|
||||||
|
<output>
|
||||||
|
<soap:body use="literal" />
|
||||||
|
</output>
|
||||||
|
</operation>
|
||||||
|
</binding>
|
||||||
|
|
||||||
|
<service name="HelloWorld">
|
||||||
|
<port name="HelloWorldSoap" binding="s0:Service1Soap">
|
||||||
|
<soap:address
|
||||||
|
location="http://localhost:81/soap-wsdl-test/helloworld.pl" />
|
||||||
|
</port>
|
||||||
|
</service>
|
||||||
|
</definitions>
|
||||||
|
|
||||||
@@ -0,0 +1,121 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<wsdl:definitions name="benchmark"
|
||||||
|
targetNamespace="http://www.example.org/benchmark/"
|
||||||
|
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
|
||||||
|
xmlns:tns="http://www.example.org/benchmark/"
|
||||||
|
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
|
||||||
|
<wsdl:types>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
targetNamespace="http://www.example.org/benchmark/">
|
||||||
|
|
||||||
|
<xsd:element name="ListPerson">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="in" type="tns:Person"
|
||||||
|
maxOccurs="1" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
|
||||||
|
<xsd:element name="ListPersonResponse">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="out" type="tns:ArrayOfPerson" />
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:complexType name="Person">
|
||||||
|
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="PersonID" type="tns:PersonID" />
|
||||||
|
<xsd:element name="Salutation" type="xsd:string" />
|
||||||
|
<xsd:element name="Name" type="xsd:string" />
|
||||||
|
<xsd:element name="GivenName" type="xsd:string" />
|
||||||
|
<xsd:element name="DateOfBirth" type="xsd:date" />
|
||||||
|
<xsd:element name="HomeAddress" type="tns:Address"
|
||||||
|
maxOccurs="1" minOccurs="1" />
|
||||||
|
<xsd:element name="WorkAddress" type="tns:Address"
|
||||||
|
maxOccurs="1" minOccurs="0" />
|
||||||
|
<xsd:element name="Contracts"
|
||||||
|
type="tns:ArrayOfContract" />
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
|
||||||
|
<xsd:simpleType name="PhoneNumber">
|
||||||
|
<xsd:restriction base="xsd:string"></xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
|
||||||
|
<xsd:complexType name="ArrayOfPerson">
|
||||||
|
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element name="NewElement" type="tns:Person"
|
||||||
|
maxOccurs="unbounded" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
|
||||||
|
<xsd:complexType name="PersonID">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="ID" type="xsd:int"></xsd:element>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
|
||||||
|
<xsd:complexType name="Address">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="Street" type="xsd:string" />
|
||||||
|
<xsd:element name="ZIP" type="xsd:string" />
|
||||||
|
<xsd:element name="City" type="xsd:string" />
|
||||||
|
<xsd:element name="Country" type="xsd:string" />
|
||||||
|
<xsd:element name="PhoneNumber" type="tns:PhoneNumber" />
|
||||||
|
<xsd:element name="MobilePhoneNumber" type="tns:PhoneNumber" />
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
|
||||||
|
<xsd:complexType name="ArrayOfContract">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="Contract" type="tns:Contract"
|
||||||
|
maxOccurs="unbounded" minOccurs="0">
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
|
||||||
|
<xsd:complexType name="Contract">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="ContractID" type="xsd:long" />
|
||||||
|
<xsd:element name="ContractName" type="xsd:string" />
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:schema>
|
||||||
|
</wsdl:types>
|
||||||
|
<wsdl:message name="ListPersonRequest">
|
||||||
|
<wsdl:part name="parameters" element="tns:ListPerson" />
|
||||||
|
</wsdl:message>
|
||||||
|
<wsdl:message name="ListPersonResponse">
|
||||||
|
<wsdl:part name="parameters" element="tns:ListPersonResponse" />
|
||||||
|
</wsdl:message>
|
||||||
|
<wsdl:portType name="NewPortType">
|
||||||
|
<wsdl:operation name="ListPerson">
|
||||||
|
<wsdl:input message="tns:ListPersonRequest"></wsdl:input>
|
||||||
|
<wsdl:output message="tns:ListPersonResponse"></wsdl:output>
|
||||||
|
</wsdl:operation>
|
||||||
|
</wsdl:portType>
|
||||||
|
<wsdl:binding name="NewBinding" type="tns:NewPortType">
|
||||||
|
<soap:binding style="document"
|
||||||
|
transport="http://schemas.xmlsoap.org/soap/http" />
|
||||||
|
<wsdl:operation name="ListPerson">
|
||||||
|
<soap:operation
|
||||||
|
soapAction="http://www.example.org/benchmark/ListPerson" />
|
||||||
|
<wsdl:input>
|
||||||
|
<soap:body use="literal" />
|
||||||
|
</wsdl:input>
|
||||||
|
<wsdl:output>
|
||||||
|
<soap:body use="literal" />
|
||||||
|
</wsdl:output>
|
||||||
|
</wsdl:operation>
|
||||||
|
</wsdl:binding>
|
||||||
|
<wsdl:service name="TestService">
|
||||||
|
<wsdl:port name="TestPort" binding="tns:NewBinding">
|
||||||
|
<soap:address
|
||||||
|
location="http://localhost:81/soap-wsdl-test/person.pl"></soap:address>
|
||||||
|
</wsdl:port>
|
||||||
|
</wsdl:service>
|
||||||
|
</wsdl:definitions>
|
||||||
+446
-374
File diff suppressed because it is too large
Load Diff
+62
-86
@@ -1,20 +1,29 @@
|
|||||||
package SOAP::WSDL::Base;
|
package SOAP::WSDL::Base;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Carp;
|
use Class::Std::Fast::Storable;
|
||||||
use Class::Std::Storable;
|
|
||||||
use List::Util qw(first);
|
use List::Util qw(first);
|
||||||
|
use Carp qw(croak carp confess);
|
||||||
|
|
||||||
|
our $VERSION='2.00_27';
|
||||||
|
|
||||||
my %id_of :ATTR(:name<id> :default<()>);
|
my %id_of :ATTR(:name<id> :default<()>);
|
||||||
my %name_of :ATTR(:name<name> :default<()>);
|
my %name_of :ATTR(:name<name> :default<()>);
|
||||||
|
my %documentation_of :ATTR(:name<documentation> :default<()>);
|
||||||
my %targetNamespace_of :ATTR(:name<targetNamespace> :default<()>);
|
my %targetNamespace_of :ATTR(:name<targetNamespace> :default<()>);
|
||||||
my %xmlns_of :ATTR(:name<xmlns> :default<{}>);
|
my %xmlns_of :ATTR(:name<xmlns> :default<{}>);
|
||||||
my %parent_of :ATTR(:name<parent> :default<()>);
|
my %parent_of :ATTR(:name<parent> :default<()>);
|
||||||
|
|
||||||
|
sub START {
|
||||||
|
my ($self, $ident, $arg_ref) = @_;
|
||||||
|
$xmlns_of{ $ident }->{ '#default' } = $self->get_xmlns()->{ '#default' };
|
||||||
|
}
|
||||||
|
|
||||||
sub DEMOLISH {
|
sub DEMOLISH {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
# delete upward references
|
# delete upward references
|
||||||
delete $parent_of{ ident $self };
|
delete $parent_of{ ident $self };
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub STORABLE_freeze_pre :CUMULATIVE {};
|
sub STORABLE_freeze_pre :CUMULATIVE {};
|
||||||
@@ -22,6 +31,16 @@ sub STORABLE_freeze_post :CUMULATIVE {};
|
|||||||
sub STORABLE_thaw_pre :CUMULATIVE {};
|
sub STORABLE_thaw_pre :CUMULATIVE {};
|
||||||
sub STORABLE_thaw_post :CUMULATIVE { return $_[0] };
|
sub STORABLE_thaw_post :CUMULATIVE { return $_[0] };
|
||||||
|
|
||||||
|
sub _accept {
|
||||||
|
my $self = shift;
|
||||||
|
my $class = ref $self;
|
||||||
|
$class =~ s{ \A SOAP::WSDL:: }{}xms;
|
||||||
|
$class =~ s{ (:? :: ) }{_}gxms;
|
||||||
|
my $method = "visit_$class";
|
||||||
|
no strict qw(refs); ## no critic ProhibitNoStrict
|
||||||
|
return shift->$method( $self );
|
||||||
|
}
|
||||||
|
|
||||||
# unfortunately, AUTOMETHOD is SLOW.
|
# unfortunately, AUTOMETHOD is SLOW.
|
||||||
# Re-implement in derived package wherever speed is an issue...
|
# Re-implement in derived package wherever speed is an issue...
|
||||||
#
|
#
|
||||||
@@ -38,10 +57,8 @@ sub AUTOMETHOD {
|
|||||||
## And we would have to check getters, too.
|
## And we would have to check getters, too.
|
||||||
## Maybe do it the Conway way via the Symbol table...
|
## Maybe do it the Conway way via the Symbol table...
|
||||||
## ... can is way slow...
|
## ... can is way slow...
|
||||||
# croak "no set accessor found for push_$subname"
|
|
||||||
# if not ($self->can( $setter ));
|
|
||||||
return sub {
|
return sub {
|
||||||
no strict qw(refs);
|
no strict qw(refs); ## no critic ProhibitNoStrict
|
||||||
my $old_value = $self->$getter();
|
my $old_value = $self->$getter();
|
||||||
# Listify if not a list ref
|
# Listify if not a list ref
|
||||||
$old_value = $old_value ? [ $old_value ] : [] if not ref $old_value;
|
$old_value = $old_value ? [ $old_value ] : [] if not ref $old_value;
|
||||||
@@ -53,6 +70,7 @@ sub AUTOMETHOD {
|
|||||||
|
|
||||||
# we're called as $obj->find_something($ns, $key)
|
# we're called as $obj->find_something($ns, $key)
|
||||||
elsif ($subname =~s {^find_}{get_}xms) {
|
elsif ($subname =~s {^find_}{get_}xms) {
|
||||||
|
@values = @{ $values[0] } if ref $values[0] eq 'ARRAY';
|
||||||
return sub {
|
return sub {
|
||||||
return first {
|
return first {
|
||||||
$_->get_targetNamespace() eq $values[0] &&
|
$_->get_targetNamespace() eq $values[0] &&
|
||||||
@@ -69,101 +87,59 @@ sub AUTOMETHOD {
|
|||||||
return $result_ref->[0];
|
return $result_ref->[0];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
croak "$subname not found in class " . (ref $self || $self);
|
confess "$subname not found in class " . ref $self;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub init {
|
sub init {
|
||||||
my $self = shift;
|
my ($self, @args) = @_;
|
||||||
my @args = @_;
|
|
||||||
foreach my $value (@args)
|
foreach my $value (@args)
|
||||||
{
|
{
|
||||||
die $value if (not defined ($value->{ Name }));
|
croak @args if (not defined ($value->{ Name }));
|
||||||
if ($value->{ Name } =~m{^xmlns\:}xms) {
|
if ($value->{ Name } =~m{^xmlns\:}xms) {
|
||||||
die $xmlns_of{ ident $self }
|
# add namespaces
|
||||||
if ref $xmlns_of{ ident $self } ne 'HASH';
|
$xmlns_of{ ident $self }->{ $value->{ LocalName } } = $value->{ Value };
|
||||||
$xmlns_of{ ident $self }->{ $value->{ Value } } =
|
|
||||||
$value->{ LocalName };
|
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
elsif ($value->{ Name } =~m{^xmlns$}xms) {
|
|
||||||
# just ignore xmlns = for now
|
my $name = $value->{ LocalName };
|
||||||
# TODO handle xmlns correctly - maybe via setting a prefix ?
|
my $method = "set_$name";
|
||||||
next;
|
$self->$method( $value->{ Value } );
|
||||||
}
|
|
||||||
my $name = $value->{ LocalName };
|
|
||||||
my $method = "set_$name";
|
|
||||||
$self->$method( $value->{ Value } ) if ( $method );
|
|
||||||
}
|
}
|
||||||
return $self;
|
return $self;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub add_namespace {
|
sub expand {
|
||||||
my ($self, $uri, $prefix ) = @_;
|
my ($self, , $qname) = @_;
|
||||||
return unless $uri;
|
my $ns_of = $self->get_xmlns();
|
||||||
$self->{ namespace } ||= {};
|
if (not $qname=~m{:}xm) {
|
||||||
$self->{ namespace }->{ $uri } = $prefix;
|
die "un-prefixed element name <$qname> found, but no default namespace set\n"
|
||||||
}
|
if not defined $ns_of->{ '#default' };
|
||||||
|
return $ns_of->{ '#default' }, $qname;
|
||||||
sub to_typemap {
|
|
||||||
warn "to_typemap";
|
|
||||||
return q{};
|
|
||||||
}
|
|
||||||
|
|
||||||
sub toClass {
|
|
||||||
my $self = shift;
|
|
||||||
warn 'toClass is deprecated and will be removed before reaching 2.01 - '
|
|
||||||
. 'use to_class instead (' . caller() . ')';
|
|
||||||
$self->to_class(@_);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub to_class {
|
|
||||||
my $self = shift;
|
|
||||||
my $opt = shift;
|
|
||||||
my $template = shift;
|
|
||||||
|
|
||||||
$opt->{ base_path } ||= '.';
|
|
||||||
|
|
||||||
my $element_prefix = $opt->{ element_prefix } || $opt->{ prefix };
|
|
||||||
my $type_prefix = $opt->{ type_prefix } || $opt->{ prefix };
|
|
||||||
|
|
||||||
if (($type_prefix) && ($type_prefix !~m{ :: $ }xms ) ) {
|
|
||||||
warn 'type_prefix should end with "::"';
|
|
||||||
$type_prefix .= '::';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($element_prefix) && ($element_prefix !~m{ :: $ }xms) ) {
|
my ($prefix, $localname) = split /:/x, $qname;
|
||||||
warn 'element_prefix should end with "::"';
|
|
||||||
$element_prefix .= '::';
|
|
||||||
|
return ($ns_of->{ $prefix }, $localname) if ($ns_of->{ $prefix });
|
||||||
|
|
||||||
|
if (my $parent = $self->get_parent()) {
|
||||||
|
return $parent->expand($qname);
|
||||||
}
|
}
|
||||||
|
confess "unbound prefix $prefix found for $prefix:$localname. Bound prefixes are"
|
||||||
# Be careful: a Element may be ComplexType, too
|
. join(', ', keys %{ $ns_of });
|
||||||
# (but not vice versa)
|
|
||||||
my $prefix = $self->isa('SOAP::WSDL::XSD::Element')
|
|
||||||
? $element_prefix
|
|
||||||
: $type_prefix;
|
|
||||||
|
|
||||||
die 'No prefix specified' if not $prefix;
|
|
||||||
|
|
||||||
my $filename = $prefix . $self->get_name() . '.pm';
|
|
||||||
$filename =~s{::}{/}xmsg;
|
|
||||||
|
|
||||||
my $output = $opt->{ output } || $filename;
|
|
||||||
|
|
||||||
require Template;
|
|
||||||
my $tt = Template->new(
|
|
||||||
RELATIVE => 1,
|
|
||||||
OUTPUT_PATH => $opt->{ base_path },
|
|
||||||
);
|
|
||||||
|
|
||||||
my $code = $tt->process( \$template, {
|
|
||||||
element_prefix => $element_prefix,
|
|
||||||
type_prefix => $type_prefix,
|
|
||||||
self => $self,
|
|
||||||
nsmap => { reverse %{ $opt->{ wsdl }->get_xmlns() } },
|
|
||||||
structure => $self->explain( { wsdl => $opt->{ wsdl } } ),
|
|
||||||
},
|
|
||||||
$output
|
|
||||||
)
|
|
||||||
or die $tt->error();
|
|
||||||
}
|
}
|
||||||
|
sub _expand;
|
||||||
|
*_expand = \&expand;
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
# REPOSITORY INFORMATION
|
||||||
|
#
|
||||||
|
# $Rev: 332 $
|
||||||
|
# $LastChangedBy: kutterma $
|
||||||
|
# $Id: WSDL.pm 332 2007-10-19 07:29:03Z kutterma $
|
||||||
|
# $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $
|
||||||
|
#
|
||||||
|
|
||||||
|
|||||||
+1
-103
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::Binding;
|
package SOAP::WSDL::Binding;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use List::Util qw(first);
|
use List::Util qw(first);
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
@@ -10,106 +10,4 @@ my %type_of :ATTR(:name<type> :default<()>);
|
|||||||
my %transport_of :ATTR(:name<transport> :default<()>);
|
my %transport_of :ATTR(:name<transport> :default<()>);
|
||||||
my %style_of :ATTR(:name<style> :default<()>);
|
my %style_of :ATTR(:name<style> :default<()>);
|
||||||
|
|
||||||
|
|
||||||
sub explain {
|
|
||||||
my $self = shift;
|
|
||||||
my $opt = shift;
|
|
||||||
my $name = $self->get_name();
|
|
||||||
|
|
||||||
die 'required atribute wsdl missing' if not $opt->{ wsdl };
|
|
||||||
|
|
||||||
my $portType = $opt->{ wsdl }->find_portType(
|
|
||||||
$opt->{ wsdl }->_expand( $self->get_type() )
|
|
||||||
) or die 'portType not found: ' . $self->get_type();
|
|
||||||
|
|
||||||
my $txt = <<"EOT";
|
|
||||||
|
|
||||||
=head2 SOAP Operations
|
|
||||||
|
|
||||||
B<Note:>
|
|
||||||
|
|
||||||
Input, output and fault messages are stated as perl hash refs.
|
|
||||||
|
|
||||||
These are only for informational purposes - the actual implementation
|
|
||||||
normally uses object trees, not hash refs, though the input messages
|
|
||||||
may be passed to the respective methods as hash refs and will be
|
|
||||||
converted to object trees automatically.
|
|
||||||
|
|
||||||
EOT
|
|
||||||
|
|
||||||
foreach my $operation (@{ $self->get_operation() }) {
|
|
||||||
|
|
||||||
my $operation_name = $operation->get_name();
|
|
||||||
my $operation_style = $operation->get_style() || q{};
|
|
||||||
|
|
||||||
my $port_operation = first { $_->get_name eq $operation_name }
|
|
||||||
@{ $portType->get_operation() }
|
|
||||||
or die "operation not found:" . $operation->get_name();
|
|
||||||
|
|
||||||
# TODO rename lexical $input to "message"
|
|
||||||
my $input_message = do {
|
|
||||||
my $input = $port_operation->first_input();
|
|
||||||
$input ? $input->explain($opt) : q{};
|
|
||||||
};
|
|
||||||
my $output_message = do {
|
|
||||||
my $input = $port_operation->first_output();
|
|
||||||
$input ? $input->explain($opt) : q{};
|
|
||||||
};
|
|
||||||
my $fault_message = do {
|
|
||||||
my $input = $port_operation->first_fault();
|
|
||||||
$input ? $input->explain($opt) : q{};
|
|
||||||
};
|
|
||||||
|
|
||||||
$txt .= <<"EOT";
|
|
||||||
|
|
||||||
=head3 $operation_name
|
|
||||||
|
|
||||||
B<Input Message:>
|
|
||||||
|
|
||||||
$input_message
|
|
||||||
|
|
||||||
B<Output Message:>
|
|
||||||
|
|
||||||
$output_message
|
|
||||||
|
|
||||||
B<Fault:>
|
|
||||||
|
|
||||||
$fault_message
|
|
||||||
|
|
||||||
EOT
|
|
||||||
}
|
|
||||||
|
|
||||||
return $txt;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub to_typemap {
|
|
||||||
my ($self, $opt) = @_;
|
|
||||||
my $name = $self->get_name();
|
|
||||||
|
|
||||||
my $portType = $opt->{ wsdl }->find_portType(
|
|
||||||
$opt->{ wsdl }->_expand( $self->get_type )
|
|
||||||
) or die 'portType not found: ' . $self->get_type;
|
|
||||||
|
|
||||||
my $txt = q{};
|
|
||||||
foreach my $operation (@{ $self->get_operation() })
|
|
||||||
{
|
|
||||||
my $operation_name = $operation->get_name();
|
|
||||||
my $operation_style = $operation->get_style() || q{};
|
|
||||||
|
|
||||||
my ($port_operation) = grep { $_->get_name eq $operation_name }
|
|
||||||
@{ $portType->get_operation() }
|
|
||||||
or die "operation not found:" . $operation->get_name();
|
|
||||||
|
|
||||||
no strict qw(refs);
|
|
||||||
$txt .= join q{},
|
|
||||||
map {
|
|
||||||
my $message = $port_operation->$_;
|
|
||||||
$message
|
|
||||||
? $message->to_typemap($opt)
|
|
||||||
: q{}
|
|
||||||
} qw(first_input first_output first_fault);
|
|
||||||
}
|
|
||||||
return $txt;
|
|
||||||
}
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
+256
-92
@@ -2,31 +2,86 @@ package SOAP::WSDL::Client;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Carp;
|
use Carp;
|
||||||
use Scalar::Util qw(blessed);
|
|
||||||
use SOAP::WSDL::Envelope;
|
|
||||||
use SOAP::Lite;
|
|
||||||
use Class::Std::Storable;
|
|
||||||
use SOAP::WSDL::Expat::MessageParser;
|
|
||||||
use SOAP::WSDL::SOAP::Typelib::Fault11;
|
|
||||||
|
|
||||||
# Package globals for speed...
|
use Class::Std::Fast::Storable;
|
||||||
my $PARSER;
|
use Scalar::Util qw(blessed);
|
||||||
my $MESSAGE_HANDLER;
|
|
||||||
|
use SOAP::WSDL::Factory::Deserializer;
|
||||||
|
use SOAP::WSDL::Factory::Serializer;
|
||||||
|
use SOAP::WSDL::Factory::Transport;
|
||||||
|
use SOAP::WSDL::Expat::MessageParser;
|
||||||
|
|
||||||
|
our $VERSION = '2.00_27';
|
||||||
|
|
||||||
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
|
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
|
||||||
my %no_dispatch_of :ATTR(:name<no_dispatch> :default<()>);
|
my %no_dispatch_of :ATTR(:name<no_dispatch> :default<()>);
|
||||||
my %outputxml_of :ATTR(:name<outputxml> :default<()>);
|
my %outputxml_of :ATTR(:name<outputxml> :default<()>);
|
||||||
my %proxy_of :ATTR(:name<proxy> :default<()>);
|
my %transport_of :ATTR(:name<transport> :default<()>);
|
||||||
|
my %endpoint_of :ATTR(:name<endpoint> :default<()>);
|
||||||
|
|
||||||
# TODO remove when preparing 2.01
|
my %soap_version_of :ATTR(:get<soap_version> :init_attr<soap_version> :default<'1.1'>);
|
||||||
sub outputtree { warn 'outputtree is deprecated and'
|
|
||||||
. 'will be removed before reaching v2.01 !' }
|
|
||||||
|
|
||||||
|
my %on_action_of :ATTR(:name<on_action> :default<()>);
|
||||||
|
my %content_type_of :ATTR(:name<content_type> :default<text/xml; charset=utf8>); #/#trick editors
|
||||||
|
my %serializer_of :ATTR(:name<serializer> :default<()>);
|
||||||
|
my %deserializer_of :ATTR(:name<deserializer> :default<()>);
|
||||||
|
|
||||||
|
sub BUILD {
|
||||||
|
my ($self, $ident, $attrs_of_ref) = @_;
|
||||||
|
|
||||||
|
if (exists $attrs_of_ref->{ proxy }) {
|
||||||
|
$self->set_proxy( $attrs_of_ref->{ proxy } );
|
||||||
|
delete $attrs_of_ref->{ proxy };
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_proxy { ## no critic RequireArgUnpacking
|
||||||
|
return $_[0]->get_transport();
|
||||||
|
}
|
||||||
|
|
||||||
|
sub set_proxy {
|
||||||
|
my ($self, @args_from) = @_;
|
||||||
|
my $ident = ${ $self };
|
||||||
|
|
||||||
|
# remember old value to return it later - Class::Std does so, too
|
||||||
|
my $old_value = $transport_of{ $ident };
|
||||||
|
|
||||||
|
# accept both list and list ref args
|
||||||
|
@args_from = @{ $args_from[0] } if ref $args_from[0];
|
||||||
|
|
||||||
|
# remember endpoint
|
||||||
|
$endpoint_of{ $ident } = $args_from[0];
|
||||||
|
|
||||||
|
# set transport - SOAP::Lite works similar...
|
||||||
|
$transport_of{ $ident } = SOAP::WSDL::Factory::Transport
|
||||||
|
->get_transport( @args_from );
|
||||||
|
|
||||||
|
return $old_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub set_soap_version {
|
||||||
|
my $ident = ident shift;
|
||||||
|
|
||||||
|
# remember old value to return it later - Class::Std does so, too
|
||||||
|
my $soap_version = $soap_version_of{ $ident };
|
||||||
|
|
||||||
|
# re-setting the soap version invalidates the
|
||||||
|
# serializer object
|
||||||
|
delete $serializer_of{ $ident };
|
||||||
|
delete $deserializer_of{ $ident };
|
||||||
|
|
||||||
|
$soap_version_of{ $ident } = shift;
|
||||||
|
|
||||||
|
return $soap_version;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Mimic SOAP::Lite's behaviour for getter/setter routines
|
||||||
SUBFACTORY: {
|
SUBFACTORY: {
|
||||||
no strict qw(refs);
|
|
||||||
for (qw(class_resolver no_dispatch outputxml proxy)) {
|
for (qw(class_resolver no_dispatch outputxml proxy)) {
|
||||||
my $setter = "set_$_";
|
my $setter = "set_$_";
|
||||||
my $getter = "get_$_";
|
my $getter = "get_$_";
|
||||||
|
no strict qw(refs); ## no critic ProhibitNoStrict
|
||||||
*{ $_ } = sub { my $self = shift;
|
*{ $_ } = sub { my $self = shift;
|
||||||
if (@_) {
|
if (@_) {
|
||||||
$self->$setter(@_);
|
$self->$setter(@_);
|
||||||
@@ -37,103 +92,182 @@ SUBFACTORY: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BEGIN {
|
|
||||||
$PARSER = SOAP::WSDL::Expat::MessageParser->new();
|
|
||||||
}
|
|
||||||
|
|
||||||
sub call {
|
sub call {
|
||||||
my $self = shift;
|
my ($self, $method, @data_from) = @_;
|
||||||
my $method = shift;
|
my $ident = ident $self;
|
||||||
my $data = ref $_[0] ? $_[0] : { @_ };
|
|
||||||
my $content = q{};
|
|
||||||
my ($envelope, $soap_action);
|
|
||||||
|
|
||||||
if (blessed $data
|
# the only valid idiom for calling a method with both a header and a body
|
||||||
&& $data->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType'))
|
# is
|
||||||
{
|
# ->call($method, $body_ref, $header_ref);
|
||||||
$envelope = SOAP::WSDL::Envelope->serialize( $method, $data );
|
#
|
||||||
# TODO replace by something derived from binding - this is just a
|
# These other idioms all assume an empty header:
|
||||||
# workaround...
|
# ->call($method, %body_of); # %body_of is a hash
|
||||||
$soap_action = join '/', $data->get_xmlns(), $method;
|
# ->call($method, $body); # $body is a scalar
|
||||||
}
|
my ($data, $header) = ref $data_from[0]
|
||||||
else {
|
? ($data_from[0], $data_from[1] )
|
||||||
$envelope = SOAP::WSDL::Envelope->serialize( $method, $data );
|
: (@data_from>1)
|
||||||
# $soap_action = $self->on_action( $method );
|
? ( { @data_from }, undef )
|
||||||
}
|
: ( $data_from[0], undef );
|
||||||
|
|
||||||
|
# get operation name and soap_action
|
||||||
|
my ($operation, $soap_action) = (ref $method eq 'HASH')
|
||||||
|
? ( $method->{ operation }, $method->{ soap_action } )
|
||||||
|
: (blessed $data
|
||||||
|
&& $data->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType'))
|
||||||
|
? ( $method , (join q{/}, $data->get_xmlns(), $method) )
|
||||||
|
: ( $method, q{} );
|
||||||
|
$serializer_of{ $ident } ||= SOAP::WSDL::Factory::Serializer->get_serializer({
|
||||||
|
soap_version => $self->get_soap_version(),
|
||||||
|
});
|
||||||
|
|
||||||
|
my $envelope = $serializer_of{ $ident }->serialize({
|
||||||
|
method => $operation,
|
||||||
|
body => $data,
|
||||||
|
header => $header,
|
||||||
|
});
|
||||||
|
|
||||||
return $envelope if $self->no_dispatch();
|
return $envelope if $self->no_dispatch();
|
||||||
|
|
||||||
# warn $envelope;
|
# always quote SOAPAction header.
|
||||||
|
# WS-I BP 1.0 R1109
|
||||||
|
if ($soap_action) {
|
||||||
|
$soap_action =~s{\A(:?"|')?}{"}xms;
|
||||||
|
$soap_action =~s{(:?"|')?\Z}{"}xms;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$soap_action = q{""};
|
||||||
|
}
|
||||||
|
|
||||||
# get response via transport layer
|
# get response via transport layer.
|
||||||
# TODO remove dependency from SOAP::Lite and use a
|
# Normally, SOAP::Lite's transport layer is used, though users
|
||||||
# SAX-based filter using XML::LibXML to get the
|
# may provide their own.
|
||||||
# result.
|
my $transport = $self->get_transport();
|
||||||
# Filter should have the following methods:
|
my $response = $transport->send_receive(
|
||||||
# - result: returns the result of the call (like SOAP::Lite, but as
|
endpoint => $self->get_endpoint(),
|
||||||
# perl data structure)
|
content_type => $content_type_of{ $ident },
|
||||||
# - header: returns the content of the SOAP header
|
envelope => $envelope,
|
||||||
# - fault: returns the result of the call if a SOAP fault is sent back
|
action => $soap_action,
|
||||||
# by the server. Retuns undef (nothing) if the call has been
|
# on_receive_chunk => sub {} # optional, may be used for parsing large responses as they arrive.
|
||||||
# processed without errors.
|
);
|
||||||
my $soap = SOAP::Lite->new()->proxy( $self->get_proxy() );
|
|
||||||
my $response = $soap->transport->send_receive(
|
|
||||||
context => $self, # this is provided for context
|
|
||||||
endpoint => $soap->endpoint(),
|
|
||||||
action => $soap_action, # SOAPAction, should be from binding
|
|
||||||
envelope => $envelope, # use custom content
|
|
||||||
);
|
|
||||||
|
|
||||||
# warn 'Received ' . length($response) . ' bytes of content';
|
return $response if ($outputxml_of{ $ident } );
|
||||||
return $response if ($self->outputxml() );
|
|
||||||
|
|
||||||
$PARSER->class_resolver( $self->get_class_resolver() );
|
# get deserializer
|
||||||
|
$deserializer_of{ $ident } ||= SOAP::WSDL::Factory::Deserializer->get_deserializer({
|
||||||
|
soap_version => $soap_version_of{ $ident },
|
||||||
|
});
|
||||||
|
|
||||||
|
# set class resolver if serializer supports it
|
||||||
|
$deserializer_of{ $ident }->set_class_resolver( $class_resolver_of{ $ident } )
|
||||||
|
if ( $deserializer_of{ $ident }->can('set_class_resolver') );
|
||||||
|
|
||||||
|
# Try deserializing response - there may be some,
|
||||||
|
# even if transport did not succeed (got a 500 response)
|
||||||
|
if ( $response ) {
|
||||||
|
my ($result_body, $result_header) = eval {
|
||||||
|
$deserializer_of{ $ident }->deserialize( $response );
|
||||||
|
};
|
||||||
|
if (not $@) {
|
||||||
|
return wantarray
|
||||||
|
? ($result_body, $result_header)
|
||||||
|
: $result_body;
|
||||||
|
}
|
||||||
|
return $deserializer_of{ $ident }->generate_fault({
|
||||||
|
code => 'soap:Server',
|
||||||
|
role => 'urn:localhost',
|
||||||
|
message => "Error deserializing message: $@. \n"
|
||||||
|
. "Message was: \n$response"
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
# if we had no success (Transport layer error status code)
|
# if we had no success (Transport layer error status code)
|
||||||
# or if transport layer failed
|
# or if transport layer failed
|
||||||
if (! $soap->transport->is_success() ) {
|
if ( ! $transport->is_success() ) {
|
||||||
# Try deserializing response - there may be some
|
|
||||||
if ($response) {
|
|
||||||
eval { $PARSER->parse( $response ); };
|
|
||||||
if ($@) {
|
|
||||||
warn "could not deserialize response: $@";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return $PARSER->get_data();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
require SOAP::WSDL::SOAP::Typelib::Fault11;
|
|
||||||
# generate & return fault if we cannot serialize response
|
# generate & return fault if we cannot serialize response
|
||||||
# or have none...
|
# or have none...
|
||||||
return SOAP::WSDL::SOAP::Typelib::Fault11->new({
|
return $deserializer_of{ $ident }->generate_fault({
|
||||||
faultcode => 'soap:Server',
|
code => 'soap:Server',
|
||||||
faultactor => 'urn:localhost',
|
role => 'urn:localhost',
|
||||||
faultstring => 'Error sending / receiving message: '
|
message => 'Error sending / receiving message: '
|
||||||
. $soap->transport->message()
|
. $transport->message()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
eval { $PARSER->parse( $response ) };
|
|
||||||
|
|
||||||
# return fault if we cannot deserialize response
|
|
||||||
if ($@) {
|
|
||||||
return SOAP::WSDL::SOAP::Typelib::Fault11->new({
|
|
||||||
faultcode => 'soap:Server',
|
|
||||||
faultactor => 'urn:localhost',
|
|
||||||
faultstring => "Error deserializing message: $@. \n"
|
|
||||||
. "Message was: \n$response"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return $PARSER->get_data();
|
|
||||||
} ## end sub call
|
} ## end sub call
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SOAP::WSDL::Client - SOAP::WSDL's SOAP Client
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use SOAP::WSDL::Client;
|
||||||
|
my $soap = SOAP::WSDL::Client->new({
|
||||||
|
proxy => 'http://www.example.org/webservice/test'
|
||||||
|
});
|
||||||
|
$soap->call( \%method, $body, $header);
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 call
|
||||||
|
|
||||||
|
$soap->call( \%method, \@parts );
|
||||||
|
|
||||||
|
%method is a hash with the following keys:
|
||||||
|
|
||||||
|
Name Description
|
||||||
|
----------------------------------------------------
|
||||||
|
operation operation name
|
||||||
|
soap_action SOAPAction HTTP header to use
|
||||||
|
style Operation style. One of (document|rpc)
|
||||||
|
use SOAP body encoding. One of (literal|encoded)
|
||||||
|
|
||||||
|
The style and use keys have no influence yet.
|
||||||
|
|
||||||
|
@parts is a list containing the elements of the message parts.
|
||||||
|
|
||||||
|
For backward compatibility, call may also be called as below:
|
||||||
|
|
||||||
|
$soap->call( $method, \@parts );
|
||||||
|
|
||||||
|
In this case, $method is the SOAP operation name, and the SOAPAction header
|
||||||
|
is guessed from the first part's namespace and the operation name (which is
|
||||||
|
mostly correct, but may fail). Operation style and body encoding are assumed to
|
||||||
|
be document/literal
|
||||||
|
|
||||||
|
=head2 Configuration methods
|
||||||
|
|
||||||
|
=head3 outputxml
|
||||||
|
|
||||||
|
$soap->outputxml(1);
|
||||||
|
|
||||||
|
When set, call() returns the raw XML of the SOAP Envelope.
|
||||||
|
|
||||||
|
=head3 set_content_type
|
||||||
|
|
||||||
|
$soap->set_content_type('application/xml; charset: utf8');
|
||||||
|
|
||||||
|
Sets the content type and character encoding.
|
||||||
|
|
||||||
|
You probably should not use a character encoding different from utf8:
|
||||||
|
SOAP::WSDL::Client will not convert the request into a different encoding
|
||||||
|
(yet).
|
||||||
|
|
||||||
|
To leave out the encoding, just set the content type without appendet charset
|
||||||
|
like in
|
||||||
|
|
||||||
|
text/xml
|
||||||
|
|
||||||
|
Default:
|
||||||
|
|
||||||
|
text/xml; charset: utf8
|
||||||
|
|
||||||
=head2 Features different from SOAP::Lite
|
=head2 Features different from SOAP::Lite
|
||||||
|
|
||||||
SOAP::WSDL does not aim to be a complete replacement for SOAP::Lite - the
|
SOAP::WSDL does not aim to be a complete replacement for SOAP::Lite - the
|
||||||
@@ -145,7 +279,7 @@ Nonetheless SOAP::WSDL mimics part of SOAP::Lite's API and behaviour,
|
|||||||
so SOAP::Lite users can switch without looking up every method call in the
|
so SOAP::Lite users can switch without looking up every method call in the
|
||||||
documentation.
|
documentation.
|
||||||
|
|
||||||
A few things are quite differentl from SOAP::Lite, though:
|
A few things are quite different from SOAP::Lite, though:
|
||||||
|
|
||||||
=head3 SOAP request data
|
=head3 SOAP request data
|
||||||
|
|
||||||
@@ -197,9 +331,39 @@ SOAP::WSDL::Client and implementing something like
|
|||||||
$soap_wsdl_client->call( mySoapMethod, @_);
|
$soap_wsdl_client->call( mySoapMethod, @_);
|
||||||
}
|
}
|
||||||
|
|
||||||
You may even do this in a class factory - SOAP::WSDL provides the methods
|
You may even do this in a class factory - see L<wsdl2perl.pl> for creating
|
||||||
for generating such interfaces.
|
such interfaces.
|
||||||
|
|
||||||
|
=head1 TROUBLESHOOTING
|
||||||
|
|
||||||
|
=head2 Accessing protected web services
|
||||||
|
|
||||||
|
Accessing protected web services is very specific for the transport
|
||||||
|
backend used.
|
||||||
|
|
||||||
|
In general, you may pass additional arguments to the set_proxy method (or
|
||||||
|
a list ref of the web service address and any additional arguments to the
|
||||||
|
new method's I<proxy> argument).
|
||||||
|
|
||||||
|
Refer to the appropriate transport module for documentation.
|
||||||
|
|
||||||
|
=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: 455 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: Client.pm 455 2007-12-14 15:50:16Z kutterma $
|
||||||
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,43 +2,69 @@ package SOAP::WSDL::Client::Base;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use base 'SOAP::WSDL::Client';
|
use base 'SOAP::WSDL::Client';
|
||||||
|
use Scalar::Util qw(blessed);
|
||||||
|
|
||||||
sub __create_new {
|
our $VERSION = '2.00_25';
|
||||||
my ($package, %args_of) = @_;
|
|
||||||
|
|
||||||
no strict qw(refs);
|
sub call {
|
||||||
|
my ($self, $method, $body, $header) = @_;
|
||||||
*{ "$package\::new" } = sub {
|
if (not blessed $body) {
|
||||||
my $class = shift;
|
$body = {} if not defined $body;
|
||||||
my $self = $class->SUPER::new({
|
$body = ref $body eq 'ARRAY' ? $body : [ $body ];
|
||||||
proxy => $args_of{ proxy },
|
my $index = 0;
|
||||||
class_resolver => $args_of{ class_resolver }
|
my @part_from;
|
||||||
});
|
foreach my $part (@{ $body }) {
|
||||||
bless $self, $class;
|
my $class = $method->{ body }->{ parts }->[$index];
|
||||||
return $self;
|
eval "require $class" || die $@;
|
||||||
}
|
push @part_from, $class->new($part);
|
||||||
|
$index++;
|
||||||
|
}
|
||||||
|
$body = $#part_from ? \@part_from : $part_from[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
# if we have a header
|
||||||
|
if (%{ $method->{ header } }) {
|
||||||
|
if (not blessed $header) {
|
||||||
|
my $class = $method->{ header }->{ parts }->[0];
|
||||||
|
eval "require $class" || die $@;
|
||||||
|
$header = $class->new($header);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $self->SUPER::call($method, $body, $header);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub __create_methods {
|
#sub __create_methods {
|
||||||
my ($package, %parts_of) = @_;
|
# my ($package, %info_of) = @_;
|
||||||
|
#
|
||||||
no strict qw(refs);
|
# no strict qw(refs);
|
||||||
|
# no warnings qw(redefine);
|
||||||
for my $method (keys %parts_of){
|
# for my $method (keys %info_of){
|
||||||
*{ "$package\::$method" } = sub {
|
# my ($soap_action, @parts);
|
||||||
my $self = shift;
|
#
|
||||||
my @param = map {
|
# # up to 2.00_10 we had list refs...
|
||||||
my $data = shift || {};
|
# if (ref $info_of{ $method }eq 'HASH') {
|
||||||
eval "require $_";
|
# @parts = @{ $info_of{ $method }->{ parts } };
|
||||||
$_->new( $data );
|
# $soap_action = $info_of{ $method }->{ soap_action };
|
||||||
} @{ $parts_of{ $method } };
|
# }
|
||||||
|
# else {
|
||||||
$self->call( $method, @param );
|
# die "Pre-v2.00_10 Interfaces are no longer supported. Please re-generate your interface.";
|
||||||
}
|
# }
|
||||||
}
|
#
|
||||||
|
# *{ "$package\::$method" } = sub {
|
||||||
}
|
# my $self = shift;
|
||||||
|
# my @param = map {
|
||||||
|
# my $data = shift || {};
|
||||||
|
# eval "require $_";
|
||||||
|
# $_->new( $data );
|
||||||
|
# } @parts;
|
||||||
|
#
|
||||||
|
# return $self->SUPER::call( {
|
||||||
|
# operation => $method,
|
||||||
|
# soap_action => $soap_action,
|
||||||
|
# }, @param );
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
#}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
@@ -48,13 +74,36 @@ __END__
|
|||||||
|
|
||||||
=head1 NAME
|
=head1 NAME
|
||||||
|
|
||||||
SOAP::WSDL::Client::Base - Base client for WSDL-based SOAP access
|
SOAP::WSDL::Client::Base - Factory class for WSDL-based SOAP access
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
package MySoapClient;
|
package MySoapInterface;
|
||||||
use SOAP::WSDL::Client::Base;
|
use SOAP::WSDL::Client::Base;
|
||||||
__PACKAGE__->__create_methods( qw(one two three) );
|
__PACKAGE__->__create_methods( qw(one two three) );
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Factory class for creating interface classes. Should probably be renamed to
|
||||||
|
SOAP::WSDL::Factory::Interface...
|
||||||
|
|
||||||
|
=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: 440 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: Base.pm 440 2007-12-04 22:24:33Z kutterma $
|
||||||
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
+18
-353
@@ -1,13 +1,16 @@
|
|||||||
package SOAP::WSDL::Definitions;
|
package SOAP::WSDL::Definitions;
|
||||||
|
use utf8;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Carp;
|
use Carp;
|
||||||
use File::Basename;
|
use File::Basename;
|
||||||
use File::Path;
|
use File::Path;
|
||||||
use List::Util qw(first);
|
use List::Util qw(first);
|
||||||
use Class::Std::Storable;
|
use Class::Std::Fast::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
|
our $VERSION='2.00_27';
|
||||||
|
|
||||||
my %types_of :ATTR(:name<types> :default<[]>);
|
my %types_of :ATTR(:name<types> :default<[]>);
|
||||||
my %message_of :ATTR(:name<message> :default<()>);
|
my %message_of :ATTR(:name<message> :default<()>);
|
||||||
my %portType_of :ATTR(:name<portType> :default<()>);
|
my %portType_of :ATTR(:name<portType> :default<()>);
|
||||||
@@ -15,7 +18,7 @@ my %binding_of :ATTR(:name<binding> :default<()>);
|
|||||||
my %service_of :ATTR(:name<service> :default<()>);
|
my %service_of :ATTR(:name<service> :default<()>);
|
||||||
my %namespace_of :ATTR(:name<namespace> :default<()>);
|
my %namespace_of :ATTR(:name<namespace> :default<()>);
|
||||||
|
|
||||||
# must be attr for Class::Std::Storable
|
# must be attr for Class::Std::Fast::Storable
|
||||||
my %attributes_of :ATTR();
|
my %attributes_of :ATTR();
|
||||||
%attributes_of = (
|
%attributes_of = (
|
||||||
binding => \%binding_of,
|
binding => \%binding_of,
|
||||||
@@ -27,229 +30,20 @@ my %attributes_of :ATTR();
|
|||||||
# Function factory - we could be writing this method for all %attribute
|
# Function factory - we could be writing this method for all %attribute
|
||||||
# keys, too, but that's just C&P (eehm, Copy & Paste...)
|
# keys, too, but that's just C&P (eehm, Copy & Paste...)
|
||||||
BLOCK: {
|
BLOCK: {
|
||||||
no strict qw/refs/;
|
|
||||||
foreach my $method(keys %attributes_of ) {
|
foreach my $method(keys %attributes_of ) {
|
||||||
|
no strict qw/refs/; ## no critic ProhibitNoStrict
|
||||||
*{ "find_$method" } = sub {
|
*{ "find_$method" } = sub {
|
||||||
my ($self, @args) = @_;
|
my ($self, @args_from) = @_;
|
||||||
|
@args_from = @{ $args_from[0] } if ref $args_from[0] eq 'ARRAY';
|
||||||
return first {
|
return first {
|
||||||
$_->get_targetNamespace() eq $args[0]
|
$_->get_targetNamespace() eq $args_from[0]
|
||||||
&& $_->get_name() eq $args[1]
|
&& $_->get_name() eq $args_from[1]
|
||||||
}
|
}
|
||||||
@{ $attributes_of{ $method }->{ ident $self } };
|
@{ $attributes_of{ $method }->{ ident $self } };
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub explain {
|
|
||||||
my $self = shift;
|
|
||||||
my $opt = shift;
|
|
||||||
$opt->{ wsdl } ||= $self;
|
|
||||||
$opt->{ namespace } ||= $self->get_xmlns() || {};
|
|
||||||
my $txt = '';
|
|
||||||
|
|
||||||
for my $service (@{ $self->get_service() }) {
|
|
||||||
$txt .= $service->explain( $opt );
|
|
||||||
$txt .= "\n";
|
|
||||||
}
|
|
||||||
return $txt;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub _expand {
|
|
||||||
my ($self, $prefix, $localname) = ($_[0], split /:/, $_[1]);
|
|
||||||
my %ns_map = reverse %{ $self->get_xmlns() };
|
|
||||||
return ($ns_map{ $prefix }, $localname);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub to_typemap {
|
|
||||||
my $self = shift;
|
|
||||||
my $opt = shift;
|
|
||||||
$opt->{ prefix } ||= q{};
|
|
||||||
$opt->{ wsdl } ||= $self;
|
|
||||||
$opt->{ type_prefix } ||= $opt->{ prefix };
|
|
||||||
$opt->{ element_prefix } ||= $opt->{ prefix };
|
|
||||||
return join "\n",
|
|
||||||
map { $_->to_typemap( $opt ) } @{ $service_of{ ident $self } };
|
|
||||||
}
|
|
||||||
|
|
||||||
sub create {
|
|
||||||
my $self = shift;
|
|
||||||
my $opt = shift;
|
|
||||||
|
|
||||||
my $base_path = $opt->{ base_path }
|
|
||||||
or croak "missing or empty argument base_path";
|
|
||||||
$opt->{ prefix } ||= q{};
|
|
||||||
$opt->{ type_prefix } ||= $opt->{ prefix };
|
|
||||||
$opt->{ element_prefix } ||= $opt->{ prefix };
|
|
||||||
$opt->{ typemap_prefix } or die 'Required argument typemap_prefix missing';
|
|
||||||
|
|
||||||
mkpath $base_path;
|
|
||||||
|
|
||||||
for my $service (@{ $service_of{ ident $self } }) {
|
|
||||||
warn "creating typemap $opt->{ typemap_prefix }". $service->get_name() . "\n";
|
|
||||||
$self->_create_typemap({ %{ $opt }, service => $service });
|
|
||||||
$self->_create_interface({ %{ $opt }, service => $service });
|
|
||||||
}
|
|
||||||
|
|
||||||
my @schema = @{ $self->first_types()->get_schema() };
|
|
||||||
for my $type (map { @{ $_->get_type() } , @{ $_->get_element() } } @schema[1..$#schema] ) {
|
|
||||||
warn 'creating class for '. $type->get_name() . "\n";
|
|
||||||
$type->to_class( { %$opt, wsdl => $self } );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub _create_interface {
|
|
||||||
my $self = shift;
|
|
||||||
my $opt = shift;
|
|
||||||
my $service_name = $opt->{ service }->get_name();
|
|
||||||
my $file_name = "$opt->{ base_path }/$opt->{ interface_prefix }/$service_name.pm";
|
|
||||||
$file_name =~s{::}{/}gms;
|
|
||||||
my $path = dirname $file_name;
|
|
||||||
my $name = basename $file_name;
|
|
||||||
my $binding = $self->find_binding( $self->_expand( $opt->{ service }->first_port()->get_binding() ) );
|
|
||||||
my $portType = $self->find_portType( $self->_expand( $binding->get_type() ) );
|
|
||||||
my $portType_operation_from_ref = $portType->get_operation();
|
|
||||||
my $operation_ref = $binding->get_operation();
|
|
||||||
$operation_ref = [ $operation_ref ] if ref $operation_ref ne 'ARRAY';
|
|
||||||
my %operations = map {
|
|
||||||
do {
|
|
||||||
my $operation_name = $_->get_name();
|
|
||||||
my $port_op = first { $_->get_name eq $operation_name } @{ $portType_operation_from_ref };
|
|
||||||
my $input = $port_op->first_input()->get_message();
|
|
||||||
my $message = $self->find_message( $self->_expand( $input ) );
|
|
||||||
my $parts = $message->get_part;
|
|
||||||
( $operation_name => [
|
|
||||||
map {
|
|
||||||
do {
|
|
||||||
my $name;
|
|
||||||
($name = $_->get_element())
|
|
||||||
? do {
|
|
||||||
my ($prefix, $localname) = split m{:}xms , $name;
|
|
||||||
"$opt->{ element_prefix }$localname";
|
|
||||||
}
|
|
||||||
: ($name = $_->get_type())
|
|
||||||
? do {
|
|
||||||
my ($prefix, $localname) = split m{:}xms , $name;
|
|
||||||
"$opt->{ type_prefix }$localname";
|
|
||||||
}
|
|
||||||
: ()
|
|
||||||
}
|
|
||||||
} @{ $parts }
|
|
||||||
] );
|
|
||||||
};
|
|
||||||
} @{ $operation_ref };
|
|
||||||
|
|
||||||
# use Data::Dumper;
|
|
||||||
# die Dumper \%operations;
|
|
||||||
|
|
||||||
my $template = <<'EOT';
|
|
||||||
package [% interface_prefix %][% service.get_name %];
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
use [% typemap_prefix %][% service.get_name %];
|
|
||||||
use base 'SOAP::WSDL::Client::Base';
|
|
||||||
|
|
||||||
sub new {
|
|
||||||
my $class = shift;
|
|
||||||
my $arg_ref = shift || {};
|
|
||||||
my $self = $class->SUPER::new({
|
|
||||||
class_resolver => '[% typemap_prefix %][% service.get_name %]',
|
|
||||||
proxy => '[% service.first_port.get_location %]',
|
|
||||||
%{ $arg_ref }
|
|
||||||
});
|
|
||||||
return bless $self, $class;
|
|
||||||
}
|
|
||||||
|
|
||||||
__PACKAGE__->__create_methods(
|
|
||||||
[% FOREACH name = operations.keys -%]
|
|
||||||
[% name %] => [ [% FOREACH class = operations.$name %]'[% class %]', [% END %]],
|
|
||||||
[% END %]
|
|
||||||
);
|
|
||||||
|
|
||||||
1;
|
|
||||||
|
|
||||||
__END__
|
|
||||||
|
|
||||||
=pod
|
|
||||||
|
|
||||||
=head1 NAME
|
|
||||||
|
|
||||||
[% interface_prefix %][% service.get_name %] - SOAP interface to [% service.get_name %] at
|
|
||||||
[% service.first_port.get_location %]
|
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
|
||||||
|
|
||||||
my $interface = [% interface_prefix %][% service.get_name %]->new();
|
|
||||||
my $[% operations.keys.1 %] = $interface->[% operations.keys.1 %]();
|
|
||||||
|
|
||||||
|
|
||||||
[% service.explain({ wsdl => wsdl }) %]
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
EOT
|
|
||||||
|
|
||||||
require Template;
|
|
||||||
my $tt = Template->new(
|
|
||||||
OUTPUT_PATH => $path,
|
|
||||||
);
|
|
||||||
$tt->process(\$template, { %{ $opt }, operations => \%operations, binding => $binding, wsdl => $self }, $name)
|
|
||||||
or die $tt->error();
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sub _create_typemap {
|
|
||||||
my $self = shift;
|
|
||||||
my $opt = shift;
|
|
||||||
my $service_name = $opt->{ service }->get_name();
|
|
||||||
my $file_name = "$opt->{ base_path }/$opt->{ typemap_prefix }/$service_name.pm";
|
|
||||||
$file_name =~s{::}{/}gms;
|
|
||||||
my $path = dirname $file_name;
|
|
||||||
my $name = basename $file_name;
|
|
||||||
|
|
||||||
my $typemap = $opt->{ service }->to_typemap( { %{ $opt }, wsdl => $self } );
|
|
||||||
|
|
||||||
my $template = <<'EOT';
|
|
||||||
package [% typemap_prefix %][% service.get_name %];
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
|
|
||||||
my %typemap = (
|
|
||||||
[% typemap %]
|
|
||||||
[% custom_types %]
|
|
||||||
);
|
|
||||||
|
|
||||||
sub get_class {
|
|
||||||
my $name = join '/', @{ $_[1] };
|
|
||||||
exists $typemap{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
|
|
||||||
return $typemap{ $name };
|
|
||||||
}
|
|
||||||
|
|
||||||
1;
|
|
||||||
|
|
||||||
__END__
|
|
||||||
|
|
||||||
EOT
|
|
||||||
|
|
||||||
require Template;
|
|
||||||
my $tt = Template->new(
|
|
||||||
OUTPUT_PATH => $path,
|
|
||||||
);
|
|
||||||
$tt->process(\$template, { %{ $opt }, typemap => $typemap }, $name)
|
|
||||||
or die $tt->error();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
sub listify {
|
|
||||||
my $data = shift;
|
|
||||||
return if not defined $data;
|
|
||||||
return [ $data ] if not ref $data;
|
|
||||||
return [ $data ] if not ref $data eq 'ARRAY';
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
@@ -311,143 +105,7 @@ Returns the message matching the namespace/localname pair passed as arguments.
|
|||||||
Accessors/Mutators for accessing / setting the E<gt>typesE<lt> child
|
Accessors/Mutators for accessing / setting the E<gt>typesE<lt> child
|
||||||
element(s).
|
element(s).
|
||||||
|
|
||||||
=head2 explain
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
Returns a POD string describing how to call the methods of the service(s)
|
|
||||||
described in the WSDL.
|
|
||||||
|
|
||||||
=head2 to_typemap
|
|
||||||
|
|
||||||
Creates a typemap for use with a generated type class library.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
|
|
||||||
NAME DESCRIPTION
|
|
||||||
-------------------------------------------------------------------------
|
|
||||||
prefix Prefix to use for all classes
|
|
||||||
type_prefix Prefix to use for all (Complex/Simple)Type classes
|
|
||||||
element_prefix Prefix to use for all Element classes (with atomic types)
|
|
||||||
|
|
||||||
As some webservices tend to use globally unique type definitions, but
|
|
||||||
locally unique elements with atomic types, type and element classes may
|
|
||||||
be separated by specifying type_prefix and element_prefix instead of
|
|
||||||
prefix.
|
|
||||||
|
|
||||||
The typemap is plain text which can be used as snipped for building a
|
|
||||||
SOAP::WSDL class_resolver perl class.
|
|
||||||
|
|
||||||
Try something like this for creating typemap classes:
|
|
||||||
|
|
||||||
my $parser = XML::LibXML->new();
|
|
||||||
my $handler = SOAP::WSDL::SAX::WSDLHandler->new()
|
|
||||||
$parser->set_handler( $handler );
|
|
||||||
|
|
||||||
$parser->parse_url('file:///path/to/wsdl');
|
|
||||||
|
|
||||||
my $wsdl = $handler->get_data();
|
|
||||||
my $typemap = $wsdl->to_typemap();
|
|
||||||
|
|
||||||
print <<"EOT"
|
|
||||||
package MyTypemap;
|
|
||||||
my \%typemap = (
|
|
||||||
$typemap
|
|
||||||
);
|
|
||||||
sub get_class { return \$typemap{\$_[1] } };
|
|
||||||
1;
|
|
||||||
"EOT"
|
|
||||||
|
|
||||||
=head2 create_interface
|
|
||||||
|
|
||||||
Creates a typemap class, classes for all types and elements, and interface
|
|
||||||
classes for every service.
|
|
||||||
|
|
||||||
See L<CODE GENERATOR|CODE GENERATOR> below.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
|
|
||||||
Name Description
|
|
||||||
----------------------------------------------------------------------------
|
|
||||||
prefix Prefix to use for types and elements. Should end with '::'.
|
|
||||||
element_prefix Prefix to use for element packages. Should end with '::'.
|
|
||||||
Must be specified if prefix is not given.
|
|
||||||
type_prefix Prefix to use for type packages. Should end with '::'.
|
|
||||||
Must be specified if prefix is not given.
|
|
||||||
typemap_prefix Prefix to use for type packages. Should end with '::'.
|
|
||||||
Mandatory.
|
|
||||||
custom_types A perl source code snippet defining custom types for the
|
|
||||||
class resolver (typemap).
|
|
||||||
Must look like this:
|
|
||||||
q{
|
|
||||||
'path/to/my/element' => 'My::Element',
|
|
||||||
'path/to/my/element/prop' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
'path/to/my/element/prop2' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
};
|
|
||||||
|
|
||||||
=head2 _expand
|
|
||||||
|
|
||||||
Expands a qualified name into a list consisting of namespace URI and
|
|
||||||
localname by using the definition's xmlns table.
|
|
||||||
|
|
||||||
Used internally by SOAP::WSDL::* classes.
|
|
||||||
|
|
||||||
=head1 CODE GENERATOR
|
|
||||||
|
|
||||||
TODO: move somewhere else - maybe SOAP::WSDL::Client ?
|
|
||||||
|
|
||||||
SOAP::WSDL::Definitions features a code generation facility for generating
|
|
||||||
perl classes (packages) from a WSDL definition.
|
|
||||||
|
|
||||||
The following classes are generated:
|
|
||||||
|
|
||||||
=over
|
|
||||||
|
|
||||||
=item * Typemaps
|
|
||||||
|
|
||||||
A typemap class is created for every service.
|
|
||||||
|
|
||||||
Typemaps are basically lookup classes. They allow the
|
|
||||||
SOAP::WSDL::SAX::MessageHandler to find out which class a XML element
|
|
||||||
in a SOAP message shoud be processed as.
|
|
||||||
|
|
||||||
Typemaps are passed to SOAP::WSDL::Client via the class_resolver
|
|
||||||
method.
|
|
||||||
|
|
||||||
=item * Interfaces
|
|
||||||
|
|
||||||
TODO: Implement Interface generation
|
|
||||||
|
|
||||||
Interface classes are just convenience shortcuts for accessing web
|
|
||||||
service methods. They define a method for every web service method,
|
|
||||||
dispatching the request to SOAP::WSDL::Client.
|
|
||||||
|
|
||||||
=item * Type and Element classes
|
|
||||||
|
|
||||||
For every top-level E<lt>elementE<gt>, E<lt>complexTypeE<gt> and
|
|
||||||
E<lt>simpleTypeE<gt> definition in the WSDL's schema, a perl class is
|
|
||||||
created.
|
|
||||||
|
|
||||||
Classes for E<lt>complexTypeE<gt> and E<lt>simpleTypeE<gt> definitions
|
|
||||||
are prefixed by the C<type_prefix> argument passed to
|
|
||||||
L<create_interface|create_interface>, classes for E<lt>elementE<gt>
|
|
||||||
definitions are prefixed by the C<element_prefix> passed to
|
|
||||||
L<create_interface|create_interface>. If the specific prefixes are not
|
|
||||||
specified, the C<prefix> argument is used instead.
|
|
||||||
|
|
||||||
If your web service is part of a bigger framework which defines types
|
|
||||||
globally, you probably do well always using the same C<type_prefix>:
|
|
||||||
This reduces the number of classes generated (provided types
|
|
||||||
are re-used by more than one service).
|
|
||||||
|
|
||||||
You probably should use different element prefixes, though -
|
|
||||||
E<lt>elementE<gt> definitions tend to be unique in the defining WSDL
|
|
||||||
only, especially when using document/literal style/encoding.
|
|
||||||
|
|
||||||
If not, you probably want to specify just C<prefix> (and use a
|
|
||||||
different one for every web service).
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
=head1 LICENSE
|
|
||||||
|
|
||||||
Copyright 2004-2007 Martin Kutter.
|
Copyright 2004-2007 Martin Kutter.
|
||||||
|
|
||||||
@@ -458,5 +116,12 @@ the same terms as perl itself
|
|||||||
|
|
||||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||||
|
|
||||||
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
|
$Rev: 477 $
|
||||||
|
$LastChangedBy: 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
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,160 @@
|
|||||||
|
package SOAP::WSDL::Deserializer::Hash;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable;
|
||||||
|
use SOAP::WSDL::SOAP::Typelib::Fault11;
|
||||||
|
use SOAP::WSDL::Expat::Message2Hash;
|
||||||
|
|
||||||
|
use SOAP::WSDL::Factory::Deserializer;
|
||||||
|
SOAP::WSDL::Factory::Deserializer->register( '1.1', __PACKAGE__ );
|
||||||
|
|
||||||
|
our $VERSION='2.00_25';
|
||||||
|
|
||||||
|
sub BUILD {
|
||||||
|
my ($self, $ident, $args_of_ref) = @_;
|
||||||
|
|
||||||
|
# ignore all options
|
||||||
|
for (keys %{ $args_of_ref }) {
|
||||||
|
delete $args_of_ref->{ $_ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub deserialize {
|
||||||
|
my ($self, $content) = @_;
|
||||||
|
|
||||||
|
my $parser = SOAP::WSDL::Expat::Message2Hash->new();
|
||||||
|
eval { $parser->parse_string( $content ) };
|
||||||
|
if ($@) {
|
||||||
|
die $self->generate_fault({
|
||||||
|
code => 'soap:Server',
|
||||||
|
role => 'urn:localhost',
|
||||||
|
message => "Error deserializing message: $@. \n"
|
||||||
|
. "Message was: \n$content"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return $parser->get_data();
|
||||||
|
}
|
||||||
|
|
||||||
|
sub generate_fault {
|
||||||
|
my ($self, $args_from_ref) = @_;
|
||||||
|
return SOAP::WSDL::SOAP::Typelib::Fault11->new({
|
||||||
|
faultcode => $args_from_ref->{ code } || 'soap:Client',
|
||||||
|
faultactor => $args_from_ref->{ role } || 'urn:localhost',
|
||||||
|
faultstring => $args_from_ref->{ message } || "Unknown error"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SOAP::WSDL::Deserializer::Hash - Deserializer SOAP messages into perl hash refs
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use SOAP::WSDL;
|
||||||
|
use SOAP::WSDL::Deserializer::Hash;
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Deserializer for creating perl hash refs as result of a SOAP call.
|
||||||
|
|
||||||
|
=head2 Output structure
|
||||||
|
|
||||||
|
The XML structure is converted into a perl data structure consisting of
|
||||||
|
hash and or list references. List references are used for holding array data.
|
||||||
|
|
||||||
|
SOAP::WSDL::Deserializer::Hash creates list references always at the maximum
|
||||||
|
depth possible.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
XML:
|
||||||
|
<MyDataArray>
|
||||||
|
<MyData>1</MyData>
|
||||||
|
<MyData>1</MyData>
|
||||||
|
</MyDataArray>
|
||||||
|
|
||||||
|
Perl:
|
||||||
|
{
|
||||||
|
MyDataArray => {
|
||||||
|
MyData => [ 1, 1 ]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
XML:
|
||||||
|
<DeepArray>
|
||||||
|
<MyData><int>1<int>/MyData>
|
||||||
|
<MyData><int>1<int>/MyData>
|
||||||
|
</DeepArray>
|
||||||
|
|
||||||
|
Perl:
|
||||||
|
{
|
||||||
|
MyDataArray => {
|
||||||
|
MyData => [
|
||||||
|
{ int => 1 },
|
||||||
|
{ int => 1 }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List reference creation is triggered by the second occurance of an element.
|
||||||
|
XML Array types with one element only will not be represented as list
|
||||||
|
references.
|
||||||
|
|
||||||
|
=head1 USAGE
|
||||||
|
|
||||||
|
All you need to do is to use SOAP::WSDL::Deserializer::Hash.
|
||||||
|
|
||||||
|
SOAP::WSDL::Deserializer::Hash autoregisters itself for SOAP1.1 messages
|
||||||
|
|
||||||
|
You may register SOAP::WSDLDeserializer::Hash for other SOAP Versions by
|
||||||
|
calling
|
||||||
|
|
||||||
|
SOAP::Factory::Deserializer->register('1.2',
|
||||||
|
SOAP::WSDL::Deserializer::Hash)
|
||||||
|
|
||||||
|
=head1 Limitations
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * Namespaces
|
||||||
|
|
||||||
|
All namespaces are ignored.
|
||||||
|
|
||||||
|
=item * XML attributes
|
||||||
|
|
||||||
|
All XML attributes are ignored.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Differences from other SOAP::WSDL::Deserializer classes
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * generate_fault
|
||||||
|
|
||||||
|
SOAP::WSDL::Deserializer::Hash will die with a SOAP::WSDL::Fault11 object when
|
||||||
|
a parse error appears
|
||||||
|
|
||||||
|
=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: 427 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: Hash.pm 427 2007-12-02 22:20:24Z kutterma $
|
||||||
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/Hash.pm $
|
||||||
|
|
||||||
|
=cut
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
package SOAP::WSDL::Deserializer::SOM;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
our $VERSION = '2.00_24';
|
||||||
|
our @ISA;
|
||||||
|
|
||||||
|
eval {
|
||||||
|
require SOAP::Lite;
|
||||||
|
push @ISA, 'SOAP::Deserializer';
|
||||||
|
}
|
||||||
|
or die "Cannot load SOAP::Lite.
|
||||||
|
Cannot deserialize to SOM object without SOAP::Lite.
|
||||||
|
Please install SOAP::Lite.";
|
||||||
|
|
||||||
|
sub generate_fault {
|
||||||
|
my ($self, $args_from_ref) = @_;
|
||||||
|
# code, message, detail, actor
|
||||||
|
die SOAP::Fault->new(
|
||||||
|
faultcode => $args_from_ref->{ code },
|
||||||
|
faultstring => $args_from_ref->{ message },
|
||||||
|
faultactor => $args_from_ref->{ role },
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SOAP::WSDL::Deserializer::SOM - Deserializer SOAP messages into SOM objects
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use SOAP::WSDL;
|
||||||
|
use SOAP::WSDL::Deserializer::SOM;
|
||||||
|
use SOAP::WSDL::Factory::Deserializer;
|
||||||
|
SOAP::WSDL::Factory::Deserializer->register( '1.1', __PACKAGE__ );
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Deserializer for creating SOAP::Lite's SOM object as result of a SOAP call.
|
||||||
|
|
||||||
|
This package is here for two reasons:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * Compatibility
|
||||||
|
|
||||||
|
You don't have to change the rest of your SOAP::Lite based app when switching
|
||||||
|
to SOAP::WSDL, but can just use SOAP::WSDL::Deserializer::SOM to get back the
|
||||||
|
same objects as you were used to.
|
||||||
|
|
||||||
|
=item * Completeness
|
||||||
|
|
||||||
|
SOAP::Lite covers much more of the SOAP specification than SOAP::WSDL.
|
||||||
|
|
||||||
|
SOAP::WSDL::Deserializer::SOM can be used for content which cannot be
|
||||||
|
deserialized by L<SOAP::WSDL::Deserializer::SOAP11|SOAP::WSDL::Deserializer::SOAP11>.
|
||||||
|
This may be XML including mixed content, attachements and other XML data not
|
||||||
|
(yet) handled by L<SOAP::WSDL::Deserializer::SOAP11|SOAP::WSDL::Deserializer::SOAP11>.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
SOAP::WSDL::Deserializer::SOM is a subclass of L<SOAP::Deserializer|SOAP::Deserializer>
|
||||||
|
from the L<SOAP::Lite|SOAP::Lite> package.
|
||||||
|
|
||||||
|
=head1 USAGE
|
||||||
|
|
||||||
|
SOAP::WSDL::Deserializer will not auroregister itself - to use it for a particular
|
||||||
|
SOAP version just use the following lines:
|
||||||
|
|
||||||
|
my $soap_version = '1.1'; # or '1.2', further versions may appear.
|
||||||
|
|
||||||
|
use SOAP::WSDL::Deserializer::SOM;
|
||||||
|
use SOAP::WSDL::Factory::Deserializer;
|
||||||
|
SOAP::WSDL::Factory::Deserializer->register( $soap_version, __PACKAGE__ );
|
||||||
|
|
||||||
|
=head1 DIFFERENCES FROM OTHER CLASSES
|
||||||
|
|
||||||
|
=head2 Differences from SOAP::Lite
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * No on_fault handler
|
||||||
|
|
||||||
|
You cannot specify what to do when an error occurs - SOAP::WSDL will die
|
||||||
|
with a SOAP::Fault object on transport errors.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Differences from other SOAP::WSDL::Deserializer classes
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * generate_fault
|
||||||
|
|
||||||
|
SOAP::WSDL::Deserializer::SOM will die with a SOAP::Fault object on calls
|
||||||
|
to generate_fault.
|
||||||
|
|
||||||
|
=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: 391 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: SOM.pm 391 2007-11-17 21:56:13Z kutterma $
|
||||||
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/SOM.pm $
|
||||||
|
|
||||||
|
=cut
|
||||||
@@ -0,0 +1,106 @@
|
|||||||
|
package SOAP::WSDL::Deserializer::XSD;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Fast::Storable;
|
||||||
|
use SOAP::WSDL::SOAP::Typelib::Fault11;
|
||||||
|
use SOAP::WSDL::Expat::MessageParser;
|
||||||
|
|
||||||
|
our $VERSION='2.00_25';
|
||||||
|
|
||||||
|
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
|
||||||
|
|
||||||
|
my %parser_of :ATTR();
|
||||||
|
|
||||||
|
sub BUILD {
|
||||||
|
my ($self, $ident, $args_of_ref) = @_;
|
||||||
|
|
||||||
|
# ignore all options except 'class_resolver'
|
||||||
|
for (keys %{ $args_of_ref }) {
|
||||||
|
delete $args_of_ref->{ $_ } if $_ ne 'class_resolver';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub deserialize {
|
||||||
|
my ($self, $content) = @_;
|
||||||
|
|
||||||
|
$parser_of{ ${ $self } } ||= SOAP::WSDL::Expat::MessageParser->new();
|
||||||
|
$parser_of{ ${ $self } }->class_resolver( $class_resolver_of{ ident $self } );
|
||||||
|
eval { $parser_of{ ${ $self } }->parse_string( $content ) };
|
||||||
|
if ($@) {
|
||||||
|
return $self->generate_fault({
|
||||||
|
code => 'soap:Server',
|
||||||
|
role => 'urn:localhost',
|
||||||
|
message => "Error deserializing message: $@. \n"
|
||||||
|
. "Message was: \n$content"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return ( $parser_of{ ${ $self } }->get_data(), $parser_of{ ${ $self } }->get_header() );
|
||||||
|
}
|
||||||
|
|
||||||
|
sub generate_fault {
|
||||||
|
my ($self, $args_from_ref) = @_;
|
||||||
|
return SOAP::WSDL::SOAP::Typelib::Fault11->new({
|
||||||
|
faultcode => $args_from_ref->{ code } || 'soap:Client',
|
||||||
|
faultactor => $args_from_ref->{ role } || 'urn:localhost',
|
||||||
|
faultstring => $args_from_ref->{ message } || "Unknown error"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SOAP::WSDL::Deserializer::XSD - Deserializer SOAP messages into SOAP::WSDL::XSD::Typelib:: objects
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Default deserializer for SOAP::WSDL::Client and interface classes generated by
|
||||||
|
SOAP::WSDL. Converts SOAP messages to SOAP::WSDL::XSD::Typlib:: based objects.
|
||||||
|
|
||||||
|
Needs a class_resolver typemap either passed by the generated interface
|
||||||
|
or user-provided.
|
||||||
|
|
||||||
|
SOAP::WSDL::Deserializer classes implement the API described in
|
||||||
|
L<SOAP::WSDL::Factory::Deserializer>.
|
||||||
|
|
||||||
|
=head1 USAGE
|
||||||
|
|
||||||
|
Usually you don't need to do anything to use this package - it's the default
|
||||||
|
deserializer for SOAP::WSDL::Client and interface classes generated by
|
||||||
|
SOAP::WSDL.
|
||||||
|
|
||||||
|
Is you want to use the XSD serializer from SOAP::WSDL, set the outputtree()
|
||||||
|
property and provide a class_resolver.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 deserialize
|
||||||
|
|
||||||
|
Deserializes the message.
|
||||||
|
|
||||||
|
=head2 generate_fault
|
||||||
|
|
||||||
|
Generates a L<SOAP::WSDL::SOAP::Typelib::Fault11|SOAP::WSDL::SOAP::Typelib::Fault11>
|
||||||
|
object and returns it.
|
||||||
|
|
||||||
|
=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: 427 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: XSD.pm 427 2007-12-02 22:20:24Z kutterma $
|
||||||
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/XSD.pm $
|
||||||
|
|
||||||
|
=cut
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
#!/usr/bin/perl -w
|
|
||||||
package SOAP::WSDL::Envelope;
|
|
||||||
use strict;
|
|
||||||
use base qw/SOAP::WSDL::Base/;
|
|
||||||
|
|
||||||
my $SOAP_NS = 'http://schemas.xmlsoap.org/soap/envelope/';
|
|
||||||
my $XML_INSTANCE_NS = 'http://www.w3.org/2001/XMLSchema-instance';
|
|
||||||
|
|
||||||
sub serialize {
|
|
||||||
my ($self, $name, $data, $opt) = @_;
|
|
||||||
|
|
||||||
if (not $opt->{ namespace }->{ $SOAP_NS })
|
|
||||||
{
|
|
||||||
$opt->{ namespace }->{ $SOAP_NS } = 'SOAP-ENV';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (not $opt->{ namespace }->{ $XML_INSTANCE_NS })
|
|
||||||
{
|
|
||||||
$opt->{ namespace }->{ $XML_INSTANCE_NS } = 'xsi';
|
|
||||||
}
|
|
||||||
|
|
||||||
my $soap_prefix = $opt->{ namespace }->{ $SOAP_NS };
|
|
||||||
|
|
||||||
# envelope start with namespaces
|
|
||||||
my $xml = "<$soap_prefix\:Envelope ";
|
|
||||||
|
|
||||||
while (my ($uri, $prefix) = each %{ $opt->{ namespace } })
|
|
||||||
{
|
|
||||||
$xml .= "\n\t" if ($opt->{'readable'});
|
|
||||||
$xml .= "xmlns:$prefix=\"$uri\" ";
|
|
||||||
}
|
|
||||||
|
|
||||||
# TODO insert encoding
|
|
||||||
$xml.='>';
|
|
||||||
$xml .= $self->serialize_header($name, $data, $opt);
|
|
||||||
$xml .= $self->serialize_body($name, $data, $opt);
|
|
||||||
$xml .= "\n" if ($opt->{ readable });
|
|
||||||
$xml .= '</' . $soap_prefix .':Envelope>';
|
|
||||||
$xml .= "\n" if ($opt->{ readable });
|
|
||||||
return $xml;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub serialize_header {
|
|
||||||
my $xml = '';
|
|
||||||
return $xml;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub serialize_body {
|
|
||||||
my $self = shift;
|
|
||||||
my $name = shift;
|
|
||||||
my $data = shift;
|
|
||||||
my $opt = shift;
|
|
||||||
|
|
||||||
my $soap_prefix = $opt->{ namespace }->{ $SOAP_NS };
|
|
||||||
|
|
||||||
my $xml = '';
|
|
||||||
$xml .= "\n" if ($opt->{ readable });
|
|
||||||
$xml .= "<$soap_prefix\:Body>";
|
|
||||||
$xml .= "\n" if ($opt->{ readable });
|
|
||||||
|
|
||||||
# include parts
|
|
||||||
$xml .= $data if ( defined($data) );
|
|
||||||
|
|
||||||
$xml .= "</$soap_prefix\:Body>";
|
|
||||||
return $xml;
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
package SOAP::WSDL::Expat::Base;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use XML::Parser::Expat;
|
||||||
|
|
||||||
|
our $VERSION = '2.00_27';
|
||||||
|
|
||||||
|
sub new {
|
||||||
|
my ($class, $args) = @_;
|
||||||
|
my $self = {};
|
||||||
|
bless $self, $class;
|
||||||
|
return $self;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub parse {
|
||||||
|
eval {
|
||||||
|
$_[0]->_initialize( XML::Parser::Expat->new( Namespaces => 1 ) )->parse( $_[1] );
|
||||||
|
$_[0]->{ parser }->release();
|
||||||
|
};
|
||||||
|
$_[0]->{ parser }->xpcroak( $@ ) if $@;
|
||||||
|
return $_[0]->{ data };
|
||||||
|
}
|
||||||
|
|
||||||
|
sub parsefile {
|
||||||
|
eval {
|
||||||
|
$_[0]->_initialize( XML::Parser::Expat->new(Namespaces => 1) )->parsefile( $_[1] );
|
||||||
|
$_[0]->{ parser }->release();
|
||||||
|
};
|
||||||
|
$_[0]->{ parser }->xpcroak( $@ ) if $@;
|
||||||
|
return $_[0]->{ data };
|
||||||
|
}
|
||||||
|
|
||||||
|
# SAX-like aliases
|
||||||
|
sub parse_string;
|
||||||
|
*parse_string = \&parse;
|
||||||
|
|
||||||
|
sub parse_file;
|
||||||
|
*parse_file = \&parsefile;
|
||||||
|
|
||||||
|
sub get_data {
|
||||||
|
return $_[0]->{ data };
|
||||||
|
}
|
||||||
|
|
||||||
|
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 $
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
package SOAP::WSDL::Expat::Message2Hash;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use base qw(SOAP::WSDL::Expat::Base);
|
||||||
|
|
||||||
|
our $VERSION = '2.00_27';
|
||||||
|
|
||||||
|
sub _initialize {
|
||||||
|
my ($self, $parser) = @_;
|
||||||
|
$self->{ parser } = $parser;
|
||||||
|
delete $self->{ data }; # remove potential old results
|
||||||
|
|
||||||
|
my $characters;
|
||||||
|
my $current = {};
|
||||||
|
my $list = []; # node list
|
||||||
|
my $current_part = q{}; # are we in header or body ?
|
||||||
|
$self->{ data } = $current;
|
||||||
|
|
||||||
|
# use "globals" for speed
|
||||||
|
my ($_element, $_method,
|
||||||
|
$_class, $_parser, %_attrs) = ();
|
||||||
|
|
||||||
|
no strict qw(refs);
|
||||||
|
$parser->setHandlers(
|
||||||
|
Start => sub {
|
||||||
|
push @$list, $current;
|
||||||
|
#If our element exists and is a list ref, add to it
|
||||||
|
if ( exists $current->{ $_[1] }
|
||||||
|
&& ( ref ($current->{ $_[1] }) eq 'ARRAY')
|
||||||
|
) {
|
||||||
|
push @{ $current->{ $_[1] } }, {};
|
||||||
|
$current = $current->{ $_[1] }->[-1];
|
||||||
|
}
|
||||||
|
elsif ( exists $current->{ $_[1] } )
|
||||||
|
{
|
||||||
|
$current->{ $_[1] } = [ $current->{ $_[1] }, {} ];
|
||||||
|
$current = $current->{ $_[1] }->[-1];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$current->{ $_[1] } = {};
|
||||||
|
$current = $current->{ $_[1] };
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
},
|
||||||
|
|
||||||
|
Char => sub {
|
||||||
|
$characters .= $_[1] if $_[1] !~m{ \A \s* \z}xms;
|
||||||
|
return;
|
||||||
|
},
|
||||||
|
|
||||||
|
End => sub {
|
||||||
|
$_element = $_[1];
|
||||||
|
|
||||||
|
# This one easily handles ignores for us, too...
|
||||||
|
# return if not ref $$list[-1];
|
||||||
|
|
||||||
|
if (length $characters) {
|
||||||
|
if (ref $list->[-1]->{ $_element } eq 'ARRAY') {
|
||||||
|
$list->[-1]->{ $_element }->[-1] = $characters ;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$list->[-1]->{ $_element } = $characters;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$characters = q{};
|
||||||
|
$current = pop @$list; # step up in object hierarchy...
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
return $parser;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SOAP::WSDL::Expat::Message2Hash - Convert SOAP messages to perl hash refs
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
my $parser = SOAP::WSDL::Expat::MessageParser->new({
|
||||||
|
class_resolver => 'My::Resolver'
|
||||||
|
});
|
||||||
|
$parser->parse( $xml );
|
||||||
|
my $obj = $parser->get_data();
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Real fast expat based SOAP message parser.
|
||||||
|
|
||||||
|
See L<SOAP::WSDL::Manual::Parser> for details.
|
||||||
|
|
||||||
|
=head1 Bugs and Limitations
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * Ignores all namespaces
|
||||||
|
|
||||||
|
=item * Ignores all attributes
|
||||||
|
|
||||||
|
=item * Does not handle mixed content
|
||||||
|
|
||||||
|
=item * The SOAP header is ignored
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Replace the whitespace by @ for E-Mail Address.
|
||||||
|
|
||||||
|
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||||
|
|
||||||
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
|
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 $
|
||||||
|
|
||||||
@@ -2,149 +2,239 @@
|
|||||||
package SOAP::WSDL::Expat::MessageParser;
|
package SOAP::WSDL::Expat::MessageParser;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
use Carp qw(croak confess);
|
||||||
|
|
||||||
|
our $VERSION = q{2.00_27};
|
||||||
|
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin;
|
use SOAP::WSDL::XSD::Typelib::Builtin;
|
||||||
use XML::Parser::Expat;
|
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
||||||
|
|
||||||
=pod
|
use base qw(SOAP::WSDL::Expat::Base);
|
||||||
|
|
||||||
=head2 new
|
require Class::Std::Fast;
|
||||||
|
my $OBJECT_CACHE_REF = Class::Std::Fast::OBJECT_CACHE_REF();
|
||||||
|
|
||||||
=over
|
my %LOADED_OF = ();
|
||||||
|
|
||||||
=item SYNOPSIS
|
|
||||||
|
|
||||||
my $obj = ->new();
|
|
||||||
|
|
||||||
=item DESCRIPTION
|
|
||||||
|
|
||||||
Constructor.
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
sub new {
|
sub new {
|
||||||
my $class = shift;
|
my ($class, $args) = @_;
|
||||||
my $args = shift;
|
|
||||||
my $self = {
|
my $self = {
|
||||||
class_resolver => $args->{ class_resolver }
|
class_resolver => $args->{ class_resolver },
|
||||||
|
strict => exists $args->{ strict } ? $args->{ strict } : 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
bless $self, $class;
|
bless $self, $class;
|
||||||
|
$self->load_classes() if ($args->{ class_resolver });
|
||||||
return $self;
|
return $self;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub class_resolver {
|
sub class_resolver {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
$self->{ class_resolver } = shift;
|
if (@_) {
|
||||||
|
$self->{ class_resolver } = shift;
|
||||||
|
$self->load_classes();
|
||||||
|
}
|
||||||
|
return $self->{ class_resolver };
|
||||||
}
|
}
|
||||||
|
|
||||||
sub parse {
|
sub load_classes {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $xml = shift;
|
|
||||||
$self->{ data } = undef;
|
return if $LOADED_OF{ $self->{ class_resolver } };
|
||||||
|
|
||||||
|
for (values %{ $self->{ class_resolver }->get_typemap }) {
|
||||||
|
no strict qw(refs);
|
||||||
|
my $class = $_;
|
||||||
|
|
||||||
|
# a bad test - do you know a better one?
|
||||||
|
next if $class eq '__SKIP__';
|
||||||
|
next if defined *{ "$class\::" }; # check if namespace exists
|
||||||
|
|
||||||
|
$class =~s{ :: }{/}xmsg;
|
||||||
|
$class .= '.pm';
|
||||||
|
require $class;
|
||||||
|
}
|
||||||
|
$LOADED_OF{ $self->{ class_resolver } } = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _initialize {
|
||||||
|
my ($self, $parser) = @_;
|
||||||
|
$self->{ parser } = $parser;
|
||||||
|
|
||||||
|
delete $self->{ data }; # remove potential old results
|
||||||
|
delete $self->{ header };
|
||||||
|
|
||||||
my $characters;
|
my $characters;
|
||||||
my $current = '__STOP__';
|
|
||||||
my $ignore = [ 'Envelope', 'Body' ];
|
# Note: $current MUST be undef - it is used as sentinel
|
||||||
my $list = [];
|
# on the object stack via if (! defined $list->[-1])
|
||||||
my $namespace = {};
|
# DON'T set it to anything else !
|
||||||
my $path = [];
|
my $current = undef;
|
||||||
my $parser = XML::Parser::Expat->new();
|
my $list = []; # node list (object stack)
|
||||||
|
|
||||||
|
my $path = []; # current path
|
||||||
|
my $skip = 0; # skip elements
|
||||||
|
my $depth = 0;
|
||||||
|
|
||||||
|
my %content_check = $self->{strict}
|
||||||
|
? (
|
||||||
|
0 => sub {
|
||||||
|
die "Bad top node $_[1]" if $_[1] ne 'Envelope';
|
||||||
|
die "Bad namespace for SOAP envelope: " . $_[0]->recognized_string()
|
||||||
|
if $_[0]->namespace($_[1]) ne 'http://schemas.xmlsoap.org/soap/envelope/';
|
||||||
|
$depth++;
|
||||||
|
return;
|
||||||
|
},
|
||||||
|
1 => sub {
|
||||||
|
$depth++;
|
||||||
|
if ($_[1] eq 'Body') {
|
||||||
|
if (exists $self->{ data }) { # there was header data
|
||||||
|
$self->{ header } = $self->{ data };
|
||||||
|
delete $self->{ data };
|
||||||
|
$list = [];
|
||||||
|
$path = [];
|
||||||
|
undef $current;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
: ();
|
||||||
|
|
||||||
|
# use "globals" for speed
|
||||||
|
my ($_prefix, $_method,
|
||||||
|
$_class, $_leaf) = ();
|
||||||
|
|
||||||
|
my $char_handler = sub {
|
||||||
|
return if (!$_leaf); # we only want characters in leaf nodes
|
||||||
|
|
||||||
|
$characters .= $_[1];
|
||||||
|
# if $_[1] =~m{ [^\s] }xms;
|
||||||
|
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
no strict qw(refs);
|
no strict qw(refs);
|
||||||
$parser->setHandlers(
|
$parser->setHandlers(
|
||||||
Start => sub {
|
Start => sub {
|
||||||
my ($parser, $element, %attrs) = @_;
|
# my ($parser, $element, %attrs) = @_;
|
||||||
my ($prefix, $localname) = split m{:}xms , $element;
|
|
||||||
# for non-prefixed elements
|
$_leaf = 1; # believe we're a leaf node until we see an end
|
||||||
if (not $localname) {
|
|
||||||
$localname = $element;
|
# call methods without using their parameter stack
|
||||||
$prefix = q{};
|
# That's slightly faster than $content_check{ $depth }->()
|
||||||
}
|
# and we don't have to pass $_[1] to the method.
|
||||||
# ignore top level elements
|
# Yup, that's dirty.
|
||||||
if (@{ $ignore } && $localname eq $ignore->[0]) {
|
return &{$content_check{ $depth }}
|
||||||
shift @{ $ignore };
|
if exists $content_check{ $depth };
|
||||||
|
|
||||||
|
push @{ $path }, $_[1]; # step down in path
|
||||||
|
return if $skip; # skip inside __SKIP__
|
||||||
|
|
||||||
|
# resolve class of this element
|
||||||
|
$_class = $self->{ class_resolver }->get_class( $path )
|
||||||
|
or die "Cannot resolve class for "
|
||||||
|
. join('/', @{ $path }) . " via " . $self->{ class_resolver };
|
||||||
|
|
||||||
|
if ($_class eq '__SKIP__') {
|
||||||
|
$skip = join('/', @{ $path });
|
||||||
|
$_[0]->setHandlers( Char => undef );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# step down in tree (remember current)
|
||||||
|
#
|
||||||
|
# on the first object (after skipping Envelope/Body), $current
|
||||||
|
# is undef.
|
||||||
|
# We put it on the stack, anyway, and use it as sentinel when
|
||||||
|
# going through the closing tags in the End handler
|
||||||
|
#
|
||||||
|
push @$list, $current;
|
||||||
|
|
||||||
|
# cleanup. Mainly here to help profilers find the real hot spots
|
||||||
|
undef $current;
|
||||||
|
|
||||||
|
# cleanup
|
||||||
|
$characters = q{};
|
||||||
|
|
||||||
|
# Create and set new objects using Class::Std::Fast's object cache
|
||||||
|
# if possible, or blessing directly into the class in question
|
||||||
|
# (circumventing constructor) here.
|
||||||
|
# That's dirty, but fast.
|
||||||
|
#
|
||||||
|
# The alternative would read:
|
||||||
|
# $current = $_class->new({ @_[2..$#_] });
|
||||||
|
#
|
||||||
|
$current = pop @{ $OBJECT_CACHE_REF->{ $_class } };
|
||||||
|
if (not defined $current) {
|
||||||
|
my $o = Class::Std::Fast::ID();
|
||||||
|
$current = bless \$o, $_class;
|
||||||
|
}
|
||||||
|
|
||||||
|
$current->attr({ @_[2..$#_] }) if (@_ > 2);
|
||||||
|
|
||||||
|
$depth++;
|
||||||
|
return;
|
||||||
|
},
|
||||||
|
|
||||||
|
Char => $char_handler,
|
||||||
|
|
||||||
|
End => sub {
|
||||||
|
|
||||||
|
pop @{ $path }; # step up in path
|
||||||
|
|
||||||
|
# check __SKIP__
|
||||||
|
if ($skip) {
|
||||||
|
return if $skip ne join '/', @{ $path }, $_[1];
|
||||||
|
$skip = 0;
|
||||||
|
$_[0]->setHandlers( Char => $char_handler );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$depth--;
|
||||||
|
|
||||||
|
# return if there's only one elment - can't set it in parent ;-)
|
||||||
|
# but set as root element if we don't have one already.
|
||||||
|
if (not defined $list->[-1]) {
|
||||||
|
$self->{ data } = $current if (not exists $self->{ data });
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
# we only set character values in leaf nodes
|
||||||
|
if ($_leaf) {
|
||||||
|
# Use dirty but fast access via global variables.
|
||||||
|
#
|
||||||
|
# The normal way (via method) would be this:
|
||||||
|
#
|
||||||
|
# $current->set_value( $characters ) if (length($characters));
|
||||||
|
#
|
||||||
|
$SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType::___value
|
||||||
|
->{ $$current } = $characters if $characters =~m{ [^\s] }xms;
|
||||||
|
}
|
||||||
|
|
||||||
# empty characters
|
# empty characters
|
||||||
$characters = q{};
|
$characters = q{};
|
||||||
|
|
||||||
push @{ $path }, $localname; # step down...
|
|
||||||
push @{ $list }, $current; # remember current
|
|
||||||
|
|
||||||
# resolve class of this element
|
|
||||||
my $class = $self->{ class_resolver }->get_class( $path )
|
|
||||||
or die "Cannot resolve class for "
|
|
||||||
. join('/', @{ $path }) . " via $self->{ class_resolver }";
|
|
||||||
|
|
||||||
# Check whether we have a primitive - we implement them as classes
|
|
||||||
# TODO replace with UNIVERSAL->isa()
|
|
||||||
# match is a bit faster if the string does not match, but WAY slower
|
|
||||||
# if $class matches...
|
|
||||||
# if (not $class=~m{^SOAP::WSDL::XSD::Typelib::Builtin}xms) {
|
|
||||||
|
|
||||||
if (index $class, 'SOAP::WSDL::XSD::Typelib::Builtin', 0 < 0) {
|
|
||||||
|
|
||||||
# check wheter there is a CODE reference for $class::new.
|
|
||||||
# If not, require it - all classes required here MUST
|
|
||||||
# define new()
|
|
||||||
# This is the same as $class->can('new'), but it's way faster
|
|
||||||
*{ "$class\::new" }{ CODE }
|
|
||||||
or eval "require $class" ## no critic qw(ProhibitStringyEval)
|
|
||||||
or die $@;
|
|
||||||
}
|
|
||||||
# create object
|
|
||||||
# set current object
|
|
||||||
$current = $class->new({ %attrs });
|
|
||||||
|
|
||||||
# remember top level element
|
|
||||||
defined $self->{ data }
|
|
||||||
or ($self->{ data } = $current);
|
|
||||||
},
|
|
||||||
Char => sub {
|
|
||||||
$characters .= $_[1];
|
|
||||||
},
|
|
||||||
End => sub {
|
|
||||||
my $element = $_[1];
|
|
||||||
|
|
||||||
my ($prefix, $localname) = split m{:}xms , $element;
|
|
||||||
# for non-prefixed elements
|
|
||||||
if (not $localname) {
|
|
||||||
$localname = $element;
|
|
||||||
$prefix = q{};
|
|
||||||
}
|
|
||||||
|
|
||||||
# This one easily handles ignores for us, too...
|
|
||||||
return if not ref $list->[-1];
|
|
||||||
|
|
||||||
if ( $current
|
|
||||||
->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType') ) {
|
|
||||||
$current->set_value( $characters );
|
|
||||||
}
|
|
||||||
|
|
||||||
# set appropriate attribute in last element
|
# set appropriate attribute in last element
|
||||||
# multiple values must be implemented in base class
|
# multiple values must be implemented in base class
|
||||||
my $method = "add_$localname";
|
# $_method = "add_$_localname";
|
||||||
|
$_method = "add_$_[1]";
|
||||||
|
$list->[-1]->$_method( $current );
|
||||||
|
|
||||||
$list->[-1]->$method( $current );
|
$current = pop @$list; # step up in object hierarchy
|
||||||
|
|
||||||
# step up in path
|
$_leaf = 0; # stop believing we're a leaf node
|
||||||
pop @{ $path };
|
|
||||||
|
|
||||||
# step up in object hierarchy...
|
return;
|
||||||
$current = pop @{ $list };
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
return $parser;
|
||||||
$parser->parse( $xml );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub get_data {
|
sub get_header {
|
||||||
my $self = shift;
|
return $_[0]->{ header };
|
||||||
return $self->{ data };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
@@ -165,7 +255,15 @@ SOAP::WSDL::Expat::MessageParser - Convert SOAP messages to custom object trees
|
|||||||
|
|
||||||
Real fast expat based SOAP message parser.
|
Real fast expat based SOAP message parser.
|
||||||
|
|
||||||
See L<SOAP::WSDL::Parser> for details.
|
See L<SOAP::WSDL::Manual::Parser> for details.
|
||||||
|
|
||||||
|
=head2 Skipping unwanted items
|
||||||
|
|
||||||
|
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
|
||||||
|
child elements you want to skip.
|
||||||
|
|
||||||
=head1 Bugs and Limitations
|
=head1 Bugs and Limitations
|
||||||
|
|
||||||
@@ -185,17 +283,20 @@ Replace the whitespace by @ for E-Mail Address.
|
|||||||
|
|
||||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||||
|
|
||||||
=head1 COPYING
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
This module may be used under the same terms as perl itself.
|
Copyright 2004-2007 Martin Kutter.
|
||||||
|
|
||||||
|
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||||
|
the same terms as perl itself
|
||||||
|
|
||||||
=head1 Repository information
|
=head1 Repository information
|
||||||
|
|
||||||
$ID: $
|
$Id: $
|
||||||
|
|
||||||
$LastChangedDate: $
|
$LastChangedDate: 2008-01-19 13:57:57 +0100 (Sa, 19 Jan 2008) $
|
||||||
$LastChangedRevision: $
|
$LastChangedRevision: 497 $
|
||||||
$LastChangedBy: $
|
$LastChangedBy: kutterma $
|
||||||
|
|
||||||
$HeadURL: $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $
|
||||||
|
|
||||||
|
|||||||
@@ -2,148 +2,28 @@
|
|||||||
package SOAP::WSDL::Expat::MessageStreamParser;
|
package SOAP::WSDL::Expat::MessageStreamParser;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin;
|
|
||||||
use XML::Parser::Expat;
|
use XML::Parser::Expat;
|
||||||
|
use SOAP::WSDL::Expat::MessageParser;
|
||||||
|
use base qw(SOAP::WSDL::Expat::MessageParser);
|
||||||
|
|
||||||
=pod
|
our $VERSION = '2.00_24';
|
||||||
|
|
||||||
=head2 new
|
sub parse_start {
|
||||||
|
|
||||||
=over
|
|
||||||
|
|
||||||
=item SYNOPSIS
|
|
||||||
|
|
||||||
my $obj = ->new();
|
|
||||||
|
|
||||||
=item DESCRIPTION
|
|
||||||
|
|
||||||
Constructor.
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
sub new {
|
|
||||||
my $class = shift;
|
|
||||||
my $self = {
|
|
||||||
class_resolver => shift->{ class_resolver }
|
|
||||||
};
|
|
||||||
bless $self, $class;
|
|
||||||
return $self;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub class_resolver {
|
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
$self->{ class_resolver } = shift;
|
$self->{ parser } = $_[0]->_initialize( XML::Parser::ExpatNB->new( Namespaces => 1 ) );
|
||||||
|
}
|
||||||
|
sub init;
|
||||||
|
*init = \&parse_start;
|
||||||
|
|
||||||
|
sub parse_more {
|
||||||
|
$_[0]->{ parser }->parse_more( $_[1] );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub init {
|
sub parse_done {
|
||||||
my $self = shift;
|
$_[0]->{ parser }->parse_done();
|
||||||
my $xml = shift;
|
$_[0]->{ parser }->release();
|
||||||
$self->{ data } = undef;
|
|
||||||
|
|
||||||
my $characters;
|
|
||||||
my $current = '__STOP__';
|
|
||||||
my $ignore = [ 'Envelope', 'Body' ];
|
|
||||||
my $list = [];
|
|
||||||
my $namespace = {};
|
|
||||||
my $path = [];
|
|
||||||
my $parser = XML::Parser::ExpatNB->new();
|
|
||||||
|
|
||||||
no strict qw(refs);
|
|
||||||
$parser->setHandlers(
|
|
||||||
Start => sub {
|
|
||||||
my ($parser, $element, %attrs) = @_;
|
|
||||||
my ($prefix, $localname) = split m{:}xms , $element;
|
|
||||||
# for non-prefixed elements
|
|
||||||
if (not $localname) {
|
|
||||||
$localname = $element;
|
|
||||||
$prefix = q{};
|
|
||||||
}
|
|
||||||
# ignore top level elements
|
|
||||||
if (@{ $ignore } && $localname eq $ignore->[0]) {
|
|
||||||
shift @{ $ignore };
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
# empty characters
|
|
||||||
$characters = q{};
|
|
||||||
|
|
||||||
push @{ $path }, $localname; # step down...
|
|
||||||
push @{ $list }, $current; # remember current
|
|
||||||
|
|
||||||
# resolve class of this element
|
|
||||||
my $class = $self->{ class_resolver }->get_class( $path )
|
|
||||||
or die "Cannot resolve class for "
|
|
||||||
. join('/', @{ $path }) . " via $self->{ class_resolver }";
|
|
||||||
|
|
||||||
# Check whether we have a primitive - we implement them as classes
|
|
||||||
# TODO replace with UNIVERSAL->isa()
|
|
||||||
# match is a bit faster if the string does not match, but WAY slower
|
|
||||||
# if $class matches...
|
|
||||||
# if (not $class=~m{^SOAP::WSDL::XSD::Typelib::Builtin}xms) {
|
|
||||||
|
|
||||||
if (index $class, 'SOAP::WSDL::XSD::Typelib::Builtin', 0 < 0) {
|
|
||||||
|
|
||||||
# check wheter there is a CODE reference for $class::new.
|
|
||||||
# If not, require it - all classes required here MUST
|
|
||||||
# define new()
|
|
||||||
# This is the same as $class->can('new'), but it's way faster
|
|
||||||
*{ "$class\::new" }{ CODE }
|
|
||||||
or eval "require $class" ## no critic qw(ProhibitStringyEval)
|
|
||||||
or die $@;
|
|
||||||
}
|
|
||||||
# create object
|
|
||||||
# set current object
|
|
||||||
$current = $class->new({ %attrs });
|
|
||||||
|
|
||||||
# remember top level element
|
|
||||||
defined $self->{ data }
|
|
||||||
or ($self->{ data } = $current);
|
|
||||||
},
|
|
||||||
Char => sub {
|
|
||||||
$characters .= $_[1];
|
|
||||||
},
|
|
||||||
End => sub {
|
|
||||||
my $element = $_[1];
|
|
||||||
|
|
||||||
my ($prefix, $localname) = split m{:}xms , $element;
|
|
||||||
# for non-prefixed elements
|
|
||||||
if (not $localname) {
|
|
||||||
$localname = $element;
|
|
||||||
$prefix = q{};
|
|
||||||
}
|
|
||||||
|
|
||||||
# This one easily handles ignores for us, too...
|
|
||||||
return if not ref $list->[-1];
|
|
||||||
|
|
||||||
if ( $current
|
|
||||||
->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType') ) {
|
|
||||||
$current->set_value( $characters );
|
|
||||||
}
|
|
||||||
|
|
||||||
# set appropriate attribute in last element
|
|
||||||
# multiple values must be implemented in base class
|
|
||||||
my $method = "add_$localname";
|
|
||||||
|
|
||||||
$list->[-1]->$method( $current );
|
|
||||||
|
|
||||||
# step up in path
|
|
||||||
pop @{ $path };
|
|
||||||
|
|
||||||
# step up in object hierarchy...
|
|
||||||
$current = pop @{ $list };
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
return $parser;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub get_data {
|
|
||||||
my $self = shift;
|
|
||||||
return $self->{ data };
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
@@ -170,37 +50,28 @@ SOAP::WSDL::Expat::MessageStreamParser - Convert SOAP messages to custom object
|
|||||||
|
|
||||||
ExpatNB based parser for parsing huge documents.
|
ExpatNB based parser for parsing huge documents.
|
||||||
|
|
||||||
See L<SOAP::WSDL::Parser> for details.
|
See L<SOAP::WSDL::Manual::Parser> for details.
|
||||||
|
|
||||||
=head1 Bugs and Limitations
|
=head1 Bugs and Limitations
|
||||||
|
|
||||||
=over
|
See SOAP::WSDL::Expat::MessageParser
|
||||||
|
|
||||||
=item * Ignores all namespaces
|
|
||||||
|
|
||||||
=item * Does not handle mixed content
|
|
||||||
|
|
||||||
=item * The SOAP header is ignored
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
=head1 AUTHOR
|
=head1 AUTHOR
|
||||||
|
|
||||||
Replace the whitespace by @ for E-Mail Address.
|
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||||
|
|
||||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
=head1 COPYING
|
Copyright 2007 Martin Kutter.
|
||||||
|
|
||||||
This module may be used 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 Repository information
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$ID: $
|
$Rev: 477 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
$LastChangedDate: $
|
$Id: MessageStreamParser.pm 477 2007-12-24 10:23:52Z kutterma $
|
||||||
$LastChangedRevision: $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageStreamParser.pm $
|
||||||
$LastChangedBy: $
|
|
||||||
|
|
||||||
$HeadURL: $
|
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|||||||
@@ -0,0 +1,187 @@
|
|||||||
|
package SOAP::WSDL::Expat::WSDLParser;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Carp;
|
||||||
|
use SOAP::WSDL::TypeLookup;
|
||||||
|
use base qw(SOAP::WSDL::Expat::Base);
|
||||||
|
|
||||||
|
our $VERSION = q{2.00_29};
|
||||||
|
|
||||||
|
sub _initialize {
|
||||||
|
my ($self, $parser) = @_;
|
||||||
|
|
||||||
|
# init object data
|
||||||
|
$self->{ parser } = $parser;
|
||||||
|
delete $self->{ data };
|
||||||
|
|
||||||
|
# setup local variables for keeping temp data
|
||||||
|
my $characters = undef;
|
||||||
|
my $current = undef;
|
||||||
|
my $list = []; # node list
|
||||||
|
|
||||||
|
# TODO skip non-XML Schema namespace tags
|
||||||
|
$parser->setHandlers(
|
||||||
|
Start => sub {
|
||||||
|
my ($parser, $localname, %attrs) = @_;
|
||||||
|
$characters = q{};
|
||||||
|
|
||||||
|
my $action = SOAP::WSDL::TypeLookup->lookup(
|
||||||
|
$parser->namespace($localname),
|
||||||
|
$localname
|
||||||
|
);
|
||||||
|
|
||||||
|
return if not $action;
|
||||||
|
|
||||||
|
if ($action->{ type } eq 'CLASS') {
|
||||||
|
eval "require $action->{ class }";
|
||||||
|
croak $@ if ($@);
|
||||||
|
|
||||||
|
my $obj = $action->{ class }->new({ parent => $current,
|
||||||
|
xmlns => { '#default' => $parser->namespace($localname) }
|
||||||
|
})
|
||||||
|
->init( _fixup_attrs( $parser, %attrs ) );
|
||||||
|
|
||||||
|
if ($current) {
|
||||||
|
# inherit namespace, but don't override
|
||||||
|
$obj->set_targetNamespace( $current->get_targetNamespace() )
|
||||||
|
if not $obj->get_targetNamespace();
|
||||||
|
|
||||||
|
# push on parent's element/type list
|
||||||
|
my $method = "push_$localname";
|
||||||
|
|
||||||
|
no strict qw(refs);
|
||||||
|
$current->$method( $obj );
|
||||||
|
|
||||||
|
# remember element for stepping back
|
||||||
|
push @{ $list }, $current;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$self->{ data } = $obj;
|
||||||
|
}
|
||||||
|
# set new element (step down)
|
||||||
|
$current = $obj;
|
||||||
|
}
|
||||||
|
elsif ($action->{ type } eq 'PARENT') {
|
||||||
|
$current->init( _fixup_attrs($parser, %attrs) );
|
||||||
|
}
|
||||||
|
elsif ($action->{ type } eq 'METHOD') {
|
||||||
|
my $method = $action->{ method };
|
||||||
|
|
||||||
|
no strict qw(refs);
|
||||||
|
# call method with
|
||||||
|
# - default value ($action->{ value } if defined,
|
||||||
|
# dereferencing lists
|
||||||
|
# - the values of the elements Attributes hash
|
||||||
|
# TODO: add namespaces declared to attributes.
|
||||||
|
# Expat consumes them, so we have to re-add them here.
|
||||||
|
$current->$method( defined $action->{ value }
|
||||||
|
? ref $action->{ value }
|
||||||
|
? @{ $action->{ value } }
|
||||||
|
: ($action->{ value })
|
||||||
|
: _fixup_attrs($parser, %attrs)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
},
|
||||||
|
|
||||||
|
Char => sub { $characters .= $_[1]; return; },
|
||||||
|
|
||||||
|
End => sub {
|
||||||
|
my ($parser, $localname) = @_;
|
||||||
|
|
||||||
|
my $action = SOAP::WSDL::TypeLookup->lookup(
|
||||||
|
$parser->namespace( $localname ),
|
||||||
|
$localname
|
||||||
|
) || {};
|
||||||
|
|
||||||
|
return if not ($action->{ type });
|
||||||
|
if ( $action->{ type } eq 'CLASS' ) {
|
||||||
|
$current = pop @{ $list };
|
||||||
|
}
|
||||||
|
elsif ($action->{ type } eq 'CONTENT' ) {
|
||||||
|
my $method = $action->{ method };
|
||||||
|
|
||||||
|
# normalize whitespace
|
||||||
|
$characters =~s{ ^ \s+ (.+) \s+ $ }{$1}xms;
|
||||||
|
$characters =~s{ \s+ }{ }xmsg;
|
||||||
|
|
||||||
|
no strict qw(refs);
|
||||||
|
$current->$method( $characters );
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
return $parser;
|
||||||
|
}
|
||||||
|
|
||||||
|
# make attrs SAX style
|
||||||
|
sub _fixup_attrs {
|
||||||
|
my ($parser, %attrs_of) = @_;
|
||||||
|
|
||||||
|
my @attrs_from = map { $_ =
|
||||||
|
{
|
||||||
|
Name => $_,
|
||||||
|
Value => $attrs_of{ $_ },
|
||||||
|
LocalName => $_
|
||||||
|
}
|
||||||
|
} keys %attrs_of;
|
||||||
|
|
||||||
|
# add xmlns: attrs. expat eats them.
|
||||||
|
push @attrs_from, map {
|
||||||
|
# ignore xmlns=FOO namespaces - must be XML schema
|
||||||
|
# Other nodes should be ignored somewhere else
|
||||||
|
($_ eq '#default')
|
||||||
|
? ()
|
||||||
|
:
|
||||||
|
{
|
||||||
|
Name => "xmlns:$_",
|
||||||
|
Value => $parser->expand_ns_prefix( $_ ),
|
||||||
|
LocalName => $_
|
||||||
|
}
|
||||||
|
} $parser->new_ns_prefixes();
|
||||||
|
return @attrs_from;
|
||||||
|
}
|
||||||
|
|
||||||
|
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: 2007-12-24 11:23:52 +0100 (Mo, 24 Dez 2007) $
|
||||||
|
$LastChangedRevision: 477 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
|
||||||
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/WSDLParser.pm $
|
||||||
|
|
||||||
@@ -0,0 +1,154 @@
|
|||||||
|
package SOAP::WSDL::Factory::Deserializer;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
our $VERSION = '2.00_24';
|
||||||
|
|
||||||
|
my %DESERIALIZER = (
|
||||||
|
'1.1' => 'SOAP::WSDL::Deserializer::XSD',
|
||||||
|
);
|
||||||
|
|
||||||
|
# class method
|
||||||
|
sub register {
|
||||||
|
my ($class, $ref_type, $package) = @_;
|
||||||
|
$DESERIALIZER{ $ref_type } = $package;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_deserializer {
|
||||||
|
my ($self, $args_of_ref) = @_;
|
||||||
|
|
||||||
|
# sanity check
|
||||||
|
die "no deserializer registered for SOAP version $args_of_ref->{ soap_version }"
|
||||||
|
if not exists ($DESERIALIZER{ $args_of_ref->{ soap_version } });
|
||||||
|
|
||||||
|
# load module
|
||||||
|
eval "require $DESERIALIZER{ $args_of_ref->{ soap_version } }"
|
||||||
|
or die "Cannot load serializer $DESERIALIZER{ $args_of_ref->{ soap_version } }", $@;
|
||||||
|
|
||||||
|
return $DESERIALIZER{ $args_of_ref->{ soap_version } }->new($args_of_ref);
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SOAP::WSDL::Factory::Deserializer - Factory for retrieving Deserializer objects
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# from SOAP::WSDL::Client:
|
||||||
|
$deserializer = SOAP::WSDL::Factory::Deserializer->get_deserializer({
|
||||||
|
soap_version => $soap_version,
|
||||||
|
class_resolver => $class_resolver,
|
||||||
|
});
|
||||||
|
|
||||||
|
# in deserializer class:
|
||||||
|
package MyWickedDeserializer;
|
||||||
|
use SOAP::WSDL::Factory::Deserializer;
|
||||||
|
|
||||||
|
# register class as deserializer for SOAP1.2 messages
|
||||||
|
SOAP::WSDL::Factory::Deserializer->register( '1.2' , __PACKAGE__ );
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP::WSDL::Factory::Deserializer serves as factory for retrieving
|
||||||
|
deserializer objects for SOAP::WSDL.
|
||||||
|
|
||||||
|
The actual work is done by specific deserializer classes.
|
||||||
|
|
||||||
|
SOAP::WSDL::Deserializer tries to load one of the following classes:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * The class registered for the scheme via register()
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
By default, L<SOAP::WSDL::Deserializer::XSD|SOAP::WSDL::Deserializer::XSD>
|
||||||
|
is registered for SOAP1.1 messages.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 register
|
||||||
|
|
||||||
|
SOAP::WSDL::Deserializer->register('1.1', 'MyWickedDeserializer');
|
||||||
|
|
||||||
|
Globally registers a class for use as deserializer class.
|
||||||
|
|
||||||
|
=head2 get_deserializer
|
||||||
|
|
||||||
|
Returns an object of the deserializer class for this endpoint.
|
||||||
|
|
||||||
|
=head1 WRITING YOUR OWN DESERIALIZER CLASS
|
||||||
|
|
||||||
|
Deserializer classes may register with SOAP::WSDL::Factory::Deserializer.
|
||||||
|
|
||||||
|
=head2 Registering a deserializer
|
||||||
|
|
||||||
|
Registering a deserializer class with SOAP::WSDL::Factory::Deserializer
|
||||||
|
is done by executing the following code where $version is the SOAP version
|
||||||
|
the class should be used for, and $class is the class name.
|
||||||
|
|
||||||
|
SOAP::WSDL::Factory::Deserializer->register( $version, $class);
|
||||||
|
|
||||||
|
To auto-register your transport class on loading, execute register()
|
||||||
|
in your tranport class (see L<SYNOPSIS|SYNOPSIS> above).
|
||||||
|
|
||||||
|
=head2 Deserializer package layout
|
||||||
|
|
||||||
|
Deserializer modules must be named equal to the deserializer class they
|
||||||
|
contain. There can only be one deserializer class per deserializer module.
|
||||||
|
|
||||||
|
=head2 Methods to implement
|
||||||
|
|
||||||
|
Deserializer classes must implement the following methods:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * new
|
||||||
|
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
=item * deserialize
|
||||||
|
|
||||||
|
Deserialize data from XML to arbitrary formats.
|
||||||
|
|
||||||
|
deserialize() must return a fault indicating that deserializing failed if
|
||||||
|
any error is encountered during the process of deserializing the XML message.
|
||||||
|
|
||||||
|
The following positional parameters are passed to the deserialize method:
|
||||||
|
|
||||||
|
$content - the xml message
|
||||||
|
|
||||||
|
=item * generate_fault
|
||||||
|
|
||||||
|
Generate a fault in the supported format. The following named parameters are
|
||||||
|
passed as a single hash ref:
|
||||||
|
|
||||||
|
code - The fault code, e.g. 'soap:Server' or the like
|
||||||
|
role - The fault role (actor in SOAP1.1)
|
||||||
|
message - The fault message (faultstring in SOAP1.1)
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
|
Copyright 2007 Martin Kutter. All rights reserved.
|
||||||
|
|
||||||
|
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: 176 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: Serializer.pm 176 2007-08-31 15:28:29Z kutterma $
|
||||||
|
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
|
||||||
|
|
||||||
|
=cut
|
||||||
@@ -0,0 +1,172 @@
|
|||||||
|
package SOAP::WSDL::Factory::Generator;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
our $VERSION='2.00_24';
|
||||||
|
|
||||||
|
my %GENERATOR = (
|
||||||
|
'XSD' => 'SOAP::WSDL::Generator::Template::XSD',
|
||||||
|
);
|
||||||
|
|
||||||
|
# class method
|
||||||
|
sub register {
|
||||||
|
my ($class, $ref_type, $package) = @_;
|
||||||
|
$GENERATOR{ $ref_type } = $package;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_generator {
|
||||||
|
my ($self, $args_of_ref) = @_;
|
||||||
|
|
||||||
|
# sanity check
|
||||||
|
# die "no generator registered for generation method $args_of_ref->{ type }"
|
||||||
|
#
|
||||||
|
my $generator_class = (exists ($GENERATOR{ $args_of_ref->{ type } }))
|
||||||
|
? $GENERATOR{ $args_of_ref->{ type } }
|
||||||
|
: $args_of_ref->{ type };
|
||||||
|
|
||||||
|
# load module
|
||||||
|
eval "require $generator_class"
|
||||||
|
or die "Cannot load generator $generator_class", $@;
|
||||||
|
|
||||||
|
return $generator_class->new();
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SOAP::WSDL::Factory:Generator - Factory for retrieving generator objects
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# from SOAP::WSDL::Client:
|
||||||
|
$generator = SOAP::WSDL::Factory::Generator->get_generator({
|
||||||
|
soap_version => $soap_version,
|
||||||
|
});
|
||||||
|
|
||||||
|
# in generator class:
|
||||||
|
package MyWickedGenerator;
|
||||||
|
use SOAP::WSDL::Factory::Generator;
|
||||||
|
|
||||||
|
# register as generator for SOAP1.2 messages
|
||||||
|
SOAP::WSDL::Factory::Generator->register( '1.2' , __PACKAGE__ );
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP::WSDL::Factory::Generator serves as factory for retrieving
|
||||||
|
generator objects for SOAP::WSDL.
|
||||||
|
|
||||||
|
The actual work is done by specific generator classes.
|
||||||
|
|
||||||
|
SOAP::WSDL::Generator tries to load one of the following classes:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * the class registered for the scheme via register()
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 register
|
||||||
|
|
||||||
|
SOAP::WSDL::Generator->register('Lite', 'MyWickedGenerator');
|
||||||
|
|
||||||
|
Globally registers a class for use as generator class.
|
||||||
|
|
||||||
|
=head2 get_generator
|
||||||
|
|
||||||
|
Returns an object of the generator class for this endpoint.
|
||||||
|
|
||||||
|
=head1 WRITING YOUR OWN GENERATOR CLASS
|
||||||
|
|
||||||
|
=head2 Registering a generator
|
||||||
|
|
||||||
|
Generator classes may register with SOAP::WSDL::Factory::Generator.
|
||||||
|
|
||||||
|
Registering a generator class with SOAP::WSDL::Factory::Generator is done
|
||||||
|
by executing the following code where $version is the SOAP version the
|
||||||
|
class should be used for, and $class is the class name.
|
||||||
|
|
||||||
|
SOAP::WSDL::Factory::Generator->register( $version, $class);
|
||||||
|
|
||||||
|
To auto-register your transport class on loading, execute register() in
|
||||||
|
your generator class (see L<SYNOPSIS|SYNOPSIS> above).
|
||||||
|
|
||||||
|
=head2 Generator package layout
|
||||||
|
|
||||||
|
Generator modules must be named equal to the generator class they contain.
|
||||||
|
There can only be one generator class per generator module.
|
||||||
|
|
||||||
|
=head2 Methods to implement
|
||||||
|
|
||||||
|
Generator classes must implement the following methods:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * new
|
||||||
|
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
=item * generate
|
||||||
|
|
||||||
|
Generate SOAP interface
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
Generators may implements one or more of the following configuration
|
||||||
|
methods. All of them are tried via can() by wsdl2perl.
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * set_wsdl
|
||||||
|
|
||||||
|
Set the raw WSDL XML. Implement if you have your own WSDL parser.
|
||||||
|
|
||||||
|
=item * set_definitions
|
||||||
|
|
||||||
|
Sets the (parsed) SOAP::WSDL::Definitions object.
|
||||||
|
|
||||||
|
=item * set_type_prefix
|
||||||
|
|
||||||
|
Sets the prefix for XML Schema type classes
|
||||||
|
|
||||||
|
=item * set_element_prefix
|
||||||
|
|
||||||
|
Sets the prefix for XML Schema element classes
|
||||||
|
|
||||||
|
=item * set_typemap_prefix
|
||||||
|
|
||||||
|
Sets the prefix for typemap classes (class resolvers).
|
||||||
|
|
||||||
|
=item * set_interface_prefix
|
||||||
|
|
||||||
|
Sets the prefix for interface classes
|
||||||
|
|
||||||
|
=item * set_typemap
|
||||||
|
|
||||||
|
Set user-defined typemap snippet
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
|
Copyright 2007 Martin Kutter. All rights reserved.
|
||||||
|
|
||||||
|
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: 176 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: Serializer.pm 176 2007-08-31 15:28:29Z kutterma $
|
||||||
|
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
|
||||||
|
|
||||||
|
=cut
|
||||||
@@ -0,0 +1,146 @@
|
|||||||
|
package SOAP::WSDL::Factory::Serializer;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
our $VERSION='2.00_24';
|
||||||
|
|
||||||
|
my %SERIALIZER = (
|
||||||
|
'1.1' => 'SOAP::WSDL::Serializer::XSD',
|
||||||
|
);
|
||||||
|
|
||||||
|
# class method
|
||||||
|
sub register {
|
||||||
|
my ($class, $ref_type, $package) = @_;
|
||||||
|
$SERIALIZER{ $ref_type } = $package;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_serializer {
|
||||||
|
my ($self, $args_of_ref) = @_;
|
||||||
|
|
||||||
|
# sanity check
|
||||||
|
die "no serializer registered for SOAP version $args_of_ref->{ soap_version }"
|
||||||
|
if not exists ($SERIALIZER{ $args_of_ref->{ soap_version } });
|
||||||
|
|
||||||
|
# load module
|
||||||
|
eval "require $SERIALIZER{ $args_of_ref->{ soap_version } }"
|
||||||
|
or die "Cannot load serializer $SERIALIZER{ $args_of_ref->{ soap_version } }", $@;
|
||||||
|
|
||||||
|
return $SERIALIZER{ $args_of_ref->{ soap_version } }->new();
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SOAP::WSDL::Factory::Serializer - Factory for retrieving serializer objects
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# from SOAP::WSDL::Client:
|
||||||
|
$serializer = SOAP::WSDL::Factory::Serializer->get_serializer({
|
||||||
|
soap_version => $soap_version,
|
||||||
|
});
|
||||||
|
|
||||||
|
# in serializer class:
|
||||||
|
package MyWickedSerializer;
|
||||||
|
use SOAP::WSDL::Factory::Serializer;
|
||||||
|
|
||||||
|
# register as serializer for SOAP1.2 messages
|
||||||
|
SOAP::WSDL::Factory::Serializer->register( '1.2' , __PACKAGE__ );
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP::WSDL::Factory::Serializer serves as factory for retrieving
|
||||||
|
serializer objects for SOAP::WSDL.
|
||||||
|
|
||||||
|
The actual work is done by specific serializer classes.
|
||||||
|
|
||||||
|
SOAP::WSDL::Serializer tries to load one of the following classes:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * the class registered for the scheme via register()
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 register
|
||||||
|
|
||||||
|
SOAP::WSDL::Serializer->register('1.1', 'MyWickedSerializer');
|
||||||
|
|
||||||
|
Globally registers a class for use as serializer class.
|
||||||
|
|
||||||
|
=head2 get_serializer
|
||||||
|
|
||||||
|
Returns an object of the serializer class for this endpoint.
|
||||||
|
|
||||||
|
=head1 WRITING YOUR OWN SERIALIZER CLASS
|
||||||
|
|
||||||
|
=head2 Registering a deserializer
|
||||||
|
|
||||||
|
Serializer classes may register with SOAP::WSDL::Factory::Serializer.
|
||||||
|
|
||||||
|
Serializer objects may also be passed directly to SOAP::WSDL::Client by
|
||||||
|
using the set_serializer method. Note that serializers objects set via
|
||||||
|
SOAP::WSDL::Client's set_serializer method are discarded when the SOAP
|
||||||
|
version is changed via set_soap_version.
|
||||||
|
|
||||||
|
Registering a serializer class with SOAP::WSDL::Factory::Serializer is done
|
||||||
|
by executing the following code where $version is the SOAP version the
|
||||||
|
class should be used for, and $class is the class name.
|
||||||
|
|
||||||
|
SOAP::WSDL::Factory::Serializer->register( $version, $class);
|
||||||
|
|
||||||
|
To auto-register your transport class on loading, execute register() in
|
||||||
|
your tranport class (see L</SYNOPSIS> above).
|
||||||
|
|
||||||
|
=head2 Serializer package layout
|
||||||
|
|
||||||
|
Serializer modules must be named equal to the serializer class they contain.
|
||||||
|
There can only be one serializer class per serializer module.
|
||||||
|
|
||||||
|
=head2 Methods to implement
|
||||||
|
|
||||||
|
Serializer classes must implement the following methods:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * new
|
||||||
|
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
=item * serialize
|
||||||
|
|
||||||
|
Serializes data to XML. The following named parameters are passed to the
|
||||||
|
serialize method in a anonymous hash ref:
|
||||||
|
|
||||||
|
{
|
||||||
|
method => $operation_name,
|
||||||
|
header => $header_data,
|
||||||
|
body => $body_data,
|
||||||
|
}
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
|
Copyright 2004-2007 Martin Kutter. All rights reserved.
|
||||||
|
|
||||||
|
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: 391 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: Serializer.pm 391 2007-11-17 21:56:13Z kutterma $
|
||||||
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
|
||||||
|
|
||||||
|
=cut
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user