Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
84b53d9261 | ||
|
|
b955c5ad79 | ||
|
|
080b211e4e | ||
|
|
fa4d5dd884 | ||
|
|
3d11524449 | ||
|
|
21efa286af | ||
|
|
008d06b72a | ||
|
|
c6a48ba84b |
@@ -1,44 +1,55 @@
|
|||||||
use Module::Build;
|
use Module::Build;
|
||||||
|
|
||||||
$build = Module::Build->new(
|
$build = Module::Build->new(
|
||||||
|
dist_author => 'Martin Kutter <martin.kutter@fen-net.de>',
|
||||||
create_makefile_pl => 'passthrough',
|
create_makefile_pl => 'passthrough',
|
||||||
dist_abstract => 'SOAP with WSDL support',
|
dist_abstract => 'SOAP with WSDL support',
|
||||||
dist_name => 'SOAP-WSDL',
|
dist_name => 'SOAP-WSDL',
|
||||||
dist_version => '2.00_16',
|
dist_version => '2.00_24',
|
||||||
module_name => 'SOAP::WSDL',
|
module_name => 'SOAP::WSDL',
|
||||||
license => 'artistic',
|
license => 'artistic',
|
||||||
requires => {
|
requires => {
|
||||||
'Class::Std' => q/v0.0.8/,
|
# 5.6.x is way too buggy and has no unicode support
|
||||||
|
# for us. SOAP-WSDL relies on unicode (WS-I demands it)
|
||||||
|
# and triggers several 5.6 bugs...
|
||||||
|
'perl' => '5.8.0',
|
||||||
|
'Class::Std' => q/v0.0.8/,
|
||||||
'Class::Std::Storable' => 0,
|
'Class::Std::Storable' => 0,
|
||||||
|
'Data::Dumper' => 0,
|
||||||
'Date::Parse' => 0,
|
'Date::Parse' => 0,
|
||||||
'Date::Format' => 0,
|
'Date::Format' => 0,
|
||||||
'LWP::UserAgent' => 0,
|
|
||||||
'List::Util' => 0,
|
|
||||||
'File::Basename' => 0,
|
'File::Basename' => 0,
|
||||||
'File::Path' => 0,
|
'File::Path' => 0,
|
||||||
'XML::Parser::Expat' => 0,
|
'Getopt::Long' => 0,
|
||||||
|
'List::Util' => 0,
|
||||||
|
'LWP::UserAgent' => 0,
|
||||||
'Template' => 0,
|
'Template' => 0,
|
||||||
'Term::ReadKey' => 0,
|
'Term::ReadKey' => 0,
|
||||||
'Getopt::Long' => 0,
|
'XML::Parser::Expat' => 0,
|
||||||
},
|
},
|
||||||
buildrequires => {
|
buildrequires => {
|
||||||
'Date::Parse' => 0,
|
|
||||||
'Date::Format' => 0,
|
|
||||||
'Test::More' => 0,
|
|
||||||
'Class::Std' => q/v0.0.8/,
|
'Class::Std' => q/v0.0.8/,
|
||||||
'Class::Std::Storable' => 0,
|
'Class::Std::Storable' => 0,
|
||||||
|
'Cwd' => 0,
|
||||||
|
'Date::Parse' => 0,
|
||||||
|
'Date::Format' => 0,
|
||||||
|
'Getopt::Long' => 0,
|
||||||
'List::Util' => 0,
|
'List::Util' => 0,
|
||||||
'LWP::UserAgent' => 0,
|
'LWP::UserAgent' => 0,
|
||||||
'File::Basename' => 0,
|
'File::Basename' => 0,
|
||||||
'File::Path' => 0,
|
'File::Path' => 0,
|
||||||
'XML::Parser::Expat' => 0,
|
'File::Spec' => 0,
|
||||||
'Template' => 0,
|
|
||||||
'Getopt::Long' => 0,
|
|
||||||
'Cwd' => 0,
|
|
||||||
'File::Find' => 0,
|
|
||||||
'Storable' => 0,
|
'Storable' => 0,
|
||||||
|
'Test::More' => 0,
|
||||||
|
'Template' => 0,
|
||||||
|
'XML::Parser::Expat' => 0,
|
||||||
},
|
},
|
||||||
recursive_test_files => 1,
|
recursive_test_files => 1,
|
||||||
|
meta_add => {
|
||||||
|
no_index => {
|
||||||
|
directory => 'lib/SOAP/WSDL/Generator/Template/XSD/',
|
||||||
|
},
|
||||||
|
}
|
||||||
);
|
);
|
||||||
$build->add_build_element('tt');
|
$build->add_build_element('tt');
|
||||||
$build->create_build_script;
|
$build->create_build_script;
|
||||||
|
|||||||
+204
-3
@@ -1,4 +1,4 @@
|
|||||||
Release notes for SOAP::WSDL 2.00_16
|
Release notes for SOAP::WSDL 2.00_24
|
||||||
-------
|
-------
|
||||||
|
|
||||||
I'm proud to present a new pre-release version of SOAP::WSDL.
|
I'm proud to present a new pre-release version of SOAP::WSDL.
|
||||||
@@ -15,6 +15,13 @@ Features:
|
|||||||
* Easy-to use API
|
* Easy-to use API
|
||||||
o Automatically encodes perl data structures as message data
|
o Automatically encodes perl data structures as message data
|
||||||
o Automatically sets HTTP headers right
|
o Automatically sets HTTP headers right
|
||||||
|
* Efficient documentation
|
||||||
|
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
|
* SOAP::Lite like look and feel
|
||||||
o Where possible, SOAP::WSDL mimics SOAP::Lite's API to allow easy migrations
|
o Where possible, SOAP::WSDL mimics SOAP::Lite's API to allow easy migrations
|
||||||
* XML schema based class library for creating data objects
|
* XML schema based class library for creating data objects
|
||||||
@@ -25,8 +32,196 @@ Features:
|
|||||||
o Serializer plugins via SOAP::WSDL::Factory::Serializer
|
o Serializer plugins via SOAP::WSDL::Factory::Serializer
|
||||||
o Deserializer plugins via SOAP::WSDL::Factory::Serializer
|
o Deserializer plugins via SOAP::WSDL::Factory::Serializer
|
||||||
|
|
||||||
|
|
||||||
The following changes have been made:
|
The following changes have been made:
|
||||||
|
|
||||||
|
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
|
2.00_16
|
||||||
----
|
----
|
||||||
The following features were added (the numbers in square brackets are the
|
The following features were added (the numbers in square brackets are the
|
||||||
@@ -35,12 +230,15 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
|||||||
* [ 1761532 ] Support embedded atomic types
|
* [ 1761532 ] Support embedded atomic types
|
||||||
SOAP::WSDL now supports a greater variety of XML Schema type definitions.
|
SOAP::WSDL now supports a greater variety of XML Schema type definitions.
|
||||||
Note that XML Schema support is still incomplete, though.
|
Note that XML Schema support is still incomplete, though.
|
||||||
|
|
||||||
* [ 1797943 ] Create Perl Hash Deserializer
|
* [ 1797943 ] Create Perl Hash Deserializer
|
||||||
There's a new deserializer which outputs perl hashes as data structures.
|
There's a new deserializer which outputs perl hashes as data structures.
|
||||||
Much like XML::Simple, but faster. No XML Attribute support, though.
|
Much like XML::Simple, but faster. No XML Attribute support, though.
|
||||||
|
|
||||||
* [ 1797678 ] Move Code generator from WSDL::Definitions to separate class
|
* [ 1797678 ] Move Code generator from WSDL::Definitions to separate class
|
||||||
|
|
||||||
* [ 1803330 ] Create one interface per port
|
* [ 1803330 ] Create one interface per port
|
||||||
SOAP::WSDL now creats one interface per port, not one per service.
|
SOAP::WSDL now creates one interface per port, not one per service.
|
||||||
|
|
||||||
The following bugs have been fixed (the numbers in square brackets are the
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
@@ -48,8 +246,11 @@ tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
|||||||
* [ 1804441 ] parts from binding not regarded in SOAP::WSDL
|
* [ 1804441 ] parts from binding not regarded in SOAP::WSDL
|
||||||
SOAP::WSDL (interpreter mode) now respects the body parts specified in the
|
SOAP::WSDL (interpreter mode) now respects the body parts specified in the
|
||||||
binding.
|
binding.
|
||||||
|
|
||||||
* [ 1803763 ] nonNegativeInteger misspelled in Schema::Builtin
|
* [ 1803763 ] nonNegativeInteger misspelled in Schema::Builtin
|
||||||
|
|
||||||
* [ 1793965 ] _expand() does not work on non-root-node ns declarations
|
* [ 1793965 ] _expand() does not work on non-root-node ns declarations
|
||||||
|
|
||||||
* [ 1792348 ] 006_client.t requires SOAP::Lite in 2.00_15
|
* [ 1792348 ] 006_client.t requires SOAP::Lite in 2.00_15
|
||||||
SOAP::WSDL no longer attempts to load SOAP::WSDL::Deserializer::SOM when
|
SOAP::WSDL no longer attempts to load SOAP::WSDL::Deserializer::SOM when
|
||||||
no_dispatch is set.
|
no_dispatch is set.
|
||||||
@@ -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 uthor tests are 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
|
||||||
|
* 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,15 +1,15 @@
|
|||||||
benchmark/01_expat.t
|
benchmark/01_expat.t
|
||||||
benchmark/smallprof.out
|
|
||||||
benchmark/smallprof.out-whitespace
|
|
||||||
benchmark/XSD/01_anyType.t
|
benchmark/XSD/01_anyType.t
|
||||||
benchmark/XSD/02_anySimpleType.t
|
benchmark/XSD/02_anySimpleType.t
|
||||||
benchmark/XSD/03_string.t
|
benchmark/XSD/03_string.t
|
||||||
bin/wsdl2perl.pl
|
bin/wsdl2perl.pl
|
||||||
Build.PL
|
Build.PL
|
||||||
CHANGES
|
Changes
|
||||||
example/fortune.pl
|
example/fortune.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
|
||||||
@@ -22,15 +22,14 @@ example/lib/MyElements/int.pm
|
|||||||
example/lib/MyElements/readNodeCount.pm
|
example/lib/MyElements/readNodeCount.pm
|
||||||
example/lib/MyElements/readNodeCountResponse.pm
|
example/lib/MyElements/readNodeCountResponse.pm
|
||||||
example/lib/MyElements/string.pm
|
example/lib/MyElements/string.pm
|
||||||
example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie.pm
|
example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie/FullerData_x0020_Fortune_x0020_CookieSoap.pm
|
||||||
example/lib/MyInterfaces/GlobalWeather.pm
|
example/lib/MyInterfaces/GlobalWeather/GlobalWeatherSoap.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/visitor/visitor.pl
|
example/visitor/visitor.pl
|
||||||
example/weather.pl
|
example/weather.pl
|
||||||
example/weather_wsdl.pl
|
example/weather_wsdl.pl
|
||||||
example/wsdl/FortuneCookie.xml
|
example/wsdl/FortuneCookie.xml
|
||||||
example/wsdl/genericbarcode.xml
|
|
||||||
example/wsdl/globalweather.xml
|
example/wsdl/globalweather.xml
|
||||||
HACKING
|
HACKING
|
||||||
lib/SOAP/WSDL.pm
|
lib/SOAP/WSDL.pm
|
||||||
@@ -40,16 +39,15 @@ 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/Deserializer/Hash.pm
|
lib/SOAP/WSDL/Deserializer/Hash.pm
|
||||||
lib/SOAP/WSDL/Deserializer/SOAP11.pm
|
|
||||||
lib/SOAP/WSDL/Deserializer/SOM.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/Message2Hash.pm
|
||||||
lib/SOAP/WSDL/Expat/MessageParser.pm
|
lib/SOAP/WSDL/Expat/MessageParser.pm
|
||||||
lib/SOAP/WSDL/Expat/MessageParser_BROKEN.pm
|
|
||||||
lib/SOAP/WSDL/Expat/MessageStreamParser.pm
|
lib/SOAP/WSDL/Expat/MessageStreamParser.pm
|
||||||
lib/SOAP/WSDL/Expat/MessageSubParser.pm
|
|
||||||
lib/SOAP/WSDL/Expat/SubParser.pm
|
|
||||||
lib/SOAP/WSDL/Expat/WSDLParser.pm
|
lib/SOAP/WSDL/Expat/WSDLParser.pm
|
||||||
lib/SOAP/WSDL/Factory/Deserializer.pm
|
lib/SOAP/WSDL/Factory/Deserializer.pm
|
||||||
|
lib/SOAP/WSDL/Factory/Generator.pm
|
||||||
lib/SOAP/WSDL/Factory/Serializer.pm
|
lib/SOAP/WSDL/Factory/Serializer.pm
|
||||||
lib/SOAP/WSDL/Factory/Transport.pm
|
lib/SOAP/WSDL/Factory/Transport.pm
|
||||||
lib/SOAP/WSDL/Generator/Template.pm
|
lib/SOAP/WSDL/Generator/Template.pm
|
||||||
@@ -58,8 +56,16 @@ lib/SOAP/WSDL/Generator/Template/XSD/_type_class.tt
|
|||||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/atomicTypes.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/atomicTypes.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/complexType/contentModel.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/contentModel.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt
|
||||||
|
lib/SOAP/WSDL/Generator/Template/XSD/complexType/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/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.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/element/POD/structure.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/element/POD/structure.tt
|
||||||
lib/SOAP/WSDL/Generator/Template/XSD/Interface.tt
|
lib/SOAP/WSDL/Generator/Template/XSD/Interface.tt
|
||||||
@@ -85,16 +91,19 @@ lib/SOAP/WSDL/Generator/Visitor.pm
|
|||||||
lib/SOAP/WSDL/Generator/Visitor/Typelib.pm
|
lib/SOAP/WSDL/Generator/Visitor/Typelib.pm
|
||||||
lib/SOAP/WSDL/Generator/Visitor/Typemap.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/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/Serializer/SOAP11.pm
|
lib/SOAP/WSDL/Serializer/XSD.pm
|
||||||
lib/SOAP/WSDL/Service.pm
|
lib/SOAP/WSDL/Service.pm
|
||||||
lib/SOAP/WSDL/SOAP/Address.pm
|
lib/SOAP/WSDL/SOAP/Address.pm
|
||||||
lib/SOAP/WSDL/SOAP/Body.pm
|
lib/SOAP/WSDL/SOAP/Body.pm
|
||||||
@@ -103,6 +112,7 @@ lib/SOAP/WSDL/SOAP/HeaderFault.pm
|
|||||||
lib/SOAP/WSDL/SOAP/Operation.pm
|
lib/SOAP/WSDL/SOAP/Operation.pm
|
||||||
lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm
|
lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm
|
||||||
lib/SOAP/WSDL/Transport/HTTP.pm
|
lib/SOAP/WSDL/Transport/HTTP.pm
|
||||||
|
lib/SOAP/WSDL/Transport/Loopback.pm
|
||||||
lib/SOAP/WSDL/Transport/Test.pm
|
lib/SOAP/WSDL/Transport/Test.pm
|
||||||
lib/SOAP/WSDL/TypeLookup.pm
|
lib/SOAP/WSDL/TypeLookup.pm
|
||||||
lib/SOAP/WSDL/Types.pm
|
lib/SOAP/WSDL/Types.pm
|
||||||
@@ -182,8 +192,11 @@ t/012_element.t
|
|||||||
t/013_complexType.t
|
t/013_complexType.t
|
||||||
t/016_client_object.t
|
t/016_client_object.t
|
||||||
t/017_generator.t
|
t/017_generator.t
|
||||||
|
t/018_compat_2_00_15-generator.t
|
||||||
t/020_storable.t
|
t/020_storable.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
|
||||||
@@ -216,11 +229,14 @@ t/acceptance/wsdl/generator_unsupported_test.wsdl
|
|||||||
t/acceptance/wsdl/message_gateway.wsdl
|
t/acceptance/wsdl/message_gateway.wsdl
|
||||||
t/contributed.wsdl
|
t/contributed.wsdl
|
||||||
t/Expat/01_expat.t
|
t/Expat/01_expat.t
|
||||||
t/Expat/02_sub_parser.t
|
|
||||||
t/Expat/03_wsdl.t
|
t/Expat/03_wsdl.t
|
||||||
t/lib/MyComplexType.pm
|
t/lib/MyComplexType.pm
|
||||||
t/lib/MyElement.pm
|
t/lib/MyElement.pm
|
||||||
|
t/lib/MyElements/GetWeather.pm
|
||||||
|
t/lib/MyElements/GetWeatherResponse.pm
|
||||||
|
t/lib/MyInterfaces/GlobalWeather.pm
|
||||||
t/lib/MySimpleType.pm
|
t/lib/MySimpleType.pm
|
||||||
|
t/lib/MyTypemaps/GlobalWeather.pm
|
||||||
t/lib/Test/SOAPMessage.pm
|
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
|
||||||
@@ -240,21 +256,67 @@ 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/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/Deserializer/Hash.t
|
t/SOAP/WSDL/Deserializer/Hash.t
|
||||||
|
t/SOAP/WSDL/Deserializer/SOM.t
|
||||||
|
t/SOAP/WSDL/Deserializer/XSD.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/Template.t
|
||||||
|
t/SOAP/WSDL/Generator/Visitor.t
|
||||||
t/SOAP/WSDL/Generator/Visitor/Typemap.t
|
t/SOAP/WSDL/Generator/Visitor/Typemap.t
|
||||||
|
t/SOAP/WSDL/Generator/XCS.t
|
||||||
t/SOAP/WSDL/Generator/XSD.t
|
t/SOAP/WSDL/Generator/XSD.t
|
||||||
t/SOAP/WSDL/Generator/XSD_unsupported.t
|
t/SOAP/WSDL/Generator/XSD_unsupported.t
|
||||||
t/SOAP/WSDL/Transport/01_Test.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/test2.xml
|
||||||
t/SOAP/WSDL/Transport/acceptance/test3.xml
|
t/SOAP/WSDL/Transport/acceptance/test3.xml
|
||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/001_anyType.t
|
t/SOAP/WSDL/Typelib/Fault11.t
|
||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/002_anySimpleType.t
|
t/SOAP/WSDL/XSD/Typelib/Builtin/01_constructors.t
|
||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/003_date.t
|
t/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.t
|
||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/004_time.t
|
t/SOAP/WSDL/XSD/Typelib/Builtin/anyType.t
|
||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/005_dateTime.t
|
t/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.t
|
||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/006_string.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/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/test.wsdl
|
t/test.wsdl
|
||||||
|
TEST_COVERAGE
|
||||||
TODO
|
TODO
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
---
|
---
|
||||||
name: SOAP-WSDL
|
name: SOAP-WSDL
|
||||||
version: 2.00_16
|
version: 2.00_24
|
||||||
author: []
|
author:
|
||||||
|
- 'Martin Kutter <martin.kutter@fen-net.de>'
|
||||||
abstract: SOAP with WSDL support
|
abstract: SOAP with WSDL support
|
||||||
license: artistic
|
license: artistic
|
||||||
resources:
|
resources:
|
||||||
@@ -9,6 +10,7 @@ resources:
|
|||||||
requires:
|
requires:
|
||||||
Class::Std: v0.0.8
|
Class::Std: v0.0.8
|
||||||
Class::Std::Storable: 0
|
Class::Std::Storable: 0
|
||||||
|
Data::Dumper: 0
|
||||||
Date::Format: 0
|
Date::Format: 0
|
||||||
Date::Parse: 0
|
Date::Parse: 0
|
||||||
File::Basename: 0
|
File::Basename: 0
|
||||||
@@ -19,50 +21,66 @@ requires:
|
|||||||
Template: 0
|
Template: 0
|
||||||
Term::ReadKey: 0
|
Term::ReadKey: 0
|
||||||
XML::Parser::Expat: 0
|
XML::Parser::Expat: 0
|
||||||
|
perl: 5.8.0
|
||||||
provides:
|
provides:
|
||||||
SOAP::WSDL:
|
SOAP::WSDL:
|
||||||
file: lib/SOAP/WSDL.pm
|
file: lib/SOAP/WSDL.pm
|
||||||
version: 2.00_16
|
version: 2.00_17
|
||||||
SOAP::WSDL::Base:
|
SOAP::WSDL::Base:
|
||||||
file: lib/SOAP/WSDL/Base.pm
|
file: lib/SOAP/WSDL/Base.pm
|
||||||
|
version: 2.00_17
|
||||||
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_16
|
version: 2.00_17
|
||||||
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_24
|
||||||
SOAP::WSDL::Definitions:
|
SOAP::WSDL::Definitions:
|
||||||
file: lib/SOAP/WSDL/Definitions.pm
|
file: lib/SOAP/WSDL/Definitions.pm
|
||||||
|
version: 2.00_17
|
||||||
SOAP::WSDL::Deserializer::Hash:
|
SOAP::WSDL::Deserializer::Hash:
|
||||||
file: lib/SOAP/WSDL/Deserializer/Hash.pm
|
file: lib/SOAP/WSDL/Deserializer/Hash.pm
|
||||||
version: 2.00_16
|
version: 2.00_24
|
||||||
SOAP::WSDL::Deserializer::SOAP11:
|
|
||||||
file: lib/SOAP/WSDL/Deserializer/SOAP11.pm
|
|
||||||
version: 2.00_13
|
|
||||||
SOAP::WSDL::Deserializer::SOM:
|
SOAP::WSDL::Deserializer::SOM:
|
||||||
file: lib/SOAP/WSDL/Deserializer/SOM.pm
|
file: lib/SOAP/WSDL/Deserializer/SOM.pm
|
||||||
version: 2.00_15
|
version: 2.00_24
|
||||||
|
SOAP::WSDL::Deserializer::XSD:
|
||||||
|
file: lib/SOAP/WSDL/Deserializer/XSD.pm
|
||||||
|
version: 2.00_24
|
||||||
|
SOAP::WSDL::Expat::Base:
|
||||||
|
file: lib/SOAP/WSDL/Expat/Base.pm
|
||||||
|
version: 2.00_24
|
||||||
SOAP::WSDL::Expat::Message2Hash:
|
SOAP::WSDL::Expat::Message2Hash:
|
||||||
file: lib/SOAP/WSDL/Expat/Message2Hash.pm
|
file: lib/SOAP/WSDL/Expat/Message2Hash.pm
|
||||||
|
version: 2.00_24
|
||||||
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_24
|
||||||
SOAP::WSDL::Expat::MessageStreamParser:
|
SOAP::WSDL::Expat::MessageStreamParser:
|
||||||
file: lib/SOAP/WSDL/Expat/MessageStreamParser.pm
|
file: lib/SOAP/WSDL/Expat/MessageStreamParser.pm
|
||||||
SOAP::WSDL::Expat::MessageSubParser:
|
version: 2.00_24
|
||||||
file: lib/SOAP/WSDL/Expat/MessageSubParser.pm
|
|
||||||
SOAP::WSDL::Factory::Deserializer:
|
SOAP::WSDL::Factory::Deserializer:
|
||||||
file: lib/SOAP/WSDL/Factory/Deserializer.pm
|
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:
|
SOAP::WSDL::Factory::Serializer:
|
||||||
file: lib/SOAP/WSDL/Factory/Serializer.pm
|
file: lib/SOAP/WSDL/Factory/Serializer.pm
|
||||||
|
version: 2.00_24
|
||||||
SOAP::WSDL::Factory::Transport:
|
SOAP::WSDL::Factory::Transport:
|
||||||
file: lib/SOAP/WSDL/Factory/Transport.pm
|
file: lib/SOAP/WSDL/Factory/Transport.pm
|
||||||
|
version: 2.00_17
|
||||||
SOAP::WSDL::Generator::Template:
|
SOAP::WSDL::Generator::Template:
|
||||||
file: lib/SOAP/WSDL/Generator/Template.pm
|
file: lib/SOAP/WSDL/Generator/Template.pm
|
||||||
|
version: 2.00_17
|
||||||
SOAP::WSDL::Generator::Template::XSD:
|
SOAP::WSDL::Generator::Template::XSD:
|
||||||
file: lib/SOAP/WSDL/Generator/Template/XSD.pm
|
file: lib/SOAP/WSDL/Generator/Template/XSD.pm
|
||||||
SOAP::WSDL::Generator::Visitor:
|
SOAP::WSDL::Generator::Visitor:
|
||||||
file: lib/SOAP/WSDL/Generator/Visitor.pm
|
file: lib/SOAP/WSDL/Generator/Visitor.pm
|
||||||
|
version: 2.00_17
|
||||||
SOAP::WSDL::Generator::Visitor::Typelib:
|
SOAP::WSDL::Generator::Visitor::Typelib:
|
||||||
file: lib/SOAP/WSDL/Generator/Visitor/Typelib.pm
|
file: lib/SOAP/WSDL/Generator/Visitor/Typelib.pm
|
||||||
SOAP::WSDL::Generator::Visitor::Typemap:
|
SOAP::WSDL::Generator::Visitor::Typemap:
|
||||||
@@ -89,15 +107,20 @@ provides:
|
|||||||
file: lib/SOAP/WSDL/SOAP/HeaderFault.pm
|
file: lib/SOAP/WSDL/SOAP/HeaderFault.pm
|
||||||
SOAP::WSDL::SOAP::Operation:
|
SOAP::WSDL::SOAP::Operation:
|
||||||
file: lib/SOAP/WSDL/SOAP/Operation.pm
|
file: lib/SOAP/WSDL/SOAP/Operation.pm
|
||||||
|
version: 2.00_17
|
||||||
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
|
||||||
SOAP::WSDL::Serializer::SOAP11:
|
version: 2.00_17
|
||||||
file: lib/SOAP/WSDL/Serializer/SOAP11.pm
|
SOAP::WSDL::Serializer::XSD:
|
||||||
version: 2.00_13
|
file: lib/SOAP/WSDL/Serializer/XSD.pm
|
||||||
|
version: 2.00_24
|
||||||
SOAP::WSDL::Service:
|
SOAP::WSDL::Service:
|
||||||
file: lib/SOAP/WSDL/Service.pm
|
file: lib/SOAP/WSDL/Service.pm
|
||||||
SOAP::WSDL::Transport::HTTP:
|
SOAP::WSDL::Transport::HTTP:
|
||||||
file: lib/SOAP/WSDL/Transport/HTTP.pm
|
file: lib/SOAP/WSDL/Transport/HTTP.pm
|
||||||
|
SOAP::WSDL::Transport::Loopback:
|
||||||
|
file: lib/SOAP/WSDL/Transport/Loopback.pm
|
||||||
|
version: 2.00_17
|
||||||
SOAP::WSDL::Transport::Test:
|
SOAP::WSDL::Transport::Test:
|
||||||
file: lib/SOAP/WSDL/Transport/Test.pm
|
file: lib/SOAP/WSDL/Transport/Test.pm
|
||||||
version: 2.00_14
|
version: 2.00_14
|
||||||
@@ -109,16 +132,20 @@ provides:
|
|||||||
file: lib/SOAP/WSDL/XSD/Builtin.pm
|
file: lib/SOAP/WSDL/XSD/Builtin.pm
|
||||||
SOAP::WSDL::XSD::ComplexType:
|
SOAP::WSDL::XSD::ComplexType:
|
||||||
file: lib/SOAP/WSDL/XSD/ComplexType.pm
|
file: lib/SOAP/WSDL/XSD/ComplexType.pm
|
||||||
|
version: 2.00_17
|
||||||
SOAP::WSDL::XSD::Element:
|
SOAP::WSDL::XSD::Element:
|
||||||
file: lib/SOAP/WSDL/XSD/Element.pm
|
file: lib/SOAP/WSDL/XSD/Element.pm
|
||||||
|
version: 2.00_22
|
||||||
SOAP::WSDL::XSD::Schema:
|
SOAP::WSDL::XSD::Schema:
|
||||||
file: lib/SOAP/WSDL/XSD/Schema.pm
|
file: lib/SOAP/WSDL/XSD/Schema.pm
|
||||||
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_17
|
||||||
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_17
|
||||||
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:
|
||||||
@@ -149,6 +176,7 @@ provides:
|
|||||||
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_17
|
||||||
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:
|
||||||
@@ -201,6 +229,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_18
|
||||||
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:
|
||||||
@@ -213,9 +242,10 @@ 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_16
|
version: 2.00_24
|
||||||
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_24
|
||||||
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:
|
||||||
@@ -224,3 +254,5 @@ generated_by: Module::Build version 0.2808
|
|||||||
meta-spec:
|
meta-spec:
|
||||||
url: http://module-build.sourceforge.net/META-spec-v1.2.html
|
url: http://module-build.sourceforge.net/META-spec-v1.2.html
|
||||||
version: 1.2
|
version: 1.2
|
||||||
|
no_index:
|
||||||
|
directory: lib/SOAP/WSDL/Generator/Template/XSD/
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|
||||||
@@ -2,36 +2,23 @@ TODO list for SOAP::WSDL
|
|||||||
|
|
||||||
2.00 Pre-releases
|
2.00 Pre-releases
|
||||||
--------
|
--------
|
||||||
* SOAP Header support (#1764845)
|
|
||||||
|
|
||||||
* Implement a interface similar to SOAP::Schema (#1783639)
|
|
||||||
|
|
||||||
* Check & probably fix simpleType support.
|
|
||||||
The WS at http://www.webservicex.net/genericbarcode.asmx?wsdl should
|
|
||||||
make up a good example for simpleType definitions.
|
|
||||||
|
|
||||||
* write inheritance Test for all XSD::Typelib::Builtin::* classes
|
|
||||||
|
|
||||||
* support embedded atomic types (#1761532)
|
|
||||||
Implement by including a second (and third and fourth)
|
|
||||||
|
|
||||||
package type_prefix::complex_type::element_name;
|
|
||||||
|
|
||||||
element package.
|
|
||||||
Maybe even allow unlimited depth? What does the specs say?
|
|
||||||
|
|
||||||
2.1 release
|
2.1 release
|
||||||
--------
|
--------
|
||||||
|
* Support namespaces in SOAP message payload(#1809057)
|
||||||
|
|
||||||
* Support namespaces in SOAP message payload
|
* Support the xsi:type attribute on derived types on the wire(#1809059)
|
||||||
|
|
||||||
* SOAP1.2 support
|
* SOAP1.2 support (#1803331)
|
||||||
|
|
||||||
2.2 release
|
2.2 release
|
||||||
--------
|
--------
|
||||||
* XML schema support ("minimal conformant") (#1764845)
|
* XML schema support ("minimal conformant") (#1764845)
|
||||||
|
|
||||||
* Support SOAP attachments
|
* Support SOAP attachments
|
||||||
|
|
||||||
|
* Act as SOAP Server
|
||||||
|
|
||||||
3.0 release
|
3.0 release
|
||||||
--------
|
--------
|
||||||
We're not thinking that far ahead right now.
|
We're not thinking that far ahead right now.
|
||||||
+59
-28
@@ -1,5 +1,6 @@
|
|||||||
#!/usr/bin/perl -w
|
#!/usr/bin/perl -w
|
||||||
%DB::packages=(SOAP::WSDL::Expat::MessageParser => 1);
|
%DB::packages=(SOAP::WSDL::Expat::MessageParser => 1);
|
||||||
|
%DB::packages=(SOAP::WSDL::Expat::MessageParser => 1);
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use lib '../lib';
|
use lib '../lib';
|
||||||
@@ -7,7 +8,7 @@ use lib 'lib';
|
|||||||
use lib '../t/lib';
|
use lib '../t/lib';
|
||||||
# use SOAP::WSDL::SAX::MessageHandler;
|
# use SOAP::WSDL::SAX::MessageHandler;
|
||||||
|
|
||||||
use Benchmark;
|
use Benchmark qw(cmpthese timethese);
|
||||||
use SOAP::WSDL::Expat::MessageParser;
|
use SOAP::WSDL::Expat::MessageParser;
|
||||||
use SOAP::WSDL::Expat::Message2Hash;
|
use SOAP::WSDL::Expat::Message2Hash;
|
||||||
use XML::Simple;
|
use XML::Simple;
|
||||||
@@ -18,8 +19,9 @@ use MySimpleType;
|
|||||||
|
|
||||||
my $xml = q{<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
my $xml = q{<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
|
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
|
||||||
<SOAP-ENV:Body><MyAtomicComplexTypeElement xmlns="urn:Test" >
|
<SOAP-ENV:Body>
|
||||||
<test>Test</test>
|
<MyAtomicComplexTypeElement xmlns="urn:Test" >
|
||||||
|
<test>
|
||||||
<test2 >Test2</test2>
|
<test2 >Test2</test2>
|
||||||
<test2 >Test2</test2>
|
<test2 >Test2</test2>
|
||||||
<test2 >Test2</test2>
|
<test2 >Test2</test2>
|
||||||
@@ -32,22 +34,13 @@ my $xml = q{<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-insta
|
|||||||
<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>Test</test>
|
</test>
|
||||||
<test>Test</test>
|
|
||||||
<test>Test</test>
|
|
||||||
<test>Test</test>
|
|
||||||
<test>Test</test>
|
|
||||||
<test>Test</test>
|
|
||||||
<test>Test</test>
|
|
||||||
<test>Test</test>
|
|
||||||
<test>Test</test>
|
|
||||||
<test>Test</test>
|
|
||||||
<test>Test</test>
|
|
||||||
</MyAtomicComplexTypeElement>
|
</MyAtomicComplexTypeElement>
|
||||||
</SOAP-ENV:Body></SOAP-ENV:Envelope>};
|
</SOAP-ENV:Body></SOAP-ENV:Envelope>};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
my $parser = SOAP::WSDL::Expat::MessageParser->new({
|
my $parser = SOAP::WSDL::Expat::MessageParser->new({
|
||||||
class_resolver => 'FakeResolver'
|
class_resolver => 'FakeResolver'
|
||||||
});
|
});
|
||||||
@@ -56,32 +49,70 @@ my $hash_parser = SOAP::WSDL::Expat::Message2Hash->new();
|
|||||||
|
|
||||||
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
|
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
|
||||||
|
|
||||||
|
print "xml length: ${ \length $xml } bytes\n";
|
||||||
|
|
||||||
my $libxml = XML::LibXML->new();
|
my $libxml = XML::LibXML->new();
|
||||||
|
$libxml->keep_blanks(0);
|
||||||
my @data;
|
my @data;
|
||||||
timethese 10000,
|
|
||||||
{
|
sub libxml_test {
|
||||||
'Hash (SOAP:WSDL)' => sub { push @data, $hash_parser->parse( $xml ) },
|
my $dom = $libxml->parse_string( $xml );
|
||||||
'XSD (SOAP::WSDL)' => sub { push @data, $parser->parse( $xml ) },
|
push @data, dom2hash( $dom->firstChild );
|
||||||
'XML::Simple (Hash)' => sub { push @data, XMLin $xml },
|
|
||||||
# 'XML::LibXML (DOM)' => sub { push @data, $libxml->parse_string( $xml ) },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
# use Test::More tests => 1;
|
sub dom2hash {
|
||||||
#is $parser->get_data(), q{<MyAtomicComplexTypeElement xmlns="urn:Test" >}
|
for ($_[0]->childNodes) {
|
||||||
# . q{<test >Test</test><test2 >Test2</test2></MyAtomicComplexTypeElement>}
|
if (exists $_[1]->{ $_->nodeName }) {
|
||||||
# , 'Content comparison';
|
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];
|
||||||
|
}
|
||||||
|
|
||||||
#$parser->class_resolver( 'FakeResolver2' );
|
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,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
# for (1..10000) { push @data, $parser->parse( $xml ) };
|
||||||
|
|
||||||
# data classes reside in t/lib/Typelib/
|
# data classes reside in t/lib/Typelib/
|
||||||
BEGIN {
|
BEGIN {
|
||||||
package FakeResolver;
|
package FakeResolver;
|
||||||
{
|
{
|
||||||
my %class_list = (
|
my %class_list = (
|
||||||
'MyAtomicComplexTypeElement' => 'MyAtomicComplexTypeElement',
|
'MyAtomicComplexTypeElement' => 'MyAtomicComplexTypeElement',
|
||||||
'MyAtomicComplexTypeElement/test' => 'MyTestElement',
|
'MyAtomicComplexTypeElement/test' => 'MyAtomicComplexTypeElement',
|
||||||
'MyAtomicComplexTypeElement/test2' => 'MyTestElement2',
|
'MyAtomicComplexTypeElement/test/test2' => 'MyTestElement2',
|
||||||
);
|
);
|
||||||
|
|
||||||
sub get_map { return \%class_list };
|
sub get_map { return \%class_list };
|
||||||
|
|||||||
@@ -8,14 +8,5 @@ my $obj = SOAP::WSDL::XSD::Typelib::Builtin::anyType->new();
|
|||||||
|
|
||||||
timethese 10000, {
|
timethese 10000, {
|
||||||
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anyType->new() },
|
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anyType->new() },
|
||||||
'new with params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anyType->new({
|
|
||||||
xmlns => 'urn:Test'
|
|
||||||
}) },
|
|
||||||
'set_FOO' => sub { $obj->set_xmlns('Test') },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
my $data;
|
|
||||||
timethese 1000000, {
|
|
||||||
'set_FOO' => sub { $obj->set_xmlns('Test') },
|
|
||||||
'get_FOO' => sub { $data = $obj->get_xmlns() },
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -9,14 +9,13 @@ my $obj = SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new();
|
|||||||
timethese 10000, {
|
timethese 10000, {
|
||||||
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new() },
|
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new() },
|
||||||
'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new({
|
'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new({
|
||||||
xmlns => 'urn:Test',
|
|
||||||
value => 'Teststring'
|
value => 'Teststring'
|
||||||
}) },
|
}) },
|
||||||
'set_FOO' => sub { $obj->set_xmlns('Test') },
|
'set_FOO' => sub { $obj->set_value('Test') },
|
||||||
};
|
};
|
||||||
|
|
||||||
my $data;
|
my $data;
|
||||||
timethese 1000000, {
|
timethese 1000000, {
|
||||||
'set_FOO' => sub { $obj->set_xmlns('Test') },
|
'set_FOO' => sub { $obj->set_value('Test') },
|
||||||
'get_FOO' => sub { $data = $obj->get_xmlns() },
|
'get_FOO' => sub { $data = $obj->get_value() },
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -6,17 +6,20 @@ use SOAP::WSDL::XSD::Typelib::Builtin::string;
|
|||||||
|
|
||||||
my $obj = SOAP::WSDL::XSD::Typelib::Builtin::string->new();
|
my $obj = SOAP::WSDL::XSD::Typelib::Builtin::string->new();
|
||||||
|
|
||||||
timethese 10000, {
|
timethese 20000, {
|
||||||
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new() },
|
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new() },
|
||||||
'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new({
|
'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new({
|
||||||
xmlns => 'urn:Test',
|
|
||||||
value => 'Teststring'
|
value => 'Teststring'
|
||||||
}) },
|
}) },
|
||||||
'set_FOO' => sub { $obj->set_xmlns('Test') },
|
};
|
||||||
|
|
||||||
|
$obj->set_value('Foobar');
|
||||||
|
timethese 20000, {
|
||||||
|
serialize => sub { $obj->serialize() }
|
||||||
};
|
};
|
||||||
|
|
||||||
my $data;
|
my $data;
|
||||||
timethese 1000000, {
|
timethese 1000000, {
|
||||||
'set_FOO' => sub { $obj->set_xmlns('Test') },
|
'set_FOO' => sub { $obj->set_value('Test') },
|
||||||
'get_FOO' => sub { $data = $obj->get_xmlns() },
|
'get_FOO' => sub { $data = $obj->get_value() },
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,324 +0,0 @@
|
|||||||
================ SmallProf version 2.02 ================
|
|
||||||
Profile of ../lib/SOAP/WSDL/Expat/MessageParser.pm Page 1
|
|
||||||
=================================================================
|
|
||||||
count wall tm cpu time line
|
|
||||||
0 0.00000 0.00000 1:#!/usr/bin/perl
|
|
||||||
0 0.00000 0.00000 2:package SOAP::WSDL::Expat::MessageParser;
|
|
||||||
0 0.00000 0.00000 3:use strict;
|
|
||||||
0 0.00000 0.00000 4:use warnings;
|
|
||||||
0 0.00000 0.00000 5:use SOAP::WSDL::XSD::Typelib::Builtin;
|
|
||||||
0 0.00000 0.00000 6:use XML::Parser::Expat;
|
|
||||||
0 0.00000 0.00000 7:
|
|
||||||
0 0.00000 0.00000 8:sub new {
|
|
||||||
1 0.00000 0.00000 9: my ($class, $args) = @_;
|
|
||||||
0 0.00000 0.00000 10: my $self = {
|
|
||||||
0 0.00000 0.00000 11: class_resolver => $args->{
|
|
||||||
1 0.00001 0.00000 12: strict => exists $args->{ strict } ?
|
|
||||||
0 0.00000 0.00000 13: };
|
|
||||||
1 0.00001 0.00000 14: bless $self, $class;
|
|
||||||
1 0.02383 0.02000 15: return $self;
|
|
||||||
0 0.00000 0.00000 16:}
|
|
||||||
0 0.00000 0.00000 17:
|
|
||||||
0 0.00000 0.00000 18:sub class_resolver {
|
|
||||||
0 0.00000 0.00000 19: my $self = shift;
|
|
||||||
0 0.00000 0.00000 20: $self->{ class_resolver } = shift;
|
|
||||||
0 0.00000 0.00000 21: return;
|
|
||||||
0 0.00000 0.00000 22:}
|
|
||||||
0 0.00000 0.00000 23:
|
|
||||||
0 0.00000 0.00000 24:sub _initialize {
|
|
||||||
1000 0.00098 0.01000 25: my ($self, $parser) = @_;
|
|
||||||
1000 0.04304 0.02000 26: $self->{ parser } = $parser;
|
|
||||||
0 0.00000 0.00000 27:
|
|
||||||
1000 0.00140 0.01000 28: delete $self->{ data };
|
|
||||||
0 0.00000 0.00000 29:
|
|
||||||
1000 0.00042 0.03000 30: my $characters;
|
|
||||||
0 0.00000 0.00000 31: #my @characters_from = ();
|
|
||||||
1000 0.00059 0.00000 32: my $current = undef;
|
|
||||||
1000 0.00093 0.00000 33: my $list = []; #
|
|
||||||
1000 0.00065 0.02000 34: my $path = []; #
|
|
||||||
1000 0.00064 0.02000 35: my $skip = 0; #
|
|
||||||
1000 0.00049 0.01000 36: my $current_part = q{}; # are
|
|
||||||
0 0.00000 0.00000 37:
|
|
||||||
1000 0.00041 0.00000 38: my $depth = 0;
|
|
||||||
0 0.00000 0.00000 39:
|
|
||||||
0 0.00000 0.00000 40: my %content_check = $self->{strict}
|
|
||||||
0 0.00000 0.00000 41: ? (
|
|
||||||
0 0.00000 0.00000 42: 0 => sub {
|
|
||||||
1000 0.00115 0.00000 43: die "Bad top node $_[1]"
|
|
||||||
1000 0.01666 0.03000 44: die "Bad namespace for
|
|
||||||
0 0.00000 0.00000 45: if $_[0]-
|
|
||||||
1000 0.00051 0.02000 46: $depth++;
|
|
||||||
1000 0.00413 0.01000 47: return;
|
|
||||||
0 0.00000 0.00000 48: },
|
|
||||||
0 0.00000 0.00000 49: 1 => sub {
|
|
||||||
1000 0.00050 0.02000 50: $depth++;
|
|
||||||
1000 0.03690 0.04000 51: return;
|
|
||||||
0 0.00000 0.00000 52: }
|
|
||||||
0 0.00000 0.00000 53: )
|
|
||||||
1000 0.01120 0.03000 54: : ();
|
|
||||||
0 0.00000 0.00000 55:
|
|
||||||
0 0.00000 0.00000 56: my $char_handler = sub {
|
|
||||||
================ SmallProf version 2.02 ================
|
|
||||||
Profile of ../lib/SOAP/WSDL/Expat/MessageParser.pm Page 2
|
|
||||||
=================================================================
|
|
||||||
count wall tm cpu time line
|
|
||||||
0 0.00000 0.00000 57: # push @characters_from, $_[1] if
|
|
||||||
80000 0.19296 1.00000 58: $characters .= $_[1] if $_[1]
|
|
||||||
0 0.00000 0.00000 59:
|
|
||||||
80000 0.27660 0.97000 60: return;
|
|
||||||
1000 0.00449 0.00000 61: };
|
|
||||||
0 0.00000 0.00000 62:
|
|
||||||
0 0.00000 0.00000 63: # use "globals" for speed
|
|
||||||
1000 0.00162 0.01000 64: my ($_prefix, $_method,
|
|
||||||
0 0.00000 0.00000 65: $_class) = ();
|
|
||||||
0 0.00000 0.00000 66:
|
|
||||||
0 0.00000 0.00000 67: no strict qw(refs);
|
|
||||||
0 0.00000 0.00000 68: $parser->setHandlers(
|
|
||||||
0 0.00000 0.00000 69: Start => sub {
|
|
||||||
0 0.00000 0.00000 70: # my ($parser, $element, %_attrs)
|
|
||||||
0 0.00000 0.00000 71: # $depth = $parser->depth();
|
|
||||||
0 0.00000 0.00000 72:
|
|
||||||
0 0.00000 0.00000 73: # call methods without using
|
|
||||||
0 0.00000 0.00000 74: # That's slightly faster than
|
|
||||||
0 0.00000 0.00000 75: # and we don't have to pass $_[1]
|
|
||||||
0 0.00000 0.00000 76: # Yup, that's dirty.
|
|
||||||
28000 0.03037 0.32000 77: return &{$content_check{ $depth
|
|
||||||
0 0.00000 0.00000 78:
|
|
||||||
26000 0.02735 0.15000 79: push @{ $path }, $_[1]; #
|
|
||||||
26000 0.01366 0.29000 80: return if $skip; #
|
|
||||||
0 0.00000 0.00000 81:
|
|
||||||
0 0.00000 0.00000 82: # resolve class of this element
|
|
||||||
0 0.00000 0.00000 83: $_class = $self->{ class_resolver
|
|
||||||
0 0.00000 0.00000 84: or die "Cannot resolve class
|
|
||||||
26000 0.28196 0.56000 85: . join('/', @{ $path }) .
|
|
||||||
0 0.00000 0.00000 86:
|
|
||||||
26000 0.01695 0.35000 87: if ($_class eq '__SKIP__') {
|
|
||||||
0 0.00000 0.00000 88: $skip = join('/', @{ $path
|
|
||||||
0 0.00000 0.00000 89: $self->setHandlers( Char =>
|
|
||||||
0 0.00000 0.00000 90: return;
|
|
||||||
0 0.00000 0.00000 91: }
|
|
||||||
0 0.00000 0.00000 92:
|
|
||||||
26000 0.02064 0.35000 93: push @$list, $current; # step
|
|
||||||
0 0.00000 0.00000 94:
|
|
||||||
26000 0.02021 0.23000 95: $characters = q(); # empty
|
|
||||||
0 0.00000 0.00000 96: #@characters_from = ();
|
|
||||||
0 0.00000 0.00000 97:
|
|
||||||
0 0.00000 0.00000 98: # Check whether we have a builtin
|
|
||||||
0 0.00000 0.00000 99: # We could replace this with
|
|
||||||
0 0.00000 0.00000 100: # match is a bit faster if the
|
|
||||||
0 0.00000 0.00000 101: # if $class matches...
|
|
||||||
26000 0.01676 0.21000 102: if (index $_class,
|
|
||||||
0 0.00000 0.00000 103: # check wheter there is a
|
|
||||||
0 0.00000 0.00000 104: # or a "new" method
|
|
||||||
0 0.00000 0.00000 105: # If not, require it - all
|
|
||||||
0 0.00000 0.00000 106: # define new()
|
|
||||||
0 0.00000 0.00000 107: # This is not exactly the
|
|
||||||
0 0.00000 0.00000 108: defined *{ "$_class\::new" }{
|
|
||||||
26000 0.07804 0.33000 109: or scalar @{ *{
|
|
||||||
0 0.00000 0.00000 110: or eval "require $_class"
|
|
||||||
0 0.00000 0.00000 111: or die $@;
|
|
||||||
0 0.00000 0.00000 112: }
|
|
||||||
================ SmallProf version 2.02 ================
|
|
||||||
Profile of ../lib/SOAP/WSDL/Expat/MessageParser.pm Page 3
|
|
||||||
=================================================================
|
|
||||||
count wall tm cpu time line
|
|
||||||
0 0.00000 0.00000 113:
|
|
||||||
26000 0.45038 0.81000 114: $current = $_class->new({
|
|
||||||
0 0.00000 0.00000 115:
|
|
||||||
0 0.00000 0.00000 116: # remember top level element
|
|
||||||
0 0.00000 0.00000 117: exists $self->{ data }
|
|
||||||
26000 0.02113 0.22000 118: or ($self->{ data } =
|
|
||||||
26000 0.01267 0.25000 119: $depth++;
|
|
||||||
26000 0.07978 0.40000 120: return;
|
|
||||||
0 0.00000 0.00000 121: },
|
|
||||||
0 0.00000 0.00000 122:
|
|
||||||
0 0.00000 0.00000 123: Char => $char_handler,
|
|
||||||
0 0.00000 0.00000 124:
|
|
||||||
0 0.00000 0.00000 125: End => sub {
|
|
||||||
0 0.00000 0.00000 126:
|
|
||||||
28000 0.01974 0.26000 127: pop @{ $path };
|
|
||||||
0 0.00000 0.00000 128:
|
|
||||||
28000 0.01197 0.18000 129: if ($skip) {
|
|
||||||
0 0.00000 0.00000 130: return if $skip ne join '/',
|
|
||||||
0 0.00000 0.00000 131: $skip = 0;
|
|
||||||
0 0.00000 0.00000 132: $_[0]->setHandler( Char =>
|
|
||||||
0 0.00000 0.00000 133: return;
|
|
||||||
0 0.00000 0.00000 134: }
|
|
||||||
0 0.00000 0.00000 135:
|
|
||||||
28000 0.01687 0.25000 136: $depth--;
|
|
||||||
0 0.00000 0.00000 137:
|
|
||||||
0 0.00000 0.00000 138: # This one easily handles ignores
|
|
||||||
28000 0.10769 0.33000 139: return if not ref $list->[-1];
|
|
||||||
0 0.00000 0.00000 140:
|
|
||||||
0 0.00000 0.00000 141: # set characters in current if we
|
|
||||||
0 0.00000 0.00000 142: # we may have characters in
|
|
||||||
0 0.00000 0.00000 143: # too - maybe we should rely on
|
|
||||||
0 0.00000 0.00000 144: # may get a speedup by defining a
|
|
||||||
0 0.00000 0.00000 145: # and looking it up via exists
|
|
||||||
0 0.00000 0.00000 146:# if ( $current-
|
|
||||||
0 0.00000 0.00000 147:# $current->set_value(
|
|
||||||
0 0.00000 0.00000 148:# }
|
|
||||||
0 0.00000 0.00000 149: # currently doesn't work, as
|
|
||||||
0 0.00000 0.00000 150: # maybe change ?
|
|
||||||
25000 0.21156 0.56000 151: $current->set_value( $characters
|
|
||||||
0 0.00000 0.00000 152: #$current->set_value( join
|
|
||||||
25000 0.08260 0.32000 153: $characters = q{};
|
|
||||||
0 0.00000 0.00000 154:# undef @characters_from;
|
|
||||||
0 0.00000 0.00000 155: # set appropriate attribute in
|
|
||||||
0 0.00000 0.00000 156: # multiple values must be
|
|
||||||
0 0.00000 0.00000 157: #$_method = "add_$_localname";
|
|
||||||
25000 0.01494 0.21000 158: $_method = "add_$_[1]";
|
|
||||||
25000 0.55155 0.86000 159: $list->[-1]->$_method( $current
|
|
||||||
0 0.00000 0.00000 160:
|
|
||||||
25000 0.02121 0.14000 161: $current = pop @$list;
|
|
||||||
25000 0.07002 0.34000 162: return;
|
|
||||||
0 0.00000 0.00000 163: }
|
|
||||||
1000 0.12135 0.08000 164: );
|
|
||||||
1000 0.13602 0.11000 165: return $parser;
|
|
||||||
0 0.00000 0.00000 166:}
|
|
||||||
0 0.00000 0.00000 167:
|
|
||||||
0 0.00000 0.00000 168:sub parse {
|
|
||||||
================ SmallProf version 2.02 ================
|
|
||||||
Profile of ../lib/SOAP/WSDL/Expat/MessageParser.pm Page 4
|
|
||||||
=================================================================
|
|
||||||
count wall tm cpu time line
|
|
||||||
1000 0.00055 0.03000 169: eval {
|
|
||||||
1000 0.07420 0.07000 170: $_[0]->_initialize(
|
|
||||||
0 0.00000 0.00000 171: XML::Parser::Expat->new(
|
|
||||||
0 0.00000 0.00000 172: Namespaces => 1
|
|
||||||
0 0.00000 0.00000 173: )
|
|
||||||
0 0.00000 0.00000 174: )->parse( $_[1] );
|
|
||||||
1000 0.01030 0.02000 175: $_[0]->{ parser }->release();
|
|
||||||
0 0.00000 0.00000 176: };
|
|
||||||
1000 0.00034 0.00000 177: die $@ if $@;
|
|
||||||
1000 2.73620 2.67000 178: return $_[0]->{ data };
|
|
||||||
0 0.00000 0.00000 179:}
|
|
||||||
0 0.00000 0.00000 180:
|
|
||||||
0 0.00000 0.00000 181:sub parsefile {
|
|
||||||
0 0.00000 0.00000 182: eval {
|
|
||||||
0 0.00000 0.00000 183: $_[0]->_initialize(
|
|
||||||
0 0.00000 0.00000 184: $_[0]->{ parser }->release();
|
|
||||||
0 0.00000 0.00000 185: };
|
|
||||||
0 0.00000 0.00000 186: die $@, $_[1] if $@;
|
|
||||||
0 0.00000 0.00000 187: return $_[0]->{ data };
|
|
||||||
0 0.00000 0.00000 188:}
|
|
||||||
0 0.00000 0.00000 189:
|
|
||||||
0 0.00000 0.00000 190:# SAX-like aliases
|
|
||||||
0 0.00000 0.00000 191:sub parse_string;
|
|
||||||
0 0.00000 0.00000 192:*parse_string = \&parse;
|
|
||||||
0 0.00000 0.00000 193:
|
|
||||||
0 0.00000 0.00000 194:sub parse_file;
|
|
||||||
0 0.00000 0.00000 195:*parse_file = \&parsefile;
|
|
||||||
0 0.00000 0.00000 196:
|
|
||||||
0 0.00000 0.00000 197:sub get_data {
|
|
||||||
0 0.00000 0.00000 198: return $_[0]->{ data };
|
|
||||||
0 0.00000 0.00000 199:}
|
|
||||||
0 0.00000 0.00000 200:
|
|
||||||
0 0.00000 0.00000 201:1;
|
|
||||||
0 0.00000 0.00000 202:
|
|
||||||
0 0.00000 0.00000 203:=pod
|
|
||||||
================ SmallProf version 2.02 ================
|
|
||||||
Profile of 01_expat.t Page 5
|
|
||||||
=================================================================
|
|
||||||
count wall tm cpu time line
|
|
||||||
0 0.00000 0.00000 1:#!/usr/bin/perl -w
|
|
||||||
1 0.00003 0.00000 2:%DB::packages=(SOAP::WSDL::Expat::MessagePars
|
|
||||||
0 0.00000 0.00000 3:use strict;
|
|
||||||
0 0.00000 0.00000 4:use warnings;
|
|
||||||
0 0.00000 0.00000 5:use lib '../lib';
|
|
||||||
0 0.00000 0.00000 6:use lib 'lib';
|
|
||||||
0 0.00000 0.00000 7:use lib '../t/lib';
|
|
||||||
0 0.00000 0.00000 8:use SOAP::WSDL::SAX::MessageHandler;
|
|
||||||
0 0.00000 0.00000 9:
|
|
||||||
0 0.00000 0.00000 10:use Benchmark;
|
|
||||||
0 0.00000 0.00000 11:use SOAP::WSDL::Expat::MessageParser;
|
|
||||||
0 0.00000 0.00000 12:use SOAP::WSDL::Expat::Message2Hash;
|
|
||||||
0 0.00000 0.00000 13:use XML::Simple;
|
|
||||||
0 0.00000 0.00000 14:use XML::LibXML;
|
|
||||||
0 0.00000 0.00000 15:use MyComplexType;
|
|
||||||
0 0.00000 0.00000 16:use MyElement;
|
|
||||||
0 0.00000 0.00000 17:use MySimpleType;
|
|
||||||
0 0.00000 0.00000 18:
|
|
||||||
0 0.00000 0.00000 19:my $xml = q{<SOAP-ENV:Envelope
|
|
||||||
0 0.00000 0.00000 20: xmlns:SOAP-
|
|
||||||
0 0.00000 0.00000 21: <SOAP-
|
|
||||||
0 0.00000 0.00000 22: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 23: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 24: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 25: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 26: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 27: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 28: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 29: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 30: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 31: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 32: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 33: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 34: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 35: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 36: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 37: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 38: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 39: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 40: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 41: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 42: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 43: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 44: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 45: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 46: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 47: </MyAtomicComplexTypeElement>
|
|
||||||
0 0.00000 0.00000 48:</SOAP-ENV:Body></SOAP-ENV:Envelope>};
|
|
||||||
0 0.00000 0.00000 49:
|
|
||||||
0 0.00000 0.00000 50:
|
|
||||||
0 0.00000 0.00000 51:my $parser =
|
|
||||||
0 0.00000 0.00000 52: class_resolver => 'FakeResolver'
|
|
||||||
0 0.00000 0.00000 53:});
|
|
||||||
0 0.00000 0.00000 54:
|
|
||||||
0 0.00000 0.00000 55:my $hash_parser =
|
|
||||||
0 0.00000 0.00000 56:
|
|
||||||
================ SmallProf version 2.02 ================
|
|
||||||
Profile of 01_expat.t Page 6
|
|
||||||
=================================================================
|
|
||||||
count wall tm cpu time line
|
|
||||||
0 0.00000 0.00000 57:$XML::Simple::PREFERRED_PARSER =
|
|
||||||
0 0.00000 0.00000 58:
|
|
||||||
0 0.00000 0.00000 59:my $libxml = XML::LibXML->new();
|
|
||||||
0 0.00000 0.00000 60:my @data;
|
|
||||||
0 0.00000 0.00000 61:timethese 1000,
|
|
||||||
0 0.00000 0.00000 62:{
|
|
||||||
0 0.00000 0.00000 63: # 'Hash (SOAP:WSDL)' => sub { push @data,
|
|
||||||
0 0.00000 0.00000 64: 'SOAP::WSDL' => sub { push @data, $parser-
|
|
||||||
0 0.00000 0.00000 65:# 'XML::Simple (Hash)' => sub { push @data,
|
|
||||||
0 0.00000 0.00000 66:# 'XML::LibXML (DOM)' => sub { push @data,
|
|
||||||
0 0.00000 0.00000 67:};
|
|
||||||
0 0.00000 0.00000 68:
|
|
||||||
0 0.00000 0.00000 69:# use Test::More tests => 1;
|
|
||||||
0 0.00000 0.00000 70:#is $parser->get_data(),
|
|
||||||
0 0.00000 0.00000 71:# . q{<test >Test</test><test2
|
|
||||||
0 0.00000 0.00000 72:# , 'Content comparison';
|
|
||||||
0 0.00000 0.00000 73:
|
|
||||||
0 0.00000 0.00000 74:#$parser->class_resolver( 'FakeResolver2' );
|
|
||||||
0 0.00000 0.00000 75:
|
|
||||||
0 0.00000 0.00000 76:
|
|
||||||
0 0.00000 0.00000 77:# data classes reside in t/lib/Typelib/
|
|
||||||
0 0.00000 0.00000 78:BEGIN {
|
|
||||||
0 0.00000 0.00000 79: package FakeResolver;
|
|
||||||
0 0.00000 0.00000 80: {
|
|
||||||
0 0.00000 0.00000 81: my %class_list = (
|
|
||||||
0 0.00000 0.00000 82: 'MyAtomicComplexTypeElement' =>
|
|
||||||
0 0.00000 0.00000 83: 'MyAtomicComplexTypeElement/test'
|
|
||||||
0 0.00000 0.00000 84:
|
|
||||||
0 0.00000 0.00000 85: );
|
|
||||||
0 0.00000 0.00000 86:
|
|
||||||
0 0.00000 0.00000 87: sub get_map { return \%class_list };
|
|
||||||
0 0.00000 0.00000 88:
|
|
||||||
0 0.00000 0.00000 89: sub new { return bless {},
|
|
||||||
0 0.00000 0.00000 90:
|
|
||||||
0 0.00000 0.00000 91: sub get_class {
|
|
||||||
0 0.00000 0.00000 92: my $name = join('/', @{ $_[1] });
|
|
||||||
0 0.00000 0.00000 93: return ($class_list{ $name }) ?
|
|
||||||
0 0.00000 0.00000 94: : warn "no class found for
|
|
||||||
0 0.00000 0.00000 95: };
|
|
||||||
0 0.00000 0.00000 96: };
|
|
||||||
0 0.00000 0.00000 97:};
|
|
||||||
@@ -1,315 +0,0 @@
|
|||||||
================ SmallProf version 2.02 ================
|
|
||||||
Profile of ../lib/SOAP/WSDL/Expat/MessageParser.pm Page 1
|
|
||||||
=================================================================
|
|
||||||
count wall tm cpu time line
|
|
||||||
0 0.00000 0.00000 1:#!/usr/bin/perl
|
|
||||||
0 0.00000 0.00000 2:package SOAP::WSDL::Expat::MessageParser;
|
|
||||||
0 0.00000 0.00000 3:use strict;
|
|
||||||
0 0.00000 0.00000 4:use warnings;
|
|
||||||
0 0.00000 0.00000 5:use SOAP::WSDL::XSD::Typelib::Builtin;
|
|
||||||
0 0.00000 0.00000 6:use XML::Parser::Expat;
|
|
||||||
0 0.00000 0.00000 7:
|
|
||||||
0 0.00000 0.00000 8:sub new {
|
|
||||||
1 0.00000 0.00000 9: my ($class, $args) = @_;
|
|
||||||
0 0.00000 0.00000 10: my $self = {
|
|
||||||
0 0.00000 0.00000 11: class_resolver => $args->{
|
|
||||||
1 0.00001 0.00000 12: strict => exists $args->{ strict } ?
|
|
||||||
0 0.00000 0.00000 13: };
|
|
||||||
1 0.00001 0.00000 14: bless $self, $class;
|
|
||||||
1 0.02309 0.03000 15: return $self;
|
|
||||||
0 0.00000 0.00000 16:}
|
|
||||||
0 0.00000 0.00000 17:
|
|
||||||
0 0.00000 0.00000 18:sub class_resolver {
|
|
||||||
1 0.00000 0.00000 19: my $self = shift;
|
|
||||||
1 2.74336 2.69000 20: $self->{ class_resolver } = shift;
|
|
||||||
0 0.00000 0.00000 21:}
|
|
||||||
0 0.00000 0.00000 22:
|
|
||||||
0 0.00000 0.00000 23:sub _initialize {
|
|
||||||
1000 0.00163 0.01000 24: my ($self, $parser) = @_;
|
|
||||||
1000 0.03682 0.05000 25: $self->{ parser } = $parser;
|
|
||||||
0 0.00000 0.00000 26:
|
|
||||||
1000 0.00138 0.01000 27: delete $self->{ data };
|
|
||||||
0 0.00000 0.00000 28:
|
|
||||||
1000 0.00048 0.01000 29: my $characters;
|
|
||||||
1000 0.00091 0.00000 30: my $current = undef;
|
|
||||||
1000 0.00097 0.01000 31: my $list = []; #
|
|
||||||
1000 0.00107 0.01000 32: my $path = []; #
|
|
||||||
1000 0.00054 0.01000 33: my $skip = 0; #
|
|
||||||
1000 0.00053 0.01000 34: my $current_part = q{}; # are
|
|
||||||
0 0.00000 0.00000 35:
|
|
||||||
1000 0.00041 0.02000 36: my $depth = 0;
|
|
||||||
0 0.00000 0.00000 37:
|
|
||||||
0 0.00000 0.00000 38: my %content_check = $self->{strict}
|
|
||||||
0 0.00000 0.00000 39: ? (
|
|
||||||
0 0.00000 0.00000 40: 0 => sub {
|
|
||||||
1000 0.00097 0.02000 41: die "Bad top node $_[1]"
|
|
||||||
1000 0.01651 0.00000 42: die "Bad namespace for
|
|
||||||
0 0.00000 0.00000 43: if $_[0]-
|
|
||||||
1000 0.00068 0.00000 44: $depth++;
|
|
||||||
1000 0.00441 0.02000 45: return;
|
|
||||||
0 0.00000 0.00000 46: },
|
|
||||||
0 0.00000 0.00000 47: 1 => sub {
|
|
||||||
1000 0.00369 0.02000 48: die "Bad node $_[1].
|
|
||||||
1000 0.00060 0.00000 49: $depth++;
|
|
||||||
1000 0.03693 0.03000 50: return;
|
|
||||||
0 0.00000 0.00000 51: }
|
|
||||||
0 0.00000 0.00000 52: )
|
|
||||||
1000 0.01252 0.01000 53: : ();
|
|
||||||
0 0.00000 0.00000 54:
|
|
||||||
0 0.00000 0.00000 55: # use "globals" for speed
|
|
||||||
1000 0.00095 0.01000 56: my ($_prefix, $_method,
|
|
||||||
================ SmallProf version 2.02 ================
|
|
||||||
Profile of ../lib/SOAP/WSDL/Expat/MessageParser.pm Page 2
|
|
||||||
=================================================================
|
|
||||||
count wall tm cpu time line
|
|
||||||
0 0.00000 0.00000 57: $_class) = ();
|
|
||||||
0 0.00000 0.00000 58:
|
|
||||||
0 0.00000 0.00000 59: no strict qw(refs);
|
|
||||||
0 0.00000 0.00000 60: $parser->setHandlers(
|
|
||||||
0 0.00000 0.00000 61: Start => sub {
|
|
||||||
0 0.00000 0.00000 62: # my ($parser, $element, %_attrs)
|
|
||||||
0 0.00000 0.00000 63: # $depth = $parser->depth();
|
|
||||||
0 0.00000 0.00000 64:
|
|
||||||
0 0.00000 0.00000 65: # call methods without using
|
|
||||||
0 0.00000 0.00000 66: # That's slightly faster than
|
|
||||||
0 0.00000 0.00000 67: # and we don't have to pass $_[1]
|
|
||||||
0 0.00000 0.00000 68: # Yup, that's dirty.
|
|
||||||
28000 0.03090 0.31000 69: return &{$content_check{ $depth
|
|
||||||
0 0.00000 0.00000 70:
|
|
||||||
26000 0.03309 0.32000 71: push @{ $path }, $_[1]; #
|
|
||||||
26000 0.01337 0.21000 72: return if $skip; #
|
|
||||||
0 0.00000 0.00000 73:
|
|
||||||
0 0.00000 0.00000 74: # resolve class of this element
|
|
||||||
0 0.00000 0.00000 75: $_class = $self->{ class_resolver
|
|
||||||
0 0.00000 0.00000 76: or die "Cannot resolve class
|
|
||||||
26000 0.28467 0.53000 77: . join('/', @{ $path }) .
|
|
||||||
0 0.00000 0.00000 78:
|
|
||||||
0 0.00000 0.00000 79: # maybe write as "return $skip =
|
|
||||||
0 0.00000 0.00000 80: # would save a BLOCK...
|
|
||||||
26000 0.03919 0.30000 81: return $skip = join('/', @{ $path
|
|
||||||
0 0.00000 0.00000 82:
|
|
||||||
26000 0.05079 0.22000 83: push @$list, $current; # step
|
|
||||||
0 0.00000 0.00000 84:
|
|
||||||
26000 0.07934 0.26000 85: $characters = q(); # empty
|
|
||||||
0 0.00000 0.00000 86:
|
|
||||||
0 0.00000 0.00000 87: # Check whether we have a builtin
|
|
||||||
0 0.00000 0.00000 88: # We could replace this with
|
|
||||||
0 0.00000 0.00000 89: # match is a bit faster if the
|
|
||||||
0 0.00000 0.00000 90: # if $class matches...
|
|
||||||
26000 0.01981 0.22000 91: if (index $_class,
|
|
||||||
0 0.00000 0.00000 92: # check wheter there is a
|
|
||||||
0 0.00000 0.00000 93: # or a "new" method
|
|
||||||
0 0.00000 0.00000 94: # If not, require it - all
|
|
||||||
0 0.00000 0.00000 95: # define new()
|
|
||||||
0 0.00000 0.00000 96: # This is not exactly the
|
|
||||||
0 0.00000 0.00000 97: defined *{ "$_class\::new" }{
|
|
||||||
26000 0.08308 0.26000 98: or scalar @{ *{
|
|
||||||
0 0.00000 0.00000 99: or eval "require $_class"
|
|
||||||
0 0.00000 0.00000 100: or die $@;
|
|
||||||
0 0.00000 0.00000 101: }
|
|
||||||
0 0.00000 0.00000 102:
|
|
||||||
26000 0.45611 0.64000 103: $current = $_class->new({
|
|
||||||
0 0.00000 0.00000 104:
|
|
||||||
0 0.00000 0.00000 105: # remember top level element
|
|
||||||
0 0.00000 0.00000 106: exists $self->{ data }
|
|
||||||
26000 0.02518 0.26000 107: or ($self->{ data } =
|
|
||||||
26000 0.01496 0.32000 108: $depth++;
|
|
||||||
26000 0.07949 0.39000 109: return;
|
|
||||||
0 0.00000 0.00000 110: },
|
|
||||||
0 0.00000 0.00000 111:
|
|
||||||
0 0.00000 0.00000 112: Char => sub {
|
|
||||||
================ SmallProf version 2.02 ================
|
|
||||||
Profile of ../lib/SOAP/WSDL/Expat/MessageParser.pm Page 3
|
|
||||||
=================================================================
|
|
||||||
count wall tm cpu time line
|
|
||||||
80000 0.05801 0.73000 113: return if $skip;
|
|
||||||
80000 0.38097 1.05000 114: return if $_[1] =~m{ \A \s* \z
|
|
||||||
25000 0.01804 0.24000 115: $characters .= $_[1];
|
|
||||||
25000 0.07404 0.32000 116: return;
|
|
||||||
0 0.00000 0.00000 117: },
|
|
||||||
0 0.00000 0.00000 118:
|
|
||||||
0 0.00000 0.00000 119: End => sub {
|
|
||||||
0 0.00000 0.00000 120:
|
|
||||||
28000 0.02209 0.25000 121: pop @{ $path };
|
|
||||||
0 0.00000 0.00000 122:
|
|
||||||
28000 0.01658 0.29000 123: if ($skip) {
|
|
||||||
0 0.00000 0.00000 124: return if $skip ne join '/',
|
|
||||||
0 0.00000 0.00000 125: $skip = 0;
|
|
||||||
0 0.00000 0.00000 126: return;
|
|
||||||
0 0.00000 0.00000 127: }
|
|
||||||
0 0.00000 0.00000 128:
|
|
||||||
28000 0.01628 0.26000 129: $depth--;
|
|
||||||
0 0.00000 0.00000 130:
|
|
||||||
0 0.00000 0.00000 131: # This one easily handles ignores
|
|
||||||
28000 0.11185 0.27000 132: return if not ref $list->[-1];
|
|
||||||
0 0.00000 0.00000 133:
|
|
||||||
0 0.00000 0.00000 134: # set characters in current if we
|
|
||||||
0 0.00000 0.00000 135: # we may have characters in
|
|
||||||
0 0.00000 0.00000 136: # too - maybe we should rely on
|
|
||||||
0 0.00000 0.00000 137: # may get a speedup by defining a
|
|
||||||
0 0.00000 0.00000 138: # and looking it up via exists
|
|
||||||
0 0.00000 0.00000 139:# if ( $current-
|
|
||||||
0 0.00000 0.00000 140:# $current->set_value(
|
|
||||||
0 0.00000 0.00000 141:# }
|
|
||||||
0 0.00000 0.00000 142: # currently doesn't work, as
|
|
||||||
0 0.00000 0.00000 143: # maybe change ?
|
|
||||||
25000 0.28121 0.53000 144: $current->set_value( $characters
|
|
||||||
25000 0.01730 0.20000 145: $characters = q{};
|
|
||||||
0 0.00000 0.00000 146: # set appropriate attribute in
|
|
||||||
0 0.00000 0.00000 147: # multiple values must be
|
|
||||||
0 0.00000 0.00000 148: #$_method = "add_$_localname";
|
|
||||||
25000 0.01976 0.23000 149: $_method = "add_$_[1]";
|
|
||||||
25000 0.55083 0.85000 150: $list->[-1]->$_method( $current
|
|
||||||
0 0.00000 0.00000 151:
|
|
||||||
25000 0.02277 0.25000 152: $current = pop @$list;
|
|
||||||
25000 0.06949 0.36000 153: return;
|
|
||||||
0 0.00000 0.00000 154: }
|
|
||||||
1000 0.12369 0.12000 155: );
|
|
||||||
1000 0.13620 0.08000 156: return $parser;
|
|
||||||
0 0.00000 0.00000 157:}
|
|
||||||
0 0.00000 0.00000 158:
|
|
||||||
0 0.00000 0.00000 159:sub parse {
|
|
||||||
1000 0.00065 0.02000 160: eval {
|
|
||||||
1000 0.07514 0.09000 161: $_[0]->_initialize(
|
|
||||||
0 0.00000 0.00000 162: XML::Parser::Expat->new(
|
|
||||||
0 0.00000 0.00000 163: Namespaces => 1
|
|
||||||
0 0.00000 0.00000 164: )
|
|
||||||
0 0.00000 0.00000 165: )->parse( $_[1] );
|
|
||||||
1000 0.01077 0.02000 166: $_[0]->{ parser }->release();
|
|
||||||
0 0.00000 0.00000 167: };
|
|
||||||
1000 0.00051 0.00000 168: die $@ if $@;
|
|
||||||
================ SmallProf version 2.02 ================
|
|
||||||
Profile of ../lib/SOAP/WSDL/Expat/MessageParser.pm Page 4
|
|
||||||
=================================================================
|
|
||||||
count wall tm cpu time line
|
|
||||||
1000 0.01431 0.04000 169: return $_[0]->{ data };
|
|
||||||
0 0.00000 0.00000 170:}
|
|
||||||
0 0.00000 0.00000 171:
|
|
||||||
0 0.00000 0.00000 172:sub parsefile {
|
|
||||||
0 0.00000 0.00000 173: eval {
|
|
||||||
0 0.00000 0.00000 174: $_[0]->_initialize(
|
|
||||||
0 0.00000 0.00000 175: $_[0]->{ parser }->release();
|
|
||||||
0 0.00000 0.00000 176: };
|
|
||||||
0 0.00000 0.00000 177: die $@, $_[1] if $@;
|
|
||||||
0 0.00000 0.00000 178: return $_[0]->{ data };
|
|
||||||
0 0.00000 0.00000 179:}
|
|
||||||
0 0.00000 0.00000 180:
|
|
||||||
0 0.00000 0.00000 181:# SAX-like aliases
|
|
||||||
0 0.00000 0.00000 182:sub parse_string;
|
|
||||||
0 0.00000 0.00000 183:*parse_string = \&parse;
|
|
||||||
0 0.00000 0.00000 184:
|
|
||||||
0 0.00000 0.00000 185:sub parse_file;
|
|
||||||
0 0.00000 0.00000 186:*parse_file = \&parsefile;
|
|
||||||
0 0.00000 0.00000 187:
|
|
||||||
0 0.00000 0.00000 188:sub get_data {
|
|
||||||
0 0.00000 0.00000 189: return $_[0]->{ data };
|
|
||||||
0 0.00000 0.00000 190:}
|
|
||||||
0 0.00000 0.00000 191:
|
|
||||||
0 0.00000 0.00000 192:1;
|
|
||||||
0 0.00000 0.00000 193:
|
|
||||||
0 0.00000 0.00000 194:=pod
|
|
||||||
================ SmallProf version 2.02 ================
|
|
||||||
Profile of 01_expat.t Page 5
|
|
||||||
=================================================================
|
|
||||||
count wall tm cpu time line
|
|
||||||
0 0.00000 0.00000 1:#!/usr/bin/perl -w
|
|
||||||
1 0.00002 0.00000 2:%DB::packages=(SOAP::WSDL::Expat::MessagePars
|
|
||||||
0 0.00000 0.00000 3:use strict;
|
|
||||||
0 0.00000 0.00000 4:use warnings;
|
|
||||||
0 0.00000 0.00000 5:use lib '../lib';
|
|
||||||
0 0.00000 0.00000 6:use lib 'lib';
|
|
||||||
0 0.00000 0.00000 7:use lib '../t/lib';
|
|
||||||
0 0.00000 0.00000 8:use SOAP::WSDL::SAX::MessageHandler;
|
|
||||||
0 0.00000 0.00000 9:
|
|
||||||
0 0.00000 0.00000 10:use Benchmark;
|
|
||||||
0 0.00000 0.00000 11:use SOAP::WSDL::Expat::MessageParser;
|
|
||||||
0 0.00000 0.00000 12:use SOAP::WSDL::Expat::Message2Hash;
|
|
||||||
0 0.00000 0.00000 13:use XML::Simple;
|
|
||||||
0 0.00000 0.00000 14:use XML::LibXML;
|
|
||||||
0 0.00000 0.00000 15:use MyComplexType;
|
|
||||||
0 0.00000 0.00000 16:use MyElement;
|
|
||||||
0 0.00000 0.00000 17:use MySimpleType;
|
|
||||||
0 0.00000 0.00000 18:
|
|
||||||
0 0.00000 0.00000 19:my $xml = q{<SOAP-ENV:Envelope
|
|
||||||
0 0.00000 0.00000 20: xmlns:SOAP-
|
|
||||||
0 0.00000 0.00000 21: <SOAP-
|
|
||||||
0 0.00000 0.00000 22: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 23: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 24: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 25: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 26: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 27: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 28: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 29: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 30: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 31: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 32: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 33: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 34: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 35: <test2 >Test2</test2>
|
|
||||||
0 0.00000 0.00000 36: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 37: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 38: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 39: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 40: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 41: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 42: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 43: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 44: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 45: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 46: <test>Test</test>
|
|
||||||
0 0.00000 0.00000 47: </MyAtomicComplexTypeElement>
|
|
||||||
0 0.00000 0.00000 48:</SOAP-ENV:Body></SOAP-ENV:Envelope>};
|
|
||||||
0 0.00000 0.00000 49:
|
|
||||||
0 0.00000 0.00000 50:
|
|
||||||
0 0.00000 0.00000 51:my $parser =
|
|
||||||
0 0.00000 0.00000 52: class_resolver => 'FakeResolver'
|
|
||||||
0 0.00000 0.00000 53:});
|
|
||||||
0 0.00000 0.00000 54:
|
|
||||||
0 0.00000 0.00000 55:my $hash_parser =
|
|
||||||
0 0.00000 0.00000 56:
|
|
||||||
================ SmallProf version 2.02 ================
|
|
||||||
Profile of 01_expat.t Page 6
|
|
||||||
=================================================================
|
|
||||||
count wall tm cpu time line
|
|
||||||
0 0.00000 0.00000 57:$XML::Simple::PREFERRED_PARSER =
|
|
||||||
0 0.00000 0.00000 58:
|
|
||||||
0 0.00000 0.00000 59:my $libxml = XML::LibXML->new();
|
|
||||||
0 0.00000 0.00000 60:my @data;
|
|
||||||
0 0.00000 0.00000 61:timethese 1000,
|
|
||||||
0 0.00000 0.00000 62:{
|
|
||||||
0 0.00000 0.00000 63:# 'SOAP::WSDL Hash' => sub { push @data,
|
|
||||||
0 0.00000 0.00000 64: 'SOAP::WSDL' => sub { push @data, $parser-
|
|
||||||
0 0.00000 0.00000 65:# 'XML::Simple (Hash)' => sub { push @data,
|
|
||||||
0 0.00000 0.00000 66:# 'XML::LibXML (DOM)' => sub { push @data,
|
|
||||||
0 0.00000 0.00000 67:};
|
|
||||||
0 0.00000 0.00000 68:
|
|
||||||
0 0.00000 0.00000 69:# use Test::More tests => 1;
|
|
||||||
0 0.00000 0.00000 70:#is $parser->get_data(),
|
|
||||||
0 0.00000 0.00000 71:# . q{<test >Test</test><test2
|
|
||||||
0 0.00000 0.00000 72:# , 'Content comparison';
|
|
||||||
0 0.00000 0.00000 73:
|
|
||||||
0 0.00000 0.00000 74:$parser->class_resolver( 'FakeResolver2' );
|
|
||||||
0 0.00000 0.00000 75:
|
|
||||||
0 0.00000 0.00000 76:
|
|
||||||
0 0.00000 0.00000 77:# data classes reside in t/lib/Typelib/
|
|
||||||
0 0.00000 0.00000 78:BEGIN {
|
|
||||||
0 0.00000 0.00000 79: package FakeResolver;
|
|
||||||
0 0.00000 0.00000 80: {
|
|
||||||
0 0.00000 0.00000 81: my %class_list = (
|
|
||||||
0 0.00000 0.00000 82: 'MyAtomicComplexTypeElement' =>
|
|
||||||
0 0.00000 0.00000 83: 'MyAtomicComplexTypeElement/test'
|
|
||||||
0 0.00000 0.00000 84:
|
|
||||||
0 0.00000 0.00000 85: );
|
|
||||||
0 0.00000 0.00000 86:
|
|
||||||
0 0.00000 0.00000 87: sub get_map { return \%class_list };
|
|
||||||
0 0.00000 0.00000 88:
|
|
||||||
0 0.00000 0.00000 89: sub new { return bless {},
|
|
||||||
0 0.00000 0.00000 90:
|
|
||||||
0 0.00000 0.00000 91: sub get_class {
|
|
||||||
0 0.00000 0.00000 92: my $name = join('/', @{ $_[1] });
|
|
||||||
0 0.00000 0.00000 93: return ($class_list{ $name }) ?
|
|
||||||
0 0.00000 0.00000 94: : warn "no class found for
|
|
||||||
0 0.00000 0.00000 95: };
|
|
||||||
0 0.00000 0.00000 96: };
|
|
||||||
0 0.00000 0.00000 97:};
|
|
||||||
+31
-15
@@ -5,7 +5,7 @@ use Pod::Usage;
|
|||||||
use Getopt::Long;
|
use Getopt::Long;
|
||||||
use LWP::UserAgent;
|
use LWP::UserAgent;
|
||||||
use SOAP::WSDL::Expat::WSDLParser;
|
use SOAP::WSDL::Expat::WSDLParser;
|
||||||
use SOAP::WSDL::Generator::Template::XSD;
|
use SOAP::WSDL::Factory::Generator;
|
||||||
use Term::ReadKey;
|
use Term::ReadKey;
|
||||||
|
|
||||||
my %opt = (
|
my %opt = (
|
||||||
@@ -16,7 +16,8 @@ my %opt = (
|
|||||||
typemap_prefix => 'MyTypemaps',
|
typemap_prefix => 'MyTypemaps',
|
||||||
interface_prefix => 'MyInterfaces',
|
interface_prefix => 'MyInterfaces',
|
||||||
base_path => 'lib/',
|
base_path => 'lib/',
|
||||||
proxy => undef
|
proxy => undef,
|
||||||
|
generator => 'XSD',
|
||||||
);
|
);
|
||||||
|
|
||||||
{ # a block just to scope "no warnings"
|
{ # a block just to scope "no warnings"
|
||||||
@@ -57,6 +58,7 @@ GetOptions(\%opt,
|
|||||||
keep_alive
|
keep_alive
|
||||||
user=s
|
user=s
|
||||||
password=s
|
password=s
|
||||||
|
generator=s
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -91,20 +93,29 @@ if ($opt{typemap_include}) {
|
|||||||
%typemap = do $opt{typemap_include};
|
%typemap = do $opt{typemap_include};
|
||||||
}
|
}
|
||||||
|
|
||||||
my $generator = SOAP::WSDL::Generator::Template::XSD->new({
|
my $generator = SOAP::WSDL::Factory::Generator->get_generator({ type => $opt{'generator'} });
|
||||||
type_prefix => $opt{ type_prefix },
|
|
||||||
typemap_prefix => $opt{ typemap_prefix },
|
if (%typemap) {
|
||||||
element_prefix => $opt{ element_prefix },
|
if ($generator->can('set_typemap')) {
|
||||||
interface_prefix => $opt{ interface_prefix },
|
$generator->set_typemap( \%typemap );
|
||||||
OUTPUT_PATH => $opt{ base_path },
|
}
|
||||||
definitions => $definitions,
|
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...
|
# start with typelib, as errors will most likely occur here...
|
||||||
$generator->generate_typelib();
|
$generator->generate();
|
||||||
$generator->generate_interface();
|
|
||||||
$generator->generate_typemap({ (%typemap) ? (typemap => \%typemap) : () });
|
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
@@ -133,13 +144,15 @@ wsdl2perl.pl - create perl bindings for SOAP webservices.
|
|||||||
base_path b Path to create classes in.
|
base_path b Path to create classes in.
|
||||||
Default: .
|
Default: .
|
||||||
typemap_include mi File to include in typemap. Must eval() to a valid
|
typemap_include mi File to include in typemap. Must eval() to a valid
|
||||||
perl hash (not a has ref !).
|
perl hash (not a hash ref !).
|
||||||
proxy x HTTP(S) proxy to use (if any). wsdl2perl will also
|
proxy x HTTP(S) proxy to use (if any). wsdl2perl will also
|
||||||
use the proxy settings specified via the HTTP_PROXY
|
use the proxy settings specified via the HTTP_PROXY
|
||||||
and HTTPS_PROXY environment variables.
|
and HTTPS_PROXY environment variables.
|
||||||
keep_alive Use http keep_alive.
|
keep_alive Use http keep_alive.
|
||||||
user Username for HTTP authentication
|
user Username for HTTP authentication
|
||||||
password Password. wsdl2perl will prompt if not given.
|
password Password. wsdl2perl will prompt if not given.
|
||||||
|
generator g Generator to use.
|
||||||
|
Default: XSD
|
||||||
help h Show help content
|
help h Show help content
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
@@ -186,7 +199,10 @@ You need Crypt::SSLeay installed for accessing HTTPS URLs.
|
|||||||
=head2 Accessing protected documents
|
=head2 Accessing protected documents
|
||||||
|
|
||||||
Use the -u option for specifying the user name. You will be prompted for a
|
Use the -u option for specifying the user name. You will be prompted for a
|
||||||
password. If the first attempt fails, wsdl2perl
|
password.
|
||||||
|
|
||||||
|
Alternatively, you may specify a passowrd with --password on the command
|
||||||
|
line.
|
||||||
|
|
||||||
=head2 Accessing documents protected by NTLM authentication
|
=head2 Accessing documents protected by NTLM authentication
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -10,21 +10,21 @@
|
|||||||
# 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;
|
||||||
my $cookieService = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie->new();
|
my $cookieService = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap->new();
|
||||||
|
|
||||||
my $cookie;
|
my $cookie;
|
||||||
$cookie = $cookieService->GetFortuneCookie()
|
$cookie = $cookieService->GetFortuneCookie()
|
||||||
or die "$cookie";
|
or die "$cookie";
|
||||||
|
|
||||||
print $cookie; # ->get_GetFortuneCookieResult()->get_value, "\n";
|
print $cookie->get_GetFortuneCookieResult()->get_value, "\n\n";
|
||||||
|
|
||||||
$cookie = $cookieService->GetSpecificCookie({ index => 23 })
|
$cookie = $cookieService->GetSpecificCookie({ index => 23 })
|
||||||
or die "$cookie";
|
or die "$cookie";
|
||||||
|
|
||||||
print $cookie->get_GetSpecificCookieResult(), "\n";
|
print $cookie->get_GetSpecificCookieResult(), "\n";
|
||||||
|
|
||||||
print $cookie;
|
# print $cookie;
|
||||||
|
|
||||||
|
|
||||||
=for demo:
|
=for demo:
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
|
||||||
=head1 Object structure
|
|
||||||
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
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,70 @@ __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::Storable;
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
{ # 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,102 @@
|
|||||||
|
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::Storable;
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
{ # 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,79 @@
|
|||||||
|
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::Storable;
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
{ # 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,38 +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' }
|
||||||
|
|
||||||
@@ -40,17 +10,43 @@ __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::Storable;
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
{ # 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
|
||||||
|
|
||||||
@@ -58,36 +54,26 @@ __END__
|
|||||||
|
|
||||||
MyElements::GetCitiesByCountry
|
MyElements::GetCitiesByCountry
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
|
||||||
|
|
||||||
=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,38 +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' }
|
||||||
|
|
||||||
@@ -40,17 +10,43 @@ __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::Storable;
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
{ # 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
|
||||||
|
|
||||||
@@ -58,36 +54,26 @@ __END__
|
|||||||
|
|
||||||
MyElements::GetCitiesByCountryResponse
|
MyElements::GetCitiesByCountryResponse
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
|
||||||
|
|
||||||
=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);
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
|
||||||
=head1 Object structure
|
|
||||||
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
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,70 @@ __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::Storable;
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
{ # 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,70 @@ __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::Storable;
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
{ # 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,70 @@ __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::Storable;
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
{ # 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,46 +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' }
|
||||||
|
|
||||||
@@ -48,17 +10,47 @@ __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::Storable;
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
{ # 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
|
||||||
|
|
||||||
@@ -66,40 +58,27 @@ __END__
|
|||||||
|
|
||||||
MyElements::GetWeather
|
MyElements::GetWeather
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
|
||||||
|
|
||||||
=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,38 +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' }
|
||||||
|
|
||||||
@@ -40,17 +10,43 @@ __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::Storable;
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
{ # 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
|
||||||
|
|
||||||
@@ -58,36 +54,26 @@ __END__
|
|||||||
|
|
||||||
MyElements::GetWeatherResponse
|
MyElements::GetWeatherResponse
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
|
||||||
|
|
||||||
=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
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
Constructor. The following data structure may be passed to new():
|
||||||
|
|
||||||
|
|
||||||
=head1 Object structure
|
|
||||||
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
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,70 @@ __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::Storable;
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
|
{ # 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
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,8 @@
|
|||||||
package MyElements::string;
|
package MyElements::string;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use warnings;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# <element name="string" type="s:string"/> definition
|
|
||||||
#
|
|
||||||
|
|
||||||
use base qw(
|
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::string
|
|
||||||
);
|
|
||||||
|
|
||||||
|
{ # BLOCK to scope variables
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.webserviceX.NET' }
|
sub get_xmlns { 'http://www.webserviceX.NET' }
|
||||||
|
|
||||||
@@ -20,17 +10,18 @@ __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
|
||||||
|
|
||||||
@@ -38,31 +29,24 @@ __END__
|
|||||||
|
|
||||||
MyElements::string
|
MyElements::string
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
|
||||||
|
|
||||||
=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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
|
||||||
|
|
||||||
+191
@@ -0,0 +1,191 @@
|
|||||||
|
package MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Storable;
|
||||||
|
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) = @_;
|
||||||
|
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) = @_;
|
||||||
|
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) = @_;
|
||||||
|
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) = @_;
|
||||||
|
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 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 Tue Nov 6 20:56:46 2007
|
||||||
|
|
||||||
|
=pod
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
package MyInterfaces::GlobalWeather::GlobalWeatherSoap;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Storable;
|
||||||
|
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) = @_;
|
||||||
|
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) = @_;
|
||||||
|
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 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 Tue Nov 6 21:00:30 2007
|
||||||
|
|
||||||
|
=pod
|
||||||
@@ -2,48 +2,47 @@ 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 };
|
||||||
}
|
}
|
||||||
|
|
||||||
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,49 +2,43 @@ package MyTypemaps::GlobalWeather;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
my %typemap = (
|
our $typemap_1 = {
|
||||||
# SOAP 1.1 fault typemap
|
'GetWeatherResponse/GetWeatherResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
|
'GetWeather' => 'MyElements::GetWeather',
|
||||||
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
'GetCitiesByCountryResponse/GetCitiesByCountryResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN',
|
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN',
|
||||||
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'GetWeatherResponse' => 'MyElements::GetWeatherResponse',
|
||||||
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
||||||
# generated typemap
|
'GetWeather/CityName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
'GetWeather' => 'MyElements::GetWeather',
|
'GetCitiesByCountry' => 'MyElements::GetCitiesByCountry',
|
||||||
# atomic complex type (sequence)
|
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
'GetWeather/CityName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'GetCitiesByCountry/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
'GetWeather/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'GetWeather/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
|
||||||
# end atomic complex type (sequence)
|
'GetCitiesByCountryResponse' => 'MyElements::GetCitiesByCountryResponse'
|
||||||
'GetWeatherResponse' => 'MyElements::GetWeatherResponse',
|
};
|
||||||
# atomic complex type (sequence)
|
;
|
||||||
'GetWeatherResponse/GetWeatherResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
|
||||||
# end atomic complex type (sequence)
|
|
||||||
'GetCitiesByCountry' => 'MyElements::GetCitiesByCountry',
|
|
||||||
# atomic complex type (sequence)
|
|
||||||
'GetCitiesByCountry/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
|
||||||
# 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)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
);
|
|
||||||
|
|
||||||
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 };
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
|
|||||||
+6
-4
@@ -10,11 +10,13 @@
|
|||||||
# This script demonstrates the use of a interface generated by wsdl2perl.pl
|
# 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 $weather = MyInterfaces::GlobalWeather->new({ no_dispatch => 1 });
|
my $weather = MyInterfaces::GlobalWeather::GlobalWeatherSoap->new();
|
||||||
my $result = $weather->GetWeather({ CountryName => 'Germany', CityName => 'Munich' });
|
my $result = $weather->GetWeather({ CountryName => 'Germany', CityName => 'Munich' });
|
||||||
print $result;
|
|
||||||
# boolean comparison overloaded
|
# boolean comparison overloaded
|
||||||
die $result->get_faultstring()->get_value() if not ($result);
|
die $result->get_faultstring()->get_value() if not ($result);
|
||||||
|
|
||||||
print $result->get_GetWeatherResult()->get_value() , "\n";
|
# The result is a XML string
|
||||||
|
# use get_value to avoid automatic entity encoding
|
||||||
|
print $result->get_GetWeatherResult()->get_value , "\n";
|
||||||
|
|||||||
@@ -1,153 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<wsdl: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:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://www.webservicex.net/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://www.webservicex.net/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
|
|
||||||
<wsdl:types>
|
|
||||||
<s:schema elementFormDefault="qualified" targetNamespace="http://www.webservicex.net/">
|
|
||||||
<s:element name="GenerateBarCode">
|
|
||||||
<s:complexType>
|
|
||||||
<s:sequence>
|
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="BarCodeParam" type="tns:BarCodeData" />
|
|
||||||
<s:element minOccurs="0" maxOccurs="1" name="BarCodeText" type="s:string" />
|
|
||||||
</s:sequence>
|
|
||||||
</s:complexType>
|
|
||||||
</s:element>
|
|
||||||
<s:complexType name="BarCodeData">
|
|
||||||
<s:sequence>
|
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="Height" type="s:int" />
|
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="Width" type="s:int" />
|
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="Angle" type="s:int" />
|
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="Ratio" type="s:int" />
|
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="Module" type="s:int" />
|
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="Left" type="s:int" />
|
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="Top" type="s:int" />
|
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="CheckSum" type="s:boolean" />
|
|
||||||
<s:element minOccurs="0" maxOccurs="1" name="FontName" type="s:string" />
|
|
||||||
<s:element minOccurs="0" maxOccurs="1" name="BarColor" type="s:string" />
|
|
||||||
<s:element minOccurs="0" maxOccurs="1" name="BGColor" type="s:string" />
|
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="FontSize" type="s:float" />
|
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="barcodeOption" type="tns:BarcodeOption" />
|
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="barcodeType" type="tns:BarcodeType" />
|
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="checkSumMethod" type="tns:CheckSumMethod" />
|
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="showTextPosition" type="tns:ShowTextPosition" />
|
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="BarCodeImageFormat" type="tns:ImageFormats" />
|
|
||||||
</s:sequence>
|
|
||||||
</s:complexType>
|
|
||||||
<s:simpleType name="BarcodeOption">
|
|
||||||
<s:restriction base="s:string">
|
|
||||||
<s:enumeration value="None" />
|
|
||||||
<s:enumeration value="Code" />
|
|
||||||
<s:enumeration value="Typ" />
|
|
||||||
<s:enumeration value="Both" />
|
|
||||||
</s:restriction>
|
|
||||||
</s:simpleType>
|
|
||||||
<s:simpleType name="BarcodeType">
|
|
||||||
<s:restriction base="s:string">
|
|
||||||
<s:enumeration value="Code_2_5_interleaved" />
|
|
||||||
<s:enumeration value="Code_2_5_industrial" />
|
|
||||||
<s:enumeration value="Code_2_5_matrix" />
|
|
||||||
<s:enumeration value="Code39" />
|
|
||||||
<s:enumeration value="Code39Extended" />
|
|
||||||
<s:enumeration value="Code128A" />
|
|
||||||
<s:enumeration value="Code128B" />
|
|
||||||
<s:enumeration value="Code128C" />
|
|
||||||
<s:enumeration value="Code93" />
|
|
||||||
<s:enumeration value="Code93Extended" />
|
|
||||||
<s:enumeration value="CodeMSI" />
|
|
||||||
<s:enumeration value="CodePostNet" />
|
|
||||||
<s:enumeration value="CodeCodabar" />
|
|
||||||
<s:enumeration value="CodeEAN8" />
|
|
||||||
<s:enumeration value="CodeEAN13" />
|
|
||||||
<s:enumeration value="CodeUPC_A" />
|
|
||||||
<s:enumeration value="CodeUPC_E0" />
|
|
||||||
<s:enumeration value="CodeUPC_E1" />
|
|
||||||
<s:enumeration value="CodeUPC_Supp2" />
|
|
||||||
<s:enumeration value="CodeUPC_Supp5" />
|
|
||||||
<s:enumeration value="CodeEAN128A" />
|
|
||||||
<s:enumeration value="CodeEAN128B" />
|
|
||||||
<s:enumeration value="CodeEAN128C" />
|
|
||||||
</s:restriction>
|
|
||||||
</s:simpleType>
|
|
||||||
<s:simpleType name="CheckSumMethod">
|
|
||||||
<s:restriction base="s:string">
|
|
||||||
<s:enumeration value="None" />
|
|
||||||
<s:enumeration value="Modulo10" />
|
|
||||||
</s:restriction>
|
|
||||||
</s:simpleType>
|
|
||||||
<s:simpleType name="ShowTextPosition">
|
|
||||||
<s:restriction base="s:string">
|
|
||||||
<s:enumeration value="TopLeft" />
|
|
||||||
<s:enumeration value="TopRight" />
|
|
||||||
<s:enumeration value="TopCenter" />
|
|
||||||
<s:enumeration value="BottomLeft" />
|
|
||||||
<s:enumeration value="BottomRight" />
|
|
||||||
<s:enumeration value="BottomCenter" />
|
|
||||||
</s:restriction>
|
|
||||||
</s:simpleType>
|
|
||||||
<s:simpleType name="ImageFormats">
|
|
||||||
<s:restriction base="s:string">
|
|
||||||
<s:enumeration value="BMP" />
|
|
||||||
<s:enumeration value="EMF" />
|
|
||||||
<s:enumeration value="EXIF" />
|
|
||||||
<s:enumeration value="GIF" />
|
|
||||||
<s:enumeration value="ICON" />
|
|
||||||
<s:enumeration value="JPEG" />
|
|
||||||
<s:enumeration value="MemoryBMP" />
|
|
||||||
<s:enumeration value="PNG" />
|
|
||||||
<s:enumeration value="TIFF" />
|
|
||||||
<s:enumeration value="WMF" />
|
|
||||||
</s:restriction>
|
|
||||||
</s:simpleType>
|
|
||||||
<s:element name="GenerateBarCodeResponse">
|
|
||||||
<s:complexType>
|
|
||||||
<s:sequence>
|
|
||||||
<s:element minOccurs="0" maxOccurs="1" name="GenerateBarCodeResult" type="s:base64Binary" />
|
|
||||||
</s:sequence>
|
|
||||||
</s:complexType>
|
|
||||||
</s:element>
|
|
||||||
</s:schema>
|
|
||||||
</wsdl:types>
|
|
||||||
<wsdl:message name="GenerateBarCodeSoapIn">
|
|
||||||
<wsdl:part name="parameters" element="tns:GenerateBarCode" />
|
|
||||||
</wsdl:message>
|
|
||||||
<wsdl:message name="GenerateBarCodeSoapOut">
|
|
||||||
<wsdl:part name="parameters" element="tns:GenerateBarCodeResponse" />
|
|
||||||
</wsdl:message>
|
|
||||||
<wsdl:portType name="BarCodeSoap">
|
|
||||||
<wsdl:operation name="GenerateBarCode">
|
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">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.</documentation>
|
|
||||||
<wsdl:input message="tns:GenerateBarCodeSoapIn" />
|
|
||||||
<wsdl:output message="tns:GenerateBarCodeSoapOut" />
|
|
||||||
</wsdl:operation>
|
|
||||||
</wsdl:portType>
|
|
||||||
<wsdl:portType name="BarCodeHttpGet" />
|
|
||||||
<wsdl:portType name="BarCodeHttpPost" />
|
|
||||||
<wsdl:binding name="BarCodeSoap" type="tns:BarCodeSoap">
|
|
||||||
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
|
|
||||||
<wsdl:operation name="GenerateBarCode">
|
|
||||||
<soap:operation soapAction="http://www.webservicex.net/GenerateBarCode" style="document" />
|
|
||||||
<wsdl:input>
|
|
||||||
<soap:body use="literal" />
|
|
||||||
</wsdl:input>
|
|
||||||
<wsdl:output>
|
|
||||||
<soap:body use="literal" />
|
|
||||||
</wsdl:output>
|
|
||||||
</wsdl:operation>
|
|
||||||
</wsdl:binding>
|
|
||||||
<wsdl:binding name="BarCodeHttpGet" type="tns:BarCodeHttpGet">
|
|
||||||
<http:binding verb="GET" />
|
|
||||||
</wsdl:binding>
|
|
||||||
<wsdl:binding name="BarCodeHttpPost" type="tns:BarCodeHttpPost">
|
|
||||||
<http:binding verb="POST" />
|
|
||||||
</wsdl:binding>
|
|
||||||
<wsdl:service name="BarCode">
|
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Barcode generator</documentation>
|
|
||||||
<wsdl:port name="BarCodeSoap" binding="tns:BarCodeSoap">
|
|
||||||
<soap:address location="http://www.webservicex.net/genericbarcode.asmx" />
|
|
||||||
</wsdl:port>
|
|
||||||
<wsdl:port name="BarCodeHttpGet" binding="tns:BarCodeHttpGet">
|
|
||||||
<http:address location="http://www.webservicex.net/genericbarcode.asmx" />
|
|
||||||
</wsdl:port>
|
|
||||||
<wsdl:port name="BarCodeHttpPost" binding="tns:BarCodeHttpPost">
|
|
||||||
<http:address location="http://www.webservicex.net/genericbarcode.asmx" />
|
|
||||||
</wsdl:port>
|
|
||||||
</wsdl:service>
|
|
||||||
</wsdl:definitions>
|
|
||||||
+79
-80
@@ -10,12 +10,11 @@ use Class::Std;
|
|||||||
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
||||||
use LWP::UserAgent;
|
use LWP::UserAgent;
|
||||||
|
|
||||||
our $VERSION='2.00_16';
|
our $VERSION='2.00_17';
|
||||||
|
|
||||||
my %no_dispatch_of :ATTR(:name<no_dispatch>);
|
my %no_dispatch_of :ATTR(:name<no_dispatch>);
|
||||||
my %wsdl_of :ATTR(:name<wsdl>);
|
my %wsdl_of :ATTR(:name<wsdl>);
|
||||||
my %proxy_of :ATTR(:name<proxy>);
|
my %proxy_of :ATTR(:name<proxy>);
|
||||||
my %readable_of :ATTR(:name<readable>);
|
|
||||||
my %autotype_of :ATTR(:name<autotype>);
|
my %autotype_of :ATTR(:name<autotype>);
|
||||||
my %outputxml_of :ATTR(:name<outputxml> :default<0>);
|
my %outputxml_of :ATTR(:name<outputxml> :default<0>);
|
||||||
my %outputtree_of :ATTR(:name<outputtree>);
|
my %outputtree_of :ATTR(:name<outputtree>);
|
||||||
@@ -31,7 +30,6 @@ my %binding_of :ATTR(:default<()>);
|
|||||||
my %service_of :ATTR(:default<()>);
|
my %service_of :ATTR(:default<()>);
|
||||||
my %definitions_of :ATTR(:get<definitions> :default<()>);
|
my %definitions_of :ATTR(:get<definitions> :default<()>);
|
||||||
my %serialize_options_of :ATTR(:default<()>);
|
my %serialize_options_of :ATTR(:default<()>);
|
||||||
my %explain_options_of :ATTR(:default<()>);
|
|
||||||
|
|
||||||
my %client_of :ATTR(:name<client> :default<()>);
|
my %client_of :ATTR(:name<client> :default<()>);
|
||||||
my %keep_alive_of :ATTR(:name<keep_alive> :default<0> );
|
my %keep_alive_of :ATTR(:name<keep_alive> :default<0> );
|
||||||
@@ -41,7 +39,6 @@ my %LOOKUP = (
|
|||||||
class_resolver => \%class_resolver_of,
|
class_resolver => \%class_resolver_of,
|
||||||
wsdl => \%wsdl_of,
|
wsdl => \%wsdl_of,
|
||||||
proxy => \%proxy_of,
|
proxy => \%proxy_of,
|
||||||
readable => \%readable_of,
|
|
||||||
autotype => \%autotype_of,
|
autotype => \%autotype_of,
|
||||||
outputxml => \%outputxml_of,
|
outputxml => \%outputxml_of,
|
||||||
outputtree => \%outputtree_of,
|
outputtree => \%outputtree_of,
|
||||||
@@ -51,8 +48,18 @@ my %LOOKUP = (
|
|||||||
keep_alive => \%keep_alive_of,
|
keep_alive => \%keep_alive_of,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
sub readable { carp <<'EOT';
|
||||||
|
'readable' has no effect any more. If you want formatted XML,
|
||||||
|
copy the debug output to your favorite XML editor and run the
|
||||||
|
source format command.
|
||||||
|
EOT
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub set_readable; *set_readable = \&readable;
|
||||||
|
|
||||||
for my $method (keys %LOOKUP ) {
|
for my $method (keys %LOOKUP ) {
|
||||||
no strict qw(refs);
|
no strict qw(refs); ## no critic (ProhibitNoStrict)
|
||||||
*{ $method } = sub {
|
*{ $method } = sub {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $ident = ident $self;
|
my $ident = ident $self;
|
||||||
@@ -70,31 +77,28 @@ for my $method (keys %LOOKUP ) {
|
|||||||
# SOAP::WSDL->new( key => value ) syntax,
|
# SOAP::WSDL->new( key => value ) syntax,
|
||||||
# like SOAP::Lite does. Class::Std enforces a single hash ref as
|
# like SOAP::Lite does. Class::Std enforces a single hash ref as
|
||||||
# parameters to new()
|
# parameters to new()
|
||||||
no warnings qw(redefine);
|
no warnings qw(redefine); ## no critic ProhibitNoWarnings;
|
||||||
|
|
||||||
sub new {
|
sub new {
|
||||||
my $class = shift;
|
my ($class, %args_from) = @_;
|
||||||
my %args_from = @_;
|
|
||||||
my $self = \do { my $foo = undef };
|
my $self = \do { my $foo = undef };
|
||||||
bless $self, $class;
|
bless $self, $class;
|
||||||
|
|
||||||
for (keys %args_from) {
|
for (keys %args_from) {
|
||||||
my $method = $self->can("set_$_")
|
my $method = $self->can("set_$_")
|
||||||
or croak "unknown parameter $_ passed to new";
|
or croak "unknown parameter $_ passed to new";
|
||||||
$method->($self, $args_from{$_});
|
$method->($self, $args_from{$_});
|
||||||
}
|
}
|
||||||
|
|
||||||
my $ident = ident $self;
|
my $ident = ident $self;
|
||||||
$self->wsdlinit() if ($wsdl_of{ $ident });
|
$self->wsdlinit() if ($wsdl_of{ $ident });
|
||||||
|
|
||||||
$client_of{ $ident } = SOAP::WSDL::Client->new();
|
$client_of{ $ident } = SOAP::WSDL::Client->new();
|
||||||
|
|
||||||
return $self;
|
return $self;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub wsdlinit {
|
sub wsdlinit {
|
||||||
my $self = shift;
|
my ($self, %opt) = @_;
|
||||||
my $ident = ident $self;
|
my $ident = ident $self;
|
||||||
my %opt = @_;
|
|
||||||
|
|
||||||
my $lwp = LWP::UserAgent->new(
|
my $lwp = LWP::UserAgent->new(
|
||||||
$keep_alive_of{ $ident }
|
$keep_alive_of{ $ident }
|
||||||
@@ -107,13 +111,14 @@ sub wsdlinit {
|
|||||||
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
|
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
|
||||||
$parser->parse_string( $response->content() );
|
$parser->parse_string( $response->content() );
|
||||||
|
|
||||||
|
my $wsdl_definitions = $parser->get_data();
|
||||||
|
|
||||||
# sanity checks
|
# sanity checks
|
||||||
my $wsdl_definitions = $parser->get_data() or die "unable to parse WSDL";
|
|
||||||
my $types = $wsdl_definitions->first_types()
|
my $types = $wsdl_definitions->first_types()
|
||||||
or die "unable to extract schema from WSDL";
|
or croak "unable to extract schema from WSDL";
|
||||||
my $ns = $wsdl_definitions->get_xmlns()
|
my $ns = $wsdl_definitions->get_xmlns()
|
||||||
or die "unable to extract XML Namespaces" . $wsdl_definitions->to_string;
|
or croak "unable to extract XML Namespaces" . $wsdl_definitions->to_string;
|
||||||
( %{ $ns } ) or die "unable to extract XML Namespaces";
|
( %{ $ns } ) or croak "unable to extract XML Namespaces";
|
||||||
|
|
||||||
# setup lookup variables
|
# setup lookup variables
|
||||||
$definitions_of{ $ident } = $wsdl_definitions;
|
$definitions_of{ $ident } = $wsdl_definitions;
|
||||||
@@ -122,12 +127,6 @@ sub wsdlinit {
|
|||||||
typelib => $types,
|
typelib => $types,
|
||||||
namespace => $ns,
|
namespace => $ns,
|
||||||
};
|
};
|
||||||
$explain_options_of{ $ident } = {
|
|
||||||
readable => $self->readable(),
|
|
||||||
wsdl => $wsdl_definitions,
|
|
||||||
namespace => $ns,
|
|
||||||
typelib => $types,
|
|
||||||
};
|
|
||||||
|
|
||||||
$servicename_of{ $ident } = $opt{servicename} if $opt{servicename};
|
$servicename_of{ $ident } = $opt{servicename} if $opt{servicename};
|
||||||
$portname_of{ $ident } = $opt{portname} if $opt{portname};
|
$portname_of{ $ident } = $opt{portname} if $opt{portname};
|
||||||
@@ -150,27 +149,24 @@ sub _wsdl_get_port :PRIVATE {
|
|||||||
? $service_of{ $ident }->get_port( $ns, $portname_of{ $ident } )
|
? $service_of{ $ident }->get_port( $ns, $portname_of{ $ident } )
|
||||||
: $port_of{ $ident } = $service_of{ $ident }->get_port()->[ 0 ];
|
: $port_of{ $ident } = $service_of{ $ident }->get_port()->[ 0 ];
|
||||||
}
|
}
|
||||||
|
|
||||||
sub _wsdl_get_binding :PRIVATE {
|
sub _wsdl_get_binding :PRIVATE {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $ident = ident $self;
|
my $ident = ident $self;
|
||||||
my $wsdl = $definitions_of{ $ident };
|
my $wsdl = $definitions_of{ $ident };
|
||||||
my $port = $port_of{ $ident } || $self->_wsdl_get_port();
|
my $port = $port_of{ $ident } || $self->_wsdl_get_port();
|
||||||
$binding_of{ $ident } = $wsdl->find_binding( $port->expand( $port->get_binding() ) )
|
$binding_of{ $ident } = $wsdl->find_binding( $port->expand( $port->get_binding() ) )
|
||||||
or die "no binding found for ", $port->get_binding();
|
or croak "no binding found for ", $port->get_binding();
|
||||||
return $binding_of{ $ident };
|
return $binding_of{ $ident };
|
||||||
}
|
}
|
||||||
|
|
||||||
sub _wsdl_get_portType :PRIVATE {
|
sub _wsdl_get_portType :PRIVATE {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $ident = ident $self;
|
my $ident = ident $self;
|
||||||
my $wsdl = $definitions_of{ $ident };
|
my $wsdl = $definitions_of{ $ident };
|
||||||
my $binding = $binding_of{ $ident } || $self->_wsdl_get_binding();
|
my $binding = $binding_of{ $ident } || $self->_wsdl_get_binding();
|
||||||
$porttype_of{ $ident } = $wsdl->find_portType( $binding->expand( $binding->get_type() ) )
|
$porttype_of{ $ident } = $wsdl->find_portType( $binding->expand( $binding->get_type() ) )
|
||||||
or die "cannot find portType for " . $binding->get_type();
|
or croak "cannot find portType for " . $binding->get_type();
|
||||||
return $porttype_of{ $ident };
|
return $porttype_of{ $ident };
|
||||||
}
|
}
|
||||||
|
|
||||||
sub _wsdl_init_methods :PRIVATE {
|
sub _wsdl_init_methods :PRIVATE {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $ident = ident $self;
|
my $ident = ident $self;
|
||||||
@@ -180,7 +176,7 @@ sub _wsdl_init_methods :PRIVATE {
|
|||||||
# get bindings, portType, message, part(s) - use private methods for clear separation...
|
# get bindings, portType, message, part(s) - use private methods for clear separation...
|
||||||
$self->_wsdl_get_service if not ($service_of{ $ident });
|
$self->_wsdl_get_service if not ($service_of{ $ident });
|
||||||
my $binding = $binding_of{ $ident } || $self->_wsdl_get_binding()
|
my $binding = $binding_of{ $ident } || $self->_wsdl_get_binding()
|
||||||
|| die "Can't find binding";
|
|| croak "Can't find binding";
|
||||||
my $portType = $porttype_of{ $ident } || $self->_wsdl_get_portType();
|
my $portType = $porttype_of{ $ident } || $self->_wsdl_get_portType();
|
||||||
|
|
||||||
$method_info_of{ $ident } = {};
|
$method_info_of{ $ident } = {};
|
||||||
@@ -201,19 +197,19 @@ sub _wsdl_init_methods :PRIVATE {
|
|||||||
$binding_operation->get_name() );
|
$binding_operation->get_name() );
|
||||||
|
|
||||||
# 2. get input message name
|
# 2. get input message name
|
||||||
my ( $prefix, $localname ) = split /:/,
|
my ( $prefix, $localname ) = split /:/xm,
|
||||||
$operation->first_input()->get_message();
|
$operation->first_input()->get_message();
|
||||||
|
|
||||||
# 3. get input message
|
# 3. get input message
|
||||||
my $message = $wsdl->find_message( $ns, $localname )
|
my $message = $wsdl->find_message( $ns, $localname )
|
||||||
or die "Message {$ns}$localname not found in WSDL definition";
|
or croak "Message {$ns}$localname not found in WSDL definition";
|
||||||
|
|
||||||
if (my $body=$binding_operation->first_input()->first_body()) {
|
if (my $body=$binding_operation->first_input()->first_body()) {
|
||||||
if ($body->get_parts()) {
|
if ($body->get_parts()) {
|
||||||
$method->{ parts } = []; # make sure it's empty
|
$method->{ parts } = []; # make sure it's empty
|
||||||
my $message_part_ref = $message->get_part();
|
my $message_part_ref = $message->get_part();
|
||||||
for my $name (split m{\s} , $body->get_parts() ) {
|
for my $name ( split m{\s}xm , $body->get_parts() ) {
|
||||||
$name =~s{ \A [^:]+: }{}x; # throw away ns prefix
|
$name =~s{ \A [^:]+: }{}xm; # throw away ns prefix
|
||||||
# could probably made more efficient, but our lists are
|
# could probably made more efficient, but our lists are
|
||||||
# usually quite short
|
# usually quite short
|
||||||
push @{ $method->{ parts } },
|
push @{ $method->{ parts } },
|
||||||
@@ -223,7 +219,6 @@ sub _wsdl_init_methods :PRIVATE {
|
|||||||
}
|
}
|
||||||
$method->{ parts } ||= $message->get_part();
|
$method->{ parts } ||= $message->get_part();
|
||||||
|
|
||||||
|
|
||||||
# rpc / encoded methods may have a namespace specified.
|
# rpc / encoded methods may have a namespace specified.
|
||||||
# look it up and set it...
|
# look it up and set it...
|
||||||
$method->{ namespace } = $binding_operation
|
$method->{ namespace } = $binding_operation
|
||||||
@@ -277,19 +272,19 @@ sub call {
|
|||||||
my $method_info = $method_info_of{ $ident }->{ $method };
|
my $method_info = $method_info_of{ $ident }->{ $method };
|
||||||
|
|
||||||
# TODO serialize both header and body, not only header
|
# TODO serialize both header and body, not only header
|
||||||
my $response = (blessed $data)
|
my (@response) = (blessed $data)
|
||||||
? $client->call( {
|
? $client->call( {
|
||||||
operation => $method,
|
operation => $method,
|
||||||
soap_action => $method_info->{ soap_action },
|
soap_action => $method_info->{ soap_action },
|
||||||
}, $data )
|
}, $data )
|
||||||
: do {
|
: do {
|
||||||
my $content = '';
|
my $content = q{};
|
||||||
# TODO support RPC-encoding: Top-Level element + namespace...
|
# TODO support RPC-encoding: Top-Level element + namespace...
|
||||||
foreach my $part ( @{ $method_info->{ parts } } ) {
|
foreach my $part ( @{ $method_info->{ parts } } ) {
|
||||||
|
|
||||||
$content .= $part->serialize( $method, $data,
|
$content .= $part->serialize( $method, $data,
|
||||||
{
|
{
|
||||||
%{ $serialize_options_of{ $ident } },
|
%{ $serialize_options_of{ $ident } }
|
||||||
readable => $readable_of{ $ident },
|
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
$client->call(
|
$client->call(
|
||||||
@@ -308,16 +303,9 @@ sub call {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
return unless defined $response; # nothing to do for one-ways
|
return if not @response; # nothing to do for one-ways
|
||||||
return $response;
|
return wantarray ? @response : $response[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
sub explain {
|
|
||||||
my $ident = ident shift;
|
|
||||||
my $opt = $explain_options_of{ $ident };
|
|
||||||
return $definitions_of{ $ident }->explain( $opt );
|
|
||||||
}
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
@@ -340,7 +328,6 @@ SOAP client, which mimics L<SOAP::Lite|SOAP::Lite>'s API, read on.
|
|||||||
|
|
||||||
my $soap = SOAP::WSDL->new(
|
my $soap = SOAP::WSDL->new(
|
||||||
wsdl => 'file://bla.wsdl',
|
wsdl => 'file://bla.wsdl',
|
||||||
readable => 1,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
my $result = $soap->call('MyMethod', %data);
|
my $result = $soap->call('MyMethod', %data);
|
||||||
@@ -384,6 +371,13 @@ Does not support SOAP header data.
|
|||||||
Does support SOAP header data. $body_ref and $header ref may either be
|
Does support SOAP header data. $body_ref and $header ref may either be
|
||||||
hash refs or SOAP::WSDL::XSD::Typelib::* derived objects.
|
hash refs or SOAP::WSDL::XSD::Typelib::* derived objects.
|
||||||
|
|
||||||
|
Result headers are accessible via the result SOAP::SOM object.
|
||||||
|
|
||||||
|
If outputtree or outputhash are set, you may also use the following to
|
||||||
|
access response header data:
|
||||||
|
|
||||||
|
my ($body, $header) = $soap->call('method', $body_ref, $header_ref );
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head2 wsdlinit
|
=head2 wsdlinit
|
||||||
@@ -401,7 +395,7 @@ wsdlinit:
|
|||||||
|
|
||||||
$soap->wsdlinit(
|
$soap->wsdlinit(
|
||||||
servicename => 'MyService',
|
servicename => 'MyService',
|
||||||
portname => 'MyPort'
|
portname => 'MyPort',
|
||||||
);
|
);
|
||||||
|
|
||||||
=head1 CONFIGURATION METHODS
|
=head1 CONFIGURATION METHODS
|
||||||
@@ -412,7 +406,7 @@ When outputtree is set, SOAP::WSDL will return an object tree instead of a
|
|||||||
SOAP::SOM object.
|
SOAP::SOM object.
|
||||||
|
|
||||||
You have to specify a class_resolver for this to work. See
|
You have to specify a class_resolver for this to work. See
|
||||||
<class_resolver|class_resolver>
|
L<class_resolver|class_resolver>
|
||||||
|
|
||||||
=head2 class_resolver
|
=head2 class_resolver
|
||||||
|
|
||||||
@@ -422,8 +416,8 @@ Class resolvers must implement the method get_class which has to return the
|
|||||||
name of the class name for deserializing a XML node at the current XPath
|
name of the class name for deserializing a XML node at the current XPath
|
||||||
location.
|
location.
|
||||||
|
|
||||||
Class resolvers are typically generated by using the to_typemap method on a
|
Class resolvers are typically generated by using the generate_typemap method
|
||||||
SOAP::WSDL::Definitions objects.
|
of a SOAP::WSDL::Generator subclass.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
@@ -483,15 +477,6 @@ SOAP call to the SOAP service. Handy for testing/debugging.
|
|||||||
Returns the SOAP client implementation used (normally a SOAP::WSDL::Client
|
Returns the SOAP client implementation used (normally a SOAP::WSDL::Client
|
||||||
object).
|
object).
|
||||||
|
|
||||||
Useful for enabling tracing:
|
|
||||||
|
|
||||||
# enable tracing via 'warn'
|
|
||||||
$soap->get_client->set_trace(1);
|
|
||||||
|
|
||||||
# enable tracing via a custom facility -
|
|
||||||
# Log::Log4perl in this case...
|
|
||||||
$soap->get_client->set_trace(sub { Log::Log4perl->get_logger->info(@_) } );
|
|
||||||
|
|
||||||
=head1 EXAMPLES
|
=head1 EXAMPLES
|
||||||
|
|
||||||
See the examples/ directory.
|
See the examples/ directory.
|
||||||
@@ -504,7 +489,7 @@ See the examples/ directory.
|
|||||||
|
|
||||||
SOAP::WSDL 2 is a complete rewrite. While SOAP::WSDL 1.x attempted to
|
SOAP::WSDL 2 is a complete rewrite. While SOAP::WSDL 1.x attempted to
|
||||||
process the WSDL file on the fly by using XPath queries, SOAP:WSDL 2 uses a
|
process the WSDL file on the fly by using XPath queries, SOAP:WSDL 2 uses a
|
||||||
SAX filter for parsing the WSDL and building up a object tree representing
|
Expat handler for parsing the WSDL and building up a object tree representing
|
||||||
it's content.
|
it's content.
|
||||||
|
|
||||||
The object tree has two main functions: It knows how to serialize data passed
|
The object tree has two main functions: It knows how to serialize data passed
|
||||||
@@ -515,12 +500,12 @@ L<SOAP::WSDL::Manual> for using it.
|
|||||||
|
|
||||||
=item * no_dispatch
|
=item * no_dispatch
|
||||||
|
|
||||||
call() with outputtxml set to true now returns the complete SOAP
|
call() with no_dispatch set to true now returns the complete SOAP request
|
||||||
envelope, not only the body's content.
|
envelope, not only the body's content.
|
||||||
|
|
||||||
=item * outputxml
|
=item * outputxml
|
||||||
|
|
||||||
call() with outputxml set to true now returns the complete SOAP
|
call() with outputxml set to true now returns the complete SOAP response
|
||||||
envelope, not only the body's content.
|
envelope, not only the body's content.
|
||||||
|
|
||||||
=item * servicename/portname
|
=item * servicename/portname
|
||||||
@@ -533,6 +518,14 @@ You may pass the servicename and portname as attributes to wsdlinit, though.
|
|||||||
|
|
||||||
=head1 Differences to SOAP::Lite
|
=head1 Differences to SOAP::Lite
|
||||||
|
|
||||||
|
=head2 readable
|
||||||
|
|
||||||
|
readable is a no-op in SOAP::WSDL. Actually, the XML output from SOAP::Lite
|
||||||
|
is hardly readable, either with readable switched on.
|
||||||
|
|
||||||
|
If you need readable XML messages, I suggest using your favorite XML editor
|
||||||
|
for displaying and formatting.
|
||||||
|
|
||||||
=head2 Message style/encoding
|
=head2 Message style/encoding
|
||||||
|
|
||||||
While SOAP::Lite supports rpc/encoded style/encoding only, SOAP::WSDL currently
|
While SOAP::Lite supports rpc/encoded style/encoding only, SOAP::WSDL currently
|
||||||
@@ -577,7 +570,7 @@ See below.
|
|||||||
SOAP::Lite returns only the content of the SOAP body when outputxml is set
|
SOAP::Lite returns only the content of the SOAP body when outputxml is set
|
||||||
to true. SOAP::WSDL returns the complete XML response.
|
to true. SOAP::WSDL returns the complete XML response.
|
||||||
|
|
||||||
=head3 Auto-Dispatching
|
=head2 Auto-Dispatching
|
||||||
|
|
||||||
SOAP::WSDL does B<does not> support auto-dispatching.
|
SOAP::WSDL does B<does not> support auto-dispatching.
|
||||||
|
|
||||||
@@ -592,7 +585,7 @@ SOAP::WSDL::Client and implementing something like
|
|||||||
You may even do this in a class factory - see L<wsdl2perl.pl> for creating
|
You may even do this in a class factory - see L<wsdl2perl.pl> for creating
|
||||||
such interfaces.
|
such interfaces.
|
||||||
|
|
||||||
=head3 Debugging / Tracing
|
=head2 Debugging / Tracing
|
||||||
|
|
||||||
While SOAP::Lite features a global tracing facility, SOAP::WSDL
|
While SOAP::Lite features a global tracing facility, SOAP::WSDL
|
||||||
allows to switch tracing on/of on a per-object base.
|
allows to switch tracing on/of on a per-object base.
|
||||||
@@ -601,13 +594,14 @@ This has to be done in the SOAP client used by SOAP::WSDL - see
|
|||||||
L<get_client|get_client> for an example and L<SOAP::WSDL::Client> for
|
L<get_client|get_client> for an example and L<SOAP::WSDL::Client> for
|
||||||
details.
|
details.
|
||||||
|
|
||||||
=head1 Bugs and Limitations
|
=head1 BUGS AND LIMITATIONS
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item * SOAP Headers are not supported
|
=item * perl 5.8.0 or higher required
|
||||||
|
|
||||||
There's no way to use SOAP Headers with SOAP::WSDL yet.
|
SOAP::WSDL needs perl 5.8.0 or higher. This is due to a bug in perls
|
||||||
|
before - see http://aspn.activestate.com/ASPN/Mail/Message/perl5-porters/929746 for details.
|
||||||
|
|
||||||
=item * Apache SOAP datatypes are not supported
|
=item * Apache SOAP datatypes are not supported
|
||||||
|
|
||||||
@@ -615,19 +609,24 @@ You currently can't use SOAP::WSDL with Apache SOAP datatypes like map.
|
|||||||
|
|
||||||
If you want this changed, email me a copy of the specs, please.
|
If you want this changed, email me a copy of the specs, please.
|
||||||
|
|
||||||
=item * outputhash
|
=item * Incomplete XML Schema definitions support
|
||||||
|
|
||||||
outputhash is not implemented yet.
|
XML Schema attribute definitions are not supported yet.
|
||||||
|
|
||||||
=item * Unsupported XML Schema definitions
|
Importing external definitions is not supported yet.
|
||||||
|
|
||||||
The following XML Schema definitions are not supported:
|
The following XML Schema definitions varieties are not supported:
|
||||||
|
|
||||||
choice
|
|
||||||
group
|
group
|
||||||
union
|
union
|
||||||
simpleContent
|
simpleContent
|
||||||
complexContent
|
|
||||||
|
The following XML Schema definition content model is only partially
|
||||||
|
supported:
|
||||||
|
|
||||||
|
complexContent - only restriction variety supported
|
||||||
|
|
||||||
|
See L<SOAP::WSDL::Manual::XSD> for details.
|
||||||
|
|
||||||
=item * Serialization of hash refs dos not work for ambiguos values
|
=item * Serialization of hash refs dos not work for ambiguos values
|
||||||
|
|
||||||
@@ -672,7 +671,7 @@ The following facets have no influence yet:
|
|||||||
|
|
||||||
Full featured SOAP-library, little WSDL support. Supports rpc-encoded style only. Many protocols supported.
|
Full featured SOAP-library, little WSDL support. Supports rpc-encoded style only. Many protocols supported.
|
||||||
|
|
||||||
=item * <XML::Compile::WSDL|XML::Compile::WSDL>
|
=item * L<XML::Compile::WSDL|XML::Compile::WSDL> / L<XML::Compile::SOAP|XML::Compile::SOAP>
|
||||||
|
|
||||||
A promising-looking approach derived from a cool functional DOM-based XML schema parser.
|
A promising-looking approach derived from a cool functional DOM-based XML schema parser.
|
||||||
|
|
||||||
@@ -711,14 +710,14 @@ spotted bugs and/or suggested improvements in the 1.2x releases.
|
|||||||
|
|
||||||
Andreas 'ac0v' Specht constantly asked for better performance.
|
Andreas 'ac0v' Specht constantly asked for better performance.
|
||||||
|
|
||||||
JT Justman provided some early feedback for the 2.xx pre-releases.
|
JT Justman provided early feedback for the 2.xx pre-releases.
|
||||||
|
|
||||||
Numerous people sent me their real-world WSDL files for testing. Thank you.
|
Numerous people sent me their real-world WSDL files for testing. Thank you.
|
||||||
|
|
||||||
Paul Kulchenko and Byrne Reese wrote and maintained SOAP::Lite and
|
Paul Kulchenko and Byrne Reese wrote and maintained SOAP::Lite and
|
||||||
thus provided a base (and counterpart) for SOAP::WSDL.
|
thus provided a base (and counterpart) for SOAP::WSDL.
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
Copyright 2004-2007 Martin Kutter.
|
Copyright 2004-2007 Martin Kutter.
|
||||||
|
|
||||||
@@ -731,9 +730,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 288 $
|
$Rev: 391 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: WSDL.pm 288 2007-09-29 19:34:20Z kutterma $
|
$Id: WSDL.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.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
+23
-73
@@ -3,7 +3,9 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use List::Util qw(first);
|
use List::Util qw(first);
|
||||||
use Carp;
|
use Carp qw(croak carp confess);
|
||||||
|
|
||||||
|
our $VERSION='2.00_17';
|
||||||
|
|
||||||
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<()>);
|
||||||
@@ -16,6 +18,7 @@ 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 {};
|
||||||
@@ -29,8 +32,8 @@ sub _accept {
|
|||||||
$class =~ s{ \A SOAP::WSDL:: }{}xms;
|
$class =~ s{ \A SOAP::WSDL:: }{}xms;
|
||||||
$class =~ s{ (:? :: ) }{_}gxms;
|
$class =~ s{ (:? :: ) }{_}gxms;
|
||||||
my $method = "visit_$class";
|
my $method = "visit_$class";
|
||||||
no strict qw(refs);
|
no strict qw(refs); ## no critic ProhibitNoStrict
|
||||||
shift->$method( $self );
|
return shift->$method( $self );
|
||||||
}
|
}
|
||||||
|
|
||||||
# unfortunately, AUTOMETHOD is SLOW.
|
# unfortunately, AUTOMETHOD is SLOW.
|
||||||
@@ -50,7 +53,7 @@ sub AUTOMETHOD {
|
|||||||
## 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...
|
||||||
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;
|
||||||
@@ -83,13 +86,12 @@ sub AUTOMETHOD {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub init {
|
sub init {
|
||||||
my $self = shift;
|
my ($self, @args) = @_;
|
||||||
my @args = @_;
|
|
||||||
foreach my $value (@args)
|
foreach my $value (@args)
|
||||||
{
|
{
|
||||||
die @args 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 }
|
croak $xmlns_of{ ident $self }
|
||||||
if ref $xmlns_of{ ident $self } ne 'HASH';
|
if ref $xmlns_of{ ident $self } ne 'HASH';
|
||||||
|
|
||||||
# add namespaces
|
# add namespaces
|
||||||
@@ -111,81 +113,29 @@ sub init {
|
|||||||
return $self;
|
return $self;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub add_namespace {
|
|
||||||
my ($self, $uri, $prefix ) = @_;
|
|
||||||
return unless $uri;
|
|
||||||
$self->{ namespace } ||= {};
|
|
||||||
$self->{ namespace }->{ $uri } = $prefix;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub to_typemap {
|
|
||||||
warn "to_typemap";
|
|
||||||
return q{};
|
|
||||||
}
|
|
||||||
|
|
||||||
sub expand {
|
sub expand {
|
||||||
my ($self, , $qname) = @_;
|
my ($self, , $qname) = @_;
|
||||||
my ($prefix, $localname) = split /:/, $qname;
|
my ($prefix, $localname) = split /:/x, $qname;
|
||||||
my %ns_map = reverse %{ $self->get_xmlns() };
|
my %ns_map = reverse %{ $self->get_xmlns() };
|
||||||
return ($ns_map{ $prefix }, $localname) if ($ns_map{ $prefix });
|
return ($ns_map{ $prefix }, $localname) if ($ns_map{ $prefix });
|
||||||
|
|
||||||
if (my $parent = $self->get_parent()) {
|
if (my $parent = $self->get_parent()) {
|
||||||
return $parent->expand($qname);
|
return $parent->expand($qname);
|
||||||
}
|
}
|
||||||
die "unbound prefix $prefix found for $prefix:$localname";
|
confess "unbound prefix $prefix found for $prefix:$localname";
|
||||||
}
|
}
|
||||||
sub _expand;
|
sub _expand;
|
||||||
*_expand = \&expand;
|
*_expand = \&expand;
|
||||||
|
|
||||||
|
|
||||||
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) ) {
|
|
||||||
warn 'element_prefix should end with "::"';
|
|
||||||
$element_prefix .= '::';
|
|
||||||
}
|
|
||||||
|
|
||||||
# Be careful: a Element may be ComplexType, too
|
|
||||||
# (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();
|
|
||||||
}
|
|
||||||
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 $
|
||||||
|
#
|
||||||
|
|
||||||
|
|||||||
+28
-30
@@ -11,7 +11,7 @@ use SOAP::WSDL::Factory::Serializer;
|
|||||||
use SOAP::WSDL::Factory::Transport;
|
use SOAP::WSDL::Factory::Transport;
|
||||||
use SOAP::WSDL::Expat::MessageParser;
|
use SOAP::WSDL::Expat::MessageParser;
|
||||||
|
|
||||||
our $VERSION = '2.00_16';
|
our $VERSION = '2.00_17';
|
||||||
|
|
||||||
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<()>);
|
||||||
@@ -21,7 +21,6 @@ my %endpoint_of :ATTR(:name<endpoint> :default<()>);
|
|||||||
|
|
||||||
my %soap_version_of :ATTR(:get<soap_version> :init_attr<soap_version> :default<'1.1'>);
|
my %soap_version_of :ATTR(:get<soap_version> :init_attr<soap_version> :default<'1.1'>);
|
||||||
|
|
||||||
my %trace_of :ATTR(:set<trace> :init_arg<trace> :default<()> );
|
|
||||||
my %on_action_of :ATTR(:name<on_action> :default<()>);
|
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 %content_type_of :ATTR(:name<content_type> :default<text/xml; charset=utf8>); #/#trick editors
|
||||||
my %serializer_of :ATTR(:name<serializer> :default<()>);
|
my %serializer_of :ATTR(:name<serializer> :default<()>);
|
||||||
@@ -34,19 +33,10 @@ sub BUILD {
|
|||||||
$self->set_proxy( $attrs_of_ref->{ proxy } );
|
$self->set_proxy( $attrs_of_ref->{ proxy } );
|
||||||
delete $attrs_of_ref->{ proxy };
|
delete $attrs_of_ref->{ proxy };
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub get_trace {
|
sub get_proxy { ## no critic RequireArgUnpacking
|
||||||
my $ident = ident $_[0];
|
|
||||||
return $trace_of{ $ident }
|
|
||||||
? ref $trace_of{ $ident } eq 'CODE'
|
|
||||||
? $trace_of{ $ident }
|
|
||||||
: sub { warn @_ }
|
|
||||||
: ()
|
|
||||||
}
|
|
||||||
|
|
||||||
sub get_proxy {
|
|
||||||
return $_[0]->get_transport();
|
return $_[0]->get_transport();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,7 +70,6 @@ sub set_soap_version {
|
|||||||
# serializer object
|
# serializer object
|
||||||
delete $serializer_of{ $ident };
|
delete $serializer_of{ $ident };
|
||||||
delete $deserializer_of{ $ident };
|
delete $deserializer_of{ $ident };
|
||||||
delete $transport_of{ $ident };
|
|
||||||
|
|
||||||
$soap_version_of{ $ident } = shift;
|
$soap_version_of{ $ident } = shift;
|
||||||
|
|
||||||
@@ -89,10 +78,10 @@ sub set_soap_version {
|
|||||||
|
|
||||||
# Mimic SOAP::Lite's behaviour for getter/setter routines
|
# 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(@_);
|
||||||
@@ -125,9 +114,8 @@ sub call {
|
|||||||
? ( $method->{ operation }, $method->{ soap_action } )
|
? ( $method->{ operation }, $method->{ soap_action } )
|
||||||
: (blessed $data
|
: (blessed $data
|
||||||
&& $data->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType'))
|
&& $data->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType'))
|
||||||
? ( $method , (join '/', $data->get_xmlns(), $method) )
|
? ( $method , (join q{/}, $data->get_xmlns(), $method) )
|
||||||
: ( $method, q{} );
|
: ( $method, q{} );
|
||||||
|
|
||||||
$serializer_of{ $ident } ||= SOAP::WSDL::Factory::Serializer->get_serializer({
|
$serializer_of{ $ident } ||= SOAP::WSDL::Factory::Serializer->get_serializer({
|
||||||
soap_version => $self->get_soap_version(),
|
soap_version => $self->get_soap_version(),
|
||||||
});
|
});
|
||||||
@@ -159,10 +147,7 @@ sub call {
|
|||||||
content_type => $content_type_of{ $ident },
|
content_type => $content_type_of{ $ident },
|
||||||
envelope => $envelope,
|
envelope => $envelope,
|
||||||
action => $soap_action,
|
action => $soap_action,
|
||||||
on_receive_chunk => sub {} # optional, may be used for parsing large responses as they arrive.
|
# on_receive_chunk => sub {} # optional, may be used for parsing large responses as they arrive.
|
||||||
# might not be supported by all transport layers...
|
|
||||||
# and, of course, only is of interest for chunk parsers -
|
|
||||||
# namely ExpatNB and XML::LibXML's Push parser interface...
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return $response if ($outputxml_of{ $ident } );
|
return $response if ($outputxml_of{ $ident } );
|
||||||
@@ -179,8 +164,14 @@ sub call {
|
|||||||
# Try deserializing response - there may be some,
|
# Try deserializing response - there may be some,
|
||||||
# even if transport did not succeed (got a 500 response)
|
# even if transport did not succeed (got a 500 response)
|
||||||
if ( $response ) {
|
if ( $response ) {
|
||||||
my $result = eval { $deserializer_of{ $ident }->deserialize( $response ); };
|
my ($result_body, $result_header) = eval {
|
||||||
return $result if (not $@);
|
$deserializer_of{ $ident }->deserialize( $response );
|
||||||
|
};
|
||||||
|
if (not $@) {
|
||||||
|
return wantarray
|
||||||
|
? ($result_body, $result_header)
|
||||||
|
: $result_body;
|
||||||
|
}
|
||||||
return $deserializer_of{ $ident }->generate_fault({
|
return $deserializer_of{ $ident }->generate_fault({
|
||||||
code => 'soap:Server',
|
code => 'soap:Server',
|
||||||
role => 'urn:localhost',
|
role => 'urn:localhost',
|
||||||
@@ -214,6 +205,14 @@ __END__
|
|||||||
|
|
||||||
SOAP::WSDL::Client - SOAP::WSDL's SOAP Client
|
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
|
=head1 METHODS
|
||||||
|
|
||||||
=head2 call
|
=head2 call
|
||||||
@@ -242,7 +241,6 @@ 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
|
mostly correct, but may fail). Operation style and body encoding are assumed to
|
||||||
be document/literal
|
be document/literal
|
||||||
|
|
||||||
|
|
||||||
=head2 Configuration methods
|
=head2 Configuration methods
|
||||||
|
|
||||||
=head3 outputxml
|
=head3 outputxml
|
||||||
@@ -347,7 +345,7 @@ SOAP::WSDL::Client and implementing something like
|
|||||||
You may even do this in a class factory - see L<wsdl2perl.pl> for creating
|
You may even do this in a class factory - see L<wsdl2perl.pl> for creating
|
||||||
such interfaces.
|
such interfaces.
|
||||||
|
|
||||||
=head1 Troubleshooting
|
=head1 TROUBLESHOOTING
|
||||||
|
|
||||||
=head2 Accessing protected web services
|
=head2 Accessing protected web services
|
||||||
|
|
||||||
@@ -360,12 +358,12 @@ new method's I<proxy> argument).
|
|||||||
|
|
||||||
Refer to the appropriate transport module for documentation.
|
Refer to the appropriate transport module for documentation.
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
Copyright 2004-2007 Martin Kutter.
|
Copyright 2004-2007 Martin Kutter.
|
||||||
|
|
||||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
This file is part of SOAP-WSDL. You may distribute/modify it under the same
|
||||||
the same terms as perl itself
|
terms as perl itself
|
||||||
|
|
||||||
=head1 AUTHOR
|
=head1 AUTHOR
|
||||||
|
|
||||||
@@ -373,9 +371,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 288 $
|
$Rev: 391 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: Client.pm 288 2007-09-29 19:34:20Z kutterma $
|
$Id: Client.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/Client.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -4,9 +4,12 @@ use warnings;
|
|||||||
use base 'SOAP::WSDL::Client';
|
use base 'SOAP::WSDL::Client';
|
||||||
use Scalar::Util qw(blessed);
|
use Scalar::Util qw(blessed);
|
||||||
|
|
||||||
|
our $VERSION = '2.00_24';
|
||||||
|
|
||||||
sub call {
|
sub call {
|
||||||
my ($self, $method, $body, $header) = @_;
|
my ($self, $method, $body, $header) = @_;
|
||||||
if (not blessed $body) {
|
if (not blessed $body) {
|
||||||
|
$body = {} if not defined $body;
|
||||||
my $class = $method->{ body }->{ parts }->[0];
|
my $class = $method->{ body }->{ parts }->[0];
|
||||||
eval "require $class" || die $@;
|
eval "require $class" || die $@;
|
||||||
$body = $class->new($body);
|
$body = $class->new($body);
|
||||||
@@ -23,53 +26,35 @@ sub call {
|
|||||||
return $self->SUPER::call($method, $body, $header);
|
return $self->SUPER::call($method, $body, $header);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub __create_new {
|
|
||||||
my ($package, %args_of) = @_;
|
|
||||||
|
|
||||||
no strict qw(refs);
|
|
||||||
|
|
||||||
# TODO factor out and replace by generated START method
|
|
||||||
*{ "$package\::new" } = sub {
|
|
||||||
my $class = shift;
|
|
||||||
my $self = $class->SUPER::new({
|
|
||||||
proxy => $args_of{ proxy },
|
|
||||||
class_resolver => $args_of{ class_resolver }
|
|
||||||
});
|
|
||||||
bless $self, $class;
|
|
||||||
return $self;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub __create_methods {
|
sub __create_methods {
|
||||||
my ($package, %info_of) = @_;
|
my ($package, %info_of) = @_;
|
||||||
|
|
||||||
no strict qw(refs);
|
no strict qw(refs);
|
||||||
|
no warnings qw(redefine);
|
||||||
|
for my $method (keys %info_of){
|
||||||
|
my ($soap_action, @parts);
|
||||||
|
|
||||||
for my $method (keys %info_of){
|
# up to 2.00_10 we had list refs...
|
||||||
my ($soap_action, @parts);
|
if (ref $info_of{ $method }eq 'HASH') {
|
||||||
|
@parts = @{ $info_of{ $method }->{ parts } };
|
||||||
|
$soap_action = $info_of{ $method }->{ soap_action };
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
die "Pre-v2.00_10 Interfaces are no longer supported. Please re-generate your interface.";
|
||||||
|
}
|
||||||
|
|
||||||
# up to 2.00_10 we had list refs...
|
*{ "$package\::$method" } = sub {
|
||||||
if (ref $info_of{ $method }eq 'HASH') {
|
my $self = shift;
|
||||||
@parts = @{ $info_of{ $method }->{ parts } };
|
my @param = map {
|
||||||
$soap_action = $info_of{ $method }->{ soap_action };
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
@parts = @{ $info_of{ $method } };
|
|
||||||
$soap_action = ();
|
|
||||||
}
|
|
||||||
|
|
||||||
*{ "$package\::$method" } = sub {
|
|
||||||
my $self = shift;
|
|
||||||
my @param = map {
|
|
||||||
my $data = shift || {};
|
my $data = shift || {};
|
||||||
eval "require $_";
|
eval "require $_";
|
||||||
$_->new( $data );
|
$_->new( $data );
|
||||||
} @parts;
|
} @parts;
|
||||||
|
|
||||||
return $self->SUPER::call( {
|
return $self->SUPER::call( {
|
||||||
operation => $method,
|
operation => $method,
|
||||||
soap_action => $soap_action,
|
soap_action => $soap_action,
|
||||||
}, @param );
|
}, @param );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -88,10 +73,6 @@ SOAP::WSDL::Client::Base - Factory class for WSDL-based SOAP access
|
|||||||
|
|
||||||
package MySoapInterface;
|
package MySoapInterface;
|
||||||
use SOAP::WSDL::Client::Base;
|
use SOAP::WSDL::Client::Base;
|
||||||
__PACKAGE__->__create_new(
|
|
||||||
proxy => 'http://somewhere.over.the.rainbow',
|
|
||||||
class_resolver => 'Typemap::MySoapInterface'
|
|
||||||
);
|
|
||||||
__PACKAGE__->__create_methods( qw(one two three) );
|
__PACKAGE__->__create_methods( qw(one two three) );
|
||||||
1;
|
1;
|
||||||
|
|
||||||
@@ -100,12 +81,12 @@ SOAP::WSDL::Client::Base - Factory class for WSDL-based SOAP access
|
|||||||
Factory class for creating interface classes. Should probably be renamed to
|
Factory class for creating interface classes. Should probably be renamed to
|
||||||
SOAP::WSDL::Factory::Interface...
|
SOAP::WSDL::Factory::Interface...
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
Copyright 2004-2007 Martin Kutter.
|
Copyright 2004-2007 Martin Kutter.
|
||||||
|
|
||||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
This file is part of SOAP-WSDL. You may distribute/modify it under the same
|
||||||
the same terms as perl itself
|
terms as perl itself
|
||||||
|
|
||||||
=head1 AUTHOR
|
=head1 AUTHOR
|
||||||
|
|
||||||
@@ -113,9 +94,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 283 $
|
$Rev: 391 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: Base.pm 283 2007-09-27 19:06:29Z kutterma $
|
$Id: Base.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/Client/Base.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ use List::Util qw(first);
|
|||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
|
our $VERSION='2.00_17';
|
||||||
|
|
||||||
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<()>);
|
||||||
@@ -28,9 +30,8 @@ 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_from) = @_;
|
my ($self, @args_from) = @_;
|
||||||
@args_from = @{ $args_from[0] } if ref $args_from[0] eq 'ARRAY';
|
@args_from = @{ $args_from[0] } if ref $args_from[0] eq 'ARRAY';
|
||||||
@@ -43,14 +44,6 @@ BLOCK: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
@@ -112,7 +105,7 @@ Returns the message matching the namespace/localname pair passed as arguments.
|
|||||||
Accessors/Mutators for accessing / setting the E<gt>typesE<lt> child
|
Accessors/Mutators for accessing / setting the E<gt>typesE<lt> child
|
||||||
element(s).
|
element(s).
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE and COPYRIGHT
|
||||||
|
|
||||||
Copyright 2004-2007 Martin Kutter.
|
Copyright 2004-2007 Martin Kutter.
|
||||||
|
|
||||||
@@ -123,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: 391 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: Definitions.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/Definitions.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -8,19 +8,17 @@ use SOAP::WSDL::Expat::Message2Hash;
|
|||||||
use SOAP::WSDL::Factory::Deserializer;
|
use SOAP::WSDL::Factory::Deserializer;
|
||||||
SOAP::WSDL::Factory::Deserializer->register( '1.1', __PACKAGE__ );
|
SOAP::WSDL::Factory::Deserializer->register( '1.1', __PACKAGE__ );
|
||||||
|
|
||||||
our $VERSION='2.00_16';
|
our $VERSION='2.00_24';
|
||||||
|
|
||||||
sub BUILD {
|
sub BUILD {
|
||||||
my ($self, $ident, $args_of_ref) = @_;
|
my ($self, $ident, $args_of_ref) = @_;
|
||||||
|
|
||||||
# ignore all options except 'class_resolver'
|
# ignore all options
|
||||||
for (keys %{ $args_of_ref }) {
|
for (keys %{ $args_of_ref }) {
|
||||||
delete $args_of_ref->{ $_ }
|
delete $args_of_ref->{ $_ }
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
sub deserialize {
|
sub deserialize {
|
||||||
my ($self, $content) = @_;
|
my ($self, $content) = @_;
|
||||||
|
|
||||||
@@ -141,12 +139,12 @@ a parse error appears
|
|||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
Copyright 2004-2007 Martin Kutter.
|
Copyright 2004-2007 Martin Kutter.
|
||||||
|
|
||||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||||
the same terms as perl itself
|
the same terms as perl itself.
|
||||||
|
|
||||||
=head1 AUTHOR
|
=head1 AUTHOR
|
||||||
|
|
||||||
@@ -154,9 +152,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 176 $
|
$Rev: 391 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: Serializer.pm 176 2007-08-31 15:28:29Z kutterma $
|
$Id: Hash.pm 391 2007-11-17 21:56:13Z kutterma $
|
||||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/Hash.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -1,50 +0,0 @@
|
|||||||
package SOAP::WSDL::Deserializer::SOAP11;
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
use Class::Std::Storable;
|
|
||||||
use SOAP::WSDL::SOAP::Typelib::Fault11;
|
|
||||||
use SOAP::WSDL::Expat::MessageParser;
|
|
||||||
|
|
||||||
our $VERSION='2.00_13';
|
|
||||||
|
|
||||||
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
|
|
||||||
|
|
||||||
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) = @_;
|
|
||||||
|
|
||||||
my $parser = SOAP::WSDL::Expat::MessageParser->new({
|
|
||||||
class_resolver => $class_resolver_of{ ident $self },
|
|
||||||
});
|
|
||||||
eval { $parser->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->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;
|
|
||||||
@@ -2,7 +2,7 @@ package SOAP::WSDL::Deserializer::SOM;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
our $VERSION = '2.00_15';
|
our $VERSION = '2.00_24';
|
||||||
our @ISA;
|
our @ISA;
|
||||||
|
|
||||||
eval {
|
eval {
|
||||||
@@ -66,8 +66,6 @@ This may be XML including mixed content, attachements and other XML data not
|
|||||||
SOAP::WSDL::Deserializer::SOM is a subclass of L<SOAP::Deserializer|SOAP::Deserializer>
|
SOAP::WSDL::Deserializer::SOM is a subclass of L<SOAP::Deserializer|SOAP::Deserializer>
|
||||||
from the L<SOAP::Lite|SOAP::Lite> package.
|
from the L<SOAP::Lite|SOAP::Lite> package.
|
||||||
|
|
||||||
You may
|
|
||||||
|
|
||||||
=head1 USAGE
|
=head1 USAGE
|
||||||
|
|
||||||
SOAP::WSDL::Deserializer will not auroregister itself - to use it for a particular
|
SOAP::WSDL::Deserializer will not auroregister itself - to use it for a particular
|
||||||
@@ -103,12 +101,12 @@ to generate_fault.
|
|||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
Copyright 2004-2007 Martin Kutter.
|
Copyright 2004-2007 Martin Kutter.
|
||||||
|
|
||||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||||
the same terms as perl itself
|
the same terms as perl itself.
|
||||||
|
|
||||||
=head1 AUTHOR
|
=head1 AUTHOR
|
||||||
|
|
||||||
@@ -116,9 +114,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 176 $
|
$Rev: 391 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: Serializer.pm 176 2007-08-31 15:28:29Z kutterma $
|
$Id: SOM.pm 391 2007-11-17 21:56:13Z kutterma $
|
||||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/SOM.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -0,0 +1,106 @@
|
|||||||
|
package SOAP::WSDL::Deserializer::XSD;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Storable;
|
||||||
|
use SOAP::WSDL::SOAP::Typelib::Fault11;
|
||||||
|
use SOAP::WSDL::Expat::MessageParser;
|
||||||
|
|
||||||
|
our $VERSION='2.00_24';
|
||||||
|
|
||||||
|
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
|
||||||
|
|
||||||
|
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) = @_;
|
||||||
|
|
||||||
|
my $parser = SOAP::WSDL::Expat::MessageParser->new({
|
||||||
|
class_resolver => $class_resolver_of{ ident $self },
|
||||||
|
});
|
||||||
|
eval { $parser->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->get_data(), $parser->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: 391 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: XSD.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/XSD.pm $
|
||||||
|
|
||||||
|
=cut
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package SOAP::WSDL::Expat::Base;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use XML::Parser::Expat;
|
||||||
|
|
||||||
|
our $VERSION = '2.00_24';
|
||||||
|
|
||||||
|
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;
|
||||||
@@ -2,19 +2,14 @@
|
|||||||
package SOAP::WSDL::Expat::Message2Hash;
|
package SOAP::WSDL::Expat::Message2Hash;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use XML::Parser::Expat;
|
use base qw(SOAP::WSDL::Expat::Base);
|
||||||
|
|
||||||
sub new {
|
our $VERSION = '2.00_24';
|
||||||
my ($class, $args) = @_;
|
|
||||||
my $self = {};
|
|
||||||
bless $self, $class;
|
|
||||||
return $self;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub _initialize {
|
sub _initialize {
|
||||||
my ($self, $parser) = @_;
|
my ($self, $parser) = @_;
|
||||||
$self->{ parser } = $parser;
|
$self->{ parser } = $parser;
|
||||||
delete $self->{ data }; # remove potential old results
|
delete $self->{ data }; # remove potential old results
|
||||||
|
|
||||||
my $characters;
|
my $characters;
|
||||||
my $current = {};
|
my $current = {};
|
||||||
@@ -23,25 +18,25 @@ sub _initialize {
|
|||||||
$self->{ data } = $current;
|
$self->{ data } = $current;
|
||||||
|
|
||||||
# use "globals" for speed
|
# use "globals" for speed
|
||||||
my ($_prefix, $_localname, $_element, $_method,
|
my ($_element, $_method,
|
||||||
$_class, $_parser, %_attrs) = ();
|
$_class, $_parser, %_attrs) = ();
|
||||||
|
|
||||||
no strict qw(refs);
|
no strict qw(refs);
|
||||||
$parser->setHandlers(
|
$parser->setHandlers(
|
||||||
Start => sub {
|
Start => sub {
|
||||||
push @$list, $current;
|
push @$list, $current;
|
||||||
#If our element exists and is a list ref, add to it
|
#If our element exists and is a list ref, add to it
|
||||||
if ( exists $current->{ $_[1] }
|
if ( exists $current->{ $_[1] }
|
||||||
&& ( ref ($current->{ $_[1] }) eq 'ARRAY')
|
&& ( ref ($current->{ $_[1] }) eq 'ARRAY')
|
||||||
) {
|
) {
|
||||||
push @{ $current->{ $_[1] } }, {};
|
push @{ $current->{ $_[1] } }, {};
|
||||||
$current = $current->{ $_[1] }->[-1];
|
$current = $current->{ $_[1] }->[-1];
|
||||||
}
|
}
|
||||||
elsif ( exists $current->{ $_[1] } )
|
elsif ( exists $current->{ $_[1] } )
|
||||||
{
|
{
|
||||||
$current->{ $_[1] } = [ $current->{ $_[1] }, {} ];
|
$current->{ $_[1] } = [ $current->{ $_[1] }, {} ];
|
||||||
$current = $current->{ $_[1] }->[-1];
|
$current = $current->{ $_[1] }->[-1];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$current->{ $_[1] } = {};
|
$current->{ $_[1] } = {};
|
||||||
$current = $current->{ $_[1] };
|
$current = $current->{ $_[1] };
|
||||||
@@ -56,8 +51,6 @@ sub _initialize {
|
|||||||
|
|
||||||
End => sub {
|
End => sub {
|
||||||
$_element = $_[1];
|
$_element = $_[1];
|
||||||
($_prefix, $_localname) = split m{:}xms , $_element;
|
|
||||||
$_localname ||= $_element; # for non-prefixed elements
|
|
||||||
|
|
||||||
# This one easily handles ignores for us, too...
|
# This one easily handles ignores for us, too...
|
||||||
# return if not ref $$list[-1];
|
# return if not ref $$list[-1];
|
||||||
@@ -78,42 +71,13 @@ sub _initialize {
|
|||||||
return $parser;
|
return $parser;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub parse {
|
|
||||||
eval {
|
|
||||||
$_[0]->_initialize( XML::Parser::Expat->new( Namespaces => 1 ) )->parse( $_[1] );
|
|
||||||
$_[0]->{ parser }->release();
|
|
||||||
};
|
|
||||||
die $@ if $@;
|
|
||||||
return $_[0]->{ data };
|
|
||||||
}
|
|
||||||
|
|
||||||
sub parsefile {
|
|
||||||
eval {
|
|
||||||
$_[0]->_initialize( XML::Parser::Expat->new( Namespaces => 1 ) )->parsefile( $_[1] );
|
|
||||||
$_[0]->{ parser }->release();
|
|
||||||
};
|
|
||||||
die $@, $_[1] 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;
|
1;
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME
|
=head1 NAME
|
||||||
|
|
||||||
SOAP::WSDL::Expat::MessageParser - Convert SOAP messages to custom object trees
|
SOAP::WSDL::Expat::Message2Hash - Convert SOAP messages to perl hash refs
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
@@ -127,14 +91,7 @@ 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 and set the type map entry to '__SKIP__'.
|
|
||||||
|
|
||||||
=head1 Bugs and Limitations
|
=head1 Bugs and Limitations
|
||||||
|
|
||||||
@@ -142,6 +99,8 @@ the message and set the type map entry to '__SKIP__'.
|
|||||||
|
|
||||||
=item * Ignores all namespaces
|
=item * Ignores all namespaces
|
||||||
|
|
||||||
|
=item * Ignores all attributes
|
||||||
|
|
||||||
=item * Does not handle mixed content
|
=item * Does not handle mixed content
|
||||||
|
|
||||||
=item * The SOAP header is ignored
|
=item * The SOAP header is ignored
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ package SOAP::WSDL::Expat::MessageParser;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin;
|
use SOAP::WSDL::XSD::Typelib::Builtin;
|
||||||
use XML::Parser::Expat;
|
use base qw(SOAP::WSDL::Expat::Base);
|
||||||
|
|
||||||
|
our $VERSION = '2.00_24';
|
||||||
|
|
||||||
sub new {
|
sub new {
|
||||||
my ($class, $args) = @_;
|
my ($class, $args) = @_;
|
||||||
@@ -17,8 +19,8 @@ sub new {
|
|||||||
|
|
||||||
sub class_resolver {
|
sub class_resolver {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
$self->{ class_resolver } = shift;
|
$self->{ class_resolver } = shift if @_;
|
||||||
return;
|
return $self->{ class_resolver };
|
||||||
}
|
}
|
||||||
|
|
||||||
sub _initialize {
|
sub _initialize {
|
||||||
@@ -26,6 +28,7 @@ sub _initialize {
|
|||||||
$self->{ parser } = $parser;
|
$self->{ parser } = $parser;
|
||||||
|
|
||||||
delete $self->{ data }; # remove potential old results
|
delete $self->{ data }; # remove potential old results
|
||||||
|
delete $self->{ header };
|
||||||
|
|
||||||
my $characters;
|
my $characters;
|
||||||
#my @characters_from = ();
|
#my @characters_from = ();
|
||||||
@@ -48,6 +51,15 @@ sub _initialize {
|
|||||||
},
|
},
|
||||||
1 => sub {
|
1 => sub {
|
||||||
$depth++;
|
$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;
|
return;
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -86,19 +98,18 @@ sub _initialize {
|
|||||||
|
|
||||||
if ($_class eq '__SKIP__') {
|
if ($_class eq '__SKIP__') {
|
||||||
$skip = join('/', @{ $path });
|
$skip = join('/', @{ $path });
|
||||||
$self->setHandlers( Char => undef );
|
$_[0]->setHandlers( Char => undef );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
push @$list, $current; # step down in tree ()remember current)
|
push @$list, $current; # step down in tree (remember current)
|
||||||
|
|
||||||
$characters = q(); # empty characters
|
$characters = q(); # empty characters
|
||||||
#@characters_from = ();
|
|
||||||
|
|
||||||
# Check whether we have a builtin - we implement them as classes
|
# Check whether we have a builtin - we implement them as classes
|
||||||
# We could replace this with UNIVERSAL->isa() - but it's slow...
|
# We could replace this with UNIVERSAL->isa() - but it's slow...
|
||||||
# match is a bit faster if the string does not match, but WAY slower
|
# match is a bit faster if the string does not match, but WAY slower
|
||||||
# if $class matches...
|
# if $class matches. We hope to match often...
|
||||||
if (index $_class, 'SOAP::WSDL::XSD::Typelib::Builtin', 0 < 0) {
|
if (index $_class, 'SOAP::WSDL::XSD::Typelib::Builtin', 0 < 0) {
|
||||||
# check wheter there is a non-empty ARRAY reference for $_class::ISA
|
# check wheter there is a non-empty ARRAY reference for $_class::ISA
|
||||||
# or a "new" method
|
# or a "new" method
|
||||||
@@ -123,13 +134,12 @@ sub _initialize {
|
|||||||
Char => $char_handler,
|
Char => $char_handler,
|
||||||
|
|
||||||
End => sub {
|
End => sub {
|
||||||
|
|
||||||
pop @{ $path }; # step up in path
|
pop @{ $path }; # step up in path
|
||||||
|
|
||||||
if ($skip) {
|
if ($skip) {
|
||||||
return if $skip ne join '/', @{ $path }, $_[1];
|
return if $skip ne join '/', @{ $path }, $_[1];
|
||||||
$skip = 0;
|
$skip = 0;
|
||||||
$_[0]->setHandler( Char => $char_handler );
|
$_[0]->setHandlers( Char => $char_handler );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,37 +175,8 @@ sub _initialize {
|
|||||||
return $parser;
|
return $parser;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub parse {
|
sub get_header {
|
||||||
eval {
|
return $_[0]->{ header };
|
||||||
$_[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();
|
|
||||||
};
|
|
||||||
die $@, $_[1] 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;
|
1;
|
||||||
@@ -218,7 +199,7 @@ 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
|
=head2 Skipping unwanted items
|
||||||
|
|
||||||
@@ -239,23 +220,22 @@ the message and set the type map entry to '__SKIP__'.
|
|||||||
|
|
||||||
=back
|
=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
|
=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 REPOSITORY INFORMATION
|
||||||
|
|
||||||
=head1 COPYING
|
$Rev: 391 $
|
||||||
|
|
||||||
This module may be used under the same terms as perl itself.
|
|
||||||
|
|
||||||
=head1 Repository information
|
|
||||||
|
|
||||||
$ID: $
|
|
||||||
|
|
||||||
$LastChangedDate: 2007-09-27 21:06:29 +0200 (Don, 27 Sep 2007) $
|
|
||||||
$LastChangedRevision: 283 $
|
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: MessageParser.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/Expat/MessageParser.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $
|
||||||
|
|
||||||
|
=cut
|
||||||
@@ -1,241 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
package SOAP::WSDL::Expat::MessageParser;
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin;
|
|
||||||
use XML::Parser::Expat;
|
|
||||||
|
|
||||||
sub new {
|
|
||||||
my ($class, $args) = @_;
|
|
||||||
my $self = {
|
|
||||||
class_resolver => $args->{ class_resolver },
|
|
||||||
};
|
|
||||||
bless $self, $class;
|
|
||||||
return $self;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub class_resolver {
|
|
||||||
my $self = shift;
|
|
||||||
$self->{ class_resolver } = shift;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub _initialize {
|
|
||||||
my ($self, $parser) = @_;
|
|
||||||
$self->{ parser } = $parser;
|
|
||||||
|
|
||||||
delete $self->{ data };
|
|
||||||
|
|
||||||
my $characters = q{};
|
|
||||||
my $current = undef;
|
|
||||||
my $list = []; # node list
|
|
||||||
my $path = []; # current path
|
|
||||||
my $current_part = q{}; # are we in header or body ?
|
|
||||||
my $depth = 0;
|
|
||||||
|
|
||||||
# use "globals" for speed
|
|
||||||
my ($_prefix, $_method,
|
|
||||||
$_class) = ();
|
|
||||||
|
|
||||||
my @check_sub_from = (
|
|
||||||
);
|
|
||||||
|
|
||||||
no strict qw(refs);
|
|
||||||
$parser->setHandlers(
|
|
||||||
Start => sub {
|
|
||||||
# my ($parser, $element, %_attrs) = @_;
|
|
||||||
#return if $skip; # skip inside __SKIP__
|
|
||||||
return if exists $self->{ skip };
|
|
||||||
|
|
||||||
$_[1] =~s{ \w+: }{}xms;
|
|
||||||
|
|
||||||
if ($depth <=1) {
|
|
||||||
if ($depth == 0) {
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
die "Bad node $_[1]. Expected (Header|Body)" if $_[1] !~ m{(:?Header|Body)}xms;
|
|
||||||
$depth++;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
push @{ $path }, $_[1]; # step down in path
|
|
||||||
|
|
||||||
# resolve class of this element
|
|
||||||
$_class = $self->{ class_resolver }->get_class( $path )
|
|
||||||
or do {
|
|
||||||
die "Cannot resolve class for "
|
|
||||||
. join('/', @{ $path }) . " via " . $self->{ class_resolver };
|
|
||||||
};
|
|
||||||
|
|
||||||
return $self->{skip} = join('/', @{ $path }) if ($_class eq '__SKIP__');
|
|
||||||
|
|
||||||
push @$list, $current; # step down in tree ()remember current)
|
|
||||||
|
|
||||||
# $characters = q(); # empty characters
|
|
||||||
|
|
||||||
# Check whether we have a primitive - we implement them as classes
|
|
||||||
# We could replace this with UNIVERSAL->isa() - but it's slow...
|
|
||||||
# match is a bit faster if the string does not match, but WAY slower
|
|
||||||
# if $class matches...
|
|
||||||
|
|
||||||
if (index $_class, 'SOAP::WSDL::XSD::Typelib::Builtin', 0 < 0) {
|
|
||||||
# check wheter there is a non-empty ARRAY reference for $_class::ISA
|
|
||||||
# or a "new" method
|
|
||||||
# If not, require it - all classes required here MUST
|
|
||||||
# define new() or inherit from something defining it.
|
|
||||||
# This is not exactly the same as $class->can('new'), but it's way faster
|
|
||||||
defined *{ "$_class\::new" }{ CODE }
|
|
||||||
or scalar @{ *{ "$_class\::ISA" }{ ARRAY } }
|
|
||||||
or eval "require $_class" ## no critic qw(ProhibitStringyEval)
|
|
||||||
or die $@;
|
|
||||||
}
|
|
||||||
|
|
||||||
# create new object and pass it all attributes - remember, we're
|
|
||||||
# called with
|
|
||||||
# ($parser, $element, %attrs) = @_, so we can just give it
|
|
||||||
# everything from @_[2..$#_]...
|
|
||||||
$current = $_class->new({ @_[2..$#_] }); # set new current object
|
|
||||||
|
|
||||||
# remember top level element
|
|
||||||
defined $self->{ data }
|
|
||||||
or $self->{ data } = $current;
|
|
||||||
|
|
||||||
$depth++; # step down (once again)
|
|
||||||
},
|
|
||||||
|
|
||||||
Char => sub {
|
|
||||||
return if exists $self->{skip};
|
|
||||||
return if $_[1] =~ m{ \A \s* \z}xs;
|
|
||||||
$characters .= $_[1];
|
|
||||||
},
|
|
||||||
|
|
||||||
End => sub {
|
|
||||||
pop @{ $path }; # step up in path
|
|
||||||
|
|
||||||
if (exists $self->{skip}) {
|
|
||||||
return if $self->{skip} ne join '/', @{ $path }, $_[1];
|
|
||||||
delete $self->{skip};
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
# This one easily handles ignores for us, too...
|
|
||||||
return if not ref $list->[-1];
|
|
||||||
|
|
||||||
# set characters in current if we are a simple type
|
|
||||||
# we may have characters in complexTypes with simpleContent,
|
|
||||||
# too - maybe we should rely on the presence of characters ?
|
|
||||||
# may get a speedup by defining a ident method in anySimpleType
|
|
||||||
# and looking it up via exists &$class::ident;
|
|
||||||
|
|
||||||
$current->set_value( $characters ) if (length $characters);
|
|
||||||
$characters = q{};
|
|
||||||
|
|
||||||
# set appropriate attribute in last element
|
|
||||||
# multiple values must be implemented in base class
|
|
||||||
#$_method = "add_$_localname";
|
|
||||||
$_method = "add_$_[1]";
|
|
||||||
$list->[-1]->$_method( $current );
|
|
||||||
|
|
||||||
$current = pop @$list; # step up in object hierarchy...
|
|
||||||
$depth--;
|
|
||||||
# print $self->{ data };
|
|
||||||
}
|
|
||||||
);
|
|
||||||
return $parser;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub parse {
|
|
||||||
eval {
|
|
||||||
$_[0]->_initialize( XML::Parser::Expat->new() )->parse( $_[1] );
|
|
||||||
$_[0]->{ parser }->release();
|
|
||||||
};
|
|
||||||
die $@ if $@;
|
|
||||||
return $_[0]->{ data };
|
|
||||||
}
|
|
||||||
|
|
||||||
sub parsefile {
|
|
||||||
eval {
|
|
||||||
$_[0]->_initialize( XML::Parser::Expat->new() )->parsefile( $_[1] );
|
|
||||||
$_[0]->{ parser }->release();
|
|
||||||
};
|
|
||||||
die $@, $_[1] if $@;
|
|
||||||
return die $_[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::MessageParser - Convert SOAP messages to custom object trees
|
|
||||||
|
|
||||||
=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::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 and set the type map entry to '__SKIP__'.
|
|
||||||
|
|
||||||
=head1 Bugs and Limitations
|
|
||||||
|
|
||||||
=over
|
|
||||||
|
|
||||||
=item * Ignores all namespaces
|
|
||||||
|
|
||||||
=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 COPYING
|
|
||||||
|
|
||||||
This module may be used under the same terms as perl itself.
|
|
||||||
|
|
||||||
=head1 Repository information
|
|
||||||
|
|
||||||
$ID: $
|
|
||||||
|
|
||||||
$LastChangedDate: 2007-09-19 13:05:07 +0200 (Mi, 19 Sep 2007) $
|
|
||||||
$LastChangedRevision: 261 $
|
|
||||||
$LastChangedBy: kutterma $
|
|
||||||
|
|
||||||
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $
|
|
||||||
|
|
||||||
@@ -6,9 +6,11 @@ use XML::Parser::Expat;
|
|||||||
use SOAP::WSDL::Expat::MessageParser;
|
use SOAP::WSDL::Expat::MessageParser;
|
||||||
use base qw(SOAP::WSDL::Expat::MessageParser);
|
use base qw(SOAP::WSDL::Expat::MessageParser);
|
||||||
|
|
||||||
|
our $VERSION = '2.00_24';
|
||||||
|
|
||||||
sub parse_start {
|
sub parse_start {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
$self->{ parser } = $_[0]->_initialize( XML::Parser::ExpatNB->new() );
|
$self->{ parser } = $_[0]->_initialize( XML::Parser::ExpatNB->new( Namespaces => 1 ) );
|
||||||
}
|
}
|
||||||
sub init;
|
sub init;
|
||||||
*init = \&parse_start;
|
*init = \&parse_start;
|
||||||
@@ -19,6 +21,7 @@ sub parse_more {
|
|||||||
|
|
||||||
sub parse_done {
|
sub parse_done {
|
||||||
$_[0]->{ parser }->parse_done();
|
$_[0]->{ parser }->parse_done();
|
||||||
|
$_[0]->{ parser }->release();
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
@@ -47,29 +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
|
||||||
|
|
||||||
See SOAP::WSDL::Expat::MessageParser
|
See SOAP::WSDL::Expat::MessageParser
|
||||||
|
|
||||||
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
|
Copyright 2007 Martin Kutter. All rights reserved.
|
||||||
|
|
||||||
|
This file is part of SOAP-WSDL. You may distribte/modify it under
|
||||||
|
the same terms as perl itself
|
||||||
|
|
||||||
=head1 AUTHOR
|
=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 REPOSITORY INFORMATION
|
||||||
|
|
||||||
=head1 COPYING
|
$Rev: 391 $
|
||||||
|
|
||||||
This module may be used under the same terms as perl itself.
|
|
||||||
|
|
||||||
=head1 Repository information
|
|
||||||
|
|
||||||
$ID: $
|
|
||||||
|
|
||||||
$LastChangedDate: 2007-09-10 17:54:52 +0200 (Mon, 10 Sep 2007) $
|
|
||||||
$LastChangedRevision: 214 $
|
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: MessageStreamParser.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/Expat/MessageStreamParser.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageStreamParser.pm $
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|||||||
@@ -1,213 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
package SOAP::WSDL::Expat::MessageSubParser;
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin;
|
|
||||||
use XML::Parser::Expat;
|
|
||||||
|
|
||||||
sub new {
|
|
||||||
my ($class, $args) = @_;
|
|
||||||
my $self = {};
|
|
||||||
bless $self, $class;
|
|
||||||
return $self;
|
|
||||||
}
|
|
||||||
|
|
||||||
# create handlers via currying - XML::Compiled is a good teacher...
|
|
||||||
#
|
|
||||||
# A handler has to know
|
|
||||||
# - the order of it's child elements
|
|
||||||
# - the classes for these child elements
|
|
||||||
# - the handlers for these child elements (sub refs)
|
|
||||||
|
|
||||||
# order is checked if provided
|
|
||||||
|
|
||||||
sub start_tag {
|
|
||||||
my $self = shift;
|
|
||||||
my $arg_ref = shift;
|
|
||||||
|
|
||||||
my $CHILD_ORDER = $arg_ref->{ order } || [];
|
|
||||||
my $CHILD_CLASS = $arg_ref->{ class_of } || {};
|
|
||||||
my $CHILD_HANDLER = $arg_ref->{ handler_of };
|
|
||||||
my $CHILD_OCCURS = $arg_ref->{ occurs_of } || {};
|
|
||||||
|
|
||||||
my $CHILD_INDEX = 0;
|
|
||||||
|
|
||||||
|
|
||||||
return sub {
|
|
||||||
# parser, element, attrs
|
|
||||||
my ($prefix, $localname) = split m{:}xms , $_[1];
|
|
||||||
$localname ||= $_[1];
|
|
||||||
|
|
||||||
=pod
|
|
||||||
|
|
||||||
# # implement better checks...
|
|
||||||
# if (@{ $CHILD_ORDER }) {
|
|
||||||
# if ($CHILD_ORDER->[$CHILD_INDEX] ne $localname) {
|
|
||||||
# if (! $CHILD_ORDER->[++$CHILD_INDEX]
|
|
||||||
# || $CHILD_ORDER->[$CHILD_INDEX] ne $localname) {
|
|
||||||
# die "misplaced xml element " . $parser->recognized_string()
|
|
||||||
# . " at line "
|
|
||||||
# . $parser->current_line()
|
|
||||||
# . " column " . $parser->current_column() , "\n"
|
|
||||||
# , "Element order: " . join(',' , @{ $CHILD_ORDER }), "\n"
|
|
||||||
# }
|
|
||||||
# }
|
|
||||||
# }
|
|
||||||
#
|
|
||||||
# if (%{ $CHILD_OCCURS }) {
|
|
||||||
# die "too many occurances of $localname at line "
|
|
||||||
# . $parser->current_line()
|
|
||||||
# . " column " . $parser->current_column() , "\n"
|
|
||||||
# if (not --$CHILD_OCCURS->{ $localname }->{ max });
|
|
||||||
#
|
|
||||||
# # min must be checked in end_element !
|
|
||||||
# $CHILD_OCCURS->{ $localname }->{ min }--
|
|
||||||
# if ($CHILD_OCCURS->{ $localname }->{ min });
|
|
||||||
# }
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
# remove this some day
|
|
||||||
return if ($localname eq 'Envelope');
|
|
||||||
return if ($localname eq 'Body');
|
|
||||||
|
|
||||||
# step down in tree (remember current)
|
|
||||||
push @{ $self->{ list } }, $self->{ current };
|
|
||||||
$self->{ current } = $CHILD_CLASS->{ $localname }->new({ @_[2..$#_] });
|
|
||||||
|
|
||||||
# Set (and remember) next state
|
|
||||||
push @{ $self->{ handlers } }, $CHILD_HANDLER->{ $localname };
|
|
||||||
$_[0]->setHandlers( %{ $CHILD_HANDLER->{ $localname } } );
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
# characters is a good candidate for replacement when not needed -
|
|
||||||
# expat calls it for those whitespaces in non-mixed-content-elements, too
|
|
||||||
sub characters {
|
|
||||||
my $self = shift;
|
|
||||||
return sub { $self->{ characters } .= $_[1] };
|
|
||||||
}
|
|
||||||
|
|
||||||
# end_tag is a somewhat generic thingy - don't know whether we should
|
|
||||||
# curry it, and whether this will speed us up...
|
|
||||||
sub end_tag {
|
|
||||||
my $self = shift;
|
|
||||||
|
|
||||||
return sub {
|
|
||||||
# step down handler hierarchy
|
|
||||||
pop @{ $self->{ handlers } };
|
|
||||||
|
|
||||||
# restore state: set handler to last handler
|
|
||||||
$_[0]->setHandlers( %{ $self->{ handlers }->[ -1 ] } );
|
|
||||||
|
|
||||||
my ($prefix, $localname) = split m{:}xms , $_[1];
|
|
||||||
$localname ||= $_[1]; # for non-prefixed elements
|
|
||||||
|
|
||||||
# we only have characters if we need them - if not Char handler
|
|
||||||
# has to be set to undef
|
|
||||||
$self->{ current }->set_value( $self->{ characters } )
|
|
||||||
if ($self->{ characters });
|
|
||||||
|
|
||||||
# empty temp characters
|
|
||||||
undef $self->{ characters };
|
|
||||||
|
|
||||||
# return if we're top node
|
|
||||||
# This one easily handles ignores for us, too...
|
|
||||||
#
|
|
||||||
# Hmm... could be replaced by something else, maybe ???
|
|
||||||
# Maybe by defining an empty end_tag handler for the top node ?
|
|
||||||
# Can we do this ???
|
|
||||||
return if not defined $self->{ list }->[-1];
|
|
||||||
|
|
||||||
# set appropriate attribute in last element
|
|
||||||
# multiple values must be implemented in base class
|
|
||||||
my $method = "add_$localname";
|
|
||||||
$self->{ list }->[-1]->$method( $self->{ current } );
|
|
||||||
|
|
||||||
# step up in object hierarchy...
|
|
||||||
$self->{ current } = pop @{ $self->{ list } };
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
sub end_top_tag {
|
|
||||||
my $self = shift;
|
|
||||||
return sub {};
|
|
||||||
}
|
|
||||||
|
|
||||||
sub initialize {
|
|
||||||
my ($self, $handler_of_ref, $parser ) = @_;
|
|
||||||
$parser ||= XML::Parser::Expat->new();
|
|
||||||
$self->{ list } = undef;
|
|
||||||
$self->{ current } = undef;
|
|
||||||
$self->{ characters } = q{}; # empty characters
|
|
||||||
$self->{ handlers } = [ $handler_of_ref ];
|
|
||||||
$parser->setHandlers( %$handler_of_ref );
|
|
||||||
return $parser;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub get_data {
|
|
||||||
return $_[0]->{ current };
|
|
||||||
}
|
|
||||||
|
|
||||||
1;
|
|
||||||
|
|
||||||
=pod
|
|
||||||
|
|
||||||
=head1 NAME
|
|
||||||
|
|
||||||
SOAP::WSDL::Expat::MessageParser - Convert SOAP messages to custom object trees
|
|
||||||
|
|
||||||
=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::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 and set the type map entry to '__SKIP__'.
|
|
||||||
|
|
||||||
=head1 Bugs and Limitations
|
|
||||||
|
|
||||||
=over
|
|
||||||
|
|
||||||
=item * Ignores all namespaces
|
|
||||||
|
|
||||||
=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 COPYING
|
|
||||||
|
|
||||||
This module may be used under the same terms as perl itself.
|
|
||||||
|
|
||||||
=head1 Repository information
|
|
||||||
|
|
||||||
$ID: $
|
|
||||||
|
|
||||||
$LastChangedDate: 2007-09-10 17:54:52 +0200 (Mon, 10 Sep 2007) $
|
|
||||||
$LastChangedRevision: 214 $
|
|
||||||
$LastChangedBy: kutterma $
|
|
||||||
|
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageSubParser.pm $
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,219 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
package SOAP::WSDL::Expat::MessageSubParser;
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin;
|
|
||||||
use XML::Parser::Expat;
|
|
||||||
|
|
||||||
sub new {
|
|
||||||
my ($class, $args) = @_;
|
|
||||||
my $self = {
|
|
||||||
class_resolver => $args->{ class_resolver }
|
|
||||||
};
|
|
||||||
bless $self, $class;
|
|
||||||
return $self;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub class_resolver {
|
|
||||||
my $self = shift;
|
|
||||||
$self->{ class_resolver } = shift;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub _start;
|
|
||||||
|
|
||||||
sub _initialize {
|
|
||||||
my ($self, $parser) = @_;
|
|
||||||
|
|
||||||
delete $self->{ data };
|
|
||||||
|
|
||||||
my $characters;
|
|
||||||
my $current = undef;
|
|
||||||
my $ignore = [ 'Envelope', 'Body' ]; # top level elements to ignore
|
|
||||||
my $list = []; # node list
|
|
||||||
my $path = []; # current path (without
|
|
||||||
# number)
|
|
||||||
my $skip = 0; # skip elements
|
|
||||||
|
|
||||||
# use "globals" for speed
|
|
||||||
my ($_prefix, $_localname, $_element, $_method,
|
|
||||||
$_class, $_parser, %_attrs) = ();
|
|
||||||
|
|
||||||
no strict qw(refs);
|
|
||||||
|
|
||||||
my $start_sub = sub {
|
|
||||||
($_parser, $_element, %_attrs) = @_;
|
|
||||||
($_prefix, $_localname) = split m{:}xms , $_element;
|
|
||||||
|
|
||||||
# $parser->setHandlers( Start => \&_start );
|
|
||||||
|
|
||||||
$_localname ||= $_element; # for non-prefixed elements
|
|
||||||
|
|
||||||
# ignore top level elements
|
|
||||||
if (@{ $ignore } && $_localname eq $ignore->[0]) {
|
|
||||||
shift @{ $ignore };
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
push @{ $path }, $_localname; # 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 }";
|
|
||||||
|
|
||||||
# maybe write as "return $skip = join ... if (...)" ?
|
|
||||||
# would save a BLOCK...
|
|
||||||
return $skip = join('/', @{ $path }) if ($_class eq '__SKIP__');
|
|
||||||
|
|
||||||
push @$list, $current; # step down in tree ()remember current)
|
|
||||||
|
|
||||||
$characters = q{}; # empty characters
|
|
||||||
|
|
||||||
# Check whether we have a primitive - we implement them as classes
|
|
||||||
# We could replace this with UNIVERSAL->isa() - but it's slow...
|
|
||||||
# match is a bit faster if the string does not match, but WAY slower
|
|
||||||
# if $class matches...
|
|
||||||
|
|
||||||
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 $@;
|
|
||||||
}
|
|
||||||
|
|
||||||
$current = $_class->new({ %_attrs }); # set new current object
|
|
||||||
|
|
||||||
# remember top level element
|
|
||||||
defined $self->{ data }
|
|
||||||
or ($self->{ data } = $current);
|
|
||||||
};
|
|
||||||
|
|
||||||
my $char_sub = sub {
|
|
||||||
return if $skip;
|
|
||||||
$characters .= $_[1];
|
|
||||||
};
|
|
||||||
|
|
||||||
my $end_sub = sub {
|
|
||||||
$_element = $_[1];
|
|
||||||
|
|
||||||
($_prefix, $_localname) = split m{:}xms , $_element;
|
|
||||||
$_localname ||= $_element; # for non-prefixed elements
|
|
||||||
|
|
||||||
pop @{ $path }; # step up in path
|
|
||||||
|
|
||||||
if ($skip) {
|
|
||||||
return if $skip ne join '/', @{ $path }, $_localname;
|
|
||||||
$skip = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
# This one easily handles ignores for us, too...
|
|
||||||
return if not ref $$list[-1];
|
|
||||||
|
|
||||||
# set characters in current if we are a simple type
|
|
||||||
# we may have characters in complexTypes with simpleContent,
|
|
||||||
# too - maybe we should rely on the presence of characters ?
|
|
||||||
# may get a speedup by defining a ident method in anySimpleType
|
|
||||||
# and looking it up via exists &$class::ident;
|
|
||||||
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
|
|
||||||
$_method = "add_$_localname";
|
|
||||||
$$list[-1]->$_method( $current );
|
|
||||||
|
|
||||||
$current = pop @$list; # step up in object hierarchy...
|
|
||||||
};
|
|
||||||
|
|
||||||
$parser->setHandlers(
|
|
||||||
Start => sub {
|
|
||||||
$_[0]->setHandlers( Start => $start_sub );
|
|
||||||
$start_sub->(@_) },
|
|
||||||
Char => $char_sub,
|
|
||||||
End => $end_sub,
|
|
||||||
);
|
|
||||||
return $parser;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub parse {
|
|
||||||
$_[0]->_initialize( XML::Parser::Expat->new() )->parse( $_[1] );
|
|
||||||
return $_[0]->{ data };
|
|
||||||
}
|
|
||||||
|
|
||||||
sub parsefile {
|
|
||||||
$_[0]->_initialize( XML::Parser::Expat->new() )->parsefile( $_[1] );
|
|
||||||
return $_[0]->{ data };
|
|
||||||
}
|
|
||||||
|
|
||||||
sub get_data {
|
|
||||||
return $_[0]->{ data };
|
|
||||||
}
|
|
||||||
|
|
||||||
1;
|
|
||||||
|
|
||||||
=pod
|
|
||||||
|
|
||||||
=head1 NAME
|
|
||||||
|
|
||||||
SOAP::WSDL::Expat::MessageParser - Convert SOAP messages to custom object trees
|
|
||||||
|
|
||||||
=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::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 and set the type map entry to '__SKIP__'.
|
|
||||||
|
|
||||||
=head1 Bugs and Limitations
|
|
||||||
|
|
||||||
=over
|
|
||||||
|
|
||||||
=item * Ignores all namespaces
|
|
||||||
|
|
||||||
=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 COPYING
|
|
||||||
|
|
||||||
This module may be used under the same terms as perl itself.
|
|
||||||
|
|
||||||
=head1 Repository information
|
|
||||||
|
|
||||||
$ID: $
|
|
||||||
|
|
||||||
$LastChangedDate: 2007-09-10 17:54:52 +0200 (Mon, 10 Sep 2007) $
|
|
||||||
$LastChangedRevision: 214 $
|
|
||||||
$LastChangedBy: kutterma $
|
|
||||||
|
|
||||||
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/SubParser.pm $
|
|
||||||
|
|
||||||
|
|
||||||
@@ -3,14 +3,7 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use Carp;
|
use Carp;
|
||||||
use SOAP::WSDL::TypeLookup;
|
use SOAP::WSDL::TypeLookup;
|
||||||
use XML::Parser::Expat;
|
use base qw(SOAP::WSDL::Expat::Base);
|
||||||
|
|
||||||
sub new {
|
|
||||||
my ($class, $args) = @_;
|
|
||||||
my $self = {};
|
|
||||||
bless $self, $class;
|
|
||||||
return $self;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub _initialize {
|
sub _initialize {
|
||||||
my ($self, $parser) = @_;
|
my ($self, $parser) = @_;
|
||||||
@@ -99,8 +92,8 @@ sub _initialize {
|
|||||||
) || {};
|
) || {};
|
||||||
|
|
||||||
return if not ($action->{ type });
|
return if not ($action->{ type });
|
||||||
if ( $action->{ type } eq 'CLASS' ) {
|
if ( $action->{ type } eq 'CLASS' ) {
|
||||||
$current = pop @{ $list };
|
$current = pop @{ $list };
|
||||||
}
|
}
|
||||||
elsif ($action->{ type } eq 'CONTENT' ) {
|
elsif ($action->{ type } eq 'CONTENT' ) {
|
||||||
my $method = $action->{ method };
|
my $method = $action->{ method };
|
||||||
@@ -146,33 +139,5 @@ sub _fixup_attrs {
|
|||||||
return @attrs_from;
|
return @attrs_from;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub parse {
|
|
||||||
$_[0]->_initialize( XML::Parser::Expat->new(
|
|
||||||
Namespaces => 1
|
|
||||||
) )->parse( $_[1] );
|
|
||||||
$_[0]->{ parser }->release();
|
|
||||||
return $_[0]->{ data };
|
|
||||||
}
|
|
||||||
|
|
||||||
sub parsefile {
|
|
||||||
$_[0]->_initialize( XML::Parser::Expat->new(
|
|
||||||
Namespaces => 1
|
|
||||||
) )->parsefile( $_[1] );
|
|
||||||
$_[0]->{ parser }->release();
|
|
||||||
return $_[0]->{ data };
|
|
||||||
}
|
|
||||||
|
|
||||||
# aliases to make it more SAX-like
|
|
||||||
sub parse_file;
|
|
||||||
*parse_file = \&parsefile;
|
|
||||||
|
|
||||||
sub parse_string;
|
|
||||||
*parse_string = \&parse;
|
|
||||||
|
|
||||||
|
|
||||||
sub get_data {
|
|
||||||
return $_[0]->{ data };
|
|
||||||
}
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,10 @@ package SOAP::WSDL::Factory::Deserializer;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
|
our $VERSION = '2.00_24';
|
||||||
|
|
||||||
my %DESERIALIZER = (
|
my %DESERIALIZER = (
|
||||||
'1.1' => 'SOAP::WSDL::Deserializer::SOAP11',
|
'1.1' => 'SOAP::WSDL::Deserializer::XSD',
|
||||||
);
|
);
|
||||||
|
|
||||||
# class method
|
# class method
|
||||||
@@ -64,7 +66,7 @@ SOAP::WSDL::Deserializer tries to load one of the following classes:
|
|||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
By default, L<SOAP::WSDL::Deserializer::SOAP11|SOAP::WSDL::Deserializer::SOAP11>
|
By default, L<SOAP::WSDL::Deserializer::XSD|SOAP::WSDL::Deserializer::XSD>
|
||||||
is registered for SOAP1.1 messages.
|
is registered for SOAP1.1 messages.
|
||||||
|
|
||||||
=head1 METHODS
|
=head1 METHODS
|
||||||
@@ -131,11 +133,11 @@ passed as a single hash ref:
|
|||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
Copyright 2004-2007 Martin Kutter.
|
Copyright 2007 Martin Kutter. All rights reserved.
|
||||||
|
|
||||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
This file is part of SOAP-WSDL. You may distribte/modify it under
|
||||||
the same terms as perl itself
|
the same terms as perl itself
|
||||||
|
|
||||||
=head1 AUTHOR
|
=head1 AUTHOR
|
||||||
|
|||||||
@@ -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 distribte/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
|
||||||
@@ -2,8 +2,10 @@ package SOAP::WSDL::Factory::Serializer;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
|
our $VERSION='2.00_24';
|
||||||
|
|
||||||
my %SERIALIZER = (
|
my %SERIALIZER = (
|
||||||
'1.1' => 'SOAP::WSDL::Serializer::SOAP11',
|
'1.1' => 'SOAP::WSDL::Serializer::XSD',
|
||||||
);
|
);
|
||||||
|
|
||||||
# class method
|
# class method
|
||||||
@@ -16,7 +18,7 @@ sub get_serializer {
|
|||||||
my ($self, $args_of_ref) = @_;
|
my ($self, $args_of_ref) = @_;
|
||||||
|
|
||||||
# sanity check
|
# sanity check
|
||||||
die "no deserializer registered for SOAP version $args_of_ref->{ soap_version }"
|
die "no serializer registered for SOAP version $args_of_ref->{ soap_version }"
|
||||||
if not exists ($SERIALIZER{ $args_of_ref->{ soap_version } });
|
if not exists ($SERIALIZER{ $args_of_ref->{ soap_version } });
|
||||||
|
|
||||||
# load module
|
# load module
|
||||||
@@ -93,7 +95,7 @@ class should be used for, and $class is the class name.
|
|||||||
SOAP::WSDL::Factory::Serializer->register( $version, $class);
|
SOAP::WSDL::Factory::Serializer->register( $version, $class);
|
||||||
|
|
||||||
To auto-register your transport class on loading, execute register() in
|
To auto-register your transport class on loading, execute register() in
|
||||||
your tranport class (see L<SYNOPSIS|SYNOPSIS> above).
|
your tranport class (see L</SYNOPSIS> above).
|
||||||
|
|
||||||
=head2 Serializer package layout
|
=head2 Serializer package layout
|
||||||
|
|
||||||
@@ -123,12 +125,12 @@ serialize method in a anonymous hash ref:
|
|||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
Copyright 2004-2007 Martin Kutter.
|
Copyright 2004-2007 Martin Kutter. All rights reserved.
|
||||||
|
|
||||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||||
the same terms as perl itself
|
the same terms as perl itself.
|
||||||
|
|
||||||
=head1 AUTHOR
|
=head1 AUTHOR
|
||||||
|
|
||||||
@@ -136,9 +138,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 265 $
|
$Rev: 391 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: Serializer.pm 265 2007-09-20 21:51:31Z 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 $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package SOAP::WSDL::Factory::Transport;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
|
our $VERSION='2.00_17';
|
||||||
|
|
||||||
# class data
|
# class data
|
||||||
my %registered_transport_of = ();
|
my %registered_transport_of = ();
|
||||||
|
|
||||||
@@ -34,8 +36,9 @@ sub get_transport {
|
|||||||
|
|
||||||
$scheme =~s{ \A ([^\:]+) \: .+ }{$1}smx;
|
$scheme =~s{ \A ([^\:]+) \: .+ }{$1}smx;
|
||||||
|
|
||||||
if (exists $registered_transport_of{ $scheme }) {
|
if ($registered_transport_of{ $scheme }) {
|
||||||
eval "require $registered_transport_of{ $scheme }" or die $@;
|
eval "require $registered_transport_of{ $scheme }"
|
||||||
|
or die "Cannot load transport class $registered_transport_of{ $scheme } : $@";
|
||||||
|
|
||||||
# try "foo::Client" class first - SOAP::Tranport always requires
|
# try "foo::Client" class first - SOAP::Tranport always requires
|
||||||
# a package withoug the ::Client appended, and then
|
# a package withoug the ::Client appended, and then
|
||||||
@@ -45,12 +48,12 @@ sub get_transport {
|
|||||||
# sparse resource ...
|
# sparse resource ...
|
||||||
# ... but we've decided to mimic SOAP::Lite...
|
# ... but we've decided to mimic SOAP::Lite...
|
||||||
|
|
||||||
my $protocol_class = $SOAP_LITE_TRANSPORT_OF{ $scheme } . '::Client';
|
# my $protocol_class = $SOAP_LITE_TRANSPORT_OF{ $scheme } . '::Client';
|
||||||
my $transport;
|
# my $transport;
|
||||||
eval {
|
# eval {
|
||||||
$transport = $protocol_class->new( %attrs );
|
# $transport = $protocol_class->new( %attrs );
|
||||||
};
|
# };
|
||||||
return $transport if not $@;
|
# return $transport if not $@;
|
||||||
return $registered_transport_of{ $scheme }->new( %attrs );
|
return $registered_transport_of{ $scheme }->new( %attrs );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,7 +68,8 @@ sub get_transport {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (exists $SOAP_WSDL_TRANSPORT_OF{ $scheme }) {
|
if (exists $SOAP_WSDL_TRANSPORT_OF{ $scheme }) {
|
||||||
eval "require $SOAP_WSDL_TRANSPORT_OF{ $scheme }" or die $@;
|
eval "require $SOAP_WSDL_TRANSPORT_OF{ $scheme }"
|
||||||
|
or die "Cannot load transport class $SOAP_WSDL_TRANSPORT_OF{ $scheme } : $@";
|
||||||
return $SOAP_WSDL_TRANSPORT_OF{ $scheme }->new( %attrs );
|
return $SOAP_WSDL_TRANSPORT_OF{ $scheme }->new( %attrs );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,9 +223,9 @@ SOAP::WSDL will try to instantiate an object of your transport class with
|
|||||||
This may lead to errors when a different module with the name of your
|
This may lead to errors when a different module with the name of your
|
||||||
transport module suffixed with ::Client is also loaded.
|
transport module suffixed with ::Client is also loaded.
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
Copyright 2004-2007 Martin Kutter.
|
Copyright 2004-2007 Martin Kutter. All rights reserved.
|
||||||
|
|
||||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||||
the same terms as perl itself
|
the same terms as perl itself
|
||||||
@@ -232,9 +236,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
|||||||
|
|
||||||
=head1 REPOSITORY INFORMATION
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
$Rev: 265 $
|
$Rev: 391 $
|
||||||
$LastChangedBy: kutterma $
|
$LastChangedBy: kutterma $
|
||||||
$Id: Transport.pm 265 2007-09-20 21:51:31Z kutterma $
|
$Id: Transport.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/Transport.pm $
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -3,10 +3,12 @@ use strict;
|
|||||||
use Template;
|
use Template;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
|
|
||||||
|
our $VERSION='2.00_17';
|
||||||
|
|
||||||
my %tt_of :ATTR(:get<tt>);
|
my %tt_of :ATTR(:get<tt>);
|
||||||
my %definitions_of :ATTR(:name<definitions> :default<()>);
|
my %definitions_of :ATTR(:name<definitions> :default<()>);
|
||||||
my %interface_prefix_of :ATTR(:name<interface_prefix> :default<MyInterface>);
|
my %interface_prefix_of :ATTR(:name<interface_prefix> :default<MyInterfaces>);
|
||||||
my %typemap_prefix_of :ATTR(:name<typemap_prefix> :default<MyTypemap>);
|
my %typemap_prefix_of :ATTR(:name<typemap_prefix> :default<MyTypemaps>);
|
||||||
my %type_prefix_of :ATTR(:name<type_prefix> :default<MyTypes>);
|
my %type_prefix_of :ATTR(:name<type_prefix> :default<MyTypes>);
|
||||||
my %element_prefix_of :ATTR(:name<element_prefix> :default<MyElements>);
|
my %element_prefix_of :ATTR(:name<element_prefix> :default<MyElements>);
|
||||||
my %INCLUDE_PATH_of :ATTR(:name<INCLUDE_PATH> :default<()>);
|
my %INCLUDE_PATH_of :ATTR(:name<INCLUDE_PATH> :default<()>);
|
||||||
@@ -16,18 +18,18 @@ my %OUTPUT_PATH_of :ATTR(:name<OUTPUT_PATH> :default<.>);
|
|||||||
|
|
||||||
sub START {
|
sub START {
|
||||||
my ($self, $ident, $arg_ref) = @_;
|
my ($self, $ident, $arg_ref) = @_;
|
||||||
$tt_of{$ident} = Template->new(
|
}
|
||||||
|
|
||||||
|
sub _process :PROTECTED {
|
||||||
|
my ($self, $template, $arg_ref, $output) = @_;
|
||||||
|
my $ident = ident $self;
|
||||||
|
my $tt = $tt_of{$ident} ||= Template->new(
|
||||||
DEBUG => 1,
|
DEBUG => 1,
|
||||||
EVAL_PERL => $EVAL_PERL_of{ $ident },
|
EVAL_PERL => $EVAL_PERL_of{ $ident },
|
||||||
RECURSION => $RECURSION_of{ $ident },
|
RECURSION => $RECURSION_of{ $ident },
|
||||||
INCLUDE_PATH => $INCLUDE_PATH_of{ $ident },
|
INCLUDE_PATH => $INCLUDE_PATH_of{ $ident },
|
||||||
OUTPUT_PATH => $OUTPUT_PATH_of{ $ident },
|
OUTPUT_PATH => $OUTPUT_PATH_of{ $ident },
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
sub _process :PROTECTED {
|
|
||||||
my ($self, $template, $arg_ref, $output) = @_;
|
|
||||||
my $tt = $self->get_tt();
|
|
||||||
$tt->process( $template,
|
$tt->process( $template,
|
||||||
{
|
{
|
||||||
definitions => $self->get_definitions,
|
definitions => $self->get_definitions,
|
||||||
@@ -40,8 +42,7 @@ sub _process :PROTECTED {
|
|||||||
%{ $arg_ref }
|
%{ $arg_ref }
|
||||||
},
|
},
|
||||||
$output)
|
$output)
|
||||||
or die $tt->error();
|
or die $INCLUDE_PATH_of{ $ident }, '\\', $template, ' ', $tt->error();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
@@ -9,7 +9,8 @@ use SOAP::WSDL::Generator::Visitor::Typemap;
|
|||||||
use SOAP::WSDL::Generator::Visitor::Typelib;
|
use SOAP::WSDL::Generator::Visitor::Typelib;
|
||||||
use base qw(SOAP::WSDL::Generator::Template);
|
use base qw(SOAP::WSDL::Generator::Template);
|
||||||
|
|
||||||
my %output_of :ATTR(:name<output> :default<()>);
|
my %output_of :ATTR(:name<output> :default<()>);
|
||||||
|
my %typemap_of :ATTR(:name<typemap> :default<({})>);
|
||||||
|
|
||||||
sub BUILD {
|
sub BUILD {
|
||||||
my ($self, $ident, $arg_ref) = @_;
|
my ($self, $ident, $arg_ref) = @_;
|
||||||
@@ -17,22 +18,49 @@ sub BUILD {
|
|||||||
$self->set_RECURSION(1);
|
$self->set_RECURSION(1);
|
||||||
$self->set_INCLUDE_PATH( exists $arg_ref->{INCLUDE_PATH}
|
$self->set_INCLUDE_PATH( exists $arg_ref->{INCLUDE_PATH}
|
||||||
? $arg_ref->{INCLUDE_PATH}
|
? $arg_ref->{INCLUDE_PATH}
|
||||||
: File::Spec->rel2abs( dirname __FILE__ ). '/XSD/'
|
: do {
|
||||||
|
# ignore uninitialized warnings - File::Spec warns about
|
||||||
|
# uninitialized values, probably because we have no filename
|
||||||
|
local $SIG{__WARN__} = sub {
|
||||||
|
return if ($_[0]=~m{\buninitialized\b});
|
||||||
|
CORE::warn @_;
|
||||||
|
};
|
||||||
|
|
||||||
|
# makeup path for the OS we're running on
|
||||||
|
my ($volume, $dir, $file) = File::Spec->splitpath(
|
||||||
|
File::Spec->rel2abs( dirname __FILE__ )
|
||||||
|
);
|
||||||
|
$dir = File::Spec->catdir($dir, $file, 'XSD');
|
||||||
|
# return path put together...
|
||||||
|
my $path = File::Spec->catpath( $volume, $dir );
|
||||||
|
|
||||||
|
# Fixup path for windows - / works fine, \ does
|
||||||
|
# not...
|
||||||
|
if ( eval { &Win32::BuildNumber } ) {
|
||||||
|
$path =~s{\\}{/}g;
|
||||||
|
}
|
||||||
|
$path;
|
||||||
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub generate {
|
||||||
|
my $self = shift;
|
||||||
|
my $opt = shift;
|
||||||
|
$self->generate_typelib( $opt );
|
||||||
|
$self->generate_interface( $opt );
|
||||||
|
$self->generate_typemap( $opt );
|
||||||
|
}
|
||||||
|
|
||||||
sub generate_typelib {
|
sub generate_typelib {
|
||||||
my ($self) = @_;
|
my ($self) = @_;
|
||||||
|
|
||||||
# $output_of{ ident $self } = "";
|
# $output_of{ ident $self } = "";
|
||||||
|
|
||||||
my @schema = @{ $self->get_definitions()->first_types()->get_schema() };
|
my @schema = @{ $self->get_definitions()->first_types()->get_schema() };
|
||||||
for my $type (map { @{ $_->get_type() } , @{ $_->get_element() } } @schema[1..$#schema] ) {
|
for my $type (map { @{ $_->get_type() } , @{ $_->get_element() } } @schema[1..$#schema] ) {
|
||||||
$type->_accept( $self );
|
$type->_accept( $self );
|
||||||
}
|
}
|
||||||
|
|
||||||
# return $output_of{ ident $self };
|
# return $output_of{ ident $self };
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub generate_interface {
|
sub generate_interface {
|
||||||
@@ -46,24 +74,30 @@ sub generate_interface {
|
|||||||
next if not $port->first_address;
|
next if not $port->first_address;
|
||||||
next if not $port->first_address->isa('SOAP::WSDL::SOAP::Address');
|
next if not $port->first_address->isa('SOAP::WSDL::SOAP::Address');
|
||||||
|
|
||||||
|
my $port_name = $port->get_name;
|
||||||
|
$port_name =~s{ \A .+\. }{}xms;
|
||||||
my $output = $arg_ref->{ output }
|
my $output = $arg_ref->{ output }
|
||||||
? $arg_ref->{ output }
|
? $arg_ref->{ output }
|
||||||
: $self->_generate_filename( $self->get_interface_prefix(), $service->get_name(), $port->get_name );
|
: $self->_generate_filename(
|
||||||
|
$self->get_interface_prefix(),
|
||||||
|
$service->get_name(),
|
||||||
|
$port_name,
|
||||||
|
);
|
||||||
|
print "Creating interface class $output\n";
|
||||||
|
|
||||||
$self->_process('Interface.tt',
|
$self->_process('Interface.tt',
|
||||||
{
|
{
|
||||||
service => $service,
|
service => $service,
|
||||||
port => $port,
|
port => $port,
|
||||||
NO_POD => $arg_ref->{ NO_POD } ? 1 : 0 ,
|
NO_POD => $arg_ref->{ NO_POD } ? 1 : 0 ,
|
||||||
},
|
},
|
||||||
$output);
|
$output, binmode => ':utf8');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub generate_typemap {
|
sub generate_typemap {
|
||||||
my ($self, $arg_ref) = @_;
|
my ($self, $arg_ref) = @_;
|
||||||
|
|
||||||
my $visitor = SOAP::WSDL::Generator::Visitor::Typemap->new({
|
my $visitor = SOAP::WSDL::Generator::Visitor::Typemap->new({
|
||||||
type_prefix => $self->get_type_prefix(),
|
type_prefix => $self->get_type_prefix(),
|
||||||
element_prefix => $self->get_element_prefix(),
|
element_prefix => $self->get_element_prefix(),
|
||||||
@@ -74,6 +108,7 @@ sub generate_typemap {
|
|||||||
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN',
|
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN',
|
||||||
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
%{ $typemap_of{ident $self }},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
for my $service (@{ $self->get_definitions->get_service }) {
|
for my $service (@{ $self->get_definitions->get_service }) {
|
||||||
@@ -81,6 +116,7 @@ sub generate_typemap {
|
|||||||
my $output = $arg_ref->{ output }
|
my $output = $arg_ref->{ output }
|
||||||
? $arg_ref->{ output }
|
? $arg_ref->{ output }
|
||||||
: $self->_generate_filename( $self->get_typemap_prefix(), $service->get_name() );
|
: $self->_generate_filename( $self->get_typemap_prefix(), $service->get_name() );
|
||||||
|
print "Creating typemap class $output\n";
|
||||||
$self->_process('Typemap.tt',
|
$self->_process('Typemap.tt',
|
||||||
{
|
{
|
||||||
service => $service,
|
service => $service,
|
||||||
|
|||||||
@@ -1,12 +1,17 @@
|
|||||||
package [% interface_prefix %]::[% service.get_name %]::[% port.get_name %];
|
package [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('^.+\.','') %];
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
|
use Scalar::Util qw(blessed);
|
||||||
use base qw(SOAP::WSDL::Client::Base);
|
use base qw(SOAP::WSDL::Client::Base);
|
||||||
|
|
||||||
|
# only load if it hasn't been loaded before
|
||||||
|
require [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]
|
||||||
|
if not [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]->can('get_class');
|
||||||
|
|
||||||
sub START {
|
sub START {
|
||||||
$_[0]->set_proxy('[% port.first_address.get_location %]') if not $_[2]->{proxy};
|
$_[0]->set_proxy('[% port.first_address.get_location %]') if not $_[2]->{proxy};
|
||||||
$_[0]->set_class_resolver('[% typemap_prefix %]::[% service.get_name %]')
|
$_[0]->set_class_resolver('[% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]')
|
||||||
if not $_[2]->{class_resolver};
|
if not $_[2]->{class_resolver};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -14,6 +19,7 @@ sub START {
|
|||||||
FOREACH operation = binding.get_operation;
|
FOREACH operation = binding.get_operation;
|
||||||
%][% INCLUDE Interface/Operation.tt %]
|
%][% INCLUDE Interface/Operation.tt %]
|
||||||
[%
|
[%
|
||||||
|
|
||||||
END;
|
END;
|
||||||
%]
|
%]
|
||||||
|
|
||||||
@@ -28,7 +34,18 @@ __END__
|
|||||||
=head1 NAME
|
=head1 NAME
|
||||||
|
|
||||||
|
|
||||||
[% interface_prefix %]::[% service.get_name %]::[% port.get_name %] - SOAP Interface for the [% service.get_name %] Web Service
|
[% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %] - SOAP Interface for the [% service.get_name %] Web Service
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %];
|
||||||
|
my $interface = [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %]->new();
|
||||||
|
|
||||||
|
my $response;
|
||||||
|
[% FOREACH operation = binding.get_operation;
|
||||||
|
%] $response = $interface->[% operation.get_name %]();
|
||||||
|
[% END %]
|
||||||
|
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
@@ -60,7 +77,7 @@ All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
|
|||||||
|
|
||||||
[% FOREACH operation = binding.get_operation;
|
[% FOREACH operation = binding.get_operation;
|
||||||
%][% INCLUDE Interface/POD/Operation.tt %]
|
%][% INCLUDE Interface/POD/Operation.tt %]
|
||||||
[% END %]
|
[% END %]
|
||||||
|
|
||||||
=head1 AUTHOR
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
|||||||
@@ -12,53 +12,52 @@
|
|||||||
|
|
||||||
my @body_part_from = split m{\s}, $item->get_parts;
|
my @body_part_from = split m{\s}, $item->get_parts;
|
||||||
|
|
||||||
my @parts;
|
my @parts;
|
||||||
if (@body_part_from) {
|
if (@body_part_from) {
|
||||||
@parts = map {
|
@parts = map {
|
||||||
my $part = $_;
|
my $part = $_;
|
||||||
(grep {
|
(grep {
|
||||||
my ($ns, $lname) = $def->expand( $_ );
|
my ($ns, $lname) = $def->expand( $_ );
|
||||||
($lname eq $part->get_name)
|
($lname eq $part->get_name)
|
||||||
} @body_part_from
|
} @body_part_from
|
||||||
)
|
)
|
||||||
? do {
|
? do {
|
||||||
my $name;
|
my $name;
|
||||||
($name = $part->get_element)
|
($name = $part->get_element)
|
||||||
? do {
|
? do {
|
||||||
$name =~s{ ^[^:]+: }{}xms;
|
$name =~s{ ^[^:]+: }{}xms;
|
||||||
$element_prefix . '::' . $name;
|
$element_prefix . '::' . $name;
|
||||||
}
|
}
|
||||||
: ($name = $part->get_type)
|
: ($name = $part->get_type)
|
||||||
? do {
|
? do {
|
||||||
$name =~s{ ^[^:]+: }{}xms;
|
$name =~s{ ^[^:]+: }{}xms;
|
||||||
$type_prefix . '::' . $name;
|
$type_prefix . '::' . $name;
|
||||||
}
|
}
|
||||||
: die "input must have either type or element"
|
: die "input must have either type or element"
|
||||||
}
|
}
|
||||||
: ()
|
: ()
|
||||||
} @{ $part_from };
|
} @{ $part_from };
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@parts = map {
|
@parts = map {
|
||||||
my $part = $_;
|
my $part = $_;
|
||||||
my $name;
|
my $name;
|
||||||
($name = $part->get_element)
|
($name = $part->get_element)
|
||||||
? do {
|
? do {
|
||||||
$name =~s{ ^[^:]+: }{}xms;
|
$name =~s{ ^[^:]+: }{}xms;
|
||||||
"$element_prefix\::$name"
|
"$element_prefix\::$name"
|
||||||
}
|
}
|
||||||
: ($name = $part->get_type)
|
: ($name = $part->get_type)
|
||||||
? do {
|
? do {
|
||||||
$name =~s{ ^[^:]+: }{}xms;
|
$name =~s{ ^[^:]+: }{}xms;
|
||||||
"$type_prefix\::$name"
|
"$type_prefix\::$name"
|
||||||
}
|
}
|
||||||
: die "input must have either type or element";
|
: die "input must have either type or element";
|
||||||
} @{ $part_from };
|
} @{ $part_from };
|
||||||
}
|
}
|
||||||
$stash->{ parts } = \@parts;
|
$stash->{ parts } = \@parts;
|
||||||
|
|
||||||
[% END;
|
[% END %]
|
||||||
%]
|
|
||||||
'use' => '[% item.get_use %]',
|
'use' => '[% item.get_use %]',
|
||||||
namespace => '[% item.get_namespace %]',
|
namespace => '[% item.get_namespace %]',
|
||||||
encodingStyle => '[% item.get_encodingStyle %]',
|
encodingStyle => '[% item.get_encodingStyle %]',
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
[%
|
[%
|
||||||
RETURN IF NOT item;
|
RETURN IF NOT item;
|
||||||
message = definitions.find_message( item.expand( item.get_message ) );
|
message_name = item.get_message;
|
||||||
|
IF NOT message_name;
|
||||||
|
THROW BAD_WSDL "missing <message> attribute in header for operation ${operation.get_name}";
|
||||||
|
END;
|
||||||
|
message = definitions.find_message( item.expand( message_name ) );
|
||||||
PERL %]
|
PERL %]
|
||||||
my $message = $stash->{ message };
|
my $message = $stash->{ message };
|
||||||
my $item = $stash->{ item };
|
my $item = $stash->{ item };
|
||||||
@@ -12,17 +16,23 @@
|
|||||||
$_->get_name eq $lname
|
$_->get_name eq $lname
|
||||||
&& $_->get_targetNamespace eq $ns } @{ $message->get_part( ) };
|
&& $_->get_targetNamespace eq $ns } @{ $message->get_part( ) };
|
||||||
my $part_class = do {
|
my $part_class = do {
|
||||||
my $name;
|
my $name;
|
||||||
($name = $part->get_element)
|
($name = $part->get_element)
|
||||||
? "$element_prefix::$name"
|
? do {
|
||||||
: ($name = $part->get_type)
|
$name =~s{ ^[^:]+: }{}xms;
|
||||||
? "$type_prefix::$name"
|
$element_prefix . '::' . $name;
|
||||||
: die "input must have either type or element";
|
}
|
||||||
};
|
: ($name = $part->get_type)
|
||||||
|
? do {
|
||||||
|
$name =~s{ ^[^:]+: }{}xms;
|
||||||
|
$type_prefix . '::' . $name;
|
||||||
|
}
|
||||||
|
: die "input must have either type or element"
|
||||||
|
};
|
||||||
$stash->{ part_class } = $part_class;
|
$stash->{ part_class } = $part_class;
|
||||||
[% END;
|
[% END;
|
||||||
%]
|
%]
|
||||||
'use' => '[% item.get_use %]',
|
'use' => '[% item.get_use %]',
|
||||||
namespace => '[% item.get_namespace %]',
|
namespace => '[% item.get_namespace %]',
|
||||||
encodingStyle => '[% item.get_encodingStyle %]',
|
encodingStyle => '[% item.get_encodingStyle %]',
|
||||||
parts => '[qw( [% part_class %] )]',
|
parts => [qw( [% part_class %] )],
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
sub [% operation.get_name %] {
|
sub [% operation.get_name %] {
|
||||||
my ($self, $body, $header) = @_;
|
my ($self, $body, $header) = @_;
|
||||||
|
die "[% operation.get_name %] must be called as object method (\$self is <$self>)" if not blessed($self);
|
||||||
return $self->SUPER::call({
|
return $self->SUPER::call({
|
||||||
operation => '[% operation.get_name %]',
|
operation => '[% operation.get_name %]',
|
||||||
soap_action => '[% operation.first_operation.get_soapAction %]',
|
soap_action => '[% operation.first_operation.get_soapAction %]',
|
||||||
style => '[% operation.get_style || binding.get_style %]',
|
style => '[% operation.get_style || binding.get_style %]',
|
||||||
body => {
|
body => {
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
|
|
||||||
[% INDENT; %][% element.get_name %] => [%-
|
[% INDENT; %][% element.get_name %] => [%-
|
||||||
IF (element.get_ref);
|
IF (element.get_ref);
|
||||||
element = element.get_ref();
|
element = element.get_ref();
|
||||||
END;
|
END;
|
||||||
IF (type_name = element.get_type);
|
IF (type_name = element.get_type);
|
||||||
INCLUDE Interface/POD/Type.tt(type = definitions.first_types.find_type( element.expand(type_name) ) );
|
INCLUDE Interface/POD/Type.tt(type = definitions.first_types.find_type( element.expand(type_name) ) );
|
||||||
ELSIF (type = element.first_complexType);
|
ELSIF (type = element.first_complexType);
|
||||||
INCLUDE Interface/POD/Type.tt(type = type );
|
INCLUDE Interface/POD/Type.tt(type = type );
|
||||||
ELSIF (type = element.first_simpleType);
|
ELSIF (type = element.first_simpleType);
|
||||||
INCLUDE Interface/POD/Type.tt(type = type );
|
INCLUDE Interface/POD/Type.tt(type = type );
|
||||||
END;
|
END;
|
||||||
%]
|
%]
|
||||||
@@ -4,6 +4,6 @@
|
|||||||
|
|
||||||
part_from = definitions.find_message( port_op.first_input.expand( message_name ) ).get_part;
|
part_from = definitions.find_message( port_op.first_input.expand( message_name ) ).get_part;
|
||||||
FOREACH part = part_from;
|
FOREACH part = part_from;
|
||||||
INCLUDE Interface/POD/Part.tt(part = part);
|
INCLUDE Interface/POD/Part.tt(part = part);
|
||||||
END;
|
END;
|
||||||
%]
|
%]
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
[% element = definitions.first_types.find_element( part.expand( part.get_element ) );
|
[% element = definitions.first_types.find_element( part.expand( part.get_element ) );
|
||||||
#element.get_name();
|
#element.get_name();
|
||||||
#element;
|
#element;
|
||||||
#STOP;
|
#STOP;
|
||||||
type = element.first_complexType || element.first_simpleType || definitions.first_types.find_type(
|
type = element.first_complexType || element.first_simpleType || definitions.first_types.find_type(
|
||||||
element.expand( element.get_type ) );
|
element.expand( element.get_type ) );
|
||||||
INCLUDE Interface/POD/Type.tt;%],
|
INCLUDE Interface/POD/Type.tt;%],
|
||||||
|
|||||||
@@ -1,11 +1,7 @@
|
|||||||
[%- INDENT = INDENT _ ' ';
|
[%- indent = ' ';
|
||||||
IF type.isa('SOAP::WSDL::XSD::ComplexType'); -%]
|
IF type.isa('SOAP::WSDL::XSD::ComplexType');
|
||||||
{ #[% IF (type.get_name); %][% TYPE_PREFIX %]::[% type.get_name %][% ELSE; %]__ATOMIC__[% END;
|
INCLUDE complexType/POD/structure.tt(complexType = type);
|
||||||
FOREACH element = type.get_element;
|
ELSE;
|
||||||
INCLUDE Interface/POD/Element.tt( element = element );
|
INCLUDE simpleType/POD/structure.tt(simpleType = type);
|
||||||
END %]
|
END;
|
||||||
[% INDENT; %]}
|
indent.replace('\s{2}$',''); %]
|
||||||
[%- ELSE -%]
|
|
||||||
$someValue,
|
|
||||||
[%- END;
|
|
||||||
INDENT.replace('\s{2}$',''); %]
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
[% type_name = node.expand( type );
|
[% type_name = node.expand( type );
|
||||||
IF (type_name.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
|
IF (type_name.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::[% type_name.1 %]
|
SOAP::WSDL::XSD::Typelib::Builtin::[% type_name.1 %]
|
||||||
[% ELSE -%]
|
[% ELSE -%]
|
||||||
[% type_prefix %]::[% type_name.1 %]
|
[% type_prefix %]::[% type_name.1 %]
|
||||||
[% END -%]
|
[% END -%]
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
package [% type_prefix %]::[% complexType.get_name %];
|
package [% type_prefix %]::[% complexType.get_name %];
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
|
||||||
[% INCLUDE complexType/contentModel.tt %]
|
[% INCLUDE complexType/contentModel.tt %]
|
||||||
[%#
|
[%#
|
||||||
# Don't include any perl source here - there may be sub-packages...
|
# Don't include any perl source here - there may be sub-packages...
|
||||||
@@ -18,7 +17,7 @@ use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
|||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Perl data type class for the XML Schema defined complextype
|
Perl data type class for the XML Schema defined complextype
|
||||||
[% complexType.get_name %] from the namespace [% complexType.get_xmlns %].
|
[% complexType.get_name %] from the namespace [% complexType.get_targetNamespace %].
|
||||||
|
|
||||||
=head2 PROPERTIES
|
=head2 PROPERTIES
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[% indent %]{
|
||||||
|
[%- IF complexType.get_name %] # [% type_prefix %]::[% complexType.get_name %][% END %]
|
||||||
|
[%- indent = indent _ ' ';
|
||||||
|
FOREACH element = complexType.get_element %]
|
||||||
|
[% indent %][% element.get_name %] => [% INCLUDE element/POD/structure.tt -%]
|
||||||
|
[% END %]
|
||||||
|
[% indent.replace('\s{2}$', ''); %]}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
[% indent %]{
|
||||||
|
[%- IF complexType.get_name %] # [% type_prefix %]::[% complexType.get_name %][% END %]
|
||||||
|
[%- indent = indent _ ' ' %]
|
||||||
|
[% indent %]# One of the following elements.
|
||||||
|
[% indent %]# No occurance checks yet, so be sure to pass just one...
|
||||||
|
[%- FOREACH element = complexType.get_element %]
|
||||||
|
[% indent %][% element.get_name %] => [% INCLUDE element/POD/structure.tt -%]
|
||||||
|
[% END %]
|
||||||
|
[% indent.replace('\s{2}$', ''); %]}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
[% IF (complexType.get_variety == 'restriction');
|
||||||
|
INCLUDE complexType/POD/restriction.tt(complexType = complexType);
|
||||||
|
ELSIF (complexType.get_variety == 'sequence');
|
||||||
|
THROW NOT_IMPLEMENTED, "${ complexType.get_name } - complexType complexContent extension not implemented yet";
|
||||||
|
ELSE;
|
||||||
|
THROW UNKNOWN, "unknown variety ${ complexType.get_variety }";
|
||||||
|
END;
|
||||||
|
|
||||||
|
%]
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[% indent %]{
|
||||||
|
[%- IF complexType.get_name %] # [% type_prefix %]::[% complexType.get_name %][% END %]
|
||||||
|
[%- indent = indent _ ' ';
|
||||||
|
FOREACH element = complexType.get_element %]
|
||||||
|
[% indent %][% element.get_name %] => [% INCLUDE element/POD/structure.tt -%]
|
||||||
|
[% END %]
|
||||||
|
[% indent.replace('\s{2}$', ''); %]}
|
||||||
@@ -1,7 +1,13 @@
|
|||||||
[% indent %]{
|
[% IF (complexType.get_variety == 'all');
|
||||||
[%- IF complexType.get_name %] # [% type_prefix %]::[% complexType.get_name %][% END %]
|
INCLUDE complexType/POD/all.tt(complexType = complexType);
|
||||||
[%- indent = indent _ ' ';
|
ELSIF (complexType.get_variety == 'sequence');
|
||||||
FOREACH element = complexType.get_element %]
|
INCLUDE complexType/POD/all.tt(complexType = complexType);
|
||||||
[% indent %][% element.get_name %] => [% INCLUDE element/POD/structure.tt -%]
|
ELSIF (complexType.get_variety == 'group');
|
||||||
[% END %]
|
THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType group not implemented yet";
|
||||||
[% indent.replace('\s{2}$', ''); %]}
|
ELSIF (complexType.get_variety == 'choice');
|
||||||
|
INCLUDE complexType/POD/choice.tt(complexType = complexType);
|
||||||
|
ELSIF (complexType.get_contentModel == 'simpleContent');
|
||||||
|
THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType simpleContent not implemented yet";
|
||||||
|
ELSIF (complexType.get_contentModel == 'complexContent');
|
||||||
|
INCLUDE complexType/POD/complexContent.tt(complexType = complexType);
|
||||||
|
END %],
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
|
use Class::Std::Storable;
|
||||||
|
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
|
||||||
|
|
||||||
{ # BLOCK to scope variables
|
{ # BLOCK to scope variables
|
||||||
[%
|
[%
|
||||||
atomic_types = [];
|
atomic_types = {};
|
||||||
|
|
||||||
FOREACH element = complexType.get_element %]
|
FOREACH element = complexType.get_element %]
|
||||||
my %[% element.get_name %]_of :ATTR(:get<[% element.get_name %]>);
|
my %[% element.get_name %]_of :ATTR(:get<[% element.get_name %]>);
|
||||||
@@ -13,28 +16,28 @@ __PACKAGE__->_factory(
|
|||||||
) ],
|
) ],
|
||||||
{
|
{
|
||||||
[% FOREACH element = complexType.get_element -%]
|
[% FOREACH element = complexType.get_element -%]
|
||||||
[% element.get_name %] => \%[% element.get_name %]_of,
|
[% element.get_name %] => \%[% element.get_name %]_of,
|
||||||
[% END -%]
|
[% END -%]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
[% FOREACH element = complexType.get_element;
|
[% FOREACH element = complexType.get_element;
|
||||||
IF (type = element.get_type);
|
IF (type = element.get_type);
|
||||||
element_type = complexType.expand( type );
|
element_type = complexType.expand( type );
|
||||||
IF (element_type.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
|
IF (element_type.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
|
||||||
[% element.get_name %] => 'SOAP::WSDL::XSD::Typelib::Builtin::[% element_type.1 %]',
|
[% element.get_name %] => 'SOAP::WSDL::XSD::Typelib::Builtin::[% element_type.1 %]',
|
||||||
[% ELSE -%]
|
[% ELSE -%]
|
||||||
[% element.get_name %] => '[% type_prefix %]::[% element_type.1 %]',
|
[% element.get_name %] => '[% type_prefix %]::[% element_type.1 %]',
|
||||||
[% END;
|
[% END;
|
||||||
ELSE;
|
ELSE;
|
||||||
IF (element.first_simpleType);
|
IF (element.first_simpleType);
|
||||||
atomic_types.push( element.first_simpleType );
|
atomic_types.${ element.get_name } = element.first_simpleType;
|
||||||
ELSIF (element.first_simpleType);
|
ELSIF (element.first_complexType);
|
||||||
atomic_types.push( element.first_simpleType );
|
atomic_types.${ element.get_name } = element.first_complexType;
|
||||||
ELSE;
|
ELSE;
|
||||||
THROW NOT_IMPLEMENTED , "atomic types in complexType elements not supported yet";
|
THROW NOT_IMPLEMENTED , "Neither simple nor complex atomic type - don't know what to do with it";
|
||||||
END; %]
|
END; %]
|
||||||
[% element.get_name %] => '[% type_prefix %]::[% complexType.get_name %]::_[% element.get_name %]',
|
[% element.get_name %] => '[% type_prefix %]::[% complexType.get_name %]::_[% element.get_name %]',
|
||||||
[% END;
|
[% END;
|
||||||
END -%]
|
END -%]
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
|
|
||||||
[% FOREACH type = atomic_types; %]
|
[% FOREACH type IN atomic_types; %]
|
||||||
|
|
||||||
package [% type_prefix %]::[% complexType.get_name %]::_[% element.get_name %];
|
package [% type_prefix %]::[% complexType.get_name %]::_[% type.key %];
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
{
|
{
|
||||||
[% IF ( type.isa('SOAP::WSDL::XSD::ComplexType') );
|
[% IF ( type.value.isa('SOAP::WSDL::XSD::ComplexType') );
|
||||||
INCLUDE complexType/contentModel.tt(complexType = type );
|
INCLUDE complexType/contentModel.tt(complexType = type.value );
|
||||||
ELSIF ( type.isa('SOAP::WSDL::XSD::SimpleType') );
|
ELSIF ( type.value.isa('SOAP::WSDL::XSD::SimpleType') );
|
||||||
INCLUDE simpleType/contentModel.tt(simpleType = type );
|
INCLUDE simpleType/contentModel.tt(simpleType = type.value );
|
||||||
ELSE;
|
ELSE;
|
||||||
PERL; %] die $stash->{ type }->_DUMP [% END;
|
PERL; %] die $stash->{ type } [% END;
|
||||||
THROW UNKNOWN, "neither complex nor simple type - don't know what to do";
|
THROW UNKNOWN, "neither complex nor simple type - don't know what to do";
|
||||||
END
|
END
|
||||||
%]
|
%]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
[% IF (complexType.get_variety == 'restriction');
|
||||||
|
INCLUDE complexType/restriction.tt(complexType = complexType);
|
||||||
|
ELSIF (complexType.get_variety == 'sequence');
|
||||||
|
INCLUDE complexType/extension.tt(complexType = complexType);
|
||||||
|
ELSE;
|
||||||
|
THROW UNKNOWN, "unknown variety ${ complexType.get_variety }";
|
||||||
|
END;
|
||||||
|
%]
|
||||||
@@ -1,13 +1,7 @@
|
|||||||
[% IF (complexType.get_variety == 'all');
|
[% IF (complexType.get_contentModel == 'simpleContent');
|
||||||
INCLUDE complexType/all.tt(complexType = complexType);
|
THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType simpleContent not implemented yet";
|
||||||
ELSIF (complexType.get_variety == 'sequence');
|
ELSIF (complexType.get_contentModel == 'complexContent');
|
||||||
INCLUDE complexType/all.tt(complexType = complexType);
|
INCLUDE complexType/complexContent.tt(complexType = complexType);
|
||||||
ELSIF (complexType.get_variety == 'group');
|
ELSE;
|
||||||
THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType group not implemented yet";
|
INCLUDE complexType/variety.tt(complexType = complexType);
|
||||||
ELSIF (complexType.get_variety == 'choice');
|
|
||||||
THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType choice not implemented yet";
|
|
||||||
ELSIF (complexType.get_variety == 'simpleContent');
|
|
||||||
THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType choice not implemented yet";
|
|
||||||
ELSIF (complexType.get_variety == 'complexContent');
|
|
||||||
THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType choice not implemented yet";
|
|
||||||
END %]
|
END %]
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
[%
|
||||||
|
|
||||||
|
base_name=complexType.expand( complexType.get_base);
|
||||||
|
base_type = definitions.first_types.find_type( base_name );
|
||||||
|
|
||||||
|
element_from = complexType.get_element;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Sanity check: All original elements must be noted first
|
||||||
|
#
|
||||||
|
FOREACH element = base_type.get_element;
|
||||||
|
IF element_from.${ loop.index }.get_name != element.get_name;
|
||||||
|
THROW WSDL "${element.get_name} not found at position ${ loop.index } in extension type ${ complexType.get_name }";
|
||||||
|
END;
|
||||||
|
END;
|
||||||
|
|
||||||
|
|
||||||
|
-%]
|
||||||
|
use base qw([% type_prefix %]::[% base_name.1.replace('\.', '::') %]);
|
||||||
|
[%
|
||||||
|
|
||||||
|
INCLUDE complexType/variety.tt(complexType = complexType);
|
||||||
|
|
||||||
|
%]
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
[% IF (base=complexType.get_base);
|
||||||
|
base_name=complexType.expand(base);
|
||||||
|
-%]
|
||||||
|
use base qw([% type_prefix %]::[% base_name.1.replace('\.', '::') %]);
|
||||||
|
[%
|
||||||
|
ELSE;
|
||||||
|
THROW NOT_IMPLEMENTED, "restriction without base not supported";
|
||||||
|
END %]
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
[%
|
||||||
|
IF (complexType.get_variety == 'all');
|
||||||
|
INCLUDE complexType/all.tt(complexType = complexType);
|
||||||
|
ELSIF (complexType.get_variety == 'sequence');
|
||||||
|
INCLUDE complexType/all.tt(complexType = complexType);
|
||||||
|
ELSIF (complexType.get_variety == 'group');
|
||||||
|
THROW NOT_IMPLEMENTED, "${ element.get_name } - complexType group not implemented yet";
|
||||||
|
ELSIF (complexType.get_variety == 'choice');
|
||||||
|
INCLUDE complexType/all.tt(complexType = complexType);
|
||||||
|
ELSIF (complexType.get_variety);
|
||||||
|
THROW NOT_IMPLEMENTED, "Unknown variety ${ complexType.get_variety } in ${ complexType.get_name } (${ element.get_name })";
|
||||||
|
ELSE;
|
||||||
|
# There's no variety - might be empty complexType
|
||||||
|
END;
|
||||||
|
%]
|
||||||
@@ -14,24 +14,24 @@ __PACKAGE__->__set_ref([% IF element.get_ref; %]'[% element.get_ref %]'[% END %]
|
|||||||
|
|
||||||
[%- IF (type = element.get_type); -%]
|
[%- IF (type = element.get_type); -%]
|
||||||
use base qw(
|
use base qw(
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
[% INCLUDE _type_class.tt( type = type, node = element ) %]
|
[% INCLUDE _type_class.tt( type = type, node = element ) %]
|
||||||
);
|
);
|
||||||
[%- ELSIF (ref = element.get_ref); -%]
|
[%- ELSIF (ref = element.get_ref); -%]
|
||||||
# element ref="[% ref %]"
|
# element ref="[% ref %]"
|
||||||
use base qw(
|
use base qw(
|
||||||
[% element_prefix %]::[% ref.split(':').1 %]
|
[% element_prefix %]::[% ref.split(':').1 %]
|
||||||
);
|
);
|
||||||
[%- ELSIF (simpleType = element.first_simpleType) %]
|
[%- ELSIF (simpleType = element.first_simpleType) %]
|
||||||
# atomic simpleType: <element><simpleType
|
# atomic simpleType: <element><simpleType
|
||||||
use base qw(
|
use base qw(
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
);
|
);
|
||||||
[% INCLUDE simpleType/contentModel.tt %]
|
[% INCLUDE simpleType/contentModel.tt %]
|
||||||
[% ELSIF (complexType = element.first_complexType) %]
|
[% ELSIF (complexType = element.first_complexType) %]
|
||||||
use base qw(
|
use base qw(
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
);
|
);
|
||||||
[% INCLUDE complexType/contentModel.tt;
|
[% INCLUDE complexType/contentModel.tt;
|
||||||
END %]
|
END %]
|
||||||
|
|||||||
@@ -1,30 +1,30 @@
|
|||||||
[%- IF (name = element.get_type);
|
[%- IF (name = element.get_type);
|
||||||
type_name = element.expand(name);
|
type_name = element.expand(name);
|
||||||
IF (type_name.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
|
IF (type_name.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
|
||||||
$some_value, # [% type_name.1 %]
|
$some_value, # [% type_name.1 %]
|
||||||
[%-
|
[%-
|
||||||
RETURN;
|
RETURN;
|
||||||
ELSIF (type = definitions.first_types.find_type( type_name ));
|
ELSIF (type = definitions.first_types.find_type( type_name ));
|
||||||
IF (type.isa('SOAP::WSDL::XSD::ComplexType') );
|
IF (type.isa('SOAP::WSDL::XSD::ComplexType') );
|
||||||
INCLUDE complexType/POD/structure.tt(complexType = type);
|
INCLUDE complexType/POD/structure.tt(complexType = type);
|
||||||
RETURN;
|
RETURN;
|
||||||
ELSE;
|
ELSE;
|
||||||
INCLUDE simpleType/POD/structure.tt(simpleType = type);
|
INCLUDE simpleType/POD/structure.tt(simpleType = type);
|
||||||
END;
|
END;
|
||||||
RETURN;
|
RETURN;
|
||||||
END;
|
END;
|
||||||
THROW NOT_FOUND, "no type found for {${type_name.0}}${type_name.1}";
|
THROW NOT_FOUND, "no type found for {${type_name.0}}${type_name.1}";
|
||||||
ELSIF (ref = element.get_ref);
|
ELSIF (ref = element.get_ref);
|
||||||
ref_element = definitions.first_types.find_element( element.expand( ref ) );
|
ref_element = definitions.first_types.find_element( element.expand( ref ) );
|
||||||
INCLUDE element/POD/structure.tt(element = ref_element);
|
INCLUDE element/POD/structure.tt(element = ref_element);
|
||||||
RETURN;
|
RETURN;
|
||||||
ELSIF (type = element.first_simpleType);
|
ELSIF (type = element.first_simpleType);
|
||||||
INCLUDE simpleType/POD/structure.tt(simpleType = type);
|
INCLUDE simpleType/POD/structure.tt(simpleType = type);
|
||||||
RETURN;
|
RETURN;
|
||||||
ELSIF (type = element.first_complexType);
|
ELSIF (type = element.first_complexType);
|
||||||
INCLUDE complexType/POD/structure.tt(complexType = type);
|
INCLUDE complexType/POD/structure.tt(complexType = type);
|
||||||
ELSE;
|
ELSE;
|
||||||
THROW NOT_FOUND, "no type found for ${element.get_name}";
|
THROW NOT_FOUND, "no type found for ${element.get_name}";
|
||||||
%]
|
%]
|
||||||
NO TYPE FOUND FOR ELEMENT [% element.get_name %]
|
NO TYPE FOUND FOR ELEMENT [% element.get_name %]
|
||||||
[% END -%]
|
[% END -%]
|
||||||
@@ -21,11 +21,11 @@ Perl data type class for the XML Schema defined simpleType
|
|||||||
[% simpleType.get_name %] from the namespace [% simpleType.get_targetNamespace %].
|
[% simpleType.get_name %] from the namespace [% simpleType.get_targetNamespace %].
|
||||||
|
|
||||||
[% IF (simpleType.get_variety == 'list');
|
[% IF (simpleType.get_variety == 'list');
|
||||||
INCLUDE simpleType/POD/list.tt;
|
INCLUDE simpleType/POD/list.tt;
|
||||||
ELSIF (simpleType.get_variety == 'restriction');
|
ELSIF (simpleType.get_variety == 'restriction');
|
||||||
INCLUDE simpleType/POD/restriction.tt;
|
INCLUDE simpleType/POD/restriction.tt;
|
||||||
ELSE;
|
ELSE;
|
||||||
THROW NOT_IMPLEMENTED "simpleType union not implemented yet in $simpleType.get_name";
|
THROW NOT_IMPLEMENTED "simpleType union not implemented yet in $simpleType.get_name";
|
||||||
END %]
|
END %]
|
||||||
|
|
||||||
=head1 METHODS
|
=head1 METHODS
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
This clase is derived from
|
This clase is derived from
|
||||||
[%-
|
[%-
|
||||||
IF (name = simpleType.get_itemType);
|
IF (name = simpleType.get_itemType);
|
||||||
type_name = simpleType.expand( name );
|
type_name = simpleType.expand( name );
|
||||||
IF (type_name.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
|
IF (type_name.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::[% type_name.1 %]
|
SOAP::WSDL::XSD::Typelib::Builtin::[% type_name.1 %]
|
||||||
[% ELSE -%]
|
[% ELSE -%]
|
||||||
[% type_prefix %]::[% type_name.1 %]
|
[% type_prefix %]::[% type_name.1 %]
|
||||||
[% END;
|
[% END;
|
||||||
ELSE;
|
ELSE;
|
||||||
# THROW NOT_IMPLEMENTED "atomic simpleType list not implemented yet in $simpleType.get_name";
|
# THROW NOT_IMPLEMENTED "atomic simpleType list not implemented yet in $simpleType.get_name";
|
||||||
%] a atomic base type. Unfortunately there's no documenatation generation for atomic base types yet. [%
|
%] a atomic base type. Unfortunately there's no documenatation generation for atomic base types yet. [%
|
||||||
END -%].
|
END -%].
|
||||||
|
|
||||||
You may pass the following structure to new():
|
You may pass the following structure to new():
|
||||||
|
|
||||||
[ $value_1, .. $value_n ]
|
[ $value_1, .. $value_n ]
|
||||||
|
|
||||||
All elements of the list must be of the class' base type (or
|
All elements of the list must be of the class' base type (or valid arguments
|
||||||
valid arguments to it's constructor).
|
to it's constructor).
|
||||||
|
|||||||
@@ -1,15 +1,14 @@
|
|||||||
This clase is derived from
|
This clase is derived from [%-
|
||||||
[%-
|
|
||||||
IF (name = simpleType.get_base);
|
IF (name = simpleType.get_base);
|
||||||
type_name = simpleType.expand( name );
|
type_name = simpleType.expand( name );
|
||||||
IF (type_name.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
|
IF (type_name.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::[% type_name.1 %]
|
SOAP::WSDL::XSD::Typelib::Builtin::[% type_name.1 %]
|
||||||
[% ELSE -%]
|
[% ELSE -%]
|
||||||
[% type_prefix %]::[% type_name.1 %]
|
[% type_prefix %]::[% type_name.1 %]
|
||||||
[% END;
|
[% END;
|
||||||
ELSE;
|
ELSE;
|
||||||
# THROW NOT_IMPLEMENTED "atomic simpleType restriction not implemented yet in $simpleType.get_name";
|
# THROW NOT_IMPLEMENTED "atomic simpleType restriction not implemented yet in $simpleType.get_name";
|
||||||
%] a atomic base type. Unfortunately there's no documenatation generation for atomic base types yet. [%
|
%] a atomic base type. Unfortunately there's no documenatation generation for atomic base types yet. [%
|
||||||
END -%]
|
END -%]
|
||||||
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
|
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
|
||||||
like it's base type.
|
like it's base type.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[% IF (simpleType.get_variety == 'list');
|
[% IF (simpleType.get_variety == 'list');
|
||||||
INCLUDE simpleType/list.tt(simpleType = simpleType);
|
INCLUDE simpleType/list.tt(simpleType = simpleType);
|
||||||
ELSIF (simpleType.get_variety == 'restriction');
|
ELSIF (simpleType.get_variety == 'restriction');
|
||||||
INCLUDE simpleType/restriction.tt(type = simpleType);
|
INCLUDE simpleType/restriction.tt(type = simpleType);
|
||||||
ELSE;
|
ELSE;
|
||||||
THROW NOT_IMPLEMENTED "${ element.get_name } - ${ simpleType.get_variety } not supported yet";
|
THROW NOT_IMPLEMENTED "${ element.get_name } - ${ simpleType.get_variety } not supported yet";
|
||||||
END %]
|
END %]
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
# list derivation
|
# list derivation
|
||||||
use base qw(
|
use base qw(
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::list
|
SOAP::WSDL::XSD::Typelib::Builtin::list
|
||||||
[%
|
[%
|
||||||
IF (name = simpleType.get_itemType);
|
IF (name = simpleType.get_itemType);
|
||||||
type_name = simpleType.expand( name );
|
type_name = simpleType.expand( name );
|
||||||
IF (type_name.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
|
IF (type_name.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::[% type_name.1 %]
|
SOAP::WSDL::XSD::Typelib::Builtin::[% type_name.1 %]
|
||||||
);
|
);
|
||||||
[% ELSE -%]
|
[% ELSE -%]
|
||||||
[% type_prefix %]::[% type_name.1 %]
|
[% type_prefix %]::[% type_name.1 %]
|
||||||
);
|
);
|
||||||
[% END;
|
[% END;
|
||||||
ELSIF (type = simpleType.first_simpleType); %]
|
ELSIF (type = simpleType.first_simpleType); %]
|
||||||
);
|
);
|
||||||
|
|
||||||
[% INCLUDE simpleType/atomicType.tt(type = type);
|
[% INCLUDE simpleType/atomicType.tt(type = type);
|
||||||
ELSE; PERL %]die $stash->{simpleType}._DUMP [% END;
|
ELSE; PERL %]die $stash->{simpleType}._DUMP [% END;
|
||||||
THROW UNKNOWN , "No list itemTape and no atomic simpleType - don't know what to do";
|
THROW UNKNOWN , "No list itemTape and no atomic simpleType - don't know what to do";
|
||||||
END %]
|
END %]
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
# derivation by restriction
|
# derivation by restriction
|
||||||
[% IF (base = simpleType.get_base) -%]
|
[% IF (base = simpleType.get_base) -%]
|
||||||
use base qw(
|
use base qw(
|
||||||
[% INCLUDE _type_class.tt(type = base, node=simpleType) %]);
|
[% INCLUDE _type_class.tt(type = base, node=simpleType) %]);
|
||||||
[% ELSIF (type = simpleType.first_simpleType() );
|
[% ELSIF (type = simpleType.first_simpleType() );
|
||||||
INCLUDE simpleType/atomicType.tt(type = type);
|
INCLUDE simpleType/atomicType.tt(type = type);
|
||||||
ELSE;
|
ELSE;
|
||||||
THROW "neither base nor atomic type - don't know what to do" %]
|
THROW "neither base nor atomic type - don't know what to do" %]
|
||||||
[% END %]
|
[% END %]
|
||||||
@@ -3,6 +3,8 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
|
|
||||||
|
our $VERSION = '2.00_17';
|
||||||
|
|
||||||
my %definitions_of :ATTR(:name<definitions> :default<()>);
|
my %definitions_of :ATTR(:name<definitions> :default<()>);
|
||||||
my %type_prefix_of :ATTR(:name<type_prefix> :default<()>);
|
my %type_prefix_of :ATTR(:name<type_prefix> :default<()>);
|
||||||
my %element_prefix_of :ATTR(:name<element_prefix> :default<()>);
|
my %element_prefix_of :ATTR(:name<element_prefix> :default<()>);
|
||||||
@@ -196,14 +198,10 @@ schema implementation.
|
|||||||
|
|
||||||
=head2 Implementation
|
=head2 Implementation
|
||||||
|
|
||||||
=head3 _accept
|
=head3 accept
|
||||||
|
|
||||||
SOAP::WSDL::Base defines an _accept method which expects a Visitor as only
|
SOAP::WSDL::Base defines an accept method which expects a Visitor as only
|
||||||
parameter. The method is named _accept (and not the common "accept") to avoid
|
parameter.
|
||||||
interferance with possible XML names (XML names must not start with a _).
|
|
||||||
|
|
||||||
Don't let the _ prefix fool you: The method is B<not> private (though it is
|
|
||||||
meant to be called by Visitors only).
|
|
||||||
|
|
||||||
The method visit_Foo_Bar is called on the visitor, whith the self object as
|
The method visit_Foo_Bar is called on the visitor, whith the self object as
|
||||||
parameter.
|
parameter.
|
||||||
@@ -232,7 +230,41 @@ to generate C# code from it...
|
|||||||
|
|
||||||
To write your own code generating visitor, you should subclass
|
To write your own code generating visitor, you should subclass
|
||||||
SOAP::WSDL::Generator::Visitor. It implements (empty) default methods for all
|
SOAP::WSDL::Generator::Visitor. It implements (empty) default methods for all
|
||||||
SOAP::WSDL data classes.
|
SOAP::WSDL data classes:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * visit_Definitions
|
||||||
|
|
||||||
|
=item * visit_Binding
|
||||||
|
|
||||||
|
=item * visit_Message
|
||||||
|
|
||||||
|
=item * visit_Operation
|
||||||
|
|
||||||
|
=item * visit_OpMessage
|
||||||
|
|
||||||
|
=item * visit_Part
|
||||||
|
|
||||||
|
=item * visit_Port
|
||||||
|
|
||||||
|
=item * visit_PortType
|
||||||
|
|
||||||
|
=item * visit_Service
|
||||||
|
|
||||||
|
=item * visit_SoapOperation
|
||||||
|
|
||||||
|
=item * visit_Types
|
||||||
|
|
||||||
|
=item * visit_XSD_Schema
|
||||||
|
|
||||||
|
=item * visit_XSD_ComplexType
|
||||||
|
|
||||||
|
=item * visit_XSD_Element
|
||||||
|
|
||||||
|
=item * visit_XSD_SimpleType
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
In your Visitor, you must implement visit_Foo methods for all classes you wish
|
In your Visitor, you must implement visit_Foo methods for all classes you wish
|
||||||
to visit.
|
to visit.
|
||||||
@@ -262,7 +294,7 @@ Addison-Wesley Longman, Amsterdam.
|
|||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
Copyright 2004-2007 Martin Kutter.
|
Copyright 2004-2007 Martin Kutter.
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ sub visit_Definitions {
|
|||||||
|
|
||||||
$self->set_definitions( $definitions );
|
$self->set_definitions( $definitions );
|
||||||
|
|
||||||
for ( @{ $definitions->get_service() } ) {
|
for ( @{ $definitions->get_service() } ){
|
||||||
$_->_accept($self);
|
$_->_accept($self);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -181,8 +181,8 @@ sub visit_XSD_Element {
|
|||||||
# They all just return if no argument is given,
|
# They all just return if no argument is given,
|
||||||
# and return $self on success.
|
# and return $self on success.
|
||||||
SWITCH: {
|
SWITCH: {
|
||||||
if ($element->get_type) {
|
if ($element->get_type) {
|
||||||
$self->process_referenced_type( $element->expand( $element->get_type() ) )
|
$self->process_referenced_type( $element->expand( $element->get_type() ) )
|
||||||
&& last;
|
&& last;
|
||||||
}
|
}
|
||||||
# for atomic simple and comples types , and ref elements
|
# for atomic simple and comples types , and ref elements
|
||||||
@@ -210,7 +210,7 @@ sub visit_XSD_ComplexType {
|
|||||||
# TODO is this allowed ? or should we better die ?
|
# TODO is this allowed ? or should we better die ?
|
||||||
return if not $content_model; # empty complexType
|
return if not $content_model; # empty complexType
|
||||||
|
|
||||||
if ( grep { $_ eq $content_model} qw(all sequence) )
|
if ( grep { $_ eq $content_model} qw(all sequence choice) )
|
||||||
{
|
{
|
||||||
# visit child elements
|
# visit child elements
|
||||||
for (@{ $type->get_element() }) {
|
for (@{ $type->get_element() }) {
|
||||||
|
|||||||
@@ -30,8 +30,8 @@ service).
|
|||||||
|
|
||||||
print $result;
|
print $result;
|
||||||
|
|
||||||
C<perldoc MyInterface::SERVICE_NAME> should give you some overview about the
|
C<perldoc MyInterface::SERVICE_NAME::PORT_NAME> should give you some overview
|
||||||
service's interface structure.
|
about the service's interface structure.
|
||||||
|
|
||||||
The results of all calls to your service object's methods (except new) are
|
The results of all calls to your service object's methods (except new) are
|
||||||
objects based on SOAP::WSDL's XML schema implementation.
|
objects based on SOAP::WSDL's XML schema implementation.
|
||||||
@@ -126,7 +126,7 @@ fault properties, see L<SOAP::WSDL::SOAP::Typelib::Fault11>
|
|||||||
=head2 Adding missing information
|
=head2 Adding missing information
|
||||||
|
|
||||||
Sometimes, WSDL definitions are incomplete. In most of these cases, proper
|
Sometimes, WSDL definitions are incomplete. In most of these cases, proper
|
||||||
fault definitions are missing. This means that though the specification sais
|
fault definitions are missing. This means that though the specification says
|
||||||
nothing about it, Fault messages include extra elements in the
|
nothing about it, Fault messages include extra elements in the
|
||||||
E<lt>detailE<gt> section, or errors are even indicated by non-fault messages.
|
E<lt>detailE<gt> section, or errors are even indicated by non-fault messages.
|
||||||
|
|
||||||
@@ -212,7 +212,6 @@ are two ways to go:
|
|||||||
This is the way to go if you already are experienced in writing WSDL files.
|
This is the way to go if you already are experienced in writing WSDL files.
|
||||||
If you are not, be warned: Writing a correct WSDL is not an easy task, and
|
If you are not, be warned: Writing a correct WSDL is not an easy task, and
|
||||||
writing correct WSDL files with only a text editor is almost impossible.
|
writing correct WSDL files with only a text editor is almost impossible.
|
||||||
|
|
||||||
You should definitely use a WSDL editor. The WSDL editor should support
|
You should definitely use a WSDL editor. The WSDL editor should support
|
||||||
conformance checks for the WS-I Basic Profile (1.0 is preferred by
|
conformance checks for the WS-I Basic Profile (1.0 is preferred by
|
||||||
SOAP::WSDL)
|
SOAP::WSDL)
|
||||||
@@ -227,7 +226,7 @@ L<SOAP::WSDL::XSD::Typelib::ComplexType>, L<SOAP::WSDL::XSD::Typelib::SimpleType
|
|||||||
L<SOAP::WSDL::XSD::Typelib::Element> tell you how to create subclasses of XML schema
|
L<SOAP::WSDL::XSD::Typelib::Element> tell you how to create subclasses of XML schema
|
||||||
types.
|
types.
|
||||||
|
|
||||||
L<SOAP::WSDL::Parser> will tell you how to create a typemap class.
|
L<SOAP::WSDL::Manual::Parser> will tell you how to create a typemap class.
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
@@ -248,14 +247,14 @@ When using SOAP::WSDL::Transport::HTTP (SOAP::Lite not installed), add a
|
|||||||
method called "get_basic_credentials" to SOAP::WSDL::Transport::HTTP:
|
method called "get_basic_credentials" to SOAP::WSDL::Transport::HTTP:
|
||||||
|
|
||||||
*SOAP::WSDL::Transport::HTTP::get_basic_credentials = sub {
|
*SOAP::WSDL::Transport::HTTP::get_basic_credentials = sub {
|
||||||
return ($user, $password);
|
return ($user, $password);
|
||||||
};
|
};
|
||||||
|
|
||||||
When using SOAP::Transport::HTTP (SOAP::Lite is installed), do the same to
|
When using SOAP::Transport::HTTP (SOAP::Lite is installed), do the same to
|
||||||
this backend:
|
this backend:
|
||||||
|
|
||||||
*SOAP::Transport::HTTP::get_basic_credentials = sub {
|
*SOAP::Transport::HTTP::get_basic_credentials = sub {
|
||||||
return ($user, $password);
|
return ($user, $password);
|
||||||
};
|
};
|
||||||
|
|
||||||
=head3 Accessing HTTP(S) webservices protected by NTLM authentication
|
=head3 Accessing HTTP(S) webservices protected by NTLM authentication
|
||||||
@@ -273,7 +272,7 @@ class. This unfortunately means that you have to set the endpoint URL, too:
|
|||||||
|
|
||||||
You may, of course, decide to just hack the generated class. Be advised that
|
You may, of course, decide to just hack the generated class. Be advised that
|
||||||
subclassing might be a more appropriate solution - re-generating overwrites
|
subclassing might be a more appropriate solution - re-generating overwrites
|
||||||
your changes.
|
changes in interface classes.
|
||||||
|
|
||||||
=head3 Accessing HTTPS webservices protected by certificate authentication
|
=head3 Accessing HTTPS webservices protected by certificate authentication
|
||||||
|
|
||||||
@@ -283,13 +282,15 @@ See L<Crypt::SSLeay> on how to configure client certificate authentication.
|
|||||||
|
|
||||||
=head1 SEE ALSO
|
=head1 SEE ALSO
|
||||||
|
|
||||||
|
L<SOAP::WSDL::Manual::XSD> SOAP::WSDL's XML Schema implementation
|
||||||
|
|
||||||
L<SOAP::WSDL::Manual::Glossary> The meaning of all these words
|
L<SOAP::WSDL::Manual::Glossary> The meaning of all these words
|
||||||
|
|
||||||
L<SOAP::WSDL::Client> Basic client for SOAP::WSDL based interfaces
|
L<SOAP::WSDL::Client> Basic client for SOAP::WSDL based interfaces
|
||||||
|
|
||||||
L<SOAP::WSDL> an interpreting WSDL based SOAP client
|
L<SOAP::WSDL> an interpreting WSDL based SOAP client
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
Copyright 2007 Martin Kutter.
|
Copyright 2007 Martin Kutter.
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SOAP::WSDL::Manual::Deserializer
|
||||||
|
|
||||||
|
=head1 DESERIALIZER CLASSES
|
||||||
|
|
||||||
|
Deserializer classes convert SOAP messages to perl data structures.
|
||||||
|
|
||||||
|
SOAP::WSDL comes with several builtin serializer classes:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * L<SOAP::WSDL::Deserializer::XSD|SOAP::WSDL::Deserializer::XSD>
|
||||||
|
|
||||||
|
Creates SOAP::WSDL::XSD objects from SOAP messages. Default deserializer for
|
||||||
|
generated interfaces and SOAP::WSDL::Client.
|
||||||
|
|
||||||
|
=item * L<SOAP::WSDL::Deserializer::Hash|SOAP::WSDL::Deserializer::Hash>
|
||||||
|
|
||||||
|
Creates perl hash structures from SOAP messages.
|
||||||
|
|
||||||
|
=item * L<SOAP::WSDL::Deserializer::SOM|SOAP::WSDL::Deserializer::SOM>
|
||||||
|
|
||||||
|
Creates SOAP::SOM objects from SOAP messages. Default deserializer for
|
||||||
|
SOAP::WSDL.
|
||||||
|
|
||||||
|
See L<SOAP::Lite> for more information on SOAP::SOM objects.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 WRITING YOUR OWN DESERIALIZER
|
||||||
|
|
||||||
|
See L<SOAP::WSDL::Factory::Deserializer>.
|
||||||
|
|
||||||
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
|
Copyright 2007 Martin Kutter.
|
||||||
|
|
||||||
|
This file is part of SOAP-WSDL. You may distribute/modify it under the same
|
||||||
|
terms as perl itself
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -11,9 +11,10 @@ some internet protocol, typically via HTTP(S).
|
|||||||
|
|
||||||
=head2 SOAP
|
=head2 SOAP
|
||||||
|
|
||||||
SOAP is an acronym for Simple Object Access Protocol.
|
SOAP is (was - since 1.2 the name "SOAP" has no meaning any more) an acronym
|
||||||
SOAP is a W3C recommendation. The latest version of the SOAP
|
for Simple Object Access Protocol.
|
||||||
specification may be found at L<http://www.w3.org/TR/soap/>.
|
SOAP is a W3C recommendation. The latest version of the SOAP specification
|
||||||
|
may be found at L<http://www.w3.org/TR/soap/>.
|
||||||
|
|
||||||
SOAP defines a protocoll for message exchange between applications.
|
SOAP defines a protocoll for message exchange between applications.
|
||||||
The most popular usage is to use SOAP for remote procedure calls (RPC).
|
The most popular usage is to use SOAP for remote procedure calls (RPC).
|
||||||
@@ -22,8 +23,8 @@ While one of the constituting aspects of a web service is its
|
|||||||
reachability via some internet protocol, you might as well define
|
reachability via some internet protocol, you might as well define
|
||||||
SOAP services accessible via postcards.
|
SOAP services accessible via postcards.
|
||||||
|
|
||||||
Despite it's name, SOAP has nothing more to do with objects than
|
Despite it's former name, SOAP has nothing more to do with objects than
|
||||||
cars have with pets - SOAP messages may, but not neccessarily do
|
cars have with pets - SOAP messages may, but not necessarily do
|
||||||
carry objects, very much like your car may, but does not need to
|
carry objects, very much like your car may, but does not need to
|
||||||
carry your pet.
|
carry your pet.
|
||||||
|
|
||||||
@@ -47,7 +48,7 @@ how related Web services specifications should be used together for
|
|||||||
best interoperability. To date, WS-I has finalized the Basic Profile,
|
best interoperability. To date, WS-I has finalized the Basic Profile,
|
||||||
Attachments Profile and Simple SOAP Binding Profile.
|
Attachments Profile and Simple SOAP Binding Profile.
|
||||||
|
|
||||||
SOAP::WSDL aims at complying to the Basic Profile (but does not
|
SOAP::WSDL aims at complying to the WS-I Basic Profile (but does not
|
||||||
implement full support yet).
|
implement full support yet).
|
||||||
|
|
||||||
=head2 SOAP message styles
|
=head2 SOAP message styles
|
||||||
@@ -76,16 +77,23 @@ WS-I Basic Profile allows the use of document message style.
|
|||||||
|
|
||||||
=head3 literal
|
=head3 literal
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
Copyright 2007 Martin Kutter.
|
Copyright 2007 Martin Kutter.
|
||||||
|
|
||||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
This file is part of SOAP-WSDL. You may distribute/modify it under the same
|
||||||
the same terms as perl itself
|
terms as perl itself.
|
||||||
|
|
||||||
=head1 AUTHOR
|
=head1 AUTHOR
|
||||||
|
|
||||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||||
|
|
||||||
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
|
$Rev: 391 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: Glossary.pod 391 2007-11-17 21:56:13Z kutterma $
|
||||||
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/Glossary.pod $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
=head1 NAME
|
=head1 NAME
|
||||||
|
|
||||||
SOAP::WSDL::Parser - How SOAP::WSDL parses XML messages
|
SOAP::WSDL::Manual::Parser - How SOAP::WSDL parses XML messages
|
||||||
|
|
||||||
=head1 Which XML message does SOAP::WSDL parse ?
|
=head1 Which XML message does SOAP::WSDL parse ?
|
||||||
|
|
||||||
@@ -17,75 +17,36 @@ to parse:
|
|||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head1 Parser implementations
|
|
||||||
|
|
||||||
There are different parser implementations available for SOAP messages and
|
There are different parser implementations available for SOAP messages and
|
||||||
WSDL definitions.
|
WSDL definitions.
|
||||||
|
|
||||||
Historically, SOAP::WSDL used SAX for parsing XML. The SAX handlers were
|
=head1 WSDL definitions parser
|
||||||
implemented as L<XML::LibXML|XML::LibXML> handlers, which also worked with
|
|
||||||
L<XML::SAX::ParserFactory|XML::SAX::ParserFactory>.
|
|
||||||
|
|
||||||
Support for SAX and L<XML::LibXML|XML::LibXML> in SOAP::WSDL is discontinued
|
=head2 SOAP::WSDL::Expat::WSDLParser
|
||||||
for the following reasons:
|
|
||||||
|
|
||||||
=over
|
|
||||||
|
|
||||||
=item * Speed
|
|
||||||
|
|
||||||
L<XML::Parser::Expat|XML::Parser::Expat> is faster than
|
|
||||||
L<XML::LibXML|XML::LibXML> - at least when optimized for speed.
|
|
||||||
|
|
||||||
High parsing speed is one of the key requirements for a SOAP toolkit - if XML
|
|
||||||
serializing and (more important) deserializing are not fast enough, the whole
|
|
||||||
toolkit is unusable.
|
|
||||||
|
|
||||||
=item * Availability
|
|
||||||
|
|
||||||
L<XML::Parser|XML::Parser> is more popular than L<XML::LibXML|XML::LibXML>.
|
|
||||||
|
|
||||||
=item * Stability
|
|
||||||
|
|
||||||
XML::LibXML is based on the libxml2 library. Several versions of
|
|
||||||
libxml2 are known to have specific bugs. As a workaround, there are
|
|
||||||
often several versions of libxml2 installed on one system. This may
|
|
||||||
lead to problems on operating systems which cannot load more than
|
|
||||||
one version of a shared library simultaneously.
|
|
||||||
|
|
||||||
XML::LibXML is also still under development, while XML::Parser has had time
|
|
||||||
to stabilize.
|
|
||||||
|
|
||||||
=item * SOAP::Lite uses XML::Parser
|
|
||||||
|
|
||||||
L<SOAP::Lite|SOAP::Lite> uses L<XML::Parser|XML::Parser> if available.
|
|
||||||
SOAP::WSDL should not require users to install both L<XML::Parser|XML::Parser>
|
|
||||||
and L<XML::LibXML|XML::LibXML>.
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
=head2 WSDL definitions parser
|
|
||||||
|
|
||||||
=over
|
|
||||||
|
|
||||||
=item * SOAP::WSDL::Expat::WSDLParser
|
|
||||||
|
|
||||||
A parser for WSDL definitions based on L<XML::Parser::Expat|XML::Parser::Expat>.
|
A parser for WSDL definitions based on L<XML::Parser::Expat|XML::Parser::Expat>.
|
||||||
|
|
||||||
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
|
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
|
||||||
my $wsdl = $parser->parse_file( $filename );
|
my $wsdl = $parser->parse_file( $filename );
|
||||||
|
|
||||||
=back
|
The WSDL parser creates a tree of perl objects, whose root is a
|
||||||
|
L<SOAP::WSDL::Definitions|SOAP::WSDL::Definitions> element.
|
||||||
|
|
||||||
=head2 SOAP messages parser
|
=head1 SOAP messages parser
|
||||||
|
|
||||||
All SOAP message handler use class resolvers for finding out which class
|
=head2 SOAP::WSDL::Expat::MessageParser
|
||||||
|
|
||||||
|
L<SOAP::WSDL::Expat::MessageParser|SOAP::WSDL::Expat::MessageParser> converts
|
||||||
|
SOAP messages to SOAP::WSDL::XSD object trees.
|
||||||
|
|
||||||
|
It uses a class resolvers for finding out which class
|
||||||
a particular XML element should be of, and type libs containing these classes.
|
a particular XML element should be of, and type libs containing these classes.
|
||||||
|
|
||||||
=head3 Creating a class resolver
|
=head3 Creating a class resolver
|
||||||
|
|
||||||
The easiest way for creating a class resolver is to run SOAP::WSDL's generator.
|
The easiest way for creating a class resolver is to run SOAP::WSDL's generator.
|
||||||
|
|
||||||
See wsdl2perl.pl
|
See L<wsdl2perl.pl>.
|
||||||
|
|
||||||
The class resolver must implement a class method "get_class", which is passed
|
The class resolver must implement a class method "get_class", which is passed
|
||||||
a list ref of the current element's XPath (relative to Body), split by /.
|
a list ref of the current element's XPath (relative to Body), split by /.
|
||||||
@@ -150,67 +111,73 @@ WSDL definitions are complete.
|
|||||||
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>.
|
||||||
|
|
||||||
=head3 Parser implementations
|
=head2 SOAP::WSDL::Expat::Message2Hash
|
||||||
|
|
||||||
|
Transforms a SOAP message into a perl hash refs. Using this parser is usually
|
||||||
|
triggered by calling the C<outputhash> method of SOAP::WSDL, or by using
|
||||||
|
L<SOAP::WSDL::Deserializer::Hash|SOAP::WSDL::Deserializer::Hash>.
|
||||||
|
|
||||||
|
Acts somewhat like XML::Simple, but faster.
|
||||||
|
|
||||||
|
The following restrictions apply:
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item * SOAP::WSDL::Expat::MessageParser
|
=item * Ignores all namespaces
|
||||||
|
|
||||||
A L<XML::Parser::Expat|XML::Parser::Expat> based parser. This is the fastest
|
=item * Ignores all attributes
|
||||||
parser for most SOAP messages and the default for SOAP::WSDL::Client.
|
|
||||||
|
|
||||||
=item * SOAP::WSDL::Expat::MessageStreamParser
|
=item * Does not handle mixed content
|
||||||
|
|
||||||
A XML::Parser::ExpatNB based parser. Useful for parsing huge HTTP responses,
|
=item * The SOAP header is ignored
|
||||||
as you don't need to keep everything in memory.
|
|
||||||
|
|
||||||
See L<SOAP::WSDL::Expat::MessageStreamParser|SOAP::WSDL::Expat::MessageStreamParser>
|
|
||||||
for details.
|
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head3 Performance
|
=cut
|
||||||
|
|
||||||
SOAP::WSDL::Expat::MessageParser is the fastest way of parsing SOAP messages
|
|
||||||
into object trees and only slightly slower than converting them into hash
|
|
||||||
data structures:
|
|
||||||
|
|
||||||
Parsing a SOAP message with a length of 5962 bytes:
|
|
||||||
SOAP::WSDL::Expat::MessageParser:
|
|
||||||
3 wallclock secs ( 3.28 usr + 0.05 sys = 3.33 CPU) @ 60.08/s (n=200)
|
|
||||||
|
|
||||||
SOAP::WSDL::SAX::MessageHandler (with raw XML::LibXML):
|
|
||||||
5 wallclock secs ( 4.95 usr + 0.00 sys = 4.95 CPU) @ 40.38/s (n=200)
|
|
||||||
|
|
||||||
XML::Simple (XML::Parser):
|
|
||||||
3 wallclock secs ( 2.36 usr + 0.03 sys = 2.39 CPU) @ 83.65/s (n=200)
|
|
||||||
|
|
||||||
XML::Simple (XML::SAX::Expat):
|
|
||||||
7 wallclock secs ( 6.50 usr + 0.03 sys = 6.53 CPU) @ 30.62/s (n=200)
|
|
||||||
|
|
||||||
As the benchmark shows, all SOAP::WSDL parser variants are faster than
|
|
||||||
XML::Simple with XML::SAX::Expat, and SOAP::WSDL::Expat::MessageParser almost
|
|
||||||
reaches the performance of XML::Simple with XML::Parser as backend.
|
|
||||||
|
|
||||||
Parsing SOAP responses in chunks does not increase speed - at least not up
|
|
||||||
to a response size of around 500k:
|
|
||||||
|
|
||||||
Benchmark: timing 5 iterations of SOAP::WSDL::SAX::MessageHandler,
|
|
||||||
SOAP::WSDL::Expat::MessageParser, SOAP::WSDL::Expat::MessageStreamParser...
|
|
||||||
|
|
||||||
SOAP::WSDL::Expat::MessageStreamParser:
|
|
||||||
13 wallclock secs ( 7.39 usr + 0.09 sys = 7.48 CPU) @ 0.67/s (n=5)
|
|
||||||
|
|
||||||
SOAP::WSDL::Expat::MessageParser:
|
|
||||||
10 wallclock secs ( 5.81 usr + 0.06 sys = 5.88 CPU) @ 0.85/s (n=5)
|
|
||||||
|
|
||||||
SOAP::WSDL::SAX::MessageHandler:
|
|
||||||
14 wallclock secs ( 8.78 usr + 0.03 sys = 8.81 CPU) @ 0.57/s (n=5)
|
|
||||||
|
|
||||||
Response size: 344330 bytes
|
|
||||||
|
|
||||||
=head1 OLD SAX HANDLER
|
=head1 OLD SAX HANDLER
|
||||||
|
|
||||||
|
Historically, SOAP::WSDL used SAX for parsing XML. The SAX handlers were
|
||||||
|
implemented as L<XML::LibXML|XML::LibXML> handlers, which also worked with
|
||||||
|
L<XML::SAX::ParserFactory|XML::SAX::ParserFactory>.
|
||||||
|
|
||||||
|
Support for SAX and L<XML::LibXML|XML::LibXML> in SOAP::WSDL is discontinued
|
||||||
|
for the following reasons:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * Speed
|
||||||
|
|
||||||
|
L<XML::Parser::Expat|XML::Parser::Expat> is faster than
|
||||||
|
L<XML::LibXML|XML::LibXML> - at least when optimized for speed.
|
||||||
|
|
||||||
|
High parsing speed is one of the key requirements for a SOAP toolkit - if XML
|
||||||
|
serializing and (more important) deserializing are not fast enough, the whole
|
||||||
|
toolkit is unusable.
|
||||||
|
|
||||||
|
=item * Availability
|
||||||
|
|
||||||
|
L<XML::Parser|XML::Parser> is more popular than L<XML::LibXML|XML::LibXML>.
|
||||||
|
|
||||||
|
=item * Stability
|
||||||
|
|
||||||
|
XML::LibXML is based on the libxml2 library. Several versions of
|
||||||
|
libxml2 are known to have specific bugs. As a workaround, there are
|
||||||
|
often several versions of libxml2 installed on one system. This may
|
||||||
|
lead to problems on operating systems which cannot load more than
|
||||||
|
one version of a shared library simultaneously.
|
||||||
|
|
||||||
|
XML::LibXML is also still under development, while XML::Parser has had time
|
||||||
|
to stabilize.
|
||||||
|
|
||||||
|
=item * SOAP::Lite uses XML::Parser
|
||||||
|
|
||||||
|
L<SOAP::Lite|SOAP::Lite> uses L<XML::Parser|XML::Parser> if available.
|
||||||
|
SOAP::WSDL should not require users to install both L<XML::Parser|XML::Parser>
|
||||||
|
and L<XML::LibXML|XML::LibXML>.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
The old SAX handler historically used in SOAP::WSDL are not included in
|
The old SAX handler historically used in SOAP::WSDL are not included in
|
||||||
the SOAP::WSDL package any more.
|
the SOAP::WSDL package any more.
|
||||||
|
|
||||||
@@ -237,7 +204,6 @@ To parse a WSDL file, use one of the following variants:
|
|||||||
$parser->parse( $xml );
|
$parser->parse( $xml );
|
||||||
my $data = $handler->get_data();
|
my $data = $handler->get_data();
|
||||||
|
|
||||||
|
|
||||||
my $handler = SOAP::WSDL::SAX::WSDLHandler->new({
|
my $handler = SOAP::WSDL::SAX::WSDLHandler->new({
|
||||||
base => 'XML::SAX::Base'
|
base => 'XML::SAX::Base'
|
||||||
});
|
});
|
||||||
@@ -247,7 +213,6 @@ To parse a WSDL file, use one of the following variants:
|
|||||||
$parser->parse( $xml );
|
$parser->parse( $xml );
|
||||||
my $data = $handler->get_data();
|
my $data = $handler->get_data();
|
||||||
|
|
||||||
|
|
||||||
=item * SOAP::WSDL::SAX::MessageHandler
|
=item * SOAP::WSDL::SAX::MessageHandler
|
||||||
|
|
||||||
This is a SAX handler for parsing WSDL files into object trees SOAP::WSDL
|
This is a SAX handler for parsing WSDL files into object trees SOAP::WSDL
|
||||||
@@ -260,5 +225,23 @@ Can be used for parsing both streams (chunks) and documents.
|
|||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
|
Copyright 2007 Martin Kutter.
|
||||||
|
|
||||||
|
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||||
|
the same terms as perl itself.
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||||
|
|
||||||
|
=head1 REPOSITORY INFORMATION
|
||||||
|
|
||||||
|
$Rev: 391 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: Parser.pod 391 2007-11-17 21:56:13Z kutterma $
|
||||||
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/Parser.pod $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SOAP::WSDL::Manual::Serializer
|
||||||
|
|
||||||
|
=head1 SERIALIZER CLASSES
|
||||||
|
|
||||||
|
Serializer classes convert perl data structures to XML.
|
||||||
|
|
||||||
|
SOAP::WSDL comes with one builtin serializer class:
|
||||||
|
L<SOAP::WSDL::Serializer::XSD|SOAP::WSDL::Serializer::XSD>.
|
||||||
|
|
||||||
|
=head1 WRITING YOUR OWN SERIALIZER
|
||||||
|
|
||||||
|
See L<SOAP::WSDL::Factory::Serializer>.
|
||||||
|
|
||||||
|
=head1 LICENSE
|
||||||
|
|
||||||
|
Copyright 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>
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
@@ -291,7 +291,6 @@ the SOAPAction header from the operation name and the top node's namespace.
|
|||||||
SOAP::WSDL::Client always assures the SOAPaction header is quoted, thus
|
SOAP::WSDL::Client always assures the SOAPaction header is quoted, thus
|
||||||
automatically inserts the empty string if no SOAPAction header is defined.
|
automatically inserts the empty string if no SOAPAction header is defined.
|
||||||
|
|
||||||
|
|
||||||
=head2 R1015
|
=head2 R1015
|
||||||
|
|
||||||
A RECEIVER MUST generate a fault if they encounter a message whose document
|
A RECEIVER MUST generate a fault if they encounter a message whose document
|
||||||
@@ -306,8 +305,6 @@ element, yet.
|
|||||||
|
|
||||||
=head1 RULES NOT CONFIRMED
|
=head1 RULES NOT CONFIRMED
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head2 R4001
|
=head2 R4001
|
||||||
|
|
||||||
A RECEIVER MUST accept messages that include the Unicode Byte Order Mark
|
A RECEIVER MUST accept messages that include the Unicode Byte Order Mark
|
||||||
@@ -432,12 +429,8 @@ be used.
|
|||||||
|
|
||||||
TODO become "minimal conformant".
|
TODO become "minimal conformant".
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head1 RULES NOT APPLICABLE
|
=head1 RULES NOT APPLICABLE
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head2 R0004
|
=head2 R0004
|
||||||
|
|
||||||
A MESSAGE MAY contain conformance claims, as specified in the conformance claim schema.
|
A MESSAGE MAY contain conformance claims, as specified in the conformance claim schema.
|
||||||
@@ -459,7 +452,6 @@ Other serializers may act different.
|
|||||||
SOAP::WSDL::Serializer::SOAP11 does not add conformance claims.
|
SOAP::WSDL::Serializer::SOAP11 does not add conformance claims.
|
||||||
Other serializers may act different.
|
Other serializers may act different.
|
||||||
|
|
||||||
|
|
||||||
=head2 R0007
|
=head2 R0007
|
||||||
|
|
||||||
A SENDER MUST NOT use the soap:mustUnderstand attribute when sending a SOAP
|
A SENDER MUST NOT use the soap:mustUnderstand attribute when sending a SOAP
|
||||||
@@ -677,7 +669,7 @@ is Schema valid.
|
|||||||
A DESCRIPTION MUST only use the WSDL "import" statement to import another
|
A DESCRIPTION MUST only use the WSDL "import" statement to import another
|
||||||
WSDL description.
|
WSDL description.
|
||||||
|
|
||||||
SOAP::WSDL has no means of generating WSDL definitions.
|
SOAP::WSDL has no means of generating WSDL definitions
|
||||||
|
|
||||||
=head2 R2002
|
=head2 R2002
|
||||||
|
|
||||||
@@ -1228,7 +1220,7 @@ SOAP::WSDL has no means of generating WSDL definitions.
|
|||||||
|
|
||||||
SOAP::WSDL has no means of generating WSDL definitions.
|
SOAP::WSDL has no means of generating WSDL definitions.
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
This file contains quotes from
|
This file contains quotes from
|
||||||
L<http://www.ws-i.org/Profiles/BasicProfile-1.0-2004-04-16.html>. To these
|
L<http://www.ws-i.org/Profiles/BasicProfile-1.0-2004-04-16.html>. To these
|
||||||
@@ -1243,5 +1235,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: 391 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: WS_I.pod 391 2007-11-17 21:56:13Z kutterma $
|
||||||
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Manual/WS_I.pod $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,391 @@
|
|||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SOAP::WSDL::Manual::XSD - SOAP::WSDL's XML Schema implementation
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP::WSDL's XML Schema implementation translates XML Schema definitions into
|
||||||
|
perl classes.
|
||||||
|
|
||||||
|
Every top-level type or element in a XML schema is translated into a perl
|
||||||
|
class (usually in it's own file).
|
||||||
|
|
||||||
|
Atomic types are either directly included in the class of their parent's
|
||||||
|
node, or as sub-package in their parent class' file.
|
||||||
|
|
||||||
|
While the implementation is still incomplete, it covers the XML schema
|
||||||
|
definitions used by most object mappers.
|
||||||
|
|
||||||
|
=head1 USAGE
|
||||||
|
|
||||||
|
You can use SOAP::WSDL::XSD based classes just like any perl class - you may
|
||||||
|
instantiate it, inherit from it etc.
|
||||||
|
|
||||||
|
You should be aware, that SOAP::WSDL::XSD based classes are inside-out
|
||||||
|
classes using Class::Std, though - things you would expect from hash-based
|
||||||
|
classes like using the blessed hash ref as data storage won't work.
|
||||||
|
|
||||||
|
Moreover, most all SOAP::WSDL::XSD::Typelib based classes override
|
||||||
|
Class::Std's default constructor for speed - you should not expect BUILD or
|
||||||
|
START methods to work, unless you call them yourself (or define a new
|
||||||
|
constructor).
|
||||||
|
|
||||||
|
All SOAP::WSDL::XSD based complexType classes allow a hash ref matching their
|
||||||
|
data structure as only parameter to new(). You may mix hash and list refs and
|
||||||
|
objects in the structure passed to new - as long as the structure matches, it
|
||||||
|
will work fine.
|
||||||
|
|
||||||
|
All SOAP::WSDL::XSD based simpleType (and builtin) classes accept a single
|
||||||
|
hash ref with the only key "value" and the value to be set as value.
|
||||||
|
|
||||||
|
All SOAP::WSDL::XSD based classes overload arrayification - that is being
|
||||||
|
accessed as a list ref - with a method returning [ $self ].
|
||||||
|
|
||||||
|
This means that you can safely use the results of get_ELEMENT calls on
|
||||||
|
cmplexTypes as list refs (you'll have to check for definedness, though -
|
||||||
|
see L<SOAP::WSDL::XSD::Typelib::Builtin|SOAP::WSDL::XSD::Typelib::Builtin>
|
||||||
|
for details.
|
||||||
|
|
||||||
|
To iterate over a (potential) list of child elements just do the following:
|
||||||
|
|
||||||
|
if (defined $obj->get_ELEMENT()) {
|
||||||
|
for (@{ $obj->get_ELEMENT() }) {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
This is especially useful in mini-languages like
|
||||||
|
L<HTML::Template::Compiled|HTML::Template::Compiled>, where you could say
|
||||||
|
|
||||||
|
<%IF_DEFINED obj.get_ELEMENT %>
|
||||||
|
<%LOOP obj.get_ELEMENT %>
|
||||||
|
...
|
||||||
|
<%/LOOP>
|
||||||
|
<%IF%>
|
||||||
|
|
||||||
|
=head1 HOW IT WORKS
|
||||||
|
|
||||||
|
=head2 Base classes
|
||||||
|
|
||||||
|
SOAP::WSDL::XSD provides a set of base classes for the construction of XML
|
||||||
|
schema defined type classes.
|
||||||
|
|
||||||
|
=head3 Builtin types
|
||||||
|
|
||||||
|
SOAP::WSDL::XSD provides classes for all builtin XML Schema datatypes.
|
||||||
|
|
||||||
|
For a list and reference on these classes, see
|
||||||
|
SOAP::WSDL::XSD::Typelib::Builtin.
|
||||||
|
|
||||||
|
=head3 Derivation classes
|
||||||
|
|
||||||
|
For derivation by list, the list derivation class
|
||||||
|
SOAP::WSDL::XSD::Typelib::Builtin::list exists.
|
||||||
|
|
||||||
|
Derivation by restriction is handled without the help of additional classes.
|
||||||
|
|
||||||
|
=head3 Element construction class
|
||||||
|
|
||||||
|
For the construction of element classes, the element superclass
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element exists. All elements are ultimately derived
|
||||||
|
from this class. Elements may inherit from type classes, too - see
|
||||||
|
L</TRANSLATION RULES> for details.
|
||||||
|
|
||||||
|
=head3 complexType construction class
|
||||||
|
|
||||||
|
For the construction of complexType classes, the construction class
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType is provided. It provides a __factory
|
||||||
|
method for placing attributes in generated classes, and generating
|
||||||
|
appropriate setter/getter accessors.
|
||||||
|
|
||||||
|
The setters are special: They handle complex data structures of any type
|
||||||
|
(meaning hash refs, list refs and objects, and any combination of them), as
|
||||||
|
long as their structure matches the expected structure.
|
||||||
|
|
||||||
|
=head1 TRANSLATION RULES
|
||||||
|
|
||||||
|
=head2 element
|
||||||
|
|
||||||
|
TODO add more elaborate description
|
||||||
|
|
||||||
|
=head3 element with type attribute
|
||||||
|
|
||||||
|
Elements defined by referencing a builtin or user defined type inherit
|
||||||
|
from SOAP::WSDL::XSD::Typelib::Element and from the corresponding type class.
|
||||||
|
|
||||||
|
Element Type
|
||||||
|
base class class
|
||||||
|
^ ^
|
||||||
|
| |
|
||||||
|
------------
|
||||||
|
|
|
||||||
|
Element type="" class
|
||||||
|
|
||||||
|
=head3 element with ref attribute
|
||||||
|
|
||||||
|
Elements defined by referencing another element inherit from the
|
||||||
|
corresponding element class.
|
||||||
|
|
||||||
|
referenced Element class
|
||||||
|
^
|
||||||
|
|
|
||||||
|
Element ref="" class
|
||||||
|
|
||||||
|
=head3 element with atomic simpleType
|
||||||
|
|
||||||
|
Elements defined by a atomic simpleType from
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element and from the base type of the atomic type.
|
||||||
|
|
||||||
|
Element atomic Type
|
||||||
|
base class base class
|
||||||
|
^ ^
|
||||||
|
| |
|
||||||
|
--------------
|
||||||
|
|
|
||||||
|
element simpleType class
|
||||||
|
|
||||||
|
=head3 element with atomic complexType
|
||||||
|
|
||||||
|
Elements defined with a atomic complexType inherit from
|
||||||
|
SOAP::WSDL::XSD::Typelib::Element and from
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType.
|
||||||
|
|
||||||
|
Element complexType
|
||||||
|
base class base class
|
||||||
|
^ ^
|
||||||
|
| |
|
||||||
|
--------------
|
||||||
|
|
|
||||||
|
element complexType class
|
||||||
|
|
||||||
|
=head2 complexType
|
||||||
|
|
||||||
|
TODO add more elaborate description
|
||||||
|
|
||||||
|
Some content models are not implemented yet. The content models
|
||||||
|
implemented are described below.
|
||||||
|
|
||||||
|
=head3 complexType with "all" variety
|
||||||
|
|
||||||
|
Complex types with "all" variety inherit from
|
||||||
|
SOAP::WSDL::XSD::Typelib::ComplexType, and call it's factory method for
|
||||||
|
creating fields and accessors/mutators for the complexType's elements.
|
||||||
|
|
||||||
|
All element's type classes are loaded. Complex type classes have a "has a"
|
||||||
|
relationship to their element fields.
|
||||||
|
|
||||||
|
Element fields may either be element classes (for element ref="") or type
|
||||||
|
classes (for element type=""). No extra element classes are created for
|
||||||
|
a complexType's elements.
|
||||||
|
|
||||||
|
complexType
|
||||||
|
base class
|
||||||
|
^
|
||||||
|
|
|
||||||
|
complexType all
|
||||||
|
---------------- has a
|
||||||
|
element name="a" ------------> Element or type class object
|
||||||
|
element name="b" ------------> Element or type class object
|
||||||
|
|
||||||
|
The implementation for all does enforce the order of elements as described
|
||||||
|
in the WSDL, even though this is not required by the XML Schema
|
||||||
|
specification.
|
||||||
|
|
||||||
|
=head3 complexType with "sequence" variety
|
||||||
|
|
||||||
|
The implementation of the "sequence" variety is the same as for all.
|
||||||
|
|
||||||
|
=head3 complexType with "choice" variety
|
||||||
|
|
||||||
|
The implementation for choice currently is the same as for all - which means,
|
||||||
|
no check for occurrence are made.
|
||||||
|
|
||||||
|
=head3 complexType with complexContent content model
|
||||||
|
|
||||||
|
Note that complexType classes with complexContent content model don't exhibit
|
||||||
|
their type via the xsi:type attribute yet, so they currently cannot be used
|
||||||
|
as a replacement for their base type.
|
||||||
|
|
||||||
|
SOAP::WSDL's XSD deserializer backend does not recognize the xsi:type=""
|
||||||
|
attribute either yet.
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * restriction variety
|
||||||
|
|
||||||
|
ComplexType classes with restriction variety inherit from their base type.
|
||||||
|
No additional processing or content checking is performed yet.
|
||||||
|
|
||||||
|
complexType
|
||||||
|
base type class
|
||||||
|
^
|
||||||
|
|
|
||||||
|
complexType
|
||||||
|
restriction
|
||||||
|
|
||||||
|
=item * extension variety
|
||||||
|
|
||||||
|
ComplexType classes with extension variety inherit from the XSD base
|
||||||
|
complexType class and from their base type.
|
||||||
|
|
||||||
|
Extension classes are checked for (re-)defining all elements of their parent
|
||||||
|
class.
|
||||||
|
|
||||||
|
Note that a derived type's elements (=properties) overrides the getter /
|
||||||
|
setter methods for all inherited elements. All object data is stored in the
|
||||||
|
derived type's class, not in the defining class (See L<Class::Std> for a
|
||||||
|
discussion on inside out object data storage).
|
||||||
|
|
||||||
|
No additional processing or content checking is performed yet.
|
||||||
|
|
||||||
|
complexType complexType
|
||||||
|
base class base type class
|
||||||
|
^ ^
|
||||||
|
| |
|
||||||
|
-----------------
|
||||||
|
|
|
||||||
|
complexType
|
||||||
|
extension
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 SimpleType
|
||||||
|
|
||||||
|
TODO add more elaborate description
|
||||||
|
|
||||||
|
Some derivation methods are not implemented yet. The derivation methods
|
||||||
|
implemented are described below.
|
||||||
|
|
||||||
|
=head3 Derivation by list
|
||||||
|
|
||||||
|
Derivation by list is implemented by inheriting from both the base type and
|
||||||
|
SOAP::WSDL::XSD::Typelib::XSD::list.
|
||||||
|
|
||||||
|
=head3 Derivation by restriction
|
||||||
|
|
||||||
|
Derivation by restriction is implemented by inheriting from a base type and
|
||||||
|
applying the required restrictions.
|
||||||
|
|
||||||
|
=head1 FACETS
|
||||||
|
|
||||||
|
XML Schema facets are not implemented yet.
|
||||||
|
|
||||||
|
They will probably implemented some day by putting constant methods into
|
||||||
|
the correspondent classes.
|
||||||
|
|
||||||
|
=head1 ATTRIBUTES
|
||||||
|
|
||||||
|
XML attributes are not implemented yet. If you have a good idea on how to
|
||||||
|
implement them, feel free to email me a proposal.
|
||||||
|
|
||||||
|
=head1 CAVEATS
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * START and BUILD are not being called
|
||||||
|
|
||||||
|
In contrast to "normal" Class::Std based objects, the classes of the
|
||||||
|
SOAP::WSDL::XSD::Typelib:: hierarchy (and all type and element classes
|
||||||
|
generated by SOAP::WSDL) override Class::Std's constructor for performance
|
||||||
|
reasons.
|
||||||
|
|
||||||
|
If you inherit from such a class and place a START or BUILD method in it,
|
||||||
|
it will not get called - at least not unless you place something like this
|
||||||
|
at the top of you code:
|
||||||
|
|
||||||
|
use Class::Std::Storable;
|
||||||
|
|
||||||
|
In this case, Class::Std::Storable will export a new() method into your class,
|
||||||
|
which in turn calls START and BUILD.
|
||||||
|
|
||||||
|
The constructors of all SOAP::WSDL::XSD::Typelib:: classes don't !
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 BUGS AND LIMITATIONS
|
||||||
|
|
||||||
|
The following XML Schema declaration elements are not supported yet:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * Declaration elements
|
||||||
|
|
||||||
|
attribute
|
||||||
|
notation
|
||||||
|
|
||||||
|
=item * Type definition elements
|
||||||
|
|
||||||
|
simpleContent
|
||||||
|
union
|
||||||
|
|
||||||
|
=item * Content model definition elements
|
||||||
|
|
||||||
|
any
|
||||||
|
anyAttribute
|
||||||
|
attributeGroup
|
||||||
|
group
|
||||||
|
|
||||||
|
=item * Identity definition elements
|
||||||
|
|
||||||
|
field
|
||||||
|
key
|
||||||
|
keyref
|
||||||
|
selector
|
||||||
|
unique
|
||||||
|
|
||||||
|
=item * Inclusion elements
|
||||||
|
|
||||||
|
import
|
||||||
|
include
|
||||||
|
redefine
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
The following XML Schema declaration elements are supported, but have no
|
||||||
|
effect yet:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * Factes
|
||||||
|
|
||||||
|
enumeration
|
||||||
|
fractionDigits
|
||||||
|
lenght
|
||||||
|
maxExclusive
|
||||||
|
maxInclusiove
|
||||||
|
maxLength
|
||||||
|
minExclusive
|
||||||
|
minInclusive
|
||||||
|
minLength
|
||||||
|
pattern
|
||||||
|
totalDigits
|
||||||
|
whitespace
|
||||||
|
|
||||||
|
=item * Documentation elements
|
||||||
|
|
||||||
|
appinfo
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 LICENSE
|
||||||
|
|
||||||
|
Copyright 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: 390 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: Client.pm 390 2007-11-16 22:18:32Z kutterma $
|
||||||
|
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.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