Compare commits

..
18 Commits
Author SHA1 Message Date
Martin Kutter a9033164e6 import SOAP-WSDL 2.00_25 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_25
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_25.tar.gz
2009-12-12 19:48:11 -08:00
Martin Kutter 84b53d9261 import SOAP-WSDL 2.00_24 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_24
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_24.tar.gz
2009-12-12 19:48:10 -08:00
Martin Kutter b955c5ad79 import SOAP-WSDL 2.00_23 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_23
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_23.tar.gz
2009-12-12 19:48:07 -08:00
Martin Kutter 080b211e4e import SOAP-WSDL 2.00_22 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_22
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_22.tar.gz
2009-12-12 19:48:06 -08:00
Martin Kutter fa4d5dd884 import SOAP-WSDL 2.00_20 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_20
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_20.tar.gz
2009-12-12 19:48:05 -08:00
Martin Kutter 3d11524449 import SOAP-WSDL 2.00_19 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_19
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_19.tar.gz
2009-12-12 19:48:04 -08:00
Martin Kutter 21efa286af import SOAP-WSDL 2.00_18 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_18
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_18.tar.gz
2009-12-12 19:48:03 -08:00
Martin Kutter 008d06b72a import SOAP-WSDL 2.00_17 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_17
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_17.tar.gz
2009-12-12 19:48:02 -08:00
Martin Kutter c6a48ba84b import SOAP-WSDL 1.26 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  1.26
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-1.26.tar.gz
2009-12-12 19:48:00 -08:00
Martin Kutter 30be0da3dc import SOAP-WSDL 2.00_16 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_16
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_16.tar.gz
2009-12-12 19:47:59 -08:00
Martin Kutter 2347a88353 import SOAP-WSDL 1.25 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  1.25
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-1.25.tar.gz
2009-12-12 19:47:57 -08:00
Martin Kutter 9e85f63aa0 import SOAP-WSDL 1.24 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  1.24
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-1.24.tar.gz
2009-12-12 19:47:56 -08:00
Martin Kutter 7ba2f93e44 import SOAP-WSDL 2.00_15 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_15
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_15.tar.gz
2009-12-12 19:47:55 -08:00
Martin Kutter 099c83b6bc import SOAP-WSDL 2.00_14 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_14
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_14.tar.gz
2009-12-12 19:47:53 -08:00
Martin Kutter f63138fc87 import SOAP-WSDL 2.00_13 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_13
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_13.tar.gz
2009-12-12 19:47:52 -08:00
Martin Kutter fd0854e34a import SOAP-WSDL 2.00_12 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_12
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_12.tar.gz
2009-12-12 19:47:49 -08:00
Martin Kutter c2da74b5ae import SOAP-WSDL 2.00_11 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_11
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_11.tar.gz
2009-12-12 19:47:49 -08:00
Martin Kutter 7ba1959888 import SOAP-WSDL 2.00_10 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_10
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_10.tar.gz
2009-12-12 19:47:48 -08:00
355 changed files with 19731 additions and 11547 deletions
+53 -43
View File
@@ -1,43 +1,53 @@
use Module::Build; use Module::Build;
Module::Build->new( use version;
# create_makefile_pl => 'traditional', $build = Module::Build->new(
dist_abstract => 'SOAP with WSDL support', dist_author => 'Martin Kutter <martin.kutter@fen-net.de>',
dist_name => 'SOAP-WSDL', create_makefile_pl => 'passthrough',
dist_version => '2.00_09', dist_abstract => 'SOAP with WSDL support',
module_name => 'SOAP::WSDL', dist_name => 'SOAP-WSDL',
license => 'artistic', dist_version => '2.00_25',
requires => { module_name => 'SOAP::WSDL',
'Class::Std' => q/v0.0.8/, license => 'artistic',
'Class::Std::Storable' => 0, requires => {
'Date::Parse' => 0, # 5.6.x is way too buggy and has no unicode support
'Date::Format' => 0, # for us. SOAP-WSDL relies on unicode (WS-I demands it)
'LWP::UserAgent' => 0, # and triggers several 5.6 bugs...
'List::Util' => 0, 'perl' => q(5.8.0),
'File::Basename' => 0, 'Class::Std::Fast' => qv(0.0.5),
'File::Path' => 0, 'Data::Dumper' => 0,
'XML::LibXML' => 0, 'Date::Parse' => 0,
'XML::SAX::Base' => 0, 'Date::Format' => 0,
'XML::SAX::ParserFactory' => 0, 'File::Basename' => 0,
'XML::Parser::Expat' => 0, 'File::Path' => 0,
}, 'Getopt::Long' => 0,
buildrequires => { 'List::Util' => 0,
'Date::Parse' => 0, 'LWP::UserAgent' => 0,
'Date::Format' => 0, 'Template' => 0,
'Benchmark' => 0, 'Term::ReadKey' => 0,
'Cwd' => 0, 'XML::Parser::Expat' => 0,
'Test::More' => 0, },
'Class::Std' => 0.0.8, buildrequires => {
'Class::Std::Storable' => 0, 'Class::Std::Fast' => qv(0.0.5),
'List::Util' => 0, 'Cwd' => 0,
'LWP::UserAgent' => 0, 'Date::Parse' => 0,
'File::Basename' => 0, 'Date::Format' => 0,
'File::Path' => 0, 'Getopt::Long' => 0,
'XML::Simple' => 0, 'List::Util' => 0,
'XML::LibXML' => 0, 'LWP::UserAgent' => 0,
'XML::Parser::Expat' => 0, 'File::Basename' => 0,
'XML::SAX::Base' => 0, 'File::Path' => 0,
'XML::SAX::ParserFactory' => 0, 'File::Spec' => 0,
'Pod::Simple::Text' => 0, 'Storable' => 0,
}, 'Test::More' => 0,
recursive_test_files => 1, 'Template' => 0,
)->create_build_script; 'XML::Parser::Expat' => 0,
},
recursive_test_files => 1,
meta_add => {
no_index => {
directory => 'lib/SOAP/WSDL/Generator/Template/XSD/',
},
}
);
$build->add_build_element('tt');
$build->create_build_script;
-590
View File
@@ -1,590 +0,0 @@
------------------------------------------------------------------------
r131 | kutterma | 2007-08-12 14:18:59 +0200 (So, 12 Aug 2007) | 3 lines
- fixed documentation for generated code with element ref="" declarations
- fixed element ref="" test for generated code
- added (generated) Makefile.PL to make CPAN testers happy
------------------------------------------------------------------------
r130 | kutterma | 2007-08-10 15:57:12 +0200 (Fr, 10 Aug 2007) | 1 line
- first try at truely callback-based parser (inspired by XML::Compile)
------------------------------------------------------------------------
r129 | kutterma | 2007-08-07 17:53:40 +0200 (Di, 07 Aug 2007) | 1 line
- moved duplicate sub generation out of loop
------------------------------------------------------------------------
r128 | kutterma | 2007-08-07 14:16:28 +0200 (Di, 07 Aug 2007) | 1 line
- bool now returns numerical value in bool context, not "true" or "false" (always true...)
------------------------------------------------------------------------
r127 | kutterma | 2007-08-07 11:45:23 +0200 (Di, 07 Aug 2007) | 1 line
- fixed test to be timezone sensitive
------------------------------------------------------------------------
r126 | kutterma | 2007-08-07 11:09:51 +0200 (Di, 07 Aug 2007) | 1 line
- made test timezone-sensitive
------------------------------------------------------------------------
r125 | kutterma | 2007-08-07 11:09:16 +0200 (Di, 07 Aug 2007) | 1 line
- made test timezone-sensitive
------------------------------------------------------------------------
r124 | kutterma | 2007-08-06 18:05:02 +0200 (Mo, 06 Aug 2007) | 2 lines
- fixed element ref handling in code generator in ComplexType.
- top-level element ref still not supported/tested
------------------------------------------------------------------------
r123 | kutterma | 2007-08-06 17:48:57 +0200 (Mo, 06 Aug 2007) | 1 line
- test now dies and outputs code to eval on eval errors
------------------------------------------------------------------------
r122 | kutterma | 2007-08-06 17:29:46 +0200 (Mo, 06 Aug 2007) | 1 line
- fixed element ref="" handling in complexType
------------------------------------------------------------------------
r121 | kutterma | 2007-08-06 17:29:14 +0200 (Mo, 06 Aug 2007) | 1 line
- added test data for element ref inside complexType
------------------------------------------------------------------------
r120 | kutterma | 2007-08-06 17:28:54 +0200 (Mo, 06 Aug 2007) | 1 line
- added test for element ref inside complexType
------------------------------------------------------------------------
r119 | kutterma | 2007-08-06 17:13:03 +0200 (Mo, 06 Aug 2007) | 1 line
- fixed element ref handling
------------------------------------------------------------------------
r118 | kutterma | 2007-08-06 17:12:47 +0200 (Mo, 06 Aug 2007) | 1 line
- added element ref test data
------------------------------------------------------------------------
r117 | kutterma | 2007-08-06 17:12:36 +0200 (Mo, 06 Aug 2007) | 1 line
- added element ref test
------------------------------------------------------------------------
r116 | kutterma | 2007-08-06 15:47:30 +0200 (Mo, 06 Aug 2007) | 1 line
- refined docs
------------------------------------------------------------------------
r115 | kutterma | 2007-08-06 15:39:39 +0200 (Mo, 06 Aug 2007) | 1 line
- updated docs. Hope the CPAN indexer ignores "=for developers"...
------------------------------------------------------------------------
r114 | kutterma | 2007-08-06 14:12:28 +0200 (Mo, 06 Aug 2007) | 1 line
- removed annoying pod
------------------------------------------------------------------------
r113 | kutterma | 2007-08-05 18:42:09 +0200 (So, 05 Aug 2007) | 5 lines
- removed SOAP::Lite dependency
- updated docs
- 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
- added SOAP::WSDL example(weather_wsdl.pl)
------------------------------------------------------------------------
r112 | kutterma | 2007-08-03 16:12:57 +0200 (Fr, 03 Aug 2007) | 1 line
updated docs
------------------------------------------------------------------------
r111 | kutterma | 2007-08-03 16:12:04 +0200 (Fr, 03 Aug 2007) | 1 line
- added "skip"
------------------------------------------------------------------------
r110 | kutterma | 2007-07-31 22:27:25 +0200 (Di, 31 Jul 2007) | 2 lines
- further work on removing SOAP::Lite dependency
- Note: SOAP::WSDL may be broken !
------------------------------------------------------------------------
r109 | kutterma | 2007-07-31 21:10:40 +0200 (Di, 31 Jul 2007) | 3 lines
- finished move from XSD::Primitive to Builtin
- fixed a few tests
- removed typo namespace from TypeLookupt
------------------------------------------------------------------------
r108 | kutterma | 2007-07-31 21:02:43 +0200 (Di, 31 Jul 2007) | 1 line
- removed unneeded example stuff
------------------------------------------------------------------------
r107 | kutterma | 2007-07-31 20:32:43 +0200 (Di, 31 Jul 2007) | 1 line
- rename to Builtin
------------------------------------------------------------------------
r106 | kutterma | 2007-07-31 20:32:11 +0200 (Di, 31 Jul 2007) | 1 line
- prepared rename to Builtin
------------------------------------------------------------------------
r105 | kutterma | 2007-07-31 13:17:52 +0200 (Di, 31 Jul 2007) | 2 lines
- added configurable ContentType / charset
- maybe split up charset and content type into two methods ?
------------------------------------------------------------------------
r104 | kutterma | 2007-07-31 00:16:15 +0200 (Di, 31 Jul 2007) | 3 lines
- removed optional nanoseconds from dateTime conversions
- added conversion to date objects
- removed fetching WSDL via SOAP::Schema in SOAP::WSDL. SOAP::Lite is still used as base class.
------------------------------------------------------------------------
r103 | kutterma | 2007-07-30 13:25:06 +0200 (Mo, 30 Jul 2007) | 1 line
- updated TODO
------------------------------------------------------------------------
r102 | kutterma | 2007-07-30 13:23:09 +0200 (Mo, 30 Jul 2007) | 2 lines
- updated Build.PL dependencies
- update TODO
------------------------------------------------------------------------
r101 | kutterma | 2007-07-30 13:22:05 +0200 (Mo, 30 Jul 2007) | 2 lines
- added dateTime test
- fixed pod test
------------------------------------------------------------------------
r100 | kutterma | 2007-07-27 16:03:15 +0200 (Fr, 27 Jul 2007) | 2 lines
- allow passing list refs of hash refs to set_value.
I hope I got all combinations by now - start getting ugly...
------------------------------------------------------------------------
r99 | kutterma | 2007-07-26 23:18:35 +0200 (Do, 26 Jul 2007) | 1 line
- added SOAP::Lite usage (to be removed later)
------------------------------------------------------------------------
r98 | kutterma | 2007-07-26 23:16:30 +0200 (Do, 26 Jul 2007) | 3 lines
- removed SOAP::Lite dependency
- added set_trace and tracing facility support via callback in call()
- added fault_class property to allow different Fault classes (somewhen later on)
------------------------------------------------------------------------
r97 | kutterma | 2007-07-25 16:59:49 +0200 (Mi, 25 Jul 2007) | 3 lines
- dateTime now converts date strings into XML date strings
- updated docs
------------------------------------------------------------------------
r96 | kutterma | 2007-07-23 11:17:36 +0200 (Mo, 23 Jul 2007) | 3 lines
- SOAP::WSDL::Definitions::create now
- converts '.' in service names to '::' (.NET class separator to perl class separator)
- outputs Typemaps and Interface classes in UTF8 to allow proper inclusion of UTF8 documentation from WSDL
------------------------------------------------------------------------
r95 | kutterma | 2007-07-23 10:26:59 +0200 (Mo, 23 Jul 2007) | 1 line
- typo
------------------------------------------------------------------------
r94 | kutterma | 2007-07-23 10:11:46 +0200 (Mo, 23 Jul 2007) | 1 line
- 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
------------------------------------------------------------------------
+501
View File
@@ -0,0 +1,501 @@
Release notes for SOAP::WSDL 2.00_24
-------
I'm proud to present a new pre-release version of SOAP::WSDL.
SOAP::WSDL is a toolkit for creating WSDL-based SOAP client interfaces in perl.
Features:
* WSDL based SOAP client
o SOAP1.1 support
o Supports document/literal message style/encoding
* Code generator for generating WSDL-based interface classes
o Generated code includes usage documentation for the web service interface
* Easy-to use API
o Automatically encodes perl data structures as message data
o Automatically sets HTTP headers right
* Efficient documentation
o SOAP::WSDL::Manual guides you at getting your work done, not at
the module's internals
* Thorough test suite
o SOAP::WSDL is heavily regression tested, with a test coverage of
over 95% (excluding documentation - you wouldn't want to read
through it all).
* SOAP::Lite like look and feel
o Where possible, SOAP::WSDL mimics SOAP::Lite's API to allow easy migrations
* XML schema based class library for creating data objects
* High-performance XML parser
* Plugin support. SOAP::WSDL can be extended through plugins in various aspects.
The following plugins are supported:
o Transport plugins via SOAP::WSDL::Factory::Transport
o Serializer plugins via SOAP::WSDL::Factory::Serializer
o Deserializer plugins via SOAP::WSDL::Factory::Serializer
The following changes have been made:
2.00_25
---
WARNING: INCOMPATIBLE CHANGE:
SOAP::WSDL now uses Class::Std::Fast. Read the MIGRATING guide for
upgrading from previous versions.
You probably need to re-generate all your interfaces.
WARNING: INCOMPATIBLE CHANGE:
SOAP::WSDL::XSD::Typelib::anySimpleType based objects no longer serialize
to their XML value on stringification.
This means that strings are no longer XML-escaped when the simpleType
containing the string is printed or used like this:
my $value = "$simpleType";
Note that ComplexType objects still serialize to their XML on
stringification. This Change is due to the demands of applications
embedding SOAP::WSDL::XSD::Typelib objects in templates - it would mean
a nasty ->get_value for every (simple) value.
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1837347 ] Use Class::Std::Fast
Class::Std::Fast allows optimizations which almost double SOAP::WSDL's
performance and reduce code size. Class::Std::Fast also opens the door
for even faster XS implementations.
* [ 1842436 ] Add SOAP Server
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
* [ 1842418 ] Message parser eats up whitespaces between entities
* [ 1839820 ] encoding parameter of Content-Type header set incorrectly
* [ 1839851 ] token in UPPERCASE in default typemap
* [ 1839690 ] Can't use two prefixes for namespace in WSDL
* [ 1839833 ] incorrect encoding/decoding of double-quote
The following uncategorized improvements have been made:
* Errors in typemap generation have been fixed
* XML parser speedups
* The test suite has been improved
2.00_24
---
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1832998 ] Make interface methods complain when called as class method
* [ 1826833 ] listify all XSD type objects when called as @{}
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
* #30685: Error in MessageParser when using __SKIP__ in typemap
* [ 1831398 ] Badd class names for atomic typed elements
* [ 1828240 ] POD Defects
* [ 1792348 ] 006_client.t requires SOAP::Lite (again)
The following uncategorized improvements have been made:
* The test suite has been improved
* Documentation has been improved
2.00_23
---
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1826382 ] nillable elements not serialized as xsi:nil
* [ 1826337 ] Second element in complexType gets eaten up
* [ 1792348 ] 006_client.t requires SOAP::Lite (again)
The following uncategorized improvements have been made:
* Test for complexType containing element with atomic simpleType added
2.00_22
----
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1817697 ] Dots in service/port names lead to broken interfaces
* [ 1817699 ] Templates not found on all OS
The following uncategorized improvements have been made:
* Code cleanup. The XSD library has been cleaned up a bit. Should result
in a minor speedup in serializing and deserializing XML messages,
2.00_21 - not released
----
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1810058 ] .tt's pod indexed on CPAN (again)
* [ 1809284 ] Rename SOAP::WSDL::Deserializer::SOAP11 to ::XSD
The following uncategorized improvements have been made:
* Requires at least perl 5.8.0. This is due to a bug in perls before -
see http://aspn.activestate.com/ASPN/Mail/Message/perl5-porters/929746
2.00_20
----
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1815646 ] Only include last part of port name in interface
* [ 1815648 ] Methods with empty body cannot be called as ->method()
* [ 1815651 ] Empty complexType definitions not supported
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1815643 ] ComplexTypes cannot be freezed/thawed
The following uncategorized improvements have been made:
* WSDL definitions are decoded into utf8
* fixed tests to use correct path on windows
2.00_19
----
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1810395 ] Implement complexType complexContent extension
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1813144 ] Typemap not used in interface class
* [ 1810058 ] .tt's pod indexed on CPAN
The following uncategorized improvements have been made:
* Documentation improvements
2.00_18
----
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1790983 ] Create generator Plugin API
Generator factory is SOAP::WSDL::Factory::Generator
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1805252 ] t/SOAP/WSDL/XSD/Typelib/Builtin/004_time.t fails
The default timezone conversion has been fixed.
The following uncategorized improvements have been made:
* Documentation improvements
* Test updates
* readable() has been converted into a no-op, as it already had no effect
any more
2.00_17
----
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1772617 ] SOAP Header not working
Added header support. Currently, SOAP headers are only supported with
the SOM or the XSD (SOAP11) serializer.
* [ 1805238 ] Tests in t/SOAP/WSDL don't work when run from t/
* [ 1805241 ] explain() broken in SOAP::WSDL
explain has been removed from SOAP::WSDL
The following uncategorized improvements have been made:
* Added limited support for complexType complexContent content model with
restriction variety.
SOAP::WSDL now supports this XML Schema definition variant, although no
constraints are imposed on derived types yet.
Derived types do not serialize with a xsi:type attribute (and the xsi:type
attribute is not recognized by the XML parser), so you cannot use derived
types as a substitute for theri parent, yet.
* Added support for complexType choice variety
complexType definitions using the choice variety are now supported,
even though the content is not checked (if you pass in invalid data,
invalid XML will be generated).
* Added Loopback Transport backend.
SOAP::WSDL::Tranport::Loopback just returns the request as respons, but
allows testing the whole chain from user interface to transport backend.
* Fixed SOAP::WSDL::Factory::Transport prefer user-registered
transport backend
* Fixed set_soap_version method in SOAP::WSDL::Client.
Re-setting the SOAP version now invalidates (resets) serializer and
deserializer, but not the transport backend.
* Fixed SOAP::WSDL::XSD::Typelib::Builtin::boolean to return false
when false and true when true.
* SOAP::WSDL::XSD::Typelib::Builtin::normalizedString now replaces all
occurences of tab, newline and carriage return by whitespce on set_value.
* Code cleanup
o Lots of orphan methods now replaced by the SOAP::WSDL::Generator
hierarchy have been removed.
o Unused (and unusable) readable option checking has been removed in
SOAP::WSDL::Serializer::SOAP11.
o Unused XML Schema facet attributes have been removed from XSD Builtin
classes
o Methods common to all expat parser classes have been factored out
into a common base class.
* XML serialization speedup for SOAP::WSDL::XSD::* objects
* Tests added to improve test coverage.
* A few documentation errors have been fixed
* Misspelled default Typemap and Interface prefixes have been corrected
2.00_16
----
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1761532 ] Support embedded atomic types
SOAP::WSDL now supports a greater variety of XML Schema type definitions.
Note that XML Schema support is still incomplete, though.
* [ 1797943 ] Create Perl Hash Deserializer
There's a new deserializer which outputs perl hashes as data structures.
Much like XML::Simple, but faster. No XML Attribute support, though.
* [ 1797678 ] Move Code generator from WSDL::Definitions to separate class
* [ 1803330 ] Create one interface per port
SOAP::WSDL now creates one interface per port, not one per service.
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1804441 ] parts from binding not regarded in SOAP::WSDL
SOAP::WSDL (interpreter mode) now respects the body parts specified in the
binding.
* [ 1803763 ] nonNegativeInteger misspelled in Schema::Builtin
* [ 1793965 ] _expand() does not work on non-root-node ns declarations
* [ 1792348 ] 006_client.t requires SOAP::Lite in 2.00_15
SOAP::WSDL no longer attempts to load SOAP::WSDL::Deserializer::SOM when
no_dispatch is set.
006_client.t now sets outputxml(1), to be really sure.
The following uncategorized improvements have been made:
* Code generator only generates interface for the first port in a service
The code generator now generates interfaces for all ports.
Note: The naming scheme has changed. It is now
InterfacePrefix::Service::Port
* XML Parser speedup
The XML parser has received a little speedup.
* A number of errors in parsing / traversing WSDL documents have been
corrected.
* Documentation has been improved
* A number of (incorrect, but passing) tests have been fixed.
* Code cleanup: The SOAP::WSDL::SAX* modules are no longer included, as they
are not supported any more. They can still be found in SOAP::WSDL's
subversion repository in the attic directory, though.
2.00_15
----
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1792321 ] 2.00_14 requires SOAP::Lite for passing tests
2.00_14
----
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1792235 ] SOAP::WSDL::Transport::Test missing from 2.00_13
The package has been re-added
* [ 1792221 ] class_resolver not set from ::Client in 2.00_13
Changed to set class_resolver correctly.
The following uncategorized improvements have been made:
* The ::SOM deserializer has been simplified to be just a subclass
of SOAP::Deserializer from SOAP::Lite
* Factories now emit more useful error messages when no class is registered
for the protocol/soap_version requested
* Documentation has been improved
- refined ::Factory:: modules' documentation
* Several tests have been added
* XSD classes have been improved for testability
2.00_13
----
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1790619 ] Test transport backend
A test transport backend has been implemented (SOAP::WSDL::Transport::Test).
It returns the contents from a file and discards the response.
The filename is determined from the soap_action field.
* [ 1785196 ] Replace outputsom(1) by deserializer plugin
outputsom(1) in SOAP::WSDL is now implemented via using the deserializer
plugin SOAP::WSDL::Deserializer::SOM.
* [1785195] Support deserializer plugins
Deserializer plugin API added via SOAP::WSDL::Factory::Deserializer.
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [1789581] Support ComplexType mixed
WSDL parser now supports using the mixed="true" attribute in complexType
definitions. Mixed content in messages is only supported via SOAP::SOM yet.
* [1787975] 016_client_object.t fails due to testing XML as string
Removed string test.
* [1787959] Test wsdl seems to be broken
Corrected typo.
* [1787955] ::XSD::Typelib::date is broken
SOAP::WSDL::XSD::Typelib::Builtin::date now converts time-zoned dates properly,
and adds the local time zone if none is given.
* [1785646] SOAPAction header not set from soap:operation soapAction
SOAP::WSDL now sets the SOAPAction header correctly.
The following uncategorized improvements have been made:
* Documentation improvements
2.00_12
----
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [1787146] SOAP::WSDL still uses XML::LibXML
The superficious usage of XML::LibXML has been removed. XML::LibXML with
sax filter has been replaced by SOAP::WSDL::Expat::WSDLParser.
* [1787054] Test suite requires XML::LibXML in 2.00_11
The test suite no longer requires XML::LibXML to pass.
* [1785678] SOAP envelope not checked for namespace
The SOAP envelope is now checked for the correct namespace.
* [1786644] SOAP::WSDL::Manual - doc error
Documentation improvements
The following uncategorized improvements have been made
* The SOAPAction header is now alway quoted (R1109 in WS-I BP 1.0).
2.00_11
----
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [1767963] Transport plugins via SOAP::WSDL::Factory::Transport.
SOAP::WSDL uses SOAP::Lite's tranport modules as default, with a
lightweight HTTP(S) transport plugin as fallback.
Custom transport modules can be registered via SOAP::WSDL::Factory::Transport.
* [ 1772730 ] Serializer plugins via SOAP::WSDL::Factory::Serializer
The default serializer for SOAP1.1 is SOAP::WSDL::Serializer::SOAP11.
Custom serializers classes can be registered via
SOAP::WSDL::Factory::Serializer or set via SOAP::WSDL's set_serializer
method.
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
* [ 1764854 ] Port WSDL parser to expat and remove XML::LibXML dependency
SOAP::WSDL now requires only XML::Parser to be installed.
XML::LibXML is not required any more, though XML::LibXML based modules still
exist.
The following uncategorized improvements have been made
* The number of dependencies has been reduced. SOAP::WSDL no longer requires the
following modules to be installed:
- XML::SAX::Base
- XML::SAX::ParserFactory
- Pod::Simple::Text
- XML::LibXML
* The missing prerequisite Template has been added.
* Documentation has been improved:
- WS-I Compliance document added.
2.00_10
----
* Changed Makefile.PL to use Module::Build (passthrough mode)
* fixed element ref="" handling
2.00_09
----
* SOAP::WSDL::XSD::Typelib::Builtin::boolean objects now return their numerical
value in bool context, not "true" or "false" (always true...)
* date/time test are now timezone-sensitive
* examples added
2.00_08
---
* SOAP::WSDL::XSD::Typelib::ComplexType objects now check the class of their
child objects.
This provides early feedback to developers.
* SOAP message parser can skip unwanted parts of the message to improve parsing
speed - see SOAP::WSDL::Expat::MessageParser for details.
* HTTP Content-Type is configurable
* SOAP::WSDL::XSD::Typelib::ComplexType based objects accept any combination of
hash refs, list refs and objects as parameter to set_value() and new().
* SOAP::WSDL::XSD::Typelib::Builtin::dateTime and ::date convert date
strings into XML date strings
* SOAP::WSDL::Definitions::create now
- converts '.' in service names to '::' (.NET class separator to perl class
separator)
- outputs Typemaps and Interface classes in UTF8 to allow proper inclusion
of UTF8 documentation from WSDL
* SOAP::WSDL::Definitions::create() includes doc in generated interface classes
* WSDLHandler now handles <wsdl:documentation> tags
* fixed explain in SimpleType, ComplexType and Element
2.00_07 and below
---
* Implemented a Code generator for creating SOAP interfaces based on WSDL definitions
* Implemented a high-speed stream based SOAP message parser
SOAP message parser returns a objects based on XML schema based class library
* Implemented a XML schema based class library
* Implemented a stream based WSDL parser.
Parses WSDL into objects. Objects can serialize data, and explain how to use the
service(s) they make up (output documentation).
+115 -29
View File
@@ -1,3 +1,6 @@
HACKING
=======
Development of SOAP::WSDL takes place on sourceforge.net. Development of SOAP::WSDL takes place on sourceforge.net.
There's a svn repository available at There's a svn repository available at
@@ -11,35 +14,118 @@ so if you feel your changes are urgent, please set up a sourceforge account
and ask me for commit permissions on the repository - I will happily accept and ask me for commit permissions on the repository - I will happily accept
you as co-author. you as co-author.
The (my) current roadmap for SOAP::WSDL is: TODO shows the current roadmap.
1.* Development of the 1.* tree has stopped - I won't get past 1.2x anymore... SOAP-WSDL CODING GUIDELINES
2.* WSDL -> Perl Class factory with offline WSDL processing ===========================
2.01 DESIGN PRINCIPLES
- WSDL support for the most common type definitions -----------------
- Online-facility (SOAP::WSDL) using WSDL object tree directly
- usable code generator SOAP-WSDL is designed for the following principles:
- full namespace support when processing WSDL
- high performance when parsing WSDL messages - get nearly as fast as 1. SPEED
XML::Simple... A SOAP toolkit is useless, if it's not fast enough. Therefore SOAP::WSDL aims
at always being fast enough.
2.02
- Support for Apache-SOAP datatypes Please benchmark any contributions - if they slow down SOAP-WSDL (especially
- support for embedded atomic simpleType/complexType definitions the XML parsing part), you should have good reasons.
- Caching of WSDL object tree + generated code (when using SOAP::WSDL).
- Online-facility (SOAP::WSDL) using code generator via cache directory 2. USABILITY
SOAP-WSDL is designed user-friendly. It tells the user whether it's
Somewhere on the TODO list (in no particular order): capable of handling some WSDL or not, it gives friendly error messages, and
if a user happens to call a non-existant method on XSD objects, they croak
- validation with a list of available methods to ease development.
- typemaps for use with the type="tns:MyComplexType" XML attribute
- external entities support when parsing WSDL 3. EXTENSIBILITY
- support all these XML Schema variants If you plan an extension, look if the extension itself should be extensible,
- support creating XML Schmema definitions via SOAP::WSDL::XSD::* ('minimal conformant') and which extension points to use.
- support other Schema definition languages than XML::Schema (maybe RelaxNG?)
- factor out SOAP::WSDL::XSD into it's own namespace (maybe just XSD ?) Creating new extension points is highly appreciated.
July 2007, 4. MAINTAINABILITY
SOAP::Lite unfortunately shows where a toolkit can go without focus on
maintainability. SOAP::WSDL tries to be highly maintainable and easy to
understand.
CODING STYLE
------------
The principles above dictate a clear, but not too lengthy coding style.
SOAP::WSDL's coding style in principle follows Perl Best Practices by
Damian Conway, but allows deviances for speed reasons
The following guidelines apply:
- Testing
* SOAP::WSDL has a test coverage of >95% and aims at 100%. Please write
a test first.
* Use author tests for testing guidelines. Disable author tests for
users - it's time consuming and of no use to have users run author tests.
- Indentation and formatting
* indent with spaces.
* indent 4 characters per level
* use \n (LF) for newlines, not CRLF
* use blank lines to separate paragraphs
* Coding style is similar to K&R (opening brace on last line, closing
brace on new line. No cuddled else)
* No trailing spaces allowed (except to indicate a blank line in a POD
source block)
- Flow control
* postfix if is allowed for single statements only. Preferably for flow
control only.
* postfix for, while, until are not allowed.
* unless is not allowed at all. Use if not.
* goto is only allowed for jumping into subs. Nothing else.
* redo, next, last etc. are preferred over goto.
- Strictness and Warnings
* always use strict and warnings. Switch off for the smallest block
possible, but switch of if there's a reason (don't let tools like
perlcritic fool you: no strict qw(refs); is often required.
- Naming
* variable names are lower case with _ separating words, except when
a XML Schema, SOAP, or WSDL name is name-giving (don't force portType to
become port_type)
* hashes should be named FOO_of, lists FOO_from, references FOO_ref.
* package names are CamelCase, except when a XML, SOAP or WSDL name is
name-giving (don't force 'int' to become 'Int'. However, simpleType
becomes SimpleType).
- Subroutines
* Subroutines shouldn't be more than around 50 lines long
* @_ should be unpacked. Deviances are allowed for speed reasons. If
you're not unpacking @_ in a sub of say, 5 lines or more, please comment
what you're doing.
* Always return. Always return. A single "return" allows perl to execute
the subroutine in question in void context, which saves it from putting
it's result in a temporary variable. Always return.
- POD and comments
* Comment extensively. Comments are the maintainer (and core developer's)
documentation - aid them where possible (your're probably doing yourself
a favor by adding extensive comments).
* Comment either in blocks or as hanging side comments (especially when
commenting @_ access).
Example:
sub baz {
# @_ not unpacked for speed reasons. Read:
# my ($self, $something, %args_of) = @_;
$_[0]->bar($_[1]); # read as $self->bar($something);
$_[0]->foo($_[2..$#]); # read as $self->foo(%args_of);
return;
}
* POD is located at end of file, preferably after __END__
* Complete POD coverage is essential. However, if the package in question
is used internally only, it's better to omit the POD completely - too many
PODs to look at confuse the average CPAN user.
July - November 2007,
Martin Kutter Martin Kutter
+7 -7
View File
@@ -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.
+351 -188
View File
@@ -1,188 +1,351 @@
bin/wsdl2perl.pl benchmark/01_expat.t
Build.PL benchmark/hello.pl
CHANGES benchmark/XSD/01_anyType.t
example/fortune.pl benchmark/XSD/02_anySimpleType.t
example/lib/MyElements/CountCookies.pm benchmark/XSD/03_string.t
example/lib/MyElements/CountCookiesResponse.pm bin/wsdl2perl.pl
example/lib/MyElements/GetCitiesByCountry.pm Build.PL
example/lib/MyElements/GetCitiesByCountryResponse.pm Changes
example/lib/MyElements/GetFortuneCookie.pm example/cgi-bin/helloworld.pl
example/lib/MyElements/GetFortuneCookieResponse.pm example/fortune.pl
example/lib/MyElements/GetSpecificCookie.pm example/genericbarcode.pl
example/lib/MyElements/GetSpecificCookieResponse.pm example/hello.pl
example/lib/MyElements/GetWeather.pm example/hello_compile.pl
example/lib/MyElements/GetWeatherResponse.pm example/hello_lite.pl
example/lib/MyElements/int.pm example/lib/MyElements/CountCookies.pm
example/lib/MyElements/readNodeCount.pm example/lib/MyElements/CountCookiesResponse.pm
example/lib/MyElements/readNodeCountResponse.pm example/lib/MyElements/GenerateBarCode.pm
example/lib/MyElements/string.pm example/lib/MyElements/GenerateBarCodeResponse.pm
example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie.pm example/lib/MyElements/GetCitiesByCountry.pm
example/lib/MyInterfaces/GlobalWeather.pm example/lib/MyElements/GetCitiesByCountryResponse.pm
example/lib/MyTypemaps/FullerData_x0020_Fortune_x0020_Cookie.pm example/lib/MyElements/GetFortuneCookie.pm
example/lib/MyTypemaps/GlobalWeather.pm example/lib/MyElements/GetFortuneCookieResponse.pm
example/weather.pl example/lib/MyElements/GetSpecificCookie.pm
example/weather_wsdl.pl example/lib/MyElements/GetSpecificCookieResponse.pm
example/wsdl/FortuneCookie.xml example/lib/MyElements/GetWeather.pm
example/wsdl/genericbarcode.xml example/lib/MyElements/GetWeatherResponse.pm
example/wsdl/globalweather.xml example/lib/MyElements/int.pm
HACKING example/lib/MyElements/readNodeCount.pm
lib/SOAP/WSDL.pm example/lib/MyElements/readNodeCountResponse.pm
lib/SOAP/WSDL/Base.pm example/lib/MyElements/sayHello.pm
lib/SOAP/WSDL/Binding.pm example/lib/MyElements/sayHelloResponse.pm
lib/SOAP/WSDL/Client.pm example/lib/MyElements/string.pm
lib/SOAP/WSDL/Client/Base.pm example/lib/MyInterfaces/BarCode/BarCodeSoap.pm
lib/SOAP/WSDL/Definitions.pm example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie/FullerData_x0020_Fortune_x0020_CookieSoap.pm
lib/SOAP/WSDL/Envelope.pm example/lib/MyInterfaces/GlobalWeather/GlobalWeatherSoap.pm
lib/SOAP/WSDL/Expat/MessageParser.pm example/lib/MyInterfaces/HelloWorld/HelloWorldSoap.pm
lib/SOAP/WSDL/Expat/MessageStreamParser.pm example/lib/MyServer/HelloWorld/HelloWorldSoap.pm
lib/SOAP/WSDL/Manual.pod example/lib/MyTypemaps/BarCode.pm
lib/SOAP/WSDL/Manual/Glossary.pod example/lib/MyTypemaps/FullerData_x0020_Fortune_x0020_Cookie.pm
lib/SOAP/WSDL/Message.pm example/lib/MyTypemaps/GlobalWeather.pm
lib/SOAP/WSDL/Operation.pm example/lib/MyTypemaps/HelloWorld.pm
lib/SOAP/WSDL/OpMessage.pm example/lib/MyTypes/test2.pm
lib/SOAP/WSDL/Parser.pod example/lib/MyTypes/testExtended.pm
lib/SOAP/WSDL/Part.pm example/visitor/visitor.pl
lib/SOAP/WSDL/Port.pm example/weather.pl
lib/SOAP/WSDL/PortType.pm example/weather_wsdl.pl
lib/SOAP/WSDL/SAX/MessageHandler.pm example/wsdl/11_helloworld.wsdl
lib/SOAP/WSDL/SAX/WSDLHandler.pm example/wsdl/FortuneCookie.xml
lib/SOAP/WSDL/Service.pm example/wsdl/genericbarcode.xml
lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm example/wsdl/globalweather.xml
lib/SOAP/WSDL/SoapOperation.pm HACKING
lib/SOAP/WSDL/TypeLookup.pm lib/SOAP/WSDL.pm
lib/SOAP/WSDL/Types.pm lib/SOAP/WSDL/Base.pm
lib/SOAP/WSDL/XSD/Builtin.pm lib/SOAP/WSDL/Binding.pm
lib/SOAP/WSDL/XSD/ComplexType.pm lib/SOAP/WSDL/Client.pm
lib/SOAP/WSDL/XSD/Element.pm lib/SOAP/WSDL/Client/Base.pm
lib/SOAP/WSDL/XSD/Schema.pm lib/SOAP/WSDL/Definitions.pm
lib/SOAP/WSDL/XSD/Schema/Builtin.pm lib/SOAP/WSDL/Deserializer/Hash.pm
lib/SOAP/WSDL/XSD/SimpleType.pm lib/SOAP/WSDL/Deserializer/SOM.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin.pm lib/SOAP/WSDL/Deserializer/XSD.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm lib/SOAP/WSDL/Expat/Base.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm lib/SOAP/WSDL/Expat/Message2Hash.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm lib/SOAP/WSDL/Expat/MessageParser.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/base64Binary.pm lib/SOAP/WSDL/Expat/MessageStreamParser.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/boolean.pm lib/SOAP/WSDL/Expat/WSDLParser.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/byte.pm lib/SOAP/WSDL/Factory/Deserializer.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/date.pm lib/SOAP/WSDL/Factory/Generator.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.pm lib/SOAP/WSDL/Factory/Serializer.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/decimal.pm lib/SOAP/WSDL/Factory/Transport.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/double.pm lib/SOAP/WSDL/Generator/Template.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/duration.pm lib/SOAP/WSDL/Generator/Template/XSD.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm lib/SOAP/WSDL/Generator/Template/XSD/_type_class.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/float.pm lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/gDay.pm lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonth.pm lib/SOAP/WSDL/Generator/Template/XSD/complexType/atomicTypes.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonthDay.pm lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/gYear.pm lib/SOAP/WSDL/Generator/Template/XSD/complexType/contentModel.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/gYearMonth.pm lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/hexBinary.pm lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/all.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/ID.pm lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/choice.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/IDREF.pm lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/complexContent.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/IDREFS.pm lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/restriction.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/int.pm lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/structure.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/integer.pm lib/SOAP/WSDL/Generator/Template/XSD/complexType/restriction.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/language.pm lib/SOAP/WSDL/Generator/Template/XSD/complexType/variety.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/list.pm lib/SOAP/WSDL/Generator/Template/XSD/element.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/long.pm lib/SOAP/WSDL/Generator/Template/XSD/element/POD/structure.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/Name.pm lib/SOAP/WSDL/Generator/Template/XSD/Interface.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/NCName.pm lib/SOAP/WSDL/Generator/Template/XSD/Interface/Body.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/negativeInteger.pm lib/SOAP/WSDL/Generator/Template/XSD/Interface/Header.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKEN.pm lib/SOAP/WSDL/Generator/Template/XSD/Interface/Operation.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKENS.pm lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Element.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/nonNegativeInteger.pm lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Message.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/nonPositiveInteger.pm lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/method_info.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/normalizedString.pm lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Operation.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/NOTATION.pm lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Part.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/positiveInteger.pm lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Type.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/QName.pm lib/SOAP/WSDL/Generator/Template/XSD/Server.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/short.pm lib/SOAP/WSDL/Generator/Template/XSD/Server/POD/Message.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/string.pm lib/SOAP/WSDL/Generator/Template/XSD/Server/POD/method_info.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/time.pm lib/SOAP/WSDL/Generator/Template/XSD/Server/POD/Operation.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/token.pm lib/SOAP/WSDL/Generator/Template/XSD/Server/POD/OutPart.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedByte.pm lib/SOAP/WSDL/Generator/Template/XSD/simpleType.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedInt.pm lib/SOAP/WSDL/Generator/Template/XSD/simpleType/atomicType.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedLong.pm lib/SOAP/WSDL/Generator/Template/XSD/simpleType/contentModel.tt
lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm lib/SOAP/WSDL/Generator/Template/XSD/simpleType/list.tt
lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/list.tt
lib/SOAP/WSDL/XSD/Typelib/Element.pm lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/restriction.tt
lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/structure.tt
LICENSE lib/SOAP/WSDL/Generator/Template/XSD/simpleType/restriction.tt
MANIFEST This list of files lib/SOAP/WSDL/Generator/Template/XSD/Typemap.tt
META.yml lib/SOAP/WSDL/Generator/Visitor.pm
README lib/SOAP/WSDL/Generator/Visitor/Typelib.pm
t/001_use.t lib/SOAP/WSDL/Generator/Visitor/Typemap.pm
t/002_sax.t lib/SOAP/WSDL/Manual.pod
t/003_sax_serializer.t lib/SOAP/WSDL/Manual/Deserializer.pod
t/004_sax_wsdl.t lib/SOAP/WSDL/Manual/Glossary.pod
t/005_sax_contributed_wsdl.t lib/SOAP/WSDL/Manual/Parser.pod
t/006_client.t lib/SOAP/WSDL/Manual/Serializer.pod
t/007_envelope.t lib/SOAP/WSDL/Manual/WS_I.pod
t/008_client_wsdl_complexType.t lib/SOAP/WSDL/Manual/XSD.pod
t/009_data_classes.t lib/SOAP/WSDL/Message.pm
t/011_simpleType.t lib/SOAP/WSDL/Operation.pm
t/012_element.t lib/SOAP/WSDL/OpMessage.pm
t/013_complexType.t lib/SOAP/WSDL/Part.pm
t/014_sax_typelib.t lib/SOAP/WSDL/Port.pm
t/015_to_typemap.t lib/SOAP/WSDL/PortType.pm
t/016_client_object.t lib/SOAP/WSDL/Serializer/XSD.pm
t/017_generator.t lib/SOAP/WSDL/Server.pm
t/018_generator.t lib/SOAP/WSDL/Server/CGI.pm
t/020_storable.t lib/SOAP/WSDL/Service.pm
t/098_pod.t lib/SOAP/WSDL/SOAP/Address.pm
t/acceptance/results/03_complexType-all.xml lib/SOAP/WSDL/SOAP/Body.pm
t/acceptance/results/03_complexType-sequence.xml lib/SOAP/WSDL/SOAP/Header.pm
t/acceptance/results/04_element-simpleType.xml lib/SOAP/WSDL/SOAP/HeaderFault.pm
t/acceptance/results/04_element.xml lib/SOAP/WSDL/SOAP/Operation.pm
t/acceptance/results/05_simpleType-list.xml lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm
t/acceptance/results/05_simpleType-restriction.xml lib/SOAP/WSDL/Transport/HTTP.pm
t/acceptance/results/05_simpleType-union.xml lib/SOAP/WSDL/Transport/Loopback.pm
t/acceptance/results/11_helloworld.xml lib/SOAP/WSDL/Transport/Test.pm
t/acceptance/wsdl/006_sax_client.wsdl lib/SOAP/WSDL/TypeLookup.pm
t/acceptance/wsdl/008_complexType.wsdl lib/SOAP/WSDL/Types.pm
t/acceptance/wsdl/02_port.wsdl lib/SOAP/WSDL/XSD/Builtin.pm
t/acceptance/wsdl/03_complexType-all.wsdl lib/SOAP/WSDL/XSD/ComplexType.pm
t/acceptance/wsdl/03_complexType-sequence.wsdl lib/SOAP/WSDL/XSD/Element.pm
t/acceptance/wsdl/04_element-simpleType.wsdl lib/SOAP/WSDL/XSD/Schema.pm
t/acceptance/wsdl/04_element.wsdl lib/SOAP/WSDL/XSD/Schema/Builtin.pm
t/acceptance/wsdl/05_simpleType-list.wsdl lib/SOAP/WSDL/XSD/SimpleType.pm
t/acceptance/wsdl/05_simpleType-restriction.wsdl lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
t/acceptance/wsdl/05_simpleType-union.wsdl lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
t/acceptance/wsdl/10_helloworld.asmx.xml lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
t/acceptance/wsdl/11_helloworld.wsdl lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm
t/acceptance/wsdl/contributed/Axis.wsdl lib/SOAP/WSDL/XSD/Typelib/Builtin/base64Binary.pm
t/acceptance/wsdl/contributed/ETest.wsdl lib/SOAP/WSDL/XSD/Typelib/Builtin/boolean.pm
t/acceptance/wsdl/contributed/OITest.wsdl lib/SOAP/WSDL/XSD/Typelib/Builtin/byte.pm
t/acceptance/wsdl/contributed/tools.wsdl lib/SOAP/WSDL/XSD/Typelib/Builtin/date.pm
t/acceptance/wsdl/email_account.wsdl lib/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.pm
t/Expat/01_expat.t lib/SOAP/WSDL/XSD/Typelib/Builtin/decimal.pm
t/lib/MyComplexType.pm lib/SOAP/WSDL/XSD/Typelib/Builtin/double.pm
t/lib/MyElement.pm lib/SOAP/WSDL/XSD/Typelib/Builtin/duration.pm
t/lib/MySimpleType.pm lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm
t/lib/Test/SOAPMessage.pm lib/SOAP/WSDL/XSD/Typelib/Builtin/float.pm
t/lib/Typelib/Base.pm lib/SOAP/WSDL/XSD/Typelib/Builtin/gDay.pm
t/lib/Typelib/TEnqueueMessage.pm lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonth.pm
t/lib/Typelib/TMessage.pm lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonthDay.pm
t/SOAP/WSDL/01_use.t lib/SOAP/WSDL/XSD/Typelib/Builtin/gYear.pm
t/SOAP/WSDL/02_port.t lib/SOAP/WSDL/XSD/Typelib/Builtin/gYearMonth.pm
t/SOAP/WSDL/03_complexType-all.t lib/SOAP/WSDL/XSD/Typelib/Builtin/hexBinary.pm
t/SOAP/WSDL/03_complexType-choice.t lib/SOAP/WSDL/XSD/Typelib/Builtin/ID.pm
t/SOAP/WSDL/03_complexType-complexContent.t lib/SOAP/WSDL/XSD/Typelib/Builtin/IDREF.pm
t/SOAP/WSDL/03_complexType-group.t lib/SOAP/WSDL/XSD/Typelib/Builtin/IDREFS.pm
t/SOAP/WSDL/03_complexType-sequence.t lib/SOAP/WSDL/XSD/Typelib/Builtin/int.pm
t/SOAP/WSDL/03_complexType-simpleContent.t lib/SOAP/WSDL/XSD/Typelib/Builtin/integer.pm
t/SOAP/WSDL/04_element-complexType.t lib/SOAP/WSDL/XSD/Typelib/Builtin/language.pm
t/SOAP/WSDL/04_element-simpleType.t lib/SOAP/WSDL/XSD/Typelib/Builtin/list.pm
t/SOAP/WSDL/04_element.t lib/SOAP/WSDL/XSD/Typelib/Builtin/long.pm
t/SOAP/WSDL/05_simpleType-list.t lib/SOAP/WSDL/XSD/Typelib/Builtin/Name.pm
t/SOAP/WSDL/05_simpleType-restriction.t lib/SOAP/WSDL/XSD/Typelib/Builtin/NCName.pm
t/SOAP/WSDL/05_simpleType-union.t lib/SOAP/WSDL/XSD/Typelib/Builtin/negativeInteger.pm
t/SOAP/WSDL/10_performance.t lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKEN.pm
t/SOAP/WSDL/11_helloworld.NET.t lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKENS.pm
t/SOAP/WSDL/12_binding.pl lib/SOAP/WSDL/XSD/Typelib/Builtin/nonNegativeInteger.pm
t/SOAP/WSDL/XSD/Typelib/Builtin/001_string.t lib/SOAP/WSDL/XSD/Typelib/Builtin/nonPositiveInteger.pm
t/SOAP/WSDL/XSD/Typelib/Builtin/002_dateTime.t lib/SOAP/WSDL/XSD/Typelib/Builtin/normalizedString.pm
t/SOAP/WSDL/XSD/Typelib/Builtin/002_time.t lib/SOAP/WSDL/XSD/Typelib/Builtin/NOTATION.pm
t/SOAP/WSDL/XSD/Typelib/Builtin/003_date.t lib/SOAP/WSDL/XSD/Typelib/Builtin/positiveInteger.pm
TODO lib/SOAP/WSDL/XSD/Typelib/Builtin/QName.pm
Makefile.PL lib/SOAP/WSDL/XSD/Typelib/Builtin/short.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/string.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/time.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/token.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedByte.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedInt.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedLong.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
lib/SOAP/WSDL/XSD/Typelib/Element.pm
lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
LICENSE
Makefile.PL
MANIFEST This list of files
META.yml
MIGRATING
README
t/001_use.t
t/002_parse_wsdl.t
t/003_wsdl_based_serializer.t
t/004_parse_wsdl.t
t/006_client.t
t/007_envelope.t
t/008_client_wsdl_complexType.t
t/009_data_classes.t
t/011_simpleType.t
t/012_element.t
t/013_complexType.t
t/016_client_object.t
t/017_generator.t
t/020_storable.t
t/096_characters.t
t/097_kwalitee.t
t/098_pod.t
t/099_pod_coverage.t
t/acceptance/results/03_complexType-all.xml
t/acceptance/results/03_complexType-sequence.xml
t/acceptance/results/04_element-simpleType.xml
t/acceptance/results/04_element.xml
t/acceptance/results/05_simpleType-list.xml
t/acceptance/results/05_simpleType-restriction.xml
t/acceptance/results/05_simpleType-union.xml
t/acceptance/results/11_helloworld.xml
t/acceptance/wsdl/006_sax_client.wsdl
t/acceptance/wsdl/008_complexType.wsdl
t/acceptance/wsdl/02_port.wsdl
t/acceptance/wsdl/03_complexType-all.wsdl
t/acceptance/wsdl/03_complexType-element-ref.wsdl
t/acceptance/wsdl/03_complexType-sequence.wsdl
t/acceptance/wsdl/04_element-simpleType.wsdl
t/acceptance/wsdl/04_element.wsdl
t/acceptance/wsdl/05_simpleType-list.wsdl
t/acceptance/wsdl/05_simpleType-restriction.wsdl
t/acceptance/wsdl/05_simpleType-union.wsdl
t/acceptance/wsdl/10_helloworld.asmx.xml
t/acceptance/wsdl/11_helloworld.wsdl
t/acceptance/wsdl/contributed/Axis.wsdl
t/acceptance/wsdl/contributed/ETest.wsdl
t/acceptance/wsdl/contributed/OITest.wsdl
t/acceptance/wsdl/contributed/tools.wsdl
t/acceptance/wsdl/elementAtomicComplexType.xml
t/acceptance/wsdl/email_account.wsdl
t/acceptance/wsdl/generator_test.wsdl
t/acceptance/wsdl/generator_unsupported_test.wsdl
t/acceptance/wsdl/message_gateway.wsdl
t/Expat/01_expat.t
t/Expat/03_wsdl.t
t/lib/MyComplexType.pm
t/lib/MyElement.pm
t/lib/MySimpleType.pm
t/lib/Test/SOAPMessage.pm
t/lib/Typelib/Base.pm
t/lib/Typelib/TEnqueueMessage.pm
t/lib/Typelib/TMessage.pm
t/SOAP/WSDL.t
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/06_keep_alive.t
t/SOAP/WSDL/11_helloworld.NET.t
t/SOAP/WSDL/12_binding.t
t/SOAP/WSDL/Client/Base.t
t/SOAP/WSDL/Deserializer/Hash.t
t/SOAP/WSDL/Deserializer/SOM.t
t/SOAP/WSDL/Deserializer/XSD.t
t/SOAP/WSDL/Expat/Base.t
t/SOAP/WSDL/Factory/Deserializer.t
t/SOAP/WSDL/Factory/Serializer.t
t/SOAP/WSDL/Factory/Transport.t
t/SOAP/WSDL/Generator/Template.t
t/SOAP/WSDL/Generator/Visitor.t
t/SOAP/WSDL/Generator/Visitor/Typemap.t
t/SOAP/WSDL/Generator/XCS.t
t/SOAP/WSDL/Generator/XSD.t
t/SOAP/WSDL/Generator/XSD_unsupported.t
t/SOAP/WSDL/Server.t
t/SOAP/WSDL/Server/CGI.t
t/SOAP/WSDL/Transport/01_Test.t
t/SOAP/WSDL/Transport/02_HTTP.t
t/SOAP/WSDL/Transport/acceptance/test2.xml
t/SOAP/WSDL/Transport/acceptance/test3.xml
t/SOAP/WSDL/Typelib/Fault11.t
t/SOAP/WSDL/XSD/Typelib/Builtin/01_constructors.t
t/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.t
t/SOAP/WSDL/XSD/Typelib/Builtin/anyType.t
t/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.t
t/SOAP/WSDL/XSD/Typelib/Builtin/base64Binary.t
t/SOAP/WSDL/XSD/Typelib/Builtin/boolean.t
t/SOAP/WSDL/XSD/Typelib/Builtin/byte.t
t/SOAP/WSDL/XSD/Typelib/Builtin/date.t
t/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.t
t/SOAP/WSDL/XSD/Typelib/Builtin/decimal.t
t/SOAP/WSDL/XSD/Typelib/Builtin/double.t
t/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.t
t/SOAP/WSDL/XSD/Typelib/Builtin/float.t
t/SOAP/WSDL/XSD/Typelib/Builtin/hexBinary.t
t/SOAP/WSDL/XSD/Typelib/Builtin/ID.t
t/SOAP/WSDL/XSD/Typelib/Builtin/IDREF.t
t/SOAP/WSDL/XSD/Typelib/Builtin/IDREFS.t
t/SOAP/WSDL/XSD/Typelib/Builtin/int.t
t/SOAP/WSDL/XSD/Typelib/Builtin/integer.t
t/SOAP/WSDL/XSD/Typelib/Builtin/language.t
t/SOAP/WSDL/XSD/Typelib/Builtin/list.t
t/SOAP/WSDL/XSD/Typelib/Builtin/long.t
t/SOAP/WSDL/XSD/Typelib/Builtin/Name.t
t/SOAP/WSDL/XSD/Typelib/Builtin/NCName.t
t/SOAP/WSDL/XSD/Typelib/Builtin/negativeInteger.t
t/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKEN.t
t/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKENS.t
t/SOAP/WSDL/XSD/Typelib/Builtin/nonNegativeInteger.t
t/SOAP/WSDL/XSD/Typelib/Builtin/nonPositiveInteger.t
t/SOAP/WSDL/XSD/Typelib/Builtin/normalizedString.t
t/SOAP/WSDL/XSD/Typelib/Builtin/NOTATION.t
t/SOAP/WSDL/XSD/Typelib/Builtin/positiveInteger.t
t/SOAP/WSDL/XSD/Typelib/Builtin/short.t
t/SOAP/WSDL/XSD/Typelib/Builtin/string.t
t/SOAP/WSDL/XSD/Typelib/Builtin/time.t
t/SOAP/WSDL/XSD/Typelib/Builtin/token.t
t/SOAP/WSDL/XSD/Typelib/Builtin/unsignedByte.t
t/SOAP/WSDL/XSD/Typelib/Builtin/unsignedInt.t
t/SOAP/WSDL/XSD/Typelib/Builtin/unsignedLong.t
t/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.t
t/SOAP/WSDL/XSD/Typelib/ComplexType.t
t/SOAP/WSDL/XSD/Typelib/Element.t
t/SOAP/WSDL_1.wsdl
t/SOAP/WSDL_EMPTY_DEFINITIONS.wsdl
t/SOAP/WSDL_NO_BINDING.wsdl
t/SOAP/WSDL_NO_MESSAGE.wsdl
t/SOAP/WSDL_NO_PORTTYPE.wsdl
t/test.wsdl
TEST_COVERAGE
TODO
+272 -183
View File
@@ -1,183 +1,272 @@
--- ---
name: SOAP-WSDL name: SOAP-WSDL
version: 2.00_09 version: 2.00_25
author: author:
abstract: SOAP with WSDL support - 'Martin Kutter <martin.kutter@fen-net.de>'
license: artistic abstract: SOAP with WSDL support
requires: license: artistic
Class::Std: v0.0.8 resources:
Class::Std::Storable: 0 license: http://opensource.org/licenses/artistic-license.php
Date::Format: 0 requires:
Date::Parse: 0 Class::Std::Fast: !!perl/hash:version
File::Basename: 0 original: v0.0.5
File::Path: 0 qv: 1
LWP::UserAgent: 0 version:
List::Util: 0 - 0
XML::LibXML: 0 - 0
XML::Parser::Expat: 0 - 5
XML::SAX::Base: 0 Data::Dumper: 0
XML::SAX::ParserFactory: 0 Date::Format: 0
generated_by: Module::Build version 0.2808 Date::Parse: 0
meta-spec: File::Basename: 0
url: http://module-build.sourceforge.net/META-spec-v1.2.html File::Path: 0
version: 1.2 Getopt::Long: 0
provides: LWP::UserAgent: 0
SOAP::WSDL: List::Util: 0
file: lib/SOAP/WSDL.pm Template: 0
version: 2.00_09 Term::ReadKey: 0
SOAP::WSDL::Base: XML::Parser::Expat: 0
file: lib/SOAP/WSDL/Base.pm perl: 5.8.0
SOAP::WSDL::Binding: provides:
file: lib/SOAP/WSDL/Binding.pm SOAP::WSDL:
SOAP::WSDL::Client: file: lib/SOAP/WSDL.pm
file: lib/SOAP/WSDL/Client.pm version: 2.00_25
SOAP::WSDL::Client::Base: SOAP::WSDL::Base:
file: lib/SOAP/WSDL/Client/Base.pm file: lib/SOAP/WSDL/Base.pm
SOAP::WSDL::Definitions: version: 2.00_25
file: lib/SOAP/WSDL/Definitions.pm SOAP::WSDL::Binding:
SOAP::WSDL::Envelope: file: lib/SOAP/WSDL/Binding.pm
file: lib/SOAP/WSDL/Envelope.pm SOAP::WSDL::Client:
SOAP::WSDL::Expat::MessageParser: file: lib/SOAP/WSDL/Client.pm
file: lib/SOAP/WSDL/Expat/MessageParser.pm version: 2.00_25
SOAP::WSDL::Expat::MessageStreamParser: SOAP::WSDL::Client::Base:
file: lib/SOAP/WSDL/Expat/MessageStreamParser.pm file: lib/SOAP/WSDL/Client/Base.pm
SOAP::WSDL::Message: version: 2.00_25
file: lib/SOAP/WSDL/Message.pm SOAP::WSDL::Definitions:
SOAP::WSDL::OpMessage: file: lib/SOAP/WSDL/Definitions.pm
file: lib/SOAP/WSDL/OpMessage.pm version: 2.00_25
SOAP::WSDL::Operation: SOAP::WSDL::Deserializer::Hash:
file: lib/SOAP/WSDL/Operation.pm file: lib/SOAP/WSDL/Deserializer/Hash.pm
SOAP::WSDL::Part: version: 2.00_25
file: lib/SOAP/WSDL/Part.pm SOAP::WSDL::Deserializer::SOM:
SOAP::WSDL::Port: file: lib/SOAP/WSDL/Deserializer/SOM.pm
file: lib/SOAP/WSDL/Port.pm version: 2.00_24
SOAP::WSDL::PortType: SOAP::WSDL::Deserializer::XSD:
file: lib/SOAP/WSDL/PortType.pm file: lib/SOAP/WSDL/Deserializer/XSD.pm
SOAP::WSDL::SAX::MessageHandler: version: 2.00_25
file: lib/SOAP/WSDL/SAX/MessageHandler.pm SOAP::WSDL::Expat::Base:
SOAP::WSDL::SOAP::Typelib::Fault11: file: lib/SOAP/WSDL/Expat/Base.pm
file: lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm version: 2.00_24
SOAP::WSDL::Service: SOAP::WSDL::Expat::Message2Hash:
file: lib/SOAP/WSDL/Service.pm file: lib/SOAP/WSDL/Expat/Message2Hash.pm
SOAP::WSDL::SoapOperation: version: 2.00_24
file: lib/SOAP/WSDL/SoapOperation.pm SOAP::WSDL::Expat::MessageParser:
SOAP::WSDL::TypeLookup: file: lib/SOAP/WSDL/Expat/MessageParser.pm
file: lib/SOAP/WSDL/TypeLookup.pm version: 2.00_25
SOAP::WSDL::Types: SOAP::WSDL::Expat::MessageStreamParser:
file: lib/SOAP/WSDL/Types.pm file: lib/SOAP/WSDL/Expat/MessageStreamParser.pm
SOAP::WSDL::XSD::Builtin: version: 2.00_24
file: lib/SOAP/WSDL/XSD/Builtin.pm SOAP::WSDL::Factory::Deserializer:
SOAP::WSDL::XSD::ComplexType: file: lib/SOAP/WSDL/Factory/Deserializer.pm
file: lib/SOAP/WSDL/XSD/ComplexType.pm version: 2.00_24
SOAP::WSDL::XSD::Element: SOAP::WSDL::Factory::Generator:
file: lib/SOAP/WSDL/XSD/Element.pm file: lib/SOAP/WSDL/Factory/Generator.pm
SOAP::WSDL::XSD::Schema: version: 2.00_24
file: lib/SOAP/WSDL/XSD/Schema.pm SOAP::WSDL::Factory::Serializer:
SOAP::WSDL::XSD::Schema::Builtin: file: lib/SOAP/WSDL/Factory/Serializer.pm
file: lib/SOAP/WSDL/XSD/Schema/Builtin.pm version: 2.00_24
SOAP::WSDL::XSD::SimpleType: SOAP::WSDL::Factory::Transport:
file: lib/SOAP/WSDL/XSD/SimpleType.pm file: lib/SOAP/WSDL/Factory/Transport.pm
SOAP::WSDL::XSD::Typelib::Builtin: version: 2.00_25
file: lib/SOAP/WSDL/XSD/Typelib/Builtin.pm SOAP::WSDL::Generator::Template:
SOAP::WSDL::XSD::Typelib::Builtin::ENTITY: file: lib/SOAP/WSDL/Generator/Template.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm version: 2.00_25
SOAP::WSDL::XSD::Typelib::Builtin::ID: SOAP::WSDL::Generator::Template::XSD:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/ID.pm file: lib/SOAP/WSDL/Generator/Template/XSD.pm
SOAP::WSDL::XSD::Typelib::Builtin::IDREF: version: 2.00_25
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/IDREF.pm SOAP::WSDL::Generator::Visitor:
SOAP::WSDL::XSD::Typelib::Builtin::IDREFS: file: lib/SOAP/WSDL/Generator/Visitor.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/IDREFS.pm version: 2.00_25
SOAP::WSDL::XSD::Typelib::Builtin::NCName: SOAP::WSDL::Generator::Visitor::Typelib:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NCName.pm file: lib/SOAP/WSDL/Generator/Visitor/Typelib.pm
SOAP::WSDL::XSD::Typelib::Builtin::NMTOKEN: SOAP::WSDL::Generator::Visitor::Typemap:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKEN.pm file: lib/SOAP/WSDL/Generator/Visitor/Typemap.pm
SOAP::WSDL::XSD::Typelib::Builtin::NMTOKENS: version: 2.00_25
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKENS.pm SOAP::WSDL::Message:
SOAP::WSDL::XSD::Typelib::Builtin::NOTATION: file: lib/SOAP/WSDL/Message.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NOTATION.pm SOAP::WSDL::OpMessage:
SOAP::WSDL::XSD::Typelib::Builtin::Name: file: lib/SOAP/WSDL/OpMessage.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/Name.pm SOAP::WSDL::Operation:
SOAP::WSDL::XSD::Typelib::Builtin::QName: file: lib/SOAP/WSDL/Operation.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/QName.pm SOAP::WSDL::Part:
SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType: file: lib/SOAP/WSDL/Part.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm SOAP::WSDL::Port:
SOAP::WSDL::XSD::Typelib::Builtin::anyType: file: lib/SOAP/WSDL/Port.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm SOAP::WSDL::PortType:
SOAP::WSDL::XSD::Typelib::Builtin::anyURI: file: lib/SOAP/WSDL/PortType.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm SOAP::WSDL::SOAP::Address:
SOAP::WSDL::XSD::Typelib::Builtin::base64Binary: file: lib/SOAP/WSDL/SOAP/Address.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/base64Binary.pm SOAP::WSDL::SOAP::Body:
SOAP::WSDL::XSD::Typelib::Builtin::boolean: file: lib/SOAP/WSDL/SOAP/Body.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/boolean.pm SOAP::WSDL::SOAP::Header:
SOAP::WSDL::XSD::Typelib::Builtin::byte: file: lib/SOAP/WSDL/SOAP/Header.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/byte.pm SOAP::WSDL::SOAP::HeaderFault:
SOAP::WSDL::XSD::Typelib::Builtin::date: file: lib/SOAP/WSDL/SOAP/HeaderFault.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/date.pm SOAP::WSDL::SOAP::Operation:
SOAP::WSDL::XSD::Typelib::Builtin::dateTime: file: lib/SOAP/WSDL/SOAP/Operation.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.pm version: 2.00_25
SOAP::WSDL::XSD::Typelib::Builtin::decimal: SOAP::WSDL::SOAP::Typelib::Fault11:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/decimal.pm file: lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm
SOAP::WSDL::XSD::Typelib::Builtin::double: version: 2.00_25
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/double.pm SOAP::WSDL::Serializer::XSD:
SOAP::WSDL::XSD::Typelib::Builtin::duration: file: lib/SOAP/WSDL/Serializer/XSD.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/duration.pm version: 2.00_25
SOAP::WSDL::XSD::Typelib::Builtin::float: SOAP::WSDL::Server:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/float.pm file: lib/SOAP/WSDL/Server.pm
SOAP::WSDL::XSD::Typelib::Builtin::gDay: version: 2.00_25
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gDay.pm SOAP::WSDL::Server::CGI:
SOAP::WSDL::XSD::Typelib::Builtin::gMonth: file: lib/SOAP/WSDL/Server/CGI.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonth.pm version: 2.00_25
SOAP::WSDL::XSD::Typelib::Builtin::gMonthDay: SOAP::WSDL::Service:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonthDay.pm file: lib/SOAP/WSDL/Service.pm
SOAP::WSDL::XSD::Typelib::Builtin::gYear: SOAP::WSDL::Transport::HTTP:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gYear.pm file: lib/SOAP/WSDL/Transport/HTTP.pm
SOAP::WSDL::XSD::Typelib::Builtin::gYearMonth: SOAP::WSDL::Transport::Loopback:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gYearMonth.pm file: lib/SOAP/WSDL/Transport/Loopback.pm
SOAP::WSDL::XSD::Typelib::Builtin::hexBinary: version: 2.00_25
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/hexBinary.pm SOAP::WSDL::Transport::Test:
SOAP::WSDL::XSD::Typelib::Builtin::int: file: lib/SOAP/WSDL/Transport/Test.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/int.pm version: 2.00_25
SOAP::WSDL::XSD::Typelib::Builtin::integer: SOAP::WSDL::TypeLookup:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/integer.pm file: lib/SOAP/WSDL/TypeLookup.pm
SOAP::WSDL::XSD::Typelib::Builtin::language: SOAP::WSDL::Types:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/language.pm file: lib/SOAP/WSDL/Types.pm
SOAP::WSDL::XSD::Typelib::Builtin::list: SOAP::WSDL::XSD::Builtin:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/list.pm file: lib/SOAP/WSDL/XSD/Builtin.pm
SOAP::WSDL::XSD::Typelib::Builtin::long: SOAP::WSDL::XSD::ComplexType:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/long.pm file: lib/SOAP/WSDL/XSD/ComplexType.pm
SOAP::WSDL::XSD::Typelib::Builtin::negativeInteger: version: 2.00_25
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/negativeInteger.pm SOAP::WSDL::XSD::Element:
SOAP::WSDL::XSD::Typelib::Builtin::nonNegativeInteger: file: lib/SOAP/WSDL/XSD/Element.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/nonNegativeInteger.pm version: 2.00_25
SOAP::WSDL::XSD::Typelib::Builtin::nonPositiveInteger: SOAP::WSDL::XSD::Schema:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/nonPositiveInteger.pm file: lib/SOAP/WSDL/XSD/Schema.pm
SOAP::WSDL::XSD::Typelib::Builtin::normalizedString: version: 2.00_25
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/normalizedString.pm SOAP::WSDL::XSD::Schema::Builtin:
SOAP::WSDL::XSD::Typelib::Builtin::positiveInteger: file: lib/SOAP/WSDL/XSD/Schema/Builtin.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/positiveInteger.pm SOAP::WSDL::XSD::SimpleType:
SOAP::WSDL::XSD::Typelib::Builtin::short: file: lib/SOAP/WSDL/XSD/SimpleType.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/short.pm version: 2.00_25
SOAP::WSDL::XSD::Typelib::Builtin::string: SOAP::WSDL::XSD::Typelib::Builtin:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/string.pm file: lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
SOAP::WSDL::XSD::Typelib::Builtin::time: version: 2.00_25
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/time.pm SOAP::WSDL::XSD::Typelib::Builtin::ENTITY:
SOAP::WSDL::XSD::Typelib::Builtin::token: file: lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/token.pm SOAP::WSDL::XSD::Typelib::Builtin::ID:
SOAP::WSDL::XSD::Typelib::Builtin::unsignedByte: file: lib/SOAP/WSDL/XSD/Typelib/Builtin/ID.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedByte.pm SOAP::WSDL::XSD::Typelib::Builtin::IDREF:
SOAP::WSDL::XSD::Typelib::Builtin::unsignedInt: file: lib/SOAP/WSDL/XSD/Typelib/Builtin/IDREF.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedInt.pm SOAP::WSDL::XSD::Typelib::Builtin::IDREFS:
SOAP::WSDL::XSD::Typelib::Builtin::unsignedLong: file: lib/SOAP/WSDL/XSD/Typelib/Builtin/IDREFS.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedLong.pm SOAP::WSDL::XSD::Typelib::Builtin::NCName:
SOAP::WSDL::XSD::Typelib::Builtin::unsignedShort: file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NCName.pm
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm SOAP::WSDL::XSD::Typelib::Builtin::NMTOKEN:
SOAP::WSDL::XSD::Typelib::ComplexType: file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKEN.pm
file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm SOAP::WSDL::XSD::Typelib::Builtin::NMTOKENS:
SOAP::WSDL::XSD::Typelib::Element: file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKENS.pm
file: lib/SOAP/WSDL/XSD/Typelib/Element.pm SOAP::WSDL::XSD::Typelib::Builtin::NOTATION:
SOAP::WSDL::XSD::Typelib::SimpleType: file: lib/SOAP/WSDL/XSD/Typelib/Builtin/NOTATION.pm
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm SOAP::WSDL::XSD::Typelib::Builtin::Name:
SOAP::WSDL::XSD::Typelib::SimpleType::restriction: file: lib/SOAP/WSDL/XSD/Typelib/Builtin/Name.pm
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm SOAP::WSDL::XSD::Typelib::Builtin::QName:
resources: file: lib/SOAP/WSDL/XSD/Typelib/Builtin/QName.pm
license: http://opensource.org/licenses/artistic-license.php SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
SOAP::WSDL::XSD::Typelib::Builtin::anyType:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
SOAP::WSDL::XSD::Typelib::Builtin::anyURI:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm
SOAP::WSDL::XSD::Typelib::Builtin::base64Binary:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/base64Binary.pm
SOAP::WSDL::XSD::Typelib::Builtin::boolean:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/boolean.pm
version: 2.00_23
SOAP::WSDL::XSD::Typelib::Builtin::byte:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/byte.pm
SOAP::WSDL::XSD::Typelib::Builtin::date:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/date.pm
SOAP::WSDL::XSD::Typelib::Builtin::dateTime:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/dateTime.pm
SOAP::WSDL::XSD::Typelib::Builtin::decimal:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/decimal.pm
SOAP::WSDL::XSD::Typelib::Builtin::double:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/double.pm
SOAP::WSDL::XSD::Typelib::Builtin::duration:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/duration.pm
SOAP::WSDL::XSD::Typelib::Builtin::float:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/float.pm
SOAP::WSDL::XSD::Typelib::Builtin::gDay:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gDay.pm
SOAP::WSDL::XSD::Typelib::Builtin::gMonth:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonth.pm
SOAP::WSDL::XSD::Typelib::Builtin::gMonthDay:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gMonthDay.pm
SOAP::WSDL::XSD::Typelib::Builtin::gYear:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gYear.pm
SOAP::WSDL::XSD::Typelib::Builtin::gYearMonth:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/gYearMonth.pm
SOAP::WSDL::XSD::Typelib::Builtin::hexBinary:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/hexBinary.pm
SOAP::WSDL::XSD::Typelib::Builtin::int:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/int.pm
SOAP::WSDL::XSD::Typelib::Builtin::integer:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/integer.pm
SOAP::WSDL::XSD::Typelib::Builtin::language:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/language.pm
SOAP::WSDL::XSD::Typelib::Builtin::list:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/list.pm
SOAP::WSDL::XSD::Typelib::Builtin::long:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/long.pm
SOAP::WSDL::XSD::Typelib::Builtin::negativeInteger:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/negativeInteger.pm
SOAP::WSDL::XSD::Typelib::Builtin::nonNegativeInteger:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/nonNegativeInteger.pm
SOAP::WSDL::XSD::Typelib::Builtin::nonPositiveInteger:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/nonPositiveInteger.pm
SOAP::WSDL::XSD::Typelib::Builtin::normalizedString:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/normalizedString.pm
SOAP::WSDL::XSD::Typelib::Builtin::positiveInteger:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/positiveInteger.pm
SOAP::WSDL::XSD::Typelib::Builtin::short:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/short.pm
SOAP::WSDL::XSD::Typelib::Builtin::string:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/string.pm
SOAP::WSDL::XSD::Typelib::Builtin::time:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/time.pm
version: 2.00_25
SOAP::WSDL::XSD::Typelib::Builtin::token:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/token.pm
SOAP::WSDL::XSD::Typelib::Builtin::unsignedByte:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedByte.pm
SOAP::WSDL::XSD::Typelib::Builtin::unsignedInt:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedInt.pm
SOAP::WSDL::XSD::Typelib::Builtin::unsignedLong:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedLong.pm
SOAP::WSDL::XSD::Typelib::Builtin::unsignedShort:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
SOAP::WSDL::XSD::Typelib::ComplexType:
file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
version: 2.00_25
SOAP::WSDL::XSD::Typelib::Element:
file: lib/SOAP/WSDL/XSD/Typelib/Element.pm
version: 2.00_25
SOAP::WSDL::XSD::Typelib::SimpleType:
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
SOAP::WSDL::XSD::Typelib::SimpleType::restriction:
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
generated_by: Module::Build version 0.2808
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.2.html
version: 1.2
no_index:
directory: lib/SOAP/WSDL/Generator/Template/XSD/
+50
View File
@@ -0,0 +1,50 @@
MIGRATING
---------
This document describes how to migrate from 2.00_24 and before versions to
2.00_25.
Migrating from 2.00_xx
----------------------
Background
SOAP::WSDL 2.00_xx has used Class::Std as base for its inside out objects
up to 2.00_24. For performance reasons, now Class::Std::Fast is used.
As Class::Std::Fast is a drop-in replacement for Class::Std, there should be
no need to change anything in your (handwritten) code.
Generated interfaces
SOAP::WSDL's internal structure has changed, and this change needs to
be reflected in all generated classes.
This means you have to re-generate your interfaces (in case you use generated
interfaces)
Typemaps
SOAP::WSDL now tries to load all typemap classes at once from 2.00_25 on.
If you use __SKIP__ in your typemaps, you'll have to comment out all
path deeper than the path marked with __SKIP__ - if you don't, SOAP::WSDL
will try to load all correspondent classes.
Migrating from 1.xx
-------------------
Background
SOAP::WSDL uses a custom WSDL parser and serializer. It does not rely on XPath
for on the fly WSDL processing, nor does it use SOAP::Data objects for
encoding any more.
You should be able to use your wxisting code under most circumstances.
SOAP::WSDL is the compatibility module for old interfaces.
Overloading
Message overloading (as introduced in 1.23) is not supported any more.
Message overloading is prohibited by the WS-I basic profile, therefore
SOAP::WSDL does not implement it any more.
+31 -27
View File
@@ -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');
+24 -24
View File
@@ -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.
+11
View File
@@ -0,0 +1,11 @@
# Unfortunately, Build testcover reports test coverage wrong.
#
# To get a complete coverage report, just run this file as a shell script
# on a linux box (or execute the equivalent commands on another OS):
cd t/
find . -type f -name '*.t' | xargs -n 1 /usr/bin/perl -MDevel::Cover=-silent,1,-summary,0 -I../lib
cover -ignore_re \.t$ -ignore_re ^lib -coverage="statement" -coverage=condition -coverage=subroutine -coverage="branch"
+24 -36
View File
@@ -1,36 +1,24 @@
- 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.
- add tests for SOAP::WSDL::Definitions::create 2.1 release
- test for correct creation --------
- test against web service (fullerdata.com?) * Support namespaces in SOAP message payload(#1809057)
- Improve docs
- Partially DONE * Support the xsi:type attribute on derived types on the wire(#1809059)
- Remove SOAP::Lite dependency - for now, just support HTTP(s) via LWP::UserAgent.
- Partially DONE. SOAP::WSDL still uses SOAP::Schema * SOAP1.2 support (#1803331)
- write inheritance Test for all XSD::Typelib::Builtin::* classes
- Check & probably fix simpleType support. 2.2 release
The WS at http://www.webservicex.net/genericbarcode.asmx?wsdl should make up a good example for simpleType --------
definitions. * XML schema support ("minimal conformant") (#1764845)
- add default Fault11 typemap to generated typemaps
- DONE * Support SOAP attachments
- SOAP::WSDL::Definitions::create creates bad interface docs. Fix it.
- DONE * Act as SOAP Server
- update all Builtin Types to new constructor BEGIN block (Class::Std unfortunately is way slow)
- DONE. 3.0 release
- Remove useless (but on CPAN annoying) doc from Builtin::* classes --------
- DONE We're not thinking that far ahead right now.
- add example WS scripts
- DONE.
- SOAP::WSDL::XSD::Typelib::Builtin::string does not unescape XML builtin entities on get_value()
- WONTFIX.
Entities are unescaped by XML parser.
If you want the plain value, you have to use get_value, as XML conversion is overloaded on stringification.
- Make callin WS easier: implent WS-I-based SOAP::WSDL::Client::WSI
- WONTFIX - SOAP::WSDL::Base should behave equal
- add capability to create request objects based on input part definitions to SOAP::WSDL::Client::Base
- DONE.
+130
View File
@@ -0,0 +1,130 @@
#!/usr/bin/perl -w
%DB::packages=(SOAP::WSDL::Expat::MessageParser => 1);
use strict;
use warnings;
use lib '../lib';
use lib '../../Class-Std-Fast/lib';
use lib '../t/lib';
# use SOAP::WSDL::SAX::MessageHandler;
use Benchmark qw(cmpthese timethese);
use SOAP::WSDL::Expat::MessageParser;
use SOAP::WSDL::Expat::Message2Hash;
use SOAP::Lite;
use XML::Simple;
use XML::LibXML;
use MyComplexType;
use MyElement;
use MySimpleType;
my $xml = q{<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
<SOAP-ENV:Body>
<MyAtomicComplexTypeElement xmlns="urn:Test" >
<test>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test2</test2>
<test2 >Test55</test2>
</test>
</MyAtomicComplexTypeElement>
</SOAP-ENV:Body></SOAP-ENV:Envelope>};
my $parser = SOAP::WSDL::Expat::MessageParser->new({
class_resolver => 'FakeResolver'
});
my $hash_parser = SOAP::WSDL::Expat::Message2Hash->new();
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
print "xml length: ${ \length $xml } bytes\n";
my $libxml = XML::LibXML->new();
$libxml->keep_blanks(0);
my @data;
my $deserializer = SOAP::Deserializer->new();
sub libxml_test {
my $dom = $libxml->parse_string( $xml );
push @data, dom2hash( $dom->firstChild );
};
sub dom2hash {
for ($_[0]->childNodes) {
if (exists $_[1]->{ $_->nodeName }) {
if (ref $_[1]->{ $_->nodeName } eq 'ARRAY') {
if ($_->nodeName eq '#text') {
push @{ $_[1] } ,$_->textContent;
}
else {
push @{ $_[1]->{ $_->nodeName } }, dom2hash( $_, {} );
}
}
else {
if ($_->nodeName eq '#text') {
$_[1] = [ $_[1], $_->textContent() ];
}
else {
$_[1]->{ $_->nodeName } = [ $_[1]->{ $_->nodeName } ,
dom2hash( $_, {} ) ];
}
}
}
else {
if ($_->nodeName eq '#text') {
$_[1] = $_->textContent();
}
else {
$_[1]->{ $_->nodeName } = dom2hash( $_, {} );
}
}
}
return $_[1];
}
cmpthese 5000,
{
'SOAP::WSDL (Hash)' => sub { push @data, $hash_parser->parse( $xml ) },
'SOAP::WSDL (XSD)' => sub { push @data, $parser->parse( $xml ) },
'XML::Simple (Hash)' => sub { push @data, XMLin $xml },
'XML::LibXML (DOM)' => sub { push @data, $libxml->parse_string( $xml ) },
'XML::LibXML (Hash)' => \&libxml_test,
'SOAP::Lite' => sub { push @data, $deserializer->deserialize( $xml ) },
};
# data classes reside in t/lib/Typelib/
BEGIN {
package FakeResolver;
{
my %class_list = (
'MyAtomicComplexTypeElement' => 'MyAtomicComplexTypeElement',
'MyAtomicComplexTypeElement/test' => 'MyAtomicComplexTypeElement',
'MyAtomicComplexTypeElement/test/test2' => 'MyTestElement2',
);
sub get_typemap { return \%class_list; };
sub get_map { return \%class_list };
sub new { return bless {}, 'FakeResolver' };
sub get_class {
my $name = join('/', @{ $_[1] });
return ($class_list{ $name }) ? $class_list{ $name }
: warn "no class found for $name";
};
};
};
+12
View File
@@ -0,0 +1,12 @@
use strict;
use warnings;
use Benchmark;
use lib '../../lib';
use SOAP::WSDL::XSD::Typelib::Builtin::anyType;
my $obj = SOAP::WSDL::XSD::Typelib::Builtin::anyType->new();
timethese 10000, {
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anyType->new() },
};
+57
View File
@@ -0,0 +1,57 @@
use strict;
use warnings;
use Benchmark;
use lib '../../lib';
use lib '../../../Class-Std-Fast/lib';
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
my $obj = SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new();
timethese 10000, {
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new() },
'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new({
value => 'Teststring'
}) },
'set_FOO' => sub { $obj->set_value('Test') },
};
my $data;
timethese 1000000, {
'set_FOO' => sub { $obj->set_value('Test') },
'get_FOO' => sub { $data = $obj->get_value() },
};
__END__
Benchmark: timing 10000 iterations of new, new + params, set_FOO...
new: 0 wallclock secs ( 0.83 usr + 0.00 sys = 0.83 CPU) @ 12048.19/s (n=10000)
new + params: 1 wallclock secs ( 0.58 usr + 0.00 sys = 0.58 CPU) @ 17241.38/s (n=10000)
set_FOO: 0 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU) @ 1000000.00/s (n=10000)
(warning: too few iterations for a reliable count)
Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
get_FOO: 1 wallclock secs ( 1.79 usr + 0.01 sys = 1.80 CPU) @ 555555.56/s (n=1000000)
set_FOO: 2 wallclock secs ( 1.44 usr + 0.03 sys = 1.47 CPU) @ 680272.11/s (n=1000000)
## Fast:
Benchmark: timing 10000 iterations of new, new + params, set_FOO...
new: 1 wallclock secs ( 0.67 usr + 0.01 sys = 0.68 CPU) @ 14705.88/s (n=10000)
new + params: 1 wallclock secs ( 0.54 usr + 0.00 sys = 0.54 CPU) @ 18518.52/s (n=10000)
set_FOO: 0 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU) @ 1000000.00/s (n=10000)
(warning: too few iterations for a reliable count)
Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
get_FOO: 2 wallclock secs ( 1.11 usr + 0.00 sys = 1.11 CPU) @ 900900.90/s (n=1000000)
set_FOO: 2 wallclock secs ( 0.80 usr + 0.00 sys = 0.80 CPU) @ 1250000.00/s (n=1000000)
## Fast qw(2);
Benchmark: timing 10000 iterations of new, new + params, set_FOO...
new: 1 wallclock secs ( 0.17 usr + 0.00 sys = 0.17 CPU) @ 58823.53/s (n=10000)
(warning: too few iterations for a reliable count)
new + params: 0 wallclock secs ( 0.19 usr + 0.00 sys = 0.19 CPU) @ 52631.58/s (n=10000)
(warning: too few iterations for a reliable count)
set_FOO: 0 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU) @ 1000000.00/s (n=10000)
(warning: too few iterations for a reliable count)
Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
get_FOO: 1 wallclock secs ( 1.12 usr + 0.00 sys = 1.12 CPU) @ 892857.14/s (n=1000000)
set_FOO: 0 wallclock secs ( 0.80 usr + 0.01 sys = 0.81 CPU) @ 1234567.90/s (n=1000000)
+56
View File
@@ -0,0 +1,56 @@
use strict;
use warnings;
use Benchmark;
use lib '../../lib';
use lib '../../../Class-Std-Fast/lib';
use SOAP::WSDL::XSD::Typelib::Builtin::string;
my $obj = SOAP::WSDL::XSD::Typelib::Builtin::string->new();
timethese 20000, {
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new() },
'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new({
value => 'Teststring'
}) },
};
$obj->set_value('Foobar');
timethese 20000, {
serialize => sub { $obj->serialize() }
};
my $data;
timethese 1000000, {
'set_FOO' => sub { $obj->set_value('Test') },
'get_FOO' => sub { $data = $obj->get_value() },
};
__END__
Benchmark: timing 20000 iterations of new, new + params...
new: 1 wallclock secs ( 0.41 usr + 0.00 sys = 0.41 CPU) @ 48780.49/s (n=20000)
new + params: 1 wallclock secs ( 0.53 usr + 0.01 sys = 0.54 CPU) @ 37037.04/s (n=20000)
Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
get_FOO: 2 wallclock secs ( 1.43 usr + 0.01 sys = 1.44 CPU) @ 694444.44/s (n=1000000)
set_FOO: 0 wallclock secs ( 1.43 usr + 0.01 sys = 1.44 CPU) @ 694444.44/s (n=1000000)
::Fast
---
Benchmark: timing 20000 iterations of new, new + params...
new: 0 wallclock secs ( 0.44 usr + 0.01 sys = 0.45 CPU) @ 44444.44/s (n=20000)
new + params: 1 wallclock secs ( 0.55 usr + 0.00 sys = 0.55 CPU) @ 36363.64/s (n=20000)
Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
get_FOO: 0 wallclock secs ( 0.81 usr + 0.00 sys = 0.81 CPU) @ 1234567.90/s (n=1000000)
set_FOO: 2 wallclock secs ( 0.87 usr + 0.01 sys = 0.88 CPU) @ 1136363.64/s (n=1000000)
::Fast with inlined ID
Benchmark: timing 20000 iterations of new, new + params...
new: 0 wallclock secs ( 0.41 usr + 0.00 sys = 0.41 CPU) @ 48780.49/s (n=20000)
new + params: 1 wallclock secs ( 0.52 usr + 0.00 sys = 0.52 CPU) @ 38461.54/s (n=20000)
Benchmark: timing 1000000 iterations of get_FOO, set_FOO...
get_FOO: 2 wallclock secs ( 0.80 usr + 0.00 sys = 0.80 CPU) @ 1250000.00/s (n=1000000)
set_FOO: 2 wallclock secs ( 0.89 usr + -0.01 sys = 0.88 CPU) @ 1136363.64/s (n=1000000)
+69
View File
@@ -0,0 +1,69 @@
#!/usr/bin/perl -w
use strict;
use warnings;
use lib '../example/lib';
use lib '/home/martin/workspace/SOAP-WSDL-Fast_XS/blib/lib';
use lib '/home/martin/workspace/SOAP-WSDL-Fast_XS/blib/arch';
use SOAP::Lite;
use XML::Compile::WSDL11;
use XML::Compile::Transport::SOAPHTTP;
use MyInterfaces::HelloWorld::HelloWorldSoap;
use SOAP::WSDL::Deserializer::XSD_XS;
use Benchmark qw(cmpthese);
my $lite = SOAP::Lite->new(
proxy => 'http://localhost:81/soap-wsdl-test/helloworld.pl'
);
$lite->on_action( sub { "urn:HelloWorld#sayHello" });
$lite->autotype(0);
my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new();
my $soap_xs = MyInterfaces::HelloWorld::HelloWorldSoap->new();
$soap_xs->set_deserializer( SOAP::WSDL::Deserializer::XSD_XS->new() );
my @result;
sub wsdl_bench {
push @result, $soap->sayHello({
name => $ARGV[1] || '"Your name"',
givenName => $ARGV[0] || '"Your given name"',
});
}
sub wsdl_xs_bench {
push @result, $soap_xs->sayHello({
name => $ARGV[1] || '"Your name"',
givenName => $ARGV[0] || '"Your given name"',
});
}
my $wsdl = XML::Compile::WSDL11->new('../example/wsdl/11_helloworld.wsdl');
my $call = $wsdl->compileClient('sayHello');
sub compile_bench {
push @result, $call->(
name => $ARGV[1] || '"Your name"',
givenName => $ARGV[0] || '"Your given name"',
);
}
sub lite_bench {
push @result, $lite->call(
SOAP::Data->name("sayHello")
->attr({ xmlns => 'urn:HelloWorld' }),
SOAP::Data->name('name')->value( $ARGV[1] || '"Your name"'),
SOAP::Data->name('givenName')->value( $ARGV[0] || '"Your given name"'),
);
}
wsdl_bench();
wsdl_xs_bench();
cmpthese 150, {
'SOAP::WSDL' => \&wsdl_bench,
'SOAP::WSDL_XS' => \&wsdl_xs_bench,
'XML::Compile' => \&compile_bench,
# 'SOAP::Lite' => \&lite_bench,
}
+227 -129
View File
@@ -1,132 +1,230 @@
#!/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::Factory::Generator;
use SOAP::WSDL::SAX::WSDLHandler; use Term::ReadKey;
use XML::LibXML;
my %opt = (
my %opt = ( url => '',
url => '', prefix => undef,
prefix => undef, type_prefix => 'MyTypes',
type_prefix => 'MyTypes::', element_prefix => 'MyElements',
element_prefix => 'MyElements::', typemap_prefix => 'MyTypemaps',
typemap_prefix => 'MyTypemaps::', interface_prefix => 'MyInterfaces',
interface_prefix => 'MyInterfaces::', base_path => 'lib/',
base_path => 'lib/', proxy => undef,
proxy => undef generator => 'XSD',
); server => 0,
);
GetOptions(\%opt,
qw( { # a block just to scope "no warnings"
url|u=s no warnings qw(redefine);
prefix|p=s
type_prefix|t=s *LWP::UserAgent::get_basic_credentials = sub {
element_prefix|e=s my ($user, $password);
typemap_prefix|m=s # remove user from option if called, to force prompting for a user
base_path|b=s # name the next time
typemap_include|mi=s print "URL requires authorization.\n";
help|h if (not $user = delete $opt{user}) {
proxy|x=s print 'User name:';
) ReadMode 1;
); $user = ReadLine();
ReadMode 0;
my $url = $ARGV[0]; };
if (not $password = delete $opt{password}) {
pod2usage( -exit => 1 , verbose => 2 ) if ($opt{help}); print 'Password:';
pod2usage( -exit => 1 , verbose => 1 ) if not ($url); ReadMode 2;
$user = ReadLine;
my $handler = SOAP::WSDL::SAX::WSDLHandler->new(); ReadMode 0;
my $parser = XML::LibXML->new(); };
return ($user, $password);
local $ENV{HTTP_PROXY} = $opt{proxy} if $opt{proxy}; };
my $lwp = LWP::UserAgent->new(); }
my $response = $lwp->get($url);
die $response->message(), "\n" if $response->code != 200; GetOptions(\%opt,
qw(
my $xml = $response->content(); prefix|p=s
type_prefix|t=s
$parser->set_handler( $handler ); element_prefix|e=s
$parser->parse_string( $xml ); typemap_prefix|m=s
interface_prefix|i=s
my $wsdl = $handler->get_data(); base_path|b=s
typemap_include|mi=s
if ($opt{typemap_include}) { help|h
my $fh = IO::File->new($opt{typemap_include} , O_RDONLY) proxy|x=s
or die "cannot open typemap_include file $opt{typemap_include}\n"; keep_alive
$opt{custom_types} = join q{}, $fh->getlines(); user=s
$fh->close(); password=s
delete $opt{typemap_include}; generator=s
} server
)
$wsdl->create({ %opt }); );
=pod my $url = $ARGV[0];
=head1 NAME pod2usage( -exit => 1 , verbose => 2 ) if ($opt{help});
pod2usage( -exit => 1 , verbose => 1 ) if not ($url);
wsdl2perl.pl - create perl bindings for SOAP webservices.
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
=head1 SYNOPSIS
local $ENV{HTTP_PROXY} = $opt{proxy} if $opt{proxy};
wsdl2perl.pl -t TYPE_PREFIX -e ELEMENT_PREFIX -m TYPEMAP_PREFIX \ local $ENV{HTTPS_PROXY} = $opt{proxy} if $opt{proxy};
-i INTERFACE_PREFIX -b BASE_DIR URL
my $lwp = LWP::UserAgent->new(
=head1 OPTIONS $opt{keep_alive}
? ( keep_alive => 1 )
NAME SHORT DESCRITPION : ()
---------------------------------------------------------------------------- );
prefix p Prefix for both type and element classes. $lwp->env_proxy(); # get proxy from environment. Works for both http & https.
type_prefix t Prefix for type classes. Should end with '::'
Default: MyTypes:: my $response = $lwp->get($url);
element_prefix e Prefix for element classes. Should end with '::' die $response->message(), "\n" if $response->code != 200;
Default: MyElements::
typemap_prefix m Prefix for typemap classes. Should end with '::' my $xml = $response->content();
Default: MyTypemaps::
interface_prefix i Prefix for interface classes. Should end with '::' my $definitions = $parser->parse_string( $xml );
Default: MyInterfaces::
base_path b Path to create classes in. my %typemap = ();
Default: ./lib
typemap_include mi File to include in typemap. if ($opt{typemap_include}) {
help h Show help content die "$opt{typemap_include} not found " if not -f $opt{typemap_include};
%typemap = do $opt{typemap_include};
=head1 DESCRIPTION }
Generates a interface class for a SOAP web service described by a WSDL my $generator = SOAP::WSDL::Factory::Generator->get_generator({ type => $opt{'generator'} });
definition.
if (%typemap) {
The following classes are created: if ($generator->can('set_typemap')) {
$generator->set_typemap( \%typemap );
=over }
else {
=item * A interface class for every service warn "Typemap snippet given, but generator does not support it\n";
}
Interface classes are what you will mainly deal with: They provide a method };
for accessing every web service method.
$generator->set_type_prefix( $opt{ type_prefix }) if $generator->can('set_type_prefix');
=item * A typemap for every service $generator->set_typemap_prefix( $opt{ typemap_prefix }) if $generator->can('set_typemap_prefix');
$generator->set_element_prefix($opt{ element_prefix }) if $generator->can('set_element_prefix');
Typemaps are used internally by SOAP::WSDL for parsing the SOAP message into $generator->set_interface_prefix($opt{ interface_prefix }) if $generator->can('set_interface_prefix');
object trees. $generator->set_OUTPUT_PATH($opt{ base_path }) if $generator->can('set_OUTPUT_PATH');
$generator->set_definitions($definitions) if $generator->can('set_definitions');
If the WSDL definition is incomplete, you may need to add some lines to $generator->set_wsdl($xml) if $generator->can('set_wsdl');
your typemap. Especially definitions for faults are sometimes left out.
# start with typelib, as errors will most likely occur here...
Additional typemap content may be included by passing a file name as $generator->generate();
typemap_include (mi) option. $generator->generate_interface() if ! $opt{server};
$generator->generate_server() if $opt{server};
=item * A type class for every element, complexType or simpleType definition __END__
You may need to write additional type classes if your WSDL is incomplete. =pod
For writing your own lib classes, see L<SOAP::WSDL::XSD::Typelib::Element>, =head1 NAME
L<SOAP::WSDL::XSD::Typelib::ComplexType> and L<SOAP::WSDL::XSD::Typelib::SimpleType>.
wsdl2perl.pl - create perl bindings for SOAP webservices.
=back
=head1 SYNOPSIS
wsdl2perl.pl -t TYPE_PREFIX -e ELEMENT_PREFIX -m TYPEMAP_PREFIX \
-i INTERFACE_PREFIX -b BASE_DIR URL
=head1 OPTIONS
NAME SHORT DESCRITPION
----------------------------------------------------------------------------
prefix p Prefix for both type and element classes.
type_prefix t Prefix for type classes.
Default: MyTypes
element_prefix e Prefix for element classes.
Default: MyElements
typemap_prefix m Prefix for typemap classes.
Default: MyTypemaps
interface_prefix i Prefix for interface classes.
Default: MyInterfaces
base_path b Path to create classes in.
Default: .
typemap_include mi File to include in typemap. Must eval() to a valid
perl hash (not a hash ref !).
proxy x HTTP(S) proxy to use (if any). wsdl2perl will also
use the proxy settings specified via the HTTP_PROXY
and HTTPS_PROXY environment variables.
keep_alive Use http keep_alive.
user Username for HTTP authentication
password Password. wsdl2perl will prompt if not given.
generator g Generator to use.
Default: XSD
server s Generate a server interface (currently only CGI
supported)
help h Show help content
=head1 DESCRIPTION
Generates a interface class for a SOAP web service described by a WSDL
definition.
The following classes are created:
=over
=item * A interface class for every SOAP port in service
Interface classes are what you will mainly deal with: They provide a method
for accessing every web service method.
If you chose to generate Server interfaces, a class for every SOAP port in
every Web service.
You'll have to implement a method for each of the implemented methods. You
may implement these methods in the CGI script / handler, or in any class
to dispatch calls to.
=item * A typemap for every service
Typemaps are used internally by SOAP::WSDL for parsing the SOAP message into
object trees.
If the WSDL definition is incomplete, you may need to add some lines to
your typemap. Especially definitions for faults are sometimes left out.
Additional typemap content may be included by passing a file name as
typemap_include (mi) option.
=item * A type class for every element, complexType or simpleType definition
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>.
=back
=head1 TROUBLESHOOTING
=head2 Accessing HTTPS URLs
You need Crypt::SSLeay installed for accessing HTTPS URLs.
=head2 Accessing protected documents
Use the -u option for specifying the user name. You will be prompted for a
password.
Alternatively, you may specify a passowrd with --password on the command
line.
=head2 Accessing documents protected by NTLM authentication
Set the --keep_alive option.
Note that accessing documents protected by NTLM authentication is currently
untested, because I have no access to a system using NTLM authentication.
If you try it, I would be glad if you could just drop me a note about
success or failure.
=head1 LICENSE =head1 LICENSE
Copyright 2007 Martin Kutter. Copyright 2007 Martin Kutter.
+55
View File
@@ -0,0 +1,55 @@
#!/usr/bin/perl -w
use strict;
use warnings;
use lib '../../lib';
use lib '../lib';
use MyServer::HelloWorld::HelloWorldSoap;
my $soap = MyServer::HelloWorld::HelloWorldSoap->new({
dispatch_to => 'main',
});
$soap->handle();
sub sayHello {
my ($self, $body, $header) = @_;
my $name = $body->get_name();
my $givenName = $body->get_givenName();
return MyElements::sayHelloResponse->new({
sayHelloResult => "Hello $givenName $name"
})
}
=pod
=head1 NAME
helloworld.pl - a simple CGI-based SOAP server implementing the service from
in examples/wsdl/helloworld.wsdl
=head1 USAGE
Before using this script, you should secure your webserver. The easiest way
to do so is to let it listen to 127.0.0.1 only.
Then make a ScriptAlias named /soap-wsdl-test/ pointing at the directory
this file lies in.
For my apache, it looks like this:
ScriptAlias /soap-wsdl-test/ /home/martin/workspace/SOAP-WSDL/example/cgi-bin/
<Directory "/home/martin/workspace/SOAP-WSDL/example/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews
Order allow,deny
Allow from all
</Directory>
Then run the helloworld.pl from the examples directory. It should print
Hello World
=head1 DESCRIPTION
=cut
+46 -46
View File
@@ -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::FullerData_x0020_Fortune_x0020_CookieSoap;
my $cookieService = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie->new(); my $cookieService = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap->new();
my $cookie; my $cookie;
$cookie = $cookieService->GetFortuneCookie() $cookie = $cookieService->GetFortuneCookie()
or die "$cookie"; or die "$cookie";
print $cookie; # ->get_GetFortuneCookieResult()->get_value, "\n"; print $cookie->get_GetFortuneCookieResult()->get_value, "\n\n";
$cookie = $cookieService->GetSpecificCookie({ index => 23 }) $cookie = $cookieService->GetSpecificCookie({ index => 23 })
or die "$cookie"; or die "$cookie";
print $cookie->get_GetSpecificCookieResult(), "\n"; print $cookie->get_GetSpecificCookieResult(), "\n";
print $cookie; # print $cookie;
=for demo: =for demo:
# 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();
+29
View File
@@ -0,0 +1,29 @@
use lib 'lib';
use lib '../lib';
use MyInterfaces::BarCode::BarCodeSoap;
my $interface = MyInterfaces::BarCode::BarCodeSoap->new();
my $barcode = $interface->GenerateBarCode( {
BarCodeParam => { # MyTypes::BarCodeData
Height => 42, # int
Width => 120, # int
Angle => 90, # int
Ratio => 1, # int
Module => 1, # int
Left => 10, # int
Top => 10, # int
CheckSum => 0, # boolean
FontName => 'Arial', # string
BarColor => 'black', # string
BGColor => 'white', # string
FontSize => 6.25, # float
barcodeOption => 'Both', # BarcodeOption
barcodeType => 'CodeMSI', # BarcodeType
checkSumMethod => 'None', # CheckSumMethod
showTextPosition => 'TopLeft', # ShowTextPosition
BarCodeImageFormat => 'PNG', # ImageFormats
},
BarCodeText => 'JustSomeText', # string
},
);
die $barcode if not ($barcode);
print $barcode;
+21
View File
@@ -0,0 +1,21 @@
#!/usr/bin/perl -w
use strict;
use warnings;
use lib 'lib';
# I have to generate the interface using wsdl2perl.pl before
use MyInterfaces::HelloWorld::HelloWorldSoap;
my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new();
# I have to lookup the method and synopsis from the interface's pod
my $result = $soap->sayHello({
name => $ARGV[1] || '"Your name"',
givenName => $ARGV[0] || '"Your given name"',
});
die $result if not $result;
# I have to lookup the output parameter from the interface's POD - or try:
# Bad method names will die with a list of available methods
print $result->get_sayHelloResult(), "\n";
+21
View File
@@ -0,0 +1,21 @@
#!/usr/bin/perl -w
use strict;
use warnings;
use XML::Compile::WSDL11;
use XML::Compile::Transport::SOAPHTTP;
my $wsdl = XML::Compile::WSDL11->new('wsdl/11_helloworld.wsdl');
# I have to lookup the methods from the WSDL
my $call = $wsdl->compileClient('sayHello');
# I have to lookup the parameters from the WSDL
my $result = $call->(
name => $ARGV[1] || '"Your name"',
givenName => $ARGV[0] || '"Your given name"',
);
die "Error calling soap method" if not defined $result;
# I have to lookup the output parameters from the WSDL - or try Dumper
print $result->{ parameters }->{ sayHelloResult }, "\n";
+27
View File
@@ -0,0 +1,27 @@
#!/usr/bin/perl -w
use strict;
use warnings;
use SOAP::Lite;
# I have to lookup the URL from the WSDL
my $soap = SOAP::Lite->new(
proxy => 'http://localhost:81/soap-wsdl-test/helloworld.pl'
);
# I have to lookup the SOAPAction from the WSDL
$soap->on_action( sub { "urn:HelloWorld#sayHello" });
$soap->autotype(0);
# I have to lookup the top level element's namespace from the WSDL
# I have to encode all parameters as SOAP::Data objects
# I have to know the order of parameters
my $som = $soap->call(
SOAP::Data->name("sayHello")
->attr({ xmlns => 'urn:HelloWorld' }),
SOAP::Data->name('name')->value( $ARGV[1] || '"Your name"'),
SOAP::Data->name('givenName')->value( $ARGV[0] || '"Your given name"'),
);
die $som->fault->{ faultstring } if ($som->fault);
print $som->result, "\n";
+54 -71
View File
@@ -1,71 +1,54 @@
package MyElements::CountCookies; package MyElements::CountCookies;
use strict; use strict;
use Class::Std::Storable; use warnings;
use SOAP::WSDL::XSD::Typelib::Element;
{ # BLOCK to scope variables
# atomic complexType
# <element name="CountCookies"><complexType> definition sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
use SOAP::WSDL::XSD::Typelib::ComplexType;
use base qw( __PACKAGE__->__set_name('CountCookies');
SOAP::WSDL::XSD::Typelib::Element __PACKAGE__->__set_nillable();
SOAP::WSDL::XSD::Typelib::ComplexType __PACKAGE__->__set_minOccurs();
); __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
__PACKAGE__->_factory( SOAP::WSDL::XSD::Typelib::Element
[ qw() ], SOAP::WSDL::XSD::Typelib::ComplexType
{ );
},
{
} } # end of BLOCK
); 1;
# __END__
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' } =pod
__PACKAGE__->__set_name('CountCookies'); =head1 NAME
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs(); MyElements::CountCookies
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(''); =head1 DESCRIPTION
1; Perl data type class for the XML Schema defined element
CountCookies from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
__END__ =head1 METHODS
=pod =head2 new
=head1 NAME MyElements::CountCookies my $element = MyElements::CountCookies->new($data);
=head1 SYNOPSIS Constructor. The following data structure may be passed to new():
=head1 DESCRIPTION
Type class for the XML element CountCookies. =head1 AUTHOR
=head1 PROPERTIES Generated by SOAP::WSDL
The following properties may be accessed using get_PROPERTY / set_PROPERTY =cut
methods:
=head1 Object structure
Structure as perl hash:
The object structure is displayed as hash below though this is not correct.
Complex hash elements actually are objects of their corresponding classes
(look for classes of the same name in your typleib).
new() will accept a hash structure like this, but transform it to a object
tree.
=cut
+79 -85
View File
@@ -1,85 +1,79 @@
package MyElements::CountCookiesResponse; package MyElements::CountCookiesResponse;
use strict; use strict;
use Class::Std::Storable; use warnings;
use SOAP::WSDL::XSD::Typelib::Element;
{ # BLOCK to scope variables
# atomic complexType
# <element name="CountCookiesResponse"><complexType> definition sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
use SOAP::WSDL::XSD::Typelib::ComplexType;
use base qw( __PACKAGE__->__set_name('CountCookiesResponse');
SOAP::WSDL::XSD::Typelib::Element __PACKAGE__->__set_nillable();
SOAP::WSDL::XSD::Typelib::ComplexType __PACKAGE__->__set_minOccurs();
); __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
my %CountCookiesResult_of :ATTR(:get<CountCookiesResult>); use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
__PACKAGE__->_factory( );
[ qw( use Class::Std::Storable;
CountCookiesResult use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
) ],
{ { # BLOCK to scope variables
CountCookiesResult => \%CountCookiesResult_of,
my %CountCookiesResult_of :ATTR(:get<CountCookiesResult>);
},
{ __PACKAGE__->_factory(
[ qw(
CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int', CountCookiesResult
) ],
{
} CountCookiesResult => \%CountCookiesResult_of,
); },
{
CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
}
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' } );
__PACKAGE__->__set_name('CountCookiesResponse'); } # end BLOCK
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref('');
1;
} # end of BLOCK
__END__ 1;
=pod # __END__
=head1 NAME MyElements::CountCookiesResponse =pod
=head1 SYNOPSIS =head1 NAME
=head1 DESCRIPTION MyElements::CountCookiesResponse
Type class for the XML element CountCookiesResponse. =head1 DESCRIPTION
=head1 PROPERTIES Perl data type class for the XML Schema defined element
CountCookiesResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods: =head1 METHODS
CountCookiesResult =head2 new
=head1 Object structure my $element = MyElements::CountCookiesResponse->new($data);
CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int', Constructor. The following data structure may be passed to new():
{
Structure as perl hash: CountCookiesResult => $some_value, # int
}
The object structure is displayed as hash below though this is not correct.
Complex hash elements actually are objects of their corresponding classes =head1 AUTHOR
(look for classes of the same name in your typleib).
new() will accept a hash structure like this, but transform it to a object Generated by SOAP::WSDL
tree.
=cut
'CountCookiesResponse'=> {
'CountCookiesResult' => $someValue,
},
=cut
+102
View File
@@ -0,0 +1,102 @@
package MyElements::GenerateBarCode;
use strict;
use warnings;
{ # BLOCK to scope variables
sub get_xmlns { 'http://www.webservicex.net/' }
__PACKAGE__->__set_name('GenerateBarCode');
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
{ # BLOCK to scope variables
my %BarCodeParam_of :ATTR(:get<BarCodeParam>);
my %BarCodeText_of :ATTR(:get<BarCodeText>);
__PACKAGE__->_factory(
[ qw(
BarCodeParam
BarCodeText
) ],
{
BarCodeParam => \%BarCodeParam_of,
BarCodeText => \%BarCodeText_of,
},
{
BarCodeParam => 'MyTypes::BarCodeData',
BarCodeText => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
}
);
} # end BLOCK
} # end of BLOCK
1;
# __END__
=pod
=head1 NAME
MyElements::GenerateBarCode
=head1 DESCRIPTION
Perl data type class for the XML Schema defined element
GenerateBarCode from the namespace http://www.webservicex.net/.
=head1 METHODS
=head2 new
my $element = MyElements::GenerateBarCode->new($data);
Constructor. The following data structure may be passed to new():
{
BarCodeParam => { # MyTypes::BarCodeData
Height => $some_value, # int
Width => $some_value, # int
Angle => $some_value, # int
Ratio => $some_value, # int
Module => $some_value, # int
Left => $some_value, # int
Top => $some_value, # int
CheckSum => $some_value, # boolean
FontName => $some_value, # string
BarColor => $some_value, # string
BGColor => $some_value, # string
FontSize => $some_value, # float
barcodeOption => $some_value, # BarcodeOption
barcodeType => $some_value, # BarcodeType
checkSumMethod => $some_value, # CheckSumMethod
showTextPosition => $some_value, # ShowTextPosition
BarCodeImageFormat => $some_value, # ImageFormats
},
BarCodeText => $some_value, # string
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
@@ -0,0 +1,79 @@
package MyElements::GenerateBarCodeResponse;
use strict;
use warnings;
{ # BLOCK to scope variables
sub get_xmlns { 'http://www.webservicex.net/' }
__PACKAGE__->__set_name('GenerateBarCodeResponse');
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Storable;
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
{ # BLOCK to scope variables
my %GenerateBarCodeResult_of :ATTR(:get<GenerateBarCodeResult>);
__PACKAGE__->_factory(
[ qw(
GenerateBarCodeResult
) ],
{
GenerateBarCodeResult => \%GenerateBarCodeResult_of,
},
{
GenerateBarCodeResult => 'SOAP::WSDL::XSD::Typelib::Builtin::base64Binary',
}
);
} # end BLOCK
} # end of BLOCK
1;
# __END__
=pod
=head1 NAME
MyElements::GenerateBarCodeResponse
=head1 DESCRIPTION
Perl data type class for the XML Schema defined element
GenerateBarCodeResponse from the namespace http://www.webservicex.net/.
=head1 METHODS
=head2 new
my $element = MyElements::GenerateBarCodeResponse->new($data);
Constructor. The following data structure may be passed to new():
{
GenerateBarCodeResult => $some_value, # base64Binary
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+79 -85
View File
@@ -1,85 +1,79 @@
package MyElements::GetCitiesByCountry; package MyElements::GetCitiesByCountry;
use strict; use strict;
use Class::Std::Storable; use warnings;
use SOAP::WSDL::XSD::Typelib::Element;
{ # BLOCK to scope variables
# atomic complexType
# <element name="GetCitiesByCountry"><complexType> definition sub get_xmlns { 'http://www.webserviceX.NET' }
use SOAP::WSDL::XSD::Typelib::ComplexType;
use base qw( __PACKAGE__->__set_name('GetCitiesByCountry');
SOAP::WSDL::XSD::Typelib::Element __PACKAGE__->__set_nillable();
SOAP::WSDL::XSD::Typelib::ComplexType __PACKAGE__->__set_minOccurs();
); __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
my %CountryName_of :ATTR(:get<CountryName>); use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
__PACKAGE__->_factory( );
[ qw( use Class::Std::Storable;
CountryName use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
) ],
{ { # BLOCK to scope variables
CountryName => \%CountryName_of,
my %CountryName_of :ATTR(:get<CountryName>);
},
{ __PACKAGE__->_factory(
[ qw(
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string', CountryName
) ],
{
} CountryName => \%CountryName_of,
); },
{
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
}
sub get_xmlns { 'http://www.webserviceX.NET' } );
__PACKAGE__->__set_name('GetCitiesByCountry'); } # end BLOCK
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref('');
1;
} # end of BLOCK
__END__ 1;
=pod # __END__
=head1 NAME MyElements::GetCitiesByCountry =pod
=head1 SYNOPSIS =head1 NAME
=head1 DESCRIPTION MyElements::GetCitiesByCountry
Type class for the XML element GetCitiesByCountry. =head1 DESCRIPTION
=head1 PROPERTIES Perl data type class for the XML Schema defined element
GetCitiesByCountry from the namespace http://www.webserviceX.NET.
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods: =head1 METHODS
CountryName =head2 new
=head1 Object structure my $element = MyElements::GetCitiesByCountry->new($data);
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string', Constructor. The following data structure may be passed to new():
{
Structure as perl hash: CountryName => $some_value, # string
}
The object structure is displayed as hash below though this is not correct.
Complex hash elements actually are objects of their corresponding classes =head1 AUTHOR
(look for classes of the same name in your typleib).
new() will accept a hash structure like this, but transform it to a object Generated by SOAP::WSDL
tree.
=cut
'GetCitiesByCountry'=> {
'CountryName' => $someValue,
},
=cut
@@ -1,85 +1,79 @@
package MyElements::GetCitiesByCountryResponse; package MyElements::GetCitiesByCountryResponse;
use strict; use strict;
use Class::Std::Storable; use warnings;
use SOAP::WSDL::XSD::Typelib::Element;
{ # BLOCK to scope variables
# atomic complexType
# <element name="GetCitiesByCountryResponse"><complexType> definition sub get_xmlns { 'http://www.webserviceX.NET' }
use SOAP::WSDL::XSD::Typelib::ComplexType;
use base qw( __PACKAGE__->__set_name('GetCitiesByCountryResponse');
SOAP::WSDL::XSD::Typelib::Element __PACKAGE__->__set_nillable();
SOAP::WSDL::XSD::Typelib::ComplexType __PACKAGE__->__set_minOccurs();
); __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
my %GetCitiesByCountryResult_of :ATTR(:get<GetCitiesByCountryResult>); use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
__PACKAGE__->_factory( );
[ qw( use Class::Std::Storable;
GetCitiesByCountryResult use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
) ],
{ { # BLOCK to scope variables
GetCitiesByCountryResult => \%GetCitiesByCountryResult_of,
my %GetCitiesByCountryResult_of :ATTR(:get<GetCitiesByCountryResult>);
},
{ __PACKAGE__->_factory(
[ qw(
GetCitiesByCountryResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', GetCitiesByCountryResult
) ],
{
} GetCitiesByCountryResult => \%GetCitiesByCountryResult_of,
); },
{
GetCitiesByCountryResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
}
sub get_xmlns { 'http://www.webserviceX.NET' } );
__PACKAGE__->__set_name('GetCitiesByCountryResponse'); } # end BLOCK
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref('');
1;
} # end of BLOCK
__END__ 1;
=pod # __END__
=head1 NAME MyElements::GetCitiesByCountryResponse =pod
=head1 SYNOPSIS =head1 NAME
=head1 DESCRIPTION MyElements::GetCitiesByCountryResponse
Type class for the XML element GetCitiesByCountryResponse. =head1 DESCRIPTION
=head1 PROPERTIES Perl data type class for the XML Schema defined element
GetCitiesByCountryResponse from the namespace http://www.webserviceX.NET.
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods: =head1 METHODS
GetCitiesByCountryResult =head2 new
=head1 Object structure my $element = MyElements::GetCitiesByCountryResponse->new($data);
GetCitiesByCountryResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', Constructor. The following data structure may be passed to new():
{
Structure as perl hash: GetCitiesByCountryResult => $some_value, # string
}
The object structure is displayed as hash below though this is not correct.
Complex hash elements actually are objects of their corresponding classes =head1 AUTHOR
(look for classes of the same name in your typleib).
new() will accept a hash structure like this, but transform it to a object Generated by SOAP::WSDL
tree.
=cut
'GetCitiesByCountryResponse'=> {
'GetCitiesByCountryResult' => $someValue,
},
=cut
+54 -71
View File
@@ -1,71 +1,54 @@
package MyElements::GetFortuneCookie; package MyElements::GetFortuneCookie;
use strict; use strict;
use Class::Std::Storable; use warnings;
use SOAP::WSDL::XSD::Typelib::Element;
{ # BLOCK to scope variables
# atomic complexType
# <element name="GetFortuneCookie"><complexType> definition sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
use SOAP::WSDL::XSD::Typelib::ComplexType;
use base qw( __PACKAGE__->__set_name('GetFortuneCookie');
SOAP::WSDL::XSD::Typelib::Element __PACKAGE__->__set_nillable();
SOAP::WSDL::XSD::Typelib::ComplexType __PACKAGE__->__set_minOccurs();
); __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
__PACKAGE__->_factory( SOAP::WSDL::XSD::Typelib::Element
[ qw() ], SOAP::WSDL::XSD::Typelib::ComplexType
{ );
},
{
} } # end of BLOCK
); 1;
# __END__
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' } =pod
__PACKAGE__->__set_name('GetFortuneCookie'); =head1 NAME
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs(); MyElements::GetFortuneCookie
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(''); =head1 DESCRIPTION
1; Perl data type class for the XML Schema defined element
GetFortuneCookie from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
__END__ =head1 METHODS
=pod =head2 new
=head1 NAME MyElements::GetFortuneCookie my $element = MyElements::GetFortuneCookie->new($data);
=head1 SYNOPSIS Constructor. The following data structure may be passed to new():
=head1 DESCRIPTION
Type class for the XML element GetFortuneCookie. =head1 AUTHOR
=head1 PROPERTIES Generated by SOAP::WSDL
The following properties may be accessed using get_PROPERTY / set_PROPERTY =cut
methods:
=head1 Object structure
Structure as perl hash:
The object structure is displayed as hash below though this is not correct.
Complex hash elements actually are objects of their corresponding classes
(look for classes of the same name in your typleib).
new() will accept a hash structure like this, but transform it to a object
tree.
=cut
@@ -1,85 +1,79 @@
package MyElements::GetFortuneCookieResponse; package MyElements::GetFortuneCookieResponse;
use strict; use strict;
use Class::Std::Storable; use warnings;
use SOAP::WSDL::XSD::Typelib::Element;
{ # BLOCK to scope variables
# atomic complexType
# <element name="GetFortuneCookieResponse"><complexType> definition sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
use SOAP::WSDL::XSD::Typelib::ComplexType;
use base qw( __PACKAGE__->__set_name('GetFortuneCookieResponse');
SOAP::WSDL::XSD::Typelib::Element __PACKAGE__->__set_nillable();
SOAP::WSDL::XSD::Typelib::ComplexType __PACKAGE__->__set_minOccurs();
); __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
my %GetFortuneCookieResult_of :ATTR(:get<GetFortuneCookieResult>); use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
__PACKAGE__->_factory( );
[ qw( use Class::Std::Storable;
GetFortuneCookieResult use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
) ],
{ { # BLOCK to scope variables
GetFortuneCookieResult => \%GetFortuneCookieResult_of,
my %GetFortuneCookieResult_of :ATTR(:get<GetFortuneCookieResult>);
},
{ __PACKAGE__->_factory(
[ qw(
GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', GetFortuneCookieResult
) ],
{
} GetFortuneCookieResult => \%GetFortuneCookieResult_of,
); },
{
GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
}
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' } );
__PACKAGE__->__set_name('GetFortuneCookieResponse'); } # end BLOCK
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref('');
1;
} # end of BLOCK
__END__ 1;
=pod # __END__
=head1 NAME MyElements::GetFortuneCookieResponse =pod
=head1 SYNOPSIS =head1 NAME
=head1 DESCRIPTION MyElements::GetFortuneCookieResponse
Type class for the XML element GetFortuneCookieResponse. =head1 DESCRIPTION
=head1 PROPERTIES Perl data type class for the XML Schema defined element
GetFortuneCookieResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods: =head1 METHODS
GetFortuneCookieResult =head2 new
=head1 Object structure my $element = MyElements::GetFortuneCookieResponse->new($data);
GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', Constructor. The following data structure may be passed to new():
{
Structure as perl hash: GetFortuneCookieResult => $some_value, # string
}
The object structure is displayed as hash below though this is not correct.
Complex hash elements actually are objects of their corresponding classes =head1 AUTHOR
(look for classes of the same name in your typleib).
new() will accept a hash structure like this, but transform it to a object Generated by SOAP::WSDL
tree.
=cut
'GetFortuneCookieResponse'=> {
'GetFortuneCookieResult' => $someValue,
},
=cut
+79 -85
View File
@@ -1,85 +1,79 @@
package MyElements::GetSpecificCookie; package MyElements::GetSpecificCookie;
use strict; use strict;
use Class::Std::Storable; use warnings;
use SOAP::WSDL::XSD::Typelib::Element;
{ # BLOCK to scope variables
# atomic complexType
# <element name="GetSpecificCookie"><complexType> definition sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
use SOAP::WSDL::XSD::Typelib::ComplexType;
use base qw( __PACKAGE__->__set_name('GetSpecificCookie');
SOAP::WSDL::XSD::Typelib::Element __PACKAGE__->__set_nillable();
SOAP::WSDL::XSD::Typelib::ComplexType __PACKAGE__->__set_minOccurs();
); __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
my %index_of :ATTR(:get<index>); use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
__PACKAGE__->_factory( );
[ qw( use Class::Std::Storable;
index use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
) ],
{ { # BLOCK to scope variables
index => \%index_of,
my %index_of :ATTR(:get<index>);
},
{ __PACKAGE__->_factory(
[ qw(
index => 'SOAP::WSDL::XSD::Typelib::Builtin::int', index
) ],
{
} index => \%index_of,
); },
{
index => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
}
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' } );
__PACKAGE__->__set_name('GetSpecificCookie'); } # end BLOCK
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref('');
1;
} # end of BLOCK
__END__ 1;
=pod # __END__
=head1 NAME MyElements::GetSpecificCookie =pod
=head1 SYNOPSIS =head1 NAME
=head1 DESCRIPTION MyElements::GetSpecificCookie
Type class for the XML element GetSpecificCookie. =head1 DESCRIPTION
=head1 PROPERTIES Perl data type class for the XML Schema defined element
GetSpecificCookie from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods: =head1 METHODS
index =head2 new
=head1 Object structure my $element = MyElements::GetSpecificCookie->new($data);
index => 'SOAP::WSDL::XSD::Typelib::Builtin::int', Constructor. The following data structure may be passed to new():
{
Structure as perl hash: index => $some_value, # int
}
The object structure is displayed as hash below though this is not correct.
Complex hash elements actually are objects of their corresponding classes =head1 AUTHOR
(look for classes of the same name in your typleib).
new() will accept a hash structure like this, but transform it to a object Generated by SOAP::WSDL
tree.
=cut
'GetSpecificCookie'=> {
'index' => $someValue,
},
=cut
@@ -1,85 +1,79 @@
package MyElements::GetSpecificCookieResponse; package MyElements::GetSpecificCookieResponse;
use strict; use strict;
use Class::Std::Storable; use warnings;
use SOAP::WSDL::XSD::Typelib::Element;
{ # BLOCK to scope variables
# atomic complexType
# <element name="GetSpecificCookieResponse"><complexType> definition sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
use SOAP::WSDL::XSD::Typelib::ComplexType;
use base qw( __PACKAGE__->__set_name('GetSpecificCookieResponse');
SOAP::WSDL::XSD::Typelib::Element __PACKAGE__->__set_nillable();
SOAP::WSDL::XSD::Typelib::ComplexType __PACKAGE__->__set_minOccurs();
); __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
my %GetSpecificCookieResult_of :ATTR(:get<GetSpecificCookieResult>); use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
__PACKAGE__->_factory( );
[ qw( use Class::Std::Storable;
GetSpecificCookieResult use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
) ],
{ { # BLOCK to scope variables
GetSpecificCookieResult => \%GetSpecificCookieResult_of,
my %GetSpecificCookieResult_of :ATTR(:get<GetSpecificCookieResult>);
},
{ __PACKAGE__->_factory(
[ qw(
GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', GetSpecificCookieResult
) ],
{
} GetSpecificCookieResult => \%GetSpecificCookieResult_of,
); },
{
GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
}
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' } );
__PACKAGE__->__set_name('GetSpecificCookieResponse'); } # end BLOCK
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref('');
1;
} # end of BLOCK
__END__ 1;
=pod # __END__
=head1 NAME MyElements::GetSpecificCookieResponse =pod
=head1 SYNOPSIS =head1 NAME
=head1 DESCRIPTION MyElements::GetSpecificCookieResponse
Type class for the XML element GetSpecificCookieResponse. =head1 DESCRIPTION
=head1 PROPERTIES Perl data type class for the XML Schema defined element
GetSpecificCookieResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods: =head1 METHODS
GetSpecificCookieResult =head2 new
=head1 Object structure my $element = MyElements::GetSpecificCookieResponse->new($data);
GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', Constructor. The following data structure may be passed to new():
{
Structure as perl hash: GetSpecificCookieResult => $some_value, # string
}
The object structure is displayed as hash below though this is not correct.
Complex hash elements actually are objects of their corresponding classes =head1 AUTHOR
(look for classes of the same name in your typleib).
new() will accept a hash structure like this, but transform it to a object Generated by SOAP::WSDL
tree.
=cut
'GetSpecificCookieResponse'=> {
'GetSpecificCookieResult' => $someValue,
},
=cut
+84 -97
View File
@@ -1,97 +1,84 @@
package MyElements::GetWeather; package MyElements::GetWeather;
use strict; use strict;
use Class::Std::Storable; use warnings;
use SOAP::WSDL::XSD::Typelib::Element;
{ # BLOCK to scope variables
# atomic complexType
# <element name="GetWeather"><complexType> definition sub get_xmlns { 'http://www.webserviceX.NET' }
use SOAP::WSDL::XSD::Typelib::ComplexType;
use base qw( __PACKAGE__->__set_name('GetWeather');
SOAP::WSDL::XSD::Typelib::Element __PACKAGE__->__set_nillable();
SOAP::WSDL::XSD::Typelib::ComplexType __PACKAGE__->__set_minOccurs();
); __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
my %CityName_of :ATTR(:get<CityName>); use base qw(
SOAP::WSDL::XSD::Typelib::Element
my %CountryName_of :ATTR(:get<CountryName>); SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Storable;
__PACKAGE__->_factory( use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
[ qw(
CityName { # BLOCK to scope variables
CountryName my %CityName_of :ATTR(:get<CityName>);
) ], my %CountryName_of :ATTR(:get<CountryName>);
{
CityName => \%CityName_of, __PACKAGE__->_factory(
CountryName => \%CountryName_of, [ qw(
CityName
}, CountryName
{ ) ],
{
CityName => 'SOAP::WSDL::XSD::Typelib::Builtin::string', CityName => \%CityName_of,
CountryName => \%CountryName_of,
},
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string', {
CityName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
} }
); );
} # end BLOCK
sub get_xmlns { 'http://www.webserviceX.NET' }
__PACKAGE__->__set_name('GetWeather');
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(''); } # end of BLOCK
1;
1;
# __END__
__END__ =pod
=pod =head1 NAME
=head1 NAME MyElements::GetWeather MyElements::GetWeather
=head1 SYNOPSIS =head1 DESCRIPTION
=head1 DESCRIPTION Perl data type class for the XML Schema defined element
GetWeather from the namespace http://www.webserviceX.NET.
Type class for the XML element GetWeather.
=head1 METHODS
=head1 PROPERTIES
=head2 new
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods: my $element = MyElements::GetWeather->new($data);
CityName Constructor. The following data structure may be passed to new():
CountryName
{
=head1 Object structure CityName => $some_value, # string
CountryName => $some_value, # string
CityName => 'SOAP::WSDL::XSD::Typelib::Builtin::string', }
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string', =head1 AUTHOR
Generated by SOAP::WSDL
Structure as perl hash:
=cut
The object structure is displayed as hash below though this is not correct.
Complex hash elements actually are objects of their corresponding classes
(look for classes of the same name in your typleib).
new() will accept a hash structure like this, but transform it to a object
tree.
'GetWeather'=> {
'CityName' => $someValue,
'CountryName' => $someValue,
},
=cut
+79 -84
View File
@@ -1,84 +1,79 @@
package MyElements::GetWeatherResponse; package MyElements::GetWeatherResponse;
use strict; use strict;
use Class::Std::Storable; use warnings;
use SOAP::WSDL::XSD::Typelib::Element;
{ # BLOCK to scope variables
# atomic complexType
# <element name="GetWeatherResponse"><complexType> definition sub get_xmlns { 'http://www.webserviceX.NET' }
use SOAP::WSDL::XSD::Typelib::ComplexType;
use base qw( __PACKAGE__->__set_name('GetWeatherResponse');
SOAP::WSDL::XSD::Typelib::Element __PACKAGE__->__set_nillable();
SOAP::WSDL::XSD::Typelib::ComplexType __PACKAGE__->__set_minOccurs();
); __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
my %GetWeatherResult_of :ATTR(:get<GetWeatherResult>); use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
__PACKAGE__->_factory( );
[ qw( use Class::Std::Storable;
GetWeatherResult use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
) ],
{ { # BLOCK to scope variables
GetWeatherResult => \%GetWeatherResult_of,
my %GetWeatherResult_of :ATTR(:get<GetWeatherResult>);
},
{ __PACKAGE__->_factory(
[ qw(
GetWeatherResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', GetWeatherResult
) ],
} {
); GetWeatherResult => \%GetWeatherResult_of,
},
{
GetWeatherResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
sub get_xmlns { 'http://www.webserviceX.NET' } }
);
__PACKAGE__->__set_name('GetWeatherResponse');
__PACKAGE__->__set_nillable(); } # end BLOCK
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref('');
1;
__END__ } # end of BLOCK
1;
=pod
# __END__
=head1 NAME MyElements::GetWeatherResponse
=pod
=head1 SYNOPSIS
=head1 NAME
=head1 DESCRIPTION
MyElements::GetWeatherResponse
Type class for the XML element GetWeatherResponse.
=head1 DESCRIPTION
=head1 PROPERTIES
Perl data type class for the XML Schema defined element
The following properties may be accessed using get_PROPERTY / set_PROPERTY GetWeatherResponse from the namespace http://www.webserviceX.NET.
methods:
=head1 METHODS
GetWeatherResult
=head2 new
=head1 Object structure
my $element = MyElements::GetWeatherResponse->new($data);
GetWeatherResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
Constructor. The following data structure may be passed to new():
Structure as perl hash: {
GetWeatherResult => $some_value, # string
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). =head1 AUTHOR
new() will accept a hash structure like this, but transform it to a object
tree. Generated by SOAP::WSDL
'GetWeatherResponse'=> { =cut
'GetWeatherResult' => $someValue,
},
=cut
+52 -60
View File
@@ -1,60 +1,52 @@
package MyElements::int; package MyElements::int;
use strict; use strict;
use Class::Std::Storable; use warnings;
use SOAP::WSDL::XSD::Typelib::Element;
{ # BLOCK to scope variables
#
# <element name="int" type="s:int"/> definition sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
#
__PACKAGE__->__set_name('int');
use base qw( __PACKAGE__->__set_nillable();
SOAP::WSDL::XSD::Typelib::Element __PACKAGE__->__set_minOccurs();
SOAP::WSDL::XSD::Typelib::Builtin::int __PACKAGE__->__set_maxOccurs();
); __PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' } SOAP::WSDL::XSD::Typelib::Builtin::int
__PACKAGE__->__set_name('int'); );
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs(); } # end of BLOCK
__PACKAGE__->__set_ref(''); 1;
1; # __END__
=pod
__END__
=head1 NAME
=pod
MyElements::int
=head1 NAME MyElements::int
=head1 DESCRIPTION
=head1 SYNOPSIS
Perl data type class for the XML Schema defined element
=head1 DESCRIPTION int from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
Type class for the XML element int. =head1 METHODS
=head1 PROPERTIES =head2 new
The following properties may be accessed using get_PROPERTY / set_PROPERTY my $element = MyElements::int->new($data);
methods:
Constructor. The following data structure may be passed to new():
=head1 Object structure $some_value, # int
=head1 AUTHOR
Structure as perl hash:
Generated by SOAP::WSDL
The object structure is displayed as hash below though this is not correct.
Complex hash elements actually are objects of their corresponding classes =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.
'int' => $someValue,
=cut
+54 -71
View File
@@ -1,71 +1,54 @@
package MyElements::readNodeCount; package MyElements::readNodeCount;
use strict; use strict;
use Class::Std::Storable; use warnings;
use SOAP::WSDL::XSD::Typelib::Element;
{ # BLOCK to scope variables
# atomic complexType
# <element name="readNodeCount"><complexType> definition sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
use SOAP::WSDL::XSD::Typelib::ComplexType;
use base qw( __PACKAGE__->__set_name('readNodeCount');
SOAP::WSDL::XSD::Typelib::Element __PACKAGE__->__set_nillable();
SOAP::WSDL::XSD::Typelib::ComplexType __PACKAGE__->__set_minOccurs();
); __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
__PACKAGE__->_factory( SOAP::WSDL::XSD::Typelib::Element
[ qw() ], SOAP::WSDL::XSD::Typelib::ComplexType
{ );
},
{
} } # end of BLOCK
); 1;
# __END__
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' } =pod
__PACKAGE__->__set_name('readNodeCount'); =head1 NAME
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs(); MyElements::readNodeCount
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(''); =head1 DESCRIPTION
1; Perl data type class for the XML Schema defined element
readNodeCount from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
__END__ =head1 METHODS
=pod =head2 new
=head1 NAME MyElements::readNodeCount my $element = MyElements::readNodeCount->new($data);
=head1 SYNOPSIS Constructor. The following data structure may be passed to new():
=head1 DESCRIPTION
Type class for the XML element readNodeCount. =head1 AUTHOR
=head1 PROPERTIES Generated by SOAP::WSDL
The following properties may be accessed using get_PROPERTY / set_PROPERTY =cut
methods:
=head1 Object structure
Structure as perl hash:
The object structure is displayed as hash below though this is not correct.
Complex hash elements actually are objects of their corresponding classes
(look for classes of the same name in your typleib).
new() will accept a hash structure like this, but transform it to a object
tree.
=cut
+79 -85
View File
@@ -1,85 +1,79 @@
package MyElements::readNodeCountResponse; package MyElements::readNodeCountResponse;
use strict; use strict;
use Class::Std::Storable; use warnings;
use SOAP::WSDL::XSD::Typelib::Element;
{ # BLOCK to scope variables
# atomic complexType
# <element name="readNodeCountResponse"><complexType> definition sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' }
use SOAP::WSDL::XSD::Typelib::ComplexType;
use base qw( __PACKAGE__->__set_name('readNodeCountResponse');
SOAP::WSDL::XSD::Typelib::Element __PACKAGE__->__set_nillable();
SOAP::WSDL::XSD::Typelib::ComplexType __PACKAGE__->__set_minOccurs();
); __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
my %readNodeCountResult_of :ATTR(:get<readNodeCountResult>); use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
__PACKAGE__->_factory( );
[ qw( use Class::Std::Storable;
readNodeCountResult use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
) ],
{ { # BLOCK to scope variables
readNodeCountResult => \%readNodeCountResult_of,
my %readNodeCountResult_of :ATTR(:get<readNodeCountResult>);
},
{ __PACKAGE__->_factory(
[ qw(
readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int', readNodeCountResult
) ],
{
} readNodeCountResult => \%readNodeCountResult_of,
); },
{
readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
}
sub get_xmlns { 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx' } );
__PACKAGE__->__set_name('readNodeCountResponse'); } # end BLOCK
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref('');
1;
} # end of BLOCK
__END__ 1;
=pod # __END__
=head1 NAME MyElements::readNodeCountResponse =pod
=head1 SYNOPSIS =head1 NAME
=head1 DESCRIPTION MyElements::readNodeCountResponse
Type class for the XML element readNodeCountResponse. =head1 DESCRIPTION
=head1 PROPERTIES Perl data type class for the XML Schema defined element
readNodeCountResponse from the namespace http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods: =head1 METHODS
readNodeCountResult =head2 new
=head1 Object structure my $element = MyElements::readNodeCountResponse->new($data);
readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int', Constructor. The following data structure may be passed to new():
{
Structure as perl hash: readNodeCountResult => $some_value, # int
}
The object structure is displayed as hash below though this is not correct.
Complex hash elements actually are objects of their corresponding classes =head1 AUTHOR
(look for classes of the same name in your typleib).
new() will accept a hash structure like this, but transform it to a object Generated by SOAP::WSDL
tree.
=cut
'readNodeCountResponse'=> {
'readNodeCountResult' => $someValue,
},
=cut
+86
View File
@@ -0,0 +1,86 @@
package MyElements::sayHello;
use strict;
use warnings;
{ # BLOCK to scope variables
sub get_xmlns { 'urn:HelloWorld' }
__PACKAGE__->__set_name('sayHello');
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %name_of :ATTR(:get<name>);
my %givenName_of :ATTR(:get<givenName>);
__PACKAGE__->_factory(
[ qw(
name
givenName
) ],
{
name => \%name_of,
givenName => \%givenName_of,
},
{
name => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
givenName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
}
);
} # end BLOCK
} # end of BLOCK
1;
# __END__
=pod
=head1 NAME
MyElements::sayHello
=head1 DESCRIPTION
Perl data type class for the XML Schema defined element
sayHello from the namespace urn:HelloWorld.
=head1 METHODS
=head2 new
my $element = MyElements::sayHello->new($data);
Constructor. The following data structure may be passed to new():
{
name => $some_value, # string
givenName => $some_value, # string
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
@@ -0,0 +1,81 @@
package MyElements::sayHelloResponse;
use strict;
use warnings;
{ # BLOCK to scope variables
sub get_xmlns { 'urn:HelloWorld' }
__PACKAGE__->__set_name('sayHelloResponse');
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %sayHelloResult_of :ATTR(:get<sayHelloResult>);
__PACKAGE__->_factory(
[ qw(
sayHelloResult
) ],
{
sayHelloResult => \%sayHelloResult_of,
},
{
sayHelloResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
}
);
} # end BLOCK
} # end of BLOCK
1;
# __END__
=pod
=head1 NAME
MyElements::sayHelloResponse
=head1 DESCRIPTION
Perl data type class for the XML Schema defined element
sayHelloResponse from the namespace urn:HelloWorld.
=head1 METHODS
=head2 new
my $element = MyElements::sayHelloResponse->new($data);
Constructor. The following data structure may be passed to new():
{
sayHelloResult => $some_value, # string
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+52 -60
View File
@@ -1,60 +1,52 @@
package MyElements::string; package MyElements::string;
use strict; use strict;
use Class::Std::Storable; use warnings;
use SOAP::WSDL::XSD::Typelib::Element;
{ # BLOCK to scope variables
#
# <element name="string" type="s:string"/> definition sub get_xmlns { 'http://www.webserviceX.NET' }
#
__PACKAGE__->__set_name('string');
use base qw( __PACKAGE__->__set_nillable(true);
SOAP::WSDL::XSD::Typelib::Element __PACKAGE__->__set_minOccurs();
SOAP::WSDL::XSD::Typelib::Builtin::string __PACKAGE__->__set_maxOccurs();
); __PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
sub get_xmlns { 'http://www.webserviceX.NET' } SOAP::WSDL::XSD::Typelib::Builtin::string
__PACKAGE__->__set_name('string'); );
__PACKAGE__->__set_nillable(true);
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs(); } # end of BLOCK
__PACKAGE__->__set_ref(''); 1;
1; # __END__
=pod
__END__
=head1 NAME
=pod
MyElements::string
=head1 NAME MyElements::string
=head1 DESCRIPTION
=head1 SYNOPSIS
Perl data type class for the XML Schema defined element
=head1 DESCRIPTION string from the namespace http://www.webserviceX.NET.
Type class for the XML element string. =head1 METHODS
=head1 PROPERTIES =head2 new
The following properties may be accessed using get_PROPERTY / set_PROPERTY my $element = MyElements::string->new($data);
methods:
Constructor. The following data structure may be passed to new():
=head1 Object structure $some_value, # string
=head1 AUTHOR
Structure as perl hash:
Generated by SOAP::WSDL
The object structure is displayed as hash below though this is not correct.
Complex hash elements actually are objects of their corresponding classes =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.
'string' => $someValue,
=cut
@@ -0,0 +1,133 @@
package MyInterfaces::BarCode::BarCodeSoap;
use strict;
use warnings;
use Class::Std::Storable;
use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before
require MyTypemaps::BarCode
if not MyTypemaps::BarCode->can('get_class');
sub START {
$_[0]->set_proxy('http://www.webservicex.net/genericbarcode.asmx') if not $_[2]->{proxy};
$_[0]->set_class_resolver('MyTypemaps::BarCode')
if not $_[2]->{class_resolver};
}
sub GenerateBarCode {
my ($self, $body, $header) = @_;
return $self->SUPER::call({
operation => 'GenerateBarCode',
soap_action => 'http://www.webservicex.net/GenerateBarCode',
style => 'document',
body => {
'use' => 'literal',
namespace => '',
encodingStyle => '',
parts => [qw( MyElements::GenerateBarCode )],
},
header => {
},
headerfault => {
}
}, $body, $header);
}
1;
__END__
=pod
=head1 NAME
MyInterfaces::BarCode::BarCodeSoap - SOAP Interface for the BarCode Web Service
=head1 SYNOPSIS
use MyInterfaces::BarCode::BarCodeSoap;
my $interface = MyInterfaces::BarCode::BarCodeSoap->new();
my $response;
$response = $interface->GenerateBarCode();
=head1 DESCRIPTION
SOAP Interface for the BarCode web service
located at http://www.webservicex.net/genericbarcode.asmx.
=head1 SERVICE BarCode
Barcode generator
=head2 Port BarCodeSoap
=head1 METHODS
=head2 General methods
=head3 new
Constructor.
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
=head2 SOAP Service methods
Method synopsis is displayed with hash refs as parameters.
The commented class names in the method's parameters denote that objects
of the corresponding class can be passed instead of the marked hash ref.
You may pass any combination of objects, hash and list refs to these
methods, as long as you meet the structure.
=head3 GenerateBarCode
WebserviceX.NET barcode library that provides the means to create barcodes for printing and display in any internet enabled applications. This web service supports Code 128, Industrial 2 of 5, Interleaved 2 of 5, Code 2 5 Matrix, Code 39, Code 39 Extended, Code 93, Code 93 Extended, Codabar, EAN13, EAN8, MSI, Postnet, Supp2, Supp5, UPC A, UPC E0 and UPC E1 barcode formats. This Barcodes returns byte image. It supports following image format JPEG, GIF, PNG, BMP, EMF, EXIF, ICON, MEMORY BMP, TIFF and WMF.
$interface->GenerateBarCode( {
BarCodeParam => { # MyTypes::BarCodeData
Height => $some_value, # int
Width => $some_value, # int
Angle => $some_value, # int
Ratio => $some_value, # int
Module => $some_value, # int
Left => $some_value, # int
Top => $some_value, # int
CheckSum => $some_value, # boolean
FontName => $some_value, # string
BarColor => $some_value, # string
BGColor => $some_value, # string
FontSize => $some_value, # float
barcodeOption => $some_value, # BarcodeOption
barcodeType => $some_value, # BarcodeType
checkSumMethod => $some_value, # CheckSumMethod
showTextPosition => $some_value, # ShowTextPosition
BarCodeImageFormat => $some_value, # ImageFormats
},
BarCodeText => $some_value, # string
},,
);
=head1 AUTHOR
Generated by SOAP::WSDL on Fri Nov 9 00:18:35 2007
=pod
@@ -1,327 +0,0 @@
package MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie;
use strict;
use warnings;
use MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie;
use base 'SOAP::WSDL::Client::Base';
sub new {
my $class = shift;
my $arg_ref = shift || {};
my $self = $class->SUPER::new({
class_resolver => 'MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie',
proxy => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx',
%{ $arg_ref }
});
return bless $self, $class;
}
__PACKAGE__->__create_methods(
GetSpecificCookie => [ 'MyElements::GetSpecificCookie', ],
CountCookies => [ 'MyElements::CountCookies', ],
readNodeCount => [ 'MyElements::readNodeCount', ],
GetFortuneCookie => [ 'MyElements::GetFortuneCookie', ],
);
1;
__END__
=pod
=head1 NAME
MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie - SOAP interface to FullerData_x0020_Fortune_x0020_Cookie at
http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx
=head1 SYNOPSIS
my $interface = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie->new();
my $CountCookies = $interface->CountCookies();
=head1 Service FullerData_x0020_Fortune_x0020_Cookie
=head2 Service information:
Port name: FullerData_x0020_Fortune_x0020_CookieSoap
Binding: tns:FullerData_x0020_Fortune_x0020_CookieSoap
Location: http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx
=head2 SOAP Operations
B<Note:>
Input, output and fault messages are stated as perl hash refs.
These are only for informational purposes - the actual implementation
normally uses object trees, not hash refs, though the input messages
may be passed to the respective methods as hash refs and will be
converted to object trees automatically.
=head3 readNodeCount
B<Input Message:>
{
}
B<Output Message:>
{
}
B<Fault:>
=head3 GetFortuneCookie
B<Input Message:>
{
}
B<Output Message:>
{
}
B<Fault:>
=head3 CountCookies
B<Input Message:>
{
}
B<Output Message:>
{
}
B<Fault:>
=head3 GetSpecificCookie
B<Input Message:>
{
}
B<Output Message:>
{
}
B<Fault:>
=head2 Service information:
Port name: FullerData_x0020_Fortune_x0020_CookieHttpGet
Binding: tns:FullerData_x0020_Fortune_x0020_CookieHttpGet
Location:
=head2 SOAP Operations
B<Note:>
Input, output and fault messages are stated as perl hash refs.
These are only for informational purposes - the actual implementation
normally uses object trees, not hash refs, though the input messages
may be passed to the respective methods as hash refs and will be
converted to object trees automatically.
=head3 readNodeCount
B<Input Message:>
{
}
B<Output Message:>
{
}
B<Fault:>
=head3 GetFortuneCookie
B<Input Message:>
{
}
B<Output Message:>
{
}
B<Fault:>
=head3 CountCookies
B<Input Message:>
{
}
B<Output Message:>
{
}
B<Fault:>
=head3 GetSpecificCookie
B<Input Message:>
{
}
B<Output Message:>
{
}
B<Fault:>
=head2 Service information:
Port name: FullerData_x0020_Fortune_x0020_CookieHttpPost
Binding: tns:FullerData_x0020_Fortune_x0020_CookieHttpPost
Location:
=head2 SOAP Operations
B<Note:>
Input, output and fault messages are stated as perl hash refs.
These are only for informational purposes - the actual implementation
normally uses object trees, not hash refs, though the input messages
may be passed to the respective methods as hash refs and will be
converted to object trees automatically.
=head3 readNodeCount
B<Input Message:>
{
}
B<Output Message:>
{
}
B<Fault:>
=head3 GetFortuneCookie
B<Input Message:>
{
}
B<Output Message:>
{
}
B<Fault:>
=head3 CountCookies
B<Input Message:>
{
}
B<Output Message:>
{
}
B<Fault:>
=head3 GetSpecificCookie
B<Input Message:>
{
}
B<Output Message:>
{
}
B<Fault:>
=cut
@@ -0,0 +1,191 @@
package MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap;
use strict;
use warnings;
use Class::Std::Storable;
use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before
require MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie
if not MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie->can('get_class');
sub START {
$_[0]->set_proxy('http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx') if not $_[2]->{proxy};
$_[0]->set_class_resolver('MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie')
if not $_[2]->{class_resolver};
}
sub readNodeCount {
my ($self, $body, $header) = @_;
return $self->SUPER::call({
operation => 'readNodeCount',
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/readNodeCount',
style => 'document',
body => {
'use' => 'literal',
namespace => '',
encodingStyle => '',
parts => [qw( MyElements::readNodeCount )],
},
header => {
},
headerfault => {
}
}, $body, $header);
}
sub GetFortuneCookie {
my ($self, $body, $header) = @_;
return $self->SUPER::call({
operation => 'GetFortuneCookie',
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetFortuneCookie',
style => 'document',
body => {
'use' => 'literal',
namespace => '',
encodingStyle => '',
parts => [qw( MyElements::GetFortuneCookie )],
},
header => {
},
headerfault => {
}
}, $body, $header);
}
sub CountCookies {
my ($self, $body, $header) = @_;
return $self->SUPER::call({
operation => 'CountCookies',
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/CountCookies',
style => 'document',
body => {
'use' => 'literal',
namespace => '',
encodingStyle => '',
parts => [qw( MyElements::CountCookies )],
},
header => {
},
headerfault => {
}
}, $body, $header);
}
sub GetSpecificCookie {
my ($self, $body, $header) = @_;
return $self->SUPER::call({
operation => 'GetSpecificCookie',
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetSpecificCookie',
style => 'document',
body => {
'use' => 'literal',
namespace => '',
encodingStyle => '',
parts => [qw( MyElements::GetSpecificCookie )],
},
header => {
},
headerfault => {
}
}, $body, $header);
}
1;
__END__
=pod
=head1 NAME
MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap - SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie Web Service
=head1 DESCRIPTION
SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie web service
located at http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx.
=head1 SERVICE FullerData_x0020_Fortune_x0020_Cookie
Simple XML-based fortune cookie
=head2 Port FullerData_x0020_Fortune_x0020_CookieSoap
=head1 METHODS
=head2 General methods
=head3 new
Constructor.
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
=head2 SOAP Service methods
Method synopsis is displayed with hash refs as parameters.
The commented class names in the method's parameters denote that objects
of the corresponding class can be passed instead of the marked hash ref.
You may pass any combination of objects, hash and list refs to these
methods, as long as you meet the structure.
=head3 readNodeCount
Display the number of nodes specified in fortune XML document
$interface->readNodeCount(,
);
=head3 GetFortuneCookie
Get a random fortune cookie from the XML document
$interface->GetFortuneCookie(,
);
=head3 CountCookies
Count the actual number of nodes in the XML document of fortunes
$interface->CountCookies(,
);
=head3 GetSpecificCookie
Get a specific cookie by the XML node number
$interface->GetSpecificCookie( {
index => $some_value, # int
},
);
=head1 AUTHOR
Generated by SOAP::WSDL on Tue Nov 6 20:56:46 2007
=pod
-68
View File
@@ -1,68 +0,0 @@
package MyInterfaces::GlobalWeather;
use strict;
use warnings;
use MyTypemaps::GlobalWeather;
use base 'SOAP::WSDL::Client::Base';
sub new {
my $class = shift;
my $arg_ref = shift || {};
my $self = $class->SUPER::new({
class_resolver => 'MyTypemaps::GlobalWeather',
proxy => 'http://www.webservicex.net/globalweather.asmx',
%{ $arg_ref }
});
return bless $self, $class;
}
__PACKAGE__->__create_methods(
GetWeather => [ 'MyElements::GetWeather', ],
GetCitiesByCountry => [ 'MyElements::GetCitiesByCountry', ],
);
1;
__END__
=pod
=head1 NAME
MyInterfaces::GlobalWeather - SOAP interface to GlobalWeather at
http://www.webservicex.net/globalweather.asmx
=head1 SYNOPSIS
my $interface = MyInterfaces::GlobalWeather->new();
my $GetCitiesByCountry = $interface->GetCitiesByCountry();
=head1 METHODS
=head2 GetWeather
Get weather report for all major cities around the world.
SYNOPSIS:
$service->GetWeather({
'CityName' => $someValue,
'CountryName' => $someValue,
});
=head2 GetCitiesByCountry
Get all major cities by country name(full / part).
SYNOPSIS:
$service->GetCitiesByCountry({
'CountryName' => $someValue,
});
=cut
@@ -0,0 +1,136 @@
package MyInterfaces::GlobalWeather::GlobalWeatherSoap;
use strict;
use warnings;
use Class::Std::Storable;
use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before
require MyTypemaps::GlobalWeather
if not MyTypemaps::GlobalWeather->can('get_class');
sub START {
$_[0]->set_proxy('http://www.webservicex.net/globalweather.asmx') if not $_[2]->{proxy};
$_[0]->set_class_resolver('MyTypemaps::GlobalWeather')
if not $_[2]->{class_resolver};
}
sub GetWeather {
my ($self, $body, $header) = @_;
return $self->SUPER::call({
operation => 'GetWeather',
soap_action => 'http://www.webserviceX.NET/GetWeather',
style => 'document',
body => {
'use' => 'literal',
namespace => '',
encodingStyle => '',
parts => [qw( MyElements::GetWeather )],
},
header => {
},
headerfault => {
}
}, $body, $header);
}
sub GetCitiesByCountry {
my ($self, $body, $header) = @_;
return $self->SUPER::call({
operation => 'GetCitiesByCountry',
soap_action => 'http://www.webserviceX.NET/GetCitiesByCountry',
style => 'document',
body => {
'use' => 'literal',
namespace => '',
encodingStyle => '',
parts => [qw( MyElements::GetCitiesByCountry )],
},
header => {
},
headerfault => {
}
}, $body, $header);
}
1;
__END__
=pod
=head1 NAME
MyInterfaces::GlobalWeather::GlobalWeatherSoap - SOAP Interface for the GlobalWeather Web Service
=head1 DESCRIPTION
SOAP Interface for the GlobalWeather web service
located at http://www.webservicex.net/globalweather.asmx.
=head1 SERVICE GlobalWeather
=head2 Port GlobalWeatherSoap
=head1 METHODS
=head2 General methods
=head3 new
Constructor.
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
=head2 SOAP Service methods
Method synopsis is displayed with hash refs as parameters.
The commented class names in the method's parameters denote that objects
of the corresponding class can be passed instead of the marked hash ref.
You may pass any combination of objects, hash and list refs to these
methods, as long as you meet the structure.
=head3 GetWeather
Get weather report for all major cities around the world.
$interface->GetWeather( {
CityName => $some_value, # string
CountryName => $some_value, # string
},
);
=head3 GetCitiesByCountry
Get all major cities by country name(full / part).
$interface->GetCitiesByCountry( {
CountryName => $some_value, # string
},
);
=head1 AUTHOR
Generated by SOAP::WSDL on Tue Nov 6 21:00:30 2007
=pod
@@ -0,0 +1,117 @@
package MyInterfaces::HelloWorld::HelloWorldSoap;
use strict;
use warnings;
use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before
require MyTypemaps::HelloWorld
if not MyTypemaps::HelloWorld->can('get_class');
sub START {
$_[0]->set_proxy('http://localhost:81/soap-wsdl-test/helloworld.pl') if not $_[2]->{proxy};
$_[0]->set_class_resolver('MyTypemaps::HelloWorld')
if not $_[2]->{class_resolver};
}
sub sayHello {
my ($self, $body, $header) = @_;
die "sayHello must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({
operation => 'sayHello',
soap_action => 'urn:HelloWorld#sayHello',
style => 'document',
body => {
'use' => 'literal',
namespace => '',
encodingStyle => '',
parts => [qw( MyElements::sayHello )],
},
header => {
},
headerfault => {
}
}, $body, $header);
}
1;
__END__
=pod
=head1 NAME
MyInterfaces::HelloWorld::HelloWorldSoap - SOAP Interface for the HelloWorld Web Service
=head1 SYNOPSIS
use MyInterfaces::HelloWorld::HelloWorldSoap;
my $interface = MyInterfaces::HelloWorld::HelloWorldSoap->new();
my $response;
$response = $interface->sayHello();
=head1 DESCRIPTION
SOAP Interface for the HelloWorld web service
located at http://localhost:81/soap-wsdl-test/helloworld.pl.
=head1 SERVICE HelloWorld
=head2 Port HelloWorldSoap
=head1 METHODS
=head2 General methods
=head3 new
Constructor.
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
=head2 SOAP Service methods
Method synopsis is displayed with hash refs as parameters.
The commented class names in the method's parameters denote that objects
of the corresponding class can be passed instead of the marked hash ref.
You may pass any combination of objects, hash and list refs to these
methods, as long as you meet the structure.
=head3 sayHello
$interface->sayHello( {
name => $some_value, # string
givenName => $some_value, # string
},,
);
=head1 AUTHOR
Generated by SOAP::WSDL on Sat Dec 1 19:51:31 2007
=pod
@@ -0,0 +1,113 @@
package MyServer::HelloWorld::HelloWorldSoap;
use strict;
use warnings;
use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before
require MyTypemaps::HelloWorld
if not MyTypemaps::HelloWorld->can('get_class');
my %transport_class_of :ATTR(:name<transport_class> :default<SOAP::WSDL::Server::CGI>);
my %transport_of :ATTR(:name<transport> :default<()>);
my %dispatch_to :ATTR(:name<dispatch_to>);
my $action_map_ref = {
'urn:HelloWorld#sayHello' => 'sayHello',
};
sub START {
my ($self, $ident, $arg_ref) = @_;
eval "require $transport_class_of{ $ident }"
or die "Cannot load transport class $transport_class_of{ $ident }: $@";
$transport_of{ $ident } = $transport_class_of{ $ident }->new({
action_map_ref => $action_map_ref,
class_resolver => 'MyTypemaps::HelloWorld',
dispatch_to => $dispatch_to{ $ident },
});
}
sub handle {
$transport_of{ ${ $_[0] } }->handle();
}
1;
__END__
=pod
=head1 NAME
MyInterfaces::HelloWorld::HelloWorldSoap - SOAP Server Class for the HelloWorld Web Service
=head1 SYNOPSIS
use MyServer::HelloWorld::HelloWorldSoap;
my $server = MyServer::HelloWorld::HelloWorldSoap->new({
dispatch_to => 'My::Handler::Class',
transport_class => 'SOAP::WSDL::Server::CGI', # optional, default
});
$server->handle();
=head1 DESCRIPTION
SOAP Server handler for the HelloWorld web service
located at http://localhost:81/soap-wsdl-test/helloworld.pl.
=head1 SERVICE HelloWorld
=head2 Port HelloWorldSoap
=head1 METHODS
=head2 General methods
=head3 new
Constructor.
The C<dispatch_to> argument is mandatory. It must be a class or object
implementing the SOAP Service methods listed below.
=head2 SOAP Service methods
Your dispatch_to class has to implement the following methods:
The examples below serve as copy-and-paste prototypes to use in your
class.
=head3 sayHello
sub sayHello(
my ($self, $body, $header) = @_;
# body is a ??? object - sorry, POD not implemented yet
# header is a ??? object - sorry, POD not implemented yet
# do something with body and header...
return MyElements::sayHelloResponse->new( {
sayHelloResult => $some_value, # string
},
);
}
=head1 AUTHOR
Generated by SOAP::WSDL on Sun Dec 2 01:20:36 2007
=pod
+57
View File
@@ -0,0 +1,57 @@
package MyTypemaps::BarCode;
use strict;
use warnings;
our $typemap_1 = {
'GenerateBarCode/BarCodeText' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'GenerateBarCode/BarCodeParam/BarColor' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'GenerateBarCode/BarCodeParam/barcodeOption' => 'MyTypes::BarcodeOption',
'GenerateBarCode/BarCodeParam/Left' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
'GenerateBarCode' => 'MyElements::GenerateBarCode',
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'GenerateBarCode/BarCodeParam/Width' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'GenerateBarCode/BarCodeParam/Angle' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
'GenerateBarCode/BarCodeParam/BarCodeImageFormat' => 'MyTypes::ImageFormats',
'GenerateBarCode/BarCodeParam/BGColor' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'GenerateBarCode/BarCodeParam/Ratio' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN',
'GenerateBarCode/BarCodeParam/Height' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'GenerateBarCode/BarCodeParam/CheckSum' => 'SOAP::WSDL::XSD::Typelib::Builtin::boolean',
'GenerateBarCode/BarCodeParam/checkSumMethod' => 'MyTypes::CheckSumMethod',
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'GenerateBarCode/BarCodeParam/barcodeType' => 'MyTypes::BarcodeType',
'GenerateBarCode/BarCodeParam/FontSize' => 'SOAP::WSDL::XSD::Typelib::Builtin::float',
'GenerateBarCode/BarCodeParam/Top' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'GenerateBarCodeResponse/GenerateBarCodeResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::base64Binary',
'GenerateBarCodeResponse' => 'MyElements::GenerateBarCodeResponse',
'GenerateBarCode/BarCodeParam/Module' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'GenerateBarCode/BarCodeParam' => 'MyTypes::BarCodeData',
'GenerateBarCode/BarCodeParam/showTextPosition' => 'MyTypes::ShowTextPosition',
'GenerateBarCode/BarCodeParam/FontName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string'
};
;
sub get_class {
my $name = join '/', @{ $_[1] };
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
return $typemap_1->{ $name };
}
1;
__END__
=pod
=head1 NAME
MyTypemaps::BarCode; - typemap for ::BarCode;
=head1 DESCRIPTION
Typemap created by SOAP::WSDL for map-based SOAP message parsers.
=cut
@@ -1,49 +1,48 @@
package MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie; package MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie;
use strict; use strict;
use warnings; use warnings;
my %typemap = ( our $typemap_1 = {
'readNodeCount' => 'MyElements::readNodeCount', 'GetFortuneCookie' => 'MyElements::GetFortuneCookie',
'readNodeCountResponse' => 'MyElements::readNodeCountResponse', 'CountCookiesResponse/CountCookiesResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
# atomic complex type (sequence) 'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
'readNodeCountResponse/readNodeCountResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::int', 'readNodeCountResponse/readNodeCountResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'CountCookiesResponse' => 'MyElements::CountCookiesResponse',
# end atomic complex type (sequence) 'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'GetFortuneCookie' => 'MyElements::GetFortuneCookie', 'GetSpecificCookieResponse' => 'MyElements::GetSpecificCookieResponse',
'GetFortuneCookieResponse' => 'MyElements::GetFortuneCookieResponse', 'GetFortuneCookieResponse' => 'MyElements::GetFortuneCookieResponse',
# atomic complex type (sequence) 'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
'GetFortuneCookieResponse/GetFortuneCookieResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'GetSpecificCookie' => 'MyElements::GetSpecificCookie',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN',
# end atomic complex type (sequence) 'CountCookies' => 'MyElements::CountCookies',
'CountCookies' => 'MyElements::CountCookies', 'GetSpecificCookie/index' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'CountCookiesResponse' => 'MyElements::CountCookiesResponse', 'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
# atomic complex type (sequence) 'GetFortuneCookieResponse/GetFortuneCookieResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'CountCookiesResponse/CountCookiesResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::int', 'GetSpecificCookieResponse/GetSpecificCookieResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'readNodeCount' => 'MyElements::readNodeCount',
# end atomic complex type (sequence) 'readNodeCountResponse' => 'MyElements::readNodeCountResponse'
'GetSpecificCookie' => 'MyElements::GetSpecificCookie', };
# atomic complex type (sequence) ;
'GetSpecificCookie/index' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
sub get_class {
# end atomic complex type (sequence) my $name = join '/', @{ $_[1] };
'GetSpecificCookieResponse' => 'MyElements::GetSpecificCookieResponse', exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
# atomic complex type (sequence) return $typemap_1->{ $name };
'GetSpecificCookieResponse/GetSpecificCookieResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', }
# end atomic complex type (sequence) 1;
__END__
=pod
);
=head1 NAME
sub get_class {
my $name = join '/', @{ $_[1] }; MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie; - typemap for ::FullerData_x0020_Fortune_x0020_Cookie;
exists $typemap{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
return $typemap{ $name }; =head1 DESCRIPTION
}
Typemap created by SOAP::WSDL for map-based SOAP message parsers.
1;
=cut
__END__
+44 -50
View File
@@ -1,50 +1,44 @@
package MyTypemaps::GlobalWeather; package MyTypemaps::GlobalWeather;
use strict; use strict;
use warnings; use warnings;
my %typemap = ( our $typemap_1 = {
# SOAP 1.1 fault typemap 'GetWeatherResponse/GetWeatherResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11', 'GetWeather' => 'MyElements::GetWeather',
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI', 'GetCitiesByCountryResponse/GetCitiesByCountryResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN', 'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN',
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'GetWeatherResponse' => 'MyElements::GetWeatherResponse',
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
# generated typemap 'GetWeather/CityName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'GetWeather' => 'MyElements::GetWeather', 'GetCitiesByCountry' => 'MyElements::GetCitiesByCountry',
# atomic complex type (sequence) 'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'GetWeather/CityName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'GetCitiesByCountry/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'GetWeather/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'GetWeather/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
# end atomic complex type (sequence) 'GetCitiesByCountryResponse' => 'MyElements::GetCitiesByCountryResponse'
'GetWeatherResponse' => 'MyElements::GetWeatherResponse', };
# atomic complex type (sequence) ;
'GetWeatherResponse/GetWeatherResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
sub get_class {
# end atomic complex type (sequence) my $name = join '/', @{ $_[1] };
'GetCitiesByCountry' => 'MyElements::GetCitiesByCountry', exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
# atomic complex type (sequence) return $typemap_1->{ $name };
'GetCitiesByCountry/CountryName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', }
# end atomic complex type (sequence) 1;
'GetCitiesByCountryResponse' => 'MyElements::GetCitiesByCountryResponse',
# atomic complex type (sequence) __END__
'GetCitiesByCountryResponse/GetCitiesByCountryResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
=pod
# end atomic complex type (sequence)
=head1 NAME
MyTypemaps::GlobalWeather; - typemap for ::GlobalWeather;
); =head1 DESCRIPTION
sub get_class { Typemap created by SOAP::WSDL for map-based SOAP message parsers.
my $name = join '/', @{ $_[1] };
exists $typemap{ $name } or die "Cannot resolve $name via " . __PACKAGE__; =cut
return $typemap{ $name };
}
1;
__END__
+44
View File
@@ -0,0 +1,44 @@
package MyTypemaps::HelloWorld;
use strict;
use warnings;
our $typemap_1 = {
'sayHello/givenName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'sayHelloResponse' => 'MyElements::sayHelloResponse',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'sayHelloResponse/sayHelloResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
'sayHello' => 'MyElements::sayHello',
'sayHello/name' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11'
};
;
sub get_class {
my $name = join '/', @{ $_[1] };
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
return $typemap_1->{ $name };
}
sub get_typemap {
return $typemap_1;
}
1;
__END__
=pod
=head1 NAME
MyTypemaps::HelloWorld; - typemap for ::HelloWorld;
=head1 DESCRIPTION
Typemap created by SOAP::WSDL for map-based SOAP message parsers.
=cut
+74
View File
@@ -0,0 +1,74 @@
package MyTypes::test2;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %name_of :ATTR(:get<name>);
my %givenName_of :ATTR(:get<givenName>);
__PACKAGE__->_factory(
[ qw(
name
givenName
) ],
{
name => \%name_of,
givenName => \%givenName_of,
},
{
name => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
givenName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::test2
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
test2 from the namespace urn:HelloWorld.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
name
givenName
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::test2
name => $some_value, # string
givenName => $some_value, # string
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+68
View File
@@ -0,0 +1,68 @@
package MyTypes::testExtended;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %extend_of :ATTR(:get<extend>);
__PACKAGE__->_factory(
[ qw(
extend
) ],
{
extend => \%extend_of,
},
{
extend => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::testExtended
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
testExtended from the namespace urn:HelloWorld.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
extend
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::testExtended
extend => $some_value, # string
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+26
View File
@@ -0,0 +1,26 @@
package PersonVisitor;
use Class::Std; # handles all basic stuff like constructors etc.
sub visit_Person {
my ( $self, $object ) = @_;
print "Person name is ", $object->get_name(), "\n";
}
package Person;
use Class::Std;
my %name : ATTR(:name<name> :default<anonymous>);
sub accept { $_[1]->visit_Person( $_[0] ) }
package main;
my @person_from = ();
for (qw(Gamma Helm Johnson Vlissides)) {
push @person_from, Person->new( { name => $_ } );
}
my $visitor = PersonVisitor->new();
for (@person_from) {
$_->accept($visitor);
}
+22 -19
View File
@@ -1,19 +1,22 @@
# 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::GlobalWeatherSoap;
my $weather = MyInterfaces::GlobalWeather->new(); my $weather = MyInterfaces::GlobalWeather::GlobalWeatherSoap->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";
# The result is a XML string
# use get_value to avoid automatic entity encoding
print $result->get_GetWeatherResult()->get_value , "\n";
+43 -25
View File
@@ -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;
$soap = SOAP::Lite->new()->on_action( sub { join'/', @_ } )
->proxy("http://www.webservicex.net/globalweather.asmx"); # from WSDL
$som = $soap->call(
SOAP::Data->name('GetWeather')
->attr({ xmlns => 'http://www.webserviceX.NET' }), # from WSDL
SOAP::Data->name('CountryName')->value('Germany'),
SOAP::Data->name('CityName')->value('Munich')
);
die "Error" if $som->fault();
print $som->result();
+95
View File
@@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="urn:HelloWorld"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
targetNamespace="urn:HelloWorld"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<s:schema elementFormDefault="qualified"
targetNamespace="urn:HelloWorld">
<s:element name="sayHello">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1"
name="name" type="s:string" />
<s:element minOccurs="0" maxOccurs="1"
name="givenName" type="s:string" nillable="1" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="sayHelloResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1"
name="sayHelloResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="test2">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="name"
type="s:string" />
<s:element minOccurs="0" maxOccurs="1"
name="givenName" type="s:string" />
</s:sequence>
</s:complexType>
<s:complexType name="testExtended">
<s:extension base="s0:test2">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1"
name="extend" type="s:string" />
</s:sequence>
</s:extension>
</s:complexType>
</s:schema>
</types>
<message name="sayHelloSoapIn">
<part name="parameters" element="s0:sayHello" />
</message>
<message name="sayHelloSoapOut">
<part name="parameters" element="s0:sayHelloResponse" />
</message>
<portType name="Service1Soap">
<operation name="sayHello">
<input message="s0:sayHelloSoapIn" />
<output message="s0:sayHelloSoapOut" />
</operation>
</portType>
<binding name="Service1Soap" type="s0:Service1Soap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document" />
<operation name="sayHello">
<soap:operation soapAction="urn:HelloWorld#sayHello"
style="document" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>
</binding>
<service name="HelloWorld">
<port name="HelloWorldSoap" binding="s0:Service1Soap">
<soap:address
location="http://localhost:81/soap-wsdl-test/helloworld.pl" />
</port>
</service>
</definitions>
+307 -307
View File
@@ -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
View File
@@ -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
View File
@@ -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>
+482 -364
View File
File diff suppressed because it is too large Load Diff
+65 -97
View File
@@ -1,48 +1,59 @@
package SOAP::WSDL::Base; package SOAP::WSDL::Base;
use strict; use strict;
use warnings; use warnings;
use Carp; use Class::Std::Fast::Storable;
use Class::Std::Storable; use List::Util qw(first);
use List::Util qw(first); use Carp qw(croak carp confess);
our $VERSION='2.00_25';
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 };
} return;
}
sub STORABLE_freeze_pre :CUMULATIVE {}; sub STORABLE_freeze_pre :CUMULATIVE {};
sub STORABLE_freeze_post :CUMULATIVE {}; sub STORABLE_freeze_post :CUMULATIVE {};
sub STORABLE_thaw_pre :CUMULATIVE {}; sub STORABLE_thaw_pre :CUMULATIVE {};
sub STORABLE_thaw_post :CUMULATIVE { return $_[0] }; sub STORABLE_thaw_post :CUMULATIVE { return $_[0] };
sub _accept {
my $self = shift;
my $class = ref $self;
$class =~ s{ \A SOAP::WSDL:: }{}xms;
$class =~ s{ (:? :: ) }{_}gxms;
my $method = "visit_$class";
no strict qw(refs); ## no critic ProhibitNoStrict
return shift->$method( $self );
}
# unfortunately, AUTOMETHOD is SLOW. # unfortunately, AUTOMETHOD is SLOW.
# Re-implement in derived package wherever speed is an issue... # Re-implement in derived package wherever speed is an issue...
# #
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"
# if not ($self->can( $setter ));
return sub { return sub {
no strict qw(refs); no strict qw(refs); ## no critic ProhibitNoStrict
my $old_value = $self->$getter(); my $old_value = $self->$getter();
# Listify if not a list ref # Listify if not a list ref
$old_value = $old_value ? [ $old_value ] : [] if not ref $old_value; $old_value = $old_value ? [ $old_value ] : [] if not ref $old_value;
@@ -54,6 +65,7 @@ sub AUTOMETHOD {
# we're called as $obj->find_something($ns, $key) # we're called as $obj->find_something($ns, $key)
elsif ($subname =~s {^find_}{get_}xms) { elsif ($subname =~s {^find_}{get_}xms) {
@values = @{ $values[0] } if ref $values[0] eq 'ARRAY';
return sub { return sub {
return first { return first {
$_->get_targetNamespace() eq $values[0] && $_->get_targetNamespace() eq $values[0] &&
@@ -70,20 +82,17 @@ sub AUTOMETHOD {
return $result_ref->[0]; return $result_ref->[0];
}; };
} }
croak "$subname not found in class " . (ref $self || $self); confess "$subname not found in class " . (ref $self || $self) ;
} }
sub init { sub init {
my $self = shift; my ($self, @args) = @_;
my @args = @_;
foreach my $value (@args) foreach my $value (@args)
{ {
die $value if (not defined ($value->{ Name })); croak @args if (not defined ($value->{ Name }));
if ($value->{ Name } =~m{^xmlns\:}xms) { if ($value->{ Name } =~m{^xmlns\:}xms) {
die $xmlns_of{ ident $self } # add namespaces
if ref $xmlns_of{ ident $self } ne 'HASH'; $xmlns_of{ ident $self }->{ $value->{ LocalName } } = $value->{ Value };
$xmlns_of{ ident $self }->{ $value->{ Value } } =
$value->{ LocalName };
next; next;
} }
elsif ($value->{ Name } =~m{^xmlns$}xms) { elsif ($value->{ Name } =~m{^xmlns$}xms) {
@@ -91,80 +100,39 @@ sub init {
# TODO handle xmlns correctly - maybe via setting a prefix ? # TODO handle xmlns correctly - maybe via setting a prefix ?
next; next;
} }
my $name = $value->{ LocalName };
my $method = "set_$name"; my $name = $value->{ LocalName };
$self->$method( $value->{ Value } ) if ( $method ); my $method = "set_$name";
$self->$method( $value->{ Value } );
} }
return $self; return $self;
} }
sub add_namespace { sub expand {
my ($self, $uri, $prefix ) = @_; my ($self, , $qname) = @_;
return unless $uri; my ($prefix, $localname) = split /:/x, $qname;
$self->{ namespace } ||= {}; # my %ns_map = reverse %{ $self->get_xmlns() };
$self->{ namespace }->{ $uri } = $prefix; my %ns_map = %{ $self->get_xmlns() };
} return ($ns_map{ $prefix }, $localname) if ($ns_map{ $prefix });
sub to_typemap { if (my $parent = $self->get_parent()) {
warn "to_typemap"; return $parent->expand($qname);
return q{}; }
confess "unbound prefix $prefix found for $prefix:$localname. Bound prefixes are"
. join(', ', keys %ns_map);
} }
sub _expand;
sub toClass { *_expand = \&expand;
my $self = shift;
warn 'toClass is deprecated and will be removed before reaching 2.01 - '
. 'use to_class instead (' . caller() . ')';
$self->to_class(@_);
}
sub to_class {
my $self = shift;
my $opt = shift;
my $template = shift;
$opt->{ base_path } ||= '.';
my $element_prefix = $opt->{ element_prefix } || $opt->{ prefix };
my $type_prefix = $opt->{ type_prefix } || $opt->{ prefix };
if (($type_prefix) && ($type_prefix !~m{ :: $ }xms ) ) {
warn 'type_prefix should end with "::"';
$type_prefix .= '::';
}
if (($element_prefix) && ($element_prefix !~m{ :: $ }xms) ) {
warn 'element_prefix should end with "::"';
$element_prefix .= '::';
}
# Be careful: a Element may be ComplexType, too
# (but not vice versa)
my $prefix = $self->isa('SOAP::WSDL::XSD::Element')
? $element_prefix
: $type_prefix;
die 'No prefix specified' if not $prefix;
my $filename = $prefix . $self->get_name() . '.pm';
$filename =~s{::}{/}xmsg;
my $output = $opt->{ output } || $filename;
require Template;
my $tt = Template->new(
RELATIVE => 1,
OUTPUT_PATH => $opt->{ base_path },
);
my $code = $tt->process( \$template, {
element_prefix => $element_prefix,
type_prefix => $type_prefix,
self => $self,
nsmap => { reverse %{ $opt->{ wsdl }->get_xmlns() } },
structure => $self->explain( { wsdl => $opt->{ wsdl } } ),
},
$output
)
or die $tt->error();
}
1; 1;
__END__
# REPOSITORY INFORMATION
#
# $Rev: 332 $
# $LastChangedBy: kutterma $
# $Id: WSDL.pm 332 2007-10-19 07:29:03Z kutterma $
# $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $
#
+2 -104
View File
@@ -1,115 +1,13 @@
package SOAP::WSDL::Binding; package SOAP::WSDL::Binding;
use strict; use strict;
use warnings; use warnings;
use Class::Std::Storable; use Class::Std::Fast::Storable;
use List::Util qw(first); use List::Util qw(first);
use base qw(SOAP::WSDL::Base); use base qw(SOAP::WSDL::Base);
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 {
my $self = shift;
my $opt = shift;
my $name = $self->get_name();
die 'required atribute wsdl missing' if not $opt->{ wsdl };
my $portType = $opt->{ wsdl }->find_portType(
$opt->{ wsdl }->_expand( $self->get_type() )
) or die 'portType not found: ' . $self->get_type();
my $txt = <<"EOT";
=head2 SOAP Operations
B<Note:>
Input, output and fault messages are stated as perl hash refs.
These are only for informational purposes - the actual implementation
normally uses object trees, not hash refs, though the input messages
may be passed to the respective methods as hash refs and will be
converted to object trees automatically.
EOT
foreach my $operation (@{ $self->get_operation() }) {
my $operation_name = $operation->get_name();
my $operation_style = $operation->get_style() || q{};
my $port_operation = first { $_->get_name eq $operation_name }
@{ $portType->get_operation() }
or die "operation not found:" . $operation->get_name();
# TODO rename lexical $input to "message"
my $input_message = do {
my $input = $port_operation->first_input();
$input ? $input->explain($opt) : q{};
};
my $output_message = do {
my $input = $port_operation->first_output();
$input ? $input->explain($opt) : q{};
};
my $fault_message = do {
my $input = $port_operation->first_fault();
$input ? $input->explain($opt) : q{};
};
$txt .= <<"EOT";
=head3 $operation_name
B<Input Message:>
$input_message
B<Output Message:>
$output_message
B<Fault:>
$fault_message
EOT
}
return $txt;
}
sub to_typemap {
my ($self, $opt) = @_;
my $name = $self->get_name();
my $portType = $opt->{ wsdl }->find_portType(
$opt->{ wsdl }->_expand( $self->get_type )
) or die 'portType not found: ' . $self->get_type;
my $txt = q{};
foreach my $operation (@{ $self->get_operation() })
{
my $operation_name = $operation->get_name();
my $operation_style = $operation->get_style() || q{};
my ($port_operation) = grep { $_->get_name eq $operation_name }
@{ $portType->get_operation() }
or die "operation not found:" . $operation->get_name();
no strict qw(refs);
$txt .= join q{},
map {
my $message = $port_operation->$_;
$message
? $message->to_typemap($opt)
: q{}
} qw(first_input first_output first_fault);
}
return $txt;
}
1; 1;
+251 -161
View File
@@ -2,50 +2,86 @@ 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::Fast::Storable;
my $PARSER; 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_25';
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 %on_action_of :ATTR(:name<on_action> :default<()>);
my %content_type_of :ATTR(:name<content_type> :default<text/xml; charset=utf8>); #/#trick editors
my %serializer_of :ATTR(:name<serializer> :default<()>);
my %deserializer_of :ATTR(:name<deserializer> :default<()>);
sub BUILD {
my ($self, $ident, $attrs_of_ref) = @_;
if (exists $attrs_of_ref->{ proxy }) {
$self->set_proxy( $attrs_of_ref->{ proxy } );
delete $attrs_of_ref->{ proxy };
}
return;
}
sub get_proxy { ## no critic RequireArgUnpacking
return $_[0]->get_transport();
}
sub set_proxy {
my ($self, @args_from) = @_;
my $ident = ${ $self };
# remember old value to return it later - Class::Std does so, too
my $old_value = $transport_of{ $ident };
# accept both list and list ref args
@args_from = @{ $args_from[0] } if ref $args_from[0];
# remember endpoint
$endpoint_of{ $ident } = $args_from[0];
# set transport - SOAP::Lite works similar...
$transport_of{ $ident } = SOAP::WSDL::Factory::Transport
->get_transport( @args_from );
return $old_value;
}
sub set_soap_version {
my $ident = ident shift;
# remember old value to return it later - Class::Std does so, too
my $soap_version = $soap_version_of{ $ident };
# re-setting the soap version invalidates the
# serializer object
delete $serializer_of{ $ident };
delete $deserializer_of{ $ident };
$soap_version_of{ $ident } = shift;
return $soap_version;
}
#/#trick editors
# TODO remove when preparing 2.01
sub outputtree { warn 'outputtree is deprecated and'
. 'will be removed before reaching v2.01 !' }
sub get_trace {
my $ident = ident $_[0];
return $trace_of{ $ident }
? ref $trace_of{ $ident } eq 'CODE'
? $trace_of{ $ident }
: sub { warn @_ }
: ()
}
# Mimic SOAP::Lite's behaviour for getter/setter routines # Mimic SOAP::Lite's behaviour for getter/setter routines
SUBFACTORY: { SUBFACTORY: {
no strict qw(refs);
for (qw(class_resolver no_dispatch outputxml proxy)) { for (qw(class_resolver no_dispatch outputxml proxy)) {
my $setter = "set_$_"; my $setter = "set_$_";
my $getter = "get_$_"; my $getter = "get_$_";
no strict qw(refs); ## no critic ProhibitNoStrict
*{ $_ } = sub { my $self = shift; *{ $_ } = sub { my $self = shift;
if (@_) { if (@_) {
$self->$setter(@_); $self->$setter(@_);
@@ -56,131 +92,174 @@ 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 q{/}, $data->get_xmlns(), $method) )
: ( $method, q{} );
$serializer_of{ $ident } ||= SOAP::WSDL::Factory::Serializer->get_serializer({
soap_version => $self->get_soap_version(),
});
my $envelope = $serializer_of{ $ident }->serialize({
method => $operation,
body => $data,
header => $header,
});
return $envelope if $self->no_dispatch(); return $envelope if $self->no_dispatch();
# 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.
);
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 }->set_class_resolver( $class_resolver_of{ $ident } )
if ( $deserializer_of{ $ident }->can('set_class_resolver') );
# Try deserializing response - there may be some,
# even if transport did not succeed (got a 500 response)
if ( $response ) {
my ($result_body, $result_header) = eval {
$deserializer_of{ $ident }->deserialize( $response );
};
if (not $@) {
return wantarray
? ($result_body, $result_header)
: $result_body;
}
return $deserializer_of{ $ident }->generate_fault({
code => 'soap:Server',
role => 'urn:localhost',
message => "Error deserializing message: $@. \n"
. "Message was: \n$response" . "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 __END__
=head1 NAME
SOAP::WSDL::Client - SOAP::WSDL's SOAP Client
=head1 METHODS
=head2 call
=head2 Configuration methods
=head3 outputxml
$soap->outputxml(1);
When set, call() returns the raw XML of the SOAP Envelope.
=head3 set_content_type =pod
=head1 NAME
SOAP::WSDL::Client - SOAP::WSDL's SOAP Client
=head1 SYNOPSIS
use SOAP::WSDL::Client;
my $soap = SOAP::WSDL::Client->new({
proxy => 'http://www.example.org/webservice/test'
});
$soap->call( \%method, $body, $header);
=head1 METHODS
=head2 call
$soap->call( \%method, \@parts );
%method is a hash with the following keys:
Name Description
----------------------------------------------------
operation operation name
soap_action SOAPAction HTTP header to use
style Operation style. One of (document|rpc)
use SOAP body encoding. One of (literal|encoded)
The style and use keys have no influence yet.
@parts is a list containing the elements of the message parts.
For backward compatibility, call may also be called as below:
$soap->call( $method, \@parts );
In this case, $method is the SOAP operation name, and the SOAPAction header
is guessed from the first part's namespace and the operation name (which is
mostly correct, but may fail). Operation style and body encoding are assumed to
be document/literal
=head2 Configuration methods
=head3 outputxml
$soap->outputxml(1);
When set, call() returns the raw XML of the SOAP Envelope.
=head3 set_content_type
$soap->set_content_type('application/xml; charset: utf8'); $soap->set_content_type('application/xml; charset: utf8');
Sets the content type and character encoding. Sets the content type and character encoding.
You probably should not use a character encoding different from utf8: You probably should not use a character encoding different from utf8:
SOAP::WSDL::Client will not convert the request into a different encoding SOAP::WSDL::Client will not convert the request into a different encoding
(yet). (yet).
To leave out the encoding, just set the content type without appendet charset To leave out the encoding, just set the content type without appendet charset
like in like in
text/xml text/xml
@@ -188,17 +267,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,28 +342,39 @@ SOAP::WSDL::Client and implementing something like
$soap_wsdl_client->call( mySoapMethod, @_); $soap_wsdl_client->call( mySoapMethod, @_);
} }
You may even do this in a class factory - 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
While SOAP::Lite features a global tracing facility, SOAP::WSDL::Client
allows to switch tracing on/of on a per-object base.
See L<set_trace|set_trace> on how to enable tracing.
=head1 LICENSE =head1 TROUBLESHOOTING
=head2 Accessing protected web services
Accessing protected web services is very specific for the transport
backend used.
In general, you may pass additional arguments to the set_proxy method (or
a list ref of the web service address and any additional arguments to the
new method's I<proxy> argument).
Refer to the appropriate transport module for documentation.
=head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter. Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under This file is part of SOAP-WSDL. You may distribute/modify it under the same
the same terms as perl itself terms as perl itself
=head1 AUTHOR =head1 AUTHOR
Martin Kutter E<lt>martin.kutter fen-net.deE<gt> Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 427 $
$LastChangedBy: kutterma $
$Id: Client.pm 427 2007-12-02 22:20:24Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
=cut =cut
+102 -59
View File
@@ -1,59 +1,102 @@
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';
use Scalar::Util qw(blessed);
sub __create_new {
my ($package, %args_of) = @_; our $VERSION = '2.00_25';
no strict qw(refs); sub call {
my ($self, $method, $body, $header) = @_;
*{ "$package\::new" } = sub { if (not blessed $body) {
my $class = shift; $body = {} if not defined $body;
my $self = $class->SUPER::new({ my $class = $method->{ body }->{ parts }->[0];
proxy => $args_of{ proxy }, eval "require $class" || die $@;
class_resolver => $args_of{ class_resolver } $body = $class->new($body);
}); }
bless $self, $class;
return $self; # if we have a header
} if (%{ $method->{ header } }) {
if (not blessed $header) {
} my $class = $method->{ header }->{ parts }->[0];
eval "require $class" || die $@;
sub __create_methods { $header = $class->new($header);
my ($package, %parts_of) = @_; }
}
no strict qw(refs); return $self->SUPER::call($method, $body, $header);
}
for my $method (keys %parts_of){
*{ "$package\::$method" } = sub { #sub __create_methods {
my $self = shift; # my ($package, %info_of) = @_;
my @param = map { #
my $data = shift || {}; # no strict qw(refs);
eval "require $_"; # no warnings qw(redefine);
$_->new( $data ); # for my $method (keys %info_of){
} @{ $parts_of{ $method } }; # my ($soap_action, @parts);
#
return $self->SUPER::call( $method, @param ); # # up to 2.00_10 we had list refs...
} # if (ref $info_of{ $method }eq 'HASH') {
} # @parts = @{ $info_of{ $method }->{ parts } };
} # $soap_action = $info_of{ $method }->{ soap_action };
# }
1; # else {
# die "Pre-v2.00_10 Interfaces are no longer supported. Please re-generate your interface.";
__END__ # }
#
=pod # *{ "$package\::$method" } = sub {
# my $self = shift;
=head1 NAME # my @param = map {
# my $data = shift || {};
SOAP::WSDL::Client::Base - Base client for WSDL-based SOAP access # eval "require $_";
# $_->new( $data );
=head1 SYNOPSIS # } @parts;
#
package MySoapClient; # return $self->SUPER::call( {
use SOAP::WSDL::Client::Base; # operation => $method,
__PACKAGE__->__create_methods( qw(one two three) ); # soap_action => $soap_action,
1; # }, @param );
# }
=cut # }
#}
1;
__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_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 AND COPYRIGHT
Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under the same
terms as perl itself
=head1 AUTHOR
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 427 $
$LastChangedBy: kutterma $
$Id: Base.pm 427 2007-12-02 22:20:24Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $
=cut
+31 -413
View File
@@ -2,22 +2,24 @@ 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::Fast::Storable;
use base qw(SOAP::WSDL::Base); use base qw(SOAP::WSDL::Base);
our $VERSION='2.00_25';
my %types_of :ATTR(:name<types> :default<[]>); my %types_of :ATTR(:name<types> :default<[]>);
my %message_of :ATTR(:name<message> :default<()>); my %message_of :ATTR(:name<message> :default<()>);
my %portType_of :ATTR(:name<portType> :default<()>); my %portType_of :ATTR(:name<portType> :default<()>);
my %binding_of :ATTR(:name<binding> :default<()>); my %binding_of :ATTR(:name<binding> :default<()>);
my %service_of :ATTR(:name<service> :default<()>); my %service_of :ATTR(:name<service> :default<()>);
my %namespace_of :ATTR(:name<namespace> :default<()>); my %namespace_of :ATTR(:name<namespace> :default<()>);
# must be attr for Class::Std::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,
message => \%message_of, message => \%message_of,
@@ -27,275 +29,20 @@ my %attributes_of :ATTR();
# Function factory - we could be writing this method for all %attribute # Function factory - we could be writing this method for all %attribute
# keys, too, but that's just C&P (eehm, Copy & Paste...) # keys, too, but that's just C&P (eehm, Copy & Paste...)
BLOCK: { BLOCK: {
no strict qw/refs/;
foreach my $method(keys %attributes_of ) { foreach my $method(keys %attributes_of ) {
no strict qw/refs/; ## no critic ProhibitNoStrict
*{ "find_$method" } = sub { *{ "find_$method" } = sub {
my ($self, @args) = @_; my ($self, @args_from) = @_;
return first { @args_from = @{ $args_from[0] } if ref $args_from[0] eq 'ARRAY';
$_->get_targetNamespace() eq $args[0] return first {
&& $_->get_name() eq $args[1] $_->get_targetNamespace() eq $args_from[0]
&& $_->get_name() eq $args_from[1]
} }
@{ $attributes_of{ $method }->{ ident $self } }; @{ $attributes_of{ $method }->{ ident $self } };
}; };
} }
}
sub explain {
my $self = shift;
my $opt = shift;
$opt->{ wsdl } ||= $self;
$opt->{ namespace } ||= $self->get_xmlns() || {};
my $txt = '';
for my $service (@{ $self->get_service() }) {
$txt .= $service->explain( $opt ) . "\n";
}
return $txt;
} }
sub _expand {
my ($self, $prefix, $localname) = ($_[0], split /:/, $_[1]);
my %ns_map = reverse %{ $self->get_xmlns() };
return ($ns_map{ $prefix }, $localname);
}
sub to_typemap {
my $self = shift;
my $opt = shift;
$opt->{ prefix } ||= q{};
$opt->{ wsdl } ||= $self;
$opt->{ type_prefix } ||= $opt->{ prefix };
$opt->{ element_prefix } ||= $opt->{ prefix };
return join "\n",
map { $_->to_typemap( $opt ) } @{ $service_of{ ident $self } };
}
sub create {
my $self = shift;
my $opt = shift;
my $base_path = $opt->{ base_path }
or croak "missing or empty argument base_path";
$opt->{ prefix } ||= q{};
$opt->{ type_prefix } ||= $opt->{ prefix };
$opt->{ element_prefix } ||= $opt->{ prefix };
$opt->{ typemap_prefix } or die 'Required argument typemap_prefix missing';
mkpath $base_path;
for my $service (@{ $service_of{ ident $self } }) {
warn "creating typemap $opt->{ typemap_prefix }". $service->get_name() . "\n";
$self->_create_typemap({ %{ $opt }, service => $service });
$self->_create_interface({ %{ $opt }, service => $service });
}
my @schema = @{ $self->first_types()->get_schema() };
for my $type (map { @{ $_->get_type() } , @{ $_->get_element() } } @schema[1..$#schema] ) {
warn 'creating class for '. $type->get_name() . "\n";
$type->to_class( { %$opt, wsdl => $self } );
}
}
sub _create_interface {
my $self = shift;
my $opt = shift;
my $service_name = $opt->{ service }->get_name();
$service_name =~s{\.}{\:\:}xmsg;
# TODO: iterate over ports.
# - ignore non-SOAP ports
# - generate interface for all SOAP ports...
my $binding = $self->find_binding( $self->_expand( $opt->{ service }->first_port()->get_binding() ) );
my $porttype = $self->find_portType( $self->_expand( $binding->get_type() ) );
my $port_operation_ref = $porttype->get_operation();
my $operation_ref = $binding->get_operation();
# make up operations map - name => [ part types / elements class names ]
#
my %operations = ();
for my $operation ( @{ $operation_ref } ) {
my $operation_name = $operation->get_name();
my $port_op = first { $_->get_name() eq $operation_name } @{ $port_operation_ref };
$operations{ $operation_name }->{ documentation } = $port_op->get_documentation();
my %msg_from = (
'input' => ($port_op->first_input() ) ? $port_op->first_input()->get_message() : undef,
'output' => ($port_op->first_output()) ? $port_op->first_output()->get_message(): undef,
'fault' => ($port_op->first_fault()) ? $port_op->first_fault()->get_message() : undef,
);
for my $msg (keys %msg_from) {
next if not $msg_from{ $msg };
for my $part (@{ $self->find_message( $self->_expand( $msg_from{$msg} ) )->get_part }) {
my $name;
if (my $element_name = $part->get_element() ) {
$name = $element_name;
push @{ $operations{ $operation_name }->{$msg}->{ types } },
$self->first_types()->find_element( $self->_expand( $element_name ) )
->explain({ wsdl => $self , anonymous => 1 });
}
elsif (my $type_name = $part->get_element() ) {
push @{ $operations{ $operation_name }->{$msg}->{ types } },
$self->first_types()->find_type( $self->_expand( $element_name ) )
->explain({ wsdl => $self });
$name = $type_name;
}
my ($prefix, $localname) = split m{:}xms , $name;
push @{ $operations{ $operation_name }->{$msg}->{ class } },
"$opt->{ element_prefix }$localname";
}
}
}
# use Data::Dumper;
# die Dumper \%operations;
my $template = <<'EOT';
package [% interface_prefix %][% service.get_name.replace('\.', '::') %];
use strict;
use warnings;
use [% typemap_prefix %][% service.get_name %];
use base 'SOAP::WSDL::Client::Base';
sub new {
my $class = shift;
my $arg_ref = shift || {};
my $self = $class->SUPER::new({
class_resolver => '[% typemap_prefix %][% service.get_name.replace('\.', '::') %]',
proxy => '[% service.first_port.get_location %]',
%{ $arg_ref }
});
return bless $self, $class;
}
__PACKAGE__->__create_methods(
[% FOREACH name = operations.keys -%]
[% name %] => [ [% FOREACH class = operations.$name.input.class %]'[% class %]', [% END %]],
[% END %]
);
1;
__END__
=pod
=head1 NAME
[% interface_prefix %][% service.get_name %] - SOAP interface to [% service.get_name %] at
[% service.first_port.get_location %]
=head1 SYNOPSIS
my $interface = [% interface_prefix %][% service.get_name %]->new();
my $[% operations.keys.1 %] = $interface->[% operations.keys.1 %]();
=head1 METHODS
[% FOREACH name=operations.keys;
operation=operations.$name;
%]
=head2 [% name %]
[% operation.documentation %]
SYNOPSIS:
$service->[% name %]({
[% FOREACH type = operation.input.types; type; END %] });
[% END %]
=cut
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,
{ %{ $opt }, operations => \%operations, binding => $binding, wsdl => $self },
$name,
binmode => ':utf8'
)
or die $tt->error();
return 1;
}
sub _create_typemap {
my $self = shift;
my $opt = shift;
my $service_name = $opt->{ service }->get_name();
$service_name =~s{\.}{\:\:}xmsg;
my $file_name = "$opt->{ base_path }/$opt->{ typemap_prefix }/$service_name.pm";
$file_name =~s{::}{/}gms;
my $path = dirname $file_name;
my $name = basename $file_name;
my $typemap = $opt->{ service }->to_typemap( { %{ $opt }, wsdl => $self } );
my $template = <<'EOT';
package [% typemap_prefix %][% service.get_name.replace('\.', '::') %];
use strict;
use warnings;
my %typemap = (
# SOAP 1.1 fault typemap
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN',
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
# generated typemap
[% typemap %]
[% custom_types %]
);
sub get_class {
my $name = join '/', @{ $_[1] };
exists $typemap{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
return $typemap{ $name };
}
1;
__END__
EOT
require Template;
my $tt = Template->new(
OUTPUT_PATH => $path,
);
$tt->process(\$template,
{ %{ $opt }, typemap => $typemap },
$name,
binmode => ':utf8',
)
or die $tt->error();
}
sub listify {
my $data = shift;
return if not defined $data;
return [ $data ] if not ref $data;
return [ $data ] if not ref $data eq 'ARRAY';
return $data;
}
1; 1;
@@ -311,7 +58,7 @@ SOAP::WSDL::Definitions - model a WSDL E<gt>definitionsE<lt> element
=head2 first_service get_service set_service push_service =head2 first_service get_service set_service push_service
Accessors/Mutators for accessing / setting the E<gt>serviceE<lt> child Accessors/Mutators for accessing / setting the E<gt>serviceE<lt> child
element(s). element(s).
=head2 find_service =head2 find_service
@@ -322,7 +69,7 @@ Returns the service matching the namespace/localname pair passed as arguments.
=head2 first_binding get_binding set_binding push_binding =head2 first_binding get_binding set_binding push_binding
Accessors/Mutators for accessing / setting the E<gt>bindingE<lt> child Accessors/Mutators for accessing / setting the E<gt>bindingE<lt> child
element(s). element(s).
=head2 find_service =head2 find_service
@@ -333,7 +80,7 @@ Returns the binding matching the namespace/localname pair passed as arguments.
=head2 first_portType get_portType set_portType push_portType =head2 first_portType get_portType set_portType push_portType
Accessors/Mutators for accessing / setting the E<gt>portTypeE<lt> child Accessors/Mutators for accessing / setting the E<gt>portTypeE<lt> child
element(s). element(s).
=head2 find_portType =head2 find_portType
@@ -344,7 +91,7 @@ Returns the portType matching the namespace/localname pair passed as arguments.
=head2 first_message get_message set_message push_message =head2 first_message get_message set_message push_message
Accessors/Mutators for accessing / setting the E<gt>messageE<lt> child Accessors/Mutators for accessing / setting the E<gt>messageE<lt> child
element(s). element(s).
=head2 find_service =head2 find_service
@@ -355,155 +102,26 @@ Returns the message matching the namespace/localname pair passed as arguments.
=head2 first_types get_types set_types push_types =head2 first_types get_types set_types push_types
Accessors/Mutators for accessing / setting the E<gt>typesE<lt> child Accessors/Mutators for accessing / setting the E<gt>typesE<lt> child
element(s). element(s).
=head2 explain =head1 LICENSE and COPYRIGHT
Returns a POD string describing how to call the methods of the service(s)
described in the WSDL.
=head2 to_typemap
Creates a typemap for use with a generated type class library.
Options:
NAME DESCRIPTION
-------------------------------------------------------------------------
prefix Prefix to use for all classes
type_prefix Prefix to use for all (Complex/Simple)Type classes
element_prefix Prefix to use for all Element classes (with atomic types)
As some webservices tend to use globally unique type definitions, but
locally unique elements with atomic types, type and element classes may
be separated by specifying type_prefix and element_prefix instead of
prefix.
The typemap is plain text which can be used as snipped for building a
SOAP::WSDL class_resolver perl class.
Try something like this for creating typemap classes:
my $parser = XML::LibXML->new();
my $handler = SOAP::WSDL::SAX::WSDLHandler->new()
$parser->set_handler( $handler );
$parser->parse_url('file:///path/to/wsdl');
my $wsdl = $handler->get_data();
my $typemap = $wsdl->to_typemap();
print <<"EOT"
package MyTypemap;
my \%typemap = (
$typemap
);
sub get_class { return \$typemap{\$_[1] } };
1;
"EOT"
=head2 create_interface
Creates a typemap class, classes for all types and elements, and interface
classes for every service.
See L<CODE GENERATOR|CODE GENERATOR> below.
Options:
Name Description
----------------------------------------------------------------------------
prefix Prefix to use for types and elements. Should end with '::'.
element_prefix Prefix to use for element packages. Should end with '::'.
Must be specified if prefix is not given.
type_prefix Prefix to use for type packages. Should end with '::'.
Must be specified if prefix is not given.
typemap_prefix Prefix to use for type packages. Should end with '::'.
Mandatory.
custom_types A perl source code snippet defining custom types for the
class resolver (typemap).
Must look like this:
q{
'path/to/my/element' => 'My::Element',
'path/to/my/element/prop' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'path/to/my/element/prop2' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
};
=head2 _expand
Expands a qualified name into a list consisting of namespace URI and
localname by using the definition's xmlns table.
Used internally by SOAP::WSDL::* classes.
=head1 CODE GENERATOR
TODO: move somewhere else - maybe SOAP::WSDL::Client ?
SOAP::WSDL::Definitions features a code generation facility for generating
perl classes (packages) from a WSDL definition.
The following classes are generated:
=over
=item * Typemaps
A typemap class is created for every service.
Typemaps are basically lookup classes. They allow the
SOAP::WSDL::SAX::MessageHandler to find out which class a XML element
in a SOAP message shoud be processed as.
Typemaps are passed to SOAP::WSDL::Client via the class_resolver
method.
=item * Interfaces
TODO: Implement Interface generation
Interface classes are just convenience shortcuts for accessing web
service methods. They define a method for every web service method,
dispatching the request to SOAP::WSDL::Client.
=item * Type and Element classes
For every top-level E<lt>elementE<gt>, E<lt>complexTypeE<gt> and
E<lt>simpleTypeE<gt> definition in the WSDL's schema, a perl class is
created.
Classes for E<lt>complexTypeE<gt> and E<lt>simpleTypeE<gt> definitions
are prefixed by the C<type_prefix> argument passed to
L<create_interface|create_interface>, classes for E<lt>elementE<gt>
definitions are prefixed by the C<element_prefix> passed to
L<create_interface|create_interface>. If the specific prefixes are not
specified, the C<prefix> argument is used instead.
If your web service is part of a bigger framework which defines types
globally, you probably do well always using the same C<type_prefix>:
This reduces the number of classes generated (provided types
are re-used by more than one service).
You probably should use different element prefixes, though -
E<lt>elementE<gt> definitions tend to be unique in the defining WSDL
only, especially when using document/literal style/encoding.
If not, you probably want to specify just C<prefix> (and use a
different one for every web service).
=back
=head1 LICENSE
Copyright 2004-2007 Martin Kutter. Copyright 2004-2007 Martin Kutter.
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>
=head1 REPOSITORY INFORMATION
$Rev: 427 $
$LastChangedBy: kutterma $
$Id: Definitions.pm 427 2007-12-02 22:20:24Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Definitions.pm $
=cut =cut
+160
View File
@@ -0,0 +1,160 @@
package SOAP::WSDL::Deserializer::Hash;
use strict;
use warnings;
use Class::Std::Fast::Storable;
use SOAP::WSDL::SOAP::Typelib::Fault11;
use SOAP::WSDL::Expat::Message2Hash;
use SOAP::WSDL::Factory::Deserializer;
SOAP::WSDL::Factory::Deserializer->register( '1.1', __PACKAGE__ );
our $VERSION='2.00_25';
sub BUILD {
my ($self, $ident, $args_of_ref) = @_;
# ignore all options
for (keys %{ $args_of_ref }) {
delete $args_of_ref->{ $_ }
}
}
sub deserialize {
my ($self, $content) = @_;
my $parser = SOAP::WSDL::Expat::Message2Hash->new();
eval { $parser->parse_string( $content ) };
if ($@) {
die $self->generate_fault({
code => 'soap:Server',
role => 'urn:localhost',
message => "Error deserializing message: $@. \n"
. "Message was: \n$content"
});
}
return $parser->get_data();
}
sub generate_fault {
my ($self, $args_from_ref) = @_;
return SOAP::WSDL::SOAP::Typelib::Fault11->new({
faultcode => $args_from_ref->{ code } || 'soap:Client',
faultactor => $args_from_ref->{ role } || 'urn:localhost',
faultstring => $args_from_ref->{ message } || "Unknown error"
});
}
1;
=head1 NAME
SOAP::WSDL::Deserializer::Hash - Deserializer SOAP messages into perl hash refs
=head1 SYNOPSIS
use SOAP::WSDL;
use SOAP::WSDL::Deserializer::Hash;
=head1 DESCRIPTION
Deserializer for creating perl hash refs as result of a SOAP call.
=head2 Output structure
The XML structure is converted into a perl data structure consisting of
hash and or list references. List references are used for holding array data.
SOAP::WSDL::Deserializer::Hash creates list references always at the maximum
depth possible.
Examples:
XML:
<MyDataArray>
<MyData>1</MyData>
<MyData>1</MyData>
</MyDataArray>
Perl:
{
MyDataArray => {
MyData => [ 1, 1 ]
}
}
XML:
<DeepArray>
<MyData><int>1<int>/MyData>
<MyData><int>1<int>/MyData>
</DeepArray>
Perl:
{
MyDataArray => {
MyData => [
{ int => 1 },
{ int => 1 }
]
}
}
List reference creation is triggered by the second occurance of an element.
XML Array types with one element only will not be represented as list
references.
=head1 USAGE
All you need to do is to use SOAP::WSDL::Deserializer::Hash.
SOAP::WSDL::Deserializer::Hash autoregisters itself for SOAP1.1 messages
You may register SOAP::WSDLDeserializer::Hash for other SOAP Versions by
calling
SOAP::Factory::Deserializer->register('1.2',
SOAP::WSDL::Deserializer::Hash)
=head1 Limitations
=over
=item * Namespaces
All namespaces are ignored.
=item * XML attributes
All XML attributes are ignored.
=back
=head2 Differences from other SOAP::WSDL::Deserializer classes
=over
=item * generate_fault
SOAP::WSDL::Deserializer::Hash will die with a SOAP::WSDL::Fault11 object when
a parse error appears
=back
=head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself.
=head1 AUTHOR
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 427 $
$LastChangedBy: kutterma $
$Id: Hash.pm 427 2007-12-02 22:20:24Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/Hash.pm $
=cut
+122
View File
@@ -0,0 +1,122 @@
package SOAP::WSDL::Deserializer::SOM;
use strict;
use warnings;
our $VERSION = '2.00_24';
our @ISA;
eval {
require SOAP::Lite;
push @ISA, 'SOAP::Deserializer';
}
or die "Cannot load SOAP::Lite.
Cannot deserialize to SOM object without SOAP::Lite.
Please install SOAP::Lite.";
sub generate_fault {
my ($self, $args_from_ref) = @_;
# code, message, detail, actor
die SOAP::Fault->new(
faultcode => $args_from_ref->{ code },
faultstring => $args_from_ref->{ message },
faultactor => $args_from_ref->{ role },
);
}
1;
__END__
=head1 NAME
SOAP::WSDL::Deserializer::SOM - Deserializer SOAP messages into SOM objects
=head1 SYNOPSIS
use SOAP::WSDL;
use SOAP::WSDL::Deserializer::SOM;
use SOAP::WSDL::Factory::Deserializer;
SOAP::WSDL::Factory::Deserializer->register( '1.1', __PACKAGE__ );
=head1 DESCRIPTION
Deserializer for creating SOAP::Lite's SOM object as result of a SOAP call.
This package is here for two reasons:
=over
=item * Compatibility
You don't have to change the rest of your SOAP::Lite based app when switching
to SOAP::WSDL, but can just use SOAP::WSDL::Deserializer::SOM to get back the
same objects as you were used to.
=item * Completeness
SOAP::Lite covers much more of the SOAP specification than SOAP::WSDL.
SOAP::WSDL::Deserializer::SOM can be used for content which cannot be
deserialized by L<SOAP::WSDL::Deserializer::SOAP11|SOAP::WSDL::Deserializer::SOAP11>.
This may be XML including mixed content, attachements and other XML data not
(yet) handled by L<SOAP::WSDL::Deserializer::SOAP11|SOAP::WSDL::Deserializer::SOAP11>.
=back
SOAP::WSDL::Deserializer::SOM is a subclass of L<SOAP::Deserializer|SOAP::Deserializer>
from the L<SOAP::Lite|SOAP::Lite> package.
=head1 USAGE
SOAP::WSDL::Deserializer will not auroregister itself - to use it for a particular
SOAP version just use the following lines:
my $soap_version = '1.1'; # or '1.2', further versions may appear.
use SOAP::WSDL::Deserializer::SOM;
use SOAP::WSDL::Factory::Deserializer;
SOAP::WSDL::Factory::Deserializer->register( $soap_version, __PACKAGE__ );
=head1 DIFFERENCES FROM OTHER CLASSES
=head2 Differences from SOAP::Lite
=over
=item * No on_fault handler
You cannot specify what to do when an error occurs - SOAP::WSDL will die
with a SOAP::Fault object on transport errors.
=back
=head2 Differences from other SOAP::WSDL::Deserializer classes
=over
=item * generate_fault
SOAP::WSDL::Deserializer::SOM will die with a SOAP::Fault object on calls
to generate_fault.
=back
=head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself.
=head1 AUTHOR
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 391 $
$LastChangedBy: kutterma $
$Id: SOM.pm 391 2007-11-17 21:56:13Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/SOM.pm $
=cut
+106
View File
@@ -0,0 +1,106 @@
package SOAP::WSDL::Deserializer::XSD;
use strict;
use warnings;
use Class::Std::Fast::Storable;
use SOAP::WSDL::SOAP::Typelib::Fault11;
use SOAP::WSDL::Expat::MessageParser;
our $VERSION='2.00_25';
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
my %parser_of :ATTR();
sub BUILD {
my ($self, $ident, $args_of_ref) = @_;
# ignore all options except 'class_resolver'
for (keys %{ $args_of_ref }) {
delete $args_of_ref->{ $_ } if $_ ne 'class_resolver';
}
}
sub deserialize {
my ($self, $content) = @_;
$parser_of{ ${ $self } } ||= SOAP::WSDL::Expat::MessageParser->new();
$parser_of{ ${ $self } }->class_resolver( $class_resolver_of{ ident $self } );
eval { $parser_of{ ${ $self } }->parse_string( $content ) };
if ($@) {
return $self->generate_fault({
code => 'soap:Server',
role => 'urn:localhost',
message => "Error deserializing message: $@. \n"
. "Message was: \n$content"
});
}
return ( $parser_of{ ${ $self } }->get_data(), $parser_of{ ${ $self } }->get_header() );
}
sub generate_fault {
my ($self, $args_from_ref) = @_;
return SOAP::WSDL::SOAP::Typelib::Fault11->new({
faultcode => $args_from_ref->{ code } || 'soap:Client',
faultactor => $args_from_ref->{ role } || 'urn:localhost',
faultstring => $args_from_ref->{ message } || "Unknown error"
});
}
1;
__END__
=head1 NAME
SOAP::WSDL::Deserializer::XSD - Deserializer SOAP messages into SOAP::WSDL::XSD::Typelib:: objects
=head1 DESCRIPTION
Default deserializer for SOAP::WSDL::Client and interface classes generated by
SOAP::WSDL. Converts SOAP messages to SOAP::WSDL::XSD::Typlib:: based objects.
Needs a class_resolver typemap either passed by the generated interface
or user-provided.
SOAP::WSDL::Deserializer classes implement the API described in
L<SOAP::WSDL::Factory::Deserializer>.
=head1 USAGE
Usually you don't need to do anything to use this package - it's the default
deserializer for SOAP::WSDL::Client and interface classes generated by
SOAP::WSDL.
Is you want to use the XSD serializer from SOAP::WSDL, set the outputtree()
property and provide a class_resolver.
=head1 METHODS
=head2 deserialize
Deserializes the message.
=head2 generate_fault
Generates a L<SOAP::WSDL::SOAP::Typelib::Fault11|SOAP::WSDL::SOAP::Typelib::Fault11>
object and returns it.
=head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself.
=head1 AUTHOR
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 427 $
$LastChangedBy: kutterma $
$Id: XSD.pm 427 2007-12-02 22:20:24Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/XSD.pm $
=cut
-66
View File
@@ -1,66 +0,0 @@
#!/usr/bin/perl -w
package SOAP::WSDL::Envelope;
use strict;
use base qw/SOAP::WSDL::Base/;
my $SOAP_NS = 'http://schemas.xmlsoap.org/soap/envelope/';
my $XML_INSTANCE_NS = 'http://www.w3.org/2001/XMLSchema-instance';
sub serialize {
my ($self, $name, $data, $opt) = @_;
if (not $opt->{ namespace }->{ $SOAP_NS })
{
$opt->{ namespace }->{ $SOAP_NS } = 'SOAP-ENV';
}
if (not $opt->{ namespace }->{ $XML_INSTANCE_NS })
{
$opt->{ namespace }->{ $XML_INSTANCE_NS } = 'xsi';
}
my $soap_prefix = $opt->{ namespace }->{ $SOAP_NS };
# envelope start with namespaces
my $xml = "<$soap_prefix\:Envelope ";
while (my ($uri, $prefix) = each %{ $opt->{ namespace } })
{
$xml .= "\n\t" if ($opt->{'readable'});
$xml .= "xmlns:$prefix=\"$uri\" ";
}
# TODO insert encoding
$xml.='>';
$xml .= $self->serialize_header($name, $data, $opt);
$xml .= $self->serialize_body($name, $data, $opt);
$xml .= "\n" if ($opt->{ readable });
$xml .= '</' . $soap_prefix .':Envelope>';
$xml .= "\n" if ($opt->{ readable });
return $xml;
}
sub serialize_header {
my $xml = '';
return $xml;
}
sub serialize_body {
my $self = shift;
my $name = shift;
my $data = shift;
my $opt = shift;
my $soap_prefix = $opt->{ namespace }->{ $SOAP_NS };
my $xml = '';
$xml .= "\n" if ($opt->{ readable });
$xml .= "<$soap_prefix\:Body>";
$xml .= "\n" if ($opt->{ readable });
# include parts
$xml .= $data if ( defined($data) );
$xml .= "</$soap_prefix\:Body>";
return $xml;
}
+44
View File
@@ -0,0 +1,44 @@
package SOAP::WSDL::Expat::Base;
use strict;
use warnings;
use XML::Parser::Expat;
our $VERSION = '2.00_24';
sub new {
my ($class, $args) = @_;
my $self = {};
bless $self, $class;
return $self;
}
sub parse {
eval {
$_[0]->_initialize( XML::Parser::Expat->new( Namespaces => 1 ) )->parse( $_[1] );
$_[0]->{ parser }->release();
};
$_[0]->{ parser }->xpcroak( $@ ) if $@;
return $_[0]->{ data };
}
sub parsefile {
eval {
$_[0]->_initialize( XML::Parser::Expat->new(Namespaces => 1) )->parsefile( $_[1] );
$_[0]->{ parser }->release();
};
$_[0]->{ parser }->xpcroak( $@ ) if $@;
return $_[0]->{ data };
}
# SAX-like aliases
sub parse_string;
*parse_string = \&parse;
sub parse_file;
*parse_file = \&parsefile;
sub get_data {
return $_[0]->{ data };
}
1;
+129
View File
@@ -0,0 +1,129 @@
#!/usr/bin/perl
package SOAP::WSDL::Expat::Message2Hash;
use strict;
use warnings;
use base qw(SOAP::WSDL::Expat::Base);
our $VERSION = '2.00_24';
sub _initialize {
my ($self, $parser) = @_;
$self->{ parser } = $parser;
delete $self->{ data }; # remove potential old results
my $characters;
my $current = {};
my $list = []; # node list
my $current_part = q{}; # are we in header or body ?
$self->{ data } = $current;
# use "globals" for speed
my ($_element, $_method,
$_class, $_parser, %_attrs) = ();
no strict qw(refs);
$parser->setHandlers(
Start => sub {
push @$list, $current;
#If our element exists and is a list ref, add to it
if ( exists $current->{ $_[1] }
&& ( ref ($current->{ $_[1] }) eq 'ARRAY')
) {
push @{ $current->{ $_[1] } }, {};
$current = $current->{ $_[1] }->[-1];
}
elsif ( exists $current->{ $_[1] } )
{
$current->{ $_[1] } = [ $current->{ $_[1] }, {} ];
$current = $current->{ $_[1] }->[-1];
}
else {
$current->{ $_[1] } = {};
$current = $current->{ $_[1] };
}
return;
},
Char => sub {
$characters .= $_[1] if $_[1] !~m{ \A \s* \z}xms;
return;
},
End => sub {
$_element = $_[1];
# This one easily handles ignores for us, too...
# return if not ref $$list[-1];
if (length $characters) {
if (ref $list->[-1]->{ $_element } eq 'ARRAY') {
$list->[-1]->{ $_element }->[-1] = $characters ;
}
else {
$list->[-1]->{ $_element } = $characters;
}
}
$characters = q{};
$current = pop @$list; # step up in object hierarchy...
return;
}
);
return $parser;
}
1;
=pod
=head1 NAME
SOAP::WSDL::Expat::Message2Hash - Convert SOAP messages to perl hash refs
=head1 SYNOPSIS
my $parser = SOAP::WSDL::Expat::MessageParser->new({
class_resolver => 'My::Resolver'
});
$parser->parse( $xml );
my $obj = $parser->get_data();
=head1 DESCRIPTION
Real fast expat based SOAP message parser.
See L<SOAP::WSDL::Manual::Parser> for details.
=head1 Bugs and Limitations
=over
=item * Ignores all namespaces
=item * Ignores all attributes
=item * Does not handle mixed content
=item * The SOAP header is ignored
=back
=head1 AUTHOR
Replace the whitespace by @ for E-Mail Address.
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 COPYING
This module may be used under the same terms as perl itself.
=head1 Repository information
$ID: $
$LastChangedDate: 2007-09-10 18:19:23 +0200 (Mo, 10 Sep 2007) $
$LastChangedRevision: 218 $
$LastChangedBy: kutterma $
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $
+197 -110
View File
@@ -2,149 +2,235 @@
package SOAP::WSDL::Expat::MessageParser; package SOAP::WSDL::Expat::MessageParser;
use strict; use strict;
use warnings; use warnings;
use Carp qw(croak confess);
our $VERSION = q{2.00_25};
use SOAP::WSDL::XSD::Typelib::Builtin; use SOAP::WSDL::XSD::Typelib::Builtin;
use XML::Parser::Expat; use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
use base qw(SOAP::WSDL::Expat::Base);
require Class::Std::Fast;
my $OBJECT_CACHE_REF = Class::Std::Fast::OBJECT_CACHE_REF();
my %LOADED_OF = ();
sub new { sub new {
my ($class, $args) = @_; my ($class, $args) = @_;
my $self = { my $self = {
class_resolver => $args->{ class_resolver } class_resolver => $args->{ class_resolver },
strict => exists $args->{ strict } ? $args->{ strict } : 1,
}; };
bless $self, $class; bless $self, $class;
$self->load_classes() if ($args->{ class_resolver });
return $self; return $self;
} }
sub class_resolver { sub class_resolver {
my $self = shift; my $self = shift;
$self->{ class_resolver } = shift; if (@_) {
$self->{ class_resolver } = shift;
$self->load_classes();
}
return $self->{ class_resolver };
}
sub load_classes {
my $self = shift;
return if $LOADED_OF{ $self->{ class_resolver } };
for (values %{ $self->{ class_resolver }->get_typemap }) {
no strict qw(refs);
my $class = $_;
# a bad test - do you know a better one?
next if $class eq '__SKIP__';
next if defined @{ "$class\::ISA"}; # check if namespace exists
$class =~s{ :: }{/}xmsg;
$class .= '.pm';
require $class;
}
$LOADED_OF{ $self->{ class_resolver } } = 1;
} }
sub _initialize { sub _initialize {
my ($self, $parser) = @_; my ($self, $parser) = @_;
$self->{ parser } = $parser;
delete $self->{ data }; # remove potential old results
delete $self->{ header };
delete $self->{ data };
my $characters; my $characters;
# Note: $current MUST be undef - it is used as sentinel
# on the object stack via if (! defined $list->[-1])
# DON'T set it to anything else !
my $current = undef; my $current = undef;
my $ignore = [ 'Envelope', 'Body' ]; # top level elements to ignore my $list = []; # node list (object stack)
my $list = []; # node list
my $path = []; # current path (without my $path = []; # current path
# number) my $skip = 0; # skip elements
my $skip = 0; # skip elements my $depth = 0;
my %content_check = $self->{strict}
? (
0 => sub {
die "Bad top node $_[1]" if $_[1] ne 'Envelope';
die "Bad namespace for SOAP envelope: " . $_[0]->recognized_string()
if $_[0]->namespace($_[1]) ne 'http://schemas.xmlsoap.org/soap/envelope/';
$depth++;
return;
},
1 => sub {
$depth++;
if ($_[1] eq 'Body') {
if (exists $self->{ data }) { # there was header data
$self->{ header } = $self->{ data };
delete $self->{ data };
$list = [];
$path = [];
undef $current;
}
}
return;
}
)
: ();
# use "globals" for speed # use "globals" for speed
my ($_prefix, $_localname, $_element, $_method, my ($_prefix, $_method,
$_class, $_parser, %_attrs) = (); $_class, $_leaf) = ();
no strict qw(refs); my $char_handler = sub {
return if (!$_leaf); # we only want characters in leaf nodes
$characters .= $_[1];
# if $_[1] =~m{ [^\s] }xms;
return;
};
no strict qw(refs);
$parser->setHandlers( $parser->setHandlers(
Start => sub { Start => sub {
($_parser, $_element, %_attrs) = @_; # my ($parser, $element, %_attrs) = @_;
($_prefix, $_localname) = split m{:}xms , $_element;
$_localname ||= $_element; # for non-prefixed elements $_leaf = 1; # believe we're a leaf node until we see an end
# ignore top level elements # call methods without using their parameter stack
if (@{ $ignore } && $_localname eq $ignore->[0]) { # That's slightly faster than $content_check{ $depth }->()
shift @{ $ignore }; # and we don't have to pass $_[1] to the method.
return; # Yup, that's dirty.
} return &{$content_check{ $depth }}
if exists $content_check{ $depth };
push @{ $path }, $_localname; # step down in path push @{ $path }, $_[1]; # step down in path
return if $skip; # skip inside __SKIP__ return if $skip; # skip inside __SKIP__
# resolve class of this element # resolve class of this element
$_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 (...)" ? if ($_class eq '__SKIP__') {
# would save a BLOCK... $skip = join('/', @{ $path });
return $skip = join('/', @{ $path }) if ($_class eq '__SKIP__'); $_[0]->setHandlers( Char => undef );
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);
},
Char => sub {
return if $skip;
$characters .= $_[1];
},
End => 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; return;
} }
# This one easily handles ignores for us, too... # step down in tree (remember current)
return if not ref $$list[-1]; #
# on the first object (after skipping Envelope/Body), $current
# set characters in current if we are a simple type # is undef.
# we may have characters in complexTypes with simpleContent, # We put it on the stack, anyway, and use it as sentinel when
# too - maybe we should rely on the presence of characters ? # going through the closing tags in the End handler
# may get a speedup by defining a ident method in anySimpleType #
# and looking it up via exists &$class::ident; push @$list, $current;
if ( $current->isa('SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType') ) {
$current->set_value( $characters ); # cleanup. Mainly here to help profilers find the real hot spots
undef $current;
# cleanup
$characters = q{};
# Create and set new objects using Class::Std::Fast's object cache
# if possible, or blessing directly into the class in question
# (circumventing constructor) here.
# That's dirty, but fast.
#
# The alternative would read:
# $current = $_class->new({ @_[2..$#_] });
#
$current = pop @{ $OBJECT_CACHE_REF->{ $_class } };
if (not defined $current) {
my $o = Class::Std::Fast::ID();
$current = bless \$o, $_class;
} }
# currently doesn't work, as anyType does not implement value -
# maybe change ? $depth++;
# $current->set_value( $characters ) if ($characters); return;
},
Char => $char_handler,
End => sub {
pop @{ $path }; # step up in path
# check __SKIP__
if ($skip) {
return if $skip ne join '/', @{ $path }, $_[1];
$skip = 0;
$_[0]->setHandlers( Char => $char_handler );
return;
}
$depth--;
# return if there's only one elment - can't set it in parent ;-)
# but set as root element if we don't have one already.
if (not defined $list->[-1]) {
$self->{ data } = $current if (not exists $self->{ data });
return;
};
# we only set character values in leaf nodes
if ($_leaf) {
# Use dirty but fast access via global variables.
#
# The normal way (via method) would be this:
#
# $current->set_value( $characters ) if (length($characters));
#
$SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType::___value
->{ $$current } = $characters if $characters =~m{ [^\s] }xms;
}
# empty characters
$characters = q{};
# set appropriate attribute in last element # set appropriate attribute in last element
# multiple values must be implemented in base class # multiple values must be implemented in base class
$_method = "add_$_localname"; # $_method = "add_$_localname";
$$list[-1]->$_method( $current ); $_method = "add_$_[1]";
$list->[-1]->$_method( $current );
$current = pop @$list; # step up in object hierarchy...
$current = pop @$list; # step up in object hierarchy
$_leaf = 0; # stop believing we're a leaf node
return;
} }
); );
return $parser; return $parser;
} }
sub parse { sub get_header {
$_[0]->_initialize( XML::Parser::Expat->new() )->parse( $_[1] ); return $_[0]->{ header };
return $_[0]->{ data };
}
sub parsefile {
$_[0]->_initialize( XML::Parser::Expat->new() )->parsefile( $_[1] );
return $_[0]->{ data };
}
sub get_data {
return $_[0]->{ data };
} }
1; 1;
@@ -158,7 +244,7 @@ SOAP::WSDL::Expat::MessageParser - Convert SOAP messages to custom object trees
=head1 SYNOPSIS =head1 SYNOPSIS
my $parser = SOAP::WSDL::Expat::MessageParser->new({ my $parser = SOAP::WSDL::Expat::MessageParser->new({
class_resolver => 'My::Resolver' class_resolver => 'My::Resolver'
}); });
$parser->parse( $xml ); $parser->parse( $xml );
my $obj = $parser->get_data(); my $obj = $parser->get_data();
@@ -167,14 +253,15 @@ SOAP::WSDL::Expat::MessageParser - Convert SOAP messages to custom object trees
Real fast expat based SOAP message parser. Real fast expat based SOAP message parser.
See L<SOAP::WSDL::Parser> for details. See L<SOAP::WSDL::Manual::Parser> for details.
=head2 Skipping unwanted items =head2 Skipping unwanted items
Sometimes there's unneccessary information transported in SOAP messages. Sometimes there's unneccessary information transported in SOAP messages.
To skip XML nodes (including all child nodes), just edit the type map for To skip XML nodes (including all child nodes), just edit the type map for
the message and set the type map entry to '__SKIP__'. the message, set the type map entry to '__SKIP__', and comment out all
child elements you want to skip.
=head1 Bugs and Limitations =head1 Bugs and Limitations
@@ -202,9 +289,9 @@ This module may be used under the same terms as perl itself.
$ID: $ $ID: $
$LastChangedDate: $ $LastChangedDate: 2007-12-02 23:20:24 +0100 (So, 02 Dez 2007) $
$LastChangedRevision: $ $LastChangedRevision: 427 $
$LastChangedBy: $ $LastChangedBy: kutterma $
$HeadURL: $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $
+21 -19
View File
@@ -6,9 +6,11 @@ use XML::Parser::Expat;
use SOAP::WSDL::Expat::MessageParser; use SOAP::WSDL::Expat::MessageParser;
use base qw(SOAP::WSDL::Expat::MessageParser); use base qw(SOAP::WSDL::Expat::MessageParser);
our $VERSION = '2.00_24';
sub parse_start { sub parse_start {
my $self = shift; my $self = shift;
$self->{ parser } = $_[0]->_initialize( XML::Parser::ExpatNB->new() ); $self->{ parser } = $_[0]->_initialize( XML::Parser::ExpatNB->new( Namespaces => 1 ) );
} }
sub init; sub init;
*init = \&parse_start; *init = \&parse_start;
@@ -19,6 +21,7 @@ sub parse_more {
sub parse_done { sub parse_done {
$_[0]->{ parser }->parse_done(); $_[0]->{ parser }->parse_done();
$_[0]->{ parser }->release();
} }
1; 1;
@@ -34,7 +37,7 @@ SOAP::WSDL::Expat::MessageStreamParser - Convert SOAP messages to custom object
my $lwp = LWP::UserAgent->new(); my $lwp = LWP::UserAgent->new();
my $parser = SOAP::WSDL::Expat::MessageParser->new({ my $parser = SOAP::WSDL::Expat::MessageParser->new({
class_resolver => 'My::Resolver' class_resolver => 'My::Resolver'
}); });
my $chunk_parser = $parser->init(); my $chunk_parser = $parser->init();
# process response while it comes in, trying to read 32k chunks. # process response while it comes in, trying to read 32k chunks.
@@ -47,29 +50,28 @@ SOAP::WSDL::Expat::MessageStreamParser - Convert SOAP messages to custom object
ExpatNB based parser for parsing huge documents. ExpatNB based parser for parsing huge documents.
See L<SOAP::WSDL::Parser> for details. See L<SOAP::WSDL::Manual::Parser> for details.
=head1 Bugs and Limitations =head1 Bugs and Limitations
See SOAP::WSDL::Expat::MessageParser See SOAP::WSDL::Expat::MessageParser
=head1 LICENSE AND COPYRIGHT
Copyright 2007 Martin Kutter. All rights reserved.
This file is part of SOAP-WSDL. You may distribte/modify it under
the same terms as perl itself
=head1 AUTHOR =head1 AUTHOR
Replace the whitespace by @ for E-Mail Address. Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
Martin Kutter E<lt>martin.kutter fen-net.deE<gt> =head1 REPOSITORY INFORMATION
=head1 COPYING
This module may be used under the same terms as perl itself.
=head1 Repository information
$ID: $
$LastChangedDate: $
$LastChangedRevision: $
$LastChangedBy: $
$HeadURL: $
$Rev: 391 $
$LastChangedBy: kutterma $
$Id: MessageStreamParser.pm 391 2007-11-17 21:56:13Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageStreamParser.pm $
=cut
+145
View File
@@ -0,0 +1,145 @@
package SOAP::WSDL::Expat::WSDLParser;
use strict;
use warnings;
use Carp;
use SOAP::WSDL::TypeLookup;
use base qw(SOAP::WSDL::Expat::Base);
our $VERSION = q{2.00_25};
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)
);
}
return;
},
Char => sub { $characters .= $_[1]; return; },
End => sub {
my ($parser, $localname) = @_;
my $action = SOAP::WSDL::TypeLookup->lookup(
$parser->namespace( $localname ),
$localname
) || {};
return if not ($action->{ type });
if ( $action->{ type } eq 'CLASS' ) {
$current = pop @{ $list };
}
elsif ($action->{ type } eq 'CONTENT' ) {
my $method = $action->{ method };
# normalize whitespace
$characters =~s{ ^ \s+ (.+) \s+ $ }{$1}xms;
$characters =~s{ \s+ }{ }xmsg;
no strict qw(refs);
$current->$method( $characters );
}
return;
}
);
return $parser;
}
# make attrs SAX style
sub _fixup_attrs {
my ($parser, %attrs_of) = @_;
my @attrs_from = map { $_ =
{
Name => $_,
Value => $attrs_of{ $_ },
LocalName => $_
}
} keys %attrs_of;
# add xmlns: attrs. expat eats them.
push @attrs_from, map {
# ignore xmlns=FOO namespaces - must be XML schema
# Other nodes should be ignored somewhere else
($_ eq '#default')
? ()
:
{
Name => "xmlns:$_",
Value => $parser->expand_ns_prefix( $_ ),
LocalName => $_
}
} $parser->new_ns_prefixes();
return @attrs_from;
}
1;
+154
View File
@@ -0,0 +1,154 @@
package SOAP::WSDL::Factory::Deserializer;
use strict;
use warnings;
our $VERSION = '2.00_24';
my %DESERIALIZER = (
'1.1' => 'SOAP::WSDL::Deserializer::XSD',
);
# class method
sub register {
my ($class, $ref_type, $package) = @_;
$DESERIALIZER{ $ref_type } = $package;
}
sub get_deserializer {
my ($self, $args_of_ref) = @_;
# sanity check
die "no deserializer registered for SOAP version $args_of_ref->{ soap_version }"
if not exists ($DESERIALIZER{ $args_of_ref->{ soap_version } });
# load module
eval "require $DESERIALIZER{ $args_of_ref->{ soap_version } }"
or die "Cannot load serializer $DESERIALIZER{ $args_of_ref->{ soap_version } }", $@;
return $DESERIALIZER{ $args_of_ref->{ soap_version } }->new($args_of_ref);
}
1;
=pod
=head1 NAME
SOAP::WSDL::Factory::Deserializer - Factory for retrieving Deserializer objects
=head1 SYNOPSIS
# from SOAP::WSDL::Client:
$deserializer = SOAP::WSDL::Factory::Deserializer->get_deserializer({
soap_version => $soap_version,
class_resolver => $class_resolver,
});
# in deserializer class:
package MyWickedDeserializer;
use SOAP::WSDL::Factory::Deserializer;
# register class as deserializer for SOAP1.2 messages
SOAP::WSDL::Factory::Deserializer->register( '1.2' , __PACKAGE__ );
=head1 DESCRIPTION
SOAP::WSDL::Factory::Deserializer serves as factory for retrieving
deserializer objects for SOAP::WSDL.
The actual work is done by specific deserializer classes.
SOAP::WSDL::Deserializer tries to load one of the following classes:
=over
=item * The class registered for the scheme via register()
=back
By default, L<SOAP::WSDL::Deserializer::XSD|SOAP::WSDL::Deserializer::XSD>
is registered for SOAP1.1 messages.
=head1 METHODS
=head2 register
SOAP::WSDL::Deserializer->register('1.1', 'MyWickedDeserializer');
Globally registers a class for use as deserializer class.
=head2 get_deserializer
Returns an object of the deserializer class for this endpoint.
=head1 WRITING YOUR OWN DESERIALIZER CLASS
Deserializer classes may register with SOAP::WSDL::Factory::Deserializer.
=head2 Registering a deserializer
Registering a deserializer class with SOAP::WSDL::Factory::Deserializer
is done by executing the following code where $version is the SOAP version
the class should be used for, and $class is the class name.
SOAP::WSDL::Factory::Deserializer->register( $version, $class);
To auto-register your transport class on loading, execute register()
in your tranport class (see L<SYNOPSIS|SYNOPSIS> above).
=head2 Deserializer package layout
Deserializer modules must be named equal to the deserializer class they
contain. There can only be one deserializer class per deserializer module.
=head2 Methods to implement
Deserializer classes must implement the following methods:
=over
=item * new
Constructor.
=item * deserialize
Deserialize data from XML to arbitrary formats.
deserialize() must return a fault indicating that deserializing failed if
any error is encountered during the process of deserializing the XML message.
The following positional parameters are passed to the deserialize method:
$content - the xml message
=item * generate_fault
Generate a fault in the supported format. The following named parameters are
passed as a single hash ref:
code - The fault code, e.g. 'soap:Server' or the like
role - The fault role (actor in SOAP1.1)
message - The fault message (faultstring in SOAP1.1)
=back
=head1 LICENSE AND COPYRIGHT
Copyright 2007 Martin Kutter. All rights reserved.
This file is part of SOAP-WSDL. You may distribte/modify it under
the same terms as perl itself
=head1 AUTHOR
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 176 $
$LastChangedBy: kutterma $
$Id: Serializer.pm 176 2007-08-31 15:28:29Z kutterma $
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
=cut
+172
View File
@@ -0,0 +1,172 @@
package SOAP::WSDL::Factory::Generator;
use strict;
use warnings;
our $VERSION='2.00_24';
my %GENERATOR = (
'XSD' => 'SOAP::WSDL::Generator::Template::XSD',
);
# class method
sub register {
my ($class, $ref_type, $package) = @_;
$GENERATOR{ $ref_type } = $package;
}
sub get_generator {
my ($self, $args_of_ref) = @_;
# sanity check
# die "no generator registered for generation method $args_of_ref->{ type }"
#
my $generator_class = (exists ($GENERATOR{ $args_of_ref->{ type } }))
? $GENERATOR{ $args_of_ref->{ type } }
: $args_of_ref->{ type };
# load module
eval "require $generator_class"
or die "Cannot load generator $generator_class", $@;
return $generator_class->new();
}
1;
=pod
=head1 NAME
SOAP::WSDL::Factory:Generator - Factory for retrieving generator objects
=head1 SYNOPSIS
# from SOAP::WSDL::Client:
$generator = SOAP::WSDL::Factory::Generator->get_generator({
soap_version => $soap_version,
});
# in generator class:
package MyWickedGenerator;
use SOAP::WSDL::Factory::Generator;
# register as generator for SOAP1.2 messages
SOAP::WSDL::Factory::Generator->register( '1.2' , __PACKAGE__ );
=head1 DESCRIPTION
SOAP::WSDL::Factory::Generator serves as factory for retrieving
generator objects for SOAP::WSDL.
The actual work is done by specific generator classes.
SOAP::WSDL::Generator tries to load one of the following classes:
=over
=item * the class registered for the scheme via register()
=back
=head1 METHODS
=head2 register
SOAP::WSDL::Generator->register('Lite', 'MyWickedGenerator');
Globally registers a class for use as generator class.
=head2 get_generator
Returns an object of the generator class for this endpoint.
=head1 WRITING YOUR OWN GENERATOR CLASS
=head2 Registering a generator
Generator classes may register with SOAP::WSDL::Factory::Generator.
Registering a generator class with SOAP::WSDL::Factory::Generator is done
by executing the following code where $version is the SOAP version the
class should be used for, and $class is the class name.
SOAP::WSDL::Factory::Generator->register( $version, $class);
To auto-register your transport class on loading, execute register() in
your generator class (see L<SYNOPSIS|SYNOPSIS> above).
=head2 Generator package layout
Generator modules must be named equal to the generator class they contain.
There can only be one generator class per generator module.
=head2 Methods to implement
Generator classes must implement the following methods:
=over
=item * new
Constructor.
=item * generate
Generate SOAP interface
=back
Generators may implements one or more of the following configuration
methods. All of them are tried via can() by wsdl2perl.
=over
=item * set_wsdl
Set the raw WSDL XML. Implement if you have your own WSDL parser.
=item * set_definitions
Sets the (parsed) SOAP::WSDL::Definitions object.
=item * set_type_prefix
Sets the prefix for XML Schema type classes
=item * set_element_prefix
Sets the prefix for XML Schema element classes
=item * set_typemap_prefix
Sets the prefix for typemap classes (class resolvers).
=item * set_interface_prefix
Sets the prefix for interface classes
=item * set_typemap
Set user-defined typemap snippet
=back
=head1 LICENSE AND COPYRIGHT
Copyright 2007 Martin Kutter. All rights reserved.
This file is part of SOAP-WSDL. You may distribte/modify it under
the same terms as perl itself
=head1 AUTHOR
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 176 $
$LastChangedBy: kutterma $
$Id: Serializer.pm 176 2007-08-31 15:28:29Z kutterma $
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
=cut
+146
View File
@@ -0,0 +1,146 @@
package SOAP::WSDL::Factory::Serializer;
use strict;
use warnings;
our $VERSION='2.00_24';
my %SERIALIZER = (
'1.1' => 'SOAP::WSDL::Serializer::XSD',
);
# class method
sub register {
my ($class, $ref_type, $package) = @_;
$SERIALIZER{ $ref_type } = $package;
}
sub get_serializer {
my ($self, $args_of_ref) = @_;
# sanity check
die "no serializer registered for SOAP version $args_of_ref->{ soap_version }"
if not exists ($SERIALIZER{ $args_of_ref->{ soap_version } });
# load module
eval "require $SERIALIZER{ $args_of_ref->{ soap_version } }"
or die "Cannot load serializer $SERIALIZER{ $args_of_ref->{ soap_version } }", $@;
return $SERIALIZER{ $args_of_ref->{ soap_version } }->new();
}
1;
=pod
=head1 NAME
SOAP::WSDL::Factory::Serializer - Factory for retrieving serializer objects
=head1 SYNOPSIS
# from SOAP::WSDL::Client:
$serializer = SOAP::WSDL::Factory::Serializer->get_serializer({
soap_version => $soap_version,
});
# in serializer class:
package MyWickedSerializer;
use SOAP::WSDL::Factory::Serializer;
# register as serializer for SOAP1.2 messages
SOAP::WSDL::Factory::Serializer->register( '1.2' , __PACKAGE__ );
=head1 DESCRIPTION
SOAP::WSDL::Factory::Serializer serves as factory for retrieving
serializer objects for SOAP::WSDL.
The actual work is done by specific serializer classes.
SOAP::WSDL::Serializer tries to load one of the following classes:
=over
=item * the class registered for the scheme via register()
=back
=head1 METHODS
=head2 register
SOAP::WSDL::Serializer->register('1.1', 'MyWickedSerializer');
Globally registers a class for use as serializer class.
=head2 get_serializer
Returns an object of the serializer class for this endpoint.
=head1 WRITING YOUR OWN SERIALIZER CLASS
=head2 Registering a deserializer
Serializer classes may register with SOAP::WSDL::Factory::Serializer.
Serializer objects may also be passed directly to SOAP::WSDL::Client by
using the set_serializer method. Note that serializers objects set via
SOAP::WSDL::Client's set_serializer method are discarded when the SOAP
version is changed via set_soap_version.
Registering a serializer class with SOAP::WSDL::Factory::Serializer is done
by executing the following code where $version is the SOAP version the
class should be used for, and $class is the class name.
SOAP::WSDL::Factory::Serializer->register( $version, $class);
To auto-register your transport class on loading, execute register() in
your tranport class (see L</SYNOPSIS> above).
=head2 Serializer package layout
Serializer modules must be named equal to the serializer class they contain.
There can only be one serializer class per serializer module.
=head2 Methods to implement
Serializer classes must implement the following methods:
=over
=item * new
Constructor.
=item * serialize
Serializes data to XML. The following named parameters are passed to the
serialize method in a anonymous hash ref:
{
method => $operation_name,
header => $header_data,
body => $body_data,
}
=back
=head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter. All rights reserved.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself.
=head1 AUTHOR
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 391 $
$LastChangedBy: kutterma $
$Id: Serializer.pm 391 2007-11-17 21:56:13Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
=cut
+244
View File
@@ -0,0 +1,244 @@
package SOAP::WSDL::Factory::Transport;
use strict;
use warnings;
our $VERSION='2.00_25';
# 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 ($registered_transport_of{ $scheme }) {
eval "require $registered_transport_of{ $scheme }"
or die "Cannot load transport class $registered_transport_of{ $scheme } : $@";
# try "foo::Client" class first - SOAP::Tranport always requires
# 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 "Cannot load transport class $SOAP_WSDL_TRANSPORT_OF{ $scheme } : $@";
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;
# register class as transport module for httpr and https
# (httpr is "reliable http", a protocol developed by IBM).
SOAP::WSDL::Factory::Transport->register( 'httpr' , __PACKAGE__ );
SOAP::WSDL::Factory::Transport->register( 'https' , __PACKAGE__ );
=head1 DESCRIPTION
SOAP::WSDL::Transport serves as factory for retrieving transport objects for
SOAP::WSDL.
The actual work is done by specific transport classes.
SOAP::WSDL::Transport tries to load one of the following classes:
=over
=item * the class registered for the scheme via register()
=item * the SOAP::Lite class matching the scheme
=item * the SOAP::WSDL class matching the scheme
=back
=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
=head2 Registering a 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().
=head2 Transport plugin package layout
You may only use transport classes whose name is either
the module name or the module name with '::Client' appended.
=head2 Methods to implement
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).
To provide this interface, 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 AND COPYRIGHT
Copyright 2004-2007 Martin Kutter. All rights reserved.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself
=head1 AUTHOR
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION
$Rev: 427 $
$LastChangedBy: kutterma $
$Id: Transport.pm 427 2007-12-02 22:20:24Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $
=cut
+53
View File
@@ -0,0 +1,53 @@
package SOAP::WSDL::Generator::Template;
use strict;
use Template;
use Class::Std::Fast::Storable;
our $VERSION=q{2.00_25};
my %tt_of :ATTR(:get<tt>);
my %definitions_of :ATTR(:name<definitions> :default<()>);
my %server_prefix_of :ATTR(:name<server_prefix> :default<MyServer>);
my %interface_prefix_of :ATTR(:name<interface_prefix> :default<MyInterfaces>);
my %typemap_prefix_of :ATTR(:name<typemap_prefix> :default<MyTypemaps>);
my %type_prefix_of :ATTR(:name<type_prefix> :default<MyTypes>);
my %element_prefix_of :ATTR(:name<element_prefix> :default<MyElements>);
my %INCLUDE_PATH_of :ATTR(:name<INCLUDE_PATH> :default<()>);
my %EVAL_PERL_of :ATTR(:name<EVAL_PERL> :default<0>);
my %RECURSION_of :ATTR(:name<RECURSION> :default<0>);
my %OUTPUT_PATH_of :ATTR(:name<OUTPUT_PATH> :default<.>);
sub START {
my ($self, $ident, $arg_ref) = @_;
}
sub _process :PROTECTED {
my ($self, $template, $arg_ref, $output) = @_;
my $ident = ident $self;
$tt_of{$ident} = Template->new(
DEBUG => 1,
EVAL_PERL => $EVAL_PERL_of{ $ident },
RECURSION => $RECURSION_of{ $ident },
INCLUDE_PATH => $INCLUDE_PATH_of{ $ident },
OUTPUT_PATH => $OUTPUT_PATH_of{ $ident },
)
if (not $tt_of{ $ident });
$tt_of{ $ident }->process( $template,
{
definitions => $self->get_definitions,
interface_prefix => $self->get_interface_prefix,
server_prefix => $self->get_server_prefix,
type_prefix => $self->get_type_prefix,
typemap_prefix => $self->get_typemap_prefix,
TYPE_PREFIX => $self->get_type_prefix,
element_prefix => $self->get_element_prefix,
NO_POD => delete $arg_ref->{ NO_POD } ? 1 : 0 ,
%{ $arg_ref }
},
$output)
or die $INCLUDE_PATH_of{ $ident }, '\\', $template, ' ', $tt_of{ $ident }->error();
}
1;
+195
View File
@@ -0,0 +1,195 @@
package SOAP::WSDL::Generator::Template::XSD;
use strict;
use Template;
use Class::Std::Fast::Storable;
use File::Basename;
use File::Spec;
our $VERSION = q{2.00_25};
use SOAP::WSDL::Generator::Visitor::Typemap;
use SOAP::WSDL::Generator::Visitor::Typelib;
use base qw(SOAP::WSDL::Generator::Template);
my %output_of :ATTR(:name<output> :default<()>);
my %typemap_of :ATTR(:name<typemap> :default<({})>);
sub BUILD {
my ($self, $ident, $arg_ref) = @_;
$self->set_EVAL_PERL(1);
$self->set_RECURSION(1);
$self->set_INCLUDE_PATH( exists $arg_ref->{INCLUDE_PATH}
? $arg_ref->{INCLUDE_PATH}
: do {
# ignore uninitialized warnings - File::Spec warns about
# uninitialized values, probably because we have no filename
local $SIG{__WARN__} = sub {
return if ($_[0]=~m{\buninitialized\b});
CORE::warn @_;
};
# makeup path for the OS we're running on
my ($volume, $dir, $file) = File::Spec->splitpath(
File::Spec->rel2abs( dirname __FILE__ )
);
$dir = File::Spec->catdir($dir, $file, 'XSD');
# return path put together...
my $path = File::Spec->catpath( $volume, $dir , q{});
# Fixup path for windows - / works fine, \ does
# not...
if ( eval { &Win32::BuildNumber } ) {
$path =~s{\\}{/}g;
}
$path;
}
);
}
sub generate {
my $self = shift;
my $opt = shift;
$self->generate_typelib( $opt );
# $self->generate_interface( $opt );
$self->generate_typemap( $opt );
}
sub generate_typelib {
my ($self) = @_;
# $output_of{ ident $self } = "";
my @schema = @{ $self->get_definitions()->first_types()->get_schema() };
for my $type (map { @{ $_->get_type() } , @{ $_->get_element() } } @schema[1..$#schema] ) {
$type->_accept( $self );
}
# return $output_of{ ident $self };
return;
}
sub generate_server {
my $self = shift;
my $ident = ident $self;
my $arg_ref = shift;
for my $service (@{ $self->get_definitions->get_service }) {
for my $port (@{ $service->get_port() }) {
# Skip ports without (known) address
next if not $port->first_address;
next if not $port->first_address->isa('SOAP::WSDL::SOAP::Address');
my $port_name = $port->get_name;
$port_name =~s{ \A .+\. }{}xms;
my $output = $arg_ref->{ output }
? $arg_ref->{ output }
: $self->_generate_filename(
$self->get_server_prefix(),
$service->get_name(),
$port_name,
);
print "Creating interface class $output\n";
$self->_process('Server.tt',
{
service => $service,
port => $port,
NO_POD => $arg_ref->{ NO_POD } ? 1 : 0 ,
},
$output, binmode => ':utf8');
}
}
}
sub generate_interface {
my $self = shift;
my $ident = ident $self;
my $arg_ref = shift;
for my $service (@{ $self->get_definitions->get_service }) {
for my $port (@{ $service->get_port() }) {
# Skip ports without (known) address
next if not $port->first_address;
next if not $port->first_address->isa('SOAP::WSDL::SOAP::Address');
my $port_name = $port->get_name;
$port_name =~s{ \A .+\. }{}xms;
my $output = $arg_ref->{ output }
? $arg_ref->{ output }
: $self->_generate_filename(
$self->get_interface_prefix(),
$service->get_name(),
$port_name,
);
print "Creating interface class $output\n";
$self->_process('Interface.tt',
{
service => $service,
port => $port,
NO_POD => $arg_ref->{ NO_POD } ? 1 : 0 ,
},
$output, binmode => ':utf8');
}
}
}
sub generate_typemap {
my ($self, $arg_ref) = @_;
my $visitor = SOAP::WSDL::Generator::Visitor::Typemap->new({
type_prefix => $self->get_type_prefix(),
element_prefix => $self->get_element_prefix(),
definitions => $self->get_definitions(),
typemap => {
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
%{ $typemap_of{ident $self }},
}
});
for my $service (@{ $self->get_definitions->get_service }) {
$visitor->visit_Service( $service );
my $output = $arg_ref->{ output }
? $arg_ref->{ output }
: $self->_generate_filename( $self->get_typemap_prefix(), $service->get_name() );
print "Creating typemap class $output\n";
$self->_process('Typemap.tt',
{
service => $service,
typemap => $visitor->get_typemap(),
NO_POD => $arg_ref->{ NO_POD } ? 1 : 0 ,
},
$output);
}
}
sub _generate_filename :PRIVATE {
my ($self, @parts) = @_;
my $name = join '::', @parts;
$name =~s{ \. }{::}xmsg;
$name =~s{ :: }{/}xmsg;
return "$name.pm";
}
sub visit_XSD_Element {
my ($self, $element) = @_;
my $output = defined $output_of{ ident $self }
? $output_of{ ident $self }
: $self->_generate_filename( $self->get_element_prefix(), $element->get_name() );
$self->_process('element.tt', { element => $element } , $output);
}
sub visit_XSD_SimpleType {
my ($self, $type) = @_;
my $output = defined $output_of{ ident $self }
? $output_of{ ident $self }
: $self->_generate_filename( $self->get_type_prefix(), $type->get_name() );
$self->_process('simpleType.tt', { simpleType => $type } , $output);
}
sub visit_XSD_ComplexType {
my ($self, $type) = @_;
my $output = defined $output_of{ ident $self }
? $output_of{ ident $self }
: $self->_generate_filename( $self->get_type_prefix(), $type->get_name() );
$self->_process('complexType.tt', { complexType => $type } , $output);
}
1;
@@ -0,0 +1,86 @@
package [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('^.+\.','') %];
use strict;
use warnings;
use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before
require [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]
if not [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]->can('get_class');
sub START {
$_[0]->set_proxy('[% port.first_address.get_location %]') if not $_[2]->{proxy};
$_[0]->set_class_resolver('[% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]')
if not $_[2]->{class_resolver};
}
[% binding = definitions.find_binding( port.expand( port.get_binding ) );
FOREACH operation = binding.get_operation;
%][% INCLUDE Interface/Operation.tt %]
[%
END;
%]
1;
[% IF NO_POD; STOP; END %]
__END__
=pod
=head1 NAME
[% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %] - SOAP Interface for the [% service.get_name %] Web Service
=head1 SYNOPSIS
use [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %];
my $interface = [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %]->new();
my $response;
[% FOREACH operation = binding.get_operation;
%] $response = $interface->[% operation.get_name %]();
[% END %]
=head1 DESCRIPTION
SOAP Interface for the [% service.get_name %] web service
located at [% port.first_address.get_location %].
=head1 SERVICE [% service.get_name %]
[% service.get_documentation %]
=head2 Port [% port.get_name %]
[% port.get_documentation %]
=head1 METHODS
=head2 General methods
=head3 new
Constructor.
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
=head2 SOAP Service methods
[% INCLUDE Interface/POD/method_info.tt %]
[% FOREACH operation = binding.get_operation;
%][% INCLUDE Interface/POD/Operation.tt %]
[% END %]
=head1 AUTHOR
Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %]
=pod
@@ -0,0 +1,64 @@
[% RETURN IF NOT item;
type = definitions.find_portType( binding.expand( binding.get_type ) );
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
message = definitions.find_message( port_op.first_input.expand( port_op.first_input.get_message ) );
part_from = message.get_part;
PERL %]
my $item = $stash->{ item };
my $def = $stash->{ definitions };
my $part_from = $stash->{ part_from };
my $type_prefix = $stash->{ type_prefix };
my $element_prefix = $stash->{ element_prefix };
my @body_part_from = split m{\s}, $item->get_parts;
my @parts;
if (@body_part_from) {
@parts = map {
my $part = $_;
(grep {
my ($ns, $lname) = $def->expand( $_ );
($lname eq $part->get_name)
} @body_part_from
)
? do {
my $name;
($name = $part->get_element)
? do {
$name =~s{ ^[^:]+: }{}xms;
$element_prefix . '::' . $name;
}
: ($name = $part->get_type)
? do {
$name =~s{ ^[^:]+: }{}xms;
$type_prefix . '::' . $name;
}
: die "input must have either type or element"
}
: ()
} @{ $part_from };
}
else {
@parts = map {
my $part = $_;
my $name;
($name = $part->get_element)
? do {
$name =~s{ ^[^:]+: }{}xms;
"$element_prefix\::$name"
}
: ($name = $part->get_type)
? do {
$name =~s{ ^[^:]+: }{}xms;
"$type_prefix\::$name"
}
: die "input must have either type or element";
} @{ $part_from };
}
$stash->{ parts } = \@parts;
[% END %]
'use' => '[% item.get_use %]',
namespace => '[% item.get_namespace %]',
encodingStyle => '[% item.get_encodingStyle %]',
parts => [qw( [% parts.join(' ') %] )],
@@ -0,0 +1,38 @@
[%
RETURN IF NOT item;
message_name = item.get_message;
IF NOT message_name;
THROW BAD_WSDL "missing <message> attribute in header for operation ${operation.get_name}";
END;
message = definitions.find_message( item.expand( message_name ) );
PERL %]
my $message = $stash->{ message };
my $item = $stash->{ item };
my $def = $stash->{ definitions };
my $type_prefix = $stash->{ type_prefix };
my $element_prefix = $stash->{ element_prefix };
my ($ns, $lname) = $def->expand( $item->get_part() );
my ($part) = grep {
$_->get_name eq $lname
&& $_->get_targetNamespace eq $ns } @{ $message->get_part( ) };
my $part_class = do {
my $name;
($name = $part->get_element)
? do {
$name =~s{ ^[^:]+: }{}xms;
$element_prefix . '::' . $name;
}
: ($name = $part->get_type)
? do {
$name =~s{ ^[^:]+: }{}xms;
$type_prefix . '::' . $name;
}
: die "input must have either type or element"
};
$stash->{ part_class } = $part_class;
[% END;
%]
'use' => '[% item.get_use %]',
namespace => '[% item.get_namespace %]',
encodingStyle => '[% item.get_encodingStyle %]',
parts => [qw( [% part_class %] )],
@@ -0,0 +1,18 @@
sub [% operation.get_name %] {
my ($self, $body, $header) = @_;
die "[% operation.get_name %] must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({
operation => '[% operation.get_name %]',
soap_action => '[% operation.first_operation.get_soapAction %]',
style => '[% operation.get_style || binding.get_style %]',
body => {
[% INCLUDE Interface/Body.tt( item = operation.first_input.first_body ); %]
},
header => {
[% INCLUDE Interface/Header.tt( item = operation.first_input.first_header ); %]
},
headerfault => {
[% INCLUDE Interface/Header.tt( item = operation.first_input.first_headerfault ); %]
}
}, $body, $header);
}
@@ -0,0 +1,13 @@
[% INDENT; %][% element.get_name %] => [%-
IF (element.get_ref);
element = element.get_ref();
END;
IF (type_name = element.get_type);
INCLUDE Interface/POD/Type.tt(type = definitions.first_types.find_type( element.expand(type_name) ) );
ELSIF (type = element.first_complexType);
INCLUDE Interface/POD/Type.tt(type = type );
ELSIF (type = element.first_simpleType);
INCLUDE Interface/POD/Type.tt(type = type );
END;
%]
@@ -0,0 +1,9 @@
[%
message_name = port_op.first_input.get_message();
# message_name;
part_from = definitions.find_message( port_op.first_input.expand( message_name ) ).get_part;
FOREACH part = part_from;
INCLUDE Interface/POD/Part.tt(part = part);
END;
%]
@@ -0,0 +1,8 @@
=head3 [% operation.get_name %]
[% type = definitions.find_portType( binding.expand( binding.get_type ) );
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
port_op.get_documentation %]
$interface->[% operation.get_name %]([% INCLUDE Interface/POD/Message.tt %] );
@@ -0,0 +1,7 @@
[% element = definitions.first_types.find_element( part.expand( part.get_element ) );
#element.get_name();
#element;
#STOP;
type = element.first_complexType || element.first_simpleType || definitions.first_types.find_type(
element.expand( element.get_type ) );
INCLUDE Interface/POD/Type.tt;%],
@@ -0,0 +1,7 @@
[%- indent = ' ';
IF type.isa('SOAP::WSDL::XSD::ComplexType');
INCLUDE complexType/POD/structure.tt(complexType = type);
ELSE;
INCLUDE simpleType/POD/structure.tt(simpleType = type);
END;
indent.replace('\s{2}$',''); %]
@@ -0,0 +1,7 @@
Method synopsis is displayed with hash refs as parameters.
The commented class names in the method's parameters denote that objects
of the corresponding class can be passed instead of the marked hash ref.
You may pass any combination of objects, hash and list refs to these
methods, as long as you meet the structure.
@@ -0,0 +1,97 @@
package [% server_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('^.+\.','') %];
use strict;
use warnings;
use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before
require [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]
if not [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]->can('get_class');
my %transport_class_of :ATTR(:name<transport_class> :default<SOAP::WSDL::Server::CGI>);
my %transport_of :ATTR(:name<transport> :default<()>);
my %dispatch_to :ATTR(:name<dispatch_to>);
my $action_map_ref = {
[% binding = definitions.find_binding( port.expand( port.get_binding ) );
FOREACH operation = binding.get_operation;
- %]
'[% operation.first_operation.get_soapAction %]' => '[% operation.get_name %]',
[% END %]
};
sub START {
my ($self, $ident, $arg_ref) = @_;
eval "require $transport_class_of{ $ident }"
or die "Cannot load transport class $transport_class_of{ $ident }: $@";
$transport_of{ $ident } = $transport_class_of{ $ident }->new({
action_map_ref => $action_map_ref,
class_resolver => '[% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]',
dispatch_to => $dispatch_to{ $ident },
});
}
sub handle {
$transport_of{ ${ $_[0] } }->handle();
}
1;
[% IF NO_POD; STOP; END %]
__END__
=pod
=head1 NAME
[% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %] - SOAP Server Class for the [% service.get_name %] Web Service
=head1 SYNOPSIS
use [% server_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %];
my $server = [% server_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %]->new({
dispatch_to => 'My::Handler::Class',
transport_class => 'SOAP::WSDL::Server::CGI', # optional, default
});
$server->handle();
=head1 DESCRIPTION
SOAP Server handler for the [% service.get_name %] web service
located at [% port.first_address.get_location %].
=head1 SERVICE [% service.get_name %]
[% service.get_documentation %]
=head2 Port [% port.get_name %]
[% port.get_documentation %]
=head1 METHODS
=head2 General methods
=head3 new
Constructor.
The C<dispatch_to> argument is mandatory. It must be a class or object
implementing the SOAP Service methods listed below.
=head2 SOAP Service methods
[% INCLUDE Server/POD/method_info.tt %]
[% FOREACH operation = binding.get_operation;
%][% INCLUDE Server/POD/Operation.tt %]
[% END %]
=head1 AUTHOR
Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %]
=pod
@@ -0,0 +1,9 @@
[%
message_name = port_op.first_output.get_message();
# message_name;
part_from = definitions.find_message( port_op.first_output.expand( message_name ) ).get_part;
FOREACH part = part_from;
INCLUDE Server/POD/OutPart.tt(part = part);
END;
%]
@@ -0,0 +1,15 @@
=head3 [% operation.get_name %]
[% type = definitions.find_portType( binding.expand( binding.get_type ) );
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
port_op.get_documentation %]
sub [% operation.get_name %](
my ($self, $body, $header) = @_;
# body is a ??? object - sorry, POD not implemented yet
# header is a ??? object - sorry, POD not implemented yet
# do something with body and header...
return [% INCLUDE Server/POD/Message.tt %]
}
@@ -0,0 +1,10 @@
[% element = definitions.first_types.find_element( part.expand( part.get_element ) );
#element.get_name();
#element;
#STOP;
-%]
[% element_prefix %]::[% element.get_name.replace('\.', '::') %]->new([%
type = element.first_complexType || element.first_simpleType || definitions.first_types.find_type(
element.expand( element.get_type ) );
INCLUDE Interface/POD/Type.tt; %]
);
@@ -0,0 +1,4 @@
Your dispatch_to class has to implement the following methods:
The examples below serve as copy-and-paste prototypes to use in your
class.
@@ -0,0 +1,32 @@
package [% typemap_prefix %]::[% service.get_name.replace('\.','::') %];
use strict;
use warnings;
our [% USE Dumper(varname = 'typemap_'); Dumper.dump( typemap ) %];
sub get_class {
my $name = join '/', @{ $_[1] };
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
return $typemap_1->{ $name };
}
sub get_typemap {
return $typemap_1;
}
1;
__END__
=pod
=head1 NAME
[% typemap_prefix %]::[% service.get_name.replace('\.','::') %]; - typemap for ::[% service.get_name %];
=head1 DESCRIPTION
Typemap created by SOAP::WSDL for map-based SOAP message parsers.
=cut
@@ -0,0 +1,6 @@
[% type_name = node.expand( type );
IF (type_name.0 == 'http://www.w3.org/2001/XMLSchema'); -%]
SOAP::WSDL::XSD::Typelib::Builtin::[% type_name.1 %]
[% ELSE -%]
[% type_prefix %]::[% type_name.1 %]
[% END -%]

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