Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f63138fc87 | ||
|
|
fd0854e34a | ||
|
|
c2da74b5ae | ||
|
|
7ba1959888 |
@@ -1,43 +1,41 @@
|
|||||||
use Module::Build;
|
use Module::Build;
|
||||||
Module::Build->new(
|
|
||||||
# create_makefile_pl => 'traditional',
|
Module::Build->new(
|
||||||
dist_abstract => 'SOAP with WSDL support',
|
create_makefile_pl => 'passthrough',
|
||||||
dist_name => 'SOAP-WSDL',
|
dist_abstract => 'SOAP with WSDL support',
|
||||||
dist_version => '2.00_09',
|
dist_name => 'SOAP-WSDL',
|
||||||
module_name => 'SOAP::WSDL',
|
dist_version => '2.00_13',
|
||||||
license => 'artistic',
|
module_name => 'SOAP::WSDL',
|
||||||
requires => {
|
license => 'artistic',
|
||||||
'Class::Std' => q/v0.0.8/,
|
requires => {
|
||||||
'Class::Std::Storable' => 0,
|
'Class::Std' => q/v0.0.8/,
|
||||||
'Date::Parse' => 0,
|
'Class::Std::Storable' => 0,
|
||||||
'Date::Format' => 0,
|
'Date::Parse' => 0,
|
||||||
'LWP::UserAgent' => 0,
|
'Date::Format' => 0,
|
||||||
'List::Util' => 0,
|
'LWP::UserAgent' => 0,
|
||||||
'File::Basename' => 0,
|
'List::Util' => 0,
|
||||||
'File::Path' => 0,
|
'File::Basename' => 0,
|
||||||
'XML::LibXML' => 0,
|
'File::Path' => 0,
|
||||||
'XML::SAX::Base' => 0,
|
'XML::Parser::Expat' => 0,
|
||||||
'XML::SAX::ParserFactory' => 0,
|
'Template' => 0,
|
||||||
'XML::Parser::Expat' => 0,
|
'Getopt::Long' => 0,
|
||||||
},
|
},
|
||||||
buildrequires => {
|
buildrequires => {
|
||||||
'Date::Parse' => 0,
|
'Date::Parse' => 0,
|
||||||
'Date::Format' => 0,
|
'Date::Format' => 0,
|
||||||
'Benchmark' => 0,
|
'Test::More' => 0,
|
||||||
'Cwd' => 0,
|
'Class::Std' => q/v0.0.8/,
|
||||||
'Test::More' => 0,
|
'Class::Std::Storable' => 0,
|
||||||
'Class::Std' => 0.0.8,
|
'List::Util' => 0,
|
||||||
'Class::Std::Storable' => 0,
|
'LWP::UserAgent' => 0,
|
||||||
'List::Util' => 0,
|
'File::Basename' => 0,
|
||||||
'LWP::UserAgent' => 0,
|
'File::Path' => 0,
|
||||||
'File::Basename' => 0,
|
'XML::Parser::Expat' => 0,
|
||||||
'File::Path' => 0,
|
'Template' => 0,
|
||||||
'XML::Simple' => 0,
|
'Getopt::Long' => 0,
|
||||||
'XML::LibXML' => 0,
|
'Cwd' => 0,
|
||||||
'XML::Parser::Expat' => 0,
|
'File::Find' => 0,
|
||||||
'XML::SAX::Base' => 0,
|
'Storable' => 0,
|
||||||
'XML::SAX::ParserFactory' => 0,
|
},
|
||||||
'Pod::Simple::Text' => 0,
|
recursive_test_files => 1,
|
||||||
},
|
)->create_build_script;
|
||||||
recursive_test_files => 1,
|
|
||||||
)->create_build_script;
|
|
||||||
|
|||||||
@@ -1,590 +1,172 @@
|
|||||||
------------------------------------------------------------------------
|
Release notes for SOAP::WSDL 2.00_12
|
||||||
r131 | kutterma | 2007-08-12 14:18:59 +0200 (So, 12 Aug 2007) | 3 lines
|
-------
|
||||||
|
|
||||||
- fixed documentation for generated code with element ref="" declarations
|
I'm very happy to present a new pre-release version of SOAP::WSDL.
|
||||||
- fixed element ref="" test for generated code
|
|
||||||
- added (generated) Makefile.PL to make CPAN testers happy
|
SOAP::WSDL is a toolkit for creating SOAP interfaces in perl.
|
||||||
------------------------------------------------------------------------
|
|
||||||
r130 | kutterma | 2007-08-10 15:57:12 +0200 (Fr, 10 Aug 2007) | 1 line
|
Features:
|
||||||
|
|
||||||
- first try at truely callback-based parser (inspired by XML::Compile)
|
* WSDL based SOAP client
|
||||||
------------------------------------------------------------------------
|
o SOAP1.1 support
|
||||||
r129 | kutterma | 2007-08-07 17:53:40 +0200 (Di, 07 Aug 2007) | 1 line
|
o Supports document/literal message style/encoding
|
||||||
|
* Code generator for generating WSDL-based interface classes
|
||||||
- moved duplicate sub generation out of loop
|
o Generated code includes usage documentation for the web service interface
|
||||||
------------------------------------------------------------------------
|
* Easy-to use API. SOAP::WSDL is much easier to use than SOAP::Lite.
|
||||||
r128 | kutterma | 2007-08-07 14:16:28 +0200 (Di, 07 Aug 2007) | 1 line
|
o Automatically encodes perl data structures as message data
|
||||||
|
o Automatically sets HTTP headers right
|
||||||
- bool now returns numerical value in bool context, not "true" or "false" (always true...)
|
* SOAP::Lite like look and feel.
|
||||||
------------------------------------------------------------------------
|
o Where possible, SOAP::WSDL mimics SOAP::Lite's API to allow easy migrations
|
||||||
r127 | kutterma | 2007-08-07 11:45:23 +0200 (Di, 07 Aug 2007) | 1 line
|
* XML schema based class library for creating data objects
|
||||||
|
* High-performance XML parser
|
||||||
- fixed test to be timezone sensitive
|
* Plugin support. SOAP::WSDL can be extended through plugins in various aspects.
|
||||||
------------------------------------------------------------------------
|
The following plugins are supported:
|
||||||
r126 | kutterma | 2007-08-07 11:09:51 +0200 (Di, 07 Aug 2007) | 1 line
|
o Transport plugins via SOAP::WSDL::Factory::Transport
|
||||||
|
o Serializer plugins via SOAP::WSDL::Factory::Serializer
|
||||||
- made test timezone-sensitive
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r125 | kutterma | 2007-08-07 11:09:16 +0200 (Di, 07 Aug 2007) | 1 line
|
The following changes have been made:
|
||||||
|
2.00_13
|
||||||
- made test timezone-sensitive
|
----
|
||||||
------------------------------------------------------------------------
|
The following features were added (the numbers in square brackets are the
|
||||||
r124 | kutterma | 2007-08-06 18:05:02 +0200 (Mo, 06 Aug 2007) | 2 lines
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||||
|
* [ 1790619 ] Test transport backend
|
||||||
- fixed element ref handling in code generator in ComplexType.
|
A test transport backend has been implemented (SOAP::WSDL::Transport::Test).
|
||||||
- top-level element ref still not supported/tested
|
It returns the contents from a file and discards the response.
|
||||||
------------------------------------------------------------------------
|
The filename is determined from the soap_action field.
|
||||||
r123 | kutterma | 2007-08-06 17:48:57 +0200 (Mo, 06 Aug 2007) | 1 line
|
|
||||||
|
* [ 1785196 ] Replace outputsom(1) by deserializer plugin
|
||||||
- test now dies and outputs code to eval on eval errors
|
outputsom(1) in SOAP::WSDL is now implemented via using the deserializer
|
||||||
------------------------------------------------------------------------
|
plugin SOAP::WSDL::Deserializer::SOM.
|
||||||
r122 | kutterma | 2007-08-06 17:29:46 +0200 (Mo, 06 Aug 2007) | 1 line
|
|
||||||
|
* [1785195] Support deserializer plugins
|
||||||
- fixed element ref="" handling in complexType
|
Deserializer plugin API added via SOAP::WSDL::Factory::Deserializer.
|
||||||
------------------------------------------------------------------------
|
|
||||||
r121 | kutterma | 2007-08-06 17:29:14 +0200 (Mo, 06 Aug 2007) | 1 line
|
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):
|
||||||
- added test data for element ref inside complexType
|
|
||||||
------------------------------------------------------------------------
|
* [1789581] Support ComplexType mixed
|
||||||
r120 | kutterma | 2007-08-06 17:28:54 +0200 (Mo, 06 Aug 2007) | 1 line
|
WSDL parser now supports using the mixed="true" attribute in complexType
|
||||||
|
definitions. Mixed content in messages is only supported via SOAP::SOM yet.
|
||||||
- added test for element ref inside complexType
|
|
||||||
------------------------------------------------------------------------
|
* [1787975] 016_client_object.t fails due to testing XML as string
|
||||||
r119 | kutterma | 2007-08-06 17:13:03 +0200 (Mo, 06 Aug 2007) | 1 line
|
Removed string test.
|
||||||
|
|
||||||
- fixed element ref handling
|
* [1787959] Test wsdl seems to be broken
|
||||||
------------------------------------------------------------------------
|
Corrected typo.
|
||||||
r118 | kutterma | 2007-08-06 17:12:47 +0200 (Mo, 06 Aug 2007) | 1 line
|
|
||||||
|
* [1787955] ::XSD::Typelib::date is broken
|
||||||
- added element ref test data
|
SOAP::WSDL::XSD::Typelib::Builtin::date now converts time-zoned dates properly,
|
||||||
------------------------------------------------------------------------
|
and adds the local time zone if none is given.
|
||||||
r117 | kutterma | 2007-08-06 17:12:36 +0200 (Mo, 06 Aug 2007) | 1 line
|
|
||||||
|
* [1785646] SOAPAction header not set from soap:operation soapAction
|
||||||
- added element ref test
|
SOAP::WSDL now sets the SOAPAction header correctly.
|
||||||
------------------------------------------------------------------------
|
|
||||||
r116 | kutterma | 2007-08-06 15:47:30 +0200 (Mo, 06 Aug 2007) | 1 line
|
The following uncategorized improvements have been mad:
|
||||||
|
|
||||||
- refined docs
|
* Documentation improvements
|
||||||
------------------------------------------------------------------------
|
|
||||||
r115 | kutterma | 2007-08-06 15:39:39 +0200 (Mo, 06 Aug 2007) | 1 line
|
2.00_12
|
||||||
|
----
|
||||||
- updated docs. Hope the CPAN indexer ignores "=for developers"...
|
|
||||||
------------------------------------------------------------------------
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
r114 | kutterma | 2007-08-06 14:12:28 +0200 (Mo, 06 Aug 2007) | 1 line
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
|
|
||||||
- removed annoying pod
|
* [1787146] SOAP::WSDL still uses XML::LibXML
|
||||||
------------------------------------------------------------------------
|
The superficious usage of XML::LibXML has been removed. XML::LibXML with
|
||||||
r113 | kutterma | 2007-08-05 18:42:09 +0200 (So, 05 Aug 2007) | 5 lines
|
sax filter has been replaced by SOAP::WSDL::Expat::WSDLParser.
|
||||||
|
|
||||||
- removed SOAP::Lite dependency
|
* [1787054] Test suite requires XML::LibXML in 2.00_11
|
||||||
- updated docs
|
The test suite no longer requires XML::LibXML to pass.
|
||||||
- changed SOAP::WSDL::XSD::Typelib::ComplexType to require the actuall class for element data, not just the base class (good for finding errors earlier)
|
|
||||||
- implemented returning SOAP::SOM objects in SOAP::WSDL
|
* [1785678] SOAP envelope not checked for namespace
|
||||||
- added SOAP::WSDL example(weather_wsdl.pl)
|
The SOAP envelope is now checked for the correct namespace.
|
||||||
------------------------------------------------------------------------
|
|
||||||
r112 | kutterma | 2007-08-03 16:12:57 +0200 (Fr, 03 Aug 2007) | 1 line
|
* [1786644] SOAP::WSDL::Manual - doc error
|
||||||
|
Documentation improvements
|
||||||
updated docs
|
|
||||||
------------------------------------------------------------------------
|
The following uncategorized improvements have been made
|
||||||
r111 | kutterma | 2007-08-03 16:12:04 +0200 (Fr, 03 Aug 2007) | 1 line
|
|
||||||
|
* The SOAPAction header is now alway quoted (R1109 in WS-I BP 1.0).
|
||||||
- added "skip"
|
|
||||||
------------------------------------------------------------------------
|
2.00_11
|
||||||
r110 | kutterma | 2007-07-31 22:27:25 +0200 (Di, 31 Jul 2007) | 2 lines
|
----
|
||||||
|
|
||||||
- further work on removing SOAP::Lite dependency
|
The following features were added (the numbers in square brackets are the
|
||||||
- Note: SOAP::WSDL may be broken !
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
|
||||||
------------------------------------------------------------------------
|
|
||||||
r109 | kutterma | 2007-07-31 21:10:40 +0200 (Di, 31 Jul 2007) | 3 lines
|
* [1767963] Transport plugins via SOAP::WSDL::Factory::Transport.
|
||||||
|
SOAP::WSDL uses SOAP::Lite's tranport modules as default, with a
|
||||||
- finished move from XSD::Primitive to Builtin
|
lightweight HTTP(S) transport plugin as fallback.
|
||||||
- fixed a few tests
|
Custom transport modules can be registered via SOAP::WSDL::Factory::Transport.
|
||||||
- removed typo namespace from TypeLookupt
|
|
||||||
------------------------------------------------------------------------
|
* [ 1772730 ] Serializer plugins via SOAP::WSDL::Factory::Serializer
|
||||||
r108 | kutterma | 2007-07-31 21:02:43 +0200 (Di, 31 Jul 2007) | 1 line
|
The default serializer for SOAP1.1 is SOAP::WSDL::Serializer::SOAP11.
|
||||||
|
Custom serializers classes can be registered via
|
||||||
- removed unneeded example stuff
|
SOAP::WSDL::Factory::Serializer or set via SOAP::WSDL's set_serializer
|
||||||
------------------------------------------------------------------------
|
method.
|
||||||
r107 | kutterma | 2007-07-31 20:32:43 +0200 (Di, 31 Jul 2007) | 1 line
|
|
||||||
|
The following bugs have been fixed (the numbers in square brackets are the
|
||||||
- rename to Builtin
|
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
|
||||||
------------------------------------------------------------------------
|
|
||||||
r106 | kutterma | 2007-07-31 20:32:11 +0200 (Di, 31 Jul 2007) | 1 line
|
* [ 1764854 ] Port WSDL parser to expat and remove XML::LibXML dependency
|
||||||
|
SOAP::WSDL now requires only XML::Parser to be installed.
|
||||||
- prepared rename to Builtin
|
XML::LibXML is not required any more, though XML::LibXML based modules still
|
||||||
------------------------------------------------------------------------
|
exist.
|
||||||
r105 | kutterma | 2007-07-31 13:17:52 +0200 (Di, 31 Jul 2007) | 2 lines
|
|
||||||
|
The following uncategorized improvements have been made
|
||||||
- added configurable ContentType / charset
|
|
||||||
- maybe split up charset and content type into two methods ?
|
* The number of dependencies has been reduced. SOAP::WSDL no longer requires the
|
||||||
------------------------------------------------------------------------
|
following modules to be installed:
|
||||||
r104 | kutterma | 2007-07-31 00:16:15 +0200 (Di, 31 Jul 2007) | 3 lines
|
- XML::SAX::Base
|
||||||
|
- XML::SAX::ParserFactory
|
||||||
- removed optional nanoseconds from dateTime conversions
|
- Pod::Simple::Text
|
||||||
- added conversion to date objects
|
- XML::LibXML
|
||||||
- removed fetching WSDL via SOAP::Schema in SOAP::WSDL. SOAP::Lite is still used as base class.
|
|
||||||
------------------------------------------------------------------------
|
* The missing prerequisite Template has been added.
|
||||||
r103 | kutterma | 2007-07-30 13:25:06 +0200 (Mo, 30 Jul 2007) | 1 line
|
* Documentation has been improved:
|
||||||
|
- WS-I Compliance document added.
|
||||||
- updated TODO
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r102 | kutterma | 2007-07-30 13:23:09 +0200 (Mo, 30 Jul 2007) | 2 lines
|
2.00_10
|
||||||
|
----
|
||||||
- updated Build.PL dependencies
|
* Changed Makefile.PL to use Module::Build (passthrough mode)
|
||||||
- update TODO
|
* fixed element ref="" handling
|
||||||
------------------------------------------------------------------------
|
|
||||||
r101 | kutterma | 2007-07-30 13:22:05 +0200 (Mo, 30 Jul 2007) | 2 lines
|
2.00_09
|
||||||
|
----
|
||||||
- added dateTime test
|
* SOAP::WSDL::XSD::Typelib::Builtin::boolean objects now return their numerical
|
||||||
- fixed pod test
|
value in bool context, not "true" or "false" (always true...)
|
||||||
------------------------------------------------------------------------
|
* date/time test are now timezone-sensitive
|
||||||
r100 | kutterma | 2007-07-27 16:03:15 +0200 (Fr, 27 Jul 2007) | 2 lines
|
* examples added
|
||||||
|
|
||||||
- allow passing list refs of hash refs to set_value.
|
2.00_08
|
||||||
I hope I got all combinations by now - start getting ugly...
|
---
|
||||||
------------------------------------------------------------------------
|
* SOAP::WSDL::XSD::Typelib::ComplexType objects now check the class of their
|
||||||
r99 | kutterma | 2007-07-26 23:18:35 +0200 (Do, 26 Jul 2007) | 1 line
|
child objects.
|
||||||
|
This provides early feedback to developers.
|
||||||
- added SOAP::Lite usage (to be removed later)
|
* SOAP message parser can skip unwanted parts of the message to improve parsing
|
||||||
------------------------------------------------------------------------
|
speed - see SOAP::WSDL::Expat::MessageParser for details.
|
||||||
r98 | kutterma | 2007-07-26 23:16:30 +0200 (Do, 26 Jul 2007) | 3 lines
|
* HTTP Content-Type is configurable
|
||||||
|
* SOAP::WSDL::XSD::Typelib::ComplexType based objects accept any combination of
|
||||||
- removed SOAP::Lite dependency
|
hash refs, list refs and objects as parameter to set_value() and new().
|
||||||
- added set_trace and tracing facility support via callback in call()
|
* SOAP::WSDL::XSD::Typelib::Builtin::dateTime and ::date convert date
|
||||||
- added fault_class property to allow different Fault classes (somewhen later on)
|
strings into XML date strings
|
||||||
------------------------------------------------------------------------
|
* SOAP::WSDL::Definitions::create now
|
||||||
r97 | kutterma | 2007-07-25 16:59:49 +0200 (Mi, 25 Jul 2007) | 3 lines
|
- converts '.' in service names to '::' (.NET class separator to perl class
|
||||||
|
separator)
|
||||||
- dateTime now converts date strings into XML date strings
|
- outputs Typemaps and Interface classes in UTF8 to allow proper inclusion
|
||||||
- updated docs
|
of UTF8 documentation from WSDL
|
||||||
|
* SOAP::WSDL::Definitions::create() includes doc in generated interface classes
|
||||||
------------------------------------------------------------------------
|
* WSDLHandler now handles <wsdl:documentation> tags
|
||||||
r96 | kutterma | 2007-07-23 11:17:36 +0200 (Mo, 23 Jul 2007) | 3 lines
|
* fixed explain in SimpleType, ComplexType and Element
|
||||||
|
|
||||||
- SOAP::WSDL::Definitions::create now
|
2.00_07 and below
|
||||||
- converts '.' in service names to '::' (.NET class separator to perl class separator)
|
---
|
||||||
- outputs Typemaps and Interface classes in UTF8 to allow proper inclusion of UTF8 documentation from WSDL
|
* Implemented a Code generator for creating SOAP interfaces based on WSDL definitions
|
||||||
------------------------------------------------------------------------
|
* Implemented a high-speed stream based SOAP message parser
|
||||||
r95 | kutterma | 2007-07-23 10:26:59 +0200 (Mo, 23 Jul 2007) | 1 line
|
SOAP message parser returns a objects based on XML schema based class library
|
||||||
|
* Implemented a XML schema based class library
|
||||||
- typo
|
* Implemented a stream based WSDL parser.
|
||||||
------------------------------------------------------------------------
|
Parses WSDL into objects. Objects can serialize data, and explain how to use the
|
||||||
r94 | kutterma | 2007-07-23 10:11:46 +0200 (Mo, 23 Jul 2007) | 1 line
|
service(s) they make up (output documentation).
|
||||||
|
|
||||||
- typo
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r93 | kutterma | 2007-07-22 23:24:12 +0200 (So, 22 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
updated TODO
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r92 | kutterma | 2007-07-22 23:19:15 +0200 (So, 22 Jul 2007) | 3 lines
|
|
||||||
|
|
||||||
- WSDLHandler now handles <wsdl:documentation> tags
|
|
||||||
- SOAP::WSDL::Definitions now includes some usable doc in generated interface classes
|
|
||||||
- fixed explain in SimpleType, ComplexType and Element (someway)
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r91 | kutterma | 2007-07-22 21:18:21 +0200 (So, 22 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
- updated docs
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r90 | kutterma | 2007-07-22 15:42:23 +0200 (So, 22 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
- updated docs
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r89 | kutterma | 2007-07-22 15:38:25 +0200 (So, 22 Jul 2007) | 2 lines
|
|
||||||
|
|
||||||
- updated docs
|
|
||||||
- removed useless docs from "internally used only" - modules
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r88 | kutterma | 2007-07-22 09:17:57 +0200 (So, 22 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
typo
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r87 | kutterma | 2007-07-21 23:57:46 +0200 (Sa, 21 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
- updated docs
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r86 | kutterma | 2007-07-21 23:24:24 +0200 (Sa, 21 Jul 2007) | 5 lines
|
|
||||||
|
|
||||||
- removed irritating pod from SOAP::WSDL::XSD::Typelib::Builtin::* classes and put int into SOAP::WSDL::XSD::Typelib::Builtin
|
|
||||||
- added fast constructor creation BEGIN block to all SOAP::WSDL::XSD::Typelib::Builtin::* classes
|
|
||||||
- added examples
|
|
||||||
- updated docs
|
|
||||||
- prepared 2.00_07 pre-release
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r85 | kutterma | 2007-07-21 18:12:49 +0200 (Sa, 21 Jul 2007) | 4 lines
|
|
||||||
|
|
||||||
- added wsdl2perl code generation script - works against FortuneCookie web service at fullerdata.com
|
|
||||||
- fixed SOAP::WSDL::Client::Base to work as base class for generated classes
|
|
||||||
- added interface generation facility to SOAP::WSDL::Definitions
|
|
||||||
- updated docs (a few)
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r84 | kutterma | 2007-07-20 15:37:40 +0200 (Fr, 20 Jul 2007) | 9 lines
|
|
||||||
|
|
||||||
- added Expat-based parser
|
|
||||||
- made Expat-based parser the default
|
|
||||||
- added fast "new" method to most important "Builtin" types
|
|
||||||
- added Parser POD
|
|
||||||
- fixed propagating element names in complex types to element elements - element ref="element" should work on
|
|
||||||
class level now (don't know whether typelib supports it yet)
|
|
||||||
- updated tests
|
|
||||||
- updated HACKING
|
|
||||||
- prepared 2.00_06 release
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r83 | kutterma | 2007-07-19 13:09:33 +0200 (Do, 19 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
- fixed element class generation (removed additional ::)
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r82 | kutterma | 2007-07-17 22:17:02 +0200 (Di, 17 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
- updated README and HACKING
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r81 | kutterma | 2007-07-17 22:00:14 +0200 (Di, 17 Jul 2007) | 5 lines
|
|
||||||
|
|
||||||
- added parent ref in SOAP::WSDL::Base - now we have a real tree, and maybe can completely support namespaces some day
|
|
||||||
- replaced grep by List::Util::first where appropriate
|
|
||||||
- code cleanup
|
|
||||||
- fixed test for Code Generation
|
|
||||||
- updated a few tests
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r80 | kutterma | 2007-07-17 17:00:48 +0200 (Di, 17 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
- improved pod in generated classes
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r79 | kutterma | 2007-07-17 14:41:44 +0200 (Di, 17 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
- made explain look nicer
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r78 | kutterma | 2007-07-15 12:25:03 +0200 (So, 15 Jul 2007) | 7 lines
|
|
||||||
|
|
||||||
- SOAP::WSDL::Definitions can now generate
|
|
||||||
- Typemaps
|
|
||||||
- Type and Element classes
|
|
||||||
- fixed SOAP::WSDL::XSD::Typelib::ComplexType to support elements with type="ComplexType" definitions
|
|
||||||
- moved toClass method in SOAP::WSDL::XSD::ComplexType, Element and SimpleType to to_class and added compatibility wrapper with warning for toClass calls
|
|
||||||
- added generator test
|
|
||||||
- updated docs
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r77 | kutterma | 2007-07-14 10:46:54 +0200 (Sa, 14 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
- started working on high-level code generator
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r76 | kutterma | 2007-07-13 09:21:33 +0200 (Fr, 13 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
- fixed handling of complex data (hashes with lists embedded lists of objects)
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r75 | kutterma | 2007-07-10 12:08:39 +0200 (Di, 10 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
- removed unneeded SOAP::Lite calls
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r74 | kutterma | 2007-07-10 12:08:10 +0200 (Di, 10 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
- updated to new SOAP::Lite API
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r73 | kutterma | 2007-07-10 12:00:25 +0200 (Di, 10 Jul 2007) | 6 lines
|
|
||||||
|
|
||||||
- re-integrated old SOAP::WSDL tests
|
|
||||||
- updated docs
|
|
||||||
- SOAP::WSDL::XSD::Typelib::Builtin::string now escapes XML builtin entities on serialization
|
|
||||||
- SOAP::WSDL::XSD::Element now supports generating classes for elements and types into different namespaces
|
|
||||||
- SOAP::WSDL::Definitions now supports different namespaces for elements and types when generating typmaps
|
|
||||||
- 2.00_05 release preparation
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r72 | kutterma | 2007-07-06 11:20:56 +0200 (Fr, 06 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
- fixed detail (typo)
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r71 | kutterma | 2007-07-05 16:13:28 +0200 (Do, 05 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
- TODO comments added
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r70 | kutterma | 2007-07-04 16:14:50 +0200 (Mi, 04 Jul 2007) | 2 lines
|
|
||||||
|
|
||||||
- updated docs
|
|
||||||
- prepared 2.00_04 release
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r69 | kutterma | 2007-07-04 16:07:54 +0200 (Mi, 04 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
- ComplexType now ignores xmlns - TODO: check xmlns, don't ignore...
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r68 | kutterma | 2007-07-04 11:25:31 +0200 (Mi, 04 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
- made builtin types with overloads serializable
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r67 | kutterma | 2007-07-04 09:51:06 +0200 (Mi, 04 Jul 2007) | 4 lines
|
|
||||||
|
|
||||||
- updated docs
|
|
||||||
- removed unneeded uses from test
|
|
||||||
- added Build requirements from tests
|
|
||||||
- prepared 2.00_03 release
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r66 | kutterma | 2007-07-04 00:06:29 +0200 (Mi, 04 Jul 2007) | 3 lines
|
|
||||||
|
|
||||||
- split up builtin type lib into single files for Class::Std::Storable
|
|
||||||
- fixed more tests
|
|
||||||
- fixed complexType serialization for non-objecs
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r65 | kutterma | 2007-07-03 16:52:54 +0200 (Di, 03 Jul 2007) | 2 lines
|
|
||||||
|
|
||||||
- fixed a few tests
|
|
||||||
- added performance improvements
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r64 | kutterma | 2007-07-03 15:09:27 +0200 (Di, 03 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
- small performance improvements
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r63 | kutterma | 2007-07-03 14:37:28 +0200 (Di, 03 Jul 2007) | 3 lines
|
|
||||||
|
|
||||||
- fixed serializing complextypes correctly
|
|
||||||
- fixed handling has attribute refs in new
|
|
||||||
- fixed performance problems in MessageHandler
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r62 | kutterma | 2007-07-03 14:37:14 +0200 (Di, 03 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
- re-added
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r61 | kutterma | 2007-07-03 14:36:59 +0200 (Di, 03 Jul 2007) | 1 line
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r60 | kutterma | 2007-07-01 09:52:41 +0200 (So, 01 Jul 2007) | 2 lines
|
|
||||||
|
|
||||||
- fixed lots of tests
|
|
||||||
- attic tests may be re-integrated now...
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r59 | kutterma | 2007-06-28 13:07:35 +0200 (Do, 28 Jun 2007) | 1 line
|
|
||||||
|
|
||||||
- added ignore for dist tar.gz
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r58 | kutterma | 2007-06-28 13:06:25 +0200 (Do, 28 Jun 2007) | 1 line
|
|
||||||
|
|
||||||
- updated buildrequires
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r57 | kutterma | 2007-06-28 13:05:03 +0200 (Do, 28 Jun 2007) | 1 line
|
|
||||||
|
|
||||||
- typo
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r56 | kutterma | 2007-06-28 11:15:24 +0200 (Do, 28 Jun 2007) | 1 line
|
|
||||||
|
|
||||||
- pre-release 2.00_01
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r55 | kutterma | 2007-06-28 10:23:20 +0200 (Do, 28 Jun 2007) | 1 line
|
|
||||||
|
|
||||||
- moved old tests to attic
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r54 | kutterma | 2007-06-28 10:15:41 +0200 (Do, 28 Jun 2007) | 1 line
|
|
||||||
|
|
||||||
- fixed a few typos
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r53 | kutterma | 2007-06-28 10:10:41 +0200 (Do, 28 Jun 2007) | 3 lines
|
|
||||||
|
|
||||||
- fixed MessageHandler to support deserializing into objects which return false in boolean context
|
|
||||||
- updated docs
|
|
||||||
- fixed Fault11 (named detail correctly)
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r52 | kutterma | 2007-06-27 17:36:01 +0200 (Mi, 27 Jun 2007) | 3 lines
|
|
||||||
|
|
||||||
- added Fault for SOAP 1.1 implementation
|
|
||||||
- fixed ComplexType - though it doesn't work quite for faults yet...
|
|
||||||
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r51 | kutterma | 2007-06-27 13:27:59 +0200 (Mi, 27 Jun 2007) | 13 lines
|
|
||||||
|
|
||||||
- added test for sending objects via call()
|
|
||||||
- modified Client to accept objects of type SOAP::WSDL::XSD::Typelib::Builtin::anyType as message content
|
|
||||||
without checking the WSDL objects
|
|
||||||
Note:
|
|
||||||
- SOAPAction is just guessed - needs to be replaced by something better
|
|
||||||
- The method should be looked up from the typelib, too, and serialized according to the rules specified in the WSDL
|
|
||||||
and dumped into the typelib.
|
|
||||||
|
|
||||||
- updated to_typelib to include top element
|
|
||||||
- fixed element and complextype templates for toClass
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r50 | kutterma | 2007-06-27 00:01:32 +0200 (Mi, 27 Jun 2007) | 1 line
|
|
||||||
|
|
||||||
- added xsi xmlns to envelope
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r49 | kutterma | 2007-06-26 23:52:18 +0200 (Di, 26 Jun 2007) | 1 line
|
|
||||||
|
|
||||||
- cosmetics and a few doc updates
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r48 | kutterma | 2007-06-26 22:47:52 +0200 (Di, 26 Jun 2007) | 2 lines
|
|
||||||
|
|
||||||
- refactored element serializing to make it somewhat more consistent
|
|
||||||
- added nillable implementation for Elements
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r47 | kutterma | 2007-06-26 18:06:59 +0200 (Di, 26 Jun 2007) | 1 line
|
|
||||||
|
|
||||||
- removed shebang
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r46 | kutterma | 2007-06-26 18:06:33 +0200 (Di, 26 Jun 2007) | 1 line
|
|
||||||
|
|
||||||
- added warnings
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r45 | kutterma | 2007-06-26 17:39:09 +0200 (Di, 26 Jun 2007) | 3 lines
|
|
||||||
|
|
||||||
- got toClass working for generating WSDL based type libraries.
|
|
||||||
- changed typelib base class behavior to qualify first element called.
|
|
||||||
TODO (a bigger one): Fully support namespaces...
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r44 | kutterma | 2007-06-26 12:10:33 +0200 (Di, 26 Jun 2007) | 14 lines
|
|
||||||
|
|
||||||
- changed Typelib::Element to work as attribute of a type (serialize serializes start_tag and end_tag provided by Typelib::Element around it's vontent, if present)
|
|
||||||
- worked on toClass functionality with embedded templates.
|
|
||||||
There's much to do - current impl should support:
|
|
||||||
* <element name="name" type="type"
|
|
||||||
* <element name="name"><simpleType>
|
|
||||||
* <element name="name"><complexType>
|
|
||||||
|
|
||||||
* <simpleType ...><list>
|
|
||||||
* <simpleType ...><restriction>
|
|
||||||
|
|
||||||
* <complexType ...><all>
|
|
||||||
* <complexType ...><sequence>
|
|
||||||
|
|
||||||
All other variants are not completely supported yet.
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r43 | kutterma | 2007-06-25 18:58:56 +0200 (Mo, 25 Jun 2007) | 1 line
|
|
||||||
|
|
||||||
- broke element again...
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r42 | kutterma | 2007-06-25 17:30:34 +0200 (Mo, 25 Jun 2007) | 3 lines
|
|
||||||
|
|
||||||
- fixed to_typemap to report atomic simple and complex types correctly
|
|
||||||
- update tests
|
|
||||||
- renamed WSDLFilter to WSDLHandler
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r41 | kutterma | 2007-06-25 17:29:41 +0200 (Mo, 25 Jun 2007) | 1 line
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r40 | kutterma | 2007-06-25 14:15:40 +0200 (Mo, 25 Jun 2007) | 2 lines
|
|
||||||
|
|
||||||
- Client.pm now uses XML::LibXML as default and falls back on XML::SAX::ParserFactory if not present
|
|
||||||
- fixed tests
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r39 | kutterma | 2007-06-25 14:07:28 +0200 (Mo, 25 Jun 2007) | 2 lines
|
|
||||||
|
|
||||||
- typo in Element
|
|
||||||
- fixed tests
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r38 | kutterma | 2007-06-25 10:31:20 +0200 (Mo, 25 Jun 2007) | 2 lines
|
|
||||||
|
|
||||||
- made WSDLFilter.pm a inside out class and let it run without XML::SAX::Base (This probably breaks a lot of tests - we need to implement XML::LibXML semantics in all tests / classes which use it)
|
|
||||||
- first swag at to_typemap Typemap generation. to_typemap implemented throughout the WSDL:: modules. Some implementations (Elenenet.pm, ComplexType.pm) need further work for correctly handling atomic simpleType / complexType definitions.
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r37 | kutterma | 2007-06-24 09:15:22 +0200 (So, 24 Jun 2007) | 3 lines
|
|
||||||
|
|
||||||
- added test for on-the-fly created ComplexType
|
|
||||||
- fixed ComplexType factory to really work
|
|
||||||
- startet working on Element facets
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r36 | kutterma | 2007-06-24 09:14:46 +0200 (So, 24 Jun 2007) | 2 lines
|
|
||||||
|
|
||||||
- added test for on-the-fly created ComplexType
|
|
||||||
- startet working on Element facets
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r35 | kutterma | 2007-06-24 08:13:32 +0200 (So, 24 Jun 2007) | 1 line
|
|
||||||
|
|
||||||
- implemented ComplexType as class factory to get rid of the annoying START every subclass had to implement.
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r34 | kutterma | 2007-06-23 23:22:35 +0200 (Sa, 23 Jun 2007) | 2 lines
|
|
||||||
|
|
||||||
- added XSD Typelib SimpleType, Element and ComplexType base classes (stereotypes).
|
|
||||||
ComplexType's not yet complete (no restriction / extension etc. handling).
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r33 | kutterma | 2007-06-23 11:04:56 +0200 (Sa, 23 Jun 2007) | 2 lines
|
|
||||||
|
|
||||||
- added SOAP::WSDL::XSD::Typelib::Builtin implementation of builtin XML Schema datatypes with built-in stringification, boolification and numerification.
|
|
||||||
- SAX::MessageHandler now deserializes simple types in SOAP messages into SOAP::WSDL::XSD::Typelib::Builtin (provided these are named in the ClassResolver...)
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r32 | kutterma | 2007-06-23 02:14:16 +0200 (Sa, 23 Jun 2007) | 4 lines
|
|
||||||
|
|
||||||
- added pod
|
|
||||||
- added ref handling for elements
|
|
||||||
- added abstract handling for elements (easy...)
|
|
||||||
- added storing of content model (simpleContent/complexContent) to simpleType and complexType, though the attribute is still ignored in serializing
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r31 | kutterma | 2007-06-23 00:37:18 +0200 (Sa, 23 Jun 2007) | 1 line
|
|
||||||
|
|
||||||
- renamed MessageFilter to MessageHandler
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r30 | kutterma | 2007-06-23 00:35:54 +0200 (Sa, 23 Jun 2007) | 1 line
|
|
||||||
|
|
||||||
- renamed MessageFilter to MessageHandler
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r29 | kutterma | 2007-06-23 00:35:16 +0200 (Sa, 23 Jun 2007) | 2 lines
|
|
||||||
|
|
||||||
- switched to Class::Std::Storable
|
|
||||||
- renamed MessageFilter to MessageHandler
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r28 | kutterma | 2007-06-22 18:56:28 +0200 (Fr, 22 Jun 2007) | 3 lines
|
|
||||||
|
|
||||||
- optimised SOAP::WSDL::SAX::MessageFilter for performance
|
|
||||||
- moved Typelob into own directory and load it dynamically from test script
|
|
||||||
- added some pod
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r27 | kutterma | 2007-06-22 15:34:28 +0200 (Fr, 22 Jun 2007) | 5 lines
|
|
||||||
|
|
||||||
- modified SOAP::WSDL::XSD lib to allow serializing of object hierarchies
|
|
||||||
- added SOAP::WSDL::SAX::MessageFilter for creating object hierarchies from SOAP messages
|
|
||||||
- moved Builtin XML Schema types to SOAP::WSDL:XSD::Schema::Builtin
|
|
||||||
- added test + benchmark for serializing /deserializing SOAP messages into object trees
|
|
||||||
- fixed Client to use SOAP::WSDL::Types as typelib, not first SOAP::WSDL::XSD::Schema
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r26 | kutterma | 2007-06-21 23:35:30 +0200 (Do, 21 Jun 2007) | 2 lines
|
|
||||||
|
|
||||||
- first swag at a typed SOAP Message parser.
|
|
||||||
Typelib is still to be implemented...
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r25 | kutterma | 2007-06-21 18:14:49 +0200 (Do, 21 Jun 2007) | 1 line
|
|
||||||
|
|
||||||
- added missing files from last commit
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r24 | kutterma | 2007-06-19 00:29:36 +0200 (Di, 19 Jun 2007) | 3 lines
|
|
||||||
|
|
||||||
- worked a bit on explain
|
|
||||||
- introduced handling of multiple schema definitions in one WSDL file
|
|
||||||
- fixed propagating targetNamespace to child elements in WSDLFilter
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r23 | kutterma | 2007-06-16 14:48:30 +0200 (Sa, 16 Jun 2007) | 1 line
|
|
||||||
|
|
||||||
- updated new SOAP::WSDL framework to use inside out classes based on Class::Std (not yet complete)
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r22 | kutterma | 2007-06-12 23:19:41 +0200 (Di, 12 Jun 2007) | 4 lines
|
|
||||||
|
|
||||||
- updated a few tests
|
|
||||||
- fixed a few WSDLs
|
|
||||||
- fixed handling of elements with minOccurs 0
|
|
||||||
- fixed setting of minOccurs/maxOccurs for all/sequence complexTypes
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r21 | kutterma | 2007-06-08 21:38:41 +0200 (Fr, 08 Jun 2007) | 2 lines
|
|
||||||
|
|
||||||
- updated a few tests
|
|
||||||
- fixed namespaces in tests
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r19 | kutterma | 2007-05-31 16:58:18 +0200 (Do, 31 Mai 2007) | 10 lines
|
|
||||||
|
|
||||||
- first swag at a WSDL-generated Object-tree based SOAP client.
|
|
||||||
|
|
||||||
Works as following:
|
|
||||||
a) a sax filter transforms the sax stream from a wsdl into a perl object tree
|
|
||||||
b) the perl object tree has methods for performing the following tasks:
|
|
||||||
a) explain: Tell what services and methods are there, and how to use them
|
|
||||||
b) serialize: Serialize data structures to the XML defined in the WSDL & schema
|
|
||||||
c) The client uses the generated XML to call the SOAP Server. Unfortunately, SOAP::Lite
|
|
||||||
does not allow custom XML to be rendered as a method's "value", so we have to replace
|
|
||||||
call() completely and generate the envelope on our own (which is not complete yet).
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r9 | kutterma | 2007-05-28 17:08:41 +0200 (Mo, 28 Mai 2007) | 1 line
|
|
||||||
|
|
||||||
- first try at bindings support - see t/12/bindings on how we could find out bindings and portname from a target URL
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
r4 | kutterma | 2007-05-28 15:15:03 +0200 (Mo, 28 Mai 2007) | 1 line
|
|
||||||
|
|
||||||
- move from private repository to sourceforge
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|||||||
@@ -15,31 +15,31 @@ The (my) current roadmap for SOAP::WSDL is:
|
|||||||
|
|
||||||
1.* Development of the 1.* tree has stopped - I won't get past 1.2x anymore...
|
1.* Development of the 1.* tree has stopped - I won't get past 1.2x anymore...
|
||||||
2.* WSDL -> Perl Class factory with offline WSDL processing
|
2.* WSDL -> Perl Class factory with offline WSDL processing
|
||||||
|
|
||||||
2.01
|
2.01
|
||||||
- WSDL support for the most common type definitions
|
- WSDL support for the most common type definitions
|
||||||
- Online-facility (SOAP::WSDL) using WSDL object tree directly
|
- Online-facility (SOAP::WSDL) using WSDL object tree directly
|
||||||
- usable code generator
|
- usable code generator
|
||||||
- full namespace support when processing WSDL
|
- full namespace support when processing WSDL
|
||||||
- high performance when parsing WSDL messages - get nearly as fast as
|
- high performance when parsing WSDL messages - get nearly as fast as
|
||||||
XML::Simple...
|
XML::Simple...
|
||||||
|
|
||||||
2.02
|
2.02
|
||||||
- Support for Apache-SOAP datatypes
|
- Support for Apache-SOAP datatypes
|
||||||
- support for embedded atomic simpleType/complexType definitions
|
- support for embedded atomic simpleType/complexType definitions
|
||||||
- Caching of WSDL object tree + generated code (when using SOAP::WSDL).
|
- Caching of WSDL object tree + generated code (when using SOAP::WSDL).
|
||||||
- Online-facility (SOAP::WSDL) using code generator via cache directory
|
- Online-facility (SOAP::WSDL) using code generator via cache directory
|
||||||
|
|
||||||
Somewhere on the TODO list (in no particular order):
|
Somewhere on the TODO list (in no particular order):
|
||||||
|
|
||||||
- validation
|
- validation
|
||||||
- typemaps for use with the type="tns:MyComplexType" XML attribute
|
- typemaps for use with the type="tns:MyComplexType" XML attribute
|
||||||
- external entities support when parsing WSDL
|
- external entities support when parsing WSDL
|
||||||
- support all these XML Schema variants
|
- support all these XML Schema variants
|
||||||
- support creating XML Schmema definitions via SOAP::WSDL::XSD::* ('minimal conformant')
|
- support creating XML Schmema definitions via SOAP::WSDL::XSD::* ('minimal conformant')
|
||||||
- support other Schema definition languages than XML::Schema (maybe RelaxNG?)
|
- support other Schema definition languages than XML::Schema (maybe RelaxNG?)
|
||||||
- factor out SOAP::WSDL::XSD into it's own namespace (maybe just XSD ?)
|
- factor out SOAP::WSDL::XSD into it's own namespace (maybe just XSD ?)
|
||||||
|
|
||||||
July 2007,
|
July 2007,
|
||||||
|
|
||||||
Martin Kutter
|
Martin Kutter
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
SOAP::WSDL is dual licensed under the same terms as
|
SOAP::WSDL is dual licensed under the same terms as
|
||||||
Perl itself.
|
Perl itself.
|
||||||
|
|
||||||
This means at your choice, either the Perl Artistic License, or
|
This means at your choice, either the Perl Artistic License, or
|
||||||
the GNU GPL version 1 or higher.
|
the GNU GPL version 1 or higher.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,188 +1,214 @@
|
|||||||
bin/wsdl2perl.pl
|
benchmark/01_expat.t
|
||||||
Build.PL
|
benchmark/XSD/01_anyType.t
|
||||||
CHANGES
|
benchmark/XSD/02_anySimpleType.t
|
||||||
example/fortune.pl
|
benchmark/XSD/03_string.t
|
||||||
example/lib/MyElements/CountCookies.pm
|
bin/wsdl2perl.pl
|
||||||
example/lib/MyElements/CountCookiesResponse.pm
|
Build.PL
|
||||||
example/lib/MyElements/GetCitiesByCountry.pm
|
CHANGES
|
||||||
example/lib/MyElements/GetCitiesByCountryResponse.pm
|
example/fortune.pl
|
||||||
example/lib/MyElements/GetFortuneCookie.pm
|
example/lib/MyElements/CountCookies.pm
|
||||||
example/lib/MyElements/GetFortuneCookieResponse.pm
|
example/lib/MyElements/CountCookiesResponse.pm
|
||||||
example/lib/MyElements/GetSpecificCookie.pm
|
example/lib/MyElements/GetCitiesByCountry.pm
|
||||||
example/lib/MyElements/GetSpecificCookieResponse.pm
|
example/lib/MyElements/GetCitiesByCountryResponse.pm
|
||||||
example/lib/MyElements/GetWeather.pm
|
example/lib/MyElements/GetFortuneCookie.pm
|
||||||
example/lib/MyElements/GetWeatherResponse.pm
|
example/lib/MyElements/GetFortuneCookieResponse.pm
|
||||||
example/lib/MyElements/int.pm
|
example/lib/MyElements/GetSpecificCookie.pm
|
||||||
example/lib/MyElements/readNodeCount.pm
|
example/lib/MyElements/GetSpecificCookieResponse.pm
|
||||||
example/lib/MyElements/readNodeCountResponse.pm
|
example/lib/MyElements/GetWeather.pm
|
||||||
example/lib/MyElements/string.pm
|
example/lib/MyElements/GetWeatherResponse.pm
|
||||||
example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie.pm
|
example/lib/MyElements/int.pm
|
||||||
example/lib/MyInterfaces/GlobalWeather.pm
|
example/lib/MyElements/readNodeCount.pm
|
||||||
example/lib/MyTypemaps/FullerData_x0020_Fortune_x0020_Cookie.pm
|
example/lib/MyElements/readNodeCountResponse.pm
|
||||||
example/lib/MyTypemaps/GlobalWeather.pm
|
example/lib/MyElements/string.pm
|
||||||
example/weather.pl
|
example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie.pm
|
||||||
example/weather_wsdl.pl
|
example/lib/MyInterfaces/GlobalWeather.pm
|
||||||
example/wsdl/FortuneCookie.xml
|
example/lib/MyTypemaps/FullerData_x0020_Fortune_x0020_Cookie.pm
|
||||||
example/wsdl/genericbarcode.xml
|
example/lib/MyTypemaps/GlobalWeather.pm
|
||||||
example/wsdl/globalweather.xml
|
example/weather.pl
|
||||||
HACKING
|
example/weather_wsdl.pl
|
||||||
lib/SOAP/WSDL.pm
|
example/wsdl/FortuneCookie.xml
|
||||||
lib/SOAP/WSDL/Base.pm
|
example/wsdl/genericbarcode.xml
|
||||||
lib/SOAP/WSDL/Binding.pm
|
example/wsdl/globalweather.xml
|
||||||
lib/SOAP/WSDL/Client.pm
|
HACKING
|
||||||
lib/SOAP/WSDL/Client/Base.pm
|
lib/SOAP/WSDL.pm
|
||||||
lib/SOAP/WSDL/Definitions.pm
|
lib/SOAP/WSDL/Base.pm
|
||||||
lib/SOAP/WSDL/Envelope.pm
|
lib/SOAP/WSDL/Binding.pm
|
||||||
lib/SOAP/WSDL/Expat/MessageParser.pm
|
lib/SOAP/WSDL/Client.pm
|
||||||
lib/SOAP/WSDL/Expat/MessageStreamParser.pm
|
lib/SOAP/WSDL/Client/Base.pm
|
||||||
lib/SOAP/WSDL/Manual.pod
|
lib/SOAP/WSDL/Definitions.pm
|
||||||
lib/SOAP/WSDL/Manual/Glossary.pod
|
lib/SOAP/WSDL/Deserializer/SOAP11.pm
|
||||||
lib/SOAP/WSDL/Message.pm
|
lib/SOAP/WSDL/Deserializer/SOM.pm
|
||||||
lib/SOAP/WSDL/Operation.pm
|
lib/SOAP/WSDL/Expat/MessageParser.pm
|
||||||
lib/SOAP/WSDL/OpMessage.pm
|
lib/SOAP/WSDL/Expat/MessageStreamParser.pm
|
||||||
lib/SOAP/WSDL/Parser.pod
|
lib/SOAP/WSDL/Expat/MessageSubParser.pm
|
||||||
lib/SOAP/WSDL/Part.pm
|
lib/SOAP/WSDL/Expat/SubParser.pm
|
||||||
lib/SOAP/WSDL/Port.pm
|
lib/SOAP/WSDL/Expat/WSDLParser.pm
|
||||||
lib/SOAP/WSDL/PortType.pm
|
lib/SOAP/WSDL/Factory/Deserializer.pm
|
||||||
lib/SOAP/WSDL/SAX/MessageHandler.pm
|
lib/SOAP/WSDL/Factory/Serializer.pm
|
||||||
lib/SOAP/WSDL/SAX/WSDLHandler.pm
|
lib/SOAP/WSDL/Factory/Transport.pm
|
||||||
lib/SOAP/WSDL/Service.pm
|
lib/SOAP/WSDL/Manual.pod
|
||||||
lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm
|
lib/SOAP/WSDL/Manual/Glossary.pod
|
||||||
lib/SOAP/WSDL/SoapOperation.pm
|
lib/SOAP/WSDL/Manual/WS_I.pod
|
||||||
lib/SOAP/WSDL/TypeLookup.pm
|
lib/SOAP/WSDL/Message.pm
|
||||||
lib/SOAP/WSDL/Types.pm
|
lib/SOAP/WSDL/Operation.pm
|
||||||
lib/SOAP/WSDL/XSD/Builtin.pm
|
lib/SOAP/WSDL/OpMessage.pm
|
||||||
lib/SOAP/WSDL/XSD/ComplexType.pm
|
lib/SOAP/WSDL/Parser.pod
|
||||||
lib/SOAP/WSDL/XSD/Element.pm
|
lib/SOAP/WSDL/Part.pm
|
||||||
lib/SOAP/WSDL/XSD/Schema.pm
|
lib/SOAP/WSDL/Port.pm
|
||||||
lib/SOAP/WSDL/XSD/Schema/Builtin.pm
|
lib/SOAP/WSDL/PortType.pm
|
||||||
lib/SOAP/WSDL/XSD/SimpleType.pm
|
lib/SOAP/WSDL/SAX/MessageHandler.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
|
lib/SOAP/WSDL/SAX/WSDLHandler.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
|
lib/SOAP/WSDL/Serializer/SOAP11.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
|
lib/SOAP/WSDL/Service.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm
|
lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/base64Binary.pm
|
lib/SOAP/WSDL/SoapOperation.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/boolean.pm
|
lib/SOAP/WSDL/Transport/HTTP.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/byte.pm
|
lib/SOAP/WSDL/TypeLookup.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/date.pm
|
lib/SOAP/WSDL/Types.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.pm
|
lib/SOAP/WSDL/XSD/Builtin.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/decimal.pm
|
lib/SOAP/WSDL/XSD/ComplexType.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/double.pm
|
lib/SOAP/WSDL/XSD/Element.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/duration.pm
|
lib/SOAP/WSDL/XSD/Schema.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm
|
lib/SOAP/WSDL/XSD/Schema/Builtin.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/float.pm
|
lib/SOAP/WSDL/XSD/SimpleType.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/gDay.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonth.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonthDay.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/gYear.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/gYearMonth.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/base64Binary.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/hexBinary.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/boolean.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/ID.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/byte.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/IDREF.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/date.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/IDREFS.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/int.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/decimal.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/integer.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/double.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/language.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/duration.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/list.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/long.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/float.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/Name.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/gDay.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/NCName.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonth.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/negativeInteger.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonthDay.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKEN.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/gYear.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKENS.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/gYearMonth.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/nonNegativeInteger.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/hexBinary.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/nonPositiveInteger.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/ID.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/normalizedString.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/IDREF.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/NOTATION.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/IDREFS.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/positiveInteger.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/int.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/QName.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/integer.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/short.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/language.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/string.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/list.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/time.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/long.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/token.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/Name.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedByte.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/NCName.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedInt.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/negativeInteger.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedLong.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKEN.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKENS.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/nonNegativeInteger.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/Element.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/nonPositiveInteger.pm
|
||||||
lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/normalizedString.pm
|
||||||
LICENSE
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/NOTATION.pm
|
||||||
MANIFEST This list of files
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/positiveInteger.pm
|
||||||
META.yml
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/QName.pm
|
||||||
README
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/short.pm
|
||||||
t/001_use.t
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/string.pm
|
||||||
t/002_sax.t
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/time.pm
|
||||||
t/003_sax_serializer.t
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/token.pm
|
||||||
t/004_sax_wsdl.t
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedByte.pm
|
||||||
t/005_sax_contributed_wsdl.t
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedInt.pm
|
||||||
t/006_client.t
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedLong.pm
|
||||||
t/007_envelope.t
|
lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
|
||||||
t/008_client_wsdl_complexType.t
|
lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
|
||||||
t/009_data_classes.t
|
lib/SOAP/WSDL/XSD/Typelib/Element.pm
|
||||||
t/011_simpleType.t
|
lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
|
||||||
t/012_element.t
|
LICENSE
|
||||||
t/013_complexType.t
|
Makefile.PL
|
||||||
t/014_sax_typelib.t
|
MANIFEST This list of files
|
||||||
t/015_to_typemap.t
|
META.yml
|
||||||
t/016_client_object.t
|
README
|
||||||
t/017_generator.t
|
t/001_use.t
|
||||||
t/018_generator.t
|
t/002_parse_wsdl.t
|
||||||
t/020_storable.t
|
t/002_sax.t
|
||||||
t/098_pod.t
|
t/003_sax_serializer.t
|
||||||
t/acceptance/results/03_complexType-all.xml
|
t/003_wsdl_based_serializer.t
|
||||||
t/acceptance/results/03_complexType-sequence.xml
|
t/004_parse_wsdl.t
|
||||||
t/acceptance/results/04_element-simpleType.xml
|
t/004_sax_wsdl.t
|
||||||
t/acceptance/results/04_element.xml
|
t/005_parse_contributed.t
|
||||||
t/acceptance/results/05_simpleType-list.xml
|
t/005_sax_contributed_wsdl.t
|
||||||
t/acceptance/results/05_simpleType-restriction.xml
|
t/006_client.t
|
||||||
t/acceptance/results/05_simpleType-union.xml
|
t/007_envelope.t
|
||||||
t/acceptance/results/11_helloworld.xml
|
t/008_client_wsdl_complexType.t
|
||||||
t/acceptance/wsdl/006_sax_client.wsdl
|
t/009_data_classes.t
|
||||||
t/acceptance/wsdl/008_complexType.wsdl
|
t/011_simpleType.t
|
||||||
t/acceptance/wsdl/02_port.wsdl
|
t/012_element.t
|
||||||
t/acceptance/wsdl/03_complexType-all.wsdl
|
t/013_complexType.t
|
||||||
t/acceptance/wsdl/03_complexType-sequence.wsdl
|
t/014_sax_typelib.t
|
||||||
t/acceptance/wsdl/04_element-simpleType.wsdl
|
t/015_to_typemap.t
|
||||||
t/acceptance/wsdl/04_element.wsdl
|
t/016_client_object.t
|
||||||
t/acceptance/wsdl/05_simpleType-list.wsdl
|
t/017_generator_expat.t
|
||||||
t/acceptance/wsdl/05_simpleType-restriction.wsdl
|
t/017_generator_libxml.t
|
||||||
t/acceptance/wsdl/05_simpleType-union.wsdl
|
t/018_generator_expat.t
|
||||||
t/acceptance/wsdl/10_helloworld.asmx.xml
|
t/018_generator_libxml.t
|
||||||
t/acceptance/wsdl/11_helloworld.wsdl
|
t/020_storable.t
|
||||||
t/acceptance/wsdl/contributed/Axis.wsdl
|
t/021_generator_element_ref_expat.t
|
||||||
t/acceptance/wsdl/contributed/ETest.wsdl
|
t/021_generator_element_ref_libxml.t
|
||||||
t/acceptance/wsdl/contributed/OITest.wsdl
|
t/098_pod.t
|
||||||
t/acceptance/wsdl/contributed/tools.wsdl
|
t/acceptance/results/03_complexType-all.xml
|
||||||
t/acceptance/wsdl/email_account.wsdl
|
t/acceptance/results/03_complexType-sequence.xml
|
||||||
t/Expat/01_expat.t
|
t/acceptance/results/04_element-simpleType.xml
|
||||||
t/lib/MyComplexType.pm
|
t/acceptance/results/04_element.xml
|
||||||
t/lib/MyElement.pm
|
t/acceptance/results/05_simpleType-list.xml
|
||||||
t/lib/MySimpleType.pm
|
t/acceptance/results/05_simpleType-restriction.xml
|
||||||
t/lib/Test/SOAPMessage.pm
|
t/acceptance/results/05_simpleType-union.xml
|
||||||
t/lib/Typelib/Base.pm
|
t/acceptance/results/11_helloworld.xml
|
||||||
t/lib/Typelib/TEnqueueMessage.pm
|
t/acceptance/wsdl/006_sax_client.wsdl
|
||||||
t/lib/Typelib/TMessage.pm
|
t/acceptance/wsdl/008_complexType.wsdl
|
||||||
t/SOAP/WSDL/01_use.t
|
t/acceptance/wsdl/02_port.wsdl
|
||||||
t/SOAP/WSDL/02_port.t
|
t/acceptance/wsdl/03_complexType-all.wsdl
|
||||||
t/SOAP/WSDL/03_complexType-all.t
|
t/acceptance/wsdl/03_complexType-element-ref.wsdl
|
||||||
t/SOAP/WSDL/03_complexType-choice.t
|
t/acceptance/wsdl/03_complexType-sequence.wsdl
|
||||||
t/SOAP/WSDL/03_complexType-complexContent.t
|
t/acceptance/wsdl/04_element-simpleType.wsdl
|
||||||
t/SOAP/WSDL/03_complexType-group.t
|
t/acceptance/wsdl/04_element.wsdl
|
||||||
t/SOAP/WSDL/03_complexType-sequence.t
|
t/acceptance/wsdl/05_simpleType-list.wsdl
|
||||||
t/SOAP/WSDL/03_complexType-simpleContent.t
|
t/acceptance/wsdl/05_simpleType-restriction.wsdl
|
||||||
t/SOAP/WSDL/04_element-complexType.t
|
t/acceptance/wsdl/05_simpleType-union.wsdl
|
||||||
t/SOAP/WSDL/04_element-simpleType.t
|
t/acceptance/wsdl/10_helloworld.asmx.xml
|
||||||
t/SOAP/WSDL/04_element.t
|
t/acceptance/wsdl/11_helloworld.wsdl
|
||||||
t/SOAP/WSDL/05_simpleType-list.t
|
t/acceptance/wsdl/contributed/Axis.wsdl
|
||||||
t/SOAP/WSDL/05_simpleType-restriction.t
|
t/acceptance/wsdl/contributed/ETest.wsdl
|
||||||
t/SOAP/WSDL/05_simpleType-union.t
|
t/acceptance/wsdl/contributed/OITest.wsdl
|
||||||
t/SOAP/WSDL/10_performance.t
|
t/acceptance/wsdl/contributed/tools.wsdl
|
||||||
t/SOAP/WSDL/11_helloworld.NET.t
|
t/acceptance/wsdl/email_account.wsdl
|
||||||
t/SOAP/WSDL/12_binding.pl
|
t/Expat/01_expat.t
|
||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/001_string.t
|
t/Expat/02_sub_parser.t
|
||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/002_dateTime.t
|
t/Expat/03_wsdl.t
|
||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/002_time.t
|
t/lib/MyComplexType.pm
|
||||||
t/SOAP/WSDL/XSD/Typelib/Builtin/003_date.t
|
t/lib/MyElement.pm
|
||||||
TODO
|
t/lib/MySimpleType.pm
|
||||||
Makefile.PL
|
t/lib/Test/SOAPMessage.pm
|
||||||
|
t/lib/Typelib/Base.pm
|
||||||
|
t/lib/Typelib/TEnqueueMessage.pm
|
||||||
|
t/lib/Typelib/TMessage.pm
|
||||||
|
t/SOAP/WSDL/01_use.t
|
||||||
|
t/SOAP/WSDL/02_port.t
|
||||||
|
t/SOAP/WSDL/03_complexType-all.t
|
||||||
|
t/SOAP/WSDL/03_complexType-choice.t
|
||||||
|
t/SOAP/WSDL/03_complexType-complexContent.t
|
||||||
|
t/SOAP/WSDL/03_complexType-element-ref.t
|
||||||
|
t/SOAP/WSDL/03_complexType-group.t
|
||||||
|
t/SOAP/WSDL/03_complexType-sequence.t
|
||||||
|
t/SOAP/WSDL/03_complexType-simpleContent.t
|
||||||
|
t/SOAP/WSDL/04_element-complexType.t
|
||||||
|
t/SOAP/WSDL/04_element-simpleType.t
|
||||||
|
t/SOAP/WSDL/04_element.t
|
||||||
|
t/SOAP/WSDL/05_simpleType-list.t
|
||||||
|
t/SOAP/WSDL/05_simpleType-restriction.t
|
||||||
|
t/SOAP/WSDL/05_simpleType-union.t
|
||||||
|
t/SOAP/WSDL/11_helloworld.NET.t
|
||||||
|
t/SOAP/WSDL/12_binding.pl
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/001_string.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/002_dateTime.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/003_date.t
|
||||||
|
t/SOAP/WSDL/XSD/Typelib/Builtin/004_time.t
|
||||||
|
t/test.pl
|
||||||
|
TODO
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: SOAP-WSDL
|
name: SOAP-WSDL
|
||||||
version: 2.00_09
|
version: 2.00_13
|
||||||
author:
|
author:
|
||||||
abstract: SOAP with WSDL support
|
abstract: SOAP with WSDL support
|
||||||
license: artistic
|
license: artistic
|
||||||
@@ -11,12 +11,11 @@ requires:
|
|||||||
Date::Parse: 0
|
Date::Parse: 0
|
||||||
File::Basename: 0
|
File::Basename: 0
|
||||||
File::Path: 0
|
File::Path: 0
|
||||||
|
Getopt::Long: 0
|
||||||
LWP::UserAgent: 0
|
LWP::UserAgent: 0
|
||||||
List::Util: 0
|
List::Util: 0
|
||||||
XML::LibXML: 0
|
Template: 0
|
||||||
XML::Parser::Expat: 0
|
XML::Parser::Expat: 0
|
||||||
XML::SAX::Base: 0
|
|
||||||
XML::SAX::ParserFactory: 0
|
|
||||||
generated_by: Module::Build version 0.2808
|
generated_by: Module::Build version 0.2808
|
||||||
meta-spec:
|
meta-spec:
|
||||||
url: http://module-build.sourceforge.net/META-spec-v1.2.html
|
url: http://module-build.sourceforge.net/META-spec-v1.2.html
|
||||||
@@ -24,23 +23,36 @@ meta-spec:
|
|||||||
provides:
|
provides:
|
||||||
SOAP::WSDL:
|
SOAP::WSDL:
|
||||||
file: lib/SOAP/WSDL.pm
|
file: lib/SOAP/WSDL.pm
|
||||||
version: 2.00_09
|
version: 2.00_13
|
||||||
SOAP::WSDL::Base:
|
SOAP::WSDL::Base:
|
||||||
file: lib/SOAP/WSDL/Base.pm
|
file: lib/SOAP/WSDL/Base.pm
|
||||||
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_13
|
||||||
SOAP::WSDL::Client::Base:
|
SOAP::WSDL::Client::Base:
|
||||||
file: lib/SOAP/WSDL/Client/Base.pm
|
file: lib/SOAP/WSDL/Client/Base.pm
|
||||||
SOAP::WSDL::Definitions:
|
SOAP::WSDL::Definitions:
|
||||||
file: lib/SOAP/WSDL/Definitions.pm
|
file: lib/SOAP/WSDL/Definitions.pm
|
||||||
SOAP::WSDL::Envelope:
|
SOAP::WSDL::Deserializer::SOAP11:
|
||||||
file: lib/SOAP/WSDL/Envelope.pm
|
file: lib/SOAP/WSDL/Deserializer/SOAP11.pm
|
||||||
|
version: 2.00_13
|
||||||
|
SOAP::WSDL::Deserializer::SOM:
|
||||||
|
file: lib/SOAP/WSDL/Deserializer/SOM.pm
|
||||||
|
version: 2.00_13
|
||||||
SOAP::WSDL::Expat::MessageParser:
|
SOAP::WSDL::Expat::MessageParser:
|
||||||
file: lib/SOAP/WSDL/Expat/MessageParser.pm
|
file: lib/SOAP/WSDL/Expat/MessageParser.pm
|
||||||
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:
|
||||||
|
file: lib/SOAP/WSDL/Expat/MessageSubParser.pm
|
||||||
|
SOAP::WSDL::Factory::Deserializer:
|
||||||
|
file: lib/SOAP/WSDL/Factory/Deserializer.pm
|
||||||
|
SOAP::WSDL::Factory::Serializer:
|
||||||
|
file: lib/SOAP/WSDL/Factory/Serializer.pm
|
||||||
|
SOAP::WSDL::Factory::Transport:
|
||||||
|
file: lib/SOAP/WSDL/Factory/Transport.pm
|
||||||
SOAP::WSDL::Message:
|
SOAP::WSDL::Message:
|
||||||
file: lib/SOAP/WSDL/Message.pm
|
file: lib/SOAP/WSDL/Message.pm
|
||||||
SOAP::WSDL::OpMessage:
|
SOAP::WSDL::OpMessage:
|
||||||
@@ -57,10 +69,15 @@ provides:
|
|||||||
file: lib/SOAP/WSDL/SAX/MessageHandler.pm
|
file: lib/SOAP/WSDL/SAX/MessageHandler.pm
|
||||||
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:
|
||||||
|
file: lib/SOAP/WSDL/Serializer/SOAP11.pm
|
||||||
|
version: 2.00_13
|
||||||
SOAP::WSDL::Service:
|
SOAP::WSDL::Service:
|
||||||
file: lib/SOAP/WSDL/Service.pm
|
file: lib/SOAP/WSDL/Service.pm
|
||||||
SOAP::WSDL::SoapOperation:
|
SOAP::WSDL::SoapOperation:
|
||||||
file: lib/SOAP/WSDL/SoapOperation.pm
|
file: lib/SOAP/WSDL/SoapOperation.pm
|
||||||
|
SOAP::WSDL::Transport::HTTP:
|
||||||
|
file: lib/SOAP/WSDL/Transport/HTTP.pm
|
||||||
SOAP::WSDL::TypeLookup:
|
SOAP::WSDL::TypeLookup:
|
||||||
file: lib/SOAP/WSDL/TypeLookup.pm
|
file: lib/SOAP/WSDL/TypeLookup.pm
|
||||||
SOAP::WSDL::Types:
|
SOAP::WSDL::Types:
|
||||||
|
|||||||
+30
-26
@@ -1,27 +1,31 @@
|
|||||||
# Note: this file was auto-generated by Module::Build::Compat version 0.03
|
# Note: this file was auto-generated by Module::Build::Compat version 0.03
|
||||||
use ExtUtils::MakeMaker;
|
|
||||||
WriteMakefile
|
unless (eval "use Module::Build::Compat 0.02; 1" ) {
|
||||||
(
|
print "This module requires Module::Build to install itself.\n";
|
||||||
'PL_FILES' => {},
|
|
||||||
'INSTALLDIRS' => 'site',
|
require ExtUtils::MakeMaker;
|
||||||
'NAME' => 'SOAP::WSDL',
|
my $yn = ExtUtils::MakeMaker::prompt
|
||||||
'EXE_FILES' => [
|
(' Install Module::Build now from CPAN?', 'y');
|
||||||
bin/wsdl2perl.pl'
|
|
||||||
],
|
unless ($yn =~ /^y/i) {
|
||||||
'VERSION_FROM' => 'lib/SOAP/WSDL.pm',
|
die " *** Cannot install without Module::Build. Exiting ...\n";
|
||||||
'PREREQ_PM' => {
|
}
|
||||||
'XML::SAX::ParserFactory' => 0,
|
|
||||||
'XML::Parser::Expat' => 0,
|
require Cwd;
|
||||||
'Class::Std' => 'v0.0.8',
|
require File::Spec;
|
||||||
'Date::Format' => 0,
|
require CPAN;
|
||||||
'Date::Parse' => 0,
|
|
||||||
'List::Util' => 0,
|
# Save this 'cause CPAN will chdir all over the place.
|
||||||
'LWP::UserAgent' => 0,
|
my $cwd = Cwd::cwd();
|
||||||
'XML::SAX::Base' => 0,
|
|
||||||
'XML::LibXML' => 0,
|
CPAN::Shell->install('Module::Build::Compat');
|
||||||
'File::Path' => 0,
|
CPAN::Shell->expand("Module", "Module::Build::Compat")->uptodate
|
||||||
'Class::Std::Storable' => 0,
|
or die "Couldn't install Module::Build, giving up.\n";
|
||||||
'File::Basename' => 0
|
|
||||||
}
|
chdir $cwd or die "Cannot chdir() back to $cwd: $!";
|
||||||
)
|
}
|
||||||
;
|
eval "use Module::Build::Compat 0.02; 1" or die $@;
|
||||||
|
|
||||||
|
Module::Build::Compat->run_build_pl(args => \@ARGV);
|
||||||
|
require Module::Build;
|
||||||
|
Module::Build::Compat->write_makefile(build_class => 'Module::Build');
|
||||||
|
|||||||
@@ -1,26 +1,26 @@
|
|||||||
INTRO
|
INTRO
|
||||||
-----
|
-----
|
||||||
|
|
||||||
SOAP-WSDL provides a SOAP client with WSDL support.
|
SOAP-WSDL provides a SOAP client with WSDL support.
|
||||||
|
|
||||||
This is a developer release - everything may (and most things will) change.
|
This is a developer release - everything may (and most things will) change.
|
||||||
|
|
||||||
INSTALLING
|
INSTALLING
|
||||||
----------
|
----------
|
||||||
|
|
||||||
Use the following mantra:
|
Use the following mantra:
|
||||||
|
|
||||||
perl Build.PL
|
perl Build.PL
|
||||||
perl Build
|
perl Build
|
||||||
perl Build test
|
perl Build test
|
||||||
perl Build install
|
perl Build install
|
||||||
|
|
||||||
If you don't have Module::Build installed, you may also use
|
If you don't have Module::Build installed, you may also use
|
||||||
|
|
||||||
perl Makefile.PL
|
perl Makefile.PL
|
||||||
make
|
make
|
||||||
make test
|
make test
|
||||||
make install
|
make install
|
||||||
|
|
||||||
Note that Module::Build is the recommended installer - make will not run
|
Note that Module::Build is the recommended installer - make will not run
|
||||||
all tests provided with SOAP-WSDL.
|
all tests provided with SOAP-WSDL.
|
||||||
@@ -1,36 +1,36 @@
|
|||||||
- support embedded atomic types by including a second (and third and fourth)
|
TODO list for SOAP::WSDL
|
||||||
package type_prefix::complex_type::element_name element package.
|
|
||||||
Allow unlimited depth (though this is rather wicked).
|
2.00 Pre-releases
|
||||||
- fixup generated pod so it looks nice in SOAP::WSDL::Definitions.
|
--------
|
||||||
- remove benchmarks from tests. Create benchmark/ directory and store benchmarks in.
|
* SOAP Header support (#1764845)
|
||||||
- add tests for SOAP::WSDL::Definitions::create
|
|
||||||
- test for correct creation
|
* Implement a interface similar to SOAP::Schema (#1783639)
|
||||||
- test against web service (fullerdata.com?)
|
|
||||||
- Improve docs
|
* Check & probably fix simpleType support.
|
||||||
- Partially DONE
|
The WS at http://www.webservicex.net/genericbarcode.asmx?wsdl should
|
||||||
- Remove SOAP::Lite dependency - for now, just support HTTP(s) via LWP::UserAgent.
|
make up a good example for simpleType definitions.
|
||||||
- Partially DONE. SOAP::WSDL still uses SOAP::Schema
|
|
||||||
- write inheritance Test for all XSD::Typelib::Builtin::* classes
|
* Remove benchmarks from test. Create benchmark/ directory to store benchmarks.
|
||||||
- Check & probably fix simpleType support.
|
|
||||||
The WS at http://www.webservicex.net/genericbarcode.asmx?wsdl should make up a good example for simpleType
|
* write inheritance Test for all XSD::Typelib::Builtin::* classes
|
||||||
definitions.
|
|
||||||
- add default Fault11 typemap to generated typemaps
|
* support embedded atomic types (#1761532)
|
||||||
- DONE
|
Implement by including a second (and third and fourth)
|
||||||
- SOAP::WSDL::Definitions::create creates bad interface docs. Fix it.
|
|
||||||
- DONE
|
package type_prefix::complex_type::element_name;
|
||||||
- update all Builtin Types to new constructor BEGIN block (Class::Std unfortunately is way slow)
|
|
||||||
- DONE.
|
element package.
|
||||||
- Remove useless (but on CPAN annoying) doc from Builtin::* classes
|
Maybe even allow unlimited depth? What does the specs say?
|
||||||
- DONE
|
|
||||||
- add example WS scripts
|
2.1 release
|
||||||
- DONE.
|
--------
|
||||||
- SOAP::WSDL::XSD::Typelib::Builtin::string does not unescape XML builtin entities on get_value()
|
|
||||||
- WONTFIX.
|
|
||||||
Entities are unescaped by XML parser.
|
2.2 release
|
||||||
If you want the plain value, you have to use get_value, as XML conversion is overloaded on stringification.
|
--------
|
||||||
- Make callin WS easier: implent WS-I-based SOAP::WSDL::Client::WSI
|
* XML schema support ("minimal conformant") (#1764845)
|
||||||
- WONTFIX - SOAP::WSDL::Base should behave equal
|
* Support SOAP attachments
|
||||||
- add capability to create request objects based on input part definitions to SOAP::WSDL::Client::Base
|
|
||||||
- DONE.
|
3.0 release
|
||||||
|
--------
|
||||||
|
We're not thinking that far ahead right now.
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use lib '../lib';
|
||||||
|
use lib 'lib';
|
||||||
|
use lib '../t/lib';
|
||||||
|
use SOAP::WSDL::SAX::MessageHandler;
|
||||||
|
|
||||||
|
use Benchmark;
|
||||||
|
use SOAP::WSDL::Expat::MessageParser;
|
||||||
|
use XML::Simple;
|
||||||
|
use XML::LibXML;
|
||||||
|
use MyComplexType;
|
||||||
|
use MyElement;
|
||||||
|
use MySimpleType;
|
||||||
|
|
||||||
|
my $xml = q{<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
|
||||||
|
<SOAP-ENV:Body><MyAtomicComplexTypeElement xmlns="urn:Test" >
|
||||||
|
<test>Test</test>
|
||||||
|
<test2 >Test2</test2>
|
||||||
|
</MyAtomicComplexTypeElement></SOAP-ENV:Body></SOAP-ENV:Envelope>};
|
||||||
|
|
||||||
|
|
||||||
|
my $parser = SOAP::WSDL::Expat::MessageParser->new({
|
||||||
|
class_resolver => 'FakeResolver'
|
||||||
|
});
|
||||||
|
|
||||||
|
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
|
||||||
|
|
||||||
|
my $libxml = XML::LibXML->new();
|
||||||
|
|
||||||
|
timethese 1000,
|
||||||
|
{
|
||||||
|
'SOAP::WSDL' => sub { $parser->parse( $xml ) },
|
||||||
|
#'XML::Simple (Hash)' => sub { XMLin $xml },
|
||||||
|
'XML::LibXML (DOM)' => sub { my $dom = $libxml->parse_string( $xml ) },
|
||||||
|
};
|
||||||
|
|
||||||
|
use Test::More tests => 1;
|
||||||
|
is $parser->get_data(), q{<MyAtomicComplexTypeElement xmlns="urn:Test" >}
|
||||||
|
. q{<test >Test</test><test2 >Test2</test2></MyAtomicComplexTypeElement>}
|
||||||
|
, 'Content comparison';
|
||||||
|
|
||||||
|
$parser->class_resolver( 'FakeResolver2' );
|
||||||
|
|
||||||
|
|
||||||
|
# data classes reside in t/lib/Typelib/
|
||||||
|
BEGIN {
|
||||||
|
package FakeResolver;
|
||||||
|
{
|
||||||
|
my %class_list = (
|
||||||
|
'MyAtomicComplexTypeElement' => 'MyAtomicComplexTypeElement',
|
||||||
|
'MyAtomicComplexTypeElement/test' => 'MyTestElement',
|
||||||
|
'MyAtomicComplexTypeElement/test2' => 'MyTestElement2',
|
||||||
|
);
|
||||||
|
|
||||||
|
sub get_map { return \%class_list };
|
||||||
|
|
||||||
|
sub new { return bless {}, 'FakeResolver' };
|
||||||
|
|
||||||
|
sub get_class {
|
||||||
|
my $name = join('/', @{ $_[1] });
|
||||||
|
return ($class_list{ $name }) ? $class_list{ $name }
|
||||||
|
: warn "no class found for $name";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Benchmark;
|
||||||
|
use lib '../../lib';
|
||||||
|
use SOAP::WSDL::XSD::Typelib::Builtin::anyType;
|
||||||
|
|
||||||
|
my $obj = SOAP::WSDL::XSD::Typelib::Builtin::anyType->new();
|
||||||
|
|
||||||
|
timethese 10000, {
|
||||||
|
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anyType->new() },
|
||||||
|
'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() },
|
||||||
|
};
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Benchmark;
|
||||||
|
use lib '../../lib';
|
||||||
|
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
||||||
|
|
||||||
|
my $obj = SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new();
|
||||||
|
|
||||||
|
timethese 10000, {
|
||||||
|
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new() },
|
||||||
|
'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new({
|
||||||
|
xmlns => 'urn:Test',
|
||||||
|
value => 'Teststring'
|
||||||
|
}) },
|
||||||
|
'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() },
|
||||||
|
};
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Benchmark;
|
||||||
|
use lib '../../lib';
|
||||||
|
use SOAP::WSDL::XSD::Typelib::Builtin::string;
|
||||||
|
|
||||||
|
my $obj = SOAP::WSDL::XSD::Typelib::Builtin::string->new();
|
||||||
|
|
||||||
|
timethese 10000, {
|
||||||
|
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new() },
|
||||||
|
'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new({
|
||||||
|
xmlns => 'urn:Test',
|
||||||
|
value => 'Teststring'
|
||||||
|
}) },
|
||||||
|
'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() },
|
||||||
|
};
|
||||||
+121
-128
@@ -1,132 +1,125 @@
|
|||||||
#!/usr/bin/perl -w
|
#!/usr/bin/perl -w
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Fcntl;
|
use Pod::Usage;
|
||||||
use IO::File;
|
use Getopt::Long;
|
||||||
use Pod::Usage;
|
use LWP::UserAgent;
|
||||||
use Getopt::Long;
|
use SOAP::WSDL::Expat::WSDLParser;
|
||||||
use LWP::UserAgent;
|
|
||||||
use SOAP::WSDL::SAX::WSDLHandler;
|
my %opt = (
|
||||||
use XML::LibXML;
|
url => '',
|
||||||
|
prefix => undef,
|
||||||
my %opt = (
|
type_prefix => 'MyTypes::',
|
||||||
url => '',
|
element_prefix => 'MyElements::',
|
||||||
prefix => undef,
|
typemap_prefix => 'MyTypemaps::',
|
||||||
type_prefix => 'MyTypes::',
|
interface_prefix => 'MyInterfaces::',
|
||||||
element_prefix => 'MyElements::',
|
base_path => 'lib/',
|
||||||
typemap_prefix => 'MyTypemaps::',
|
proxy => undef
|
||||||
interface_prefix => 'MyInterfaces::',
|
);
|
||||||
base_path => 'lib/',
|
|
||||||
proxy => undef
|
GetOptions(\%opt,
|
||||||
);
|
qw(
|
||||||
|
url|u=s
|
||||||
GetOptions(\%opt,
|
prefix|p=s
|
||||||
qw(
|
type_prefix|t=s
|
||||||
url|u=s
|
element_prefix|e=s
|
||||||
prefix|p=s
|
typemap_prefix|m=s
|
||||||
type_prefix|t=s
|
base_path|b=s
|
||||||
element_prefix|e=s
|
typemap_include|mi=s
|
||||||
typemap_prefix|m=s
|
help|h
|
||||||
base_path|b=s
|
proxy|x=s
|
||||||
typemap_include|mi=s
|
)
|
||||||
help|h
|
);
|
||||||
proxy|x=s
|
|
||||||
)
|
my $url = $ARGV[0];
|
||||||
);
|
|
||||||
|
pod2usage( -exit => 1 , verbose => 2 ) if ($opt{help});
|
||||||
my $url = $ARGV[0];
|
pod2usage( -exit => 1 , verbose => 1 ) if not ($url);
|
||||||
|
|
||||||
pod2usage( -exit => 1 , verbose => 2 ) if ($opt{help});
|
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
|
||||||
pod2usage( -exit => 1 , verbose => 1 ) if not ($url);
|
|
||||||
|
local $ENV{HTTP_PROXY} = $opt{proxy} if $opt{proxy};
|
||||||
my $handler = SOAP::WSDL::SAX::WSDLHandler->new();
|
my $lwp = LWP::UserAgent->new();
|
||||||
my $parser = XML::LibXML->new();
|
my $response = $lwp->get($url);
|
||||||
|
die $response->message(), "\n" if $response->code != 200;
|
||||||
local $ENV{HTTP_PROXY} = $opt{proxy} if $opt{proxy};
|
|
||||||
my $lwp = LWP::UserAgent->new();
|
my $xml = $response->content();
|
||||||
my $response = $lwp->get($url);
|
|
||||||
die $response->message(), "\n" if $response->code != 200;
|
my $wsdl = $parser->parse_string( $xml );
|
||||||
|
|
||||||
my $xml = $response->content();
|
if ($opt{typemap_include}) {
|
||||||
|
open my $fh , $opt{typemap_include}
|
||||||
$parser->set_handler( $handler );
|
or die "cannot open typemap_include file $opt{typemap_include}\n";
|
||||||
$parser->parse_string( $xml );
|
$opt{custom_types} .= join q{}, <$fh>;
|
||||||
|
close $fh;
|
||||||
my $wsdl = $handler->get_data();
|
delete $opt{typemap_include};
|
||||||
|
}
|
||||||
if ($opt{typemap_include}) {
|
|
||||||
my $fh = IO::File->new($opt{typemap_include} , O_RDONLY)
|
$wsdl->create({ %opt });
|
||||||
or die "cannot open typemap_include file $opt{typemap_include}\n";
|
|
||||||
$opt{custom_types} = join q{}, $fh->getlines();
|
=pod
|
||||||
$fh->close();
|
|
||||||
delete $opt{typemap_include};
|
=head1 NAME
|
||||||
}
|
|
||||||
|
wsdl2perl.pl - create perl bindings for SOAP webservices.
|
||||||
$wsdl->create({ %opt });
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
=pod
|
|
||||||
|
wsdl2perl.pl -t TYPE_PREFIX -e ELEMENT_PREFIX -m TYPEMAP_PREFIX \
|
||||||
=head1 NAME
|
-i INTERFACE_PREFIX -b BASE_DIR URL
|
||||||
|
|
||||||
wsdl2perl.pl - create perl bindings for SOAP webservices.
|
=head1 OPTIONS
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
NAME SHORT DESCRITPION
|
||||||
|
----------------------------------------------------------------------------
|
||||||
wsdl2perl.pl -t TYPE_PREFIX -e ELEMENT_PREFIX -m TYPEMAP_PREFIX \
|
prefix p Prefix for both type and element classes.
|
||||||
-i INTERFACE_PREFIX -b BASE_DIR URL
|
type_prefix t Prefix for type classes. Should end with '::'
|
||||||
|
Default: MyTypes::
|
||||||
=head1 OPTIONS
|
element_prefix e Prefix for element classes. Should end with '::'
|
||||||
|
Default: MyElements::
|
||||||
NAME SHORT DESCRITPION
|
typemap_prefix m Prefix for typemap classes. Should end with '::'
|
||||||
----------------------------------------------------------------------------
|
Default: MyTypemaps::
|
||||||
prefix p Prefix for both type and element classes.
|
interface_prefix i Prefix for interface classes. Should end with '::'
|
||||||
type_prefix t Prefix for type classes. Should end with '::'
|
Default: MyInterfaces::
|
||||||
Default: MyTypes::
|
base_path b Path to create classes in.
|
||||||
element_prefix e Prefix for element classes. Should end with '::'
|
Default: ./lib
|
||||||
Default: MyElements::
|
typemap_include mi File to include in typemap.
|
||||||
typemap_prefix m Prefix for typemap classes. Should end with '::'
|
help h Show help content
|
||||||
Default: MyTypemaps::
|
|
||||||
interface_prefix i Prefix for interface classes. Should end with '::'
|
=head1 DESCRIPTION
|
||||||
Default: MyInterfaces::
|
|
||||||
base_path b Path to create classes in.
|
Generates a interface class for a SOAP web service described by a WSDL
|
||||||
Default: ./lib
|
definition.
|
||||||
typemap_include mi File to include in typemap.
|
|
||||||
help h Show help content
|
The following classes are created:
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=over
|
||||||
|
|
||||||
Generates a interface class for a SOAP web service described by a WSDL
|
=item * A interface class for every service
|
||||||
definition.
|
|
||||||
|
Interface classes are what you will mainly deal with: They provide a method
|
||||||
The following classes are created:
|
for accessing every web service method.
|
||||||
|
|
||||||
=over
|
=item * A typemap for every service
|
||||||
|
|
||||||
=item * A interface class for every service
|
Typemaps are used internally by SOAP::WSDL for parsing the SOAP message into
|
||||||
|
object trees.
|
||||||
Interface classes are what you will mainly deal with: They provide a method
|
|
||||||
for accessing every web service method.
|
If the WSDL definition is incomplete, you may need to add some lines to
|
||||||
|
your typemap. Especially definitions for faults are sometimes left out.
|
||||||
=item * A typemap for every service
|
|
||||||
|
Additional typemap content may be included by passing a file name as
|
||||||
Typemaps are used internally by SOAP::WSDL for parsing the SOAP message into
|
typemap_include (mi) option.
|
||||||
object trees.
|
|
||||||
|
=item * A type class for every element, complexType or simpleType definition
|
||||||
If the WSDL definition is incomplete, you may need to add some lines to
|
|
||||||
your typemap. Especially definitions for faults are sometimes left out.
|
You may need to write additional type classes if your WSDL is incomplete.
|
||||||
|
|
||||||
Additional typemap content may be included by passing a file name as
|
For writing your own lib classes, see L<SOAP::WSDL::XSD::Typelib::Element>,
|
||||||
typemap_include (mi) option.
|
|
||||||
|
|
||||||
=item * A type class for every element, complexType or simpleType definition
|
|
||||||
|
|
||||||
You may need to write additional type classes if your WSDL is incomplete.
|
|
||||||
|
|
||||||
For writing your own lib classes, see L<SOAP::WSDL::XSD::Typelib::Element>,
|
|
||||||
L<SOAP::WSDL::XSD::Typelib::ComplexType> and L<SOAP::WSDL::XSD::Typelib::SimpleType>.
|
L<SOAP::WSDL::XSD::Typelib::ComplexType> and L<SOAP::WSDL::XSD::Typelib::SimpleType>.
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE
|
||||||
|
|
||||||
Copyright 2007 Martin Kutter.
|
Copyright 2007 Martin Kutter.
|
||||||
|
|||||||
+46
-46
@@ -1,47 +1,47 @@
|
|||||||
# Accessing the fortune cookie service at
|
# Accessing the fortune cookie service at
|
||||||
# www.fullerdata.com/FortuneCookie/FortuneCookie.asmx
|
# www.fullerdata.com/FortuneCookie/FortuneCookie.asmx
|
||||||
#
|
#
|
||||||
# I have no connection to www.fullerdata.com
|
# I have no connection to www.fullerdata.com
|
||||||
#
|
#
|
||||||
# Use this script at your own risk.
|
# Use this script at your own risk.
|
||||||
|
|
||||||
# Run before:
|
# Run before:
|
||||||
# D:\Eigene Dateien\Martin\SOAP-WSDL\trunk>perl -I../lib wsdl2perl.pl "file:///D:/
|
# D:\Eigene Dateien\Martin\SOAP-WSDL\trunk>perl -I../lib wsdl2perl.pl "file:///D:/
|
||||||
# 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;
|
||||||
my $cookieService = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie->new();
|
my $cookieService = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie->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";
|
||||||
|
|
||||||
$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:
|
||||||
|
|
||||||
# the same in SOAP lite (second call)
|
# the same in SOAP lite (second call)
|
||||||
#
|
#
|
||||||
|
|
||||||
use SOAP::Lite;
|
use SOAP::Lite;
|
||||||
|
|
||||||
my $lite = SOAP::Lite->new()->on_action(sub { join '/', @_ } )
|
my $lite = SOAP::Lite->new()->on_action(sub { join '/', @_ } )
|
||||||
->proxy('http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx');
|
->proxy('http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx');
|
||||||
|
|
||||||
$lite->call(
|
$lite->call(
|
||||||
SOAP::Data->name('GetSpecificCookie')
|
SOAP::Data->name('GetSpecificCookie')
|
||||||
->attr({ 'xmlns', 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }),
|
->attr({ 'xmlns', 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }),
|
||||||
SOAP::Data->name('index')->value(23)
|
SOAP::Data->name('index')->value(23)
|
||||||
);
|
);
|
||||||
|
|
||||||
die $soap->message() if ($soap->fault());
|
die $soap->message() if ($soap->fault());
|
||||||
print $soap->result();
|
print $soap->result();
|
||||||
@@ -1,71 +1,71 @@
|
|||||||
package MyElements::CountCookies;
|
package MyElements::CountCookies;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
use SOAP::WSDL::XSD::Typelib::Element;
|
||||||
|
|
||||||
# atomic complexType
|
# atomic complexType
|
||||||
# <element name="CountCookies"><complexType> definition
|
# <element name="CountCookies"><complexType> definition
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
use SOAP::WSDL::XSD::Typelib::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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
__PACKAGE__->_factory(
|
||||||
[ qw() ],
|
[ qw() ],
|
||||||
{
|
{
|
||||||
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
||||||
|
|
||||||
__PACKAGE__->__set_name('CountCookies');
|
__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('');
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::CountCookies
|
=head1 NAME MyElements::CountCookies
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element CountCookies.
|
Type class for the XML element CountCookies.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 PROPERTIES
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
methods:
|
methods:
|
||||||
|
|
||||||
|
|
||||||
=head1 Object structure
|
=head1 Object structure
|
||||||
|
|
||||||
|
|
||||||
Structure as perl hash:
|
Structure as perl hash:
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
The object structure is displayed as hash below though this is not correct.
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
Complex hash elements actually are objects of their corresponding classes
|
||||||
(look for classes of the same name in your typleib).
|
(look for classes of the same name in your typleib).
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
new() will accept a hash structure like this, but transform it to a object
|
||||||
tree.
|
tree.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,85 +1,85 @@
|
|||||||
package MyElements::CountCookiesResponse;
|
package MyElements::CountCookiesResponse;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
use SOAP::WSDL::XSD::Typelib::Element;
|
||||||
|
|
||||||
# atomic complexType
|
# atomic complexType
|
||||||
# <element name="CountCookiesResponse"><complexType> definition
|
# <element name="CountCookiesResponse"><complexType> definition
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
use SOAP::WSDL::XSD::Typelib::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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
my %CountCookiesResult_of :ATTR(:get<CountCookiesResult>);
|
my %CountCookiesResult_of :ATTR(:get<CountCookiesResult>);
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
__PACKAGE__->_factory(
|
||||||
[ qw(
|
[ qw(
|
||||||
CountCookiesResult
|
CountCookiesResult
|
||||||
) ],
|
) ],
|
||||||
{
|
{
|
||||||
CountCookiesResult => \%CountCookiesResult_of,
|
CountCookiesResult => \%CountCookiesResult_of,
|
||||||
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
||||||
CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
||||||
|
|
||||||
__PACKAGE__->__set_name('CountCookiesResponse');
|
__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('');
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::CountCookiesResponse
|
=head1 NAME MyElements::CountCookiesResponse
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element CountCookiesResponse.
|
Type class for the XML element CountCookiesResponse.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 PROPERTIES
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
methods:
|
methods:
|
||||||
|
|
||||||
CountCookiesResult
|
CountCookiesResult
|
||||||
|
|
||||||
=head1 Object structure
|
=head1 Object structure
|
||||||
|
|
||||||
CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
|
||||||
|
|
||||||
Structure as perl hash:
|
Structure as perl hash:
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
The object structure is displayed as hash below though this is not correct.
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
Complex hash elements actually are objects of their corresponding classes
|
||||||
(look for classes of the same name in your typleib).
|
(look for classes of the same name in your typleib).
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
new() will accept a hash structure like this, but transform it to a object
|
||||||
tree.
|
tree.
|
||||||
|
|
||||||
'CountCookiesResponse'=> {
|
'CountCookiesResponse'=> {
|
||||||
'CountCookiesResult' => $someValue,
|
'CountCookiesResult' => $someValue,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,85 +1,93 @@
|
|||||||
package MyElements::GetCitiesByCountry;
|
package MyElements::GetCitiesByCountry;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
use SOAP::WSDL::XSD::Typelib::Element;
|
||||||
|
|
||||||
# atomic complexType
|
|
||||||
# <element name="GetCitiesByCountry"><complexType> definition
|
# atomic complexType
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
# <element name="GetCitiesByCountry"><complexType> definition
|
||||||
use base qw(
|
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
use base qw(
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
);
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
|
||||||
my %CountryName_of :ATTR(:get<CountryName>);
|
|
||||||
|
my %CountryName_of :ATTR(:get<CountryName>);
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
|
||||||
[ qw(
|
__PACKAGE__->_factory(
|
||||||
CountryName
|
[ qw(
|
||||||
) ],
|
CountryName
|
||||||
{
|
) ],
|
||||||
CountryName => \%CountryName_of,
|
{
|
||||||
|
CountryName => \%CountryName_of,
|
||||||
},
|
|
||||||
{
|
},
|
||||||
|
{
|
||||||
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
|
||||||
}
|
|
||||||
);
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.webserviceX.NET' }
|
|
||||||
|
sub get_xmlns { 'http://www.webserviceX.NET' }
|
||||||
__PACKAGE__->__set_name('GetCitiesByCountry');
|
|
||||||
__PACKAGE__->__set_nillable();
|
__PACKAGE__->__set_name('GetCitiesByCountry');
|
||||||
__PACKAGE__->__set_minOccurs();
|
__PACKAGE__->__set_nillable();
|
||||||
__PACKAGE__->__set_maxOccurs();
|
__PACKAGE__->__set_minOccurs();
|
||||||
__PACKAGE__->__set_ref('');
|
__PACKAGE__->__set_maxOccurs();
|
||||||
|
__PACKAGE__->__set_ref('');
|
||||||
1;
|
|
||||||
|
1;
|
||||||
|
|
||||||
__END__
|
|
||||||
|
__END__
|
||||||
=pod
|
|
||||||
|
|
||||||
=head1 NAME MyElements::GetCitiesByCountry
|
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=pod
|
||||||
|
|
||||||
Type class for the XML element GetCitiesByCountry.
|
=head1 NAME
|
||||||
|
|
||||||
=head1 PROPERTIES
|
MyElements::GetCitiesByCountry
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
=head1 SYNOPSIS
|
||||||
methods:
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
CountryName
|
|
||||||
|
Type class for the XML element GetCitiesByCountry.
|
||||||
=head1 Object structure
|
|
||||||
|
=head1 PROPERTIES
|
||||||
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
|
methods:
|
||||||
Structure as perl hash:
|
|
||||||
|
CountryName
|
||||||
The object structure is displayed as hash below though this is not correct.
|
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
=head1 Object structure
|
||||||
(look for classes of the same name in your typleib).
|
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
tree.
|
|
||||||
|
|
||||||
'GetCitiesByCountry'=> {
|
Structure as perl hash:
|
||||||
'CountryName' => $someValue,
|
|
||||||
},
|
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).
|
||||||
=cut
|
new() will accept a hash structure like this, but transform it to a object
|
||||||
|
tree.
|
||||||
|
|
||||||
|
'GetCitiesByCountry'=> {
|
||||||
|
'CountryName' => $someValue,
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,85 +1,93 @@
|
|||||||
package MyElements::GetCitiesByCountryResponse;
|
package MyElements::GetCitiesByCountryResponse;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
use SOAP::WSDL::XSD::Typelib::Element;
|
||||||
|
|
||||||
# atomic complexType
|
|
||||||
# <element name="GetCitiesByCountryResponse"><complexType> definition
|
# atomic complexType
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
# <element name="GetCitiesByCountryResponse"><complexType> definition
|
||||||
use base qw(
|
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
use base qw(
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
);
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
|
||||||
my %GetCitiesByCountryResult_of :ATTR(:get<GetCitiesByCountryResult>);
|
|
||||||
|
my %GetCitiesByCountryResult_of :ATTR(:get<GetCitiesByCountryResult>);
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
|
||||||
[ qw(
|
__PACKAGE__->_factory(
|
||||||
GetCitiesByCountryResult
|
[ qw(
|
||||||
) ],
|
GetCitiesByCountryResult
|
||||||
{
|
) ],
|
||||||
GetCitiesByCountryResult => \%GetCitiesByCountryResult_of,
|
{
|
||||||
|
GetCitiesByCountryResult => \%GetCitiesByCountryResult_of,
|
||||||
},
|
|
||||||
{
|
},
|
||||||
|
{
|
||||||
GetCitiesByCountryResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
GetCitiesByCountryResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
|
||||||
}
|
|
||||||
);
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.webserviceX.NET' }
|
|
||||||
|
sub get_xmlns { 'http://www.webserviceX.NET' }
|
||||||
__PACKAGE__->__set_name('GetCitiesByCountryResponse');
|
|
||||||
__PACKAGE__->__set_nillable();
|
__PACKAGE__->__set_name('GetCitiesByCountryResponse');
|
||||||
__PACKAGE__->__set_minOccurs();
|
__PACKAGE__->__set_nillable();
|
||||||
__PACKAGE__->__set_maxOccurs();
|
__PACKAGE__->__set_minOccurs();
|
||||||
__PACKAGE__->__set_ref('');
|
__PACKAGE__->__set_maxOccurs();
|
||||||
|
__PACKAGE__->__set_ref('');
|
||||||
1;
|
|
||||||
|
1;
|
||||||
|
|
||||||
__END__
|
|
||||||
|
__END__
|
||||||
=pod
|
|
||||||
|
|
||||||
=head1 NAME MyElements::GetCitiesByCountryResponse
|
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=pod
|
||||||
|
|
||||||
Type class for the XML element GetCitiesByCountryResponse.
|
=head1 NAME
|
||||||
|
|
||||||
=head1 PROPERTIES
|
MyElements::GetCitiesByCountryResponse
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
=head1 SYNOPSIS
|
||||||
methods:
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
GetCitiesByCountryResult
|
|
||||||
|
Type class for the XML element GetCitiesByCountryResponse.
|
||||||
=head1 Object structure
|
|
||||||
|
=head1 PROPERTIES
|
||||||
GetCitiesByCountryResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
|
methods:
|
||||||
Structure as perl hash:
|
|
||||||
|
GetCitiesByCountryResult
|
||||||
The object structure is displayed as hash below though this is not correct.
|
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
=head1 Object structure
|
||||||
(look for classes of the same name in your typleib).
|
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
GetCitiesByCountryResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
tree.
|
|
||||||
|
|
||||||
'GetCitiesByCountryResponse'=> {
|
Structure as perl hash:
|
||||||
'GetCitiesByCountryResult' => $someValue,
|
|
||||||
},
|
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).
|
||||||
=cut
|
new() will accept a hash structure like this, but transform it to a object
|
||||||
|
tree.
|
||||||
|
|
||||||
|
'GetCitiesByCountryResponse'=> {
|
||||||
|
'GetCitiesByCountryResult' => $someValue,
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,71 +1,71 @@
|
|||||||
package MyElements::GetFortuneCookie;
|
package MyElements::GetFortuneCookie;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
use SOAP::WSDL::XSD::Typelib::Element;
|
||||||
|
|
||||||
# atomic complexType
|
# atomic complexType
|
||||||
# <element name="GetFortuneCookie"><complexType> definition
|
# <element name="GetFortuneCookie"><complexType> definition
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
use SOAP::WSDL::XSD::Typelib::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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
__PACKAGE__->_factory(
|
||||||
[ qw() ],
|
[ qw() ],
|
||||||
{
|
{
|
||||||
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
||||||
|
|
||||||
__PACKAGE__->__set_name('GetFortuneCookie');
|
__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('');
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::GetFortuneCookie
|
=head1 NAME MyElements::GetFortuneCookie
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element GetFortuneCookie.
|
Type class for the XML element GetFortuneCookie.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 PROPERTIES
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
methods:
|
methods:
|
||||||
|
|
||||||
|
|
||||||
=head1 Object structure
|
=head1 Object structure
|
||||||
|
|
||||||
|
|
||||||
Structure as perl hash:
|
Structure as perl hash:
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
The object structure is displayed as hash below though this is not correct.
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
Complex hash elements actually are objects of their corresponding classes
|
||||||
(look for classes of the same name in your typleib).
|
(look for classes of the same name in your typleib).
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
new() will accept a hash structure like this, but transform it to a object
|
||||||
tree.
|
tree.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,85 +1,85 @@
|
|||||||
package MyElements::GetFortuneCookieResponse;
|
package MyElements::GetFortuneCookieResponse;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
use SOAP::WSDL::XSD::Typelib::Element;
|
||||||
|
|
||||||
# atomic complexType
|
# atomic complexType
|
||||||
# <element name="GetFortuneCookieResponse"><complexType> definition
|
# <element name="GetFortuneCookieResponse"><complexType> definition
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
use SOAP::WSDL::XSD::Typelib::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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
my %GetFortuneCookieResult_of :ATTR(:get<GetFortuneCookieResult>);
|
my %GetFortuneCookieResult_of :ATTR(:get<GetFortuneCookieResult>);
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
__PACKAGE__->_factory(
|
||||||
[ qw(
|
[ qw(
|
||||||
GetFortuneCookieResult
|
GetFortuneCookieResult
|
||||||
) ],
|
) ],
|
||||||
{
|
{
|
||||||
GetFortuneCookieResult => \%GetFortuneCookieResult_of,
|
GetFortuneCookieResult => \%GetFortuneCookieResult_of,
|
||||||
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
||||||
GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
||||||
|
|
||||||
__PACKAGE__->__set_name('GetFortuneCookieResponse');
|
__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('');
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::GetFortuneCookieResponse
|
=head1 NAME MyElements::GetFortuneCookieResponse
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element GetFortuneCookieResponse.
|
Type class for the XML element GetFortuneCookieResponse.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 PROPERTIES
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
methods:
|
methods:
|
||||||
|
|
||||||
GetFortuneCookieResult
|
GetFortuneCookieResult
|
||||||
|
|
||||||
=head1 Object structure
|
=head1 Object structure
|
||||||
|
|
||||||
GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
|
||||||
|
|
||||||
Structure as perl hash:
|
Structure as perl hash:
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
The object structure is displayed as hash below though this is not correct.
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
Complex hash elements actually are objects of their corresponding classes
|
||||||
(look for classes of the same name in your typleib).
|
(look for classes of the same name in your typleib).
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
new() will accept a hash structure like this, but transform it to a object
|
||||||
tree.
|
tree.
|
||||||
|
|
||||||
'GetFortuneCookieResponse'=> {
|
'GetFortuneCookieResponse'=> {
|
||||||
'GetFortuneCookieResult' => $someValue,
|
'GetFortuneCookieResult' => $someValue,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,85 +1,85 @@
|
|||||||
package MyElements::GetSpecificCookie;
|
package MyElements::GetSpecificCookie;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
use SOAP::WSDL::XSD::Typelib::Element;
|
||||||
|
|
||||||
# atomic complexType
|
# atomic complexType
|
||||||
# <element name="GetSpecificCookie"><complexType> definition
|
# <element name="GetSpecificCookie"><complexType> definition
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
use SOAP::WSDL::XSD::Typelib::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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
my %index_of :ATTR(:get<index>);
|
my %index_of :ATTR(:get<index>);
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
__PACKAGE__->_factory(
|
||||||
[ qw(
|
[ qw(
|
||||||
index
|
index
|
||||||
) ],
|
) ],
|
||||||
{
|
{
|
||||||
index => \%index_of,
|
index => \%index_of,
|
||||||
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
||||||
index => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
index => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
||||||
|
|
||||||
__PACKAGE__->__set_name('GetSpecificCookie');
|
__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('');
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::GetSpecificCookie
|
=head1 NAME MyElements::GetSpecificCookie
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element GetSpecificCookie.
|
Type class for the XML element GetSpecificCookie.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 PROPERTIES
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
methods:
|
methods:
|
||||||
|
|
||||||
index
|
index
|
||||||
|
|
||||||
=head1 Object structure
|
=head1 Object structure
|
||||||
|
|
||||||
index => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
index => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
|
||||||
|
|
||||||
Structure as perl hash:
|
Structure as perl hash:
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
The object structure is displayed as hash below though this is not correct.
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
Complex hash elements actually are objects of their corresponding classes
|
||||||
(look for classes of the same name in your typleib).
|
(look for classes of the same name in your typleib).
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
new() will accept a hash structure like this, but transform it to a object
|
||||||
tree.
|
tree.
|
||||||
|
|
||||||
'GetSpecificCookie'=> {
|
'GetSpecificCookie'=> {
|
||||||
'index' => $someValue,
|
'index' => $someValue,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,85 +1,85 @@
|
|||||||
package MyElements::GetSpecificCookieResponse;
|
package MyElements::GetSpecificCookieResponse;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
use SOAP::WSDL::XSD::Typelib::Element;
|
||||||
|
|
||||||
# atomic complexType
|
# atomic complexType
|
||||||
# <element name="GetSpecificCookieResponse"><complexType> definition
|
# <element name="GetSpecificCookieResponse"><complexType> definition
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
use SOAP::WSDL::XSD::Typelib::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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
my %GetSpecificCookieResult_of :ATTR(:get<GetSpecificCookieResult>);
|
my %GetSpecificCookieResult_of :ATTR(:get<GetSpecificCookieResult>);
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
__PACKAGE__->_factory(
|
||||||
[ qw(
|
[ qw(
|
||||||
GetSpecificCookieResult
|
GetSpecificCookieResult
|
||||||
) ],
|
) ],
|
||||||
{
|
{
|
||||||
GetSpecificCookieResult => \%GetSpecificCookieResult_of,
|
GetSpecificCookieResult => \%GetSpecificCookieResult_of,
|
||||||
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
||||||
GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
||||||
|
|
||||||
__PACKAGE__->__set_name('GetSpecificCookieResponse');
|
__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('');
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::GetSpecificCookieResponse
|
=head1 NAME MyElements::GetSpecificCookieResponse
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element GetSpecificCookieResponse.
|
Type class for the XML element GetSpecificCookieResponse.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 PROPERTIES
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
methods:
|
methods:
|
||||||
|
|
||||||
GetSpecificCookieResult
|
GetSpecificCookieResult
|
||||||
|
|
||||||
=head1 Object structure
|
=head1 Object structure
|
||||||
|
|
||||||
GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
|
||||||
|
|
||||||
Structure as perl hash:
|
Structure as perl hash:
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
The object structure is displayed as hash below though this is not correct.
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
Complex hash elements actually are objects of their corresponding classes
|
||||||
(look for classes of the same name in your typleib).
|
(look for classes of the same name in your typleib).
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
new() will accept a hash structure like this, but transform it to a object
|
||||||
tree.
|
tree.
|
||||||
|
|
||||||
'GetSpecificCookieResponse'=> {
|
'GetSpecificCookieResponse'=> {
|
||||||
'GetSpecificCookieResult' => $someValue,
|
'GetSpecificCookieResult' => $someValue,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,97 +1,105 @@
|
|||||||
package MyElements::GetWeather;
|
package MyElements::GetWeather;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
use SOAP::WSDL::XSD::Typelib::Element;
|
||||||
|
|
||||||
# atomic complexType
|
|
||||||
# <element name="GetWeather"><complexType> definition
|
# atomic complexType
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
# <element name="GetWeather"><complexType> definition
|
||||||
use base qw(
|
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
use base qw(
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
);
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
|
||||||
my %CityName_of :ATTR(:get<CityName>);
|
|
||||||
|
my %CityName_of :ATTR(:get<CityName>);
|
||||||
my %CountryName_of :ATTR(:get<CountryName>);
|
|
||||||
|
my %CountryName_of :ATTR(:get<CountryName>);
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
|
||||||
[ qw(
|
__PACKAGE__->_factory(
|
||||||
CityName
|
[ qw(
|
||||||
|
CityName
|
||||||
CountryName
|
|
||||||
) ],
|
CountryName
|
||||||
{
|
) ],
|
||||||
CityName => \%CityName_of,
|
{
|
||||||
CountryName => \%CountryName_of,
|
CityName => \%CityName_of,
|
||||||
|
CountryName => \%CountryName_of,
|
||||||
},
|
|
||||||
{
|
},
|
||||||
|
{
|
||||||
CityName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
CityName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
|
||||||
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
|
||||||
}
|
|
||||||
);
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.webserviceX.NET' }
|
|
||||||
|
sub get_xmlns { 'http://www.webserviceX.NET' }
|
||||||
__PACKAGE__->__set_name('GetWeather');
|
|
||||||
__PACKAGE__->__set_nillable();
|
__PACKAGE__->__set_name('GetWeather');
|
||||||
__PACKAGE__->__set_minOccurs();
|
__PACKAGE__->__set_nillable();
|
||||||
__PACKAGE__->__set_maxOccurs();
|
__PACKAGE__->__set_minOccurs();
|
||||||
__PACKAGE__->__set_ref('');
|
__PACKAGE__->__set_maxOccurs();
|
||||||
|
__PACKAGE__->__set_ref('');
|
||||||
1;
|
|
||||||
|
1;
|
||||||
|
|
||||||
__END__
|
|
||||||
|
__END__
|
||||||
=pod
|
|
||||||
|
|
||||||
=head1 NAME MyElements::GetWeather
|
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=pod
|
||||||
|
|
||||||
Type class for the XML element GetWeather.
|
=head1 NAME
|
||||||
|
|
||||||
=head1 PROPERTIES
|
MyElements::GetWeather
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
=head1 SYNOPSIS
|
||||||
methods:
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
CityName
|
|
||||||
CountryName
|
Type class for the XML element GetWeather.
|
||||||
|
|
||||||
=head1 Object structure
|
=head1 PROPERTIES
|
||||||
|
|
||||||
CityName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
|
methods:
|
||||||
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
CityName
|
||||||
|
CountryName
|
||||||
Structure as perl hash:
|
|
||||||
|
=head1 Object structure
|
||||||
The object structure is displayed as hash below though this is not correct.
|
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
CityName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
(look for classes of the same name in your typleib).
|
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
tree.
|
|
||||||
|
|
||||||
'GetWeather'=> {
|
Structure as perl hash:
|
||||||
'CityName' => $someValue,
|
|
||||||
'CountryName' => $someValue,
|
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
|
||||||
=cut
|
tree.
|
||||||
|
|
||||||
|
'GetWeather'=> {
|
||||||
|
'CityName' => $someValue,
|
||||||
|
'CountryName' => $someValue,
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,84 +1,93 @@
|
|||||||
package MyElements::GetWeatherResponse;
|
package MyElements::GetWeatherResponse;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
use SOAP::WSDL::XSD::Typelib::Element;
|
||||||
|
|
||||||
# atomic complexType
|
|
||||||
# <element name="GetWeatherResponse"><complexType> definition
|
# atomic complexType
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
# <element name="GetWeatherResponse"><complexType> definition
|
||||||
use base qw(
|
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
use base qw(
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
);
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
|
);
|
||||||
|
|
||||||
my %GetWeatherResult_of :ATTR(:get<GetWeatherResult>);
|
|
||||||
|
my %GetWeatherResult_of :ATTR(:get<GetWeatherResult>);
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
|
||||||
[ qw(
|
__PACKAGE__->_factory(
|
||||||
GetWeatherResult
|
[ qw(
|
||||||
) ],
|
GetWeatherResult
|
||||||
{
|
) ],
|
||||||
GetWeatherResult => \%GetWeatherResult_of,
|
{
|
||||||
|
GetWeatherResult => \%GetWeatherResult_of,
|
||||||
},
|
|
||||||
{
|
},
|
||||||
|
{
|
||||||
GetWeatherResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
|
||||||
|
GetWeatherResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
}
|
|
||||||
);
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.webserviceX.NET' }
|
|
||||||
|
|
||||||
__PACKAGE__->__set_name('GetWeatherResponse');
|
sub get_xmlns { 'http://www.webserviceX.NET' }
|
||||||
__PACKAGE__->__set_nillable();
|
|
||||||
__PACKAGE__->__set_minOccurs();
|
__PACKAGE__->__set_name('GetWeatherResponse');
|
||||||
__PACKAGE__->__set_maxOccurs();
|
__PACKAGE__->__set_nillable();
|
||||||
__PACKAGE__->__set_ref('');
|
__PACKAGE__->__set_minOccurs();
|
||||||
|
__PACKAGE__->__set_maxOccurs();
|
||||||
1;
|
__PACKAGE__->__set_ref('');
|
||||||
|
|
||||||
|
1;
|
||||||
__END__
|
|
||||||
|
|
||||||
=pod
|
__END__
|
||||||
|
|
||||||
=head1 NAME MyElements::GetWeatherResponse
|
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
|
||||||
|
=pod
|
||||||
Type class for the XML element GetWeatherResponse.
|
|
||||||
|
=head1 NAME
|
||||||
=head1 PROPERTIES
|
|
||||||
|
MyElements::GetWeatherResponse
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
|
||||||
methods:
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
GetWeatherResult
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
=head1 Object structure
|
Type class for the XML element GetWeatherResponse.
|
||||||
|
|
||||||
GetWeatherResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
=head1 PROPERTIES
|
||||||
|
|
||||||
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
Structure as perl hash:
|
methods:
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
GetWeatherResult
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
|
||||||
(look for classes of the same name in your typleib).
|
=head1 Object structure
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
|
||||||
tree.
|
GetWeatherResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
|
||||||
'GetWeatherResponse'=> {
|
|
||||||
'GetWeatherResult' => $someValue,
|
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
|
||||||
=cut
|
(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
|
||||||
|
|
||||||
|
|||||||
@@ -1,60 +1,60 @@
|
|||||||
package MyElements::int;
|
package MyElements::int;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
use SOAP::WSDL::XSD::Typelib::Element;
|
||||||
|
|
||||||
#
|
#
|
||||||
# <element name="int" type="s:int"/> definition
|
# <element name="int" type="s:int"/> definition
|
||||||
#
|
#
|
||||||
|
|
||||||
use base qw(
|
use base qw(
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::int
|
SOAP::WSDL::XSD::Typelib::Builtin::int
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
||||||
|
|
||||||
__PACKAGE__->__set_name('int');
|
__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('');
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::int
|
=head1 NAME MyElements::int
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element int.
|
Type class for the XML element int.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 PROPERTIES
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
methods:
|
methods:
|
||||||
|
|
||||||
|
|
||||||
=head1 Object structure
|
=head1 Object structure
|
||||||
|
|
||||||
|
|
||||||
Structure as perl hash:
|
Structure as perl hash:
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
The object structure is displayed as hash below though this is not correct.
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
Complex hash elements actually are objects of their corresponding classes
|
||||||
(look for classes of the same name in your typleib).
|
(look for classes of the same name in your typleib).
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
new() will accept a hash structure like this, but transform it to a object
|
||||||
tree.
|
tree.
|
||||||
|
|
||||||
'int' => $someValue,
|
'int' => $someValue,
|
||||||
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,71 +1,71 @@
|
|||||||
package MyElements::readNodeCount;
|
package MyElements::readNodeCount;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
use SOAP::WSDL::XSD::Typelib::Element;
|
||||||
|
|
||||||
# atomic complexType
|
# atomic complexType
|
||||||
# <element name="readNodeCount"><complexType> definition
|
# <element name="readNodeCount"><complexType> definition
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
use SOAP::WSDL::XSD::Typelib::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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
__PACKAGE__->_factory(
|
||||||
[ qw() ],
|
[ qw() ],
|
||||||
{
|
{
|
||||||
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
||||||
|
|
||||||
__PACKAGE__->__set_name('readNodeCount');
|
__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('');
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::readNodeCount
|
=head1 NAME MyElements::readNodeCount
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element readNodeCount.
|
Type class for the XML element readNodeCount.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 PROPERTIES
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
methods:
|
methods:
|
||||||
|
|
||||||
|
|
||||||
=head1 Object structure
|
=head1 Object structure
|
||||||
|
|
||||||
|
|
||||||
Structure as perl hash:
|
Structure as perl hash:
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
The object structure is displayed as hash below though this is not correct.
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
Complex hash elements actually are objects of their corresponding classes
|
||||||
(look for classes of the same name in your typleib).
|
(look for classes of the same name in your typleib).
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
new() will accept a hash structure like this, but transform it to a object
|
||||||
tree.
|
tree.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,85 +1,85 @@
|
|||||||
package MyElements::readNodeCountResponse;
|
package MyElements::readNodeCountResponse;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
use SOAP::WSDL::XSD::Typelib::Element;
|
||||||
|
|
||||||
# atomic complexType
|
# atomic complexType
|
||||||
# <element name="readNodeCountResponse"><complexType> definition
|
# <element name="readNodeCountResponse"><complexType> definition
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
use SOAP::WSDL::XSD::Typelib::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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
my %readNodeCountResult_of :ATTR(:get<readNodeCountResult>);
|
my %readNodeCountResult_of :ATTR(:get<readNodeCountResult>);
|
||||||
|
|
||||||
|
|
||||||
__PACKAGE__->_factory(
|
__PACKAGE__->_factory(
|
||||||
[ qw(
|
[ qw(
|
||||||
readNodeCountResult
|
readNodeCountResult
|
||||||
) ],
|
) ],
|
||||||
{
|
{
|
||||||
readNodeCountResult => \%readNodeCountResult_of,
|
readNodeCountResult => \%readNodeCountResult_of,
|
||||||
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
||||||
readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
|
||||||
|
|
||||||
__PACKAGE__->__set_name('readNodeCountResponse');
|
__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('');
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME MyElements::readNodeCountResponse
|
=head1 NAME MyElements::readNodeCountResponse
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element readNodeCountResponse.
|
Type class for the XML element readNodeCountResponse.
|
||||||
|
|
||||||
=head1 PROPERTIES
|
=head1 PROPERTIES
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
methods:
|
methods:
|
||||||
|
|
||||||
readNodeCountResult
|
readNodeCountResult
|
||||||
|
|
||||||
=head1 Object structure
|
=head1 Object structure
|
||||||
|
|
||||||
readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
|
||||||
|
|
||||||
Structure as perl hash:
|
Structure as perl hash:
|
||||||
|
|
||||||
The object structure is displayed as hash below though this is not correct.
|
The object structure is displayed as hash below though this is not correct.
|
||||||
Complex hash elements actually are objects of their corresponding classes
|
Complex hash elements actually are objects of their corresponding classes
|
||||||
(look for classes of the same name in your typleib).
|
(look for classes of the same name in your typleib).
|
||||||
new() will accept a hash structure like this, but transform it to a object
|
new() will accept a hash structure like this, but transform it to a object
|
||||||
tree.
|
tree.
|
||||||
|
|
||||||
'readNodeCountResponse'=> {
|
'readNodeCountResponse'=> {
|
||||||
'readNodeCountResult' => $someValue,
|
'readNodeCountResult' => $someValue,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,60 +1,68 @@
|
|||||||
package MyElements::string;
|
package MyElements::string;
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
use SOAP::WSDL::XSD::Typelib::Element;
|
||||||
|
|
||||||
#
|
|
||||||
# <element name="string" type="s:string"/> definition
|
#
|
||||||
#
|
# <element name="string" type="s:string"/> definition
|
||||||
|
#
|
||||||
use base qw(
|
|
||||||
SOAP::WSDL::XSD::Typelib::Element
|
use base qw(
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::string
|
SOAP::WSDL::XSD::Typelib::Element
|
||||||
);
|
SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||||
|
);
|
||||||
|
|
||||||
sub get_xmlns { 'http://www.webserviceX.NET' }
|
|
||||||
|
sub get_xmlns { 'http://www.webserviceX.NET' }
|
||||||
__PACKAGE__->__set_name('string');
|
|
||||||
__PACKAGE__->__set_nillable(true);
|
__PACKAGE__->__set_name('string');
|
||||||
__PACKAGE__->__set_minOccurs();
|
__PACKAGE__->__set_nillable(true);
|
||||||
__PACKAGE__->__set_maxOccurs();
|
__PACKAGE__->__set_minOccurs();
|
||||||
__PACKAGE__->__set_ref('');
|
__PACKAGE__->__set_maxOccurs();
|
||||||
|
__PACKAGE__->__set_ref('');
|
||||||
1;
|
|
||||||
|
1;
|
||||||
|
|
||||||
__END__
|
|
||||||
|
__END__
|
||||||
=pod
|
|
||||||
|
|
||||||
=head1 NAME MyElements::string
|
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=pod
|
||||||
|
|
||||||
Type class for the XML element string.
|
=head1 NAME
|
||||||
|
|
||||||
=head1 PROPERTIES
|
MyElements::string
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
=head1 SYNOPSIS
|
||||||
methods:
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
=head1 Object structure
|
Type class for the XML element string.
|
||||||
|
|
||||||
|
=head1 PROPERTIES
|
||||||
Structure as perl hash:
|
|
||||||
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
The object structure is displayed as hash below though this is not correct.
|
methods:
|
||||||
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
|
=head1 Object structure
|
||||||
tree.
|
|
||||||
|
|
||||||
'string' => $someValue,
|
Structure as perl hash:
|
||||||
|
|
||||||
|
The object structure is displayed as hash below though this is not correct.
|
||||||
=cut
|
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,
|
||||||
|
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,327 +1,327 @@
|
|||||||
package MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie;
|
package MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie;
|
use MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie;
|
||||||
use base 'SOAP::WSDL::Client::Base';
|
use base 'SOAP::WSDL::Client::Base';
|
||||||
|
|
||||||
sub new {
|
sub new {
|
||||||
my $class = shift;
|
my $class = shift;
|
||||||
my $arg_ref = shift || {};
|
my $arg_ref = shift || {};
|
||||||
my $self = $class->SUPER::new({
|
my $self = $class->SUPER::new({
|
||||||
class_resolver => 'MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie',
|
class_resolver => 'MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie',
|
||||||
proxy => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx',
|
proxy => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx',
|
||||||
%{ $arg_ref }
|
%{ $arg_ref }
|
||||||
});
|
});
|
||||||
return bless $self, $class;
|
return bless $self, $class;
|
||||||
}
|
}
|
||||||
|
|
||||||
__PACKAGE__->__create_methods(
|
__PACKAGE__->__create_methods(
|
||||||
GetSpecificCookie => [ 'MyElements::GetSpecificCookie', ],
|
GetSpecificCookie => [ 'MyElements::GetSpecificCookie', ],
|
||||||
CountCookies => [ 'MyElements::CountCookies', ],
|
CountCookies => [ 'MyElements::CountCookies', ],
|
||||||
readNodeCount => [ 'MyElements::readNodeCount', ],
|
readNodeCount => [ 'MyElements::readNodeCount', ],
|
||||||
GetFortuneCookie => [ 'MyElements::GetFortuneCookie', ],
|
GetFortuneCookie => [ 'MyElements::GetFortuneCookie', ],
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME
|
=head1 NAME
|
||||||
|
|
||||||
MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie - SOAP interface to FullerData_x0020_Fortune_x0020_Cookie at
|
MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie - SOAP interface to FullerData_x0020_Fortune_x0020_Cookie at
|
||||||
http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx
|
http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
my $interface = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie->new();
|
my $interface = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie->new();
|
||||||
my $CountCookies = $interface->CountCookies();
|
my $CountCookies = $interface->CountCookies();
|
||||||
|
|
||||||
|
|
||||||
=head1 Service FullerData_x0020_Fortune_x0020_Cookie
|
=head1 Service FullerData_x0020_Fortune_x0020_Cookie
|
||||||
|
|
||||||
=head2 Service information:
|
=head2 Service information:
|
||||||
|
|
||||||
Port name: FullerData_x0020_Fortune_x0020_CookieSoap
|
Port name: FullerData_x0020_Fortune_x0020_CookieSoap
|
||||||
Binding: tns:FullerData_x0020_Fortune_x0020_CookieSoap
|
Binding: tns:FullerData_x0020_Fortune_x0020_CookieSoap
|
||||||
Location: http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx
|
Location: http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx
|
||||||
|
|
||||||
=head2 SOAP Operations
|
=head2 SOAP Operations
|
||||||
|
|
||||||
B<Note:>
|
B<Note:>
|
||||||
|
|
||||||
Input, output and fault messages are stated as perl hash refs.
|
Input, output and fault messages are stated as perl hash refs.
|
||||||
|
|
||||||
These are only for informational purposes - the actual implementation
|
These are only for informational purposes - the actual implementation
|
||||||
normally uses object trees, not hash refs, though the input messages
|
normally uses object trees, not hash refs, though the input messages
|
||||||
may be passed to the respective methods as hash refs and will be
|
may be passed to the respective methods as hash refs and will be
|
||||||
converted to object trees automatically.
|
converted to object trees automatically.
|
||||||
|
|
||||||
|
|
||||||
=head3 readNodeCount
|
=head3 readNodeCount
|
||||||
|
|
||||||
B<Input Message:>
|
B<Input Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
B<Output Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
B<Fault:>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 GetFortuneCookie
|
=head3 GetFortuneCookie
|
||||||
|
|
||||||
B<Input Message:>
|
B<Input Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
B<Output Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
B<Fault:>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 CountCookies
|
=head3 CountCookies
|
||||||
|
|
||||||
B<Input Message:>
|
B<Input Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
B<Output Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
B<Fault:>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 GetSpecificCookie
|
=head3 GetSpecificCookie
|
||||||
|
|
||||||
B<Input Message:>
|
B<Input Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
B<Output Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
B<Fault:>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head2 Service information:
|
=head2 Service information:
|
||||||
|
|
||||||
Port name: FullerData_x0020_Fortune_x0020_CookieHttpGet
|
Port name: FullerData_x0020_Fortune_x0020_CookieHttpGet
|
||||||
Binding: tns:FullerData_x0020_Fortune_x0020_CookieHttpGet
|
Binding: tns:FullerData_x0020_Fortune_x0020_CookieHttpGet
|
||||||
Location:
|
Location:
|
||||||
|
|
||||||
=head2 SOAP Operations
|
=head2 SOAP Operations
|
||||||
|
|
||||||
B<Note:>
|
B<Note:>
|
||||||
|
|
||||||
Input, output and fault messages are stated as perl hash refs.
|
Input, output and fault messages are stated as perl hash refs.
|
||||||
|
|
||||||
These are only for informational purposes - the actual implementation
|
These are only for informational purposes - the actual implementation
|
||||||
normally uses object trees, not hash refs, though the input messages
|
normally uses object trees, not hash refs, though the input messages
|
||||||
may be passed to the respective methods as hash refs and will be
|
may be passed to the respective methods as hash refs and will be
|
||||||
converted to object trees automatically.
|
converted to object trees automatically.
|
||||||
|
|
||||||
|
|
||||||
=head3 readNodeCount
|
=head3 readNodeCount
|
||||||
|
|
||||||
B<Input Message:>
|
B<Input Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
B<Output Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
B<Fault:>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 GetFortuneCookie
|
=head3 GetFortuneCookie
|
||||||
|
|
||||||
B<Input Message:>
|
B<Input Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
B<Output Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
B<Fault:>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 CountCookies
|
=head3 CountCookies
|
||||||
|
|
||||||
B<Input Message:>
|
B<Input Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
B<Output Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
B<Fault:>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 GetSpecificCookie
|
=head3 GetSpecificCookie
|
||||||
|
|
||||||
B<Input Message:>
|
B<Input Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
B<Output Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
B<Fault:>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head2 Service information:
|
=head2 Service information:
|
||||||
|
|
||||||
Port name: FullerData_x0020_Fortune_x0020_CookieHttpPost
|
Port name: FullerData_x0020_Fortune_x0020_CookieHttpPost
|
||||||
Binding: tns:FullerData_x0020_Fortune_x0020_CookieHttpPost
|
Binding: tns:FullerData_x0020_Fortune_x0020_CookieHttpPost
|
||||||
Location:
|
Location:
|
||||||
|
|
||||||
=head2 SOAP Operations
|
=head2 SOAP Operations
|
||||||
|
|
||||||
B<Note:>
|
B<Note:>
|
||||||
|
|
||||||
Input, output and fault messages are stated as perl hash refs.
|
Input, output and fault messages are stated as perl hash refs.
|
||||||
|
|
||||||
These are only for informational purposes - the actual implementation
|
These are only for informational purposes - the actual implementation
|
||||||
normally uses object trees, not hash refs, though the input messages
|
normally uses object trees, not hash refs, though the input messages
|
||||||
may be passed to the respective methods as hash refs and will be
|
may be passed to the respective methods as hash refs and will be
|
||||||
converted to object trees automatically.
|
converted to object trees automatically.
|
||||||
|
|
||||||
|
|
||||||
=head3 readNodeCount
|
=head3 readNodeCount
|
||||||
|
|
||||||
B<Input Message:>
|
B<Input Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
B<Output Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
B<Fault:>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 GetFortuneCookie
|
=head3 GetFortuneCookie
|
||||||
|
|
||||||
B<Input Message:>
|
B<Input Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
B<Output Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
B<Fault:>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 CountCookies
|
=head3 CountCookies
|
||||||
|
|
||||||
B<Input Message:>
|
B<Input Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
B<Output Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
B<Fault:>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head3 GetSpecificCookie
|
=head3 GetSpecificCookie
|
||||||
|
|
||||||
B<Input Message:>
|
B<Input Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Output Message:>
|
B<Output Message:>
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B<Fault:>
|
B<Fault:>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
@@ -1,68 +1,83 @@
|
|||||||
package MyInterfaces::GlobalWeather;
|
package MyInterfaces::GlobalWeather;
|
||||||
use strict;
|
|
||||||
use warnings;
|
use strict;
|
||||||
use MyTypemaps::GlobalWeather;
|
use warnings;
|
||||||
use base 'SOAP::WSDL::Client::Base';
|
use MyTypemaps::GlobalWeather;
|
||||||
|
use base 'SOAP::WSDL::Client::Base';
|
||||||
sub new {
|
|
||||||
my $class = shift;
|
sub new {
|
||||||
my $arg_ref = shift || {};
|
my $class = shift;
|
||||||
my $self = $class->SUPER::new({
|
my $arg_ref = shift || {};
|
||||||
class_resolver => 'MyTypemaps::GlobalWeather',
|
my $self = $class->SUPER::new({
|
||||||
proxy => 'http://www.webservicex.net/globalweather.asmx',
|
class_resolver => 'MyTypemaps::GlobalWeather',
|
||||||
%{ $arg_ref }
|
proxy => 'http://www.webservicex.net/globalweather.asmx',
|
||||||
});
|
%{ $arg_ref }
|
||||||
return bless $self, $class;
|
});
|
||||||
}
|
return bless $self, $class;
|
||||||
|
}
|
||||||
__PACKAGE__->__create_methods(
|
|
||||||
GetWeather => [ 'MyElements::GetWeather', ],
|
__PACKAGE__->__create_methods(
|
||||||
GetCitiesByCountry => [ 'MyElements::GetCitiesByCountry', ],
|
GetWeather => {
|
||||||
|
parts => [ 'MyElements::GetWeather', ],
|
||||||
);
|
soap_action => 'http://www.webserviceX.NET/GetWeather',
|
||||||
|
style => 'document',
|
||||||
1;
|
# use => '', # use not implemented yet
|
||||||
|
},
|
||||||
__END__
|
GetCitiesByCountry => {
|
||||||
|
parts => [ 'MyElements::GetCitiesByCountry', ],
|
||||||
=pod
|
soap_action => 'http://www.webserviceX.NET/GetCitiesByCountry',
|
||||||
|
style => 'document',
|
||||||
=head1 NAME
|
# use => '', # use not implemented yet
|
||||||
|
},
|
||||||
MyInterfaces::GlobalWeather - SOAP interface to GlobalWeather at
|
|
||||||
http://www.webservicex.net/globalweather.asmx
|
);
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
1;
|
||||||
|
|
||||||
my $interface = MyInterfaces::GlobalWeather->new();
|
__END__
|
||||||
my $GetCitiesByCountry = $interface->GetCitiesByCountry();
|
|
||||||
|
|
||||||
|
|
||||||
=head1 METHODS
|
|
||||||
|
|
||||||
=head2 GetWeather
|
=pod
|
||||||
|
|
||||||
Get weather report for all major cities around the world.
|
=head1 NAME
|
||||||
|
|
||||||
SYNOPSIS:
|
MyInterfaces::GlobalWeather - SOAP interface to GlobalWeather at
|
||||||
|
http://www.webservicex.net/globalweather.asmx
|
||||||
$service->GetWeather({
|
|
||||||
'CityName' => $someValue,
|
=head1 SYNOPSIS
|
||||||
'CountryName' => $someValue,
|
|
||||||
});
|
my $interface = MyInterfaces::GlobalWeather->new();
|
||||||
|
my $GetCitiesByCountry = $interface->GetCitiesByCountry();
|
||||||
|
|
||||||
=head2 GetCitiesByCountry
|
|
||||||
|
=head1 METHODS
|
||||||
Get all major cities by country name(full / part).
|
|
||||||
|
=head2 GetWeather
|
||||||
SYNOPSIS:
|
|
||||||
|
Get weather report for all major cities around the world.
|
||||||
$service->GetCitiesByCountry({
|
|
||||||
'CountryName' => $someValue,
|
SYNOPSIS:
|
||||||
});
|
|
||||||
|
$service->GetWeather({
|
||||||
|
'CityName' => $someValue,
|
||||||
|
'CountryName' => $someValue,
|
||||||
=cut
|
});
|
||||||
|
|
||||||
|
|
||||||
|
=head2 GetCitiesByCountry
|
||||||
|
|
||||||
|
Get all major cities by country name(full / part).
|
||||||
|
|
||||||
|
SYNOPSIS:
|
||||||
|
|
||||||
|
$service->GetCitiesByCountry({
|
||||||
|
'CountryName' => $someValue,
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
|||||||
@@ -1,49 +1,49 @@
|
|||||||
package MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie;
|
package MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
my %typemap = (
|
my %typemap = (
|
||||||
'readNodeCount' => 'MyElements::readNodeCount',
|
'readNodeCount' => 'MyElements::readNodeCount',
|
||||||
'readNodeCountResponse' => 'MyElements::readNodeCountResponse',
|
'readNodeCountResponse' => 'MyElements::readNodeCountResponse',
|
||||||
# atomic complex type (sequence)
|
# atomic complex type (sequence)
|
||||||
'readNodeCountResponse/readNodeCountResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
'readNodeCountResponse/readNodeCountResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
|
||||||
# end atomic complex type (sequence)
|
# end atomic complex type (sequence)
|
||||||
'GetFortuneCookie' => 'MyElements::GetFortuneCookie',
|
'GetFortuneCookie' => 'MyElements::GetFortuneCookie',
|
||||||
'GetFortuneCookieResponse' => 'MyElements::GetFortuneCookieResponse',
|
'GetFortuneCookieResponse' => 'MyElements::GetFortuneCookieResponse',
|
||||||
# atomic complex type (sequence)
|
# atomic complex type (sequence)
|
||||||
'GetFortuneCookieResponse/GetFortuneCookieResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'GetFortuneCookieResponse/GetFortuneCookieResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
|
||||||
# end atomic complex type (sequence)
|
# end atomic complex type (sequence)
|
||||||
'CountCookies' => 'MyElements::CountCookies',
|
'CountCookies' => 'MyElements::CountCookies',
|
||||||
'CountCookiesResponse' => 'MyElements::CountCookiesResponse',
|
'CountCookiesResponse' => 'MyElements::CountCookiesResponse',
|
||||||
# atomic complex type (sequence)
|
# atomic complex type (sequence)
|
||||||
'CountCookiesResponse/CountCookiesResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
'CountCookiesResponse/CountCookiesResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
|
||||||
# end atomic complex type (sequence)
|
# end atomic complex type (sequence)
|
||||||
'GetSpecificCookie' => 'MyElements::GetSpecificCookie',
|
'GetSpecificCookie' => 'MyElements::GetSpecificCookie',
|
||||||
# atomic complex type (sequence)
|
# atomic complex type (sequence)
|
||||||
'GetSpecificCookie/index' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
'GetSpecificCookie/index' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
|
||||||
|
|
||||||
# end atomic complex type (sequence)
|
# end atomic complex type (sequence)
|
||||||
'GetSpecificCookieResponse' => 'MyElements::GetSpecificCookieResponse',
|
'GetSpecificCookieResponse' => 'MyElements::GetSpecificCookieResponse',
|
||||||
# atomic complex type (sequence)
|
# atomic complex type (sequence)
|
||||||
'GetSpecificCookieResponse/GetSpecificCookieResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'GetSpecificCookieResponse/GetSpecificCookieResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
|
||||||
# end atomic complex type (sequence)
|
# 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{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
|
||||||
return $typemap{ $name };
|
return $typemap{ $name };
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
|
|||||||
@@ -1,50 +1,50 @@
|
|||||||
package MyTypemaps::GlobalWeather;
|
package MyTypemaps::GlobalWeather;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
my %typemap = (
|
my %typemap = (
|
||||||
# SOAP 1.1 fault typemap
|
# SOAP 1.1 fault typemap
|
||||||
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
|
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
|
||||||
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
||||||
'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',
|
||||||
|
|
||||||
# generated typemap
|
# generated typemap
|
||||||
'GetWeather' => 'MyElements::GetWeather',
|
'GetWeather' => 'MyElements::GetWeather',
|
||||||
# atomic complex type (sequence)
|
# atomic complex type (sequence)
|
||||||
'GetWeather/CityName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'GetWeather/CityName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
'GetWeather/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'GetWeather/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
|
||||||
# end atomic complex type (sequence)
|
# end atomic complex type (sequence)
|
||||||
'GetWeatherResponse' => 'MyElements::GetWeatherResponse',
|
'GetWeatherResponse' => 'MyElements::GetWeatherResponse',
|
||||||
# atomic complex type (sequence)
|
# atomic complex type (sequence)
|
||||||
'GetWeatherResponse/GetWeatherResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'GetWeatherResponse/GetWeatherResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
|
||||||
# end atomic complex type (sequence)
|
# end atomic complex type (sequence)
|
||||||
'GetCitiesByCountry' => 'MyElements::GetCitiesByCountry',
|
'GetCitiesByCountry' => 'MyElements::GetCitiesByCountry',
|
||||||
# atomic complex type (sequence)
|
# atomic complex type (sequence)
|
||||||
'GetCitiesByCountry/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'GetCitiesByCountry/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
|
||||||
# end atomic complex type (sequence)
|
# end atomic complex type (sequence)
|
||||||
'GetCitiesByCountryResponse' => 'MyElements::GetCitiesByCountryResponse',
|
'GetCitiesByCountryResponse' => 'MyElements::GetCitiesByCountryResponse',
|
||||||
# atomic complex type (sequence)
|
# atomic complex type (sequence)
|
||||||
'GetCitiesByCountryResponse/GetCitiesByCountryResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'GetCitiesByCountryResponse/GetCitiesByCountryResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
|
||||||
# end atomic complex type (sequence)
|
# 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{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
|
||||||
return $typemap{ $name };
|
return $typemap{ $name };
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
|
|||||||
+20
-19
@@ -1,19 +1,20 @@
|
|||||||
# Accessing the globalweather service at
|
# Accessing the globalweather service at
|
||||||
# www.webservicex.net/GlobalWeather/GlobalWeather.asmx
|
# www.webservicex.net/GlobalWeather/GlobalWeather.asmx
|
||||||
#
|
#
|
||||||
# Note that the GlobalWeather web service returns a (quoted) XML structure -
|
# Note that the GlobalWeather web service returns a (quoted) XML structure -
|
||||||
# don't be surprised by the response's format.
|
# don't be surprised by the response's format.
|
||||||
#
|
#
|
||||||
# I have no connection to www.webservicex.net
|
# I have no connection to www.webservicex.net
|
||||||
# Use this script at your own risk.
|
# Use this script at your own risk.
|
||||||
#
|
#
|
||||||
# This script demonstrates the use of a interface generated by wsdl2perl.pl
|
# This script demonstrates the use of a interface generated by wsdl2perl.pl
|
||||||
|
|
||||||
use lib 'lib/';
|
use lib 'lib/';
|
||||||
use MyInterfaces::GlobalWeather;
|
use MyInterfaces::GlobalWeather;
|
||||||
my $weather = MyInterfaces::GlobalWeather->new();
|
my $weather = MyInterfaces::GlobalWeather->new();
|
||||||
my $result = $weather->GetWeather({ CountryName => 'Germany', CityName => 'Munich' });
|
my $result = $weather->GetWeather({ CountryName => 'Germany', CityName => 'Munich' });
|
||||||
|
|
||||||
die $result->get_faultstring()->get_value() if not ($result); # boolean comparison overloaded
|
# boolean comparison overloaded
|
||||||
|
die $result->get_faultstring()->get_value() if not ($result);
|
||||||
print $result->get_GetWeatherResult()->get_value() , "\n";
|
|
||||||
|
print $result->get_GetWeatherResult()->get_value() , "\n";
|
||||||
|
|||||||
+43
-25
@@ -1,25 +1,43 @@
|
|||||||
# Accessing the globalweather service at
|
# Accessing the globalweather service at
|
||||||
# www.webservicex.net/GlobalWeather/GlobalWeather.asmx
|
# www.webservicex.net/GlobalWeather/GlobalWeather.asmx
|
||||||
#
|
#
|
||||||
# Note that the GlobalWeather web service returns a (quoted) XML structure -
|
# Note that the GlobalWeather web service returns a (quoted) XML structure -
|
||||||
# don't be surprised by the response's format.
|
# don't be surprised by the response's format.
|
||||||
#
|
#
|
||||||
# I have no connection to www.webservicex.net
|
# I have no connection to www.webservicex.net
|
||||||
# Use this script at your own risk.
|
# Use this script at your own risk.
|
||||||
#
|
#
|
||||||
# This script demonstrates the use of SOAP::WSDL in SOAP::Lite style.
|
# This script demonstrates the use of SOAP::WSDL in SOAP::Lite style.
|
||||||
|
|
||||||
use lib 'lib/';
|
use lib 'lib/';
|
||||||
use lib '../lib';
|
use lib '../lib';
|
||||||
use SOAP::WSDL;
|
use File::Basename qw(dirname);
|
||||||
use File::Basename qw(dirname);
|
use File::Spec;
|
||||||
use File::Spec;
|
my $path = File::Spec->rel2abs( dirname __FILE__);
|
||||||
my $path = File::Spec->rel2abs( dirname __FILE__);
|
|
||||||
|
# SOAP::WSDL variant
|
||||||
my $soap = SOAP::WSDL->new();
|
use SOAP::WSDL;
|
||||||
my $som = $soap->wsdl("file:///$path/wsdl/globalweather.xml")
|
my $soap = SOAP::WSDL->new();
|
||||||
->call('GetWeather', GetWeather => { CountryName => 'Germany', CityName => 'Munich' });
|
my $som = $soap->wsdl("file:///$path/wsdl/globalweather.xml")
|
||||||
|
->call('GetWeather', GetWeather =>
|
||||||
die $som->message() if $som->fault();
|
{ CountryName => 'Germany', CityName => 'Munich' }
|
||||||
|
);
|
||||||
print $som->result();
|
|
||||||
|
die "Error" if $som->fault();
|
||||||
|
print $som->result();
|
||||||
|
|
||||||
|
# SOAP::Lite variant:
|
||||||
|
# Note that you have to look both the proxy and the xmlns attribute
|
||||||
|
# set on the GetWeather SOAP::Data object from the WSDL.
|
||||||
|
|
||||||
|
use SOAP::Lite; # +trace;
|
||||||
|
my $soap = SOAP::Lite->new()->on_action( sub { join'/', @_ } )
|
||||||
|
->proxy("http://www.webservicex.net/globalweather.asmx"); # from WSDL
|
||||||
|
my $som = $soap->call(
|
||||||
|
SOAP::Data->name('GetWeather')
|
||||||
|
->attr({ xmlns => 'http://www.webserviceX.NET' }), # from WSDL
|
||||||
|
SOAP::Data->name('CountryName')->value('Germany'),
|
||||||
|
SOAP::Data->name('CityName')->value('Munich')
|
||||||
|
);
|
||||||
|
die "Error" if $som->fault();
|
||||||
|
print $som->result();
|
||||||
|
|||||||
+307
-307
@@ -1,308 +1,308 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?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.fullerdata.com/FortuneCookie/FortuneCookie.asmx" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
|
<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.fullerdata.com/FortuneCookie/FortuneCookie.asmx" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
|
||||||
<wsdl:types>
|
<wsdl:types>
|
||||||
<s:schema elementFormDefault="qualified" targetNamespace="http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx">
|
<s:schema elementFormDefault="qualified" targetNamespace="http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx">
|
||||||
<s:element name="readNodeCount">
|
<s:element name="readNodeCount">
|
||||||
<s:complexType />
|
<s:complexType />
|
||||||
</s:element>
|
</s:element>
|
||||||
<s:element name="readNodeCountResponse">
|
<s:element name="readNodeCountResponse">
|
||||||
<s:complexType>
|
<s:complexType>
|
||||||
<s:sequence>
|
<s:sequence>
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="readNodeCountResult" type="s:int" />
|
<s:element minOccurs="1" maxOccurs="1" name="readNodeCountResult" type="s:int" />
|
||||||
</s:sequence>
|
</s:sequence>
|
||||||
</s:complexType>
|
</s:complexType>
|
||||||
</s:element>
|
</s:element>
|
||||||
<s:element name="GetFortuneCookie">
|
<s:element name="GetFortuneCookie">
|
||||||
<s:complexType />
|
<s:complexType />
|
||||||
</s:element>
|
</s:element>
|
||||||
<s:element name="GetFortuneCookieResponse">
|
<s:element name="GetFortuneCookieResponse">
|
||||||
<s:complexType>
|
<s:complexType>
|
||||||
<s:sequence>
|
<s:sequence>
|
||||||
<s:element minOccurs="0" maxOccurs="1" name="GetFortuneCookieResult" type="s:string" />
|
<s:element minOccurs="0" maxOccurs="1" name="GetFortuneCookieResult" type="s:string" />
|
||||||
</s:sequence>
|
</s:sequence>
|
||||||
</s:complexType>
|
</s:complexType>
|
||||||
</s:element>
|
</s:element>
|
||||||
<s:element name="CountCookies">
|
<s:element name="CountCookies">
|
||||||
<s:complexType />
|
<s:complexType />
|
||||||
</s:element>
|
</s:element>
|
||||||
<s:element name="CountCookiesResponse">
|
<s:element name="CountCookiesResponse">
|
||||||
<s:complexType>
|
<s:complexType>
|
||||||
<s:sequence>
|
<s:sequence>
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="CountCookiesResult" type="s:int" />
|
<s:element minOccurs="1" maxOccurs="1" name="CountCookiesResult" type="s:int" />
|
||||||
</s:sequence>
|
</s:sequence>
|
||||||
</s:complexType>
|
</s:complexType>
|
||||||
</s:element>
|
</s:element>
|
||||||
<s:element name="GetSpecificCookie">
|
<s:element name="GetSpecificCookie">
|
||||||
<s:complexType>
|
<s:complexType>
|
||||||
<s:sequence>
|
<s:sequence>
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="index" type="s:int" />
|
<s:element minOccurs="1" maxOccurs="1" name="index" type="s:int" />
|
||||||
</s:sequence>
|
</s:sequence>
|
||||||
</s:complexType>
|
</s:complexType>
|
||||||
</s:element>
|
</s:element>
|
||||||
<s:element name="GetSpecificCookieResponse">
|
<s:element name="GetSpecificCookieResponse">
|
||||||
<s:complexType>
|
<s:complexType>
|
||||||
<s:sequence>
|
<s:sequence>
|
||||||
<s:element minOccurs="0" maxOccurs="1" name="GetSpecificCookieResult" type="s:string" />
|
<s:element minOccurs="0" maxOccurs="1" name="GetSpecificCookieResult" type="s:string" />
|
||||||
</s:sequence>
|
</s:sequence>
|
||||||
</s:complexType>
|
</s:complexType>
|
||||||
</s:element>
|
</s:element>
|
||||||
<s:element name="int" type="s:int" />
|
<s:element name="int" type="s:int" />
|
||||||
<s:element name="string" nillable="true" type="s:string" />
|
<s:element name="string" nillable="true" type="s:string" />
|
||||||
</s:schema>
|
</s:schema>
|
||||||
</wsdl:types>
|
</wsdl:types>
|
||||||
<wsdl:message name="readNodeCountSoapIn">
|
<wsdl:message name="readNodeCountSoapIn">
|
||||||
<wsdl:part name="parameters" element="tns:readNodeCount" />
|
<wsdl:part name="parameters" element="tns:readNodeCount" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="readNodeCountSoapOut">
|
<wsdl:message name="readNodeCountSoapOut">
|
||||||
<wsdl:part name="parameters" element="tns:readNodeCountResponse" />
|
<wsdl:part name="parameters" element="tns:readNodeCountResponse" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetFortuneCookieSoapIn">
|
<wsdl:message name="GetFortuneCookieSoapIn">
|
||||||
<wsdl:part name="parameters" element="tns:GetFortuneCookie" />
|
<wsdl:part name="parameters" element="tns:GetFortuneCookie" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetFortuneCookieSoapOut">
|
<wsdl:message name="GetFortuneCookieSoapOut">
|
||||||
<wsdl:part name="parameters" element="tns:GetFortuneCookieResponse" />
|
<wsdl:part name="parameters" element="tns:GetFortuneCookieResponse" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="CountCookiesSoapIn">
|
<wsdl:message name="CountCookiesSoapIn">
|
||||||
<wsdl:part name="parameters" element="tns:CountCookies" />
|
<wsdl:part name="parameters" element="tns:CountCookies" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="CountCookiesSoapOut">
|
<wsdl:message name="CountCookiesSoapOut">
|
||||||
<wsdl:part name="parameters" element="tns:CountCookiesResponse" />
|
<wsdl:part name="parameters" element="tns:CountCookiesResponse" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetSpecificCookieSoapIn">
|
<wsdl:message name="GetSpecificCookieSoapIn">
|
||||||
<wsdl:part name="parameters" element="tns:GetSpecificCookie" />
|
<wsdl:part name="parameters" element="tns:GetSpecificCookie" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetSpecificCookieSoapOut">
|
<wsdl:message name="GetSpecificCookieSoapOut">
|
||||||
<wsdl:part name="parameters" element="tns:GetSpecificCookieResponse" />
|
<wsdl:part name="parameters" element="tns:GetSpecificCookieResponse" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="readNodeCountHttpGetIn" />
|
<wsdl:message name="readNodeCountHttpGetIn" />
|
||||||
<wsdl:message name="readNodeCountHttpGetOut">
|
<wsdl:message name="readNodeCountHttpGetOut">
|
||||||
<wsdl:part name="Body" element="tns:int" />
|
<wsdl:part name="Body" element="tns:int" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetFortuneCookieHttpGetIn" />
|
<wsdl:message name="GetFortuneCookieHttpGetIn" />
|
||||||
<wsdl:message name="GetFortuneCookieHttpGetOut">
|
<wsdl:message name="GetFortuneCookieHttpGetOut">
|
||||||
<wsdl:part name="Body" element="tns:string" />
|
<wsdl:part name="Body" element="tns:string" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="CountCookiesHttpGetIn" />
|
<wsdl:message name="CountCookiesHttpGetIn" />
|
||||||
<wsdl:message name="CountCookiesHttpGetOut">
|
<wsdl:message name="CountCookiesHttpGetOut">
|
||||||
<wsdl:part name="Body" element="tns:int" />
|
<wsdl:part name="Body" element="tns:int" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetSpecificCookieHttpGetIn">
|
<wsdl:message name="GetSpecificCookieHttpGetIn">
|
||||||
<wsdl:part name="index" type="s:string" />
|
<wsdl:part name="index" type="s:string" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetSpecificCookieHttpGetOut">
|
<wsdl:message name="GetSpecificCookieHttpGetOut">
|
||||||
<wsdl:part name="Body" element="tns:string" />
|
<wsdl:part name="Body" element="tns:string" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="readNodeCountHttpPostIn" />
|
<wsdl:message name="readNodeCountHttpPostIn" />
|
||||||
<wsdl:message name="readNodeCountHttpPostOut">
|
<wsdl:message name="readNodeCountHttpPostOut">
|
||||||
<wsdl:part name="Body" element="tns:int" />
|
<wsdl:part name="Body" element="tns:int" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetFortuneCookieHttpPostIn" />
|
<wsdl:message name="GetFortuneCookieHttpPostIn" />
|
||||||
<wsdl:message name="GetFortuneCookieHttpPostOut">
|
<wsdl:message name="GetFortuneCookieHttpPostOut">
|
||||||
<wsdl:part name="Body" element="tns:string" />
|
<wsdl:part name="Body" element="tns:string" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="CountCookiesHttpPostIn" />
|
<wsdl:message name="CountCookiesHttpPostIn" />
|
||||||
<wsdl:message name="CountCookiesHttpPostOut">
|
<wsdl:message name="CountCookiesHttpPostOut">
|
||||||
<wsdl:part name="Body" element="tns:int" />
|
<wsdl:part name="Body" element="tns:int" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetSpecificCookieHttpPostIn">
|
<wsdl:message name="GetSpecificCookieHttpPostIn">
|
||||||
<wsdl:part name="index" type="s:string" />
|
<wsdl:part name="index" type="s:string" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetSpecificCookieHttpPostOut">
|
<wsdl:message name="GetSpecificCookieHttpPostOut">
|
||||||
<wsdl:part name="Body" element="tns:string" />
|
<wsdl:part name="Body" element="tns:string" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:portType name="FullerData_x0020_Fortune_x0020_CookieSoap">
|
<wsdl:portType name="FullerData_x0020_Fortune_x0020_CookieSoap">
|
||||||
<wsdl:operation name="readNodeCount">
|
<wsdl:operation name="readNodeCount">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Display the number of nodes specified in fortune XML document</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Display the number of nodes specified in fortune XML document</documentation>
|
||||||
<wsdl:input message="tns:readNodeCountSoapIn" />
|
<wsdl:input message="tns:readNodeCountSoapIn" />
|
||||||
<wsdl:output message="tns:readNodeCountSoapOut" />
|
<wsdl:output message="tns:readNodeCountSoapOut" />
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="GetFortuneCookie">
|
<wsdl:operation name="GetFortuneCookie">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get a random fortune cookie from the XML document</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get a random fortune cookie from the XML document</documentation>
|
||||||
<wsdl:input message="tns:GetFortuneCookieSoapIn" />
|
<wsdl:input message="tns:GetFortuneCookieSoapIn" />
|
||||||
<wsdl:output message="tns:GetFortuneCookieSoapOut" />
|
<wsdl:output message="tns:GetFortuneCookieSoapOut" />
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="CountCookies">
|
<wsdl:operation name="CountCookies">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Count the actual number of nodes in the XML document of fortunes</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Count the actual number of nodes in the XML document of fortunes</documentation>
|
||||||
<wsdl:input message="tns:CountCookiesSoapIn" />
|
<wsdl:input message="tns:CountCookiesSoapIn" />
|
||||||
<wsdl:output message="tns:CountCookiesSoapOut" />
|
<wsdl:output message="tns:CountCookiesSoapOut" />
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="GetSpecificCookie">
|
<wsdl:operation name="GetSpecificCookie">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get a specific cookie by the XML node number</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get a specific cookie by the XML node number</documentation>
|
||||||
<wsdl:input message="tns:GetSpecificCookieSoapIn" />
|
<wsdl:input message="tns:GetSpecificCookieSoapIn" />
|
||||||
<wsdl:output message="tns:GetSpecificCookieSoapOut" />
|
<wsdl:output message="tns:GetSpecificCookieSoapOut" />
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
</wsdl:portType>
|
</wsdl:portType>
|
||||||
<wsdl:portType name="FullerData_x0020_Fortune_x0020_CookieHttpGet">
|
<wsdl:portType name="FullerData_x0020_Fortune_x0020_CookieHttpGet">
|
||||||
<wsdl:operation name="readNodeCount">
|
<wsdl:operation name="readNodeCount">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Display the number of nodes specified in fortune XML document</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Display the number of nodes specified in fortune XML document</documentation>
|
||||||
<wsdl:input message="tns:readNodeCountHttpGetIn" />
|
<wsdl:input message="tns:readNodeCountHttpGetIn" />
|
||||||
<wsdl:output message="tns:readNodeCountHttpGetOut" />
|
<wsdl:output message="tns:readNodeCountHttpGetOut" />
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="GetFortuneCookie">
|
<wsdl:operation name="GetFortuneCookie">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get a random fortune cookie from the XML document</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get a random fortune cookie from the XML document</documentation>
|
||||||
<wsdl:input message="tns:GetFortuneCookieHttpGetIn" />
|
<wsdl:input message="tns:GetFortuneCookieHttpGetIn" />
|
||||||
<wsdl:output message="tns:GetFortuneCookieHttpGetOut" />
|
<wsdl:output message="tns:GetFortuneCookieHttpGetOut" />
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="CountCookies">
|
<wsdl:operation name="CountCookies">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Count the actual number of nodes in the XML document of fortunes</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Count the actual number of nodes in the XML document of fortunes</documentation>
|
||||||
<wsdl:input message="tns:CountCookiesHttpGetIn" />
|
<wsdl:input message="tns:CountCookiesHttpGetIn" />
|
||||||
<wsdl:output message="tns:CountCookiesHttpGetOut" />
|
<wsdl:output message="tns:CountCookiesHttpGetOut" />
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="GetSpecificCookie">
|
<wsdl:operation name="GetSpecificCookie">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get a specific cookie by the XML node number</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get a specific cookie by the XML node number</documentation>
|
||||||
<wsdl:input message="tns:GetSpecificCookieHttpGetIn" />
|
<wsdl:input message="tns:GetSpecificCookieHttpGetIn" />
|
||||||
<wsdl:output message="tns:GetSpecificCookieHttpGetOut" />
|
<wsdl:output message="tns:GetSpecificCookieHttpGetOut" />
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
</wsdl:portType>
|
</wsdl:portType>
|
||||||
<wsdl:portType name="FullerData_x0020_Fortune_x0020_CookieHttpPost">
|
<wsdl:portType name="FullerData_x0020_Fortune_x0020_CookieHttpPost">
|
||||||
<wsdl:operation name="readNodeCount">
|
<wsdl:operation name="readNodeCount">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Display the number of nodes specified in fortune XML document</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Display the number of nodes specified in fortune XML document</documentation>
|
||||||
<wsdl:input message="tns:readNodeCountHttpPostIn" />
|
<wsdl:input message="tns:readNodeCountHttpPostIn" />
|
||||||
<wsdl:output message="tns:readNodeCountHttpPostOut" />
|
<wsdl:output message="tns:readNodeCountHttpPostOut" />
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="GetFortuneCookie">
|
<wsdl:operation name="GetFortuneCookie">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get a random fortune cookie from the XML document</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get a random fortune cookie from the XML document</documentation>
|
||||||
<wsdl:input message="tns:GetFortuneCookieHttpPostIn" />
|
<wsdl:input message="tns:GetFortuneCookieHttpPostIn" />
|
||||||
<wsdl:output message="tns:GetFortuneCookieHttpPostOut" />
|
<wsdl:output message="tns:GetFortuneCookieHttpPostOut" />
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="CountCookies">
|
<wsdl:operation name="CountCookies">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Count the actual number of nodes in the XML document of fortunes</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Count the actual number of nodes in the XML document of fortunes</documentation>
|
||||||
<wsdl:input message="tns:CountCookiesHttpPostIn" />
|
<wsdl:input message="tns:CountCookiesHttpPostIn" />
|
||||||
<wsdl:output message="tns:CountCookiesHttpPostOut" />
|
<wsdl:output message="tns:CountCookiesHttpPostOut" />
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="GetSpecificCookie">
|
<wsdl:operation name="GetSpecificCookie">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get a specific cookie by the XML node number</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get a specific cookie by the XML node number</documentation>
|
||||||
<wsdl:input message="tns:GetSpecificCookieHttpPostIn" />
|
<wsdl:input message="tns:GetSpecificCookieHttpPostIn" />
|
||||||
<wsdl:output message="tns:GetSpecificCookieHttpPostOut" />
|
<wsdl:output message="tns:GetSpecificCookieHttpPostOut" />
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
</wsdl:portType>
|
</wsdl:portType>
|
||||||
<wsdl:binding name="FullerData_x0020_Fortune_x0020_CookieSoap" type="tns:FullerData_x0020_Fortune_x0020_CookieSoap">
|
<wsdl:binding name="FullerData_x0020_Fortune_x0020_CookieSoap" type="tns:FullerData_x0020_Fortune_x0020_CookieSoap">
|
||||||
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
|
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
|
||||||
<wsdl:operation name="readNodeCount">
|
<wsdl:operation name="readNodeCount">
|
||||||
<soap:operation soapAction="http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/readNodeCount" style="document" />
|
<soap:operation soapAction="http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/readNodeCount" style="document" />
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<soap:body use="literal" />
|
<soap:body use="literal" />
|
||||||
</wsdl:input>
|
</wsdl:input>
|
||||||
<wsdl:output>
|
<wsdl:output>
|
||||||
<soap:body use="literal" />
|
<soap:body use="literal" />
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="GetFortuneCookie">
|
<wsdl:operation name="GetFortuneCookie">
|
||||||
<soap:operation soapAction="http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetFortuneCookie" style="document" />
|
<soap:operation soapAction="http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetFortuneCookie" style="document" />
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<soap:body use="literal" />
|
<soap:body use="literal" />
|
||||||
</wsdl:input>
|
</wsdl:input>
|
||||||
<wsdl:output>
|
<wsdl:output>
|
||||||
<soap:body use="literal" />
|
<soap:body use="literal" />
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="CountCookies">
|
<wsdl:operation name="CountCookies">
|
||||||
<soap:operation soapAction="http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/CountCookies" style="document" />
|
<soap:operation soapAction="http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/CountCookies" style="document" />
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<soap:body use="literal" />
|
<soap:body use="literal" />
|
||||||
</wsdl:input>
|
</wsdl:input>
|
||||||
<wsdl:output>
|
<wsdl:output>
|
||||||
<soap:body use="literal" />
|
<soap:body use="literal" />
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="GetSpecificCookie">
|
<wsdl:operation name="GetSpecificCookie">
|
||||||
<soap:operation soapAction="http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetSpecificCookie" style="document" />
|
<soap:operation soapAction="http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetSpecificCookie" style="document" />
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<soap:body use="literal" />
|
<soap:body use="literal" />
|
||||||
</wsdl:input>
|
</wsdl:input>
|
||||||
<wsdl:output>
|
<wsdl:output>
|
||||||
<soap:body use="literal" />
|
<soap:body use="literal" />
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
</wsdl:binding>
|
</wsdl:binding>
|
||||||
<wsdl:binding name="FullerData_x0020_Fortune_x0020_CookieHttpGet" type="tns:FullerData_x0020_Fortune_x0020_CookieHttpGet">
|
<wsdl:binding name="FullerData_x0020_Fortune_x0020_CookieHttpGet" type="tns:FullerData_x0020_Fortune_x0020_CookieHttpGet">
|
||||||
<http:binding verb="GET" />
|
<http:binding verb="GET" />
|
||||||
<wsdl:operation name="readNodeCount">
|
<wsdl:operation name="readNodeCount">
|
||||||
<http:operation location="/readNodeCount" />
|
<http:operation location="/readNodeCount" />
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<http:urlEncoded />
|
<http:urlEncoded />
|
||||||
</wsdl:input>
|
</wsdl:input>
|
||||||
<wsdl:output>
|
<wsdl:output>
|
||||||
<mime:mimeXml part="Body" />
|
<mime:mimeXml part="Body" />
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="GetFortuneCookie">
|
<wsdl:operation name="GetFortuneCookie">
|
||||||
<http:operation location="/GetFortuneCookie" />
|
<http:operation location="/GetFortuneCookie" />
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<http:urlEncoded />
|
<http:urlEncoded />
|
||||||
</wsdl:input>
|
</wsdl:input>
|
||||||
<wsdl:output>
|
<wsdl:output>
|
||||||
<mime:mimeXml part="Body" />
|
<mime:mimeXml part="Body" />
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="CountCookies">
|
<wsdl:operation name="CountCookies">
|
||||||
<http:operation location="/CountCookies" />
|
<http:operation location="/CountCookies" />
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<http:urlEncoded />
|
<http:urlEncoded />
|
||||||
</wsdl:input>
|
</wsdl:input>
|
||||||
<wsdl:output>
|
<wsdl:output>
|
||||||
<mime:mimeXml part="Body" />
|
<mime:mimeXml part="Body" />
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="GetSpecificCookie">
|
<wsdl:operation name="GetSpecificCookie">
|
||||||
<http:operation location="/GetSpecificCookie" />
|
<http:operation location="/GetSpecificCookie" />
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<http:urlEncoded />
|
<http:urlEncoded />
|
||||||
</wsdl:input>
|
</wsdl:input>
|
||||||
<wsdl:output>
|
<wsdl:output>
|
||||||
<mime:mimeXml part="Body" />
|
<mime:mimeXml part="Body" />
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
</wsdl:binding>
|
</wsdl:binding>
|
||||||
<wsdl:binding name="FullerData_x0020_Fortune_x0020_CookieHttpPost" type="tns:FullerData_x0020_Fortune_x0020_CookieHttpPost">
|
<wsdl:binding name="FullerData_x0020_Fortune_x0020_CookieHttpPost" type="tns:FullerData_x0020_Fortune_x0020_CookieHttpPost">
|
||||||
<http:binding verb="POST" />
|
<http:binding verb="POST" />
|
||||||
<wsdl:operation name="readNodeCount">
|
<wsdl:operation name="readNodeCount">
|
||||||
<http:operation location="/readNodeCount" />
|
<http:operation location="/readNodeCount" />
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<mime:content type="application/x-www-form-urlencoded" />
|
<mime:content type="application/x-www-form-urlencoded" />
|
||||||
</wsdl:input>
|
</wsdl:input>
|
||||||
<wsdl:output>
|
<wsdl:output>
|
||||||
<mime:mimeXml part="Body" />
|
<mime:mimeXml part="Body" />
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="GetFortuneCookie">
|
<wsdl:operation name="GetFortuneCookie">
|
||||||
<http:operation location="/GetFortuneCookie" />
|
<http:operation location="/GetFortuneCookie" />
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<mime:content type="application/x-www-form-urlencoded" />
|
<mime:content type="application/x-www-form-urlencoded" />
|
||||||
</wsdl:input>
|
</wsdl:input>
|
||||||
<wsdl:output>
|
<wsdl:output>
|
||||||
<mime:mimeXml part="Body" />
|
<mime:mimeXml part="Body" />
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="CountCookies">
|
<wsdl:operation name="CountCookies">
|
||||||
<http:operation location="/CountCookies" />
|
<http:operation location="/CountCookies" />
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<mime:content type="application/x-www-form-urlencoded" />
|
<mime:content type="application/x-www-form-urlencoded" />
|
||||||
</wsdl:input>
|
</wsdl:input>
|
||||||
<wsdl:output>
|
<wsdl:output>
|
||||||
<mime:mimeXml part="Body" />
|
<mime:mimeXml part="Body" />
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="GetSpecificCookie">
|
<wsdl:operation name="GetSpecificCookie">
|
||||||
<http:operation location="/GetSpecificCookie" />
|
<http:operation location="/GetSpecificCookie" />
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<mime:content type="application/x-www-form-urlencoded" />
|
<mime:content type="application/x-www-form-urlencoded" />
|
||||||
</wsdl:input>
|
</wsdl:input>
|
||||||
<wsdl:output>
|
<wsdl:output>
|
||||||
<mime:mimeXml part="Body" />
|
<mime:mimeXml part="Body" />
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
</wsdl:binding>
|
</wsdl:binding>
|
||||||
<wsdl:service name="FullerData_x0020_Fortune_x0020_Cookie">
|
<wsdl:service name="FullerData_x0020_Fortune_x0020_Cookie">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Simple XML-based fortune cookie</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Simple XML-based fortune cookie</documentation>
|
||||||
<wsdl:port name="FullerData_x0020_Fortune_x0020_CookieSoap" binding="tns:FullerData_x0020_Fortune_x0020_CookieSoap">
|
<wsdl:port name="FullerData_x0020_Fortune_x0020_CookieSoap" binding="tns:FullerData_x0020_Fortune_x0020_CookieSoap">
|
||||||
<soap:address location="http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx" />
|
<soap:address location="http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx" />
|
||||||
</wsdl:port>
|
</wsdl:port>
|
||||||
<wsdl:port name="FullerData_x0020_Fortune_x0020_CookieHttpGet" binding="tns:FullerData_x0020_Fortune_x0020_CookieHttpGet">
|
<wsdl:port name="FullerData_x0020_Fortune_x0020_CookieHttpGet" binding="tns:FullerData_x0020_Fortune_x0020_CookieHttpGet">
|
||||||
<http:address location="http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx" />
|
<http:address location="http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx" />
|
||||||
</wsdl:port>
|
</wsdl:port>
|
||||||
<wsdl:port name="FullerData_x0020_Fortune_x0020_CookieHttpPost" binding="tns:FullerData_x0020_Fortune_x0020_CookieHttpPost">
|
<wsdl:port name="FullerData_x0020_Fortune_x0020_CookieHttpPost" binding="tns:FullerData_x0020_Fortune_x0020_CookieHttpPost">
|
||||||
<http:address location="http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx" />
|
<http:address location="http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx" />
|
||||||
</wsdl:port>
|
</wsdl:port>
|
||||||
</wsdl:service>
|
</wsdl:service>
|
||||||
</wsdl:definitions>
|
</wsdl:definitions>
|
||||||
+152
-152
@@ -1,153 +1,153 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?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: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>
|
<wsdl:types>
|
||||||
<s:schema elementFormDefault="qualified" targetNamespace="http://www.webservicex.net/">
|
<s:schema elementFormDefault="qualified" targetNamespace="http://www.webservicex.net/">
|
||||||
<s:element name="GenerateBarCode">
|
<s:element name="GenerateBarCode">
|
||||||
<s:complexType>
|
<s:complexType>
|
||||||
<s:sequence>
|
<s:sequence>
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="BarCodeParam" type="tns:BarCodeData" />
|
<s:element minOccurs="1" maxOccurs="1" name="BarCodeParam" type="tns:BarCodeData" />
|
||||||
<s:element minOccurs="0" maxOccurs="1" name="BarCodeText" type="s:string" />
|
<s:element minOccurs="0" maxOccurs="1" name="BarCodeText" type="s:string" />
|
||||||
</s:sequence>
|
</s:sequence>
|
||||||
</s:complexType>
|
</s:complexType>
|
||||||
</s:element>
|
</s:element>
|
||||||
<s:complexType name="BarCodeData">
|
<s:complexType name="BarCodeData">
|
||||||
<s:sequence>
|
<s:sequence>
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="Height" type="s:int" />
|
<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="Width" type="s:int" />
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="Angle" 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="Ratio" type="s:int" />
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="Module" 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="Left" type="s:int" />
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="Top" 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="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="FontName" type="s:string" />
|
||||||
<s:element minOccurs="0" maxOccurs="1" name="BarColor" 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="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="FontSize" type="s:float" />
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="barcodeOption" type="tns:BarcodeOption" />
|
<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="barcodeType" type="tns:BarcodeType" />
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="checkSumMethod" type="tns:CheckSumMethod" />
|
<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="showTextPosition" type="tns:ShowTextPosition" />
|
||||||
<s:element minOccurs="1" maxOccurs="1" name="BarCodeImageFormat" type="tns:ImageFormats" />
|
<s:element minOccurs="1" maxOccurs="1" name="BarCodeImageFormat" type="tns:ImageFormats" />
|
||||||
</s:sequence>
|
</s:sequence>
|
||||||
</s:complexType>
|
</s:complexType>
|
||||||
<s:simpleType name="BarcodeOption">
|
<s:simpleType name="BarcodeOption">
|
||||||
<s:restriction base="s:string">
|
<s:restriction base="s:string">
|
||||||
<s:enumeration value="None" />
|
<s:enumeration value="None" />
|
||||||
<s:enumeration value="Code" />
|
<s:enumeration value="Code" />
|
||||||
<s:enumeration value="Typ" />
|
<s:enumeration value="Typ" />
|
||||||
<s:enumeration value="Both" />
|
<s:enumeration value="Both" />
|
||||||
</s:restriction>
|
</s:restriction>
|
||||||
</s:simpleType>
|
</s:simpleType>
|
||||||
<s:simpleType name="BarcodeType">
|
<s:simpleType name="BarcodeType">
|
||||||
<s:restriction base="s:string">
|
<s:restriction base="s:string">
|
||||||
<s:enumeration value="Code_2_5_interleaved" />
|
<s:enumeration value="Code_2_5_interleaved" />
|
||||||
<s:enumeration value="Code_2_5_industrial" />
|
<s:enumeration value="Code_2_5_industrial" />
|
||||||
<s:enumeration value="Code_2_5_matrix" />
|
<s:enumeration value="Code_2_5_matrix" />
|
||||||
<s:enumeration value="Code39" />
|
<s:enumeration value="Code39" />
|
||||||
<s:enumeration value="Code39Extended" />
|
<s:enumeration value="Code39Extended" />
|
||||||
<s:enumeration value="Code128A" />
|
<s:enumeration value="Code128A" />
|
||||||
<s:enumeration value="Code128B" />
|
<s:enumeration value="Code128B" />
|
||||||
<s:enumeration value="Code128C" />
|
<s:enumeration value="Code128C" />
|
||||||
<s:enumeration value="Code93" />
|
<s:enumeration value="Code93" />
|
||||||
<s:enumeration value="Code93Extended" />
|
<s:enumeration value="Code93Extended" />
|
||||||
<s:enumeration value="CodeMSI" />
|
<s:enumeration value="CodeMSI" />
|
||||||
<s:enumeration value="CodePostNet" />
|
<s:enumeration value="CodePostNet" />
|
||||||
<s:enumeration value="CodeCodabar" />
|
<s:enumeration value="CodeCodabar" />
|
||||||
<s:enumeration value="CodeEAN8" />
|
<s:enumeration value="CodeEAN8" />
|
||||||
<s:enumeration value="CodeEAN13" />
|
<s:enumeration value="CodeEAN13" />
|
||||||
<s:enumeration value="CodeUPC_A" />
|
<s:enumeration value="CodeUPC_A" />
|
||||||
<s:enumeration value="CodeUPC_E0" />
|
<s:enumeration value="CodeUPC_E0" />
|
||||||
<s:enumeration value="CodeUPC_E1" />
|
<s:enumeration value="CodeUPC_E1" />
|
||||||
<s:enumeration value="CodeUPC_Supp2" />
|
<s:enumeration value="CodeUPC_Supp2" />
|
||||||
<s:enumeration value="CodeUPC_Supp5" />
|
<s:enumeration value="CodeUPC_Supp5" />
|
||||||
<s:enumeration value="CodeEAN128A" />
|
<s:enumeration value="CodeEAN128A" />
|
||||||
<s:enumeration value="CodeEAN128B" />
|
<s:enumeration value="CodeEAN128B" />
|
||||||
<s:enumeration value="CodeEAN128C" />
|
<s:enumeration value="CodeEAN128C" />
|
||||||
</s:restriction>
|
</s:restriction>
|
||||||
</s:simpleType>
|
</s:simpleType>
|
||||||
<s:simpleType name="CheckSumMethod">
|
<s:simpleType name="CheckSumMethod">
|
||||||
<s:restriction base="s:string">
|
<s:restriction base="s:string">
|
||||||
<s:enumeration value="None" />
|
<s:enumeration value="None" />
|
||||||
<s:enumeration value="Modulo10" />
|
<s:enumeration value="Modulo10" />
|
||||||
</s:restriction>
|
</s:restriction>
|
||||||
</s:simpleType>
|
</s:simpleType>
|
||||||
<s:simpleType name="ShowTextPosition">
|
<s:simpleType name="ShowTextPosition">
|
||||||
<s:restriction base="s:string">
|
<s:restriction base="s:string">
|
||||||
<s:enumeration value="TopLeft" />
|
<s:enumeration value="TopLeft" />
|
||||||
<s:enumeration value="TopRight" />
|
<s:enumeration value="TopRight" />
|
||||||
<s:enumeration value="TopCenter" />
|
<s:enumeration value="TopCenter" />
|
||||||
<s:enumeration value="BottomLeft" />
|
<s:enumeration value="BottomLeft" />
|
||||||
<s:enumeration value="BottomRight" />
|
<s:enumeration value="BottomRight" />
|
||||||
<s:enumeration value="BottomCenter" />
|
<s:enumeration value="BottomCenter" />
|
||||||
</s:restriction>
|
</s:restriction>
|
||||||
</s:simpleType>
|
</s:simpleType>
|
||||||
<s:simpleType name="ImageFormats">
|
<s:simpleType name="ImageFormats">
|
||||||
<s:restriction base="s:string">
|
<s:restriction base="s:string">
|
||||||
<s:enumeration value="BMP" />
|
<s:enumeration value="BMP" />
|
||||||
<s:enumeration value="EMF" />
|
<s:enumeration value="EMF" />
|
||||||
<s:enumeration value="EXIF" />
|
<s:enumeration value="EXIF" />
|
||||||
<s:enumeration value="GIF" />
|
<s:enumeration value="GIF" />
|
||||||
<s:enumeration value="ICON" />
|
<s:enumeration value="ICON" />
|
||||||
<s:enumeration value="JPEG" />
|
<s:enumeration value="JPEG" />
|
||||||
<s:enumeration value="MemoryBMP" />
|
<s:enumeration value="MemoryBMP" />
|
||||||
<s:enumeration value="PNG" />
|
<s:enumeration value="PNG" />
|
||||||
<s:enumeration value="TIFF" />
|
<s:enumeration value="TIFF" />
|
||||||
<s:enumeration value="WMF" />
|
<s:enumeration value="WMF" />
|
||||||
</s:restriction>
|
</s:restriction>
|
||||||
</s:simpleType>
|
</s:simpleType>
|
||||||
<s:element name="GenerateBarCodeResponse">
|
<s:element name="GenerateBarCodeResponse">
|
||||||
<s:complexType>
|
<s:complexType>
|
||||||
<s:sequence>
|
<s:sequence>
|
||||||
<s:element minOccurs="0" maxOccurs="1" name="GenerateBarCodeResult" type="s:base64Binary" />
|
<s:element minOccurs="0" maxOccurs="1" name="GenerateBarCodeResult" type="s:base64Binary" />
|
||||||
</s:sequence>
|
</s:sequence>
|
||||||
</s:complexType>
|
</s:complexType>
|
||||||
</s:element>
|
</s:element>
|
||||||
</s:schema>
|
</s:schema>
|
||||||
</wsdl:types>
|
</wsdl:types>
|
||||||
<wsdl:message name="GenerateBarCodeSoapIn">
|
<wsdl:message name="GenerateBarCodeSoapIn">
|
||||||
<wsdl:part name="parameters" element="tns:GenerateBarCode" />
|
<wsdl:part name="parameters" element="tns:GenerateBarCode" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GenerateBarCodeSoapOut">
|
<wsdl:message name="GenerateBarCodeSoapOut">
|
||||||
<wsdl:part name="parameters" element="tns:GenerateBarCodeResponse" />
|
<wsdl:part name="parameters" element="tns:GenerateBarCodeResponse" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:portType name="BarCodeSoap">
|
<wsdl:portType name="BarCodeSoap">
|
||||||
<wsdl:operation name="GenerateBarCode">
|
<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>
|
<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:input message="tns:GenerateBarCodeSoapIn" />
|
||||||
<wsdl:output message="tns:GenerateBarCodeSoapOut" />
|
<wsdl:output message="tns:GenerateBarCodeSoapOut" />
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
</wsdl:portType>
|
</wsdl:portType>
|
||||||
<wsdl:portType name="BarCodeHttpGet" />
|
<wsdl:portType name="BarCodeHttpGet" />
|
||||||
<wsdl:portType name="BarCodeHttpPost" />
|
<wsdl:portType name="BarCodeHttpPost" />
|
||||||
<wsdl:binding name="BarCodeSoap" type="tns:BarCodeSoap">
|
<wsdl:binding name="BarCodeSoap" type="tns:BarCodeSoap">
|
||||||
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
|
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
|
||||||
<wsdl:operation name="GenerateBarCode">
|
<wsdl:operation name="GenerateBarCode">
|
||||||
<soap:operation soapAction="http://www.webservicex.net/GenerateBarCode" style="document" />
|
<soap:operation soapAction="http://www.webservicex.net/GenerateBarCode" style="document" />
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<soap:body use="literal" />
|
<soap:body use="literal" />
|
||||||
</wsdl:input>
|
</wsdl:input>
|
||||||
<wsdl:output>
|
<wsdl:output>
|
||||||
<soap:body use="literal" />
|
<soap:body use="literal" />
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
</wsdl:binding>
|
</wsdl:binding>
|
||||||
<wsdl:binding name="BarCodeHttpGet" type="tns:BarCodeHttpGet">
|
<wsdl:binding name="BarCodeHttpGet" type="tns:BarCodeHttpGet">
|
||||||
<http:binding verb="GET" />
|
<http:binding verb="GET" />
|
||||||
</wsdl:binding>
|
</wsdl:binding>
|
||||||
<wsdl:binding name="BarCodeHttpPost" type="tns:BarCodeHttpPost">
|
<wsdl:binding name="BarCodeHttpPost" type="tns:BarCodeHttpPost">
|
||||||
<http:binding verb="POST" />
|
<http:binding verb="POST" />
|
||||||
</wsdl:binding>
|
</wsdl:binding>
|
||||||
<wsdl:service name="BarCode">
|
<wsdl:service name="BarCode">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Barcode generator</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Barcode generator</documentation>
|
||||||
<wsdl:port name="BarCodeSoap" binding="tns:BarCodeSoap">
|
<wsdl:port name="BarCodeSoap" binding="tns:BarCodeSoap">
|
||||||
<soap:address location="http://www.webservicex.net/genericbarcode.asmx" />
|
<soap:address location="http://www.webservicex.net/genericbarcode.asmx" />
|
||||||
</wsdl:port>
|
</wsdl:port>
|
||||||
<wsdl:port name="BarCodeHttpGet" binding="tns:BarCodeHttpGet">
|
<wsdl:port name="BarCodeHttpGet" binding="tns:BarCodeHttpGet">
|
||||||
<http:address location="http://www.webservicex.net/genericbarcode.asmx" />
|
<http:address location="http://www.webservicex.net/genericbarcode.asmx" />
|
||||||
</wsdl:port>
|
</wsdl:port>
|
||||||
<wsdl:port name="BarCodeHttpPost" binding="tns:BarCodeHttpPost">
|
<wsdl:port name="BarCodeHttpPost" binding="tns:BarCodeHttpPost">
|
||||||
<http:address location="http://www.webservicex.net/genericbarcode.asmx" />
|
<http:address location="http://www.webservicex.net/genericbarcode.asmx" />
|
||||||
</wsdl:port>
|
</wsdl:port>
|
||||||
</wsdl:service>
|
</wsdl:service>
|
||||||
</wsdl:definitions>
|
</wsdl:definitions>
|
||||||
+184
-184
@@ -1,185 +1,185 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?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: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>
|
<wsdl:types>
|
||||||
<s:schema elementFormDefault="qualified" targetNamespace="http://www.webserviceX.NET">
|
<s:schema elementFormDefault="qualified" targetNamespace="http://www.webserviceX.NET">
|
||||||
<s:element name="GetWeather">
|
<s:element name="GetWeather">
|
||||||
<s:complexType>
|
<s:complexType>
|
||||||
<s:sequence>
|
<s:sequence>
|
||||||
<s:element minOccurs="0" maxOccurs="1" name="CityName" type="s:string" />
|
<s:element minOccurs="0" maxOccurs="1" name="CityName" type="s:string" />
|
||||||
<s:element minOccurs="0" maxOccurs="1" name="CountryName" type="s:string" />
|
<s:element minOccurs="0" maxOccurs="1" name="CountryName" type="s:string" />
|
||||||
</s:sequence>
|
</s:sequence>
|
||||||
</s:complexType>
|
</s:complexType>
|
||||||
</s:element>
|
</s:element>
|
||||||
<s:element name="GetWeatherResponse">
|
<s:element name="GetWeatherResponse">
|
||||||
<s:complexType>
|
<s:complexType>
|
||||||
<s:sequence>
|
<s:sequence>
|
||||||
<s:element minOccurs="0" maxOccurs="1" name="GetWeatherResult" type="s:string" />
|
<s:element minOccurs="0" maxOccurs="1" name="GetWeatherResult" type="s:string" />
|
||||||
</s:sequence>
|
</s:sequence>
|
||||||
</s:complexType>
|
</s:complexType>
|
||||||
</s:element>
|
</s:element>
|
||||||
<s:element name="GetCitiesByCountry">
|
<s:element name="GetCitiesByCountry">
|
||||||
<s:complexType>
|
<s:complexType>
|
||||||
<s:sequence>
|
<s:sequence>
|
||||||
<s:element minOccurs="0" maxOccurs="1" name="CountryName" type="s:string" />
|
<s:element minOccurs="0" maxOccurs="1" name="CountryName" type="s:string" />
|
||||||
</s:sequence>
|
</s:sequence>
|
||||||
</s:complexType>
|
</s:complexType>
|
||||||
</s:element>
|
</s:element>
|
||||||
<s:element name="GetCitiesByCountryResponse">
|
<s:element name="GetCitiesByCountryResponse">
|
||||||
<s:complexType>
|
<s:complexType>
|
||||||
<s:sequence>
|
<s:sequence>
|
||||||
<s:element minOccurs="0" maxOccurs="1" name="GetCitiesByCountryResult" type="s:string" />
|
<s:element minOccurs="0" maxOccurs="1" name="GetCitiesByCountryResult" type="s:string" />
|
||||||
</s:sequence>
|
</s:sequence>
|
||||||
</s:complexType>
|
</s:complexType>
|
||||||
</s:element>
|
</s:element>
|
||||||
<s:element name="string" nillable="true" type="s:string" />
|
<s:element name="string" nillable="true" type="s:string" />
|
||||||
</s:schema>
|
</s:schema>
|
||||||
</wsdl:types>
|
</wsdl:types>
|
||||||
<wsdl:message name="GetWeatherSoapIn">
|
<wsdl:message name="GetWeatherSoapIn">
|
||||||
<wsdl:part name="parameters" element="tns:GetWeather" />
|
<wsdl:part name="parameters" element="tns:GetWeather" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetWeatherSoapOut">
|
<wsdl:message name="GetWeatherSoapOut">
|
||||||
<wsdl:part name="parameters" element="tns:GetWeatherResponse" />
|
<wsdl:part name="parameters" element="tns:GetWeatherResponse" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetCitiesByCountrySoapIn">
|
<wsdl:message name="GetCitiesByCountrySoapIn">
|
||||||
<wsdl:part name="parameters" element="tns:GetCitiesByCountry" />
|
<wsdl:part name="parameters" element="tns:GetCitiesByCountry" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetCitiesByCountrySoapOut">
|
<wsdl:message name="GetCitiesByCountrySoapOut">
|
||||||
<wsdl:part name="parameters" element="tns:GetCitiesByCountryResponse" />
|
<wsdl:part name="parameters" element="tns:GetCitiesByCountryResponse" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetWeatherHttpGetIn">
|
<wsdl:message name="GetWeatherHttpGetIn">
|
||||||
<wsdl:part name="CityName" type="s:string" />
|
<wsdl:part name="CityName" type="s:string" />
|
||||||
<wsdl:part name="CountryName" type="s:string" />
|
<wsdl:part name="CountryName" type="s:string" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetWeatherHttpGetOut">
|
<wsdl:message name="GetWeatherHttpGetOut">
|
||||||
<wsdl:part name="Body" element="tns:string" />
|
<wsdl:part name="Body" element="tns:string" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetCitiesByCountryHttpGetIn">
|
<wsdl:message name="GetCitiesByCountryHttpGetIn">
|
||||||
<wsdl:part name="CountryName" type="s:string" />
|
<wsdl:part name="CountryName" type="s:string" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetCitiesByCountryHttpGetOut">
|
<wsdl:message name="GetCitiesByCountryHttpGetOut">
|
||||||
<wsdl:part name="Body" element="tns:string" />
|
<wsdl:part name="Body" element="tns:string" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetWeatherHttpPostIn">
|
<wsdl:message name="GetWeatherHttpPostIn">
|
||||||
<wsdl:part name="CityName" type="s:string" />
|
<wsdl:part name="CityName" type="s:string" />
|
||||||
<wsdl:part name="CountryName" type="s:string" />
|
<wsdl:part name="CountryName" type="s:string" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetWeatherHttpPostOut">
|
<wsdl:message name="GetWeatherHttpPostOut">
|
||||||
<wsdl:part name="Body" element="tns:string" />
|
<wsdl:part name="Body" element="tns:string" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetCitiesByCountryHttpPostIn">
|
<wsdl:message name="GetCitiesByCountryHttpPostIn">
|
||||||
<wsdl:part name="CountryName" type="s:string" />
|
<wsdl:part name="CountryName" type="s:string" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="GetCitiesByCountryHttpPostOut">
|
<wsdl:message name="GetCitiesByCountryHttpPostOut">
|
||||||
<wsdl:part name="Body" element="tns:string" />
|
<wsdl:part name="Body" element="tns:string" />
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:portType name="GlobalWeatherSoap">
|
<wsdl:portType name="GlobalWeatherSoap">
|
||||||
<wsdl:operation name="GetWeather">
|
<wsdl:operation name="GetWeather">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get weather report for all major cities around the world.</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get weather report for all major cities around the world.</documentation>
|
||||||
<wsdl:input message="tns:GetWeatherSoapIn" />
|
<wsdl:input message="tns:GetWeatherSoapIn" />
|
||||||
<wsdl:output message="tns:GetWeatherSoapOut" />
|
<wsdl:output message="tns:GetWeatherSoapOut" />
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="GetCitiesByCountry">
|
<wsdl:operation name="GetCitiesByCountry">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get all major cities by country name(full / part).</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get all major cities by country name(full / part).</documentation>
|
||||||
<wsdl:input message="tns:GetCitiesByCountrySoapIn" />
|
<wsdl:input message="tns:GetCitiesByCountrySoapIn" />
|
||||||
<wsdl:output message="tns:GetCitiesByCountrySoapOut" />
|
<wsdl:output message="tns:GetCitiesByCountrySoapOut" />
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
</wsdl:portType>
|
</wsdl:portType>
|
||||||
<wsdl:portType name="GlobalWeatherHttpGet">
|
<wsdl:portType name="GlobalWeatherHttpGet">
|
||||||
<wsdl:operation name="GetWeather">
|
<wsdl:operation name="GetWeather">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get weather report for all major cities around the world.</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get weather report for all major cities around the world.</documentation>
|
||||||
<wsdl:input message="tns:GetWeatherHttpGetIn" />
|
<wsdl:input message="tns:GetWeatherHttpGetIn" />
|
||||||
<wsdl:output message="tns:GetWeatherHttpGetOut" />
|
<wsdl:output message="tns:GetWeatherHttpGetOut" />
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="GetCitiesByCountry">
|
<wsdl:operation name="GetCitiesByCountry">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get all major cities by country name(full / part).</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get all major cities by country name(full / part).</documentation>
|
||||||
<wsdl:input message="tns:GetCitiesByCountryHttpGetIn" />
|
<wsdl:input message="tns:GetCitiesByCountryHttpGetIn" />
|
||||||
<wsdl:output message="tns:GetCitiesByCountryHttpGetOut" />
|
<wsdl:output message="tns:GetCitiesByCountryHttpGetOut" />
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
</wsdl:portType>
|
</wsdl:portType>
|
||||||
<wsdl:portType name="GlobalWeatherHttpPost">
|
<wsdl:portType name="GlobalWeatherHttpPost">
|
||||||
<wsdl:operation name="GetWeather">
|
<wsdl:operation name="GetWeather">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get weather report for all major cities around the world.</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get weather report for all major cities around the world.</documentation>
|
||||||
<wsdl:input message="tns:GetWeatherHttpPostIn" />
|
<wsdl:input message="tns:GetWeatherHttpPostIn" />
|
||||||
<wsdl:output message="tns:GetWeatherHttpPostOut" />
|
<wsdl:output message="tns:GetWeatherHttpPostOut" />
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="GetCitiesByCountry">
|
<wsdl:operation name="GetCitiesByCountry">
|
||||||
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get all major cities by country name(full / part).</documentation>
|
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get all major cities by country name(full / part).</documentation>
|
||||||
<wsdl:input message="tns:GetCitiesByCountryHttpPostIn" />
|
<wsdl:input message="tns:GetCitiesByCountryHttpPostIn" />
|
||||||
<wsdl:output message="tns:GetCitiesByCountryHttpPostOut" />
|
<wsdl:output message="tns:GetCitiesByCountryHttpPostOut" />
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
</wsdl:portType>
|
</wsdl:portType>
|
||||||
<wsdl:binding name="GlobalWeatherSoap" type="tns:GlobalWeatherSoap">
|
<wsdl:binding name="GlobalWeatherSoap" type="tns:GlobalWeatherSoap">
|
||||||
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
|
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
|
||||||
<wsdl:operation name="GetWeather">
|
<wsdl:operation name="GetWeather">
|
||||||
<soap:operation soapAction="http://www.webserviceX.NET/GetWeather" style="document" />
|
<soap:operation soapAction="http://www.webserviceX.NET/GetWeather" style="document" />
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<soap:body use="literal" />
|
<soap:body use="literal" />
|
||||||
</wsdl:input>
|
</wsdl:input>
|
||||||
<wsdl:output>
|
<wsdl:output>
|
||||||
<soap:body use="literal" />
|
<soap:body use="literal" />
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="GetCitiesByCountry">
|
<wsdl:operation name="GetCitiesByCountry">
|
||||||
<soap:operation soapAction="http://www.webserviceX.NET/GetCitiesByCountry" style="document" />
|
<soap:operation soapAction="http://www.webserviceX.NET/GetCitiesByCountry" style="document" />
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<soap:body use="literal" />
|
<soap:body use="literal" />
|
||||||
</wsdl:input>
|
</wsdl:input>
|
||||||
<wsdl:output>
|
<wsdl:output>
|
||||||
<soap:body use="literal" />
|
<soap:body use="literal" />
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
</wsdl:binding>
|
</wsdl:binding>
|
||||||
<wsdl:binding name="GlobalWeatherHttpGet" type="tns:GlobalWeatherHttpGet">
|
<wsdl:binding name="GlobalWeatherHttpGet" type="tns:GlobalWeatherHttpGet">
|
||||||
<http:binding verb="GET" />
|
<http:binding verb="GET" />
|
||||||
<wsdl:operation name="GetWeather">
|
<wsdl:operation name="GetWeather">
|
||||||
<http:operation location="/GetWeather" />
|
<http:operation location="/GetWeather" />
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<http:urlEncoded />
|
<http:urlEncoded />
|
||||||
</wsdl:input>
|
</wsdl:input>
|
||||||
<wsdl:output>
|
<wsdl:output>
|
||||||
<mime:mimeXml part="Body" />
|
<mime:mimeXml part="Body" />
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="GetCitiesByCountry">
|
<wsdl:operation name="GetCitiesByCountry">
|
||||||
<http:operation location="/GetCitiesByCountry" />
|
<http:operation location="/GetCitiesByCountry" />
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<http:urlEncoded />
|
<http:urlEncoded />
|
||||||
</wsdl:input>
|
</wsdl:input>
|
||||||
<wsdl:output>
|
<wsdl:output>
|
||||||
<mime:mimeXml part="Body" />
|
<mime:mimeXml part="Body" />
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
</wsdl:binding>
|
</wsdl:binding>
|
||||||
<wsdl:binding name="GlobalWeatherHttpPost" type="tns:GlobalWeatherHttpPost">
|
<wsdl:binding name="GlobalWeatherHttpPost" type="tns:GlobalWeatherHttpPost">
|
||||||
<http:binding verb="POST" />
|
<http:binding verb="POST" />
|
||||||
<wsdl:operation name="GetWeather">
|
<wsdl:operation name="GetWeather">
|
||||||
<http:operation location="/GetWeather" />
|
<http:operation location="/GetWeather" />
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<mime:content type="application/x-www-form-urlencoded" />
|
<mime:content type="application/x-www-form-urlencoded" />
|
||||||
</wsdl:input>
|
</wsdl:input>
|
||||||
<wsdl:output>
|
<wsdl:output>
|
||||||
<mime:mimeXml part="Body" />
|
<mime:mimeXml part="Body" />
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="GetCitiesByCountry">
|
<wsdl:operation name="GetCitiesByCountry">
|
||||||
<http:operation location="/GetCitiesByCountry" />
|
<http:operation location="/GetCitiesByCountry" />
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<mime:content type="application/x-www-form-urlencoded" />
|
<mime:content type="application/x-www-form-urlencoded" />
|
||||||
</wsdl:input>
|
</wsdl:input>
|
||||||
<wsdl:output>
|
<wsdl:output>
|
||||||
<mime:mimeXml part="Body" />
|
<mime:mimeXml part="Body" />
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
</wsdl:binding>
|
</wsdl:binding>
|
||||||
<wsdl:service name="GlobalWeather">
|
<wsdl:service name="GlobalWeather">
|
||||||
<wsdl:port name="GlobalWeatherSoap" binding="tns:GlobalWeatherSoap">
|
<wsdl:port name="GlobalWeatherSoap" binding="tns:GlobalWeatherSoap">
|
||||||
<soap:address location="http://www.webservicex.net/globalweather.asmx" />
|
<soap:address location="http://www.webservicex.net/globalweather.asmx" />
|
||||||
</wsdl:port>
|
</wsdl:port>
|
||||||
<wsdl:port name="GlobalWeatherHttpGet" binding="tns:GlobalWeatherHttpGet">
|
<wsdl:port name="GlobalWeatherHttpGet" binding="tns:GlobalWeatherHttpGet">
|
||||||
<http:address location="http://www.webservicex.net/globalweather.asmx" />
|
<http:address location="http://www.webservicex.net/globalweather.asmx" />
|
||||||
</wsdl:port>
|
</wsdl:port>
|
||||||
<wsdl:port name="GlobalWeatherHttpPost" binding="tns:GlobalWeatherHttpPost">
|
<wsdl:port name="GlobalWeatherHttpPost" binding="tns:GlobalWeatherHttpPost">
|
||||||
<http:address location="http://www.webservicex.net/globalweather.asmx" />
|
<http:address location="http://www.webservicex.net/globalweather.asmx" />
|
||||||
</wsdl:port>
|
</wsdl:port>
|
||||||
</wsdl:service>
|
</wsdl:service>
|
||||||
</wsdl:definitions>
|
</wsdl:definitions>
|
||||||
+381
-293
@@ -1,110 +1,107 @@
|
|||||||
package SOAP::WSDL;
|
package SOAP::WSDL;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use vars qw($AUTOLOAD);
|
use vars qw($AUTOLOAD);
|
||||||
use Carp;
|
use Carp;
|
||||||
use Scalar::Util qw(blessed);
|
use Scalar::Util qw(blessed);
|
||||||
use SOAP::WSDL::Client;
|
use SOAP::WSDL::Client;
|
||||||
use SOAP::WSDL::Envelope;
|
use SOAP::WSDL::Expat::WSDLParser;
|
||||||
use SOAP::WSDL::SAX::WSDLHandler;
|
use Class::Std;
|
||||||
use Class::Std;
|
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
||||||
use XML::LibXML;
|
use LWP::UserAgent;
|
||||||
|
|
||||||
use Data::Dumper;
|
our $VERSION='2.00_13';
|
||||||
use LWP::UserAgent;
|
|
||||||
our $VERSION='2.00_09';
|
my %no_dispatch_of :ATTR(:name<no_dispatch>);
|
||||||
|
my %wsdl_of :ATTR(:name<wsdl>);
|
||||||
my %no_dispatch_of :ATTR(:name<no_dispatch>);
|
my %proxy_of :ATTR(:name<proxy>);
|
||||||
my %wsdl_of :ATTR(:name<wsdl>);
|
my %readable_of :ATTR(:name<readable>);
|
||||||
my %proxy_of :ATTR(:name<proxy>);
|
my %autotype_of :ATTR(:name<autotype>);
|
||||||
my %readable_of :ATTR(:name<readable>);
|
my %outputxml_of :ATTR(:name<outputxml> :default<0>);
|
||||||
my %autotype_of :ATTR(:name<autotype>);
|
my %outputtree_of :ATTR(:name<outputtree>);
|
||||||
my %outputxml_of :ATTR(:name<outputxml>);
|
my %outputhash_of :ATTR(:name<outputhash>);
|
||||||
my %outputtree_of :ATTR(:name<outputtree>);
|
my %servicename_of :ATTR(:name<servicename>);
|
||||||
my %outputhash_of :ATTR(:name<outputhash>);
|
my %portname_of :ATTR(:name<portname>);
|
||||||
my %servicename_of :ATTR(:name<servicename>);
|
my %class_resolver_of :ATTR(:name<class_resolver>);
|
||||||
my %portname_of :ATTR(:name<portname>);
|
|
||||||
my %class_resolver_of :ATTR(:name<class_resolver>);
|
my %method_info_of :ATTR(:default<()>);
|
||||||
|
my %port_of :ATTR(:default<()>);
|
||||||
my %method_info_of :ATTR(:default<()>);
|
my %porttype_of :ATTR(:default<()>);
|
||||||
my %port_of :ATTR(:default<()>);
|
my %binding_of :ATTR(:default<()>);
|
||||||
my %porttype_of :ATTR(:default<()>);
|
my %service_of :ATTR(:default<()>);
|
||||||
my %binding_of :ATTR(:default<()>);
|
my %definitions_of :ATTR(:get<definitions> :default<()>);
|
||||||
my %service_of :ATTR(:default<()>);
|
my %serialize_options_of :ATTR(:default<()>);
|
||||||
my %definitions_of :ATTR(:get<definitions> :default<()>);
|
my %explain_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 %LOOKUP = (
|
||||||
|
no_dispatch => \%no_dispatch_of,
|
||||||
my %LOOKUP = (
|
class_resolver => \%class_resolver_of,
|
||||||
no_dispatch => \%no_dispatch_of,
|
wsdl => \%wsdl_of,
|
||||||
class_resolver => \%class_resolver_of,
|
proxy => \%proxy_of,
|
||||||
wsdl => \%wsdl_of,
|
readable => \%readable_of,
|
||||||
proxy => \%proxy_of,
|
autotype => \%autotype_of,
|
||||||
readable => \%readable_of,
|
outputxml => \%outputxml_of,
|
||||||
autotype => \%autotype_of,
|
outputtree => \%outputtree_of,
|
||||||
outputxml => \%outputxml_of,
|
outputhash => \%outputhash_of,
|
||||||
outputtree => \%outputtree_of,
|
portname => \%portname_of,
|
||||||
outputhash => \%outputhash_of,
|
servicename => \%servicename_of,
|
||||||
portname => \%portname_of,
|
);
|
||||||
servicename => \%servicename_of,
|
|
||||||
);
|
for my $method (keys %LOOKUP ) {
|
||||||
|
no strict qw(refs);
|
||||||
for my $method (keys %LOOKUP ) {
|
*{ $method } = sub {
|
||||||
no strict qw(refs);
|
my $self = shift;
|
||||||
*{ $method } = sub {
|
my $ident = ident $self;
|
||||||
my $self = shift;
|
if (@_) {
|
||||||
my $ident = ident $self;
|
$LOOKUP{ $method }->{ $ident } = shift;
|
||||||
if (@_) {
|
return $self;
|
||||||
$LOOKUP{ $method }->{ $ident } = shift;
|
}
|
||||||
return $self;
|
return $LOOKUP{ $method }->{ $ident };
|
||||||
}
|
};
|
||||||
return $LOOKUP{ $method }->{ $ident };
|
}
|
||||||
};
|
|
||||||
}
|
{
|
||||||
|
# we need to roll our own for supporting
|
||||||
|
# SOAP::WSDL->new( key => value ) syntax,
|
||||||
{
|
# like SOAP::Lite does
|
||||||
no warnings qw(redefine);
|
no warnings qw(redefine);
|
||||||
sub new {
|
sub new {
|
||||||
my $class = shift;
|
my $class = shift;
|
||||||
my %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 = shift;
|
||||||
my $ident = ident $self;
|
my $ident = ident $self;
|
||||||
my %opt = @_;
|
my %opt = @_;
|
||||||
|
|
||||||
my $lwp = LWP::UserAgent->new();
|
my $lwp = LWP::UserAgent->new();
|
||||||
my $response = $lwp->get( $wsdl_of{ $ident } );
|
my $response = $lwp->get( $wsdl_of{ $ident } );
|
||||||
croak $response->message() if ($response->code != 200);
|
croak $response->message() if ($response->code != 200);
|
||||||
|
|
||||||
# TODO: Port parser to expat and remove XML::LibXML dependency
|
# TODO: Port parser to expat and remove XML::LibXML dependency
|
||||||
my $parser = XML::LibXML->new();
|
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
|
||||||
my $filter = SOAP::WSDL::SAX::WSDLHandler->new();
|
|
||||||
$parser->set_handler( $filter );
|
|
||||||
$parser->parse_string( $response->content() );
|
$parser->parse_string( $response->content() );
|
||||||
|
|
||||||
# sanity checks
|
# sanity checks
|
||||||
my $wsdl_definitions = $filter->get_data() or die "unable to parse WSDL";
|
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 die "unable to extract schema from WSDL";
|
||||||
my $ns = $wsdl_definitions->get_xmlns()
|
my $ns = $wsdl_definitions->get_xmlns()
|
||||||
@@ -116,7 +113,7 @@ sub wsdlinit {
|
|||||||
$serialize_options_of{ $ident } = {
|
$serialize_options_of{ $ident } = {
|
||||||
autotype => 0,
|
autotype => 0,
|
||||||
typelib => $types,
|
typelib => $types,
|
||||||
namespace => $ns,
|
namespace => $ns,
|
||||||
};
|
};
|
||||||
$explain_options_of{ $ident } = {
|
$explain_options_of{ $ident } = {
|
||||||
readable => $self->readable(),
|
readable => $self->readable(),
|
||||||
@@ -124,8 +121,8 @@ sub wsdlinit {
|
|||||||
namespace => $ns,
|
namespace => $ns,
|
||||||
typelib => $types,
|
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};
|
||||||
return $self;
|
return $self;
|
||||||
} ## end sub wsdlinit
|
} ## end sub wsdlinit
|
||||||
@@ -133,51 +130,48 @@ sub wsdlinit {
|
|||||||
sub _wsdl_get_service :PRIVATE {
|
sub _wsdl_get_service :PRIVATE {
|
||||||
my $ident = ident shift;
|
my $ident = ident shift;
|
||||||
my $wsdl = $definitions_of{ $ident };
|
my $wsdl = $definitions_of{ $ident };
|
||||||
return $service_of{ $ident } = $servicename_of{ $ident }
|
return $service_of{ $ident } = $servicename_of{ $ident }
|
||||||
? $wsdl->find_service( $wsdl->get_targetNamespace() , $servicename_of{ $ident } )
|
? $wsdl->find_service( $wsdl->get_targetNamespace() , $servicename_of{ $ident } )
|
||||||
: $service_of{ $ident } = $wsdl->get_service()->[ 0 ];
|
: $service_of{ $ident } = $wsdl->get_service()->[ 0 ];
|
||||||
} ## end sub _wsdl_get_service
|
} ## end sub _wsdl_get_service
|
||||||
|
|
||||||
sub _wsdl_get_port :PRIVATE {
|
sub _wsdl_get_port :PRIVATE {
|
||||||
my $ident = ident shift;
|
my $ident = ident shift;
|
||||||
my $wsdl = $definitions_of{ $ident };
|
my $wsdl = $definitions_of{ $ident };
|
||||||
my $ns = $wsdl->get_targetNamespace();
|
my $ns = $wsdl->get_targetNamespace();
|
||||||
return $port_of{ $ident } = $portname_of{ $ident }
|
return $port_of{ $ident } = $portname_of{ $ident }
|
||||||
? $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 ];
|
||||||
} ## end sub _wsdl_get_port
|
}
|
||||||
|
|
||||||
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( $wsdl->_expand( $port->get_binding() ) )
|
$binding_of{ $ident } = $wsdl->find_binding( $wsdl->_expand( $port->get_binding() ) )
|
||||||
or die "no binding found for ", $port->get_binding();
|
or die "no binding found for ", $port->get_binding();
|
||||||
return $binding_of{ $ident };
|
return $binding_of{ $ident };
|
||||||
} ## end sub _wsdl_get_binding
|
}
|
||||||
|
|
||||||
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( $wsdl->_expand( $binding->get_type() ) )
|
$porttype_of{ $ident } = $wsdl->find_portType( $wsdl->_expand( $binding->get_type() ) )
|
||||||
or die "cannot find portType for " . $binding->get_type();
|
or die "cannot find portType for " . $binding->get_type();
|
||||||
return $porttype_of{ $ident };
|
return $porttype_of{ $ident };
|
||||||
} ## end sub _wsdl_get_portType
|
}
|
||||||
|
|
||||||
|
|
||||||
sub _wsdl_init_methods :PRIVATE {
|
sub _wsdl_init_methods :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 $ns = $wsdl->get_targetNamespace();
|
my $ns = $wsdl->get_targetNamespace();
|
||||||
|
|
||||||
# get bindings, portType, message, part(s)
|
# get bindings, portType, message, part(s) - use private methods for clear separation...
|
||||||
# - use cached values where possible for speed,
|
$self->_wsdl_get_service if not ($service_of{ $ident });
|
||||||
# private methods if not for clear separation...
|
|
||||||
$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";
|
|| die "Can't find binding";
|
||||||
my $portType = $porttype_of{ $ident } || $self->_wsdl_get_portType();
|
my $portType = $porttype_of{ $ident } || $self->_wsdl_get_portType();
|
||||||
@@ -204,67 +198,90 @@ sub _wsdl_init_methods :PRIVATE {
|
|||||||
$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 die "Message {$ns}$localname not found in WSDL definition";
|
||||||
|
|
||||||
$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
|
||||||
? do {
|
? do {
|
||||||
my $input = $binding_operation->first_input();
|
my $input = $binding_operation->first_input();
|
||||||
$input ? $input->get_namespace() : undef;
|
$input ? $input->get_namespace() : undef;
|
||||||
}
|
}
|
||||||
: undef;
|
: undef;
|
||||||
|
|
||||||
$method_info_of{ $ident }->{ $binding_operation->get_name() } = $method;
|
$method_info_of{ $ident }->{ $binding_operation->get_name() } = $method;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $method_info_of{ $ident };
|
return $method_info_of{ $ident };
|
||||||
}
|
}
|
||||||
|
|
||||||
sub call {
|
sub call {
|
||||||
my $self = shift;
|
my ($self, $method, @data_from) = @_;
|
||||||
my $ident = ident $self;
|
my $ident = ident $self;
|
||||||
my $method = shift;
|
|
||||||
my $data = ref $_[0] ? $_[0] : { @_ };
|
my ($data, $header) = ref $data_from[0]
|
||||||
|
? ($data_from[0], $data_from[1] )
|
||||||
$self->wsdlinit() if not ($definitions_of{ $ident });
|
: (@data_from>1)
|
||||||
$self->_wsdl_init_methods() if not ($method_info_of{ $ident });
|
? ( { @data_from }, undef )
|
||||||
|
: ( $data_from[0], undef );
|
||||||
my $client = $client_of{ $ident };
|
|
||||||
$client->set_proxy( $proxy_of{ $ident } || $port_of{ $ident }->get_location() );
|
$self->wsdlinit() if not ($definitions_of{ $ident });
|
||||||
$client->set_no_dispatch( $no_dispatch_of{ $ident } );
|
$self->_wsdl_init_methods() if not ($method_info_of{ $ident });
|
||||||
$client->set_outputxml( $outputtree_of{ $ident } ? 0 : 1 );
|
|
||||||
|
my $client = $client_of{ $ident };
|
||||||
my $response = (blessed $data)
|
$client->set_proxy( $proxy_of{ $ident } || $port_of{ $ident }->get_location() );
|
||||||
? $client->call( $method, $data )
|
$client->set_no_dispatch( $no_dispatch_of{ $ident } );
|
||||||
: do {
|
|
||||||
|
$client->set_outputxml( $outputxml_of{ $ident } ? 1 : 0 );
|
||||||
my $content = '';
|
|
||||||
# TODO support RPC-encoding: Top-Level element + namespace...
|
# maybe we should introduce something like $output{ $ident } with a fixed
|
||||||
foreach my $part ( @{ $method_info_of{ $ident }->{ $method }->{ parts } } ) {
|
# set of values - m{^(TREE|HASH|XML|SOM)$}xms ?
|
||||||
$client->set_on_action( sub { $part->get_targetNamespace() . '/' . $_[1] } );
|
if ( ( ! $outputtree_of{ $ident } )
|
||||||
$content .= $part->serialize( $method, $data,
|
&& ( ! $outputhash_of{ $ident } )
|
||||||
{
|
&& ( ! $outputxml_of{ $ident } ) ) {
|
||||||
%{ $serialize_options_of{ $ident } },
|
require SOAP::WSDL::Deserializer::SOM;
|
||||||
readable => $readable_of{ $ident },
|
$client->set_deserializer( SOAP::WSDL::Deserializer::SOM->new() );
|
||||||
} );
|
};
|
||||||
}
|
|
||||||
$client->call($method, $content);
|
my $method_info = $method_info_of{ $ident }->{ $method };
|
||||||
};
|
|
||||||
|
# TODO serialize both header and body, not only header
|
||||||
return $response if (
|
my $response = (blessed $data)
|
||||||
$outputxml_of{ $ident }
|
? $client->call( {
|
||||||
# || $outputhash_of{ $ident }
|
operation => $method,
|
||||||
|| $outputtree_of{ $ident }
|
soap_action => $method_info->{ soap_action },
|
||||||
|| $no_dispatch_of{ $ident } );
|
}, $data )
|
||||||
|
: do {
|
||||||
return unless $response; # nothing to do for one-ways
|
my $content = '';
|
||||||
# now convert into SOAP::SOM - bah !
|
# TODO support RPC-encoding: Top-Level element + namespace...
|
||||||
require SOAP::Lite;
|
foreach my $part ( @{ $method_info->{ parts } } ) {
|
||||||
return SOAP::Deserializer->new()->deserialize( $response );
|
$content .= $part->serialize( $method, $data,
|
||||||
|
{
|
||||||
|
%{ $serialize_options_of{ $ident } },
|
||||||
|
readable => $readable_of{ $ident },
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
$client->call(
|
||||||
|
{
|
||||||
|
operation => $method,
|
||||||
|
soap_action => $method_info->{ soap_action }
|
||||||
|
},
|
||||||
|
# absolutely stupid, but we need a reference which
|
||||||
|
# serializes to XML on stringification...
|
||||||
|
SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new({
|
||||||
|
value => $content
|
||||||
|
}),
|
||||||
|
SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new({
|
||||||
|
value => $header
|
||||||
|
})
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
return unless defined $response; # nothing to do for one-ways
|
||||||
|
return $response;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub explain {
|
sub explain {
|
||||||
@@ -278,18 +295,18 @@ sub explain {
|
|||||||
__END__
|
__END__
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME
|
=head1 NAME
|
||||||
|
|
||||||
SOAP::WSDL - SOAP with WSDL support
|
SOAP::WSDL - SOAP with WSDL support
|
||||||
|
|
||||||
=head1 Overview
|
=head1 Overview
|
||||||
|
|
||||||
For creating Perl classes instrumenting a web service with a WSDL definition,
|
For creating Perl classes instrumenting a web service with a WSDL definition,
|
||||||
read L<SOAP::WSDL::Manual>.
|
read L<SOAP::WSDL::Manual>.
|
||||||
|
|
||||||
For using an interpreting (thus slow and somewhat troublesome) WSDL based
|
For using an interpreting (thus slow and somewhat troublesome) WSDL based
|
||||||
SOAP client, which mimics L<SOAP::Lite|SOAP::Lite>'s API, read on.
|
SOAP client, which mimics L<SOAP::Lite|SOAP::Lite>'s API, read on.
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
@@ -300,30 +317,47 @@ SOAP client, which mimics L<SOAP::Lite|SOAP::Lite>'s API, read on.
|
|||||||
|
|
||||||
my $result = $soap->call('MyMethod', %data);
|
my $result = $soap->call('MyMethod', %data);
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP::WSDL provides easy access to Web Services with WSDL descriptions.
|
||||||
|
|
||||||
SOAP::WSDL provides easy access to Web Services with WSDL descriptions.
|
|
||||||
|
|
||||||
The WSDL is parsed and stored in memory.
|
The WSDL is parsed and stored in memory.
|
||||||
|
|
||||||
Your data is serialized according to the rules in the WSDL.
|
Your data is serialized according to the rules in the WSDL.
|
||||||
|
|
||||||
The only transport mechanisms currently supported are http and https.
|
|
||||||
|
|
||||||
=head1 METHODS
|
The only transport mechanisms currently supported are http and https.
|
||||||
|
|
||||||
=head2 new
|
=head1 METHODS
|
||||||
|
|
||||||
Constructor. All parameters passed are passed to the corresponding methods.
|
=head2 new
|
||||||
|
|
||||||
|
Constructor. All parameters passed are passed to the corresponding methods.
|
||||||
|
|
||||||
=head2 call
|
=head2 call
|
||||||
|
|
||||||
Performs a SOAP call. The result is either an object tree (with outputtree),
|
Performs a SOAP call. The result is either an object tree (with outputtree),
|
||||||
a hash reference (with outputhash), plain XML (with outputxml) or a SOAP::SOM
|
a hash reference (with outputhash), plain XML (with outputxml) or a SOAP::SOM
|
||||||
object (with neither of the above set).
|
object (with neither of the above set).
|
||||||
|
|
||||||
|
call() can be called in different ways:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * Old-style idiom
|
||||||
|
|
||||||
my $result = $soap->call('method', %data);
|
my $result = $soap->call('method', %data);
|
||||||
|
|
||||||
|
Does not support SOAP header data.
|
||||||
|
|
||||||
|
=item * New-style idiom
|
||||||
|
|
||||||
|
my $result = $soap->call('method', $body_ref, $header_ref );
|
||||||
|
|
||||||
|
Does support SOAP header data. $body_ref and $header ref may either be
|
||||||
|
hash refs or SOAP::WSDL::XSD::Typelib::* derived objects.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
=head2 wsdlinit
|
=head2 wsdlinit
|
||||||
|
|
||||||
Reads the WSDL file and initializes SOAP::WSDL for working with it.
|
Reads the WSDL file and initializes SOAP::WSDL for working with it.
|
||||||
@@ -413,30 +447,30 @@ Returns the soap object, so you can chain calls like
|
|||||||
|
|
||||||
When set, call() returns the plain request XML instead of dispatching the
|
When set, call() returns the plain request XML instead of dispatching the
|
||||||
SOAP call to the SOAP service. Handy for testing/debugging.
|
SOAP call to the SOAP service. Handy for testing/debugging.
|
||||||
|
|
||||||
=head1 ACCESS TO SOAP::WSDL's internals
|
|
||||||
|
|
||||||
=head2 get_client / set_client
|
|
||||||
|
|
||||||
Returns the SOAP client implementation used (normally a SOAP::WSDL::Client
|
|
||||||
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
|
|
||||||
|
|
||||||
See the examples/ directory.
|
|
||||||
|
|
||||||
=head1 Differences to previous versions
|
|
||||||
|
|
||||||
=over
|
=head1 ACCESS TO SOAP::WSDL's internals
|
||||||
|
|
||||||
|
=head2 get_client / set_client
|
||||||
|
|
||||||
|
Returns the SOAP client implementation used (normally a SOAP::WSDL::Client
|
||||||
|
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
|
||||||
|
|
||||||
|
See the examples/ directory.
|
||||||
|
|
||||||
|
=head1 Differences to previous versions
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
=item * WSDL handling
|
=item * WSDL handling
|
||||||
|
|
||||||
@@ -448,57 +482,69 @@ 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
|
||||||
as hash ref, and how to render the WSDL elements found into perl classes.
|
as hash ref, and how to render the WSDL elements found into perl classes.
|
||||||
|
|
||||||
Yup your're right, there's a builting code generation facility. Read
|
Yup your're right, there's a builting code generation facility. Read
|
||||||
L<SOAP::WSDL::Manual> for using it.
|
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 outputtxml set to true now returns the complete SOAP
|
||||||
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
|
||||||
envelope, not only the body's content.
|
envelope, not only the body's content.
|
||||||
|
|
||||||
=item * servicename/portname
|
=item * servicename/portname
|
||||||
|
|
||||||
Both servicename and portname can only be called B<after> calling wsdlinit().
|
Both servicename and portname can only be called B<after> calling wsdlinit().
|
||||||
|
|
||||||
You may pass the servicename and portname as attributes to wsdlinit, though.
|
You may pass the servicename and portname as attributes to wsdlinit, though.
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head1 Differences to SOAP::Lite
|
=head1 Differences to SOAP::Lite
|
||||||
|
|
||||||
=head3 Output formats
|
=head2 Message style/encoding
|
||||||
|
|
||||||
In contrast to SOAP::Lite, SOAP::WSDL supports the following output formats:
|
While SOAP::Lite supports rpc/encoded style/encoding only, SOAP::WSDL currently
|
||||||
|
supports document/literal style/encoding.
|
||||||
=over
|
|
||||||
|
=head2 autotype / type information
|
||||||
=item * SOAP::SOM objects.
|
|
||||||
|
SOAP::Lite defaults to transmitting XML type information by default, where
|
||||||
This is the default. SOAP::Lite is required for outputting SOAP::SOM objects.
|
SOAP::WSDL defaults to leaving it out.
|
||||||
|
|
||||||
=item * Object trees.
|
autotype(1) might even be broken in SOAP::WSDL - it's not well-tested, yet.
|
||||||
|
|
||||||
This is the recommended output format.
|
=head2 Output formats
|
||||||
You need a class resolver (typemap) for outputting object trees.
|
|
||||||
See L<class_resolver|class_resolver> above.
|
In contrast to SOAP::Lite, SOAP::WSDL supports the following output formats:
|
||||||
|
|
||||||
=item * Hash refs
|
=over
|
||||||
|
|
||||||
This is for convnience: A single hash ref containing the content of the
|
=item * SOAP::SOM objects.
|
||||||
SOAP body.
|
|
||||||
|
This is the default. SOAP::Lite is required for outputting SOAP::SOM objects.
|
||||||
=item * xml
|
|
||||||
|
=item * Object trees.
|
||||||
See below.
|
|
||||||
|
This is the recommended output format.
|
||||||
=back
|
You need a class resolver (typemap) for outputting object trees.
|
||||||
|
See L<class_resolver|class_resolver> above.
|
||||||
=head3 outputxml
|
|
||||||
|
=item * Hash refs
|
||||||
|
|
||||||
|
This is for convnience: A single hash ref containing the content of the
|
||||||
|
SOAP body.
|
||||||
|
|
||||||
|
=item * xml
|
||||||
|
|
||||||
|
See below.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 outputxml
|
||||||
|
|
||||||
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.
|
||||||
@@ -515,34 +561,34 @@ SOAP::WSDL::Client and implementing something like
|
|||||||
$soap_wsdl_client->call( mySoapMethod, @_);
|
$soap_wsdl_client->call( mySoapMethod, @_);
|
||||||
}
|
}
|
||||||
|
|
||||||
You may even do this in a class factory - 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
|
=head3 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.
|
||||||
|
|
||||||
This has to be done in the SOAP client used by SOAP::WSDL - see
|
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 * SOAP Headers are not supported
|
||||||
|
|
||||||
There's no way to use SOAP Headers with SOAP::WSDL yet.
|
There's no way to use SOAP Headers with SOAP::WSDL yet.
|
||||||
|
|
||||||
=item * Apache SOAP datatypes are not supported
|
=item * Apache SOAP datatypes are not supported
|
||||||
|
|
||||||
You currently can't use SOAP::WSDL with Apache SOAP datatypes like map.
|
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 * outputhash
|
||||||
|
|
||||||
outputhash is not implemented yet.
|
outputhash is not implemented yet.
|
||||||
|
|
||||||
=item * Unsupported XML Schema definitions
|
=item * Unsupported XML Schema definitions
|
||||||
@@ -587,25 +633,60 @@ The following facets have no influence yet:
|
|||||||
enumeration
|
enumeration
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head1 ACKNOWLEDGMENTS
|
=head1 SEE ALSO
|
||||||
|
|
||||||
There are many people out there who fostered SOAP::WSDL's developement.
|
=head2 Related projects
|
||||||
I would like to thank them all (and apologize to all those I have forgotten).
|
|
||||||
|
=over
|
||||||
Giovanni S. Fois wrote a improved version of SOAP::WSDL (which eventually became v1.23)
|
|
||||||
|
=item * L<SOAP::Lite|SOAP::Lite>
|
||||||
Damian A. Martinez Gelabert, Dennis S. Hennen, Dan Horne, Peter Orvos, Marc Overmeer,
|
|
||||||
Jon Robens, Isidro Vila Verde and Glenn Wood spotted bugs and/or
|
Full featured SOAP-library, little WSDL support. Supports rpc-encoded style only. Many protocols supported.
|
||||||
suggested improvements in the 1.2x releases.
|
|
||||||
|
=item * <XML::Compile::WSDL|XML::Compile::WSDL>
|
||||||
Andreas 'ACID' Specht constantly asked for better performance.
|
|
||||||
|
A promising-looking approach derived from a cool functional DOM-based XML schema parser.
|
||||||
Numerous people sent me their real-world WSDL files for testing. Thank you.
|
|
||||||
|
Will support encoding/decoding of SOAP messages based on WSDL definitions.
|
||||||
Paul Kulchenko and Byrne Reese wrote and maintained SOAP::Lite and thus provided a
|
|
||||||
base (and counterpart) for SOAP::WSDL.
|
Not yet finished at the time of writing - but you may wish to give it a try, especially
|
||||||
|
if you need to adhere very closely to the XML Schema / WSDL specs.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Sources of documentation
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * SOAP::WSDL homepage at sourceforge.net
|
||||||
|
|
||||||
|
L<http://soap-wsdl.sourceforge.net>
|
||||||
|
|
||||||
|
=item * SOAP::WSDL forum at CPAN::Forum
|
||||||
|
|
||||||
|
L<http://www.cpanforum.com/dist/SOAP-WSDL>
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 ACKNOWLEDGMENTS
|
||||||
|
|
||||||
|
There are many people out there who fostered SOAP::WSDL's developement.
|
||||||
|
I would like to thank them all (and apologize to all those I have forgotten).
|
||||||
|
|
||||||
|
Giovanni S. Fois wrote a improved version of SOAP::WSDL (which eventually became v1.23)
|
||||||
|
|
||||||
|
Damian A. Martinez Gelabert, Dennis S. Hennen, Dan Horne, Peter Orvos, Mark Overmeer,
|
||||||
|
Jon Robens, Isidro Vila Verde and Glenn Wood spotted bugs and/or
|
||||||
|
suggested improvements in the 1.2x releases.
|
||||||
|
|
||||||
|
Andreas 'ACID' Specht constantly asked for better performance.
|
||||||
|
|
||||||
|
Numerous people sent me their real-world WSDL files for testing. Thank you.
|
||||||
|
|
||||||
|
Paul Kulchenko and Byrne Reese wrote and maintained SOAP::Lite and thus provided a
|
||||||
|
base (and counterpart) for SOAP::WSDL.
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE
|
||||||
|
|
||||||
Copyright 2004-2007 Martin Kutter.
|
Copyright 2004-2007 Martin Kutter.
|
||||||
@@ -616,6 +697,13 @@ the same 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: 218 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: WSDL.pm 218 2007-09-10 16:19:23Z kutterma $
|
||||||
|
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
+59
-56
@@ -3,20 +3,20 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use Carp;
|
use Carp;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use List::Util qw(first);
|
use List::Util qw(first);
|
||||||
|
|
||||||
my %id_of :ATTR(:name<id> :default<()>);
|
my %id_of :ATTR(:name<id> :default<()>);
|
||||||
my %name_of :ATTR(:name<name> :default<()>);
|
my %name_of :ATTR(:name<name> :default<()>);
|
||||||
my %documentation_of :ATTR(:name<documentation> :default<()>);
|
my %documentation_of :ATTR(:name<documentation> :default<()>);
|
||||||
my %targetNamespace_of :ATTR(:name<targetNamespace> :default<()>);
|
my %targetNamespace_of :ATTR(:name<targetNamespace> :default<()>);
|
||||||
my %xmlns_of :ATTR(:name<xmlns> :default<{}>);
|
my %xmlns_of :ATTR(:name<xmlns> :default<{}>);
|
||||||
my %parent_of :ATTR(:name<parent> :default<()>);
|
my %parent_of :ATTR(:name<parent> :default<()>);
|
||||||
|
|
||||||
sub DEMOLISH {
|
sub DEMOLISH {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
# delete upward references
|
# delete upward references
|
||||||
delete $parent_of{ ident $self };
|
delete $parent_of{ ident $self };
|
||||||
}
|
}
|
||||||
|
|
||||||
sub STORABLE_freeze_pre :CUMULATIVE {};
|
sub STORABLE_freeze_pre :CUMULATIVE {};
|
||||||
sub STORABLE_freeze_post :CUMULATIVE {};
|
sub STORABLE_freeze_post :CUMULATIVE {};
|
||||||
@@ -29,15 +29,15 @@ sub STORABLE_thaw_post :CUMULATIVE { return $_[0] };
|
|||||||
sub AUTOMETHOD {
|
sub AUTOMETHOD {
|
||||||
my ($self, $ident, @values) = @_;
|
my ($self, $ident, @values) = @_;
|
||||||
my $subname = $_; # Requested subroutine name is passed via $_
|
my $subname = $_; # Requested subroutine name is passed via $_
|
||||||
|
|
||||||
# we're called as $self->push_something(@values);
|
# we're called as $self->push_something(@values);
|
||||||
if ($subname =~s{^push_}{}xms) {
|
if ($subname =~s{^push_}{}xms) {
|
||||||
my $getter = "get_$subname";
|
my $getter = "get_$subname";
|
||||||
my $setter = "set_$subname";
|
my $setter = "set_$subname";
|
||||||
## Checking here is paranoid - will fail fatally if
|
## Checking here is paranoid - will fail fatally if
|
||||||
## there is no setter...
|
## there is no setter...
|
||||||
## And we would have to check getters, too.
|
## And we would have to check getters, too.
|
||||||
## Maybe do it the Conway way via the Symbol table...
|
## Maybe do it the Conway way via the Symbol table...
|
||||||
## ... can is way slow...
|
## ... can is way slow...
|
||||||
# croak "no set accessor found for push_$subname"
|
# croak "no set accessor found for push_$subname"
|
||||||
# if not ($self->can( $setter ));
|
# if not ($self->can( $setter ));
|
||||||
@@ -78,12 +78,15 @@ sub init {
|
|||||||
my @args = @_;
|
my @args = @_;
|
||||||
foreach my $value (@args)
|
foreach my $value (@args)
|
||||||
{
|
{
|
||||||
die $value if (not defined ($value->{ Name }));
|
die @args if (not defined ($value->{ Name }));
|
||||||
if ($value->{ Name } =~m{^xmlns\:}xms) {
|
if ($value->{ Name } =~m{^xmlns\:}xms) {
|
||||||
die $xmlns_of{ ident $self }
|
die $xmlns_of{ ident $self }
|
||||||
if ref $xmlns_of{ ident $self } ne 'HASH';
|
if ref $xmlns_of{ ident $self } ne 'HASH';
|
||||||
|
|
||||||
|
# add namespaces
|
||||||
$xmlns_of{ ident $self }->{ $value->{ Value } } =
|
$xmlns_of{ ident $self }->{ $value->{ Value } } =
|
||||||
$value->{ LocalName };
|
$value->{ LocalName };
|
||||||
|
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
elsif ($value->{ Name } =~m{^xmlns$}xms) {
|
elsif ($value->{ Name } =~m{^xmlns$}xms) {
|
||||||
@@ -109,50 +112,50 @@ sub to_typemap {
|
|||||||
warn "to_typemap";
|
warn "to_typemap";
|
||||||
return q{};
|
return q{};
|
||||||
}
|
}
|
||||||
|
|
||||||
sub toClass {
|
sub toClass {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
warn 'toClass is deprecated and will be removed before reaching 2.01 - '
|
warn 'toClass is deprecated and will be removed before reaching 2.01 - '
|
||||||
. 'use to_class instead (' . caller() . ')';
|
. 'use to_class instead (' . caller() . ')';
|
||||||
$self->to_class(@_);
|
$self->to_class(@_);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub to_class {
|
sub to_class {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $opt = shift;
|
my $opt = shift;
|
||||||
my $template = shift;
|
my $template = shift;
|
||||||
|
|
||||||
$opt->{ base_path } ||= '.';
|
$opt->{ base_path } ||= '.';
|
||||||
|
|
||||||
my $element_prefix = $opt->{ element_prefix } || $opt->{ prefix };
|
my $element_prefix = $opt->{ element_prefix } || $opt->{ prefix };
|
||||||
my $type_prefix = $opt->{ type_prefix } || $opt->{ prefix };
|
my $type_prefix = $opt->{ type_prefix } || $opt->{ prefix };
|
||||||
|
|
||||||
if (($type_prefix) && ($type_prefix !~m{ :: $ }xms ) ) {
|
if (($type_prefix) && ($type_prefix !~m{ :: $ }xms ) ) {
|
||||||
warn 'type_prefix should end with "::"';
|
warn 'type_prefix should end with "::"';
|
||||||
$type_prefix .= '::';
|
$type_prefix .= '::';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($element_prefix) && ($element_prefix !~m{ :: $ }xms) ) {
|
if (($element_prefix) && ($element_prefix !~m{ :: $ }xms) ) {
|
||||||
warn 'element_prefix should end with "::"';
|
warn 'element_prefix should end with "::"';
|
||||||
$element_prefix .= '::';
|
$element_prefix .= '::';
|
||||||
}
|
}
|
||||||
|
|
||||||
# Be careful: a Element may be ComplexType, too
|
# Be careful: a Element may be ComplexType, too
|
||||||
# (but not vice versa)
|
# (but not vice versa)
|
||||||
my $prefix = $self->isa('SOAP::WSDL::XSD::Element')
|
my $prefix = $self->isa('SOAP::WSDL::XSD::Element')
|
||||||
? $element_prefix
|
? $element_prefix
|
||||||
: $type_prefix;
|
: $type_prefix;
|
||||||
|
|
||||||
die 'No prefix specified' if not $prefix;
|
die 'No prefix specified' if not $prefix;
|
||||||
|
|
||||||
my $filename = $prefix . $self->get_name() . '.pm';
|
my $filename = $prefix . $self->get_name() . '.pm';
|
||||||
$filename =~s{::}{/}xmsg;
|
$filename =~s{::}{/}xmsg;
|
||||||
|
|
||||||
my $output = $opt->{ output } || $filename;
|
my $output = $opt->{ output } || $filename;
|
||||||
|
|
||||||
require Template;
|
require Template;
|
||||||
my $tt = Template->new(
|
my $tt = Template->new(
|
||||||
RELATIVE => 1,
|
RELATIVE => 1,
|
||||||
OUTPUT_PATH => $opt->{ base_path },
|
OUTPUT_PATH => $opt->{ base_path },
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -166,5 +169,5 @@ sub to_class {
|
|||||||
$output
|
$output
|
||||||
)
|
)
|
||||||
or die $tt->error();
|
or die $tt->error();
|
||||||
}
|
}
|
||||||
1;
|
1;
|
||||||
|
|||||||
+25
-25
@@ -2,26 +2,26 @@ package SOAP::WSDL::Binding;
|
|||||||
use strict;
|
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 base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
my %operation_of :ATTR(:name<operation> :default<()>);
|
my %operation_of :ATTR(:name<operation> :default<()>);
|
||||||
my %type_of :ATTR(:name<type> :default<()>);
|
my %type_of :ATTR(:name<type> :default<()>);
|
||||||
my %transport_of :ATTR(:name<transport> :default<()>);
|
my %transport_of :ATTR(:name<transport> :default<()>);
|
||||||
my %style_of :ATTR(:name<style> :default<()>);
|
my %style_of :ATTR(:name<style> :default<()>);
|
||||||
|
|
||||||
|
|
||||||
sub explain {
|
|
||||||
|
sub explain {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $opt = shift;
|
my $opt = shift;
|
||||||
my $name = $self->get_name();
|
my $name = $self->get_name();
|
||||||
|
|
||||||
die 'required atribute wsdl missing' if not $opt->{ wsdl };
|
die 'required atribute wsdl missing' if not $opt->{ wsdl };
|
||||||
|
|
||||||
my $portType = $opt->{ wsdl }->find_portType(
|
my $portType = $opt->{ wsdl }->find_portType(
|
||||||
$opt->{ wsdl }->_expand( $self->get_type() )
|
$opt->{ wsdl }->_expand( $self->get_type() )
|
||||||
) or die 'portType not found: ' . $self->get_type();
|
) or die 'portType not found: ' . $self->get_type();
|
||||||
|
|
||||||
my $txt = <<"EOT";
|
my $txt = <<"EOT";
|
||||||
|
|
||||||
=head2 SOAP Operations
|
=head2 SOAP Operations
|
||||||
@@ -31,21 +31,21 @@ B<Note:>
|
|||||||
Input, output and fault messages are stated as perl hash refs.
|
Input, output and fault messages are stated as perl hash refs.
|
||||||
|
|
||||||
These are only for informational purposes - the actual implementation
|
These are only for informational purposes - the actual implementation
|
||||||
normally uses object trees, not hash refs, though the input messages
|
normally uses object trees, not hash refs, though the input messages
|
||||||
may be passed to the respective methods as hash refs and will be
|
may be passed to the respective methods as hash refs and will be
|
||||||
converted to object trees automatically.
|
converted to object trees automatically.
|
||||||
|
|
||||||
EOT
|
EOT
|
||||||
|
|
||||||
foreach my $operation (@{ $self->get_operation() }) {
|
foreach my $operation (@{ $self->get_operation() }) {
|
||||||
|
|
||||||
my $operation_name = $operation->get_name();
|
my $operation_name = $operation->get_name();
|
||||||
my $operation_style = $operation->get_style() || q{};
|
my $operation_style = $operation->get_style() || q{};
|
||||||
|
|
||||||
my $port_operation = first { $_->get_name eq $operation_name }
|
my $port_operation = first { $_->get_name eq $operation_name }
|
||||||
@{ $portType->get_operation() }
|
@{ $portType->get_operation() }
|
||||||
or die "operation not found:" . $operation->get_name();
|
or die "operation not found:" . $operation->get_name();
|
||||||
|
|
||||||
# TODO rename lexical $input to "message"
|
# TODO rename lexical $input to "message"
|
||||||
my $input_message = do {
|
my $input_message = do {
|
||||||
my $input = $port_operation->first_input();
|
my $input = $port_operation->first_input();
|
||||||
@@ -59,8 +59,8 @@ EOT
|
|||||||
my $input = $port_operation->first_fault();
|
my $input = $port_operation->first_fault();
|
||||||
$input ? $input->explain($opt) : q{};
|
$input ? $input->explain($opt) : q{};
|
||||||
};
|
};
|
||||||
|
|
||||||
$txt .= <<"EOT";
|
$txt .= <<"EOT";
|
||||||
|
|
||||||
=head3 $operation_name
|
=head3 $operation_name
|
||||||
|
|
||||||
@@ -81,32 +81,32 @@ EOT
|
|||||||
|
|
||||||
return $txt;
|
return $txt;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub to_typemap {
|
sub to_typemap {
|
||||||
my ($self, $opt) = @_;
|
my ($self, $opt) = @_;
|
||||||
my $name = $self->get_name();
|
my $name = $self->get_name();
|
||||||
|
|
||||||
my $portType = $opt->{ wsdl }->find_portType(
|
my $portType = $opt->{ wsdl }->find_portType(
|
||||||
$opt->{ wsdl }->_expand( $self->get_type )
|
$opt->{ wsdl }->_expand( $self->get_type )
|
||||||
) or die 'portType not found: ' . $self->get_type;
|
) or die 'portType not found: ' . $self->get_type;
|
||||||
|
|
||||||
my $txt = q{};
|
my $txt = q{};
|
||||||
foreach my $operation (@{ $self->get_operation() })
|
foreach my $operation (@{ $self->get_operation() })
|
||||||
{
|
{
|
||||||
my $operation_name = $operation->get_name();
|
my $operation_name = $operation->get_name();
|
||||||
my $operation_style = $operation->get_style() || q{};
|
my $operation_style = $operation->get_style() || q{};
|
||||||
|
|
||||||
my ($port_operation) = grep { $_->get_name eq $operation_name }
|
my ($port_operation) = grep { $_->get_name eq $operation_name }
|
||||||
@{ $portType->get_operation() }
|
@{ $portType->get_operation() }
|
||||||
or die "operation not found:" . $operation->get_name();
|
or die "operation not found:" . $operation->get_name();
|
||||||
|
|
||||||
no strict qw(refs);
|
no strict qw(refs);
|
||||||
$txt .= join q{},
|
$txt .= join q{},
|
||||||
map {
|
map {
|
||||||
my $message = $port_operation->$_;
|
my $message = $port_operation->$_;
|
||||||
$message
|
$message
|
||||||
? $message->to_typemap($opt)
|
? $message->to_typemap($opt)
|
||||||
: q{}
|
: q{}
|
||||||
} qw(first_input first_output first_fault);
|
} qw(first_input first_output first_fault);
|
||||||
}
|
}
|
||||||
return $txt;
|
return $txt;
|
||||||
|
|||||||
+243
-147
@@ -2,44 +2,101 @@ package SOAP::WSDL::Client;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Carp;
|
use Carp;
|
||||||
|
|
||||||
use Class::Std::Storable;
|
|
||||||
use LWP::UserAgent;
|
|
||||||
use HTTP::Request;
|
|
||||||
use Scalar::Util qw(blessed);
|
|
||||||
|
|
||||||
use SOAP::WSDL::Envelope;
|
|
||||||
use SOAP::WSDL::Expat::MessageParser;
|
|
||||||
use SOAP::WSDL::SOAP::Typelib::Fault11;
|
|
||||||
|
|
||||||
# Package globals for speed...
|
use Class::Std::Storable;
|
||||||
|
use LWP::UserAgent;
|
||||||
|
use HTTP::Request;
|
||||||
|
use Scalar::Util qw(blessed);
|
||||||
|
|
||||||
|
use SOAP::WSDL::Factory::Deserializer;
|
||||||
|
use SOAP::WSDL::Factory::Serializer;
|
||||||
|
use SOAP::WSDL::Factory::Transport;
|
||||||
|
use SOAP::WSDL::Expat::MessageParser;
|
||||||
|
|
||||||
|
our $VERSION='2.00_13';
|
||||||
|
|
||||||
|
# Package global for speed and memory savings.
|
||||||
|
# But should be factored out into serializer/deserializer...
|
||||||
my $PARSER;
|
my $PARSER;
|
||||||
|
|
||||||
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
|
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
|
||||||
my %no_dispatch_of :ATTR(:name<no_dispatch> :default<()>);
|
my %no_dispatch_of :ATTR(:name<no_dispatch> :default<()>);
|
||||||
my %outputxml_of :ATTR(:name<outputxml> :default<()>);
|
my %outputxml_of :ATTR(:name<outputxml> :default<()>);
|
||||||
my %proxy_of :ATTR(:name<proxy> :default<()>);
|
my %transport_of :ATTR(:name<transport> :default<()>);
|
||||||
|
my %endpoint_of :ATTR(:name<endpoint> :default<()>);
|
||||||
my %fault_class_of :ATTR(:name<fault_class> :default<SOAP::WSDL::SOAP::Typelib::Fault11>);
|
|
||||||
my %trace_of :ATTR(:set<trace> :init_arg<trace> :default<()> );
|
my %soap_version_of :ATTR(:get<soap_version> :init_attr<soap_version> :default<'1.1'>);
|
||||||
my %on_action_of :ATTR(:name<on_action> :default<()>);
|
|
||||||
my %content_type_of :ATTR(:name<content_type> :default<text/xml; charset=utf8>);
|
my %trace_of :ATTR(:set<trace> :init_arg<trace> :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 %serializer_of :ATTR(:name<serializer> :default<()>);
|
||||||
|
my %deserializer_of :ATTR(:name<deserializer> :default<()>);
|
||||||
|
|
||||||
#/#trick editors
|
|
||||||
|
|
||||||
# TODO remove when preparing 2.01
|
# TODO remove when preparing 2.01
|
||||||
sub outputtree { warn 'outputtree is deprecated and'
|
sub outputtree { warn 'outputtree is deprecated and'
|
||||||
. 'will be removed before reaching v2.01 !' }
|
. 'will be removed before reaching v2.01 !' }
|
||||||
|
|
||||||
sub get_trace {
|
sub BUILD {
|
||||||
my $ident = ident $_[0];
|
my ($self, $ident, $attrs_of_ref) = @_;
|
||||||
return $trace_of{ $ident }
|
|
||||||
? ref $trace_of{ $ident } eq 'CODE'
|
if (exists $attrs_of_ref->{ proxy }) {
|
||||||
? $trace_of{ $ident }
|
$self->set_proxy( $attrs_of_ref->{ proxy } );
|
||||||
: sub { warn @_ }
|
delete $attrs_of_ref->{ proxy };
|
||||||
: ()
|
}
|
||||||
}
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_trace {
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
sub set_proxy {
|
||||||
|
my ($self, @args_from) = @_;
|
||||||
|
my $ident = ident $self;
|
||||||
|
|
||||||
|
# remember old value to return it later - Class::Std does so, too
|
||||||
|
my $old_value = $transport_of{ $ident };
|
||||||
|
|
||||||
|
# accept both list and list ref args
|
||||||
|
@args_from = @{ $args_from[0] } if ref $args_from[0];
|
||||||
|
|
||||||
|
# remember endpoint
|
||||||
|
$endpoint_of{ $ident } = $args_from[0];
|
||||||
|
|
||||||
|
# set transport - SOAP::Lite works similar...
|
||||||
|
$transport_of{ $ident } = SOAP::WSDL::Factory::Transport
|
||||||
|
->get_transport( @args_from );
|
||||||
|
|
||||||
|
return $old_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub set_soap_version {
|
||||||
|
my $ident = ident shift;
|
||||||
|
|
||||||
|
# remember old value to return it later - Class::Std does so, too
|
||||||
|
my $soap_version = $soap_version_of{ $ident };
|
||||||
|
|
||||||
|
# re-setting the soap version invalidates the
|
||||||
|
# serializer object
|
||||||
|
delete $serializer_of{ $ident };
|
||||||
|
delete $deserializer_of{ $ident };
|
||||||
|
delete $transport_of{ $ident };
|
||||||
|
|
||||||
|
$soap_version_of{ $ident } = shift;
|
||||||
|
|
||||||
|
return $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);
|
no strict qw(refs);
|
||||||
@@ -56,119 +113,153 @@ SUBFACTORY: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BEGIN {
|
|
||||||
$PARSER = SOAP::WSDL::Expat::MessageParser->new();
|
|
||||||
}
|
|
||||||
|
|
||||||
sub call {
|
sub call {
|
||||||
my $self = shift;
|
my ($self, $method, @data_from) = @_;
|
||||||
my $method = shift;
|
|
||||||
my $ident = ident $self;
|
my $ident = ident $self;
|
||||||
my $data = ref $_[0]
|
|
||||||
? $_[0]
|
|
||||||
: (@_>1)
|
|
||||||
? { @_ }
|
|
||||||
: $_[0];
|
|
||||||
|
|
||||||
my $soap_action;
|
|
||||||
my $trace_sub = $self->get_trace();
|
|
||||||
my $envelope = SOAP::WSDL::Envelope->serialize( $method, $data );
|
|
||||||
|
|
||||||
if (blessed $data
|
# the only valid idiom for calling a method with both a header and a body
|
||||||
&& $data->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType'))
|
# is
|
||||||
{
|
# ->call($method, $body_ref, $header_ref);
|
||||||
# TODO replace by something derived from binding - this is just a
|
#
|
||||||
# workaround...
|
# These other idioms all assume an empty header:
|
||||||
$soap_action = join '/', $data->get_xmlns(), $method;
|
# ->call($method, %body_of); # %body_of is a hash
|
||||||
}
|
# ->call($method, $body); # $body is a scalar
|
||||||
else {
|
my ($data, $header) = ref $data_from[0]
|
||||||
$envelope = SOAP::WSDL::Envelope->serialize( $method, $data );
|
? ($data_from[0], $data_from[1] )
|
||||||
# TODO add something like SOAP::Lite's on_action mechanism
|
: (@data_from>1)
|
||||||
$soap_action = $on_action_of{$ident}->( $self, $method ) if ($on_action_of{$ident});
|
? ( { @data_from }, undef )
|
||||||
}
|
: ( $data_from[0], undef );
|
||||||
|
|
||||||
|
# get operation name and soap_action
|
||||||
|
my ($operation, $soap_action) = (ref $method eq 'HASH')
|
||||||
|
? ( $method->{ operation }, $method->{ soap_action } )
|
||||||
|
: (blessed $data
|
||||||
|
&& $data->isa('SOAP::WSDL::XSD::Typelib::Builtin::anyType'))
|
||||||
|
? ( $method , (join '/', $data->get_xmlns(), $method) )
|
||||||
|
: ( $method, q{} );
|
||||||
|
|
||||||
|
$serializer_of{ $ident } ||= SOAP::WSDL::Factory::Serializer->get_serializer({
|
||||||
|
soap_version => $self->get_soap_version(),
|
||||||
|
});
|
||||||
|
|
||||||
|
my $envelope = $serializer_of{ $ident }->serialize({
|
||||||
|
method => $operation,
|
||||||
|
body => $data,
|
||||||
|
header => $header,
|
||||||
|
});
|
||||||
|
|
||||||
return $envelope if $self->no_dispatch();
|
return $envelope if $self->no_dispatch();
|
||||||
|
|
||||||
# get response via transport layer
|
# always quote SOAPAction header.
|
||||||
# maybe we should return a result with the following methods:
|
# WS-I BP 1.0 R1109
|
||||||
# - result: returns the result of the call (like SOAP::Lite, but as
|
if ($soap_action) {
|
||||||
# object tree)
|
$soap_action =~s{\A(:?"|')?}{"}xms;
|
||||||
# - header: returns the content of the SOAP header
|
$soap_action =~s{(:?"|')?\Z}{"}xms;
|
||||||
# - fault: returns the result of the call if a SOAP fault is sent back
|
}
|
||||||
# by the server. Retuns undef (nothing) if the call has been
|
else {
|
||||||
# processed without errors.
|
$soap_action = q{""};
|
||||||
my $ua = LWP::UserAgent->new();
|
|
||||||
my $request = HTTP::Request->new( 'POST',
|
|
||||||
$self->get_proxy(),
|
|
||||||
[ 'Content-Type', $content_type_of{ $ident },
|
|
||||||
'Content-Length', length($envelope),
|
|
||||||
'SOAPAction', $soap_action,
|
|
||||||
],
|
|
||||||
$envelope );
|
|
||||||
|
|
||||||
|
|
||||||
$trace_sub->( $request->as_string() ) if $trace_of{ $ident }; # if for speed
|
|
||||||
my $response = $ua->request( $request );
|
|
||||||
$trace_sub->( $response->as_string() ) if $trace_of{ $ident }; # if for speed
|
|
||||||
|
|
||||||
return $response->content() if ($self->outputxml() );
|
|
||||||
|
|
||||||
$PARSER->class_resolver( $self->get_class_resolver() );
|
|
||||||
|
|
||||||
# if we had no success (Transport layer error status code)
|
|
||||||
# or if transport layer failed
|
|
||||||
if ($response->code() != 200) {
|
|
||||||
# Try deserializing response - there may be some
|
|
||||||
if ($response->content) {
|
|
||||||
eval { $PARSER->parse( $response->content() ); };
|
|
||||||
return $PARSER->get_data() if (not $@);
|
|
||||||
warn "could not deserialize response: $@";
|
|
||||||
};
|
|
||||||
|
|
||||||
# generate & return fault if we cannot serialize response
|
|
||||||
# or have none...
|
|
||||||
return $fault_class_of{$ident}->new({
|
|
||||||
faultcode => 'soap:Server',
|
|
||||||
faultactor => 'urn:localhost',
|
|
||||||
faultstring => 'Error sending / receiving message: '
|
|
||||||
. $response->message()
|
|
||||||
#$soap->transport->message()
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
eval { $PARSER->parse( $response->content() ) };
|
|
||||||
|
|
||||||
# return fault if we cannot deserialize response
|
# get response via transport layer.
|
||||||
if ($@) {
|
# Normally, SOAP::Lite's transport layer is used, though users
|
||||||
return $fault_class_of{$ident}->new({
|
# may provide their own.
|
||||||
faultcode => 'soap:Server',
|
my $transport = $self->get_transport();
|
||||||
faultactor => 'urn:localhost',
|
my $response = $transport->send_receive(
|
||||||
faultstring => "Error deserializing message: $@. \n"
|
endpoint => $self->get_endpoint(),
|
||||||
|
content_type => $content_type_of{ $ident },
|
||||||
|
envelope => $envelope,
|
||||||
|
action => $soap_action,
|
||||||
|
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 } );
|
||||||
|
|
||||||
|
# get deserializer
|
||||||
|
$deserializer_of{ $ident } ||= SOAP::WSDL::Factory::Deserializer->get_deserializer({
|
||||||
|
soap_version => $soap_version_of{ $ident },
|
||||||
|
});
|
||||||
|
|
||||||
|
# set class resolver if serializer supports it
|
||||||
|
$deserializer_of{ $ident }->class_resolver( $class_resolver_of{ $ident } )
|
||||||
|
if ( $deserializer_of{ $ident }->can('class_resolver') );
|
||||||
|
|
||||||
|
my $result;
|
||||||
|
|
||||||
|
# Try deserializing response - there may be some,
|
||||||
|
# even if transport did not succeed (got a 500 response)
|
||||||
|
if ( $response ) {
|
||||||
|
eval { $result = $deserializer_of{ $ident }->deserialize( $response ); };
|
||||||
|
return $result if (not $@);
|
||||||
|
return $deserializer_of{ $ident }->generate_fault({
|
||||||
|
code => 'soap:Server',
|
||||||
|
role => 'urn:localhost',
|
||||||
|
message => "Error deserializing message: $@. \n"
|
||||||
. "Message was: \n$response"
|
. "Message was: \n$response"
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
return $PARSER->get_data();
|
# if we had no success (Transport layer error status code)
|
||||||
|
# or if transport layer failed
|
||||||
|
if ( ! $transport->is_success() ) {
|
||||||
|
|
||||||
|
# generate & return fault if we cannot serialize response
|
||||||
|
# or have none...
|
||||||
|
return $deserializer_of{ $ident }->generate_fault({
|
||||||
|
code => 'soap:Server',
|
||||||
|
role => 'urn:localhost',
|
||||||
|
message => 'Error sending / receiving message: '
|
||||||
|
. $transport->message()
|
||||||
|
});
|
||||||
|
}
|
||||||
} ## end sub call
|
} ## end sub call
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME
|
=head1 NAME
|
||||||
|
|
||||||
SOAP::WSDL::Client - SOAP::WSDL's SOAP Client
|
SOAP::WSDL::Client - SOAP::WSDL's SOAP Client
|
||||||
|
|
||||||
=head1 METHODS
|
=head1 METHODS
|
||||||
|
|
||||||
=head2 call
|
=head2 call
|
||||||
|
|
||||||
=head2 Configuration methods
|
$soap->call( \%method, \@parts );
|
||||||
|
|
||||||
=head3 outputxml
|
%method is a hash with the following keys:
|
||||||
|
|
||||||
$soap->outputxml(1);
|
Name Description
|
||||||
|
----------------------------------------------------
|
||||||
When set, call() returns the raw XML of the SOAP Envelope.
|
operation operation name
|
||||||
|
soap_action SOAPAction HTTP header to use
|
||||||
|
style Operation style. One of (document|rpc)
|
||||||
|
use SOAP body encoding. One of (literal|encoded)
|
||||||
|
|
||||||
|
The style and use keys have no influence yet.
|
||||||
|
|
||||||
|
@parts is a list containing the elements of the message parts.
|
||||||
|
|
||||||
|
For backward compatibility, call may also be called as below:
|
||||||
|
|
||||||
|
$soap->call( $method, \@parts );
|
||||||
|
|
||||||
|
In this case, $method is the SOAP operation name, and the SOAPAction header
|
||||||
|
is guessed from the first part's namespace and the operation name (which is
|
||||||
|
mostly correct, but may fail). Operation style and body encoding are assumed to
|
||||||
|
be document/literal
|
||||||
|
|
||||||
|
|
||||||
|
=head2 Configuration methods
|
||||||
|
|
||||||
|
=head3 outputxml
|
||||||
|
|
||||||
|
$soap->outputxml(1);
|
||||||
|
|
||||||
|
When set, call() returns the raw XML of the SOAP Envelope.
|
||||||
|
|
||||||
=head3 set_content_type
|
=head3 set_content_type
|
||||||
|
|
||||||
@@ -188,17 +279,17 @@ like in
|
|||||||
Default:
|
Default:
|
||||||
|
|
||||||
text/xml; charset: utf8
|
text/xml; charset: utf8
|
||||||
|
|
||||||
=head3 set_trace
|
=head3 set_trace
|
||||||
|
|
||||||
$soap->set_trace(1);
|
$soap->set_trace(1);
|
||||||
$soap->set_trace( sub { Log::Log4perl::get_logger()->debug( @_ ) } );
|
$soap->set_trace( sub { Log::Log4perl::get_logger()->debug( @_ ) } );
|
||||||
|
|
||||||
When set to a true value, tracing (via warn) is enabled.
|
When set to a true value, tracing (via warn) is enabled.
|
||||||
|
|
||||||
When set to a code reference, this function will be called on every
|
When set to a code reference, this function will be called on every
|
||||||
trace call, making it really easy for you to set up log4perl logging
|
trace call, making it really easy for you to set up log4perl logging
|
||||||
or whatever you need.
|
or whatever you need.
|
||||||
|
|
||||||
=head2 Features different from SOAP::Lite
|
=head2 Features different from SOAP::Lite
|
||||||
|
|
||||||
@@ -263,15 +354,15 @@ SOAP::WSDL::Client and implementing something like
|
|||||||
$soap_wsdl_client->call( mySoapMethod, @_);
|
$soap_wsdl_client->call( mySoapMethod, @_);
|
||||||
}
|
}
|
||||||
|
|
||||||
You may even do this in a class factory - 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
|
=head3 Debugging / Tracing
|
||||||
|
|
||||||
While SOAP::Lite features a global tracing facility, SOAP::WSDL::Client
|
While SOAP::Lite features a global tracing facility, SOAP::WSDL::Client
|
||||||
allows to switch tracing on/of on a per-object base.
|
allows to switch tracing on/of on a per-object base.
|
||||||
|
|
||||||
See L<set_trace|set_trace> on how to enable tracing.
|
See L<set_trace|set_trace> on how to enable tracing.
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE
|
||||||
|
|
||||||
@@ -284,7 +375,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: 218 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: Client.pm 218 2007-09-10 16:19:23Z kutterma $
|
||||||
|
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+101
-59
@@ -1,59 +1,101 @@
|
|||||||
package SOAP::WSDL::Client::Base;
|
package SOAP::WSDL::Client::Base;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use base 'SOAP::WSDL::Client';
|
use base 'SOAP::WSDL::Client';
|
||||||
|
|
||||||
sub __create_new {
|
sub __create_new {
|
||||||
my ($package, %args_of) = @_;
|
my ($package, %args_of) = @_;
|
||||||
|
|
||||||
no strict qw(refs);
|
no strict qw(refs);
|
||||||
|
|
||||||
*{ "$package\::new" } = sub {
|
*{ "$package\::new" } = sub {
|
||||||
my $class = shift;
|
my $class = shift;
|
||||||
my $self = $class->SUPER::new({
|
my $self = $class->SUPER::new({
|
||||||
proxy => $args_of{ proxy },
|
proxy => $args_of{ proxy },
|
||||||
class_resolver => $args_of{ class_resolver }
|
class_resolver => $args_of{ class_resolver }
|
||||||
});
|
});
|
||||||
bless $self, $class;
|
bless $self, $class;
|
||||||
return $self;
|
return $self;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub __create_methods {
|
sub __create_methods {
|
||||||
my ($package, %parts_of) = @_;
|
my ($package, %info_of) = @_;
|
||||||
|
|
||||||
no strict qw(refs);
|
no strict qw(refs);
|
||||||
|
|
||||||
for my $method (keys %parts_of){
|
for my $method (keys %info_of){
|
||||||
*{ "$package\::$method" } = sub {
|
my ($soap_action, @parts);
|
||||||
my $self = shift;
|
|
||||||
my @param = map {
|
# up to 2.00_10 we had list refs...
|
||||||
my $data = shift || {};
|
if (ref $info_of{ $method }eq 'HASH') {
|
||||||
eval "require $_";
|
@parts = @{ $info_of{ $method }->{ parts } };
|
||||||
$_->new( $data );
|
$soap_action = $info_of{ $method }->{ soap_action };
|
||||||
} @{ $parts_of{ $method } };
|
}
|
||||||
|
else {
|
||||||
return $self->SUPER::call( $method, @param );
|
@parts = @{ $info_of{ $method } };
|
||||||
}
|
$soap_action = ();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
*{ "$package\::$method" } = sub {
|
||||||
1;
|
my $self = shift;
|
||||||
|
my @param = map {
|
||||||
__END__
|
my $data = shift || {};
|
||||||
|
eval "require $_";
|
||||||
=pod
|
$_->new( $data );
|
||||||
|
} @parts;
|
||||||
=head1 NAME
|
|
||||||
|
return $self->SUPER::call( {
|
||||||
SOAP::WSDL::Client::Base - Base client for WSDL-based SOAP access
|
operation => $method,
|
||||||
|
soap_action => $soap_action,
|
||||||
=head1 SYNOPSIS
|
}, @param );
|
||||||
|
}
|
||||||
package MySoapClient;
|
}
|
||||||
use SOAP::WSDL::Client::Base;
|
}
|
||||||
__PACKAGE__->__create_methods( qw(one two three) );
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
=cut
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SOAP::WSDL::Client::Base - Factory class for WSDL-based SOAP access
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
package MySoapInterface;
|
||||||
|
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) );
|
||||||
|
1;
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Factory class for creating interface classes. Should probably be renamed to
|
||||||
|
SOAP::WSDL::Factory::Interface...
|
||||||
|
|
||||||
|
=head1 LICENSE
|
||||||
|
|
||||||
|
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: 214 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: Base.pm 214 2007-09-10 15:54:52Z kutterma $
|
||||||
|
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|||||||
+330
-314
@@ -2,10 +2,10 @@ package SOAP::WSDL::Definitions;
|
|||||||
use utf8;
|
use utf8;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Carp;
|
use Carp;
|
||||||
use File::Basename;
|
use File::Basename;
|
||||||
use File::Path;
|
use File::Path;
|
||||||
use List::Util qw(first);
|
use List::Util qw(first);
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
|
|
||||||
@@ -15,8 +15,8 @@ my %portType_of :ATTR(:name<portType> :default<()>);
|
|||||||
my %binding_of :ATTR(:name<binding> :default<()>);
|
my %binding_of :ATTR(:name<binding> :default<()>);
|
||||||
my %service_of :ATTR(:name<service> :default<()>);
|
my %service_of :ATTR(:name<service> :default<()>);
|
||||||
my %namespace_of :ATTR(:name<namespace> :default<()>);
|
my %namespace_of :ATTR(:name<namespace> :default<()>);
|
||||||
|
|
||||||
# must be attr for Class::Std::Storable
|
# must be attr for Class::Std::Storable
|
||||||
my %attributes_of :ATTR();
|
my %attributes_of :ATTR();
|
||||||
%attributes_of = (
|
%attributes_of = (
|
||||||
binding => \%binding_of,
|
binding => \%binding_of,
|
||||||
@@ -27,20 +27,20 @@ my %attributes_of :ATTR();
|
|||||||
|
|
||||||
# Function factory - we could be writing this method for all %attribute
|
# Function factory - we could be writing this method for all %attribute
|
||||||
# keys, too, but that's just C&P (eehm, Copy & Paste...)
|
# keys, too, but that's just C&P (eehm, Copy & Paste...)
|
||||||
BLOCK: {
|
BLOCK: {
|
||||||
no strict qw/refs/;
|
no strict qw/refs/;
|
||||||
foreach my $method(keys %attributes_of ) {
|
foreach my $method(keys %attributes_of ) {
|
||||||
|
|
||||||
*{ "find_$method" } = sub {
|
*{ "find_$method" } = sub {
|
||||||
my ($self, @args) = @_;
|
my ($self, @args) = @_;
|
||||||
return first {
|
return first {
|
||||||
$_->get_targetNamespace() eq $args[0]
|
$_->get_targetNamespace() eq $args[0]
|
||||||
&& $_->get_name() eq $args[1]
|
&& $_->get_name() eq $args[1]
|
||||||
}
|
}
|
||||||
@{ $attributes_of{ $method }->{ ident $self } };
|
@{ $attributes_of{ $method }->{ ident $self } };
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub explain {
|
sub explain {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
@@ -54,14 +54,14 @@ sub explain {
|
|||||||
}
|
}
|
||||||
return $txt;
|
return $txt;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub _expand {
|
|
||||||
my ($self, $prefix, $localname) = ($_[0], split /:/, $_[1]);
|
|
||||||
my %ns_map = reverse %{ $self->get_xmlns() };
|
|
||||||
return ($ns_map{ $prefix }, $localname);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub to_typemap {
|
sub _expand {
|
||||||
|
my ($self, $prefix, $localname) = ($_[0], split /:/, $_[1]);
|
||||||
|
my %ns_map = reverse %{ $self->get_xmlns() };
|
||||||
|
return ($ns_map{ $prefix }, $localname);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub to_typemap {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $opt = shift;
|
my $opt = shift;
|
||||||
$opt->{ prefix } ||= q{};
|
$opt->{ prefix } ||= q{};
|
||||||
@@ -71,186 +71,202 @@ sub to_typemap {
|
|||||||
return join "\n",
|
return join "\n",
|
||||||
map { $_->to_typemap( $opt ) } @{ $service_of{ ident $self } };
|
map { $_->to_typemap( $opt ) } @{ $service_of{ ident $self } };
|
||||||
}
|
}
|
||||||
|
|
||||||
sub create {
|
sub create {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $opt = shift;
|
my $opt = shift;
|
||||||
|
|
||||||
my $base_path = $opt->{ base_path }
|
my $base_path = $opt->{ base_path }
|
||||||
or croak "missing or empty argument base_path";
|
or croak "missing or empty argument base_path";
|
||||||
$opt->{ prefix } ||= q{};
|
$opt->{ prefix } ||= q{};
|
||||||
$opt->{ type_prefix } ||= $opt->{ prefix };
|
$opt->{ type_prefix } ||= $opt->{ prefix };
|
||||||
$opt->{ element_prefix } ||= $opt->{ prefix };
|
$opt->{ element_prefix } ||= $opt->{ prefix };
|
||||||
$opt->{ typemap_prefix } or die 'Required argument typemap_prefix missing';
|
$opt->{ typemap_prefix } or die 'Required argument typemap_prefix missing';
|
||||||
|
|
||||||
mkpath $base_path;
|
mkpath $base_path;
|
||||||
|
|
||||||
for my $service (@{ $service_of{ ident $self } }) {
|
for my $service (@{ $service_of{ ident $self } }) {
|
||||||
warn "creating typemap $opt->{ typemap_prefix }". $service->get_name() . "\n";
|
warn "creating typemap $opt->{ typemap_prefix }". $service->get_name() . "\n";
|
||||||
$self->_create_typemap({ %{ $opt }, service => $service });
|
$self->_create_typemap({ %{ $opt }, service => $service });
|
||||||
$self->_create_interface({ %{ $opt }, service => $service });
|
$self->_create_interface({ %{ $opt }, service => $service });
|
||||||
}
|
}
|
||||||
|
|
||||||
my @schema = @{ $self->first_types()->get_schema() };
|
my @schema = @{ $self->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] ) {
|
||||||
warn 'creating class for '. $type->get_name() . "\n";
|
warn 'creating class for '. $type->get_name() . "\n";
|
||||||
$type->to_class( { %$opt, wsdl => $self } );
|
$type->to_class( { %$opt, wsdl => $self } );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub _create_interface {
|
sub _create_interface {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $opt = shift;
|
my $opt = shift;
|
||||||
my $service_name = $opt->{ service }->get_name();
|
my $service_name = $opt->{ service }->get_name();
|
||||||
$service_name =~s{\.}{\:\:}xmsg;
|
$service_name =~s{\.}{\:\:}xmsg;
|
||||||
# TODO: iterate over ports.
|
# TODO: iterate over ports.
|
||||||
# - ignore non-SOAP ports
|
# - ignore non-SOAP ports
|
||||||
# - generate interface for all SOAP ports...
|
# - generate interface for all SOAP ports...
|
||||||
my $binding = $self->find_binding( $self->_expand( $opt->{ service }->first_port()->get_binding() ) );
|
my $binding = $self->find_binding( $self->_expand( $opt->{ service }->first_port()->get_binding() ) );
|
||||||
my $porttype = $self->find_portType( $self->_expand( $binding->get_type() ) );
|
my $porttype = $self->find_portType( $self->_expand( $binding->get_type() ) );
|
||||||
|
|
||||||
my $port_operation_ref = $porttype->get_operation();
|
my $port_operation_ref = $porttype->get_operation();
|
||||||
my $operation_ref = $binding->get_operation();
|
my $operation_ref = $binding->get_operation();
|
||||||
|
|
||||||
# make up operations map - name => [ part types / elements class names ]
|
# make up operations map - name => [ part types / elements class names ]
|
||||||
#
|
#
|
||||||
my %operations = ();
|
my %operations = ();
|
||||||
for my $operation ( @{ $operation_ref } ) {
|
for my $operation ( @{ $operation_ref } ) {
|
||||||
my $operation_name = $operation->get_name();
|
my $operation_name = $operation->get_name();
|
||||||
my $port_op = first { $_->get_name() eq $operation_name } @{ $port_operation_ref };
|
my $soap_operation = $operation->first_operation();
|
||||||
|
|
||||||
$operations{ $operation_name }->{ documentation } = $port_op->get_documentation();
|
$operations{ $operation_name }->{ style } = $soap_operation
|
||||||
|
? $soap_operation->get_style()
|
||||||
my %msg_from = (
|
: undef;
|
||||||
'input' => ($port_op->first_input() ) ? $port_op->first_input()->get_message() : undef,
|
|
||||||
'output' => ($port_op->first_output()) ? $port_op->first_output()->get_message(): undef,
|
$operations{ $operation_name }->{ soap_action } = $soap_operation
|
||||||
'fault' => ($port_op->first_fault()) ? $port_op->first_fault()->get_message() : undef,
|
? $soap_operation->get_soapAction()
|
||||||
);
|
: undef;
|
||||||
|
|
||||||
for my $msg (keys %msg_from) {
|
my $port_op = first { $_->get_name() eq $operation_name } @{ $port_operation_ref };
|
||||||
next if not $msg_from{ $msg };
|
|
||||||
for my $part (@{ $self->find_message( $self->_expand( $msg_from{$msg} ) )->get_part }) {
|
$operations{ $operation_name }->{ documentation } = $port_op->get_documentation();
|
||||||
my $name;
|
|
||||||
if (my $element_name = $part->get_element() ) {
|
my %msg_from = (
|
||||||
$name = $element_name;
|
'input' => ($port_op->first_input() ) ? $port_op->first_input()->get_message() : undef,
|
||||||
push @{ $operations{ $operation_name }->{$msg}->{ types } },
|
'output' => ($port_op->first_output()) ? $port_op->first_output()->get_message(): undef,
|
||||||
$self->first_types()->find_element( $self->_expand( $element_name ) )
|
'fault' => ($port_op->first_fault()) ? $port_op->first_fault()->get_message() : undef,
|
||||||
->explain({ wsdl => $self , anonymous => 1 });
|
);
|
||||||
|
|
||||||
}
|
for my $msg (keys %msg_from) {
|
||||||
elsif (my $type_name = $part->get_element() ) {
|
next if not $msg_from{ $msg };
|
||||||
push @{ $operations{ $operation_name }->{$msg}->{ types } },
|
for my $part (@{ $self->find_message( $self->_expand( $msg_from{$msg} ) )->get_part }) {
|
||||||
$self->first_types()->find_type( $self->_expand( $element_name ) )
|
my $name;
|
||||||
->explain({ wsdl => $self });
|
if (my $element_name = $part->get_element() ) {
|
||||||
$name = $type_name;
|
$name = $element_name;
|
||||||
}
|
push @{ $operations{ $operation_name }->{$msg}->{ types } },
|
||||||
my ($prefix, $localname) = split m{:}xms , $name;
|
$self->first_types()->find_element( $self->_expand( $element_name ) )
|
||||||
push @{ $operations{ $operation_name }->{$msg}->{ class } },
|
->explain({ wsdl => $self , anonymous => 1 });
|
||||||
"$opt->{ element_prefix }$localname";
|
|
||||||
}
|
}
|
||||||
}
|
elsif (my $type_name = $part->get_element() ) {
|
||||||
}
|
push @{ $operations{ $operation_name }->{$msg}->{ types } },
|
||||||
|
$self->first_types()->find_type( $self->_expand( $element_name ) )
|
||||||
# use Data::Dumper;
|
->explain({ wsdl => $self });
|
||||||
# die Dumper \%operations;
|
$name = $type_name;
|
||||||
|
}
|
||||||
my $template = <<'EOT';
|
my ($prefix, $localname) = split m{:}xms , $name;
|
||||||
|
push @{ $operations{ $operation_name }->{$msg}->{ class } },
|
||||||
|
"$opt->{ element_prefix }$localname";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my $template = <<'EOT';
|
||||||
package [% interface_prefix %][% service.get_name.replace('\.', '::') %];
|
package [% interface_prefix %][% service.get_name.replace('\.', '::') %];
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use [% typemap_prefix %][% service.get_name %];
|
use [% typemap_prefix %][% service.get_name %];
|
||||||
use base 'SOAP::WSDL::Client::Base';
|
use base 'SOAP::WSDL::Client::Base';
|
||||||
|
|
||||||
sub new {
|
sub new {
|
||||||
my $class = shift;
|
my $class = shift;
|
||||||
my $arg_ref = shift || {};
|
my $arg_ref = shift || {};
|
||||||
my $self = $class->SUPER::new({
|
my $self = $class->SUPER::new({
|
||||||
class_resolver => '[% typemap_prefix %][% service.get_name.replace('\.', '::') %]',
|
class_resolver => '[% typemap_prefix %][% service.get_name.replace('\.', '::') %]',
|
||||||
proxy => '[% service.first_port.get_location %]',
|
proxy => '[% service.first_port.get_location %]',
|
||||||
%{ $arg_ref }
|
%{ $arg_ref }
|
||||||
});
|
});
|
||||||
return bless $self, $class;
|
return bless $self, $class;
|
||||||
}
|
}
|
||||||
|
|
||||||
__PACKAGE__->__create_methods(
|
__PACKAGE__->__create_methods(
|
||||||
[% FOREACH name = operations.keys -%]
|
[% FOREACH name = operations.keys -%]
|
||||||
[% name %] => [ [% FOREACH class = operations.$name.input.class %]'[% class %]', [% END %]],
|
[% name %] => {
|
||||||
[% END %]
|
parts => [ [% FOREACH class = operations.$name.input.class %]'[% class %]', [% END %]],
|
||||||
);
|
soap_action => '[% operations.$name.soap_action %]',
|
||||||
|
style => '[% operations.$name.style %]',
|
||||||
1;
|
# use => '', # use not implemented yet
|
||||||
|
},
|
||||||
__END__
|
[% END %]
|
||||||
|
);
|
||||||
=pod
|
|
||||||
|
1;
|
||||||
=head1 NAME
|
|
||||||
|
__END__
|
||||||
[% interface_prefix %][% service.get_name %] - SOAP interface to [% service.get_name %] at
|
|
||||||
[% service.first_port.get_location %]
|
[% MACRO pod BLOCK %]=pod[% END %]
|
||||||
|
[% MACRO cut BLOCK %]=pod[% END %]
|
||||||
=head1 SYNOPSIS
|
[% MACRO head1 BLOCK %]=head1[% END %]
|
||||||
|
[% MACRO head2 BLOCK %]=head2[% END %]
|
||||||
my $interface = [% interface_prefix %][% service.get_name %]->new();
|
[% pod %]
|
||||||
my $[% operations.keys.1 %] = $interface->[% operations.keys.1 %]();
|
|
||||||
|
[% head1 %] NAME
|
||||||
|
|
||||||
=head1 METHODS
|
[% interface_prefix %][% service.get_name %] - SOAP interface to [% service.get_name %] at
|
||||||
[% FOREACH name=operations.keys;
|
[% service.first_port.get_location %]
|
||||||
operation=operations.$name;
|
|
||||||
%]
|
[% head1 %] SYNOPSIS
|
||||||
=head2 [% name %]
|
|
||||||
|
my $interface = [% interface_prefix %][% service.get_name %]->new();
|
||||||
[% operation.documentation %]
|
my $[% operations.keys.1 %] = $interface->[% operations.keys.1 %]();
|
||||||
|
|
||||||
SYNOPSIS:
|
|
||||||
|
[% head1 %] METHODS
|
||||||
$service->[% name %]({
|
[% FOREACH name=operations.keys;
|
||||||
[% FOREACH type = operation.input.types; type; END %] });
|
operation=operations.$name;
|
||||||
|
%]
|
||||||
[% END %]
|
[% head2 %] [% name %]
|
||||||
|
|
||||||
=cut
|
[% operation.documentation %]
|
||||||
|
|
||||||
EOT
|
SYNOPSIS:
|
||||||
|
|
||||||
require Template;
|
$service->[% name %]({
|
||||||
my $file_name = "$opt->{ base_path }/$opt->{ interface_prefix }/$service_name.pm";
|
[% FOREACH type = operation.input.types; type; END %] });
|
||||||
$file_name =~s{::}{/}gms;
|
|
||||||
my $path = dirname $file_name;
|
[% END %]
|
||||||
my $name = basename $file_name;
|
|
||||||
my $tt = Template->new(
|
[% cut %]
|
||||||
OUTPUT_PATH => $path,
|
|
||||||
);
|
EOT
|
||||||
|
|
||||||
|
require Template;
|
||||||
|
my $file_name = "$opt->{ base_path }/$opt->{ interface_prefix }/$service_name.pm";
|
||||||
|
$file_name =~s{::}{/}gms;
|
||||||
|
my $path = dirname $file_name;
|
||||||
|
my $name = basename $file_name;
|
||||||
|
my $tt = Template->new(
|
||||||
|
OUTPUT_PATH => $path,
|
||||||
|
);
|
||||||
$tt->process(\$template,
|
$tt->process(\$template,
|
||||||
{ %{ $opt }, operations => \%operations, binding => $binding, wsdl => $self },
|
{ %{ $opt }, operations => \%operations, binding => $binding, wsdl => $self },
|
||||||
$name,
|
$name,
|
||||||
binmode => ':utf8'
|
binmode => ':utf8'
|
||||||
)
|
)
|
||||||
or die $tt->error();
|
or die $tt->error();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sub _create_typemap {
|
sub _create_typemap {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $opt = shift;
|
my $opt = shift;
|
||||||
my $service_name = $opt->{ service }->get_name();
|
my $service_name = $opt->{ service }->get_name();
|
||||||
$service_name =~s{\.}{\:\:}xmsg;
|
$service_name =~s{\.}{\:\:}xmsg;
|
||||||
my $file_name = "$opt->{ base_path }/$opt->{ typemap_prefix }/$service_name.pm";
|
my $file_name = "$opt->{ base_path }/$opt->{ typemap_prefix }/$service_name.pm";
|
||||||
$file_name =~s{::}{/}gms;
|
$file_name =~s{::}{/}gms;
|
||||||
my $path = dirname $file_name;
|
my $path = dirname $file_name;
|
||||||
my $name = basename $file_name;
|
my $name = basename $file_name;
|
||||||
|
|
||||||
my $typemap = $opt->{ service }->to_typemap( { %{ $opt }, wsdl => $self } );
|
my $typemap = $opt->{ service }->to_typemap( { %{ $opt }, wsdl => $self } );
|
||||||
|
|
||||||
my $template = <<'EOT';
|
my $template = <<'EOT';
|
||||||
package [% typemap_prefix %][% service.get_name.replace('\.', '::') %];
|
package [% typemap_prefix %][% service.get_name.replace('\.', '::') %];
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
my %typemap = (
|
my %typemap = (
|
||||||
# SOAP 1.1 fault typemap
|
# SOAP 1.1 fault typemap
|
||||||
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
|
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
|
||||||
@@ -259,43 +275,43 @@ my %typemap = (
|
|||||||
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
|
|
||||||
# generated typemap
|
# generated typemap
|
||||||
[% typemap %]
|
[% typemap %]
|
||||||
[% custom_types %]
|
[% custom_types %]
|
||||||
);
|
);
|
||||||
|
|
||||||
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{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
|
||||||
return $typemap{ $name };
|
return $typemap{ $name };
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
EOT
|
EOT
|
||||||
|
|
||||||
require Template;
|
require Template;
|
||||||
my $tt = Template->new(
|
my $tt = Template->new(
|
||||||
OUTPUT_PATH => $path,
|
OUTPUT_PATH => $path,
|
||||||
);
|
);
|
||||||
$tt->process(\$template,
|
$tt->process(\$template,
|
||||||
{ %{ $opt }, typemap => $typemap },
|
{ %{ $opt }, typemap => $typemap },
|
||||||
$name,
|
$name,
|
||||||
binmode => ':utf8',
|
binmode => ':utf8',
|
||||||
)
|
)
|
||||||
or die $tt->error();
|
or die $tt->error();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub listify {
|
sub listify {
|
||||||
my $data = shift;
|
my $data = shift;
|
||||||
return if not defined $data;
|
return if not defined $data;
|
||||||
return [ $data ] if not ref $data;
|
return [ $data ] if not ref $data;
|
||||||
return [ $data ] if not ref $data eq 'ARRAY';
|
return [ $data ] if not ref $data eq 'ARRAY';
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
@@ -402,97 +418,97 @@ Try something like this for creating typemap classes:
|
|||||||
sub get_class { return \$typemap{\$_[1] } };
|
sub get_class { return \$typemap{\$_[1] } };
|
||||||
1;
|
1;
|
||||||
"EOT"
|
"EOT"
|
||||||
|
|
||||||
=head2 create_interface
|
=head2 create_interface
|
||||||
|
|
||||||
Creates a typemap class, classes for all types and elements, and interface
|
Creates a typemap class, classes for all types and elements, and interface
|
||||||
classes for every service.
|
classes for every service.
|
||||||
|
|
||||||
See L<CODE GENERATOR|CODE GENERATOR> below.
|
See L<CODE GENERATOR|CODE GENERATOR> below.
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
|
|
||||||
Name Description
|
Name Description
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
prefix Prefix to use for types and elements. Should end with '::'.
|
prefix Prefix to use for types and elements. Should end with '::'.
|
||||||
element_prefix Prefix to use for element packages. Should end with '::'.
|
element_prefix Prefix to use for element packages. Should end with '::'.
|
||||||
Must be specified if prefix is not given.
|
Must be specified if prefix is not given.
|
||||||
type_prefix Prefix to use for type packages. Should end with '::'.
|
type_prefix Prefix to use for type packages. Should end with '::'.
|
||||||
Must be specified if prefix is not given.
|
Must be specified if prefix is not given.
|
||||||
typemap_prefix Prefix to use for type packages. Should end with '::'.
|
typemap_prefix Prefix to use for type packages. Should end with '::'.
|
||||||
Mandatory.
|
Mandatory.
|
||||||
custom_types A perl source code snippet defining custom types for the
|
custom_types A perl source code snippet defining custom types for the
|
||||||
class resolver (typemap).
|
class resolver (typemap).
|
||||||
Must look like this:
|
Must look like this:
|
||||||
q{
|
q{
|
||||||
'path/to/my/element' => 'My::Element',
|
'path/to/my/element' => 'My::Element',
|
||||||
'path/to/my/element/prop' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'path/to/my/element/prop' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
'path/to/my/element/prop2' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
'path/to/my/element/prop2' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
};
|
};
|
||||||
|
|
||||||
=head2 _expand
|
=head2 _expand
|
||||||
|
|
||||||
Expands a qualified name into a list consisting of namespace URI and
|
Expands a qualified name into a list consisting of namespace URI and
|
||||||
localname by using the definition's xmlns table.
|
localname by using the definition's xmlns table.
|
||||||
|
|
||||||
Used internally by SOAP::WSDL::* classes.
|
Used internally by SOAP::WSDL::* classes.
|
||||||
|
|
||||||
=head1 CODE GENERATOR
|
=head1 CODE GENERATOR
|
||||||
|
|
||||||
TODO: move somewhere else - maybe SOAP::WSDL::Client ?
|
TODO: move somewhere else - maybe SOAP::WSDL::Client ?
|
||||||
|
|
||||||
SOAP::WSDL::Definitions features a code generation facility for generating
|
SOAP::WSDL::Definitions features a code generation facility for generating
|
||||||
perl classes (packages) from a WSDL definition.
|
perl classes (packages) from a WSDL definition.
|
||||||
|
|
||||||
The following classes are generated:
|
The following classes are generated:
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item * Typemaps
|
=item * Typemaps
|
||||||
|
|
||||||
A typemap class is created for every service.
|
A typemap class is created for every service.
|
||||||
|
|
||||||
Typemaps are basically lookup classes. They allow the
|
Typemaps are basically lookup classes. They allow the
|
||||||
SOAP::WSDL::SAX::MessageHandler to find out which class a XML element
|
SOAP::WSDL::SAX::MessageHandler to find out which class a XML element
|
||||||
in a SOAP message shoud be processed as.
|
in a SOAP message shoud be processed as.
|
||||||
|
|
||||||
Typemaps are passed to SOAP::WSDL::Client via the class_resolver
|
Typemaps are passed to SOAP::WSDL::Client via the class_resolver
|
||||||
method.
|
method.
|
||||||
|
|
||||||
=item * Interfaces
|
=item * Interfaces
|
||||||
|
|
||||||
TODO: Implement Interface generation
|
TODO: Implement Interface generation
|
||||||
|
|
||||||
Interface classes are just convenience shortcuts for accessing web
|
Interface classes are just convenience shortcuts for accessing web
|
||||||
service methods. They define a method for every web service method,
|
service methods. They define a method for every web service method,
|
||||||
dispatching the request to SOAP::WSDL::Client.
|
dispatching the request to SOAP::WSDL::Client.
|
||||||
|
|
||||||
=item * Type and Element classes
|
=item * Type and Element classes
|
||||||
|
|
||||||
For every top-level E<lt>elementE<gt>, E<lt>complexTypeE<gt> and
|
For every top-level E<lt>elementE<gt>, E<lt>complexTypeE<gt> and
|
||||||
E<lt>simpleTypeE<gt> definition in the WSDL's schema, a perl class is
|
E<lt>simpleTypeE<gt> definition in the WSDL's schema, a perl class is
|
||||||
created.
|
created.
|
||||||
|
|
||||||
Classes for E<lt>complexTypeE<gt> and E<lt>simpleTypeE<gt> definitions
|
Classes for E<lt>complexTypeE<gt> and E<lt>simpleTypeE<gt> definitions
|
||||||
are prefixed by the C<type_prefix> argument passed to
|
are prefixed by the C<type_prefix> argument passed to
|
||||||
L<create_interface|create_interface>, classes for E<lt>elementE<gt>
|
L<create_interface|create_interface>, classes for E<lt>elementE<gt>
|
||||||
definitions are prefixed by the C<element_prefix> passed to
|
definitions are prefixed by the C<element_prefix> passed to
|
||||||
L<create_interface|create_interface>. If the specific prefixes are not
|
L<create_interface|create_interface>. If the specific prefixes are not
|
||||||
specified, the C<prefix> argument is used instead.
|
specified, the C<prefix> argument is used instead.
|
||||||
|
|
||||||
If your web service is part of a bigger framework which defines types
|
If your web service is part of a bigger framework which defines types
|
||||||
globally, you probably do well always using the same C<type_prefix>:
|
globally, you probably do well always using the same C<type_prefix>:
|
||||||
This reduces the number of classes generated (provided types
|
This reduces the number of classes generated (provided types
|
||||||
are re-used by more than one service).
|
are re-used by more than one service).
|
||||||
|
|
||||||
You probably should use different element prefixes, though -
|
You probably should use different element prefixes, though -
|
||||||
E<lt>elementE<gt> definitions tend to be unique in the defining WSDL
|
E<lt>elementE<gt> definitions tend to be unique in the defining WSDL
|
||||||
only, especially when using document/literal style/encoding.
|
only, especially when using document/literal style/encoding.
|
||||||
|
|
||||||
If not, you probably want to specify just C<prefix> (and use a
|
If not, you probably want to specify just C<prefix> (and use a
|
||||||
different one for every web service).
|
different one for every web service).
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
package SOAP::WSDL::Deserializer::SOAP11;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Storable;
|
||||||
|
use SOAP::WSDL::SOAP::Typelib::Fault11;
|
||||||
|
|
||||||
|
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;
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
package SOAP::WSDL::Deserializer::SOM;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Class::Std::Storable;
|
||||||
|
use SOAP::Lite;
|
||||||
|
|
||||||
|
our $VERSION='2.00_13';
|
||||||
|
|
||||||
|
sub BUILD {
|
||||||
|
my ($self, $ident, $args_of_ref) = @_;
|
||||||
|
|
||||||
|
# ignore all options
|
||||||
|
for (keys %{ $args_of_ref }) {
|
||||||
|
delete $args_of_ref->{ $_ };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub deserialize {
|
||||||
|
my ($self, $content) = @_;
|
||||||
|
return SOAP::Deserializer->new()->deserialize( $content );
|
||||||
|
}
|
||||||
|
|
||||||
|
sub generate_fault {
|
||||||
|
my ($self, $args_from_ref) = @_;
|
||||||
|
# code, message, detail, actor
|
||||||
|
die SOAP::Fault->new(
|
||||||
|
faultcode => $args_from_ref->{ code },
|
||||||
|
faultstring => $args_from_ref->{ message },
|
||||||
|
faultactor => $args_from_ref->{ role },
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SOAP::WSDL::Deserializer::SOM - Deserializer SOAP messages into SOM objects
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use SOAP::WSDL;
|
||||||
|
use SOAP::WSDL::Deserializer::SOM;
|
||||||
|
use SOAP::WSDL::Factory::Deserializer;
|
||||||
|
SOAP::WSDL::Factory::Deserializer->register( '1.1', __PACKAGE__ );
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Deserializer for creating SOAP::Lite's SOM object as result of a SOAP call.
|
||||||
|
|
||||||
|
This package is mainly here for compatibility reasons: You don't have to
|
||||||
|
change the rest of your SOAP::Lite based app when switching to SOAP::WSDL,
|
||||||
|
but can just use SOAP::WSDL::Deserializer::SOM to get back the same objects
|
||||||
|
as you were used to.
|
||||||
|
|
||||||
|
SOAP::WSDL::Deserializer will not auroregister itself - just use the lines
|
||||||
|
from the L</SYNOPSIS> to register it as deserializer for SOAP::WSDL.
|
||||||
|
|
||||||
|
=head2 Differences from SOAP::Lite
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * No on_fault handler
|
||||||
|
|
||||||
|
You cannot specify what to do when an error occurs - SOAP::WSDL will die
|
||||||
|
with a SOAP::Fault object on transport errors.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Differences from other SOAP::WSDL::Deserializer classes
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * generate_fault
|
||||||
|
|
||||||
|
SOAP::WSDL::Deserializer::SOM will die with a SOAP::Fault object on calls
|
||||||
|
to generate_fault.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 LICENSE
|
||||||
|
|
||||||
|
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: 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
|
||||||
@@ -8,7 +8,7 @@ use XML::Parser::Expat;
|
|||||||
sub new {
|
sub new {
|
||||||
my ($class, $args) = @_;
|
my ($class, $args) = @_;
|
||||||
my $self = {
|
my $self = {
|
||||||
class_resolver => $args->{ class_resolver }
|
class_resolver => $args->{ class_resolver },
|
||||||
};
|
};
|
||||||
bless $self, $class;
|
bless $self, $class;
|
||||||
return $self;
|
return $self;
|
||||||
@@ -20,16 +20,15 @@ sub class_resolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub _initialize {
|
sub _initialize {
|
||||||
my ($self, $parser) = @_;
|
my ($self, $parser) = @_;
|
||||||
|
|
||||||
delete $self->{ data };
|
delete $self->{ data }; # remove potential old results
|
||||||
|
|
||||||
my $characters;
|
my $characters;
|
||||||
my $current = undef;
|
my $current = undef;
|
||||||
my $ignore = [ 'Envelope', 'Body' ]; # top level elements to ignore
|
my $ignore = [ 'Envelope', 'Body' ]; # top level elements to ignore
|
||||||
my $list = []; # node list
|
my $list = []; # node list
|
||||||
my $path = []; # current path (without
|
my $path = []; # current path
|
||||||
# number)
|
|
||||||
my $skip = 0; # skip elements
|
my $skip = 0; # skip elements
|
||||||
|
|
||||||
# use "globals" for speed
|
# use "globals" for speed
|
||||||
@@ -42,10 +41,18 @@ sub _initialize {
|
|||||||
($_parser, $_element, %_attrs) = @_;
|
($_parser, $_element, %_attrs) = @_;
|
||||||
($_prefix, $_localname) = split m{:}xms , $_element;
|
($_prefix, $_localname) = split m{:}xms , $_element;
|
||||||
|
|
||||||
$_localname ||= $_element; # for non-prefixed elements
|
$_localname ||= $_element; # for non-prefixed elements
|
||||||
|
|
||||||
# ignore top level elements
|
# ignore top level elements
|
||||||
if (@{ $ignore } && $_localname eq $ignore->[0]) {
|
if (@{ $ignore } && $_localname eq $ignore->[0]) {
|
||||||
|
CHECK_ENVELOPE: {
|
||||||
|
last CHECK_ENVELOPE if $_localname ne 'Envelope';
|
||||||
|
last CHECK_ENVELOPE if exists $_attrs{ 'xmlns' }
|
||||||
|
&& $_attrs{ 'xmlns' } eq 'http://schemas.xmlsoap.org/soap/envelope/';
|
||||||
|
last CHECK_ENVELOPE if $_attrs{ "xmlns:$_prefix"}
|
||||||
|
eq 'http://schemas.xmlsoap.org/soap/envelope/';
|
||||||
|
die "Bad namespace for SOAP envelope: " . $parser->recognized_string();
|
||||||
|
}
|
||||||
shift @{ $ignore };
|
shift @{ $ignore };
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -56,7 +63,7 @@ sub _initialize {
|
|||||||
# resolve class of this element
|
# resolve class of this element
|
||||||
$_class = $self->{ class_resolver }->get_class( $path )
|
$_class = $self->{ class_resolver }->get_class( $path )
|
||||||
or die "Cannot resolve class for "
|
or die "Cannot resolve class for "
|
||||||
. join('/', @{ $path }) . " via $self->{ class_resolver }";
|
. join('/', @{ $path }) . " via " . $self->{ class_resolver };
|
||||||
|
|
||||||
# maybe write as "return $skip = join ... if (...)" ?
|
# maybe write as "return $skip = join ... if (...)" ?
|
||||||
# would save a BLOCK...
|
# would save a BLOCK...
|
||||||
@@ -72,19 +79,21 @@ sub _initialize {
|
|||||||
# if $class matches...
|
# if $class matches...
|
||||||
|
|
||||||
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 CODE reference for $class::new.
|
# 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
|
# If not, require it - all classes required here MUST
|
||||||
# define new()
|
# define new()
|
||||||
# This is the same as $class->can('new'), but it's way faster
|
# This is not exactly the same as $class->can('new'), but it's way faster
|
||||||
*{ "$_class\::new" }{ CODE }
|
defined *{ "$_class\::new" }{ CODE }
|
||||||
|
or scalar @{ *{ "$_class\::ISA" }{ ARRAY } }
|
||||||
or eval "require $_class" ## no critic qw(ProhibitStringyEval)
|
or eval "require $_class" ## no critic qw(ProhibitStringyEval)
|
||||||
or die $@;
|
or die $@;
|
||||||
}
|
}
|
||||||
|
|
||||||
$current = $_class->new({ %_attrs }); # set new current object
|
$current = $_class->new({ %_attrs }); # set new current object
|
||||||
|
|
||||||
# remember top level element
|
# remember top level element
|
||||||
defined $self->{ data }
|
exists $self->{ data }
|
||||||
or ($self->{ data } = $current);
|
or ($self->{ data } = $current);
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -126,7 +135,7 @@ sub _initialize {
|
|||||||
# multiple values must be implemented in base class
|
# multiple values must be implemented in base class
|
||||||
$_method = "add_$_localname";
|
$_method = "add_$_localname";
|
||||||
$$list[-1]->$_method( $current );
|
$$list[-1]->$_method( $current );
|
||||||
|
|
||||||
$current = pop @$list; # step up in object hierarchy...
|
$current = pop @$list; # step up in object hierarchy...
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -143,6 +152,13 @@ sub parsefile {
|
|||||||
return $_[0]->{ data };
|
return $_[0]->{ data };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# SAX-like aliases
|
||||||
|
sub parse_string;
|
||||||
|
*parse_string = \&parse;
|
||||||
|
|
||||||
|
sub parse_file;
|
||||||
|
*parse_file = \&parsefile;
|
||||||
|
|
||||||
sub get_data {
|
sub get_data {
|
||||||
return $_[0]->{ data };
|
return $_[0]->{ data };
|
||||||
}
|
}
|
||||||
@@ -202,9 +218,9 @@ This module may be used under the same terms as perl itself.
|
|||||||
|
|
||||||
$ID: $
|
$ID: $
|
||||||
|
|
||||||
$LastChangedDate: $
|
$LastChangedDate: 2007-09-10 18:19:23 +0200 (Mo, 10 Sep 2007) $
|
||||||
$LastChangedRevision: $
|
$LastChangedRevision: 218 $
|
||||||
$LastChangedBy: $
|
$LastChangedBy: kutterma $
|
||||||
|
|
||||||
$HeadURL: $
|
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $
|
||||||
|
|
||||||
|
|||||||
@@ -67,9 +67,9 @@ This module may be used under the same terms as perl itself.
|
|||||||
|
|
||||||
$ID: $
|
$ID: $
|
||||||
|
|
||||||
$LastChangedDate: $
|
$LastChangedDate: 2007-09-10 17:54:52 +0200 (Mo, 10 Sep 2007) $
|
||||||
$LastChangedRevision: $
|
$LastChangedRevision: 214 $
|
||||||
$LastChangedBy: $
|
$LastChangedBy: kutterma $
|
||||||
|
|
||||||
$HeadURL: $
|
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageStreamParser.pm $
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,213 @@
|
|||||||
|
#!/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 (Mo, 10 Sep 2007) $
|
||||||
|
$LastChangedRevision: 214 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
|
||||||
|
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageSubParser.pm $
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,219 @@
|
|||||||
|
#!/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 (Mo, 10 Sep 2007) $
|
||||||
|
$LastChangedRevision: 214 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
|
||||||
|
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/SubParser.pm $
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,175 @@
|
|||||||
|
package SOAP::WSDL::Expat::WSDLParser;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Carp;
|
||||||
|
use SOAP::WSDL::TypeLookup;
|
||||||
|
use XML::Parser::Expat;
|
||||||
|
|
||||||
|
sub new {
|
||||||
|
my ($class, $args) = @_;
|
||||||
|
my $self = {};
|
||||||
|
bless $self, $class;
|
||||||
|
return $self;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _initialize {
|
||||||
|
my ($self, $parser) = @_;
|
||||||
|
|
||||||
|
# init object data
|
||||||
|
$self->{ parser } = $parser;
|
||||||
|
delete $self->{ data };
|
||||||
|
|
||||||
|
# setup local variables for keeping temp data
|
||||||
|
my $characters = undef;
|
||||||
|
my $current = undef;
|
||||||
|
my $list = []; # node list
|
||||||
|
|
||||||
|
# TODO skip non-XML Schema namespace tags
|
||||||
|
$parser->setHandlers(
|
||||||
|
Start => sub {
|
||||||
|
my ($parser, $localname, %attrs) = @_;
|
||||||
|
|
||||||
|
$characters = q{};
|
||||||
|
|
||||||
|
my $action = SOAP::WSDL::TypeLookup->lookup(
|
||||||
|
$parser->namespace($localname),
|
||||||
|
$localname
|
||||||
|
);
|
||||||
|
return if not $action;
|
||||||
|
|
||||||
|
if ($action->{ type } eq 'CLASS') {
|
||||||
|
eval "require $action->{ class }";
|
||||||
|
croak $@ if ($@);
|
||||||
|
|
||||||
|
my $obj = $action->{ class }->new({ parent => $current })
|
||||||
|
->init( _fixup_attrs( $parser, %attrs ) );
|
||||||
|
|
||||||
|
if ($current) {
|
||||||
|
# inherit namespace, but don't override
|
||||||
|
$obj->set_targetNamespace( $current->get_targetNamespace() )
|
||||||
|
if not $obj->get_targetNamespace();
|
||||||
|
|
||||||
|
# push on parent's element/type list
|
||||||
|
my $method = "push_$localname";
|
||||||
|
|
||||||
|
no strict qw(refs);
|
||||||
|
$current->$method( $obj );
|
||||||
|
|
||||||
|
# remember element for stepping back
|
||||||
|
push @{ $list }, $current;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$self->{ data } = $obj;
|
||||||
|
}
|
||||||
|
# set new element (step down)
|
||||||
|
$current = $obj;
|
||||||
|
}
|
||||||
|
elsif ($action->{ type } eq 'PARENT') {
|
||||||
|
$current->init( _fixup_attrs($parser, %attrs) );
|
||||||
|
}
|
||||||
|
elsif ($action->{ type } eq 'METHOD') {
|
||||||
|
my $method = $action->{ method } || $localname;
|
||||||
|
|
||||||
|
no strict qw(refs);
|
||||||
|
# call method with
|
||||||
|
# - default value ($action->{ value } if defined,
|
||||||
|
# dereferencing lists
|
||||||
|
# - the values of the elements Attributes hash
|
||||||
|
# TODO: add namespaces declared to attributes.
|
||||||
|
# Expat consumes them, so we have to re-add them here.
|
||||||
|
$current->$method( defined $action->{ value }
|
||||||
|
? ref $action->{ value }
|
||||||
|
? @{ $action->{ value } }
|
||||||
|
: ($action->{ value })
|
||||||
|
: _fixup_attrs($parser, %attrs)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
Char => sub { $characters .= $_[1] },
|
||||||
|
|
||||||
|
End => sub {
|
||||||
|
my ($parser, $localname) = @_;
|
||||||
|
|
||||||
|
my $action = SOAP::WSDL::TypeLookup->lookup(
|
||||||
|
$parser->namespace( $localname ),
|
||||||
|
$localname
|
||||||
|
) || {};
|
||||||
|
|
||||||
|
return if not ($action->{ type });
|
||||||
|
if ( $action->{ type } eq 'CLASS' ) {
|
||||||
|
$current = pop @{ $list };
|
||||||
|
}
|
||||||
|
elsif ($action->{ type } eq 'CONTENT' ) {
|
||||||
|
my $method = $action->{ method };
|
||||||
|
|
||||||
|
# normalize whitespace
|
||||||
|
$characters =~s{ ^ \s+ (.+) \s+ $ }{$1}xms;
|
||||||
|
$characters =~s{ \s+ }{ }xmsg;
|
||||||
|
|
||||||
|
no strict qw(refs);
|
||||||
|
$current->$method( $characters );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
return $parser;
|
||||||
|
}
|
||||||
|
|
||||||
|
# make attrs SAX style
|
||||||
|
sub _fixup_attrs {
|
||||||
|
my ($parser, %attrs_of) = @_;
|
||||||
|
|
||||||
|
my @attrs_from = map { $_ =
|
||||||
|
{
|
||||||
|
Name => $_,
|
||||||
|
Value => $attrs_of{ $_ },
|
||||||
|
LocalName => $_
|
||||||
|
}
|
||||||
|
} keys %attrs_of;
|
||||||
|
|
||||||
|
# add xmlns: attrs. expat eats them.
|
||||||
|
push @attrs_from, map {
|
||||||
|
# ignore xmlns=FOO namespaces - must be XML schema
|
||||||
|
# Other nodes should be ignored somewhere else
|
||||||
|
($_ eq '#default')
|
||||||
|
? ()
|
||||||
|
:
|
||||||
|
{
|
||||||
|
Name => "xmlns:$_",
|
||||||
|
Value => $parser->expand_ns_prefix( $_ ),
|
||||||
|
LocalName => $_
|
||||||
|
}
|
||||||
|
} $parser->new_ns_prefixes();
|
||||||
|
return @attrs_from;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
package SOAP::WSDL::Factory::Deserializer;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
my %DESERIALIZER = (
|
||||||
|
'1.1' => 'SOAP::WSDL::Deserializer::SOAP11',
|
||||||
|
);
|
||||||
|
|
||||||
|
# class method
|
||||||
|
sub register {
|
||||||
|
my ($class, $ref_type, $package) = @_;
|
||||||
|
$DESERIALIZER{ $ref_type } = $package;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_deserializer {
|
||||||
|
my ($self, $args_of_ref) = @_;
|
||||||
|
eval "require $DESERIALIZER{ $args_of_ref->{ soap_version } }" or die $@;
|
||||||
|
return $DESERIALIZER{ $args_of_ref->{ soap_version } }->new($args_of_ref);
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SOAP::WSDL::Factory::Deserializer - factory for retrieving Deserializer objects
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# from SOAP::WSDL::Client:
|
||||||
|
$deserializer = SOAP::WSDL::Factory::Serializer->get_deserializer({
|
||||||
|
soap_version => $soap_version,
|
||||||
|
class_resolver => $class_resolver,
|
||||||
|
});
|
||||||
|
|
||||||
|
# in serializer class:
|
||||||
|
package MyWickedSerializer;
|
||||||
|
use SOAP::WSDL::Factory::Deserializer;
|
||||||
|
|
||||||
|
# u don't know the SOAP 1.2 recommendation? poor boy...
|
||||||
|
SOAP::WSDL::Factory::Deserializer->register( '1.2' , __PACKAGE__ );
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP::WSDL::Factory::Deserializer serves as factory for retrieving
|
||||||
|
deserializer objects for SOAP::WSDL.
|
||||||
|
|
||||||
|
The actual work is done by specific deserializer classes.
|
||||||
|
|
||||||
|
SOAP::WSDL::Deserializer tries to load one of the following classes:
|
||||||
|
|
||||||
|
a) the class registered for the scheme via register()
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 register
|
||||||
|
|
||||||
|
SOAP::WSDL::Serializer->register('1.1', 'MyWickedSerializer');
|
||||||
|
|
||||||
|
Globally registers a class for use as serializer class.
|
||||||
|
|
||||||
|
=head2 get_deserializer
|
||||||
|
|
||||||
|
Returns an object of the deserializer class for this endpoint.
|
||||||
|
|
||||||
|
=head1 WRITING YOUR OWN DESERIALIZER CLASS
|
||||||
|
|
||||||
|
Deserializer classes may register with
|
||||||
|
SOAP::WSDL::Factory::Deserializer.
|
||||||
|
|
||||||
|
Registering a deserializer class with
|
||||||
|
SOAP::WSDL::Factory::Deserializer is done by executing the
|
||||||
|
following code where $version is the SOAP version the class should
|
||||||
|
be used for, and $class is the class
|
||||||
|
name.
|
||||||
|
|
||||||
|
SOAP::WSDL::Factory::Deserializer->register( $version, $class);
|
||||||
|
|
||||||
|
To auto-register your transport class on loading, execute register()
|
||||||
|
in your tranport class (see L<SYNOPSIS|SYNOPSIS> above).
|
||||||
|
|
||||||
|
Deserializer modules must be named equal to the deserializer
|
||||||
|
class they contain. There can only be one deserializer class per
|
||||||
|
deserializer module.
|
||||||
|
|
||||||
|
Deserializer classes must implement the following methods:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * new
|
||||||
|
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
=item * deserialize
|
||||||
|
|
||||||
|
Deserialize data from XML to arbitrary formats.
|
||||||
|
|
||||||
|
deserialize() must return a fault indicating that deserializing
|
||||||
|
failed if any error is encountered during the process of
|
||||||
|
deserializing the XML message.
|
||||||
|
|
||||||
|
The following
|
||||||
|
positional parameters are passed to the deserialize method:
|
||||||
|
|
||||||
|
$content - the xml message
|
||||||
|
|
||||||
|
=item * generate_fault
|
||||||
|
|
||||||
|
Generate a fault in the supported format. The following named
|
||||||
|
parameters are passed as a single hash ref:
|
||||||
|
|
||||||
|
code - The fault code, e.g. 'soap:Server' or the like
|
||||||
|
role - The fault role (actor in SOAP1.1)
|
||||||
|
message - The fault message (faultstring in SOAP1.1)
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 LICENSE
|
||||||
|
|
||||||
|
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: 176 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: Serializer.pm 176 2007-08-31 15:28:29Z kutterma $
|
||||||
|
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
|
||||||
|
|
||||||
|
=cut
|
||||||
@@ -0,0 +1,128 @@
|
|||||||
|
package SOAP::WSDL::Factory::Serializer;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
my %SERIALIZER = (
|
||||||
|
'1.1' => 'SOAP::WSDL::Serializer::SOAP11',
|
||||||
|
);
|
||||||
|
|
||||||
|
# class method
|
||||||
|
sub register {
|
||||||
|
my ($class, $ref_type, $package) = @_;
|
||||||
|
$SERIALIZER{ $ref_type } = $package;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_serializer {
|
||||||
|
my ($self, $args_of_ref) = @_;
|
||||||
|
eval "require $SERIALIZER{ $args_of_ref->{ soap_version } }" or die $@;
|
||||||
|
return $SERIALIZER{ $args_of_ref->{ soap_version } }->new();
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SOAP::WSDL::Factory::Serializer - factory for retrieving serializer objects
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# from SOAP::WSDL::Client:
|
||||||
|
$serializer = SOAP::WSDL::Factory::Serializer->get_serializer({
|
||||||
|
soap_version => $soap_version,
|
||||||
|
});
|
||||||
|
|
||||||
|
# in serializer class:
|
||||||
|
package MyWickedSerializer;
|
||||||
|
use SOAP::WSDL::Factory::Serializer;
|
||||||
|
|
||||||
|
# u don't know the SOAP 1.2 recommendation? poor boy...
|
||||||
|
SOAP::WSDL::Factory::Serializer->register( '1.2' , __PACKAGE__ );
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP::WSDL::Factory::Serializer serves as factory for retrieving
|
||||||
|
serializer objects for SOAP::WSDL.
|
||||||
|
|
||||||
|
The actual work is done by specific serializer classes.
|
||||||
|
|
||||||
|
SOAP::WSDL::Serializer tries to load one of the following classes:
|
||||||
|
|
||||||
|
a) the class registered for the scheme via register()
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 register
|
||||||
|
|
||||||
|
SOAP::WSDL::Serializer->register('1.1', 'MyWickedSerializer');
|
||||||
|
|
||||||
|
Globally registers a class for use as serializer class.
|
||||||
|
|
||||||
|
=head2 get_serializer
|
||||||
|
|
||||||
|
Returns an object of the serializer class for this endpoint.
|
||||||
|
|
||||||
|
=head1 WRITING YOUR OWN SERIALIZER CLASS
|
||||||
|
|
||||||
|
Serializer classes may register with SOAP::WSDL::Factory::Serializer.
|
||||||
|
|
||||||
|
Serializer objects may also be passed directly to SOAP::WSDL::Client
|
||||||
|
by using the set_serializer method. Note that serializers objects set
|
||||||
|
via SOAP::WSDL::Client's set_serializer method are discarded when the
|
||||||
|
SOAP version is changed via set_soap_version.
|
||||||
|
|
||||||
|
Registering a serializer class with SOAP::WSDL::Factory::Serializer
|
||||||
|
is done by executing the following code where $version is the
|
||||||
|
SOAP version the class should be used for, and $class is the class
|
||||||
|
name.
|
||||||
|
|
||||||
|
SOAP::WSDL::Factory::Serializer->register( $version, $class);
|
||||||
|
|
||||||
|
To auto-register your transport class on loading, execute register()
|
||||||
|
in your tranport class (see L<SYNOPSIS|SYNOPSIS> above).
|
||||||
|
|
||||||
|
Serializer modules must be named equal to the serializer
|
||||||
|
class they contain. There can only be one serializer class per
|
||||||
|
serializer module.
|
||||||
|
|
||||||
|
Serializer class must implement the following methods:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * new
|
||||||
|
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
=item * serialize
|
||||||
|
|
||||||
|
Serializes data to XML. The following named parameters are passed to
|
||||||
|
the serialize method in a anonymous hash ref:
|
||||||
|
|
||||||
|
{
|
||||||
|
method => $operation_name,
|
||||||
|
header => $header_data,
|
||||||
|
body => $body_data,
|
||||||
|
}
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 LICENSE
|
||||||
|
|
||||||
|
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: 218 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: Serializer.pm 218 2007-09-10 16:19:23Z kutterma $
|
||||||
|
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
|
||||||
|
|
||||||
|
=cut
|
||||||
@@ -0,0 +1,231 @@
|
|||||||
|
package SOAP::WSDL::Factory::Transport;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
# class data
|
||||||
|
my %registered_transport_of = ();
|
||||||
|
|
||||||
|
# Local constants
|
||||||
|
# Could be made readonly, but that's just for the paranoid...
|
||||||
|
my %SOAP_LITE_TRANSPORT_OF = (
|
||||||
|
ftp => 'SOAP::Transport::FTP',
|
||||||
|
http => 'SOAP::Transport::HTTP',
|
||||||
|
https => 'SOAP::Transport::HTTPS',
|
||||||
|
mailto => 'SOAP::Transport::MAILTO',
|
||||||
|
'local' => 'SOAP::Transport::LOCAL',
|
||||||
|
jabber => 'SOAP::Transport::JABBER',
|
||||||
|
mq => 'SOAP::Transport::MQ',
|
||||||
|
);
|
||||||
|
|
||||||
|
my %SOAP_WSDL_TRANSPORT_OF = (
|
||||||
|
http => 'SOAP::WSDL::Transport::HTTP',
|
||||||
|
https => 'SOAP::WSDL::Transport::HTTP',
|
||||||
|
);
|
||||||
|
|
||||||
|
# class methods only
|
||||||
|
sub register {
|
||||||
|
my ($class, $scheme, $package) = @_;
|
||||||
|
die "cannot use reference as scheme" if ref $scheme;
|
||||||
|
$registered_transport_of{ $scheme } = $package;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_transport {
|
||||||
|
my ($class, $scheme, %attrs) = @_;
|
||||||
|
|
||||||
|
$scheme =~s{ \A ([^\:]+) \: .+ }{$1}smx;
|
||||||
|
|
||||||
|
if (exists $registered_transport_of{ $scheme }) {
|
||||||
|
eval "require $registered_transport_of{ $scheme }" or die $@;
|
||||||
|
|
||||||
|
# try "foo::Client" class first - SOAP::Tranport always requires
|
||||||
|
# a package withoug the ::Client appended, and then
|
||||||
|
# instantiates a ::Client object...
|
||||||
|
# ... pretty weird ...
|
||||||
|
# ... must be from some time when the max number of files was a
|
||||||
|
# sparse resource ...
|
||||||
|
# ... but we've decided to mimic SOAP::Lite...
|
||||||
|
|
||||||
|
my $protocol_class = $SOAP_LITE_TRANSPORT_OF{ $scheme } . '::Client';
|
||||||
|
my $transport;
|
||||||
|
eval {
|
||||||
|
$transport = $protocol_class->new( %attrs );
|
||||||
|
};
|
||||||
|
return $transport if not $@;
|
||||||
|
return $registered_transport_of{ $scheme }->new( %attrs );
|
||||||
|
}
|
||||||
|
|
||||||
|
# try SOAP::Lite's Transport module - just skip if not require'able
|
||||||
|
SOAP_Lite: {
|
||||||
|
if (exists $SOAP_LITE_TRANSPORT_OF{ $scheme }) {
|
||||||
|
eval "require $SOAP_LITE_TRANSPORT_OF{ $scheme }"
|
||||||
|
or last SOAP_Lite;
|
||||||
|
my $protocol_class = $SOAP_LITE_TRANSPORT_OF{ $scheme } . '::Client';
|
||||||
|
return $protocol_class->new( %attrs );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (exists $SOAP_WSDL_TRANSPORT_OF{ $scheme }) {
|
||||||
|
eval "require $SOAP_WSDL_TRANSPORT_OF{ $scheme }" or die $@;
|
||||||
|
return $SOAP_WSDL_TRANSPORT_OF{ $scheme }->new( %attrs );
|
||||||
|
}
|
||||||
|
|
||||||
|
die "no transport class found for scheme <$scheme>";
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SOAP::WSDL::Factory::Transport - factory for retrieving transport objects
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# from SOAP::WSDL::Client:
|
||||||
|
$transport = SOAP::WSDL::Factory::Transport->get_transport( $url, @opt );
|
||||||
|
|
||||||
|
# in transport class:
|
||||||
|
package MyWickedTransport;
|
||||||
|
use SOAP::WSDL::Factory::Transport;
|
||||||
|
|
||||||
|
# u don't know the httpr protocol? poor boy...
|
||||||
|
SOAP::WSDL::Factory::Transport->register( 'httpr' , __PACKAGE__ );
|
||||||
|
SOAP::WSDL::Factory::Transport->register( 'https' , __PACKAGE__ );
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SOAP::WSDL::Transport serves as factory for retrieving
|
||||||
|
transport objects for SOAP::WSDL.
|
||||||
|
|
||||||
|
The actual work is done by specific transport classes.
|
||||||
|
|
||||||
|
SOAP::WSDL::Transport tries to load one of the following classes:
|
||||||
|
|
||||||
|
a) the class registered for the scheme via register()
|
||||||
|
b) the SOAP::Lite class matching the scheme
|
||||||
|
c) the SOAP::WSDL class matching the scheme
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 register
|
||||||
|
|
||||||
|
SOAP::WSDL::Transport->register('https', 'MyWickedTransport');
|
||||||
|
|
||||||
|
Globally registers a class for use as transport class.
|
||||||
|
|
||||||
|
=head2 proxy
|
||||||
|
|
||||||
|
$trans->proxy('http://soap-wsdl.sourceforge.net');
|
||||||
|
|
||||||
|
Sets the proxy (endpoint).
|
||||||
|
|
||||||
|
Returns the transport for this protocol.
|
||||||
|
|
||||||
|
=head2 set_transport
|
||||||
|
|
||||||
|
Sets the current transport object.
|
||||||
|
|
||||||
|
=head2 get_transport
|
||||||
|
|
||||||
|
Gets the current transport object.
|
||||||
|
|
||||||
|
=head1 WRITING YOUR OWN TRANSPORT CLASS
|
||||||
|
|
||||||
|
Transport classes must be registered with SOAP::WSDL::Factory::Transport.
|
||||||
|
|
||||||
|
This is done by executing the following code where $scheme is the
|
||||||
|
URL scheme the class should be used for, and $module is the class'
|
||||||
|
module name.
|
||||||
|
|
||||||
|
SOAP::WSDL::Factory::Transport->register( $scheme, $module);
|
||||||
|
|
||||||
|
To auto-register your transport class on loading, execute register()
|
||||||
|
in your tranport class (see L<SYNOPSIS|SYNOPSIS> above).
|
||||||
|
|
||||||
|
Multiple protocols ore multiple classes are registered by multiple calls to
|
||||||
|
register().
|
||||||
|
|
||||||
|
You may only use transport classes whose name is either
|
||||||
|
the module name or the module name with '::Client' appended.
|
||||||
|
|
||||||
|
Transport classes must implement the interface required for
|
||||||
|
SOAP::Lite transport classes.
|
||||||
|
|
||||||
|
See L<SOAP::Lite::Transport> for details,
|
||||||
|
L<SOAP::WSDL::Transport::HTTP|SOAP::WSDL::Transport::HTTP>
|
||||||
|
for an example.
|
||||||
|
|
||||||
|
Transport modules must implement the following methods:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item * new
|
||||||
|
|
||||||
|
=item * send_receive
|
||||||
|
|
||||||
|
Dispatches a request and returns the content of the response.
|
||||||
|
|
||||||
|
=item * code
|
||||||
|
|
||||||
|
Returns the status code of the last send_receive call (if any).
|
||||||
|
|
||||||
|
=item * message
|
||||||
|
|
||||||
|
Returns the status message of the last send_receive call (if any).
|
||||||
|
|
||||||
|
=item * status
|
||||||
|
|
||||||
|
Returns the status of the last send_receive call (if any).
|
||||||
|
|
||||||
|
=item * is_success
|
||||||
|
|
||||||
|
Returns true after a send_receive was successful, false if it was not.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
SOAP::Lite requires transport modules to pack client and server
|
||||||
|
classes in one file, and to follow this naming scheme:
|
||||||
|
|
||||||
|
Module name:
|
||||||
|
"SOAP::Transport::" . uc($scheme)
|
||||||
|
|
||||||
|
Client class (additional package in module):
|
||||||
|
"SOAP::Transport::" . uc($scheme) . "::Client"
|
||||||
|
|
||||||
|
Server class (additional package in module):
|
||||||
|
"SOAP::Transport::" . uc($scheme) . "::Client"
|
||||||
|
|
||||||
|
SOAP::WSDL does not require you to follow these restrictions.
|
||||||
|
|
||||||
|
There is only one restriction in SOAP::WSDL:
|
||||||
|
|
||||||
|
You may only use transport classes whose name is either
|
||||||
|
the module name or the module name with '::Client' appended.
|
||||||
|
|
||||||
|
SOAP::WSDL will try to instantiate an object of your
|
||||||
|
transport class with '::Client' appended to allow using transport
|
||||||
|
classes written for SOAP::Lite.
|
||||||
|
|
||||||
|
This may lead to errors when a different module with the name
|
||||||
|
of your transport module suffixed with ::Client is also loaded.
|
||||||
|
|
||||||
|
=head1 LICENSE
|
||||||
|
|
||||||
|
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: 218 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: Transport.pm 218 2007-09-10 16:19:23Z kutterma $
|
||||||
|
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $
|
||||||
|
|
||||||
|
=cut
|
||||||
+212
-215
@@ -1,225 +1,222 @@
|
|||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head1 NAME
|
=head1 NAME
|
||||||
|
|
||||||
SOAP::WSDL::Manual - accessing WSDL based web services
|
SOAP::WSDL::Manual - accessing WSDL based web services
|
||||||
|
|
||||||
=head1 Accessing a WSDL-based web service
|
=head1 Accessing a WSDL-based web service
|
||||||
|
|
||||||
=head2 Quick walk-through for the unpatient
|
=head2 Quick walk-through for the unpatient
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item * Create WSDL bindings
|
=item * Create WSDL bindings
|
||||||
|
|
||||||
perl wsdl2perl.pl -b base_dir URL
|
perl wsdl2perl.pl -b base_dir URL
|
||||||
|
|
||||||
=item * Look what has been generated
|
=item * Look what has been generated
|
||||||
|
|
||||||
Check the results of the generator. There should be one
|
Check the results of the generator. There should be one
|
||||||
MyInterface/SERVICE_NAME.pm file per service.
|
MyInterface/SERVICE_NAME.pm file per service.
|
||||||
|
|
||||||
=item * Write script
|
=item * Write script
|
||||||
|
|
||||||
use MyInterface::SERVICE_NAME;
|
use MyInterface::SERVICE_NAME;
|
||||||
my $service = MyInterface::SERVICE_NAME->new();
|
my $service = MyInterface::SERVICE_NAME->new();
|
||||||
|
|
||||||
my $result = $service->SERVICE_METHOD();
|
my $result = $service->SERVICE_METHOD();
|
||||||
die $result if not $result;
|
die $result if not $result;
|
||||||
|
|
||||||
print $result;
|
print $result;
|
||||||
|
|
||||||
C<perldoc MyInterface::SERVICE_NAME> should give you some overview about
|
C<perldoc MyInterface::SERVICE_NAME> should give you some overview about
|
||||||
the service's interface structure.
|
the service's interface structure.
|
||||||
|
|
||||||
The results of all calls to your service object's methods (except new)
|
The results of all calls to your service object's methods (except new)
|
||||||
are objects based on SOAP::WSDL's XML schema implementation.
|
are objects based on SOAP::WSDL's XML schema implementation.
|
||||||
|
|
||||||
These objects are false in boolean context, and serialize to XML when
|
To access the object's properties use get_NAME / set_NAME getter/setter
|
||||||
printed.
|
methods whith NAME corresponding to the XML tag name.
|
||||||
|
|
||||||
To access the object's properties use get_NAME / set_NAME getter/setter
|
=item * Run script
|
||||||
methods whith NAME corresponding to the XML tag name.
|
|
||||||
|
=back
|
||||||
=item * Run script
|
|
||||||
|
=head2 Instrumenting web services with interface classes
|
||||||
=back
|
|
||||||
|
SOAP::WSDL (starting from 2.00) instruments WSDL based web services with
|
||||||
=head2 Instrumenting web services with interface classes
|
interface classes. This means that SOAP::WSDL features a code generator
|
||||||
|
which creates one class for every web service you want to access.
|
||||||
SOAP::WSDL (starting from 2.00) instruments WSDL based web services with
|
|
||||||
interface classes. This means that SOAP::WSDL features a code generator
|
Moreover, the data types from the WSDL definitions are also wrapped into
|
||||||
which creates one class for every web service you want to access.
|
classes and returned to the user as objects.
|
||||||
|
|
||||||
Moreover, the data types from the WSDL definitions are also wrapped into
|
To find out which class a particular XML node should be, SOAP::WSDL uses
|
||||||
classes and returned to the user as objects.
|
typemaps. For every Web service, there's also a typemap created.
|
||||||
|
|
||||||
To find out which class a particular XML node should be, SOAP::WSDL uses
|
=head2 Interface class creation
|
||||||
typemaps. For every Web service, there's also a typemap created.
|
|
||||||
|
To create interface classes, follow the steps above from
|
||||||
=head2 Interface class creation
|
L<Quick walk-through for the unpatient|Quick walk-through for the unpatient>.
|
||||||
|
|
||||||
To create interface classes, follow the steps above from
|
If this works fine for you, skip the next paragraphs. If not, read on.
|
||||||
L<Quick walk-through for the unpatient|Quick walk-through for the unpatient>.
|
|
||||||
|
The steps to instrument a web service with SOAP::WSDL perl bindings
|
||||||
If this works fine for you, skip the next paragraphs. If not, read on.
|
(in detail) are as follows:
|
||||||
|
|
||||||
The steps to instrument a web service with SOAP::WSDL perl bindings
|
=over
|
||||||
(in detail) are as follows:
|
|
||||||
|
=item * Gather web service information
|
||||||
=over
|
|
||||||
|
You'll need to know at least a URL pointing to the web service's WSDL
|
||||||
=item * Gather web service information
|
definition.
|
||||||
|
|
||||||
You'll need to know at least a URL pointing to the web service's WSDL
|
If you already know more - like which methods the service provides, or
|
||||||
definition.
|
how the XML messages look like, that's fine. All these things will help you
|
||||||
|
later.
|
||||||
If you already know more - like which methods the service provides, or
|
|
||||||
how the XML messages look like, that's fine. All these things will help you
|
=item * Create WSDL bindings
|
||||||
later.
|
|
||||||
|
perl wsdl2perl.pl -b base_dir URL
|
||||||
=item * Create WSDL bindings
|
|
||||||
|
This will generate the perl bindings in the directory specified by base_dir.
|
||||||
perl wsdl2perl.pl -b base_dir URL
|
|
||||||
|
For more options, see L<wsdl2perl.pl> - you may want to specify class
|
||||||
This will generate the perl bindings in the directory specified by base_dir.
|
prefixes for XML type and element classes, type maps and interface classes,
|
||||||
|
and you may even want to add custom typemap elements.
|
||||||
For more options, see L<wsdl2perl.pl> - you may want to specify class
|
|
||||||
prefixes for XML type and element classes, type maps and interface classes,
|
=item * Check the result
|
||||||
and you may even want to add custom typemap elements.
|
|
||||||
|
There should be a bunch of classes for types (in the MyTypes:: namespace by
|
||||||
=item * Check the result
|
default), elements (in MyElements::), and at least one typemap
|
||||||
|
(in MyTypemaps::) and one interface class (in MyInterfaces::).
|
||||||
There should be a bunch of classes for types (in the MyTypes:: namespace by
|
|
||||||
default), elements (in MyElements::), and at least one typemap
|
If you don't already know the details of the web service you're going to
|
||||||
(in MyTypemaps::) and one interface class (in MyInterfaces::).
|
instrument, it's now time to read the perldoc of the generated interface
|
||||||
|
classes. It will tell you what methods each service provides, and which
|
||||||
If you don't already know the details of the web service you're going to
|
parameters they take.
|
||||||
instrument, it's now time to read the perldoc of the generated interface
|
|
||||||
classes. It will tell you what methods each service provides, and which
|
If the WSDL definition is informative about what these methods do,
|
||||||
parameters they take.
|
the included perldoc will be, too.
|
||||||
|
|
||||||
If the WSDL definition is informative about what these methods do,
|
=item * Write a perl script (or module) accessing the web service.
|
||||||
the included perldoc will be, too.
|
|
||||||
|
use MyInterface::SERVICE_NAME;
|
||||||
=item * Write a perl script (or module) accessing the web service.
|
my $service = MyInterface::SERVICE_NAME->new();
|
||||||
|
|
||||||
use MyInterface::SERVICE_NAME;
|
my $result = $service->SERVICE_METHOD();
|
||||||
my $service = MyInterface::SERVICE_NAME->new();
|
die $result if not $result;
|
||||||
|
print $result;
|
||||||
my $result = $service->SERVICE_METHOD();
|
|
||||||
die $result if not $result;
|
The above handling of errors ("die $result if not $result") may look a bit
|
||||||
print $result;
|
strange - it is due to the nature of
|
||||||
|
L<SOAP::WSDL::SOAP::Typelib::Fault11|SOAP::WSDL::SOAP::Typelib::Fault11>
|
||||||
The above handling of errors ("die $result if not $result") may look a bit
|
objects SOAP::WSDL uses for signalling failure.
|
||||||
strange - it is due to the nature of
|
|
||||||
L<SOAP::WSDL::SOAP::Typelib::Fault11|SOAP::WSDL::SOAP::Typelib::Fault11>
|
These objects are false in boolean context, but serialize to their XML structure
|
||||||
objects SOAP::WSDL uses for signalling failure.
|
on stringification.
|
||||||
|
|
||||||
These objects are false in boolean context, but serialize to their XML structure
|
You may, of course, access individual fault properties, too. To get a list of
|
||||||
on stringification.
|
fault properties, see L<SOAP::WSDL::SOAP::Typelib::Fault11>
|
||||||
|
|
||||||
You may, of course, access individual fault properties, too. To get a list of
|
=back
|
||||||
fault properties, see L<SOAP::WSDL::SOAP::Typelib::Fault11>
|
|
||||||
|
=head2 Adding missing information
|
||||||
=back
|
|
||||||
|
Sometimes, WSDL definitions are incomplete. In most of these cases, proper
|
||||||
=head2 Adding missing information
|
fault definitions are missing. This means that though the specification sais
|
||||||
|
nothing about it, Fault messages include extra elements in the
|
||||||
Sometimes, WSDL definitions are incomplete. In most of these cases, proper
|
E<lt>detailE<gt> section, or faults are even indicated by non-fault messages.
|
||||||
fault definitions are missing. This means that though the specification sais
|
|
||||||
nothing about it, Fault messages include extra elements in the
|
There are two steps you need to perform for adding additional information.
|
||||||
E<lt>detailE<gt> section, or faults are even indicated by non-fault messages.
|
|
||||||
|
=over
|
||||||
There are two steps you need to perform for adding additional information.
|
|
||||||
|
=item * Provide required type classes
|
||||||
=over
|
|
||||||
|
For each extra data type used in the XML messages, a type class has to be
|
||||||
=item * Provide required type classes
|
created.
|
||||||
|
|
||||||
For each extra data type used in the XML messages, a type class has to be
|
It is strongly discouraged to use the same namespace for hand-written and
|
||||||
created.
|
generated classes - while generated classes may be many, you probably will
|
||||||
|
only implement a few by hand. These (precious) few classes may get lost
|
||||||
It is strongly discouraged to use the same namespace for hand-written and
|
in the mass of (cheap) generated ones. Just imagine one of your co-workers
|
||||||
generated classes - while generated classes may be many, you probably will
|
(or even yourself) deleting the whole bunch and re-generating everything
|
||||||
only implement a few by hand. These (precious) few classes may get lost
|
- oops - almost everything. You got the point.
|
||||||
in the mass of (cheap) generated ones. Just imagine one of your co-workers
|
|
||||||
(or even yourself) deleting the whole bunch and re-generating everything
|
For simplicity, you probably just want to use builtin types wherever
|
||||||
- oops - almost everything. You got the point.
|
possible - you are probably not interested in whether a fault detail's
|
||||||
|
error code is presented to you as a simpleType ranging from 1 to 10
|
||||||
For simplicity, you probably just want to use builtin types wherever
|
(which you have to write) or as a int (which is a builtin type ready
|
||||||
possible - you are probably not interested in whether a fault detail's
|
to use).
|
||||||
error code is presented to you as a simpleType ranging from 1 to 10
|
|
||||||
(which you have to write) or as a int (which is a builtin type ready
|
Using builtin types for simpleType definitions may greatly reduce the
|
||||||
to use).
|
number of additional classes you need to implement.
|
||||||
|
|
||||||
Using builtin types for simpleType definitions may greatly reduce the
|
If the extra type classes you need include E<lt>complexType E<gt>
|
||||||
number of additional classes you need to implement.
|
or E<lt>element /E<gt> definitions, see
|
||||||
|
L<SOAP::WSDL::SOAP::Typelib::ComplexType> and
|
||||||
If the extra type classes you need include E<lt>complexType E<gt>
|
L<SOAP::WSDL::SOAP::Typelib::Element> on how to create ComplexType
|
||||||
or E<lt>element /E<gt> definitions, see
|
and Element type classes.
|
||||||
L<SOAP::WSDL::SOAP::Typelib::ComplexType> and
|
|
||||||
L<SOAP::WSDL::SOAP::Typelib::Element> on how to create ComplexType
|
=item * Provide a typemap snippet to wsdl2perl.pl
|
||||||
and Element type classes.
|
|
||||||
|
SOAP::WSDL uses typemaps for finding out into which class' object
|
||||||
=item * Provide a typemap snippet to wsdl2perl.pl
|
a XML node should be transformed.
|
||||||
|
|
||||||
SOAP::WSDL uses typemaps for finding out into which class' object
|
Typemaps basically map the path of every XML element inside the Body
|
||||||
a XML node should be transformed.
|
tag to a perl class.
|
||||||
|
|
||||||
Typemaps basically map the path of every XML element inside the Body
|
Typemap snippets have to look like this (which is actually the
|
||||||
tag to a perl class.
|
default Fault typemap included in every generated one):
|
||||||
|
|
||||||
Typemap snippets have to look like this (which is actually the
|
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
|
||||||
default Fault typemap included in every generated one):
|
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
||||||
|
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
||||||
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
|
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
||||||
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyType',
|
||||||
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
|
|
||||||
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
|
The lines are hash key - value pairs. The keys are the XPath
|
||||||
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyType',
|
expression relative to the Body element.
|
||||||
|
|
||||||
The lines are hash key - value pairs. The keys are the XPath
|
If you don't know about XPath: They are just the names of the XML
|
||||||
expression relative to the Body element.
|
tags, starting from the one inside E<lt>BodyE<gt> up to the current
|
||||||
|
one joined by /.
|
||||||
If you don't know about XPath: They are just the names of the XML
|
|
||||||
tags, starting from the one inside E<lt>BodyE<gt> up to the current
|
One line for every XML node is required.
|
||||||
one joined by /.
|
|
||||||
|
You may use all builtin, generated or custom type class names as
|
||||||
One line for every XML node is required.
|
values.
|
||||||
|
|
||||||
You may use all builtin, generated or custom type class names as
|
Use wsdl2perl.pl -mi=FILE to include custom typemap snippets.
|
||||||
values.
|
|
||||||
|
Your extra statements are included last, so they override potential
|
||||||
Use wsdl2perl.pl -mi=FILE to include custom typemap snippets.
|
typemap statements with the same keys.
|
||||||
|
|
||||||
Your extra statements are included last, so they override potential
|
=back
|
||||||
typemap statements with the same keys.
|
|
||||||
|
=head1 Accessing a web service without a WSDL definition
|
||||||
=back
|
|
||||||
|
=head1 Troubleshooting
|
||||||
=head1 Accessing a web service without a WSDL definition
|
|
||||||
|
|
||||||
=head1 Troubleshooting
|
=head1 SEE ALSO
|
||||||
|
|
||||||
|
L<SOAP::WSDL::Manual::Glossary> The meaning of all these words
|
||||||
=head1 SEE ALSO
|
|
||||||
|
L<SOAP::WSDL::Client> Basic client for SOAP::WSDL based interfaces
|
||||||
L<SOAP::WSDL::Manual::Glossary> The meaning of all these words
|
|
||||||
|
L<SOAP::WSDL> an interpreting WSDL based SOAP client
|
||||||
L<SOAP::WSDL::Client> Basic client for SOAP::WSDL based interfaces
|
|
||||||
|
|
||||||
L<SOAP::WSDL> an interpreting WSDL based SOAP client
|
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE
|
||||||
|
|
||||||
Copyright 2007 Martin Kutter.
|
Copyright 2007 Martin Kutter.
|
||||||
|
|
||||||
This file is part of SOAP-WSDL. You may distribute/modify it under
|
This file is part of SOAP-WSDL. You may distribute/modify it under
|
||||||
the same terms as perl itself
|
the same terms as perl itself
|
||||||
|
|
||||||
=head1 AUTHOR
|
=head1 AUTHOR
|
||||||
|
|
||||||
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -1,41 +1,81 @@
|
|||||||
=head1 NAME
|
=head1 NAME
|
||||||
|
|
||||||
SOAP::WSDL::Manual::Glossary - Those acronyms and stuff
|
SOAP::WSDL::Manual::Glossary - Those acronyms and stuff
|
||||||
|
|
||||||
=head1 Glossary
|
=head1 Glossary
|
||||||
|
|
||||||
=head2 web service
|
=head2 web service
|
||||||
|
|
||||||
Web services are RPC (Remote Procedure Call) interfaces accessible via
|
Web services are RPC (Remote Procedure Call) interfaces accessible via
|
||||||
some internet protocol, typically via HTTP(S).
|
some internet protocol, typically via HTTP(S).
|
||||||
|
|
||||||
=head2 SOAP
|
=head2 SOAP
|
||||||
|
|
||||||
SOAP (the Simple Object Access Protocol) is a specification for
|
SOAP is an acronym for Simple Object Access Protocol.
|
||||||
defining RPC interfaces, including (but not neccessarily limited to)
|
SOAP is a W3C recommendation. The latest version of the SOAP
|
||||||
web services.
|
specification may be found at L<http://www.w3.org/TR/soap/>.
|
||||||
|
|
||||||
While one of the constituting aspects of a web service is its
|
SOAP defines a protocoll for message exchange between applications.
|
||||||
reachability via some internet protocol, you might as well define
|
The most popular usage is to use SOAP for remote procedure calls (RPC).
|
||||||
SOAP services accessible via postcards.
|
|
||||||
|
While one of the constituting aspects of a web service is its
|
||||||
Despite it's name, SOAP has nothing more to do with objects than
|
reachability via some internet protocol, you might as well define
|
||||||
cars have with pets - SOAP messages may, but not neccessarily do
|
SOAP services accessible via postcards.
|
||||||
carry objects, very much like your car may, but does not need to
|
|
||||||
carry your pet.
|
Despite it's name, SOAP has nothing more to do with objects than
|
||||||
|
cars have with pets - SOAP messages may, but not neccessarily do
|
||||||
=head2 WSDL
|
carry objects, very much like your car may, but does not need to
|
||||||
|
carry your pet.
|
||||||
WSDL (Web Service Definition Language) is a XML-based markup language
|
|
||||||
for defining web service interfaces.
|
=head2 WSDL
|
||||||
|
|
||||||
=head2 WS-I
|
WSDL is an acronym for Web Services Description Language.
|
||||||
|
WSDL is a W3C recommendation. The latest version of the WSDL specification
|
||||||
WS-I (Web Service Interoperability) is a industry consortium dedicated
|
may be found at L<http://www.w3.org/TR/wsdl20/>.
|
||||||
to finding interoperability rules for web services.
|
|
||||||
|
WSDL defines a XML-based language for describing web service interfaces,
|
||||||
SOAP::WSDL aims to be a WS-I compliant SOAP client.
|
including SOAP interfaces.
|
||||||
|
|
||||||
|
=head2 WS-I
|
||||||
|
|
||||||
|
WS-I (Web Services Interoperability Organization) is an open industry
|
||||||
|
organisation chartered to promote Web service interoperability across
|
||||||
|
platforms, operating systems, and programming languages.
|
||||||
|
|
||||||
|
WS-I publishes profiles, which provide implementation guidelines for
|
||||||
|
how related Web services specifications should be used together for
|
||||||
|
best interoperability. To date, WS-I has finalized the Basic Profile,
|
||||||
|
Attachments Profile and Simple SOAP Binding Profile.
|
||||||
|
|
||||||
|
SOAP::WSDL aims at complying to the Basic Profile (but does not
|
||||||
|
implement full support yet).
|
||||||
|
|
||||||
|
=head2 SOAP message styles
|
||||||
|
|
||||||
|
=head3 rpc
|
||||||
|
|
||||||
|
Meant for transporting a RPC message. All contents of the SOAP body are
|
||||||
|
put into a top-level node named equal to the SOAP operation.
|
||||||
|
|
||||||
|
WS-I Basic Profile allows the use of rpc message style.
|
||||||
|
|
||||||
|
SOAP::WSDL does not support rpc message style yet.
|
||||||
|
|
||||||
|
SOAP::Lite supports rpc message style only.
|
||||||
|
|
||||||
|
=head3 document
|
||||||
|
|
||||||
|
Meant for transporting arbitrary content. No additional nodes are inserted
|
||||||
|
between the SOAP body and the actual content.
|
||||||
|
|
||||||
|
WS-I Basic Profile allows the use of document message style.
|
||||||
|
|
||||||
|
=head2 SOAP encoding styles
|
||||||
|
|
||||||
|
=head3 encoded
|
||||||
|
|
||||||
|
=head3 literal
|
||||||
|
|
||||||
=head1 LICENSE
|
=head1 LICENSE
|
||||||
|
|
||||||
Copyright 2007 Martin Kutter.
|
Copyright 2007 Martin Kutter.
|
||||||
@@ -46,6 +86,6 @@ the same 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>
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -3,10 +3,10 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use base qw/SOAP::WSDL::Base/;
|
use base qw/SOAP::WSDL::Base/;
|
||||||
|
|
||||||
# this class may be used for both soap::operation and wsdl::operation.
|
# this class may be used for both soap::operation and wsdl::operation.
|
||||||
# which one it is depends on context...
|
# which one it is depends on context...
|
||||||
|
|
||||||
my %operation_of :ATTR(:name<operation> :default<()>);
|
my %operation_of :ATTR(:name<operation> :default<()>);
|
||||||
my %input_of :ATTR(:name<input> :default<()>);
|
my %input_of :ATTR(:name<input> :default<()>);
|
||||||
my %output_of :ATTR(:name<output> :default<()>);
|
my %output_of :ATTR(:name<output> :default<()>);
|
||||||
|
|||||||
+72
-29
@@ -6,8 +6,8 @@ SOAP::WSDL::Parser - How SOAP::WSDL parses XML messages
|
|||||||
|
|
||||||
=head1 Which XML message does SOAP::WSDL parse ?
|
=head1 Which XML message does SOAP::WSDL parse ?
|
||||||
|
|
||||||
Naturally, there are two kinds of XMLdocuments (or messages) SOAP::WSDL
|
Naturally, there are two kinds of XML documents (or messages)
|
||||||
has to parse:
|
SOAP::WSDL has to parse:
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
@@ -19,13 +19,55 @@ has to parse:
|
|||||||
|
|
||||||
=head1 Parser implementations
|
=head1 Parser implementations
|
||||||
|
|
||||||
There are different parser implementations available for SOAP messages -
|
There are different parser implementations available for SOAP messages
|
||||||
currently there's only one for WSDL definitions.
|
and WSDL definitions.
|
||||||
|
|
||||||
|
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>.
|
||||||
|
|
||||||
|
The use of SAX and L<XML::LibXML|XML::LibXML> in SOAP::WSDL is
|
||||||
|
deprecated 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.
|
||||||
|
|
||||||
|
=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.
|
||||||
|
|
||||||
|
=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
|
=head2 WSDL definitions parser
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
|
=item * SOAP::WSDL::Expat::WSDLParser
|
||||||
|
|
||||||
|
A parser for WSDL definitions based on L<XML::Parser::Expat|XML::Parser::Expat>.
|
||||||
|
|
||||||
|
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
|
||||||
|
my $wsdl = $parser->parse_file( $filename );
|
||||||
|
|
||||||
=item * SOAP::WSDL::SAX::WSDLHandler
|
=item * SOAP::WSDL::SAX::WSDLHandler
|
||||||
|
|
||||||
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
|
||||||
@@ -60,12 +102,12 @@ All SOAP message handler use 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.
|
|
||||||
|
|
||||||
See wsdl2perl.pl
|
|
||||||
|
|
||||||
The class resolver must implement a class method "get_class", which is passed
|
The easiest way for creating a class resolver is to run SOAP::WSDL's generator.
|
||||||
|
|
||||||
|
See wsdl2perl.pl
|
||||||
|
|
||||||
|
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 /.
|
||||||
|
|
||||||
This method must return a class name appropriate for a XML element.
|
This method must return a class name appropriate for a XML element.
|
||||||
@@ -118,20 +160,33 @@ at the time of writing.
|
|||||||
Every element must have a correspondent one in the type library.
|
Every element must have a correspondent one in the type library.
|
||||||
|
|
||||||
Builtin types should be resolved as SOAP::WSDL::XSD::Builtin::* classes
|
Builtin types should be resolved as SOAP::WSDL::XSD::Builtin::* classes
|
||||||
|
|
||||||
Creating a type lib is easy: Just run SOAP::WSDL's generator - it will
|
Creating a type lib is easy: Just run SOAP::WSDL's generator - it will
|
||||||
create both a typemap and the type lib classes for a WSDL file.
|
create both a typemap and the type lib classes for a WSDL file.
|
||||||
|
|
||||||
Sometimes it is nessecary to create type lib classes by hand - not all
|
Sometimes it is nessecary to create type lib classes by hand - not all
|
||||||
WSDL definitions are complete.
|
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
|
=head3 Parser implementations
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
|
=item * SOAP::WSDL::Expat::MessageParser
|
||||||
|
|
||||||
|
A L<XML::Parser::Expat|XML::Parser::Expat> based parser. This is the fastest
|
||||||
|
parser for most SOAP messages and the default for SOAP::WSDL::Client.
|
||||||
|
|
||||||
|
=item * SOAP::WSDL::Expat::MessageStreamParser
|
||||||
|
|
||||||
|
A XML::Parser::ExpatNB based parser. Useful for parsing huge HTTP responses,
|
||||||
|
as you don't need to keep everything in memory.
|
||||||
|
|
||||||
|
See L<SOAP::WSDL::Expat::MessageStreamParser|SOAP::WSDL::Expat::MessageStreamParser>
|
||||||
|
for details.
|
||||||
|
|
||||||
=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
|
||||||
@@ -144,18 +199,6 @@ Can be used for parsing both streams (chunks) and documents.
|
|||||||
|
|
||||||
See L<SOAP::WSDL::SAX::MessageHandler> for details.
|
See L<SOAP::WSDL::SAX::MessageHandler> for details.
|
||||||
|
|
||||||
=item * SOAP::WSDL::Expat::MessageParser
|
|
||||||
|
|
||||||
A L<XML::Parser::Expat|XML::Parser::Expat> based parser. This is the fastest
|
|
||||||
parser for most SOAP messages and the default for SOAP::WSDL::Client.
|
|
||||||
|
|
||||||
=item * SOAP::WSDL::Expat::MessageStreamParser
|
|
||||||
|
|
||||||
A XML::Parser::ExpatNB based parser. Useful for parsing huge HTTP responses,
|
|
||||||
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
|
=head3 Performance
|
||||||
|
|||||||
@@ -10,14 +10,14 @@ my %location_of :ATTR(:name<location> :default<()>);
|
|||||||
sub explain {
|
sub explain {
|
||||||
|
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $opt = shift;
|
my $opt = shift;
|
||||||
$opt->{ wsdl } || die 'required attribute wsdl missing';
|
$opt->{ wsdl } || die 'required attribute wsdl missing';
|
||||||
|
|
||||||
my $binding = $opt->{ wsdl }->find_binding(
|
my $binding = $opt->{ wsdl }->find_binding(
|
||||||
$opt->{ wsdl }->_expand( $self->get_binding() )
|
$opt->{ wsdl }->_expand( $self->get_binding() )
|
||||||
) or die 'binding ' . $self->get_binding() . ' not found !';
|
) or die 'binding ' . $self->get_binding() . ' not found !';
|
||||||
|
|
||||||
|
|
||||||
my $txt = "=head2 Service information:\n\n"
|
my $txt = "=head2 Service information:\n\n"
|
||||||
. " Port name: " . $self->get_name() . "\n"
|
. " Port name: " . $self->get_name() . "\n"
|
||||||
. " Binding: " . $self->get_binding() ."\n"
|
. " Binding: " . $self->get_binding() ."\n"
|
||||||
@@ -30,10 +30,10 @@ sub explain {
|
|||||||
sub to_typemap {
|
sub to_typemap {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $opt = shift;
|
my $opt = shift;
|
||||||
|
|
||||||
# skip non-SOAP ports (could be http, email or whatever...)
|
# skip non-SOAP ports (could be http, email or whatever...)
|
||||||
return q{} if not $location_of{ ident $self };
|
return q{} if not $location_of{ ident $self };
|
||||||
|
|
||||||
my $binding = $opt->{ wsdl }->find_binding(
|
my $binding = $opt->{ wsdl }->find_binding(
|
||||||
$opt->{wsdl}->_expand( $binding_of{ ident $self } )
|
$opt->{wsdl}->_expand( $binding_of{ ident $self } )
|
||||||
) or die 'binding ' . $binding_of{ ident $self } .' not found!';
|
) or die 'binding ' . $binding_of{ ident $self } .' not found!';
|
||||||
|
|||||||
@@ -273,9 +273,9 @@ This module may be used under the same terms as perl itself.
|
|||||||
|
|
||||||
$ID: $
|
$ID: $
|
||||||
|
|
||||||
$LastChangedDate: $
|
$LastChangedDate: 2007-09-10 17:54:52 +0200 (Mo, 10 Sep 2007) $
|
||||||
$LastChangedRevision: $
|
$LastChangedRevision: 214 $
|
||||||
$LastChangedBy: $
|
$LastChangedBy: kutterma $
|
||||||
|
|
||||||
$HeadURL: $
|
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/SAX/MessageHandler.pm $
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ my %tree_of :ATTR(:name<tree> :default<{}>);
|
|||||||
my %order_of :ATTR(:name<order> :default<[]>);
|
my %order_of :ATTR(:name<order> :default<[]>);
|
||||||
my %targetNamespace_of :ATTR(:name<targetNamespace> :default<()>);
|
my %targetNamespace_of :ATTR(:name<targetNamespace> :default<()>);
|
||||||
my %current_of :ATTR(:name<current> :default<()>);
|
my %current_of :ATTR(:name<current> :default<()>);
|
||||||
my %characters_of :ATTR();
|
my %characters_of :ATTR();
|
||||||
|
|
||||||
{
|
{
|
||||||
# we have to implement our own new - we need a blessed Hash ref as $self
|
# we have to implement our own new - we need a blessed Hash ref as $self
|
||||||
@@ -86,10 +86,10 @@ sub start_element {
|
|||||||
$element->{ NamespaceURI },
|
$element->{ NamespaceURI },
|
||||||
$element->{ LocalName }
|
$element->{ LocalName }
|
||||||
);
|
);
|
||||||
|
|
||||||
$characters_of{ $ident } = q{};
|
$characters_of{ $ident } = q{};
|
||||||
return if not $action;
|
return if not $action;
|
||||||
|
|
||||||
if ($action->{ type } eq 'CLASS') {
|
if ($action->{ type } eq 'CLASS') {
|
||||||
eval "require $action->{ class }";
|
eval "require $action->{ class }";
|
||||||
croak $@, $tree_of{ $ident } if ($@);
|
croak $@, $tree_of{ $ident } if ($@);
|
||||||
@@ -100,14 +100,14 @@ sub start_element {
|
|||||||
);
|
);
|
||||||
|
|
||||||
# set element in parent
|
# set element in parent
|
||||||
if ($current_of{ $ident }) {
|
if ($current_of{ $ident }) {
|
||||||
# inherit namespace, but don't override
|
# inherit namespace, but don't override
|
||||||
$obj->set_targetNamespace(
|
$obj->set_targetNamespace(
|
||||||
$current_of{ $ident }->get_targetNamespace() )
|
$current_of{ $ident }->get_targetNamespace() )
|
||||||
if not $obj->get_targetNamespace();
|
if not $obj->get_targetNamespace();
|
||||||
|
|
||||||
# push on name list
|
# push on name list
|
||||||
my $method = "push_$element->{ LocalName }";
|
my $method = "push_$element->{ LocalName }";
|
||||||
no strict qw(refs);
|
no strict qw(refs);
|
||||||
$current_of{ $ident }->$method( $obj );
|
$current_of{ $ident }->$method( $obj );
|
||||||
|
|
||||||
@@ -115,17 +115,17 @@ sub start_element {
|
|||||||
push @{ $order_of{ $ident } }, $current_of{ $ident };
|
push @{ $order_of{ $ident } }, $current_of{ $ident };
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$tree_of{ $ident } = $obj;
|
$tree_of{ $ident } = $obj;
|
||||||
}
|
}
|
||||||
# set new element (step down)
|
# set new element (step down)
|
||||||
$current_of{ $ident } = $obj;
|
$current_of{ $ident } = $obj;
|
||||||
}
|
}
|
||||||
elsif ($action->{ type } eq 'PARENT') {
|
elsif ($action->{ type } eq 'PARENT') {
|
||||||
$current_of{ $ident }->init( values %{ $element->{ Attributes } } );
|
$current_of{ $ident }->init( values %{ $element->{ Attributes } } );
|
||||||
}
|
}
|
||||||
elsif ($action->{ type } eq 'METHOD') {
|
elsif ($action->{ type } eq 'METHOD') {
|
||||||
my $method = $action->{ method } || $element->{ LocalName };
|
my $method = $action->{ method } || $element->{ LocalName };
|
||||||
|
|
||||||
no strict qw(refs);
|
no strict qw(refs);
|
||||||
# call method with
|
# call method with
|
||||||
# - default value ($action->{ value } if defined,
|
# - default value ($action->{ value } if defined,
|
||||||
@@ -138,10 +138,10 @@ sub start_element {
|
|||||||
: values %{ $element->{ Attributes } } );
|
: values %{ $element->{ Attributes } } );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub characters {
|
sub characters {
|
||||||
$characters_of{ ident $_[0] } .= $_[1]->{ Data };
|
$characters_of{ ident $_[0] } .= $_[1]->{ Data };
|
||||||
}
|
}
|
||||||
|
|
||||||
sub end_element {
|
sub end_element {
|
||||||
my ($self, $element) = @_;
|
my ($self, $element) = @_;
|
||||||
@@ -152,24 +152,24 @@ sub end_element {
|
|||||||
$element->{ LocalName }
|
$element->{ LocalName }
|
||||||
) || {};
|
) || {};
|
||||||
|
|
||||||
return if not ($action->{ type });
|
return if not ($action->{ type });
|
||||||
if ( $action->{ type } eq 'CLASS' ) {
|
if ( $action->{ type } eq 'CLASS' ) {
|
||||||
$current_of{ $ident } = pop @{ $order_of{ $ident } };
|
$current_of{ $ident } = pop @{ $order_of{ $ident } };
|
||||||
}
|
}
|
||||||
elsif ($action->{ type } eq 'CONTENT' ) {
|
elsif ($action->{ type } eq 'CONTENT' ) {
|
||||||
my $method = $action->{ method };
|
my $method = $action->{ method };
|
||||||
no strict qw(refs);
|
no strict qw(refs);
|
||||||
# strip of leading and trailing whitespace
|
# strip of leading and trailing whitespace
|
||||||
$characters_of{ $ident } =~s{ ^ \s+ (.+) \s+ $ }{$1}xms;
|
$characters_of{ $ident } =~s{ ^ \s+ (.+) \s+ $ }{$1}xms;
|
||||||
# replace multi whitespace by one
|
# replace multi whitespace by one
|
||||||
$characters_of{ $ident } =~s{ \s+ }{ }xmsg;
|
$characters_of{ $ident } =~s{ \s+ }{ }xmsg;
|
||||||
$current_of{ $ident }->$method( $characters_of{ $ident } );
|
$current_of{ $ident }->$method( $characters_of{ $ident } );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub fatal_error {
|
sub fatal_error {
|
||||||
die @_;
|
die @_;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub get_data {
|
sub get_data {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|||||||
@@ -1,13 +1,18 @@
|
|||||||
#!/usr/bin/perl -w
|
#!/usr/bin/perl -w
|
||||||
package SOAP::WSDL::Envelope;
|
package SOAP::WSDL::Serializer::SOAP11;
|
||||||
use strict;
|
use strict;
|
||||||
use base qw/SOAP::WSDL::Base/;
|
use warnings;
|
||||||
|
use Class::Std::Storable;
|
||||||
|
|
||||||
|
our $VERSION='2.00_13';
|
||||||
|
|
||||||
my $SOAP_NS = 'http://schemas.xmlsoap.org/soap/envelope/';
|
my $SOAP_NS = 'http://schemas.xmlsoap.org/soap/envelope/';
|
||||||
my $XML_INSTANCE_NS = 'http://www.w3.org/2001/XMLSchema-instance';
|
my $XML_INSTANCE_NS = 'http://www.w3.org/2001/XMLSchema-instance';
|
||||||
|
|
||||||
sub serialize {
|
sub serialize {
|
||||||
my ($self, $name, $data, $opt) = @_;
|
my ($self, $args_of_ref) = @_;
|
||||||
|
|
||||||
|
my $opt = $args_of_ref->{ options };
|
||||||
|
|
||||||
if (not $opt->{ namespace }->{ $SOAP_NS })
|
if (not $opt->{ namespace }->{ $SOAP_NS })
|
||||||
{
|
{
|
||||||
@@ -32,8 +37,9 @@ sub serialize {
|
|||||||
|
|
||||||
# TODO insert encoding
|
# TODO insert encoding
|
||||||
$xml.='>';
|
$xml.='>';
|
||||||
$xml .= $self->serialize_header($name, $data, $opt);
|
$xml .= $self->serialize_header($args_of_ref->{ method }, $args_of_ref->{ header }, $opt);
|
||||||
$xml .= $self->serialize_body($name, $data, $opt);
|
$xml .= "\n" if ($opt->{ readable });
|
||||||
|
$xml .= $self->serialize_body($args_of_ref->{ method }, $args_of_ref->{ body }, $opt);
|
||||||
$xml .= "\n" if ($opt->{ readable });
|
$xml .= "\n" if ($opt->{ readable });
|
||||||
$xml .= '</' . $soap_prefix .':Envelope>';
|
$xml .= '</' . $soap_prefix .':Envelope>';
|
||||||
$xml .= "\n" if ($opt->{ readable });
|
$xml .= "\n" if ($opt->{ readable });
|
||||||
@@ -41,26 +47,25 @@ sub serialize {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub serialize_header {
|
sub serialize_header {
|
||||||
my $xml = '';
|
my ($self, $name, $data, $opt) = @_;
|
||||||
return $xml;
|
|
||||||
|
# header is optional. Leave out if there's no header data
|
||||||
|
return q{} if not $data;
|
||||||
|
return join ( ($opt->{ readable }) ? "\n" : q{},
|
||||||
|
"<$opt->{ namespace }->{ $SOAP_NS }\:Header>",
|
||||||
|
"$data",
|
||||||
|
"</$opt->{ namespace }->{ $SOAP_NS }\:Header>",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub serialize_body {
|
sub serialize_body {
|
||||||
my $self = shift;
|
my ($self, $name, $data, $opt) = @_;
|
||||||
my $name = shift;
|
|
||||||
my $data = shift;
|
|
||||||
my $opt = shift;
|
|
||||||
|
|
||||||
my $soap_prefix = $opt->{ namespace }->{ $SOAP_NS };
|
# Body is NOT optional. Serialize to empty body
|
||||||
|
# if we have no data.
|
||||||
my $xml = '';
|
return join ( ($opt->{ readable }) ? "\n" : q{},
|
||||||
$xml .= "\n" if ($opt->{ readable });
|
"<$opt->{ namespace }->{ $SOAP_NS }\:Body>",
|
||||||
$xml .= "<$soap_prefix\:Body>";
|
defined $data ? "$data" : (),
|
||||||
$xml .= "\n" if ($opt->{ readable });
|
"</$opt->{ namespace }->{ $SOAP_NS }\:Body>",
|
||||||
|
);
|
||||||
# include parts
|
|
||||||
$xml .= $data if ( defined($data) );
|
|
||||||
|
|
||||||
$xml .= "</$soap_prefix\:Body>";
|
|
||||||
return $xml;
|
|
||||||
}
|
}
|
||||||
@@ -23,10 +23,10 @@ sub to_typemap {
|
|||||||
return join "\n",
|
return join "\n",
|
||||||
map { $_->to_typemap( $opt ) } @{ $port_of{ ident $self } };
|
map { $_->to_typemap( $opt ) } @{ $port_of{ ident $self } };
|
||||||
}
|
}
|
||||||
|
|
||||||
# TODO implement to_class as class generator for a (complete) interface
|
# TODO implement to_class as class generator for a (complete) interface
|
||||||
sub to_class {
|
sub to_class {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -0,0 +1,101 @@
|
|||||||
|
package SOAP::WSDL::Transport::HTTP;
|
||||||
|
use strict;
|
||||||
|
use base qw(LWP::UserAgent);
|
||||||
|
|
||||||
|
# create methods normally inherited from SOAP::Client
|
||||||
|
SUBFACTORY: {
|
||||||
|
no strict qw(refs);
|
||||||
|
foreach my $method ( qw(code message status is_success) ) {
|
||||||
|
*{ $method } = sub {
|
||||||
|
my $self = shift;
|
||||||
|
return $self->{ $method } if not @_;
|
||||||
|
return $self->{ $method } = shift;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub send_receive {
|
||||||
|
my ($self, %parameters) = @_;
|
||||||
|
my ($envelope, $soap_action, $endpoint, $encoding, $content_type) =
|
||||||
|
@parameters{qw(envelope action endpoint encoding content_type)};
|
||||||
|
|
||||||
|
$encoding = defined($encoding)
|
||||||
|
? 'utf8'
|
||||||
|
: lc($encoding);
|
||||||
|
|
||||||
|
# TODO check whether we need this with current LWP::UserAgent - we're
|
||||||
|
# not here to fix LWP::UserAgent bugs...
|
||||||
|
#
|
||||||
|
# what's this all about?
|
||||||
|
# unfortunately combination of LWP and Perl 5.6.1 and later has bug
|
||||||
|
# in sending multibyte characters. LWP uses length() to calculate
|
||||||
|
# content-length header and starting 5.6.1 length() calculates chars
|
||||||
|
# instead of bytes. 'use bytes' in THIS file doesn't work, because
|
||||||
|
# it's lexically scoped. Unfortunately, content-length we calculate
|
||||||
|
# here doesn't work either, because LWP overwrites it with
|
||||||
|
# content-length it calculates (which is wrong) AND uses length()
|
||||||
|
# during syswrite/sysread, so we are in a bad shape anyway.
|
||||||
|
#
|
||||||
|
# what to do? we calculate proper content-length (using
|
||||||
|
# bytelength() function from SOAP::Utils) and then drop utf8 mark
|
||||||
|
# from string (doing pack with 'C0A*' modifier) if length and
|
||||||
|
# bytelength are not the same
|
||||||
|
|
||||||
|
# use bytes is lexically scoped
|
||||||
|
my $bytelength = do { use bytes; length $envelope };
|
||||||
|
$envelope = pack('C0A*', $envelope)
|
||||||
|
if length($envelope) != $bytelength;
|
||||||
|
|
||||||
|
# END TODO
|
||||||
|
|
||||||
|
my $request = HTTP::Request->new( 'POST',
|
||||||
|
$endpoint,
|
||||||
|
[ 'Content-Type', "$content_type; charset=$encoding",
|
||||||
|
'Content-Length', $bytelength,
|
||||||
|
'SOAPAction', $soap_action,
|
||||||
|
],
|
||||||
|
$envelope );
|
||||||
|
|
||||||
|
my $response = $self->request( $request );
|
||||||
|
|
||||||
|
$self->code( $response->code);
|
||||||
|
$self->message( $response->message);
|
||||||
|
$self->is_success($response->is_success);
|
||||||
|
$self->status($response->status_line);
|
||||||
|
|
||||||
|
return $response->content();
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SOAP::WSDL::Transport::HTTP - Fallback http(s) transport class
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Provides a thin transport class used by SOAP::WSDL::Transport when
|
||||||
|
SOAP::Lite is not available.
|
||||||
|
|
||||||
|
=head1 LICENSE
|
||||||
|
|
||||||
|
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: 218 $
|
||||||
|
$LastChangedBy: kutterma $
|
||||||
|
$Id: HTTP.pm 218 2007-09-10 16:19:23Z kutterma $
|
||||||
|
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Transport/HTTP.pm $
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
+125
-125
@@ -3,114 +3,114 @@ package SOAP::WSDL::TypeLookup;
|
|||||||
my %TYPES = (
|
my %TYPES = (
|
||||||
# wsdl:
|
# wsdl:
|
||||||
'http://schemas.xmlsoap.org/wsdl/' => {
|
'http://schemas.xmlsoap.org/wsdl/' => {
|
||||||
binding => {
|
binding => {
|
||||||
type => 'CLASS',
|
type => 'CLASS',
|
||||||
class => 'SOAP::WSDL::Binding',
|
class => 'SOAP::WSDL::Binding',
|
||||||
},
|
},
|
||||||
definitions => {
|
definitions => {
|
||||||
type => 'CLASS',
|
type => 'CLASS',
|
||||||
class => 'SOAP::WSDL::Definitions',
|
class => 'SOAP::WSDL::Definitions',
|
||||||
},
|
},
|
||||||
portType => {
|
portType => {
|
||||||
type => 'CLASS',
|
type => 'CLASS',
|
||||||
class => 'SOAP::WSDL::PortType',
|
class => 'SOAP::WSDL::PortType',
|
||||||
},
|
},
|
||||||
message => {
|
message => {
|
||||||
type => 'CLASS',
|
type => 'CLASS',
|
||||||
class => 'SOAP::WSDL::Message',
|
class => 'SOAP::WSDL::Message',
|
||||||
},
|
},
|
||||||
part => {
|
part => {
|
||||||
type => 'CLASS',
|
type => 'CLASS',
|
||||||
class => 'SOAP::WSDL::Part',
|
class => 'SOAP::WSDL::Part',
|
||||||
},
|
},
|
||||||
service => {
|
service => {
|
||||||
type => 'CLASS',
|
type => 'CLASS',
|
||||||
class => 'SOAP::WSDL::Service',
|
class => 'SOAP::WSDL::Service',
|
||||||
},
|
},
|
||||||
port => {
|
port => {
|
||||||
type => 'CLASS',
|
type => 'CLASS',
|
||||||
class => 'SOAP::WSDL::Port',
|
class => 'SOAP::WSDL::Port',
|
||||||
},
|
},
|
||||||
operation => {
|
operation => {
|
||||||
type => 'CLASS',
|
type => 'CLASS',
|
||||||
class => 'SOAP::WSDL::Operation',
|
class => 'SOAP::WSDL::Operation',
|
||||||
},
|
},
|
||||||
input => {
|
input => {
|
||||||
type => 'CLASS',
|
type => 'CLASS',
|
||||||
class => 'SOAP::WSDL::OpMessage',
|
class => 'SOAP::WSDL::OpMessage',
|
||||||
},
|
},
|
||||||
output => {
|
output => {
|
||||||
type => 'CLASS',
|
type => 'CLASS',
|
||||||
class => 'SOAP::WSDL::OpMessage',
|
class => 'SOAP::WSDL::OpMessage',
|
||||||
},
|
},
|
||||||
fault => {
|
fault => {
|
||||||
type => 'CLASS',
|
type => 'CLASS',
|
||||||
class => 'SOAP::WSDL::OpMessage',
|
class => 'SOAP::WSDL::OpMessage',
|
||||||
},
|
},
|
||||||
types => {
|
types => {
|
||||||
type => 'CLASS',
|
type => 'CLASS',
|
||||||
class => 'SOAP::WSDL::Types',
|
class => 'SOAP::WSDL::Types',
|
||||||
},
|
},
|
||||||
documentation => {
|
documentation => {
|
||||||
type => 'CONTENT',
|
type => 'CONTENT',
|
||||||
method => 'set_documentation',
|
method => 'set_documentation',
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
# soap:
|
# soap:
|
||||||
'http://schemas.xmlsoap.org/wsdl/soap/' => {
|
'http://schemas.xmlsoap.org/wsdl/soap/' => {
|
||||||
operation => {
|
operation => {
|
||||||
type => 'CLASS',
|
type => 'CLASS',
|
||||||
class => 'SOAP::WSDL::SoapOperation',
|
class => 'SOAP::WSDL::SoapOperation',
|
||||||
},
|
},
|
||||||
binding => {
|
binding => {
|
||||||
type => 'PARENT',
|
type => 'PARENT',
|
||||||
},
|
},
|
||||||
body => {
|
body => {
|
||||||
type => 'PARENT',
|
type => 'PARENT',
|
||||||
},
|
},
|
||||||
address => {
|
address => {
|
||||||
type => 'PARENT',
|
type => 'PARENT',
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'http://www.w3.org/2001/XMLSchema' => {
|
'http://www.w3.org/2001/XMLSchema' => {
|
||||||
schema => {
|
schema => {
|
||||||
type => 'CLASS',
|
type => 'CLASS',
|
||||||
class => 'SOAP::WSDL::XSD::Schema',
|
class => 'SOAP::WSDL::XSD::Schema',
|
||||||
},
|
},
|
||||||
attribute => {
|
attribute => {
|
||||||
type => 'SKIP' # not implemented yet
|
type => 'SKIP' # not implemented yet
|
||||||
},
|
},
|
||||||
attributeGroup => {
|
attributeGroup => {
|
||||||
type => 'SKIP', # not implemented yet
|
type => 'SKIP', # not implemented yet
|
||||||
},
|
},
|
||||||
key => {
|
key => {
|
||||||
type => 'SKIP', # not implemented yet
|
type => 'SKIP', # not implemented yet
|
||||||
},
|
},
|
||||||
keyref => {
|
keyref => {
|
||||||
type => 'SKIP', # not implemented yet
|
type => 'SKIP', # not implemented yet
|
||||||
},
|
},
|
||||||
unique => {
|
unique => {
|
||||||
type => 'SKIP', # not implemented yet
|
type => 'SKIP', # not implemented yet
|
||||||
},
|
},
|
||||||
notation => {
|
notation => {
|
||||||
type => 'SKIP', # not implemented yet
|
type => 'SKIP', # not implemented yet
|
||||||
},
|
},
|
||||||
annotation => {
|
annotation => {
|
||||||
type => 'SKIP', # not implemented yet
|
type => 'SKIP', # not implemented yet
|
||||||
},
|
},
|
||||||
appinfo => {
|
appinfo => {
|
||||||
type => 'SKIP', # not implemented yet
|
type => 'SKIP', # not implemented yet
|
||||||
},
|
},
|
||||||
description => {
|
description => {
|
||||||
type => 'SKIP', # not implemented yet
|
type => 'SKIP', # not implemented yet
|
||||||
},
|
},
|
||||||
element => {
|
element => {
|
||||||
type => 'CLASS',
|
type => 'CLASS',
|
||||||
class => 'SOAP::WSDL::XSD::Element',
|
class => 'SOAP::WSDL::XSD::Element',
|
||||||
},
|
},
|
||||||
simpleType => {
|
simpleType => {
|
||||||
type => 'CLASS',
|
type => 'CLASS',
|
||||||
class => 'SOAP::WSDL::XSD::SimpleType',
|
class => 'SOAP::WSDL::XSD::SimpleType',
|
||||||
},
|
},
|
||||||
complexType => {
|
complexType => {
|
||||||
type => 'CLASS',
|
type => 'CLASS',
|
||||||
@@ -120,27 +120,27 @@ my %TYPES = (
|
|||||||
type => 'METHOD',
|
type => 'METHOD',
|
||||||
method => 'set_contentModel',
|
method => 'set_contentModel',
|
||||||
value => 'simpleContent'
|
value => 'simpleContent'
|
||||||
},
|
},
|
||||||
complexContent => {
|
complexContent => {
|
||||||
type => 'METHOD',
|
type => 'METHOD',
|
||||||
method => 'set_contentModel',
|
method => 'set_contentModel',
|
||||||
value => 'complexContent'
|
value => 'complexContent'
|
||||||
},
|
},
|
||||||
restriction => {
|
restriction => {
|
||||||
type => 'METHOD',
|
type => 'METHOD',
|
||||||
method => 'set_restriction',
|
method => 'set_restriction',
|
||||||
},
|
},
|
||||||
list => {
|
list => {
|
||||||
type => 'METHOD',
|
type => 'METHOD',
|
||||||
method => 'set_list',
|
method => 'set_list',
|
||||||
},
|
},
|
||||||
union => {
|
union => {
|
||||||
type => 'METHOD',
|
type => 'METHOD',
|
||||||
method => 'set_union',
|
method => 'set_union',
|
||||||
},
|
},
|
||||||
enumeration => {
|
enumeration => {
|
||||||
type => 'METHOD',
|
type => 'METHOD',
|
||||||
method => 'push_enumeration',
|
method => 'push_enumeration',
|
||||||
},
|
},
|
||||||
group => {
|
group => {
|
||||||
type => 'METHOD',
|
type => 'METHOD',
|
||||||
@@ -148,9 +148,9 @@ my %TYPES = (
|
|||||||
value => 'all',
|
value => 'all',
|
||||||
},
|
},
|
||||||
all => {
|
all => {
|
||||||
type => 'METHOD',
|
type => 'METHOD',
|
||||||
method => 'set_flavor',
|
method => 'set_flavor',
|
||||||
value => 'all',
|
value => 'all',
|
||||||
},
|
},
|
||||||
choice => {
|
choice => {
|
||||||
type => 'METHOD',
|
type => 'METHOD',
|
||||||
@@ -161,7 +161,7 @@ my %TYPES = (
|
|||||||
type => 'METHOD',
|
type => 'METHOD',
|
||||||
method => 'set_flavor',
|
method => 'set_flavor',
|
||||||
value => 'sequence',
|
value => 'sequence',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ use Data::Dumper;
|
|||||||
sub serialize {
|
sub serialize {
|
||||||
my ($self, $name, $value, $opt) = @_;
|
my ($self, $name, $value, $opt) = @_;
|
||||||
my $xml;
|
my $xml;
|
||||||
$opt->{ indent } ||= "";
|
$opt->{ indent } ||= "";
|
||||||
$opt->{ attributes } ||= [];
|
$opt->{ attributes } ||= [];
|
||||||
|
|
||||||
$xml .= $opt->{ indent } if ($opt->{ readable });
|
$xml .= $opt->{ indent } if ($opt->{ readable });
|
||||||
$xml .= '<' . join ' ', $name, @{ $opt->{ attributes } };
|
$xml .= '<' . join ' ', $name, @{ $opt->{ attributes } };
|
||||||
@@ -22,7 +22,7 @@ sub serialize {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (defined $value) {
|
if (defined $value) {
|
||||||
$xml .= '>';
|
$xml .= '>';
|
||||||
$xml .= "$value";
|
$xml .= "$value";
|
||||||
$xml .= '</' . $name . '>' ;
|
$xml .= '</' . $name . '>' ;
|
||||||
}
|
}
|
||||||
@@ -41,6 +41,6 @@ sub explain {
|
|||||||
|
|
||||||
sub toClass {
|
sub toClass {
|
||||||
warn "# builtin";
|
warn "# builtin";
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ use Carp;
|
|||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use Scalar::Util qw(blessed);
|
use Scalar::Util qw(blessed);
|
||||||
use base qw/SOAP::WSDL::Base/;
|
use base qw/SOAP::WSDL::Base/;
|
||||||
use Data::Dumper;
|
use Data::Dumper;
|
||||||
|
|
||||||
my %annotation_of :ATTR(:name<annotation> :default<()>);
|
my %annotation_of :ATTR(:name<annotation> :default<()>);
|
||||||
my %element_of :ATTR(:name<element> :default<()>);
|
my %element_of :ATTR(:name<element> :default<()>);
|
||||||
@@ -14,6 +14,8 @@ my %base_of :ATTR(:name<base> :default<()>);
|
|||||||
my %itemType_of :ATTR(:name<itemType> :default<()>);
|
my %itemType_of :ATTR(:name<itemType> :default<()>);
|
||||||
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
||||||
my %abstract_of :ATTR(:name<abstract> :default<()>);
|
my %abstract_of :ATTR(:name<abstract> :default<()>);
|
||||||
|
my %mixed_of :ATTR(:name<mixed> :default<()>); # default is false
|
||||||
|
|
||||||
# is set to simpleContent/complexContent
|
# is set to simpleContent/complexContent
|
||||||
my %content_Model_of :ATTR(:name<contentModel> :default<()>);
|
my %content_Model_of :ATTR(:name<contentModel> :default<()>);
|
||||||
|
|
||||||
@@ -60,26 +62,26 @@ sub init {
|
|||||||
sub serialize {
|
sub serialize {
|
||||||
my ($self, $name, $value, $opt) = @_;
|
my ($self, $name, $value, $opt) = @_;
|
||||||
|
|
||||||
$opt->{ indent } ||= q{};
|
$opt->{ indent } ||= q{};
|
||||||
$opt->{ attributes } ||= [];
|
$opt->{ attributes } ||= [];
|
||||||
my $flavor = $self->get_flavor();
|
my $flavor = $self->get_flavor();
|
||||||
my $xml = ($opt->{ readable }) ? $opt->{ indent } : q{}; # add indentation
|
my $xml = ($opt->{ readable }) ? $opt->{ indent } : q{}; # add indentation
|
||||||
|
|
||||||
|
|
||||||
if ( $opt->{ qualify } ) {
|
if ( $opt->{ qualify } ) {
|
||||||
$opt->{ attributes } = [ ' xmlns="' . $self->get_targetNamespace .'"' ];
|
$opt->{ attributes } = [ ' xmlns="' . $self->get_targetNamespace .'"' ];
|
||||||
delete $opt->{ qualify };
|
delete $opt->{ qualify };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$xml .= join q{ } , "<$name" , @{ $opt->{ attributes } };
|
$xml .= join q{ } , "<$name" , @{ $opt->{ attributes } };
|
||||||
delete $opt->{ attributes }; # don't propagate...
|
delete $opt->{ attributes }; # don't propagate...
|
||||||
|
|
||||||
if ( $opt->{ autotype }) {
|
if ( $opt->{ autotype }) {
|
||||||
my $ns = $self->get_targetNamespace();
|
my $ns = $self->get_targetNamespace();
|
||||||
my $prefix = $opt->{ namespace }->{ $ns }
|
my $prefix = $opt->{ namespace }->{ $ns }
|
||||||
|| die 'No prefix found for namespace '. $ns;
|
|| die 'No prefix found for namespace '. $ns;
|
||||||
$xml .= join q{}, " type=\"$prefix:", $self->get_name(), '" '
|
$xml .= join q{}, " type=\"$prefix:", $self->get_name(), '" '
|
||||||
if ($self->get_name() );
|
if ($self->get_name() );
|
||||||
}
|
}
|
||||||
$xml .= '>';
|
$xml .= '>';
|
||||||
@@ -87,10 +89,10 @@ sub serialize {
|
|||||||
if ( ($flavor eq "sequence") or ($flavor eq "all") )
|
if ( ($flavor eq "sequence") or ($flavor eq "all") )
|
||||||
{
|
{
|
||||||
$opt->{ indent } .= "\t";
|
$opt->{ indent } .= "\t";
|
||||||
for my $element (@{ $self->get_element() }) {
|
for my $element (@{ $self->get_element() }) {
|
||||||
# might be list - listify
|
# might be list - listify
|
||||||
$value = [ $value ] if not ref $value eq 'ARRAY';
|
$value = [ $value ] if not ref $value eq 'ARRAY';
|
||||||
|
|
||||||
for my $single_value (@{ $value }) {
|
for my $single_value (@{ $value }) {
|
||||||
my $element_value;
|
my $element_value;
|
||||||
if (blessed $single_value) {
|
if (blessed $single_value) {
|
||||||
@@ -98,7 +100,7 @@ sub serialize {
|
|||||||
$element_value = $single_value->$method();
|
$element_value = $single_value->$method();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$element_value = $single_value->{ $element->get_name() };
|
$element_value = $single_value->{ $element->get_name() };
|
||||||
}
|
}
|
||||||
$element_value = [ $element_value ]
|
$element_value = [ $element_value ]
|
||||||
if not ref $element_value eq 'ARRAY';
|
if not ref $element_value eq 'ARRAY';
|
||||||
@@ -110,7 +112,7 @@ sub serialize {
|
|||||||
}
|
}
|
||||||
$opt->{ indent } =~s/\t$//;
|
$opt->{ indent } =~s/\t$//;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
die "sorry, we just handle all and sequence types yet...";
|
die "sorry, we just handle all and sequence types yet...";
|
||||||
}
|
}
|
||||||
$xml .= $opt->{ indent } if ( $opt->{ readable } ); # add indentation
|
$xml .= $opt->{ indent } if ( $opt->{ readable } ); # add indentation
|
||||||
@@ -127,15 +129,15 @@ sub explain {
|
|||||||
|
|
||||||
return q{} if not $flavor; # empty complexType
|
return q{} if not $flavor; # empty complexType
|
||||||
$opt->{ indent } ||= q{ };
|
$opt->{ indent } ||= q{ };
|
||||||
my $xml = q{};
|
my $xml = q{};
|
||||||
$xml .= "$opt->{indent}\'$name'=> {\n" if $name;
|
$xml .= "$opt->{indent}\'$name'=> {\n" if $name;
|
||||||
|
|
||||||
if ( ($flavor eq "sequence") or ($flavor eq "all") ) {
|
if ( ($flavor eq "sequence") or ($flavor eq "all") ) {
|
||||||
$opt->{ indent } .= " ";
|
$opt->{ indent } .= " ";
|
||||||
for my $element (@{ $self->get_element() }) {
|
for my $element (@{ $self->get_element() }) {
|
||||||
$xml .= $element->explain( $opt )
|
$xml .= $element->explain( $opt )
|
||||||
}
|
}
|
||||||
$opt->{ indent } =~s/\s{2}$//; # step back
|
$opt->{ indent } =~s/\s{2}$//; # step back
|
||||||
}
|
}
|
||||||
elsif ($flavor eq "complexContent")
|
elsif ($flavor eq "complexContent")
|
||||||
{
|
{
|
||||||
@@ -149,11 +151,11 @@ sub explain {
|
|||||||
{
|
{
|
||||||
warn "found unsupported complexType definition $flavor";
|
warn "found unsupported complexType definition $flavor";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
# if we're called inside a element...
|
# if we're called inside a element...
|
||||||
$xml .= "$opt->{indent}},\n" if $name;
|
$xml .= "$opt->{indent}},\n" if $name;
|
||||||
|
|
||||||
return $xml;
|
return $xml;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,7 +183,7 @@ sub to_class {
|
|||||||
my $template = <<'EOT';
|
my $template = <<'EOT';
|
||||||
package [% type_prefix %][% self.get_name %];
|
package [% type_prefix %][% self.get_name %];
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
|
||||||
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
use SOAP::WSDL::XSD::Typelib::ComplexType;
|
||||||
use base qw(
|
use base qw(
|
||||||
SOAP::WSDL::XSD::Typelib::ComplexType
|
SOAP::WSDL::XSD::Typelib::ComplexType
|
||||||
@@ -200,14 +202,14 @@ __PACKAGE__->_factory(
|
|||||||
[% END %]
|
[% END %]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
[%-
|
[%-
|
||||||
FOREACH element=self.get_element;
|
FOREACH element=self.get_element;
|
||||||
IF (element.get_type); # element type="..."
|
IF (element.get_type); # element type="..."
|
||||||
split_name = element.get_type.split(':');
|
split_name = element.get_type.split(':');
|
||||||
prefix = split_name.0;
|
prefix = split_name.0;
|
||||||
localname = split_name.1;
|
localname = split_name.1;
|
||||||
IF nsmap.$prefix == 'http://www.w3.org/2001/XMLSchema' -%]
|
IF nsmap.$prefix == 'http://www.w3.org/2001/XMLSchema' -%]
|
||||||
[% element.get_name %] => 'SOAP::WSDL::XSD::Typelib::Builtin::[% localname %]',
|
[% element.get_name %] => 'SOAP::WSDL::XSD::Typelib::Builtin::[% localname %]',
|
||||||
[% ELSE -%]
|
[% ELSE -%]
|
||||||
[% element.get_name %] => '[% type_prefix %][% localname %]',
|
[% element.get_name %] => '[% type_prefix %][% localname %]',
|
||||||
[%- END;
|
[%- END;
|
||||||
@@ -215,23 +217,23 @@ __PACKAGE__->_factory(
|
|||||||
split_name = element.get_ref.split(':');
|
split_name = element.get_ref.split(':');
|
||||||
prefix = split_name.0;
|
prefix = split_name.0;
|
||||||
localname = split_name.1; %]
|
localname = split_name.1; %]
|
||||||
[% element.get_name %] => '[% type_prefix %][% localname %]',
|
[% element.get_name %] => '[% type_prefix %][% localname %]',
|
||||||
[% ELSIF (simpleType = element.first_simpleType);
|
[% ELSIF (simpleType = element.first_simpleType);
|
||||||
base = simpleType.get_base();
|
base = simpleType.get_base();
|
||||||
%]
|
%]
|
||||||
# basic simple type handling: we treat atomic simple types
|
# basic simple type handling: we treat atomic simple types
|
||||||
# in complexType elements as their base types
|
# in complexType elements as their base types
|
||||||
# - and we only treat <restriction base="..."> yet.
|
# - and we only treat <restriction base="..."> yet.
|
||||||
# our base here is [% base %]
|
# our base here is [% base %]
|
||||||
[%
|
[%
|
||||||
split_name = base.split(':');
|
split_name = base.split(':');
|
||||||
prefix = split_name.0;
|
prefix = split_name.0;
|
||||||
localname = split_name.1;
|
localname = split_name.1;
|
||||||
IF nsmap.$prefix == 'http://www.w3.org/2001/XMLSchema' -%]
|
IF nsmap.$prefix == 'http://www.w3.org/2001/XMLSchema' -%]
|
||||||
[% element.get_name %] => 'SOAP::WSDL::XSD::Typelib::Builtin::[% localname %]',
|
[% element.get_name %] => 'SOAP::WSDL::XSD::Typelib::Builtin::[% localname %]',
|
||||||
[% ELSE -%]
|
[% ELSE -%]
|
||||||
[% element.get_name %] => '[% type_prefix %][% localname %]',
|
[% element.get_name %] => '[% type_prefix %][% localname %]',
|
||||||
[%- END;
|
[%- END;
|
||||||
END;
|
END;
|
||||||
END %]
|
END %]
|
||||||
}
|
}
|
||||||
@@ -243,17 +245,24 @@ sub get_xmlns { '[% self.get_targetNamespace %]' }
|
|||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=pod
|
[% MACRO pod BLOCK %]=pod[% END %]
|
||||||
|
[% MACRO cut BLOCK %]=cut[% END %]
|
||||||
|
[% MACRO head1 BLOCK %]=head1[% END %]
|
||||||
|
[% MACRO head2 BLOCK %]=head2[% END %]
|
||||||
|
|
||||||
=head1 NAME [% type_prefix %][% self.get_name %]
|
[% pod %]
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
[% head1 %] NAME
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
[% type_prefix %][% self.get_name %]
|
||||||
|
|
||||||
|
[% head1 %] SYNOPSIS
|
||||||
|
|
||||||
|
[% head1 %] DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML type [% self.get_name %].
|
Type class for the XML type [% self.get_name %].
|
||||||
|
|
||||||
=head1 PROPERTIES
|
[% head1 %] PROPERTIES
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
methods:
|
methods:
|
||||||
@@ -262,7 +271,7 @@ methods:
|
|||||||
[% element.get_name -%]
|
[% element.get_name -%]
|
||||||
[% END %]
|
[% END %]
|
||||||
|
|
||||||
=head1 Object structure
|
[% head1 %] Object structure
|
||||||
|
|
||||||
[% FOREACH element=self.get_element;
|
[% FOREACH element=self.get_element;
|
||||||
IF (element.get_type);
|
IF (element.get_type);
|
||||||
@@ -302,7 +311,7 @@ Structure as perl hash:
|
|||||||
|
|
||||||
[% structure %]
|
[% structure %]
|
||||||
|
|
||||||
=cut
|
[% cut %]
|
||||||
|
|
||||||
EOT
|
EOT
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use base qw(SOAP::WSDL::Base);
|
use base qw(SOAP::WSDL::Base);
|
||||||
use Data::Dumper;
|
use Data::Dumper;
|
||||||
|
|
||||||
my %simpleType_of :ATTR(:name<simpleType> :default<()>);
|
my %simpleType_of :ATTR(:name<simpleType> :default<()>);
|
||||||
my %complexType_of :ATTR(:name<complexType> :default<()>);
|
my %complexType_of :ATTR(:name<complexType> :default<()>);
|
||||||
@@ -59,11 +59,11 @@ sub serialize {
|
|||||||
# substitutionGroup ?
|
# substitutionGroup ?
|
||||||
|
|
||||||
$name ||= $self->get_name();
|
$name ||= $self->get_name();
|
||||||
|
|
||||||
if ( $opt->{ qualify } ) {
|
if ( $opt->{ qualify } ) {
|
||||||
$opt->{ attributes } = [ ' xmlns="' . $self->get_targetNamespace .'"' ];
|
$opt->{ attributes } = [ ' xmlns="' . $self->get_targetNamespace .'"' ];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
# set default and fixed - fixed overrides everything,
|
# set default and fixed - fixed overrides everything,
|
||||||
# default only empty (undefined) values
|
# default only empty (undefined) values
|
||||||
@@ -104,7 +104,7 @@ sub serialize {
|
|||||||
|
|
||||||
# safety check
|
# safety check
|
||||||
die "no type for $prefix:$localname $ns_map{$prefix}" if (not $type);
|
die "no type for $prefix:$localname $ns_map{$prefix}" if (not $type);
|
||||||
|
|
||||||
return $type->serialize( $name, $value, $opt );
|
return $type->serialize( $name, $value, $opt );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,26 +116,26 @@ sub explain {
|
|||||||
# if we have a simple / complexType, explain right here
|
# if we have a simple / complexType, explain right here
|
||||||
if ($type = $self->first_simpleType() )
|
if ($type = $self->first_simpleType() )
|
||||||
{
|
{
|
||||||
if ($opt->{ anonymous }) {
|
if ($opt->{ anonymous }) {
|
||||||
delete $opt->{ anonymous };
|
delete $opt->{ anonymous };
|
||||||
return $type->explain( $opt, undef );
|
return $type->explain( $opt, undef );
|
||||||
}
|
}
|
||||||
return $type->explain( $opt, $self->get_name() );
|
return $type->explain( $opt, $self->get_name() );
|
||||||
}
|
}
|
||||||
elsif ($type = $self->first_complexType() )
|
elsif ($type = $self->first_complexType() )
|
||||||
{
|
{
|
||||||
if ($opt->{ anonymous }) {
|
if ($opt->{ anonymous }) {
|
||||||
delete $opt->{ anonymous };
|
delete $opt->{ anonymous };
|
||||||
return $type->explain( $opt, undef );
|
return $type->explain( $opt, undef );
|
||||||
}
|
}
|
||||||
return $type->explain( $opt, $self->get_name() );
|
return $type->explain( $opt, $self->get_name() );
|
||||||
}
|
}
|
||||||
elsif (my $element_name = $self->get_ref() ) {
|
elsif (my $element_name = $self->get_ref() ) {
|
||||||
my $element = $opt->{ wsdl }->first_types()->find_element(
|
my $element = $opt->{ wsdl }->first_types()->find_element(
|
||||||
$opt->{ wsdl }->_expand( $element_name )
|
$opt->{ wsdl }->_expand( $element_name )
|
||||||
);
|
);
|
||||||
return $element->explain( $opt, $self->get_name() );
|
return $element->explain( $opt, $self->get_name() );
|
||||||
}
|
}
|
||||||
|
|
||||||
# return if it's not a derived type - we don't handle
|
# return if it's not a derived type - we don't handle
|
||||||
# other stuff yet.
|
# other stuff yet.
|
||||||
@@ -153,10 +153,10 @@ sub explain {
|
|||||||
die "no type for $prefix:$localname ($ns_map{ $prefix })"
|
die "no type for $prefix:$localname ($ns_map{ $prefix })"
|
||||||
. Dumper $opt->{ wsdl }->first_types()->first_schema()->_DUMP
|
. Dumper $opt->{ wsdl }->first_types()->first_schema()->_DUMP
|
||||||
if (not $type);
|
if (not $type);
|
||||||
|
|
||||||
if ($opt->{ anonymous }) {
|
if ($opt->{ anonymous }) {
|
||||||
delete $opt->{ anonymous };
|
delete $opt->{ anonymous };
|
||||||
return $text .= $type->explain( $opt, undef );
|
return $text .= $type->explain( $opt, undef );
|
||||||
}
|
}
|
||||||
return $text .= $type->explain( $opt, $name || $self->get_name() );
|
return $text .= $type->explain( $opt, $name || $self->get_name() );
|
||||||
return 'ERROR: '. $@;
|
return 'ERROR: '. $@;
|
||||||
@@ -236,7 +236,7 @@ sub to_typemap {
|
|||||||
return $txt;
|
return $txt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
sub to_class {
|
sub to_class {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $opt = shift;
|
my $opt = shift;
|
||||||
@@ -244,7 +244,7 @@ sub to_class {
|
|||||||
my $template = <<'EOT';
|
my $template = <<'EOT';
|
||||||
package [% element_prefix %][% self.get_name %];
|
package [% element_prefix %][% self.get_name %];
|
||||||
use strict;
|
use strict;
|
||||||
use Class::Std::Storable;
|
|
||||||
use SOAP::WSDL::XSD::Typelib::Element;
|
use SOAP::WSDL::XSD::Typelib::Element;
|
||||||
|
|
||||||
[% IF (type = self.first_simpleType) %]
|
[% IF (type = self.first_simpleType) %]
|
||||||
@@ -303,9 +303,9 @@ __PACKAGE__->_factory(
|
|||||||
);
|
);
|
||||||
[%# END complexType %]
|
[%# END complexType %]
|
||||||
[% ELSIF (type = self.get_type) %]
|
[% ELSIF (type = self.get_type) %]
|
||||||
#
|
#
|
||||||
# <element name="[% self.get_name %]" type="[% self.get_type %]"/> definition
|
# <element name="[% self.get_name %]" type="[% self.get_type %]"/> definition
|
||||||
#
|
#
|
||||||
[% split_name = self.get_type.split(':');
|
[% split_name = self.get_type.split(':');
|
||||||
prefix = split_name.0;
|
prefix = split_name.0;
|
||||||
localname = split_name.1;
|
localname = split_name.1;
|
||||||
@@ -337,17 +337,24 @@ __PACKAGE__->__set_ref('[% self.get_ref %]');
|
|||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=pod
|
[% MACRO pod BLOCK %]=pod[% END %]
|
||||||
|
[% MACRO cut BLOCK %]=cut[% END %]
|
||||||
|
[% MACRO head1 BLOCK %]=head1[% END %]
|
||||||
|
[% MACRO head2 BLOCK %]=head2[% END %]
|
||||||
|
|
||||||
=head1 NAME [% element_prefix %][% self.get_name %]
|
[% pod %]
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
[% head1 %] NAME
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
[% element_prefix %][% self.get_name %]
|
||||||
|
|
||||||
|
[% head1 %] SYNOPSIS
|
||||||
|
|
||||||
|
[% head1 %] DESCRIPTION
|
||||||
|
|
||||||
Type class for the XML element [% self.get_name %].
|
Type class for the XML element [% self.get_name %].
|
||||||
|
|
||||||
=head1 PROPERTIES
|
[% head1 %] PROPERTIES
|
||||||
|
|
||||||
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
The following properties may be accessed using get_PROPERTY / set_PROPERTY
|
||||||
methods:
|
methods:
|
||||||
@@ -358,7 +365,7 @@ methods:
|
|||||||
[% END;
|
[% END;
|
||||||
END %]
|
END %]
|
||||||
|
|
||||||
=head1 Object structure
|
[% head1 %] Object structure
|
||||||
|
|
||||||
[%- IF (type = self.first_complexType);
|
[%- IF (type = self.first_complexType);
|
||||||
FOREACH element = type.get_element;
|
FOREACH element = type.get_element;
|
||||||
@@ -383,10 +390,10 @@ Structure as perl hash:
|
|||||||
|
|
||||||
[% structure %]
|
[% structure %]
|
||||||
|
|
||||||
=cut
|
[% cut %]
|
||||||
|
|
||||||
EOT
|
EOT
|
||||||
|
|
||||||
$self->SUPER::to_class($opt, $template);
|
$self->SUPER::to_class($opt, $template);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ use base qw(SOAP::WSDL::Base);
|
|||||||
# child elements
|
# child elements
|
||||||
my %type_of :ATTR(:name<type> :default<[]>);
|
my %type_of :ATTR(:name<type> :default<[]>);
|
||||||
my %element_of :ATTR(:name<element> :default<[]>);
|
my %element_of :ATTR(:name<element> :default<[]>);
|
||||||
my %group_of :ATTR(:name<group> :default<[]>);
|
my %group_of :ATTR(:name<group> :default<[]>);
|
||||||
|
|
||||||
# attributes
|
# attributes
|
||||||
my %attributeFormDefault_of :ATTR(:name<attributeFormDefault> :default<()>);
|
my %attributeFormDefault_of :ATTR(:name<attributeFormDefault> :default<()>);
|
||||||
|
|||||||
@@ -9,10 +9,10 @@ my %itemType_of :ATTR(:name<itemType> :default<()>);
|
|||||||
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
||||||
# is set to simpleContent/complexContent
|
# is set to simpleContent/complexContent
|
||||||
my %content_Model_of :ATTR(:name<contentModel> :default<()>);
|
my %content_Model_of :ATTR(:name<contentModel> :default<()>);
|
||||||
|
|
||||||
# set to restriction|list|union|enumeration
|
# set to restriction|list|union|enumeration
|
||||||
my %flavor_of :ATTR(:name<flavor> :default<()>);
|
my %flavor_of :ATTR(:name<flavor> :default<()>);
|
||||||
|
|
||||||
sub set_restriction {
|
sub set_restriction {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my @attributes = @_;
|
my @attributes = @_;
|
||||||
@@ -55,23 +55,23 @@ sub push_enumeration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub serialize {
|
sub serialize {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $name = shift;
|
my $name = shift;
|
||||||
my $value = shift;
|
my $value = shift;
|
||||||
my $opt = shift;
|
my $opt = shift;
|
||||||
my $ident = ident $self;
|
my $ident = ident $self;
|
||||||
|
|
||||||
$opt->{ attributes } ||= [];
|
$opt->{ attributes } ||= [];
|
||||||
$opt->{ indent } ||= q{};
|
$opt->{ indent } ||= q{};
|
||||||
|
|
||||||
$self->_check_value( $value );
|
$self->_check_value( $value );
|
||||||
|
|
||||||
return $self->_serialize_single($name, $value , $opt)
|
return $self->_serialize_single($name, $value , $opt)
|
||||||
if ( $flavor_of{ $ident } eq 'restriction'
|
if ( $flavor_of{ $ident } eq 'restriction'
|
||||||
or $flavor_of{ $ident } eq 'union'
|
or $flavor_of{ $ident } eq 'union'
|
||||||
or $flavor_of{ $ident } eq 'enumeration');
|
or $flavor_of{ $ident } eq 'enumeration');
|
||||||
|
|
||||||
if ($flavor_of{ $ident } eq 'list' )
|
if ($flavor_of{ $ident } eq 'list' )
|
||||||
{
|
{
|
||||||
$value ||= [];
|
$value ||= [];
|
||||||
$value = [ $value ] if ( ref( $value) ne 'ARRAY' );
|
$value = [ $value ] if ( ref( $value) ne 'ARRAY' );
|
||||||
@@ -83,16 +83,16 @@ sub _serialize_single {
|
|||||||
my ($self, $name, $value, $opt) = @_;
|
my ($self, $name, $value, $opt) = @_;
|
||||||
my $xml = '';
|
my $xml = '';
|
||||||
$xml .= $opt->{ indent } if ($opt->{ readable }); # add indentation
|
$xml .= $opt->{ indent } if ($opt->{ readable }); # add indentation
|
||||||
$xml .= '<' . join ' ', $name, @{ $opt->{ attributes } };
|
$xml .= '<' . join ' ', $name, @{ $opt->{ attributes } };
|
||||||
if ( $opt->{ autotype }) {
|
if ( $opt->{ autotype }) {
|
||||||
my $ns = $self->get_targetNamespace();
|
my $ns = $self->get_targetNamespace();
|
||||||
my $prefix = $opt->{ namespace }->{ $ns }
|
my $prefix = $opt->{ namespace }->{ $ns }
|
||||||
|| die 'No prefix found for namespace '. $ns;
|
|| die 'No prefix found for namespace '. $ns;
|
||||||
$xml .= ' type="' . $prefix . ':' . $self->get_name() .'"';
|
$xml .= ' type="' . $prefix . ':' . $self->get_name() .'"';
|
||||||
}
|
}
|
||||||
|
|
||||||
# nillabel ?
|
# nillabel ?
|
||||||
return $xml .'/>' if not defined $value;
|
return $xml .'/>' if not defined $value;
|
||||||
|
|
||||||
$xml .= join q{}, '>' , $value , '</' , $name , '>';
|
$xml .= join q{}, '>' , $value , '</' , $name , '>';
|
||||||
$xml .= "\n" if ($opt->{ readable });
|
$xml .= "\n" if ($opt->{ readable });
|
||||||
@@ -108,8 +108,8 @@ sub explain {
|
|||||||
sub _check_value {
|
sub _check_value {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
}
|
}
|
||||||
|
|
||||||
# TODO: implement to_class based on template...
|
# TODO: implement to_class based on template...
|
||||||
|
|
||||||
sub to_class {
|
sub to_class {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|||||||
@@ -2,51 +2,51 @@ package SOAP::WSDL::XSD::Typelib::Builtin;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
|
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::anyType;
|
use SOAP::WSDL::XSD::Typelib::Builtin::anyType;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::anyURI;
|
use SOAP::WSDL::XSD::Typelib::Builtin::anyURI;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::base64Binary;
|
use SOAP::WSDL::XSD::Typelib::Builtin::base64Binary;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::boolean;
|
use SOAP::WSDL::XSD::Typelib::Builtin::boolean;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::byte;
|
use SOAP::WSDL::XSD::Typelib::Builtin::byte;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::date;
|
use SOAP::WSDL::XSD::Typelib::Builtin::date;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::dateTime;
|
use SOAP::WSDL::XSD::Typelib::Builtin::dateTime;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::decimal;
|
use SOAP::WSDL::XSD::Typelib::Builtin::decimal;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::double;
|
use SOAP::WSDL::XSD::Typelib::Builtin::double;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::duration;
|
use SOAP::WSDL::XSD::Typelib::Builtin::duration;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::ENTITY;
|
use SOAP::WSDL::XSD::Typelib::Builtin::ENTITY;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::float;
|
use SOAP::WSDL::XSD::Typelib::Builtin::float;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::gDay;
|
use SOAP::WSDL::XSD::Typelib::Builtin::gDay;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::gMonth;
|
use SOAP::WSDL::XSD::Typelib::Builtin::gMonth;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::gMonthDay;
|
use SOAP::WSDL::XSD::Typelib::Builtin::gMonthDay;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::gYear;
|
use SOAP::WSDL::XSD::Typelib::Builtin::gYear;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::gYearMonth;
|
use SOAP::WSDL::XSD::Typelib::Builtin::gYearMonth;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::hexBinary;
|
use SOAP::WSDL::XSD::Typelib::Builtin::hexBinary;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::ID;
|
use SOAP::WSDL::XSD::Typelib::Builtin::ID;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::IDREF;
|
use SOAP::WSDL::XSD::Typelib::Builtin::IDREF;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::IDREFS;
|
use SOAP::WSDL::XSD::Typelib::Builtin::IDREFS;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::int;
|
use SOAP::WSDL::XSD::Typelib::Builtin::int;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::integer;
|
use SOAP::WSDL::XSD::Typelib::Builtin::integer;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::language;
|
use SOAP::WSDL::XSD::Typelib::Builtin::language;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::list;
|
use SOAP::WSDL::XSD::Typelib::Builtin::list;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::long;
|
use SOAP::WSDL::XSD::Typelib::Builtin::long;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::Name;
|
use SOAP::WSDL::XSD::Typelib::Builtin::Name;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::NCName;
|
use SOAP::WSDL::XSD::Typelib::Builtin::NCName;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::negativeInteger;
|
use SOAP::WSDL::XSD::Typelib::Builtin::negativeInteger;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::nonNegativeInteger;
|
use SOAP::WSDL::XSD::Typelib::Builtin::nonNegativeInteger;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::nonPositiveInteger;
|
use SOAP::WSDL::XSD::Typelib::Builtin::nonPositiveInteger;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::normalizedString;
|
use SOAP::WSDL::XSD::Typelib::Builtin::normalizedString;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::NOTATION;
|
use SOAP::WSDL::XSD::Typelib::Builtin::NOTATION;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::positiveInteger;
|
use SOAP::WSDL::XSD::Typelib::Builtin::positiveInteger;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::QName;
|
use SOAP::WSDL::XSD::Typelib::Builtin::QName;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::short;
|
use SOAP::WSDL::XSD::Typelib::Builtin::short;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::string;
|
use SOAP::WSDL::XSD::Typelib::Builtin::string;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::time;
|
use SOAP::WSDL::XSD::Typelib::Builtin::time;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::token;
|
use SOAP::WSDL::XSD::Typelib::Builtin::token;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::unsignedByte;
|
use SOAP::WSDL::XSD::Typelib::Builtin::unsignedByte;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::unsignedInt;
|
use SOAP::WSDL::XSD::Typelib::Builtin::unsignedInt;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::unsignedLong;
|
use SOAP::WSDL::XSD::Typelib::Builtin::unsignedLong;
|
||||||
use SOAP::WSDL::XSD::Typelib::Builtin::unsignedShort;
|
use SOAP::WSDL::XSD::Typelib::Builtin::unsignedShort;
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
@@ -65,13 +65,13 @@ This module implements all builtin Types from the XML schema specification.
|
|||||||
Objects of a class may be filled with values and serialize correctly.
|
Objects of a class may be filled with values and serialize correctly.
|
||||||
|
|
||||||
These basic type classes are most useful when used as element or simpleType
|
These basic type classes are most useful when used as element or simpleType
|
||||||
base classes.
|
base classes.
|
||||||
|
|
||||||
The datatypes classes themselves are split up into
|
The datatypes classes themselves are split up into
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::* modules.
|
SOAP::WSDL::XSD::Typelib::Builtin::* modules.
|
||||||
|
|
||||||
Using SOAP::WSDL::XSD::Typelib::Builtin uses all of the builtin datatype
|
Using SOAP::WSDL::XSD::Typelib::Builtin uses all of the builtin datatype
|
||||||
classes.
|
classes.
|
||||||
|
|
||||||
=head1 EXAMPLES
|
=head1 EXAMPLES
|
||||||
|
|
||||||
@@ -172,163 +172,170 @@ decimal, float and double (and derived classes) return their value in
|
|||||||
numeric context.
|
numeric context.
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head1 Subclasses
|
=head1 Subclasses
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::anyType
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::anyType
|
||||||
|
|
||||||
Base class for all types
|
Base class for all types
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType
|
||||||
|
|
||||||
Base class for all simple types
|
Base class for all simple types
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::anyURI
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::anyURI
|
||||||
|
|
||||||
Type representing URIs
|
Type representing URIs
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::boolean
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::boolean
|
||||||
|
|
||||||
Represents boolean data.
|
Represents boolean data.
|
||||||
|
|
||||||
Serializes to "true" or "false".
|
Serializes to "true" or "false".
|
||||||
|
|
||||||
Everything true in perl and not "false" is deserialized as true.
|
Everything true in perl and not "false" is deserialized as true.
|
||||||
|
|
||||||
Returns true/false in boolean context.
|
Returns true/false in boolean context.
|
||||||
|
|
||||||
Returns 1 / 0 in numeric context.
|
Returns 1 / 0 in numeric context.
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::byte
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::byte
|
||||||
|
|
||||||
byte integer objects.
|
byte integer objects.
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::date
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::date
|
||||||
|
|
||||||
date values are automatically converted into XML date strings during setting:
|
date values are automatically converted into XML date strings during setting:
|
||||||
|
|
||||||
YYYY-MM-DD+zz:zz
|
YYYY-MM-DD+zz:zz
|
||||||
|
|
||||||
The time zone is set to the local time zone if not included.
|
|
||||||
|
|
||||||
All input variants supported by Date::Parse are supported. You may even pass
|
The time zone is set to the local time zone if not included.
|
||||||
in dateTime strings - the time part will be ignored. Note that
|
|
||||||
|
All input variants supported by Date::Parse are supported. You may even pass
|
||||||
|
in dateTime strings - the time part will be ignored. Note that
|
||||||
set_value is around 100 times slower when setting non-XML-time strings
|
set_value is around 100 times slower when setting non-XML-time strings
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::dateTime
|
When setting dates before the beginning of the epoch (negative UNIX timestamp),
|
||||||
|
you should use the XML date string format for setting dates. The behaviour of
|
||||||
|
Date::Parse for dates before the epoch is system dependent.
|
||||||
|
|
||||||
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::dateTime
|
||||||
|
|
||||||
dateTime values are automatically converted into XML dateTime strings during setting:
|
dateTime values are automatically converted into XML dateTime strings during setting:
|
||||||
|
|
||||||
YYYY-MM-DDThh:mm:ss.nnnnnnn+zz:zz
|
YYYY-MM-DDThh:mm:ss.nnnnnnn+zz:zz
|
||||||
|
|
||||||
The optional nanoseconds parts is excluded in converted values, as it would always be 0.
|
The fraction of seconds (nnnnnnn) part is optional. Fractions of seconds may
|
||||||
|
be given with arbitrary precision
|
||||||
All input variants supported by Date::Parse are supported. Note that
|
|
||||||
|
The fraction of seconds part is excluded in converted values, as it would always be 0.
|
||||||
|
|
||||||
|
All input variants supported by Date::Parse are supported. Note that
|
||||||
set_value is around 100 times slower when setting non-XML-time strings
|
set_value is around 100 times slower when setting non-XML-time strings
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::decimal
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::decimal
|
||||||
|
|
||||||
decimal is the base of all non-float numbers
|
decimal is the base of all non-float numbers
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::double
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::double
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::duration
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::duration
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::ENTITY
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::ENTITY
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::float
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::float
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::gDay
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::gDay
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::gMonth
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::gMonth
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::gMonthDay
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::gMonthDay
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::gYear
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::gYear
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::gYearMonth
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::gYearMonth
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::hexBinary
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::hexBinary
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::ID
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::ID
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::IDREF
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::IDREF
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::IDREFS
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::IDREFS
|
||||||
|
|
||||||
List of SOAP::WSDL::XSD::Typelib::Builtin::IDREF objects.
|
List of SOAP::WSDL::XSD::Typelib::Builtin::IDREF objects.
|
||||||
|
|
||||||
Derived by SOAP::WSDL::XSD::Typelib::Builtin::list.
|
Derived by SOAP::WSDL::XSD::Typelib::Builtin::list.
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::int
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::int
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::integer
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::integer
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::language
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::language
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::list
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::list
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::long
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::long
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::Name
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::Name
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::NCName
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::NCName
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::negativeInteger
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::negativeInteger
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::nonNegativeInteger
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::nonNegativeInteger
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::nonPositiveInteger
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::nonPositiveInteger
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::normalizedString
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::normalizedString
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::NOTATION
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::NOTATION
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::positiveInteger
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::positiveInteger
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::QName
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::QName
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::short
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::short
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::string
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::string
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::time
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::time
|
||||||
|
|
||||||
time values are automatically converted into XML time strings during setting:
|
time values are automatically converted into XML time strings during setting:
|
||||||
|
|
||||||
hh:mm:ss.nnnnnnn+zz:zz
|
hh:mm:ss.nnnnnnn+zz:zz
|
||||||
hh:mm:ss+zz:zz
|
hh:mm:ss+zz:zz
|
||||||
|
|
||||||
The time zone is set to the local time zone if not included. The optional
|
|
||||||
nanoseconds part is not included in converted values, as it would always be 0.
|
|
||||||
|
|
||||||
All input variants supported by Date::Parse are supported. You may even pass
|
The time zone is set to the local time zone if not included. The optional
|
||||||
in dateTime strings - the date part will be ignored. Note that
|
nanoseconds part is not included in converted values, as it would always be 0.
|
||||||
|
|
||||||
|
All input variants supported by Date::Parse are supported. You may even pass
|
||||||
|
in dateTime strings - the date part will be ignored. Note that
|
||||||
set_value is around 100 times slower when setting non-XML-time strings
|
set_value is around 100 times slower when setting non-XML-time strings
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::token
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::token
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::unsignedByte
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::unsignedByte
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::unsignedInt
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::unsignedInt
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::unsignedLong
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::unsignedLong
|
||||||
|
|
||||||
=head2 SOAP::WSDL::XSD::Typelib::Builtin::unsignedShort
|
=head2 SOAP::WSDL::XSD::Typelib::Builtin::unsignedShort
|
||||||
|
|
||||||
=head1 CAVEATS
|
=head1 CAVEATS
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item * set_value
|
=item * set_value
|
||||||
|
|
||||||
In contrast to Class::Std-generated mutators (setters), set_value does
|
In contrast to Class::Std-generated mutators (setters), set_value does
|
||||||
not return the last value.
|
not return the last value.
|
||||||
|
|
||||||
This is for speed reasons: SOAP::WSDL never needs to know the last value
|
This is for speed reasons: SOAP::WSDL never needs to know the last value
|
||||||
when calling set_calue, but calls it over and over again...
|
when calling set_calue, but calls it over and over again...
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head1 BUGS AND LIMITATIONS
|
=head1 BUGS AND LIMITATIONS
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::ENTITY;
|
package SOAP::WSDL::XSD::Typelib::Builtin::ENTITY;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
@@ -20,6 +20,6 @@ BEGIN {
|
|||||||
}
|
}
|
||||||
return $self;
|
return $self;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -4,4 +4,4 @@ use warnings;
|
|||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::NCName);
|
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::NCName);
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -4,4 +4,4 @@ use warnings;
|
|||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::ID);
|
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::ID);
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -6,4 +6,4 @@ use base qw(
|
|||||||
SOAP::WSDL::XSD::Typelib::Builtin::list
|
SOAP::WSDL::XSD::Typelib::Builtin::list
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::IDREF);
|
SOAP::WSDL::XSD::Typelib::Builtin::IDREF);
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::NCName;
|
package SOAP::WSDL::XSD::Typelib::Builtin::NCName;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
@@ -22,4 +22,4 @@ BEGIN {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::NMTOKEN;
|
package SOAP::WSDL::XSD::Typelib::Builtin::NMTOKEN;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
@@ -21,6 +21,6 @@ BEGIN {
|
|||||||
return $self;
|
return $self;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::NMTOKENS;
|
package SOAP::WSDL::XSD::Typelib::Builtin::NMTOKENS;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::list
|
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::list
|
||||||
SOAP::WSDL::XSD::Typelib::Builtin::NMTOKEN);
|
SOAP::WSDL::XSD::Typelib::Builtin::NMTOKEN);
|
||||||
|
|
||||||
no warnings qw(redefine);
|
no warnings qw(redefine);
|
||||||
no strict qw(refs);
|
no strict qw(refs);
|
||||||
|
|
||||||
@@ -22,5 +22,5 @@ BEGIN {
|
|||||||
return $self;
|
return $self;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -1,19 +1,19 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::NOTATION;
|
package SOAP::WSDL::XSD::Typelib::Builtin::NOTATION;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
my %length_of :ATTR(:name<length> :default<()>);
|
my %length_of :ATTR(:name<length> :default<()>);
|
||||||
my %minLength_of :ATTR(:name<minLength> :default<()>);
|
my %minLength_of :ATTR(:name<minLength> :default<()>);
|
||||||
my %maxLength_of :ATTR(:name<maxLength> :default<()>);
|
my %maxLength_of :ATTR(:name<maxLength> :default<()>);
|
||||||
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
||||||
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
||||||
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
|
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
|
||||||
|
|
||||||
no warnings qw(redefine);
|
no warnings qw(redefine);
|
||||||
no strict qw(refs);
|
no strict qw(refs);
|
||||||
|
|
||||||
@@ -28,6 +28,6 @@ BEGIN {
|
|||||||
return $self;
|
return $self;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
1;
|
|
||||||
|
1;
|
||||||
|
|||||||
@@ -20,6 +20,6 @@ BEGIN {
|
|||||||
}
|
}
|
||||||
return $self;
|
return $self;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::QName;
|
package SOAP::WSDL::XSD::Typelib::Builtin::QName;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
@@ -22,13 +22,13 @@ BEGIN {
|
|||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
my %length_of :ATTR(:name<length> :default<()>);
|
my %length_of :ATTR(:name<length> :default<()>);
|
||||||
my %minLength_of :ATTR(:name<minLength> :default<()>);
|
my %minLength_of :ATTR(:name<minLength> :default<()>);
|
||||||
my %maxLength_of :ATTR(:name<maxLength> :default<()>);
|
my %maxLength_of :ATTR(:name<maxLength> :default<()>);
|
||||||
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
||||||
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
||||||
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|||||||
@@ -8,12 +8,12 @@ BEGIN {
|
|||||||
}
|
}
|
||||||
|
|
||||||
my %value_of :ATTR(:get<value> :init_arg<value> :default<()>);
|
my %value_of :ATTR(:get<value> :init_arg<value> :default<()>);
|
||||||
|
|
||||||
## use $_[n] for speed - we get called zillions of times...
|
## use $_[n] for speed - we get called zillions of times...
|
||||||
# and we don't need to return the last value...
|
# and we don't need to return the last value...
|
||||||
sub set_value { $value_of{ ident $_[0] } = $_[1] }
|
sub set_value { $value_of{ ident $_[0] } = $_[1] }
|
||||||
|
|
||||||
sub serialize {
|
sub serialize {
|
||||||
my ($self, $opt) = @_;
|
my ($self, $opt) = @_;
|
||||||
my $ident = ident $self;
|
my $ident = ident $self;
|
||||||
$opt ||= {};
|
$opt ||= {};
|
||||||
@@ -23,7 +23,7 @@ sub serialize {
|
|||||||
, $value_of{ $ident }
|
, $value_of{ $ident }
|
||||||
, $self->end_tag($opt);
|
, $self->end_tag($opt);
|
||||||
}
|
}
|
||||||
|
|
||||||
# TODO disallow serializing !
|
# TODO disallow serializing !
|
||||||
sub as_bool :BOOLIFY {
|
sub as_bool :BOOLIFY {
|
||||||
return $value_of { ident $_[0] };
|
return $value_of { ident $_[0] };
|
||||||
@@ -39,4 +39,4 @@ sub _get_handlers {
|
|||||||
Class::Std::initialize(); # make :BOOLIFY overloading serializable
|
Class::Std::initialize(); # make :BOOLIFY overloading serializable
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -24,6 +24,6 @@ sub serialize_qualified :STRINGIFY {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Class::Std::initialize(); # make :STRINGIFY overloading serializable
|
Class::Std::initialize(); # make :STRINGIFY overloading serializable
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::anyURI;
|
package SOAP::WSDL::XSD::Typelib::Builtin::anyURI;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
@@ -21,13 +21,13 @@ BEGIN {
|
|||||||
return $self;
|
return $self;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
my %length_of :ATTR(:name<length> :default<()>);
|
|
||||||
my %minLength_of :ATTR(:name<minLength> :default<()>);
|
|
||||||
my %maxLength_of :ATTR(:name<maxLength> :default<()>);
|
|
||||||
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
|
||||||
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
|
||||||
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
|
||||||
|
|
||||||
|
my %length_of :ATTR(:name<length> :default<()>);
|
||||||
1;
|
my %minLength_of :ATTR(:name<minLength> :default<()>);
|
||||||
|
my %maxLength_of :ATTR(:name<maxLength> :default<()>);
|
||||||
|
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
||||||
|
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
||||||
|
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package SOAP::WSDL::XSD::Typelib::Builtin::base64Binary;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
@@ -23,13 +23,13 @@ BEGIN {
|
|||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
my %length_of :ATTR(:name<length> :default<()>);
|
my %length_of :ATTR(:name<length> :default<()>);
|
||||||
my %minLength_of :ATTR(:name<minLength> :default<()>);
|
my %minLength_of :ATTR(:name<minLength> :default<()>);
|
||||||
my %maxLength_of :ATTR(:name<maxLength> :default<()>);
|
my %maxLength_of :ATTR(:name<maxLength> :default<()>);
|
||||||
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
||||||
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
||||||
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::boolean;
|
package SOAP::WSDL::XSD::Typelib::Builtin::boolean;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
use Class::Std::Storable;
|
||||||
|
|
||||||
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
||||||
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
||||||
my %value_of :ATTR(:get<value> :init_attr<value> :default<()>);
|
my %value_of :ATTR(:get<value> :init_attr<value> :default<()>);
|
||||||
|
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
# use Class::Std::Storable;
|
||||||
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
|
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
|
||||||
|
|
||||||
no warnings qw(redefine);
|
no warnings qw(redefine);
|
||||||
@@ -26,7 +27,7 @@ BEGIN {
|
|||||||
return $self;
|
return $self;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
sub serialize {
|
sub serialize {
|
||||||
my ($self, $opt) = @_;
|
my ($self, $opt) = @_;
|
||||||
@@ -56,4 +57,4 @@ sub set_value {
|
|||||||
|
|
||||||
Class::Std::initialize(); # make :BOOLIFY overloading serializable
|
Class::Std::initialize(); # make :BOOLIFY overloading serializable
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -22,5 +22,5 @@ BEGIN {
|
|||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::date;
|
package SOAP::WSDL::XSD::Typelib::Builtin::date;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
use Date::Parse;
|
use Date::Parse;
|
||||||
use Date::Format;
|
use Date::Format;
|
||||||
|
|
||||||
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
||||||
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
||||||
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
||||||
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
||||||
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
||||||
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
||||||
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
@@ -33,33 +33,47 @@ BEGIN {
|
|||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub set_value {
|
sub set_value {
|
||||||
# use set_value from base class if we have a XML-DateTime format
|
# use set_value from base class if we have a XML-DateTime format
|
||||||
#2037-12-31+01:00
|
#2037-12-31+01:00
|
||||||
if (
|
if (
|
||||||
$_[1] =~ m{ ^\d{4} \- \d{2} \- \d{2}
|
$_[1] =~ m{ ^\d{4} \- \d{2} \- \d{2}
|
||||||
(:? [\+\-] \d{2} \: \d{2} )?$
|
(:? [\+\-] \d{2} \: \d{2} )$
|
||||||
}xms
|
}xms
|
||||||
) {
|
) {
|
||||||
$_[0]->SUPER::set_value($_[1])
|
$_[0]->SUPER::set_value($_[1])
|
||||||
}
|
}
|
||||||
# use a combination of strptime and strftime for converting the date
|
# converting a date is hard work: It needs a timezone, because
|
||||||
# Unfortunately, strftime outputs the time zone as [+-]0000, whereas XML
|
# 2007-12-30+12:00 and 2007-12-31-12:00 mean the same day - just in
|
||||||
# whants it as [+-]00:00
|
# different locations.
|
||||||
# We know that the latter part of the TZ is always :00 (there's no time
|
# strftime actually prints out the correct date, but always prints the
|
||||||
# zone whith minute offset yet), so we just use substr to get the part
|
# local timezone with %z.
|
||||||
# up to the last 2 timezone digits and append :00
|
# So, if our timezone is not 0, we strftime it without timezone and
|
||||||
# We leave out the optional nanoseconds part, as it would always be empty.
|
# append it by hand by the following formula:
|
||||||
else {
|
# The timezone hours are the int (timesone seconds / 3600)
|
||||||
|
# The timezone minutes (if someone ever specifies something like that)
|
||||||
|
# are int( (seconds % 3600) / 60 )
|
||||||
|
# say, int( (seconds modulo 3600) / 60 )
|
||||||
|
#
|
||||||
|
# If we have no timezone (meaning the timezone is
|
||||||
|
else {
|
||||||
# strptime sets empty values to undef - and strftime doesn't like that...
|
# strptime sets empty values to undef - and strftime doesn't like that...
|
||||||
my @time_from = map { ! defined $_ ? 0 : $_ } strptime($_[1]);
|
my @time_from = strptime($_[1]);
|
||||||
my $time_str = strftime( '%Y-%m-%d%z', @time_from );
|
my $time_zone_seconds = $time_from[6];
|
||||||
substr $time_str, -2, 0, ':';
|
@time_from = map { (! defined $_) ? 0 : $_ } @time_from;
|
||||||
|
# use Data::Dumper;
|
||||||
|
# warn Dumper \@time_from, sprintf('%+03d%02d', $time_from[6] / 3600, $time_from[6] % 60 );
|
||||||
|
my $time_str = defined $time_zone_seconds
|
||||||
|
? strftime( '%Y-%m-%d', @time_from )
|
||||||
|
. sprintf('%+03d%02d', int($time_from[6] / 3600), int ( ($time_from[6] % 3600) / 60 ) )
|
||||||
|
: do {
|
||||||
|
strftime( '%Y-%m-%d%z', @time_from );
|
||||||
|
};
|
||||||
|
substr $time_str, -2, 0, ':';
|
||||||
$_[0]->SUPER::set_value($time_str);
|
$_[0]->SUPER::set_value($time_str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
1;
|
|
||||||
|
|
||||||
|
|||||||
@@ -5,15 +5,15 @@ use Class::Std::Storable;
|
|||||||
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
|
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
|
||||||
use Date::Parse;
|
use Date::Parse;
|
||||||
use Date::Format;
|
use Date::Format;
|
||||||
|
|
||||||
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
||||||
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
||||||
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
||||||
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
||||||
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
||||||
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
||||||
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
@@ -37,29 +37,20 @@ BEGIN {
|
|||||||
sub set_value {
|
sub set_value {
|
||||||
# use set_value from base class if we have a XML-DateTime format
|
# use set_value from base class if we have a XML-DateTime format
|
||||||
#2037-12-31T00:00:00.0000000+01:00
|
#2037-12-31T00:00:00.0000000+01:00
|
||||||
if (
|
return $_[0]->SUPER::set_value($_[1]) if (
|
||||||
$_[1] =~ m{ ^\d{4} \- \d{2} \- \d{2}
|
$_[1] =~ m{ ^\d{4} \- \d{2} \- \d{2}
|
||||||
T \d{2} \: \d{2} \: \d{2} (:? \. \d{1,7} )?
|
T \d{2} \: \d{2} \: \d{2} (:? \. \d{1,7} )?
|
||||||
[\+\-] \d{2} \: \d{2} $
|
[\+\-] \d{2} \: \d{2} $
|
||||||
}xms
|
}xms
|
||||||
) {
|
);
|
||||||
$_[0]->SUPER::set_value($_[1])
|
|
||||||
}
|
# strptime sets empty values to undef - and strftime doesn't like that...
|
||||||
# use a combination of strptime and strftime for converting the date
|
my @time_from = map { ! defined $_ ? 0 : $_ } strptime($_[1]);
|
||||||
# strptime does not emit timezone info, so we're pretty fucked up here.
|
undef $time_from[-1];
|
||||||
#
|
|
||||||
# Unfortunately, strftime outputs the time zone as [+-]0000, whereas XML
|
|
||||||
# whants it as [+-]00:00
|
|
||||||
# We leave out the optional nanoseconds part, as it would always be empty.
|
|
||||||
else {
|
|
||||||
# strptime sets empty values to undef - and strftime doesn't like that...
|
|
||||||
my @time_from = map { ! defined $_ ? 0 : $_ } strptime($_[1]);
|
|
||||||
undef $time_from[-1];
|
|
||||||
|
|
||||||
my $time_str = strftime( '%Y-%m-%dT%H:%M:%S%z', @time_from );
|
my $time_str = strftime( '%Y-%m-%dT%H:%M:%S%z', @time_from );
|
||||||
substr $time_str, -2, 0, ':';
|
substr $time_str, -2, 0, ':';
|
||||||
$_[0]->SUPER::set_value($time_str);
|
$_[0]->SUPER::set_value($time_str);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::decimal;
|
package SOAP::WSDL::XSD::Typelib::Builtin::decimal;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
my %totalDigits_of :ATTR(:name<totalDigits> :default<()>);
|
my %totalDigits_of :ATTR(:name<totalDigits> :default<()>);
|
||||||
my %fractionDigits_of :ATTR(:name<fractionDigits> :default<()>);
|
my %fractionDigits_of :ATTR(:name<fractionDigits> :default<()>);
|
||||||
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
||||||
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
||||||
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
||||||
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
||||||
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
||||||
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
||||||
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
@@ -35,8 +35,8 @@ BEGIN {
|
|||||||
|
|
||||||
sub as_num :NUMERIFY :BOOLIFY {
|
sub as_num :NUMERIFY :BOOLIFY {
|
||||||
return $_[0]->get_value();
|
return $_[0]->get_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
Class::Std::initialize(); # make :NUMERIFY :BOOLIFY overloading serializable
|
Class::Std::initialize(); # make :NUMERIFY :BOOLIFY overloading serializable
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -21,11 +21,11 @@ BEGIN {
|
|||||||
return $self;
|
return $self;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
sub as_num :NUMERIFY {
|
sub as_num :NUMERIFY {
|
||||||
return $_[0]->get_value();
|
return $_[0]->get_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
Class::Std::initialize(); # make :NUMERIFY overloading serializable
|
Class::Std::initialize(); # make :NUMERIFY overloading serializable
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::duration;
|
package SOAP::WSDL::XSD::Typelib::Builtin::duration;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
@@ -20,15 +20,15 @@ BEGIN {
|
|||||||
return $self;
|
return $self;
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
||||||
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
||||||
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
||||||
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
||||||
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
||||||
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
||||||
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::float;
|
package SOAP::WSDL::XSD::Typelib::Builtin::float;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
||||||
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
||||||
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
||||||
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
||||||
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
||||||
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
||||||
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
@@ -29,13 +29,13 @@ BEGIN {
|
|||||||
return $self;
|
return $self;
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
sub as_num :NUMERIFY {
|
sub as_num :NUMERIFY {
|
||||||
return $_[0]->get_value();
|
return $_[0]->get_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
Class::Std::initialize(); # make :NUMERIFY overloading serializable
|
Class::Std::initialize(); # make :NUMERIFY overloading serializable
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::gDay;
|
package SOAP::WSDL::XSD::Typelib::Builtin::gDay;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
||||||
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
||||||
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
||||||
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
||||||
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
||||||
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
||||||
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
@@ -29,6 +29,6 @@ BEGIN {
|
|||||||
return $self;
|
return $self;
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::gMonth;
|
package SOAP::WSDL::XSD::Typelib::Builtin::gMonth;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
||||||
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
||||||
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
||||||
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
||||||
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
||||||
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
||||||
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
@@ -29,6 +29,6 @@ BEGIN {
|
|||||||
return $self;
|
return $self;
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::gMonthDay;
|
package SOAP::WSDL::XSD::Typelib::Builtin::gMonthDay;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
||||||
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
||||||
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
||||||
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
||||||
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
||||||
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
||||||
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
@@ -29,6 +29,6 @@ BEGIN {
|
|||||||
return $self;
|
return $self;
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::gYear;
|
package SOAP::WSDL::XSD::Typelib::Builtin::gYear;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
||||||
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
||||||
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
||||||
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
||||||
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
||||||
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
||||||
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
@@ -29,6 +29,6 @@ BEGIN {
|
|||||||
return $self;
|
return $self;
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::gYearMonth;
|
package SOAP::WSDL::XSD::Typelib::Builtin::gYearMonth;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
||||||
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
||||||
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
||||||
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
my %maxInclusive_of :ATTR(:name<maxInclusive> :default<()>);
|
||||||
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
my %maxExclusive_of :ATTR(:name<maxExclusive> :default<()>);
|
||||||
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
my %minInclusive_of :ATTR(:name<minInclusive> :default<()>);
|
||||||
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
my %minExclusive_of :ATTR(:name<minExclusive> :default<()>);
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
@@ -28,6 +28,6 @@ BEGIN {
|
|||||||
return $self;
|
return $self;
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package SOAP::WSDL::XSD::Typelib::Builtin::hexBinary;
|
package SOAP::WSDL::XSD::Typelib::Builtin::hexBinary;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
# Speed up. Class::Std::new is slow - and we don't need it's functionality...
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Class::Std::Storable;
|
use Class::Std::Storable;
|
||||||
@@ -20,13 +20,13 @@ BEGIN {
|
|||||||
}
|
}
|
||||||
return $self;
|
return $self;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
my %length_of :ATTR(:name<length> :default<()>);
|
my %length_of :ATTR(:name<length> :default<()>);
|
||||||
my %minLength_of :ATTR(:name<minLength> :default<()>);
|
my %minLength_of :ATTR(:name<minLength> :default<()>);
|
||||||
my %maxLength_of :ATTR(:name<maxLength> :default<()>);
|
my %maxLength_of :ATTR(:name<maxLength> :default<()>);
|
||||||
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
my %pattern_of :ATTR(:name<pattern> :default<()>);
|
||||||
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
my %enumeration_of :ATTR(:name<enumeration> :default<()>);
|
||||||
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
my %whiteSpace_of :ATTR(:name<whiteSpace> :default<()>);
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user