Compare commits

...
9 Commits
Author SHA1 Message Date
Martin Kutter 745ce925c1 import SOAP-WSDL 2.00.01 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00.01
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00.01.tar.gz
2009-12-12 19:48:32 -08:00
Martin Kutter 0cbf981665 import SOAP-WSDL 2.00_33 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_33
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_33.tar.gz
2009-12-12 19:48:28 -08:00
Martin Kutter 51db446428 import SOAP-WSDL 2.00_32 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_32
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_32.tar.gz
2009-12-12 19:48:24 -08:00
Martin Kutter f0b3bdc201 import SOAP-WSDL 2.00_31 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_31
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_31.tar.gz
2009-12-12 19:48:21 -08:00
Martin Kutter 874251225f import SOAP-WSDL 2.00_29 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_29
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_29.tar.gz
2009-12-12 19:48:17 -08:00
Martin Kutter 2bad767211 import SOAP-WSDL 1.27 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  1.27
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-1.27.tar.gz
2009-12-12 19:48:16 -08:00
Martin Kutter 7ca2154ad6 import SOAP-WSDL 2.00_28 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_28
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_28.tar.gz
2009-12-12 19:48:15 -08:00
Martin Kutter eb096ad88e import SOAP-WSDL 2.00_27 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_27
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_27.tar.gz
2009-12-12 19:48:14 -08:00
Martin Kutter 3cfeebae54 import SOAP-WSDL 2.00_26 from CPAN
git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00_26
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00_26.tar.gz
2009-12-12 19:48:13 -08:00
285 changed files with 10763 additions and 2192 deletions
+7 -5
View File
@@ -2,10 +2,10 @@ use Module::Build;
use version; use version;
$build = Module::Build->new( $build = Module::Build->new(
dist_author => 'Martin Kutter <martin.kutter@fen-net.de>', dist_author => 'Martin Kutter <martin.kutter@fen-net.de>',
create_makefile_pl => 'passthrough', create_makefile_pl => 'small',
dist_abstract => 'SOAP with WSDL support', dist_abstract => 'SOAP with WSDL support',
dist_name => 'SOAP-WSDL', dist_name => 'SOAP-WSDL',
dist_version => '2.00_25', dist_version => '2.00.01',
module_name => 'SOAP::WSDL', module_name => 'SOAP::WSDL',
license => 'artistic', license => 'artistic',
requires => { requires => {
@@ -13,7 +13,7 @@ $build = Module::Build->new(
# for us. SOAP-WSDL relies on unicode (WS-I demands it) # for us. SOAP-WSDL relies on unicode (WS-I demands it)
# and triggers several 5.6 bugs... # and triggers several 5.6 bugs...
'perl' => q(5.8.0), 'perl' => q(5.8.0),
'Class::Std::Fast' => qv(0.0.5), 'Class::Std::Fast' => q(0.0.5),
'Data::Dumper' => 0, 'Data::Dumper' => 0,
'Date::Parse' => 0, 'Date::Parse' => 0,
'Date::Format' => 0, 'Date::Format' => 0,
@@ -24,16 +24,18 @@ $build = Module::Build->new(
'LWP::UserAgent' => 0, 'LWP::UserAgent' => 0,
'Template' => 0, 'Template' => 0,
'Term::ReadKey' => 0, 'Term::ReadKey' => 0,
'URI' => 0,
'XML::Parser::Expat' => 0, 'XML::Parser::Expat' => 0,
}, },
buildrequires => { build_requires => {
'Class::Std::Fast' => qv(0.0.5), 'Class::Std::Fast' => q(0.0.5),
'Cwd' => 0, 'Cwd' => 0,
'Date::Parse' => 0, 'Date::Parse' => 0,
'Date::Format' => 0, 'Date::Format' => 0,
'Getopt::Long' => 0, 'Getopt::Long' => 0,
'List::Util' => 0, 'List::Util' => 0,
'LWP::UserAgent' => 0, 'LWP::UserAgent' => 0,
'Module::Build' => 0,
'File::Basename' => 0, 'File::Basename' => 0,
'File::Path' => 0, 'File::Path' => 0,
'File::Spec' => 0, 'File::Spec' => 0,
+215 -4
View File
@@ -1,7 +1,7 @@
Release notes for SOAP::WSDL 2.00_24 Release notes for SOAP::WSDL 2.00.01
------- -------
I'm proud to present a new pre-release version of SOAP::WSDL. I'm proud to present a new release of SOAP::WSDL.
SOAP::WSDL is a toolkit for creating WSDL-based SOAP client interfaces in perl. SOAP::WSDL is a toolkit for creating WSDL-based SOAP client interfaces in perl.
@@ -15,6 +15,8 @@ Features:
* Easy-to use API * Easy-to use API
o Automatically encodes perl data structures as message data o Automatically encodes perl data structures as message data
o Automatically sets HTTP headers right o Automatically sets HTTP headers right
o Datatypes provide hints on method names on calls to non-existant
methods
* Efficient documentation * Efficient documentation
o SOAP::WSDL::Manual guides you at getting your work done, not at o SOAP::WSDL::Manual guides you at getting your work done, not at
the module's internals the module's internals
@@ -23,17 +25,226 @@ Features:
over 95% (excluding documentation - you wouldn't want to read over 95% (excluding documentation - you wouldn't want to read
through it all). through it all).
* SOAP::Lite like look and feel * SOAP::Lite like look and feel
o Where possible, SOAP::WSDL mimics SOAP::Lite's API to allow easy migrations o Where possible, SOAP::WSDL mimics SOAP::Lite's API to allow easy migration
* XML schema based class library for creating data objects * XML schema based class library for creating data objects
* High-performance XML parser * High-performance XML parser
* Plugin support. SOAP::WSDL can be extended through plugins in various aspects. * Plugin support. SOAP::WSDL can be extended through plugins in various aspects.
The following plugins are supported: The following plugins are supported:
o Transport plugins via SOAP::WSDL::Factory::Transport o Transport plugins via SOAP::WSDL::Factory::Transport
o Serializer plugins via SOAP::WSDL::Factory::Serializer o Serializer plugins via SOAP::WSDL::Factory::Serializer
o Deserializer plugins via SOAP::WSDL::Factory::Serializer o Deserializer plugins via SOAP::WSDL::Factory::Deserializer
The following changes have been made: The following changes have been made:
2.00.01
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1941134 ] Server for mod_perl2. Thanks to Noah Robin for contributing.
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/).
* [ 1944368 ] SOAP/WSDL/XSD/Typelib/SimpleType.pm spelling
* [ 1944367 ] SOAP/WSDL/XSD/Typelib/ComplexType.pm spelling
* [ 1944364 ] SOAP/WSDL/XSD/Typelib/Builtin.pm spelling
* [ 1944362 ] SOAP/WSDL/SOAP/Typelib/Fault11.pm spelling
* [ 1944361 ] SOAP/WSDL/Generator/Visitor.pm spelling
* [ 1944360 ] SOAP/WSDL/Generator/Iterator/WSDL11.pm spelling
* [ 1944359 ] SOAP::WSDL::Factory::Transport spelling
* [ 1944355 ] SOAP::WSDL::Deserializer::XSD.pm spelling
Thanks to "nobody" for correcting these errors.
* [ 1942576 ] SOAP/WSDL/Deserializer/SOM.pm spelling.
* [ 1942568 ] SOAP/WSDL/Client.pm minor spelling/grammar/style cleanup.
* [ 1942562 ] WSDL.pm spelling corrections.
Thanks to Noah Robin for providing patches for these errors.
* #34642 booleans in WSDL attributes don't get converted to perl's
representation (for now - not all attributes covered yet)
* #34714: MessageParser misses character data in elements just below SOAP-ENV:Body
* #34688: wsdl2perl.pl croaks when WSDL operation uses a header
The following uncategorized improvements have been made:
* Storable freeze/thaw speedup in conjunction with upcoming version of
Class::Std::Fast
* improved server doc generation
* improved xsi:nil handling
* serializing an attribute from http://www.w3.org/XML/1998/namespace now
serializes it with xml: prefix. This should probably be moved into the
generator, to avoid testing every attribute
2.00_33 - Mar 30 2008
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1925336 ] Create a Prefix Resolver Plugin Interface for Code Generator
* [ 1898591 ] object stringify returns undef
* [ 1906753 ] Hypens in MyTypes/* cause runtime syntax errors
Hypens and dots in variable and method names are now replaced by _
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/).
* #33616: Bugs in the META.yml file
* [ 1892895 ] Test failures on RHEL4
* [ 1844956 ] t/SOAP/WSDL/XSD/Typelib/Builtin/NMTOKENS fails test on OS X
* #33376: HTTP Authentication (not implemented or not documented)
The following uncategorized improvements have been made:
* Some minor performance improvements have been made
* The XSD generator now asserts the soap:operation style is "document"
* <wsdl:import> and <xsd:import> now import namespace declarations, too
* The XSD generator now uses the relevant <wsdl:portType>'s
targetNamespace for finding operation messages, not the <wsdl:definition>
element's targetNamespace
* Attribute handling has been improved so it could possibly work.
Attributes from different namespaces are probably still broken.
* Attribute ref handling has been added (though probably broken on
ref cascades).
* <xsd:attributeGroup> elements are now parsed, but have no effect yet.
* <xsd:enumeration> elements are now parsed, but have no effect yet.
2.00_32 - Feb 14 2008
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
* [ 1893147 ] Segfault on 2.0.0_31
The following uncategorized improvements have been made:
* changed SOAP::WSDL::XSD::ComplexType's set_/get_flavor methods to
set_/get_variety to reflect the XML standard more closely.
get_flavor is retained for compatibility reasons.
* added initial support for complexType/simpleContent definitions. Right
now, only restriction derivations are supported.
* fixed an error in the generator_test.wsdl
2.00_31 - Feb 11 2007
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1883843 ] Support wsdl:import
* [ 1883863 ] Support xsd:import
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
The following uncategorized improvements have been made:
* The WSDL Parser now warns about unsupported WSDL / XML schema elements
* Fixed path handling in t/006_client.t
* Removed useless ms regex flag in SOAP::WSDL::Factory::Transport
* The test suite has been improved
2.00_30 - unreleased
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1875288 ] Support XML attributes (partial)
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
* [ 1876435 ] Test on perl-5.10 fails
* #32611 empty complexType structure classes are missing 'use Class::Std::Fast::Storable'
The following uncategorized improvements have been made:
* ComplexType objects now accept { foo => undef } in constructor and handle
it as non-present child element foo.
* Updated test suite
* Updated SOAP::WSDL::Client::Base to correctly handle SOAP calls with
no parameters (empty parts)
* Test on perl-5.10 fails when SOAP::Lite is not installed
2.00_29
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
* #32188: minor bug found and fixed in WSDL generation
* [ 1871175 ] Can't delete attributes from ComplexType objects
The following uncategorized improvements have been made:
* Updated SOAP::WSDL::Manual::XSD
* Removed pod directives from templates to avoid confusing CPAN's pod
viewer
* Initial (incomplete) XML attribute support
* Updated test suite
2.00_28
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
* #32062: minor doc fixes
* [ 1852988 ] Generated Interface POD is invalid
* [ 1855583 ] t/SOAP/WSDL/XSD/Typelib/ComplexType.t requires Test::Warn
The following uncategorized improvements have been made:
* Updated SOAP::WSDL::Manual::WS_I to reflect new Server modules
2.00_27
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
* [ 1850793 ] Add a to_hash_ref method
* [ 1844427 ] Support multiple parts in body
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
* [ 1850795 ] attributes referencing types in default namespace throw
* [ 1844458 ] Add warning when generating Interface with multiple parts
* [ 1843841 ] Grammar/typos in Manual.pod
* [ 1843799 ] ./Build test fails due to testcount mismatch not IO::Scalar
* [ 1845077 ] Top level simpleType elements don't serialize correctly
The following uncategorized improvements have been made:
* Fixed serializing complexType elements with no elements to empty element
* Enhanced test suite
* Documentation improvements
2.00_26
The following features were added (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660924):
The following bugs have been fixed (the numbers in square brackets are the
tracker IDs from https://sourceforge.net/tracker/?group_id=111978&atid=660921):
The numbers with # are CPAN RT IDs (http://rt.cpan.org/).
* [ 1843195 ] t/013_complexType.t still requires Class::Std::Storable
* [ 1843590 ] Tests broken on Cygwin
The following uncategorized improvements have been made:
* Added examples
* Added Content-length header to CGI output
2.00_25 2.00_25
--- ---
WARNING: INCOMPATIBLE CHANGE: WARNING: INCOMPATIBLE CHANGE:
+99 -4
View File
@@ -1,5 +1,9 @@
benchmark/01_expat.t benchmark/01_expat.t
benchmark/hello.pl benchmark/hello.pl
benchmark/person.pl
benchmark/person.xml
benchmark/person_profile.pl
benchmark/person_single.pl
benchmark/XSD/01_anyType.t benchmark/XSD/01_anyType.t
benchmark/XSD/02_anySimpleType.t benchmark/XSD/02_anySimpleType.t
benchmark/XSD/03_string.t benchmark/XSD/03_string.t
@@ -7,6 +11,7 @@ bin/wsdl2perl.pl
Build.PL Build.PL
Changes Changes
example/cgi-bin/helloworld.pl example/cgi-bin/helloworld.pl
example/cgi-bin/person.pl
example/fortune.pl example/fortune.pl
example/genericbarcode.pl example/genericbarcode.pl
example/hello.pl example/hello.pl
@@ -25,6 +30,8 @@ example/lib/MyElements/GetSpecificCookieResponse.pm
example/lib/MyElements/GetWeather.pm example/lib/MyElements/GetWeather.pm
example/lib/MyElements/GetWeatherResponse.pm example/lib/MyElements/GetWeatherResponse.pm
example/lib/MyElements/int.pm example/lib/MyElements/int.pm
example/lib/MyElements/ListPerson.pm
example/lib/MyElements/ListPersonResponse.pm
example/lib/MyElements/readNodeCount.pm example/lib/MyElements/readNodeCount.pm
example/lib/MyElements/readNodeCountResponse.pm example/lib/MyElements/readNodeCountResponse.pm
example/lib/MyElements/sayHello.pm example/lib/MyElements/sayHello.pm
@@ -34,13 +41,31 @@ example/lib/MyInterfaces/BarCode/BarCodeSoap.pm
example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie/FullerData_x0020_Fortune_x0020_CookieSoap.pm example/lib/MyInterfaces/FullerData_x0020_Fortune_x0020_Cookie/FullerData_x0020_Fortune_x0020_CookieSoap.pm
example/lib/MyInterfaces/GlobalWeather/GlobalWeatherSoap.pm example/lib/MyInterfaces/GlobalWeather/GlobalWeatherSoap.pm
example/lib/MyInterfaces/HelloWorld/HelloWorldSoap.pm example/lib/MyInterfaces/HelloWorld/HelloWorldSoap.pm
example/lib/MyInterfaces/TestService/TestPort.pm
example/lib/MyServer/HelloWorld/HelloWorldSoap.pm example/lib/MyServer/HelloWorld/HelloWorldSoap.pm
example/lib/MyServer/TestService/TestPort.pm
example/lib/MyTypemaps/BarCode.pm example/lib/MyTypemaps/BarCode.pm
example/lib/MyTypemaps/FullerData_x0020_Fortune_x0020_Cookie.pm example/lib/MyTypemaps/FullerData_x0020_Fortune_x0020_Cookie.pm
example/lib/MyTypemaps/GlobalWeather.pm example/lib/MyTypemaps/GlobalWeather.pm
example/lib/MyTypemaps/HelloWorld.pm example/lib/MyTypemaps/HelloWorld.pm
example/lib/MyTypemaps/TestService.pm
example/lib/MyTypes/Address.pm
example/lib/MyTypes/ArrayOfContract.pm
example/lib/MyTypes/ArrayOfPerson.pm
example/lib/MyTypes/BarCodeData.pm
example/lib/MyTypes/BarcodeOption.pm
example/lib/MyTypes/BarcodeType.pm
example/lib/MyTypes/CheckSumMethod.pm
example/lib/MyTypes/Contract.pm
example/lib/MyTypes/ImageFormats.pm
example/lib/MyTypes/Person.pm
example/lib/MyTypes/PersonID.pm
example/lib/MyTypes/PhoneNumber.pm
example/lib/MyTypes/ShowTextPosition.pm
example/lib/MyTypes/test2.pm example/lib/MyTypes/test2.pm
example/lib/MyTypes/testExtended.pm example/lib/MyTypes/testExtended.pm
example/person.pl
example/person_compile.pl
example/visitor/visitor.pl example/visitor/visitor.pl
example/weather.pl example/weather.pl
example/weather_wsdl.pl example/weather_wsdl.pl
@@ -48,6 +73,7 @@ example/wsdl/11_helloworld.wsdl
example/wsdl/FortuneCookie.xml example/wsdl/FortuneCookie.xml
example/wsdl/genericbarcode.xml example/wsdl/genericbarcode.xml
example/wsdl/globalweather.xml example/wsdl/globalweather.xml
example/wsdl/Person.wsdl
HACKING HACKING
lib/SOAP/WSDL.pm lib/SOAP/WSDL.pm
lib/SOAP/WSDL/Base.pm lib/SOAP/WSDL/Base.pm
@@ -67,23 +93,37 @@ lib/SOAP/WSDL/Factory/Deserializer.pm
lib/SOAP/WSDL/Factory/Generator.pm lib/SOAP/WSDL/Factory/Generator.pm
lib/SOAP/WSDL/Factory/Serializer.pm lib/SOAP/WSDL/Factory/Serializer.pm
lib/SOAP/WSDL/Factory/Transport.pm lib/SOAP/WSDL/Factory/Transport.pm
lib/SOAP/WSDL/Generator/Iterator/WSDL11.pm
lib/SOAP/WSDL/Generator/PrefixResolver.pm
lib/SOAP/WSDL/Generator/Template.pm lib/SOAP/WSDL/Generator/Template.pm
lib/SOAP/WSDL/Generator/Template/Plugin/XSD.pm
lib/SOAP/WSDL/Generator/Template/XSD.pm lib/SOAP/WSDL/Generator/Template/XSD.pm
lib/SOAP/WSDL/Generator/Template/XSD/_type_class.tt lib/SOAP/WSDL/Generator/Template/XSD/attribute.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/all.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/atomicTypes.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/atomicTypes.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/attributeSet.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/complexContent.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/contentModel.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/contentModel.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/extension.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/all.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/all.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/attributeSet.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/choice.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/choice.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/complexContent.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/complexContent.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/content_model.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/restriction.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/restriction.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/simpleContent.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/simpleContent/extension.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/simpleContent/restriction.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/structure.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/structure.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/structure/restriction.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/POD/structure/simpleContent.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/restriction.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/restriction.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/simpleContent.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/simpleContent/extension.tt
lib/SOAP/WSDL/Generator/Template/XSD/complexType/variety.tt lib/SOAP/WSDL/Generator/Template/XSD/complexType/variety.tt
lib/SOAP/WSDL/Generator/Template/XSD/element.tt lib/SOAP/WSDL/Generator/Template/XSD/element.tt
lib/SOAP/WSDL/Generator/Template/XSD/element/POD/contentModel.tt
lib/SOAP/WSDL/Generator/Template/XSD/element/POD/structure.tt lib/SOAP/WSDL/Generator/Template/XSD/element/POD/structure.tt
lib/SOAP/WSDL/Generator/Template/XSD/Interface.tt lib/SOAP/WSDL/Generator/Template/XSD/Interface.tt
lib/SOAP/WSDL/Generator/Template/XSD/Interface/Body.tt lib/SOAP/WSDL/Generator/Template/XSD/Interface/Body.tt
@@ -95,6 +135,7 @@ lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/method_info.tt
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Operation.tt lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Operation.tt
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Part.tt lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Part.tt
lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Type.tt lib/SOAP/WSDL/Generator/Template/XSD/Interface/POD/Type.tt
lib/SOAP/WSDL/Generator/Template/XSD/POD/annotation.tt
lib/SOAP/WSDL/Generator/Template/XSD/Server.tt lib/SOAP/WSDL/Generator/Template/XSD/Server.tt
lib/SOAP/WSDL/Generator/Template/XSD/Server/POD/Message.tt lib/SOAP/WSDL/Generator/Template/XSD/Server/POD/Message.tt
lib/SOAP/WSDL/Generator/Template/XSD/Server/POD/method_info.tt lib/SOAP/WSDL/Generator/Template/XSD/Server/POD/method_info.tt
@@ -104,10 +145,13 @@ lib/SOAP/WSDL/Generator/Template/XSD/simpleType.tt
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/atomicType.tt lib/SOAP/WSDL/Generator/Template/XSD/simpleType/atomicType.tt
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/contentModel.tt lib/SOAP/WSDL/Generator/Template/XSD/simpleType/contentModel.tt
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/list.tt lib/SOAP/WSDL/Generator/Template/XSD/simpleType/list.tt
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/contentModel.tt
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/list.tt lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/list.tt
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/restriction.tt lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/restriction.tt
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/structure.tt lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/structure.tt
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/POD/union.tt
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/restriction.tt lib/SOAP/WSDL/Generator/Template/XSD/simpleType/restriction.tt
lib/SOAP/WSDL/Generator/Template/XSD/simpleType/union.tt
lib/SOAP/WSDL/Generator/Template/XSD/Typemap.tt lib/SOAP/WSDL/Generator/Template/XSD/Typemap.tt
lib/SOAP/WSDL/Generator/Visitor.pm lib/SOAP/WSDL/Generator/Visitor.pm
lib/SOAP/WSDL/Generator/Visitor/Typelib.pm lib/SOAP/WSDL/Generator/Visitor/Typelib.pm
@@ -140,12 +184,29 @@ lib/SOAP/WSDL/Transport/Loopback.pm
lib/SOAP/WSDL/Transport/Test.pm lib/SOAP/WSDL/Transport/Test.pm
lib/SOAP/WSDL/TypeLookup.pm lib/SOAP/WSDL/TypeLookup.pm
lib/SOAP/WSDL/Types.pm lib/SOAP/WSDL/Types.pm
lib/SOAP/WSDL/XSD/Annotation.pm
lib/SOAP/WSDL/XSD/Attribute.pm
lib/SOAP/WSDL/XSD/AttributeGroup.pm
lib/SOAP/WSDL/XSD/Builtin.pm lib/SOAP/WSDL/XSD/Builtin.pm
lib/SOAP/WSDL/XSD/ComplexType.pm lib/SOAP/WSDL/XSD/ComplexType.pm
lib/SOAP/WSDL/XSD/Element.pm lib/SOAP/WSDL/XSD/Element.pm
lib/SOAP/WSDL/XSD/Enumeration.pm
lib/SOAP/WSDL/XSD/FractionDigits.pm
lib/SOAP/WSDL/XSD/Group.pm
lib/SOAP/WSDL/XSD/Length.pm
lib/SOAP/WSDL/XSD/MaxExclusive.pm
lib/SOAP/WSDL/XSD/MaxInclusive.pm
lib/SOAP/WSDL/XSD/MaxLength.pm
lib/SOAP/WSDL/XSD/MinExclusive.pm
lib/SOAP/WSDL/XSD/MinInclusive.pm
lib/SOAP/WSDL/XSD/MinLength.pm
lib/SOAP/WSDL/XSD/Pattern.pm
lib/SOAP/WSDL/XSD/Schema.pm lib/SOAP/WSDL/XSD/Schema.pm
lib/SOAP/WSDL/XSD/Schema/Builtin.pm lib/SOAP/WSDL/XSD/Schema/Builtin.pm
lib/SOAP/WSDL/XSD/SimpleType.pm lib/SOAP/WSDL/XSD/SimpleType.pm
lib/SOAP/WSDL/XSD/TotalDigits.pm
lib/SOAP/WSDL/XSD/Typelib/Attribute.pm
lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin.pm lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
@@ -196,12 +257,14 @@ lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
lib/SOAP/WSDL/XSD/Typelib/Element.pm lib/SOAP/WSDL/XSD/Typelib/Element.pm
lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
lib/SOAP/WSDL/XSD/WhiteSpace.pm
LICENSE LICENSE
Makefile.PL Makefile.PL
MANIFEST This list of files MANIFEST This list of files
META.yml META.yml
MIGRATING MIGRATING
README README
SOAP-WSDL-2.00_32.tar
t/001_use.t t/001_use.t
t/002_parse_wsdl.t t/002_parse_wsdl.t
t/003_wsdl_based_serializer.t t/003_wsdl_based_serializer.t
@@ -216,6 +279,7 @@ t/013_complexType.t
t/016_client_object.t t/016_client_object.t
t/017_generator.t t/017_generator.t
t/020_storable.t t/020_storable.t
t/095_copying.t
t/096_characters.t t/096_characters.t
t/097_kwalitee.t t/097_kwalitee.t
t/098_pod.t t/098_pod.t
@@ -243,19 +307,31 @@ t/acceptance/wsdl/10_helloworld.asmx.xml
t/acceptance/wsdl/11_helloworld.wsdl t/acceptance/wsdl/11_helloworld.wsdl
t/acceptance/wsdl/contributed/Axis.wsdl t/acceptance/wsdl/contributed/Axis.wsdl
t/acceptance/wsdl/contributed/ETest.wsdl t/acceptance/wsdl/contributed/ETest.wsdl
t/acceptance/wsdl/contributed/gasquery.wsdl
t/acceptance/wsdl/contributed/OITest.wsdl t/acceptance/wsdl/contributed/OITest.wsdl
t/acceptance/wsdl/contributed/tools.wsdl t/acceptance/wsdl/contributed/tools.wsdl
t/acceptance/wsdl/elementAtomicComplexType.xml t/acceptance/wsdl/elementAtomicComplexType.xml
t/acceptance/wsdl/email_account.wsdl t/acceptance/wsdl/email_account.wsdl
t/acceptance/wsdl/generator_test.wsdl t/acceptance/wsdl/generator_test.wsdl
t/acceptance/wsdl/generator_test_dot_names.wsdl
t/acceptance/wsdl/generator_unsupported_test.wsdl t/acceptance/wsdl/generator_unsupported_test.wsdl
t/acceptance/wsdl/import.xsd
t/acceptance/wsdl/import_loop.xsd
t/acceptance/wsdl/message_gateway.wsdl t/acceptance/wsdl/message_gateway.wsdl
t/Expat/01_expat.t t/acceptance/wsdl/nested_complextype.wsdl
t/acceptance/wsdl/WSDLParser-import.wsdl
t/acceptance/wsdl/WSDLParser-imported.wsdl
t/acceptance/wsdl/WSDLParser.wsdl
t/acceptance/wsdl/WSDLParser_import_loop.wsdl
t/contributed.wsdl
t/Expat/03_wsdl.t t/Expat/03_wsdl.t
t/lib/MyComplexType.pm t/lib/MyComplexType.pm
t/lib/MyElement.pm t/lib/MyElement.pm
t/lib/MySimpleType.pm t/lib/MySimpleType.pm
t/lib/Test/SOAPMessage.pm t/lib/Test/SOAP/WSDL/Expat/WSDLParser.pm
t/lib/Test/SOAP/WSDL/Generator/Iterator/WSDL11.pm
t/lib/Test/SOAP/WSDL/Generator/Visitor/Typemap.pm
t/lib/Test/SOAP/WSDL/Tester.pm
t/lib/Typelib/Base.pm t/lib/Typelib/Base.pm
t/lib/Typelib/TEnqueueMessage.pm t/lib/Typelib/TEnqueueMessage.pm
t/lib/Typelib/TMessage.pm t/lib/Typelib/TMessage.pm
@@ -278,20 +354,29 @@ t/SOAP/WSDL/05_simpleType-union.t
t/SOAP/WSDL/06_keep_alive.t t/SOAP/WSDL/06_keep_alive.t
t/SOAP/WSDL/11_helloworld.NET.t t/SOAP/WSDL/11_helloworld.NET.t
t/SOAP/WSDL/12_binding.t t/SOAP/WSDL/12_binding.t
t/SOAP/WSDL/Client.t
t/SOAP/WSDL/Client/Base.t t/SOAP/WSDL/Client/Base.t
t/SOAP/WSDL/Definitions.t
t/SOAP/WSDL/Deserializer/Hash.t t/SOAP/WSDL/Deserializer/Hash.t
t/SOAP/WSDL/Deserializer/SOM.t t/SOAP/WSDL/Deserializer/SOM.t
t/SOAP/WSDL/Deserializer/XSD.t t/SOAP/WSDL/Deserializer/XSD.t
t/SOAP/WSDL/Expat/Base.t t/SOAP/WSDL/Expat/Base.t
t/SOAP/WSDL/Expat/MessageParser.t
t/SOAP/WSDL/Expat/WSDLParser.t
t/SOAP/WSDL/Factory/Deserializer.t t/SOAP/WSDL/Factory/Deserializer.t
t/SOAP/WSDL/Factory/Serializer.t t/SOAP/WSDL/Factory/Serializer.t
t/SOAP/WSDL/Factory/Transport.t t/SOAP/WSDL/Factory/Transport.t
t/SOAP/WSDL/Generator/attr.pl
t/SOAP/WSDL/Generator/Template.t t/SOAP/WSDL/Generator/Template.t
t/SOAP/WSDL/Generator/Visitor.t t/SOAP/WSDL/Generator/Visitor.t
t/SOAP/WSDL/Generator/Visitor/Typemap.t t/SOAP/WSDL/Generator/Visitor/Typemap.t
t/SOAP/WSDL/Generator/XCS.t
t/SOAP/WSDL/Generator/XSD.t t/SOAP/WSDL/Generator/XSD.t
t/SOAP/WSDL/Generator/XSD_dot_names.t
t/SOAP/WSDL/Generator/XSD_nested_complextype.t
t/SOAP/WSDL/Generator/XSD_unsupported.t t/SOAP/WSDL/Generator/XSD_unsupported.t
t/SOAP/WSDL/Part.t
t/SOAP/WSDL/PortType.t
t/SOAP/WSDL/Serializer/XSD.t
t/SOAP/WSDL/Server.t t/SOAP/WSDL/Server.t
t/SOAP/WSDL/Server/CGI.t t/SOAP/WSDL/Server/CGI.t
t/SOAP/WSDL/Transport/01_Test.t t/SOAP/WSDL/Transport/01_Test.t
@@ -299,6 +384,16 @@ t/SOAP/WSDL/Transport/02_HTTP.t
t/SOAP/WSDL/Transport/acceptance/test2.xml t/SOAP/WSDL/Transport/acceptance/test2.xml
t/SOAP/WSDL/Transport/acceptance/test3.xml t/SOAP/WSDL/Transport/acceptance/test3.xml
t/SOAP/WSDL/Typelib/Fault11.t t/SOAP/WSDL/Typelib/Fault11.t
t/SOAP/WSDL/Types.t
t/SOAP/WSDL/XSD/Attribute.t
t/SOAP/WSDL/XSD/AttributeGroup.t
t/SOAP/WSDL/XSD/Builtin.t
t/SOAP/WSDL/XSD/ComplexType.t
t/SOAP/WSDL/XSD/Element.t
t/SOAP/WSDL/XSD/Enumeration.t
t/SOAP/WSDL/XSD/Schema.t
t/SOAP/WSDL/XSD/SimpleType.t
t/SOAP/WSDL/XSD/Typelib/Attribute.t
t/SOAP/WSDL/XSD/Typelib/Builtin/01_constructors.t t/SOAP/WSDL/XSD/Typelib/Builtin/01_constructors.t
t/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.t t/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.t
t/SOAP/WSDL/XSD/Typelib/Builtin/anyType.t t/SOAP/WSDL/XSD/Typelib/Builtin/anyType.t
+137 -42
View File
@@ -1,6 +1,6 @@
--- ---
name: SOAP-WSDL name: SOAP-WSDL
version: 2.00_25 version: 2.00.01
author: author:
- 'Martin Kutter <martin.kutter@fen-net.de>' - 'Martin Kutter <martin.kutter@fen-net.de>'
abstract: SOAP with WSDL support abstract: SOAP with WSDL support
@@ -8,13 +8,7 @@ license: artistic
resources: resources:
license: http://opensource.org/licenses/artistic-license.php license: http://opensource.org/licenses/artistic-license.php
requires: requires:
Class::Std::Fast: !!perl/hash:version Class::Std::Fast: 0.0.5
original: v0.0.5
qv: 1
version:
- 0
- 0
- 5
Data::Dumper: 0 Data::Dumper: 0
Date::Format: 0 Date::Format: 0
Date::Parse: 0 Date::Parse: 0
@@ -25,141 +19,236 @@ requires:
List::Util: 0 List::Util: 0
Template: 0 Template: 0
Term::ReadKey: 0 Term::ReadKey: 0
URI: 0
XML::Parser::Expat: 0 XML::Parser::Expat: 0
perl: 5.8.0 perl: 5.8.0
build_requires:
Class::Std::Fast: 0.0.5
Cwd: 0
Date::Format: 0
Date::Parse: 0
File::Basename: 0
File::Path: 0
File::Spec: 0
Getopt::Long: 0
LWP::UserAgent: 0
List::Util: 0
Module::Build: 0
Storable: 0
Template: 0
Test::More: 0
XML::Parser::Expat: 0
provides: provides:
SOAP::WSDL: SOAP::WSDL:
file: lib/SOAP/WSDL.pm file: lib/SOAP/WSDL.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::Base: SOAP::WSDL::Base:
file: lib/SOAP/WSDL/Base.pm file: lib/SOAP/WSDL/Base.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::Binding: SOAP::WSDL::Binding:
file: lib/SOAP/WSDL/Binding.pm file: lib/SOAP/WSDL/Binding.pm
version: 2.00.01
SOAP::WSDL::Client: SOAP::WSDL::Client:
file: lib/SOAP/WSDL/Client.pm file: lib/SOAP/WSDL/Client.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::Client::Base: SOAP::WSDL::Client::Base:
file: lib/SOAP/WSDL/Client/Base.pm file: lib/SOAP/WSDL/Client/Base.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::Definitions: SOAP::WSDL::Definitions:
file: lib/SOAP/WSDL/Definitions.pm file: lib/SOAP/WSDL/Definitions.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::Deserializer::Hash: SOAP::WSDL::Deserializer::Hash:
file: lib/SOAP/WSDL/Deserializer/Hash.pm file: lib/SOAP/WSDL/Deserializer/Hash.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::Deserializer::SOM: SOAP::WSDL::Deserializer::SOM:
file: lib/SOAP/WSDL/Deserializer/SOM.pm file: lib/SOAP/WSDL/Deserializer/SOM.pm
version: 2.00_24 version: 2.00.01
SOAP::WSDL::Deserializer::XSD: SOAP::WSDL::Deserializer::XSD:
file: lib/SOAP/WSDL/Deserializer/XSD.pm file: lib/SOAP/WSDL/Deserializer/XSD.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::Expat::Base: SOAP::WSDL::Expat::Base:
file: lib/SOAP/WSDL/Expat/Base.pm file: lib/SOAP/WSDL/Expat/Base.pm
version: 2.00_24 version: 2.00.01
SOAP::WSDL::Expat::Message2Hash: SOAP::WSDL::Expat::Message2Hash:
file: lib/SOAP/WSDL/Expat/Message2Hash.pm file: lib/SOAP/WSDL/Expat/Message2Hash.pm
version: 2.00_24 version: 2.00.01
SOAP::WSDL::Expat::MessageParser: SOAP::WSDL::Expat::MessageParser:
file: lib/SOAP/WSDL/Expat/MessageParser.pm file: lib/SOAP/WSDL/Expat/MessageParser.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::Expat::MessageStreamParser: SOAP::WSDL::Expat::MessageStreamParser:
file: lib/SOAP/WSDL/Expat/MessageStreamParser.pm file: lib/SOAP/WSDL/Expat/MessageStreamParser.pm
version: 2.00_24 version: 2.00.01
SOAP::WSDL::Factory::Deserializer: SOAP::WSDL::Factory::Deserializer:
file: lib/SOAP/WSDL/Factory/Deserializer.pm file: lib/SOAP/WSDL/Factory/Deserializer.pm
version: 2.00_24 version: 2.00.01
SOAP::WSDL::Factory::Generator: SOAP::WSDL::Factory::Generator:
file: lib/SOAP/WSDL/Factory/Generator.pm file: lib/SOAP/WSDL/Factory/Generator.pm
version: 2.00_24 version: 2.00.01
SOAP::WSDL::Factory::Serializer: SOAP::WSDL::Factory::Serializer:
file: lib/SOAP/WSDL/Factory/Serializer.pm file: lib/SOAP/WSDL/Factory/Serializer.pm
version: 2.00_24 version: 2.00.01
SOAP::WSDL::Factory::Transport: SOAP::WSDL::Factory::Transport:
file: lib/SOAP/WSDL/Factory/Transport.pm file: lib/SOAP/WSDL/Factory/Transport.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::Generator::Iterator::WSDL11:
file: lib/SOAP/WSDL/Generator/Iterator/WSDL11.pm
version: 2.00.01
SOAP::WSDL::Generator::PrefixResolver:
file: lib/SOAP/WSDL/Generator/PrefixResolver.pm
version: 2.00.01
SOAP::WSDL::Generator::Template: SOAP::WSDL::Generator::Template:
file: lib/SOAP/WSDL/Generator/Template.pm file: lib/SOAP/WSDL/Generator/Template.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::Generator::Template::Plugin::XSD:
file: lib/SOAP/WSDL/Generator/Template/Plugin/XSD.pm
version: 2.00.01
SOAP::WSDL::Generator::Template::XSD: SOAP::WSDL::Generator::Template::XSD:
file: lib/SOAP/WSDL/Generator/Template/XSD.pm file: lib/SOAP/WSDL/Generator/Template/XSD.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::Generator::Visitor: SOAP::WSDL::Generator::Visitor:
file: lib/SOAP/WSDL/Generator/Visitor.pm file: lib/SOAP/WSDL/Generator/Visitor.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::Generator::Visitor::Typelib: SOAP::WSDL::Generator::Visitor::Typelib:
file: lib/SOAP/WSDL/Generator/Visitor/Typelib.pm file: lib/SOAP/WSDL/Generator/Visitor/Typelib.pm
version: 2.00.01
SOAP::WSDL::Generator::Visitor::Typemap: SOAP::WSDL::Generator::Visitor::Typemap:
file: lib/SOAP/WSDL/Generator/Visitor/Typemap.pm file: lib/SOAP/WSDL/Generator/Visitor/Typemap.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::Message: SOAP::WSDL::Message:
file: lib/SOAP/WSDL/Message.pm file: lib/SOAP/WSDL/Message.pm
version: 2.00.01
SOAP::WSDL::OpMessage: SOAP::WSDL::OpMessage:
file: lib/SOAP/WSDL/OpMessage.pm file: lib/SOAP/WSDL/OpMessage.pm
version: 2.00.01
SOAP::WSDL::Operation: SOAP::WSDL::Operation:
file: lib/SOAP/WSDL/Operation.pm file: lib/SOAP/WSDL/Operation.pm
version: 2.00.01
SOAP::WSDL::Part: SOAP::WSDL::Part:
file: lib/SOAP/WSDL/Part.pm file: lib/SOAP/WSDL/Part.pm
version: 2.00.01
SOAP::WSDL::Port: SOAP::WSDL::Port:
file: lib/SOAP/WSDL/Port.pm file: lib/SOAP/WSDL/Port.pm
version: 2.00.01
SOAP::WSDL::PortType: SOAP::WSDL::PortType:
file: lib/SOAP/WSDL/PortType.pm file: lib/SOAP/WSDL/PortType.pm
version: 2.00.01
SOAP::WSDL::SOAP::Address: SOAP::WSDL::SOAP::Address:
file: lib/SOAP/WSDL/SOAP/Address.pm file: lib/SOAP/WSDL/SOAP/Address.pm
version: 2.00.01
SOAP::WSDL::SOAP::Body: SOAP::WSDL::SOAP::Body:
file: lib/SOAP/WSDL/SOAP/Body.pm file: lib/SOAP/WSDL/SOAP/Body.pm
version: 2.00.01
SOAP::WSDL::SOAP::Header: SOAP::WSDL::SOAP::Header:
file: lib/SOAP/WSDL/SOAP/Header.pm file: lib/SOAP/WSDL/SOAP/Header.pm
version: 2.00.01
SOAP::WSDL::SOAP::HeaderFault: SOAP::WSDL::SOAP::HeaderFault:
file: lib/SOAP/WSDL/SOAP/HeaderFault.pm file: lib/SOAP/WSDL/SOAP/HeaderFault.pm
version: 2.00.01
SOAP::WSDL::SOAP::Operation: SOAP::WSDL::SOAP::Operation:
file: lib/SOAP/WSDL/SOAP/Operation.pm file: lib/SOAP/WSDL/SOAP/Operation.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::SOAP::Typelib::Fault11: SOAP::WSDL::SOAP::Typelib::Fault11:
file: lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm file: lib/SOAP/WSDL/SOAP/Typelib/Fault11.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::Serializer::XSD: SOAP::WSDL::Serializer::XSD:
file: lib/SOAP/WSDL/Serializer/XSD.pm file: lib/SOAP/WSDL/Serializer/XSD.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::Server: SOAP::WSDL::Server:
file: lib/SOAP/WSDL/Server.pm file: lib/SOAP/WSDL/Server.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::Server::CGI: SOAP::WSDL::Server::CGI:
file: lib/SOAP/WSDL/Server/CGI.pm file: lib/SOAP/WSDL/Server/CGI.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::Service: SOAP::WSDL::Service:
file: lib/SOAP/WSDL/Service.pm file: lib/SOAP/WSDL/Service.pm
version: 2.00.01
SOAP::WSDL::Transport::HTTP: SOAP::WSDL::Transport::HTTP:
file: lib/SOAP/WSDL/Transport/HTTP.pm file: lib/SOAP/WSDL/Transport/HTTP.pm
version: 2.00.01
SOAP::WSDL::Transport::Loopback: SOAP::WSDL::Transport::Loopback:
file: lib/SOAP/WSDL/Transport/Loopback.pm file: lib/SOAP/WSDL/Transport/Loopback.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::Transport::Test: SOAP::WSDL::Transport::Test:
file: lib/SOAP/WSDL/Transport/Test.pm file: lib/SOAP/WSDL/Transport/Test.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::TypeLookup: SOAP::WSDL::TypeLookup:
file: lib/SOAP/WSDL/TypeLookup.pm file: lib/SOAP/WSDL/TypeLookup.pm
version: 2.00.01
SOAP::WSDL::Types: SOAP::WSDL::Types:
file: lib/SOAP/WSDL/Types.pm file: lib/SOAP/WSDL/Types.pm
version: 2.00.01
SOAP::WSDL::XSD::Annotation:
file: lib/SOAP/WSDL/XSD/Annotation.pm
version: 2.00.01
SOAP::WSDL::XSD::Attribute:
file: lib/SOAP/WSDL/XSD/Attribute.pm
version: 2.00.01
SOAP::WSDL::XSD::AttributeGroup:
file: lib/SOAP/WSDL/XSD/AttributeGroup.pm
version: 2.00.01
SOAP::WSDL::XSD::Builtin: SOAP::WSDL::XSD::Builtin:
file: lib/SOAP/WSDL/XSD/Builtin.pm file: lib/SOAP/WSDL/XSD/Builtin.pm
version: 2.00.01
SOAP::WSDL::XSD::ComplexType: SOAP::WSDL::XSD::ComplexType:
file: lib/SOAP/WSDL/XSD/ComplexType.pm file: lib/SOAP/WSDL/XSD/ComplexType.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::XSD::Element: SOAP::WSDL::XSD::Element:
file: lib/SOAP/WSDL/XSD/Element.pm file: lib/SOAP/WSDL/XSD/Element.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::XSD::Enumeration:
file: lib/SOAP/WSDL/XSD/Enumeration.pm
version: 2.00.01
SOAP::WSDL::XSD::FractionDigits:
file: lib/SOAP/WSDL/XSD/FractionDigits.pm
version: 2.00.01
SOAP::WSDL::XSD::Group:
file: lib/SOAP/WSDL/XSD/Group.pm
version: 2.00.01
SOAP::WSDL::XSD::Length:
file: lib/SOAP/WSDL/XSD/Length.pm
version: 2.00.01
SOAP::WSDL::XSD::MaxExclusive:
file: lib/SOAP/WSDL/XSD/MaxExclusive.pm
version: 2.00.01
SOAP::WSDL::XSD::MaxInclusive:
file: lib/SOAP/WSDL/XSD/MaxInclusive.pm
version: 2.00.01
SOAP::WSDL::XSD::MaxLength:
file: lib/SOAP/WSDL/XSD/MaxLength.pm
version: 2.00.01
SOAP::WSDL::XSD::MinExclusive:
file: lib/SOAP/WSDL/XSD/MinExclusive.pm
version: 2.00.01
SOAP::WSDL::XSD::MinInclusive:
file: lib/SOAP/WSDL/XSD/MinInclusive.pm
version: 2.00.01
SOAP::WSDL::XSD::MinLength:
file: lib/SOAP/WSDL/XSD/MinLength.pm
version: 2.00.01
SOAP::WSDL::XSD::Pattern:
file: lib/SOAP/WSDL/XSD/Pattern.pm
version: 2.00.01
SOAP::WSDL::XSD::Schema: SOAP::WSDL::XSD::Schema:
file: lib/SOAP/WSDL/XSD/Schema.pm file: lib/SOAP/WSDL/XSD/Schema.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::XSD::Schema::Builtin: SOAP::WSDL::XSD::Schema::Builtin:
file: lib/SOAP/WSDL/XSD/Schema/Builtin.pm file: lib/SOAP/WSDL/XSD/Schema/Builtin.pm
version: 2.00.01
SOAP::WSDL::XSD::SimpleType: SOAP::WSDL::XSD::SimpleType:
file: lib/SOAP/WSDL/XSD/SimpleType.pm file: lib/SOAP/WSDL/XSD/SimpleType.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::XSD::TotalDigits:
file: lib/SOAP/WSDL/XSD/TotalDigits.pm
version: 2.00.01
SOAP::WSDL::XSD::Typelib::Attribute:
file: lib/SOAP/WSDL/XSD/Typelib/Attribute.pm
version: 2.00.01
SOAP::WSDL::XSD::Typelib::AttributeSet:
file: lib/SOAP/WSDL/XSD/Typelib/AttributeSet.pm
version: 2.00.01
SOAP::WSDL::XSD::Typelib::Builtin: SOAP::WSDL::XSD::Typelib::Builtin:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin.pm file: lib/SOAP/WSDL/XSD/Typelib/Builtin.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::XSD::Typelib::Builtin::ENTITY: SOAP::WSDL::XSD::Typelib::Builtin::ENTITY:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm file: lib/SOAP/WSDL/XSD/Typelib/Builtin/ENTITY.pm
SOAP::WSDL::XSD::Typelib::Builtin::ID: SOAP::WSDL::XSD::Typelib::Builtin::ID:
@@ -184,6 +273,7 @@ provides:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anySimpleType.pm
SOAP::WSDL::XSD::Typelib::Builtin::anyType: SOAP::WSDL::XSD::Typelib::Builtin::anyType:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyType.pm
version: 2.00_29
SOAP::WSDL::XSD::Typelib::Builtin::anyURI: SOAP::WSDL::XSD::Typelib::Builtin::anyURI:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm file: lib/SOAP/WSDL/XSD/Typelib/Builtin/anyURI.pm
SOAP::WSDL::XSD::Typelib::Builtin::base64Binary: SOAP::WSDL::XSD::Typelib::Builtin::base64Binary:
@@ -256,14 +346,19 @@ provides:
file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm file: lib/SOAP/WSDL/XSD/Typelib/Builtin/unsignedShort.pm
SOAP::WSDL::XSD::Typelib::ComplexType: SOAP::WSDL::XSD::Typelib::ComplexType:
file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm file: lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::XSD::Typelib::Element: SOAP::WSDL::XSD::Typelib::Element:
file: lib/SOAP/WSDL/XSD/Typelib/Element.pm file: lib/SOAP/WSDL/XSD/Typelib/Element.pm
version: 2.00_25 version: 2.00.01
SOAP::WSDL::XSD::Typelib::SimpleType: SOAP::WSDL::XSD::Typelib::SimpleType:
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
version: 2.00.01
SOAP::WSDL::XSD::Typelib::SimpleType::restriction: SOAP::WSDL::XSD::Typelib::SimpleType::restriction:
file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm file: lib/SOAP/WSDL/XSD/Typelib/SimpleType.pm
version: 2.00.01
SOAP::WSDL::XSD::WhiteSpace:
file: lib/SOAP/WSDL/XSD/WhiteSpace.pm
version: 2.00.01
generated_by: Module::Build version 0.2808 generated_by: Module::Build version 0.2808
meta-spec: meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.2.html url: http://module-build.sourceforge.net/META-spec-v1.2.html
+32 -3
View File
@@ -1,7 +1,36 @@
MIGRATING MIGRATING
--------- ---------
MIGRATING FROM PRE-2.00_33
--------------------------
The handling of stringification of SOAP::WSDL::XSD simpleType objects with
undef values changed in 2.00_33.
This document describes how to migrate from 2.00_24 and before versions to While 2.00_32 and before returned undef on stringification of a undef value,
>=2.00_33 now returns an empty string.
This is due to common usage in templates or the like, where undef is likely
to produce a warning, and the unreliable behavior of
$obj eq undef
which behaves differently in different versions of perl.
MIGRATING FROM PRE-2.00_29
--------------------------
SOAP::WSDL 2.00_29 added experimental XML attribute support. The attribute
support changed the code of the generated classes, which may now
require the class SOAP::WSDL::XSD::Typelib::Attribute introduced in the same
pre-release.
While interfaces generated with pre-releases back to 2.00_25 work without
change, this does not hold true vice versa: Interfaces generated with
2.00_29 and above won't work with older pre-releases.
You'll have to update SOAP::WSDL on all your machines.
MIGRATING FROM PRE-2.00_24
--------------------------
This section describes how to migrate from 2.00_24 and before versions to
2.00_25. 2.00_25.
Migrating from 2.00_xx Migrating from 2.00_xx
@@ -27,7 +56,7 @@ Typemaps
SOAP::WSDL now tries to load all typemap classes at once from 2.00_25 on. 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 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 paths deeper than the path marked with __SKIP__ - if you don't, SOAP::WSDL
will try to load all correspondent classes. will try to load all correspondent classes.
Migrating from 1.xx Migrating from 1.xx
@@ -39,7 +68,7 @@ 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 for on the fly WSDL processing, nor does it use SOAP::Data objects for
encoding any more. encoding any more.
You should be able to use your wxisting code under most circumstances. You should be able to use your existing code under most circumstances.
SOAP::WSDL is the compatibility module for old interfaces. SOAP::WSDL is the compatibility module for old interfaces.
Overloading Overloading
+1 -26
View File
@@ -1,30 +1,5 @@
# 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 Module::Build::Compat 0.02;
unless (eval "use Module::Build::Compat 0.02; 1" ) {
print "This module requires Module::Build to install itself.\n";
require ExtUtils::MakeMaker;
my $yn = ExtUtils::MakeMaker::prompt
(' Install Module::Build now from CPAN?', 'y');
unless ($yn =~ /^y/i) {
die " *** Cannot install without Module::Build. Exiting ...\n";
}
require Cwd;
require File::Spec;
require CPAN;
# Save this 'cause CPAN will chdir all over the place.
my $cwd = Cwd::cwd();
CPAN::Shell->install('Module::Build::Compat');
CPAN::Shell->expand("Module", "Module::Build::Compat")->uptodate
or die "Couldn't install Module::Build, giving up.\n";
chdir $cwd or die "Cannot chdir() back to $cwd: $!";
}
eval "use Module::Build::Compat 0.02; 1" or die $@;
Module::Build::Compat->run_build_pl(args => \@ARGV); Module::Build::Compat->run_build_pl(args => \@ARGV);
require Module::Build; require Module::Build;
+19 -1
View File
@@ -3,7 +3,25 @@ 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. SUBCLASSING
-----------
SOAP-WSDL is still under very active development. Please don't build
applications using the following modules directly:
- SOAP::WSDL::Definitions
- SOAP::WSDL::Port
- SOAP::WSDL::PortType
- SOAP::WSDL::Binding
- SOAP::WSDL::Message
- SOAP::WSDL::Operation
- SOAP::WSDL::OpMessage
- SOAP::WSDL::Part
- SOAP::WSDL::Service
- SOAP::WSDL::Types
- SOAP::WSDL::XSD::Schema
Those will be replaced some time in the future.
INSTALLING INSTALLING
---------- ----------
Binary file not shown.
+8 -2
View File
@@ -2,10 +2,16 @@
# #
# To get a complete coverage report, just run this file as a shell script # 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): # on a linux box (or execute the equivalent commands on another OS):
#
# Note that this shell script requires Devel::CoverX::Covered - if you
# don't have it, comment out the line noted below
#
cd t/ cd t/
cover -delete
find . -type f -name '*.t' | xargs -n 1 /usr/bin/perl -MDevel::Cover=-silent,1,-summary,0 -I../lib find . -type f -name '*.t' | xargs -n 1 /usr/bin/perl -MDevel::Cover=-silent,1,-summary,0 -I../lib
# Devel::CoverX::Covered
covered runs
cover -ignore_re \.t$ -ignore_re ^lib -coverage="statement" -coverage=condition -coverage=subroutine -coverage="branch" cover -ignore_re \.t$ -ignore_re ^lib -coverage="statement" -coverage=condition -coverage=subroutine -coverage="branch"
+4 -9
View File
@@ -1,24 +1,19 @@
TODO list for SOAP::WSDL TODO list for SOAP::WSDL
2.00 Pre-releases
--------
2.1 release 2.1 release
-------- --------
* Support namespaces in SOAP message payload(#1809057) * Support namespaces in SOAP message payload [ 1809057 ]
* Support the xsi:type attribute on derived types on the wire(#1809059) * Support the xsi:type attribute on derived types on the wire [ 1809059 ]
* SOAP1.2 support (#1803331) * SOAP1.2 support [ 1803331 ]
2.2 release 2.2 release
-------- --------
* XML schema support ("minimal conformant") (#1764845) * XML schema support ("minimal conformant") [ 1764845 ]
* Support SOAP attachments * Support SOAP attachments
* Act as SOAP Server
3.0 release 3.0 release
-------- --------
We're not thinking that far ahead right now. We're not thinking that far ahead right now.
+62 -15
View File
@@ -1,15 +1,17 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
%DB::packages=(SOAP::WSDL::Expat::MessageParser => 1);
use strict; use strict;
use warnings; use warnings;
use lib '../lib'; use lib '../lib';
use lib '../../Class-Std-Fast/lib'; use lib '../../Class-Std-Fast/lib';
use lib '/home/martin/workspace/SOAP-WSDL_XS/blib/lib';
use lib '/home/martin/workspace/SOAP-WSDL_XS/blib/arch';
use lib '../t/lib'; use lib '../t/lib';
# use SOAP::WSDL::SAX::MessageHandler; # use SOAP::WSDL::SAX::MessageHandler;
use Benchmark qw(cmpthese timethese); use Benchmark qw(cmpthese timethese);
use SOAP::WSDL::Expat::MessageParser; use SOAP::WSDL::Expat::MessageParser;
use SOAP::WSDL::Expat::Message2Hash; use SOAP::WSDL::Expat::Message2Hash;
use SOAP::WSDL::Expat::MessageParser_XS;
use SOAP::Lite; use SOAP::Lite;
use XML::Simple; use XML::Simple;
use XML::LibXML; use XML::LibXML;
@@ -22,19 +24,45 @@ my $xml = q{<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-insta
<SOAP-ENV:Body> <SOAP-ENV:Body>
<MyAtomicComplexTypeElement xmlns="urn:Test" > <MyAtomicComplexTypeElement xmlns="urn:Test" >
<test> <test>
<test2 >Test2</test2> <test2 >Test2</test2>
<test2 >Test2</test2> <test2 >Test3</test2>
<test2 >Test2</test2> <test2 >Test4</test2>
<test2 >Test2</test2> <test2 >Test5</test2>
<test2 >Test2</test2> <test2 >Test6</test2>
<test2 >Test2</test2> <test2 >Test7</test2>
<test2 >Test2</test2> <test2 >Test8</test2>
<test2 >Test2</test2> <test2 >Test9</test2>
<test2 >Test2</test2> <test2 >Test10</test2>
<test2 >Test2</test2> <test2 >Test11</test2>
<test2 >Test2</test2> <test2 >Test12</test2>
<test2 >Test2</test2> <test2 >Test13</test2>
<test2 >Test55</test2> <test2 >Test55</test2>
<test2 >Test14</test2>
<test2 >Test15</test2>
<test2 >Test16</test2>
<test2 >Test17</test2>
<test2 >Test18</test2>
<test2 >Test19</test2>
<test2 >Test20</test2>
<test2 >Test21</test2>
<test2 >Test22</test2>
<test2 >Test23</test2>
<test2 >Test24</test2>
<test2 >Test25</test2>
<test2 >Test565</test2>
<test2 >Test27</test2>
<test2 >Test28</test2>
<test2 >Test29</test2>
<test2 >Test30</test2>
<test2 >Test31</test2>
<test2 >Test32</test2>
<test2 >Test33</test2>
<test2 >Test34</test2>
<test2 >Test35</test2>
<test2 >Test36</test2>
<test2 >Test37</test2>
<test2 >Test38</test2>
<test2 >Test55</test2>
</test> </test>
</MyAtomicComplexTypeElement> </MyAtomicComplexTypeElement>
</SOAP-ENV:Body></SOAP-ENV:Envelope>}; </SOAP-ENV:Body></SOAP-ENV:Envelope>};
@@ -57,6 +85,10 @@ my @data;
my $deserializer = SOAP::Deserializer->new(); my $deserializer = SOAP::Deserializer->new();
my $parser_xs = SOAP::WSDL::Expat::MessageParser_XS->new({
class_resolver => 'FakeResolver'
});
sub libxml_test { sub libxml_test {
my $dom = $libxml->parse_string( $xml ); my $dom = $libxml->parse_string( $xml );
push @data, dom2hash( $dom->firstChild ); push @data, dom2hash( $dom->firstChild );
@@ -94,11 +126,11 @@ sub dom2hash {
} }
return $_[1]; return $_[1];
} }
cmpthese 5000, cmpthese 5000,
{ {
'SOAP::WSDL (Hash)' => sub { push @data, $hash_parser->parse( $xml ) }, 'SOAP::WSDL (Hash)' => sub { push @data, $hash_parser->parse( $xml ) },
'SOAP::WSDL (XSD)' => sub { push @data, $parser->parse( $xml ) }, 'SOAP::WSDL (XSD)' => sub { push @data, $parser->parse( $xml ) },
'SOAP::WSDL_XS (XSD)' => sub { push @data, $parser_xs->parse_string( $xml ) },
'XML::Simple (Hash)' => sub { push @data, XMLin $xml }, 'XML::Simple (Hash)' => sub { push @data, XMLin $xml },
'XML::LibXML (DOM)' => sub { push @data, $libxml->parse_string( $xml ) }, 'XML::LibXML (DOM)' => sub { push @data, $libxml->parse_string( $xml ) },
'XML::LibXML (Hash)' => \&libxml_test, 'XML::LibXML (Hash)' => \&libxml_test,
@@ -128,3 +160,18 @@ BEGIN {
}; };
}; };
}; };
__END__
Output on my machine:
xml length: 641 bytes
Rate SOAP::Lite XML::Simple (Hash) SOAP::WSDL (XSD) XML::LibXML (Hash) SOAP::WSDL (Hash) SOAP::WSDL_XS (XSD) XML::LibXML (DOM)
SOAP::Lite 446/s -- -54% -72% -73% -80% -95% -96%
XML::Simple (Hash) 963/s 116% -- -39% -41% -57% -89% -91%
SOAP::WSDL (XSD) 1587/s 256% 65% -- -3% -29% -81% -86%
XML::LibXML (Hash) 1629/s 265% 69% 3% -- -27% -81% -85%
SOAP::WSDL (Hash) 2222/s 398% 131% 40% 36% -- -74% -80%
SOAP::WSDL_XS (XSD) 8475/s 1798% 780% 434% 420% 281% -- -24%
XML::LibXML (DOM) 11111/s 2389% 1053% 600% 582% 400% 31% --
+1 -1
View File
@@ -11,7 +11,7 @@ my $obj = SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new();
timethese 10000, { timethese 10000, {
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new() }, 'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new() },
'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new({ 'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType->new({
value => 'Teststring' value => 'Teststring',
}) }, }) },
'set_FOO' => sub { $obj->set_value('Test') }, 'set_FOO' => sub { $obj->set_value('Test') },
}; };
+3 -2
View File
@@ -11,8 +11,9 @@ my $obj = SOAP::WSDL::XSD::Typelib::Builtin::string->new();
timethese 20000, { timethese 20000, {
'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new() }, 'new' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new() },
'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new({ 'new + params' => sub { SOAP::WSDL::XSD::Typelib::Builtin::string->new({
value => 'Teststring' value => 'Teststring',
}) }, })
},
}; };
$obj->set_value('Foobar'); $obj->set_value('Foobar');
+34 -11
View File
@@ -1,29 +1,43 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
use strict; use strict;
use warnings; use warnings;
use diagnostics;
use lib '../example/lib'; use lib '../example/lib';
use lib '/home/martin/workspace/SOAP-WSDL-Fast_XS/blib/lib'; use lib '../../SOAP-Lite-0.71/lib';
use lib '/home/martin/workspace/SOAP-WSDL-Fast_XS/blib/arch'; use lib '/home/martin/workspace/SOAP-WSDL_XS/blib/lib';
use lib '/home/martin/workspace/SOAP-WSDL_XS/blib/arch';
use Data::Dumper;
use SOAP::Lite; use SOAP::Lite;
use XML::Compile::WSDL11; use XML::Compile::WSDL11;
use XML::Compile::Transport::SOAPHTTP; use XML::Compile::Transport::SOAPHTTP;
use MyInterfaces::HelloWorld::HelloWorldSoap; use MyInterfaces::HelloWorld::HelloWorldSoap;
use SOAP::WSDL::Deserializer::XSD_XS; use SOAP::WSDL::Deserializer::XSD_XS;
use Benchmark qw(cmpthese); use Benchmark qw(cmpthese timethese);
use SOAP::WSDL::Transport::HTTP;
use SOAP::WSDL::Factory::Transport;
SOAP::WSDL::Factory::Transport->register('http', 'SOAP::WSDL::Transport::HTTP');
#my $proxy = 'http://localhost:81/soap-wsdl-test/helloworld.pl';
my $proxy = 'http://localhost:81/soap-wsdl-test/helloworld';
my $lite = SOAP::Lite->new( my $lite = SOAP::Lite->new(
proxy => 'http://localhost:81/soap-wsdl-test/helloworld.pl' proxy => $proxy
); );
$lite->on_action( sub { "urn:HelloWorld#sayHello" }); $lite->on_action( sub { "urn:HelloWorld#sayHello" });
$lite->autotype(0); $lite->autotype(0);
my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new(); my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new({
proxy => $proxy,
});
my $soap_xs = MyInterfaces::HelloWorld::HelloWorldSoap->new(); my $soap_xs = MyInterfaces::HelloWorld::HelloWorldSoap->new({
proxy => $proxy,
});
$soap_xs->set_deserializer( SOAP::WSDL::Deserializer::XSD_XS->new() ); $soap_xs->set_deserializer( SOAP::WSDL::Deserializer::XSD_XS->new() );
my @result; my @result = ();;
sub wsdl_bench { sub wsdl_bench {
push @result, $soap->sayHello({ push @result, $soap->sayHello({
@@ -40,7 +54,12 @@ sub wsdl_xs_bench {
} }
my $wsdl = XML::Compile::WSDL11->new('../example/wsdl/11_helloworld.wsdl'); my $wsdl = XML::Compile::WSDL11->new('../example/wsdl/11_helloworld.wsdl');
my $call = $wsdl->compileClient('sayHello'); my $call = $wsdl->compileClient('sayHello',
sloppy_integers => 1,
check_values => 0,
check_values => 0,
validation => 0,
);
sub compile_bench { sub compile_bench {
push @result, $call->( push @result, $call->(
@@ -58,12 +77,16 @@ sub lite_bench {
); );
} }
# give all a chance to perform first-run initializations
compile_bench();
lite_bench();
wsdl_bench(); wsdl_bench();
wsdl_xs_bench(); wsdl_xs_bench();
cmpthese 150, { timethese 150, {
'SOAP::WSDL' => \&wsdl_bench, 'SOAP::WSDL' => \&wsdl_bench,
'SOAP::WSDL_XS' => \&wsdl_xs_bench, 'SOAP::WSDL_XS' => \&wsdl_xs_bench,
'XML::Compile' => \&compile_bench, 'XML::Compile' => \&compile_bench,
# 'SOAP::Lite' => \&lite_bench, 'SOAP::Lite' => \&lite_bench,
} };
+163
View File
@@ -0,0 +1,163 @@
use lib '../lib';
use lib '../example/lib';
use lib '../../Class-Std-Fast/lib';
use lib '../../SOAP-Lite-0.71/lib';
use lib '../../SOAP-WSDL_XS/blib/lib';
use lib '../../SOAP-WSDL_XS/blib/arch';
use strict;
use Benchmark qw(cmpthese);
use XML::Compile::Transport::SOAPHTTP();
use XML::Compile::Util;
use XML::Compile::WSDL11;
use XML::Simple;
use SOAP::Lite;
use MyInterfaces::TestService::TestPort;
use SOAP::WSDL::Deserializer::XSD_XS;
use SOAP::WSDL::Factory::Deserializer;
#
# register SOAP::WSDL's transport as default for SOAP::WSDL and SOAP::WSDL_XS
# - they use SOAP::Lite's SOAP::Transport::* if available
#
use SOAP::WSDL::Transport::HTTP;
use SOAP::WSDL::Factory::Transport;
SOAP::WSDL::Factory::Transport->register('http', 'SOAP::WSDL::Transport::HTTP');
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
my $person = {
PersonID => { # MyTypes::PersonID
ID => 1, # int
},
Salutation => 'Salutation0', # string
Name => 'Name0', # string
GivenName => 'Martin', # string
DateOfBirth => '1970-01-01', # date
HomeAddress => { # MyTypes::Address
Street => 'Street 0', # string
ZIP => '00000', # string
City => 'City0', # string
Country => 'Country0', # string
PhoneNumber => '++499131123456', # PhoneNumber
MobilePhoneNumber => '++49150123456', # PhoneNumber
},
WorkAddress => { # MyTypes::Address
Street => 'Somestreet 23', # string
ZIP => '12345', # string
City => 'SomeCity', # string
Country => 'Germany', # string
PhoneNumber => '++499131123456', # PhoneNumber
MobilePhoneNumber => '++49150123456', # PhoneNumber
},
Contracts => { # MyTypes::ArrayOfContract
Contract => [
{ # MyTypes::Contract
ContractID => 100000, # long
ContractName => 'SomeContract0', # string
},
{ # MyTypes::Contract
ContractID => 100001, # long
ContractName => 'SomeContract1', # string
},
{ # MyTypes::Contract
ContractID => 100002, # long
ContractName => 'SomeContract2', # string
},
{ # MyTypes::Contract
ContractID => 100003, # long
ContractName => 'SomeContract3', # string
},
],
},
}
;
#
# compile XML::Compile client with the options suggested by Mark Overmeer
# for maximum speedup
#
my $compile = XML::Compile::WSDL11->new('../example/wsdl/Person.wsdl',
sloppy_integers => 1,
check_values => 0,
check_values => 0,
validation => 0,
ignore_facets => 1,
);
my $call = $compile->compileClient('ListPerson');
$call->({ in => undef});
# Initialize SOAP::Lite
my $deserializer = SOAP::Deserializer->new();
# Initialize SOAP::WSDL interface
my $soap = MyInterfaces::TestService::TestPort->new();
# Load all classes - XML::Compile has created everything before, too
$soap->ListPerson({});
my $lite = SOAP::Lite->new()->default_ns('http://www.example.org/benchmark/')
->proxy('http://localhost:81/soap-wsdl-test/person.pl');
$lite->on_action( sub { 'http://www.example.org/benchmark/ListPerson' } );
# # register for SOAP 1.1
SOAP::WSDL::Factory::Deserializer->register('1.1' => 'SOAP::WSDL::Deserializer::XSD_XS' );
my $wsdl_xs = MyInterfaces::TestService::TestPort->new();
my $count = 70;
my @data = ();
my $n = 0;
print "Benchmark conducted with
SOAP::Lite - $SOAP::Lite::VERSION
SOAP::WSDL - $SOAP::WSDL::Client::VERSION
SOAP::WSDL_XS - $SOAP::WSDL::Deserializer::XSD_XS::VERSION;
XML::Compile::SOAP - $XML::Compile::SOAP::VERSION
Benchmark $n: Store result in private variable and destroy it
";
$n++;
cmpthese $count, {
'SOAP::WSDL' => sub { my $result = $soap->ListPerson({}) },
'XML::Compile' => sub { my $result = $call->() },
'SOAP::WSDL_XS' => sub { my $result = $wsdl_xs->ListPerson({}) },
'SOAP::Lite' => sub { my $som = $lite->call('ListPerson') },
};
print "\nBenchmark $n: Push result on list\n";
$n++;
cmpthese $count, {
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
'XML::Compile' => sub { push @data, $call->() },
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
};
@data = ();
print "\nBenchmark $n: Play it again, Sam\n";
$n++;
cmpthese $count, {
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({}) },
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({}) },
'XML::Compile' => sub { push @data, $call->() },
'SOAP::Lite' => sub { push @data, $lite->call('ListPerson') },
};
print "\nBenchmark $n: ca. 1kB request - result destroyed immediately\n";
$n++;
cmpthese $count, {
'SOAP::WSDL' => sub { my $result = $soap->ListPerson({ in => $person }) },
'SOAP::WSDL_XS' => sub { my $result = $wsdl_xs->ListPerson({ in => $person }) },
'XML::Compile' => sub { my $result = $call->({ in => $person }) },
};
print "\nBenchmark $n: ca. 1kB request - push result on list\n";
$n++;
cmpthese $count, {
'SOAP::WSDL' => sub { push @data, $soap->ListPerson({ in => $person }) },
'SOAP::WSDL_XS' => sub { push @data, $wsdl_xs->ListPerson({ in => $person }) },
'XML::Compile' => sub { push @data, $call->({ in => $person }) },
};
+437
View File
@@ -0,0 +1,437 @@
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body>
<ListPersonResponse xmlns="http://www.example.org/benchmark/">
<out>
<NewElement>
<PersonID>
<ID>1</ID>
</PersonID>
<Salutation>Salutation0</Salutation>
<Name>Name0</Name>
<GivenName>Martin</GivenName>
<DateOfBirth>1970-01-01</DateOfBirth>
<HomeAddress>
<Street>Street 0</Street>
<ZIP>00000</ZIP>
<City>City0</City>
<Country>Country0</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 23</Street>
<ZIP>12345</ZIP>
<City>SomeCity</City>
<Country>Germany</Country>
<PhoneNumber>++499131123456</PhoneNumber>
<MobilePhoneNumber>++49150123456</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100000</ContractID>
<ContractName>SomeContract0</ContractName>
</Contract>
<Contract>
<ContractID>100001</ContractID>
<ContractName>SomeContract1</ContractName>
</Contract>
<Contract>
<ContractID>100002</ContractID>
<ContractName>SomeContract2</ContractName>
</Contract>
<Contract>
<ContractID>100003</ContractID>
<ContractName>SomeContract3</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>2</ID>
</PersonID>
<Salutation>Salutation2</Salutation>
<Name>Name2</Name>
<GivenName>Martin2</GivenName>
<DateOfBirth>1970-01-02</DateOfBirth>
<HomeAddress>
<Street>Street 2</Street>
<ZIP>00002</ZIP>
<City>City2</City>
<Country>Country2</Country>
<PhoneNumber>++4900000002</PhoneNumber>
<MobilePhoneNumber>++491700000002</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 2</Street>
<ZIP>222222</ZIP>
<City>SomeCity2</City>
<Country>Germany</Country>
<PhoneNumber>++4920000002</PhoneNumber>
<MobilePhoneNumber>++4920000002</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100002</ContractID>
<ContractName>SomeContract2</ContractName>
</Contract>
<Contract>
<ContractID>100021</ContractID>
<ContractName>SomeContract21</ContractName>
</Contract>
<Contract>
<ContractID>100022</ContractID>
<ContractName>SomeContract22</ContractName>
</Contract>
<Contract>
<ContractID>1000023</ContractID>
<ContractName>SomeContract23</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>3</ID>
</PersonID>
<Salutation>Salutation3</Salutation>
<Name>Name3</Name>
<GivenName>Martin3</GivenName>
<DateOfBirth>1970-01-03</DateOfBirth>
<HomeAddress>
<Street>Street 3</Street>
<ZIP>00003</ZIP>
<City>City3</City>
<Country>Country3</Country>
<PhoneNumber>++4900000003</PhoneNumber>
<MobilePhoneNumber>++491700000003</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 3</Street>
<ZIP>333333</ZIP>
<City>SomeCity3</City>
<Country>Germany</Country>
<PhoneNumber>++4930000003</PhoneNumber>
<MobilePhoneNumber>++4930000003</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100003</ContractID>
<ContractName>SomeContract3</ContractName>
</Contract>
<Contract>
<ContractID>100031</ContractID>
<ContractName>SomeContract31</ContractName>
</Contract>
<Contract>
<ContractID>100033</ContractID>
<ContractName>SomeContract33</ContractName>
</Contract>
<Contract>
<ContractID>1000033</ContractID>
<ContractName>SomeContract33</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>4</ID>
</PersonID>
<Salutation>Salutation4</Salutation>
<Name>Name4</Name>
<GivenName>Martin4</GivenName>
<DateOfBirth>1970-01-04</DateOfBirth>
<HomeAddress>
<Street>Street 4</Street>
<ZIP>00004</ZIP>
<City>City4</City>
<Country>Country4</Country>
<PhoneNumber>++4900000004</PhoneNumber>
<MobilePhoneNumber>++491700000004</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 4</Street>
<ZIP>444444</ZIP>
<City>SomeCity4</City>
<Country>Germany</Country>
<PhoneNumber>++4940000004</PhoneNumber>
<MobilePhoneNumber>++4940000004</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100004</ContractID>
<ContractName>SomeContract4</ContractName>
</Contract>
<Contract>
<ContractID>100041</ContractID>
<ContractName>SomeContract41</ContractName>
</Contract>
<Contract>
<ContractID>100044</ContractID>
<ContractName>SomeContract44</ContractName>
</Contract>
<Contract>
<ContractID>1000044</ContractID>
<ContractName>SomeContract44</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>5</ID>
</PersonID>
<Salutation>Salutation5</Salutation>
<Name>Name5</Name>
<GivenName>Martin5</GivenName>
<DateOfBirth>1970-01-05</DateOfBirth>
<HomeAddress>
<Street>Street 5</Street>
<ZIP>00005</ZIP>
<City>City5</City>
<Country>Country5</Country>
<PhoneNumber>++4900000005</PhoneNumber>
<MobilePhoneNumber>++491700000005</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 5</Street>
<ZIP>555555</ZIP>
<City>SomeCity5</City>
<Country>Germany</Country>
<PhoneNumber>++4950000005</PhoneNumber>
<MobilePhoneNumber>++4950000005</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100005</ContractID>
<ContractName>SomeContract5</ContractName>
</Contract>
<Contract>
<ContractID>100051</ContractID>
<ContractName>SomeContract51</ContractName>
</Contract>
<Contract>
<ContractID>100055</ContractID>
<ContractName>SomeContract55</ContractName>
</Contract>
<Contract>
<ContractID>1000053</ContractID>
<ContractName>SomeContract53</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>6</ID>
</PersonID>
<Salutation>Salutation6</Salutation>
<Name>Name6</Name>
<GivenName>Martin6</GivenName>
<DateOfBirth>1970-01-06</DateOfBirth>
<HomeAddress>
<Street>Street 6</Street>
<ZIP>00006</ZIP>
<City>City6</City>
<Country>Country6</Country>
<PhoneNumber>++4900000006</PhoneNumber>
<MobilePhoneNumber>++491700000006</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 6</Street>
<ZIP>666666</ZIP>
<City>SomeCity6</City>
<Country>Germany</Country>
<PhoneNumber>++4960000006</PhoneNumber>
<MobilePhoneNumber>++4960000006</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100006</ContractID>
<ContractName>SomeContract6</ContractName>
</Contract>
<Contract>
<ContractID>100061</ContractID>
<ContractName>SomeContract61</ContractName>
</Contract>
<Contract>
<ContractID>100066</ContractID>
<ContractName>SomeContract66</ContractName>
</Contract>
<Contract>
<ContractID>1000063</ContractID>
<ContractName>SomeContract63</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>7</ID>
</PersonID>
<Salutation>Salutation7</Salutation>
<Name>Name7</Name>
<GivenName>Martin7</GivenName>
<DateOfBirth>1970-01-07</DateOfBirth>
<HomeAddress>
<Street>Street 7</Street>
<ZIP>00007</ZIP>
<City>City7</City>
<Country>Country7</Country>
<PhoneNumber>++4900000007</PhoneNumber>
<MobilePhoneNumber>++491700000007</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 7</Street>
<ZIP>777777</ZIP>
<City>SomeCity7</City>
<Country>Germany</Country>
<PhoneNumber>++4970000007</PhoneNumber>
<MobilePhoneNumber>++4970000007</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100007</ContractID>
<ContractName>SomeContract7</ContractName>
</Contract>
<Contract>
<ContractID>100071</ContractID>
<ContractName>SomeContract71</ContractName>
</Contract>
<Contract>
<ContractID>100077</ContractID>
<ContractName>SomeContract77</ContractName>
</Contract>
<Contract>
<ContractID>1000073</ContractID>
<ContractName>SomeContract73</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>8</ID>
</PersonID>
<Salutation>Salutation8</Salutation>
<Name>Name8</Name>
<GivenName>Martin8</GivenName>
<DateOfBirth>1970-01-08</DateOfBirth>
<HomeAddress>
<Street>Street 8</Street>
<ZIP>00008</ZIP>
<City>City8</City>
<Country>Country8</Country>
<PhoneNumber>++4900000008</PhoneNumber>
<MobilePhoneNumber>++491700000008</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 8</Street>
<ZIP>888888</ZIP>
<City>SomeCity8</City>
<Country>Germany</Country>
<PhoneNumber>++4980000008</PhoneNumber>
<MobilePhoneNumber>++4980000008</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100008</ContractID>
<ContractName>SomeContract8</ContractName>
</Contract>
<Contract>
<ContractID>100081</ContractID>
<ContractName>SomeContract81</ContractName>
</Contract>
<Contract>
<ContractID>100088</ContractID>
<ContractName>SomeContract88</ContractName>
</Contract>
<Contract>
<ContractID>1000083</ContractID>
<ContractName>SomeContract83</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>9</ID>
</PersonID>
<Salutation>Salutation9</Salutation>
<Name>Name9</Name>
<GivenName>Martin9</GivenName>
<DateOfBirth>1970-01-09</DateOfBirth>
<HomeAddress>
<Street>Street 9</Street>
<ZIP>00009</ZIP>
<City>City9</City>
<Country>Country9</Country>
<PhoneNumber>++4900000009</PhoneNumber>
<MobilePhoneNumber>++491700000009</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 9</Street>
<ZIP>999999</ZIP>
<City>SomeCity9</City>
<Country>Germany</Country>
<PhoneNumber>++4990000009</PhoneNumber>
<MobilePhoneNumber>++4990000009</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>100009</ContractID>
<ContractName>SomeContract9</ContractName>
</Contract>
<Contract>
<ContractID>100091</ContractID>
<ContractName>SomeContract91</ContractName>
</Contract>
<Contract>
<ContractID>100099</ContractID>
<ContractName>SomeContract99</ContractName>
</Contract>
<Contract>
<ContractID>1000093</ContractID>
<ContractName>SomeContract93</ContractName>
</Contract>
</Contracts>
</NewElement>
<NewElement>
<PersonID>
<ID>10</ID>
</PersonID>
<Salutation>Salutation10</Salutation>
<Name>Name10</Name>
<GivenName>Martin10</GivenName>
<DateOfBirth>1970-01-010</DateOfBirth>
<HomeAddress>
<Street>Street 10</Street>
<ZIP>000010</ZIP>
<City>City10</City>
<Country>Country10</Country>
<PhoneNumber>++49000000010</PhoneNumber>
<MobilePhoneNumber>++4917000000010</MobilePhoneNumber>
</HomeAddress>
<WorkAddress>
<Street>Somestreet 10</Street>
<ZIP>101010101010</ZIP>
<City>SomeCity10</City>
<Country>Germany</Country>
<PhoneNumber>++491000000010</PhoneNumber>
<MobilePhoneNumber>++491000000010</MobilePhoneNumber>
</WorkAddress>
<Contracts>
<Contract>
<ContractID>1000010</ContractID>
<ContractName>SomeContract10</ContractName>
</Contract>
<Contract>
<ContractID>1000101</ContractID>
<ContractName>SomeContract101</ContractName>
</Contract>
<Contract>
<ContractID>10001010</ContractID>
<ContractName>SomeContract1010</ContractName>
</Contract>
<Contract>
<ContractID>10000103</ContractID>
<ContractName>SomeContract103</ContractName>
</Contract>
</Contracts>
</NewElement>
</out>
</ListPersonResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
+19
View File
@@ -0,0 +1,19 @@
use lib '../lib';
use lib '../example/lib';
use lib '../../SOAP-WSDL_XS/blib/lib';
use lib '../../SOAP-WSDL_XS/blib/arch';
use strict;
# use Benchmark;
use SOAP::WSDL::Deserializer::XSD_XS;
use SOAP::WSDL::Factory::Deserializer;
# # register for SOAP 1.1
SOAP::WSDL::Factory::Deserializer->register('1.1' => 'SOAP::WSDL::Deserializer::XSD_XS' );
use MyInterfaces::TestService::TestPort;
my $soap = MyInterfaces::TestService::TestPort->new();
# Load all classes - XML::Compile has created everything before, too
if (@ARGV) { print $soap->ListPerson({}) }
else {
$soap->ListPerson({})
}
File diff suppressed because one or more lines are too long
+10 -9
View File
@@ -19,6 +19,7 @@ my %opt = (
proxy => undef, proxy => undef,
generator => 'XSD', generator => 'XSD',
server => 0, server => 0,
namespace => 0,
); );
{ # a block just to scope "no warnings" { # a block just to scope "no warnings"
@@ -34,12 +35,14 @@ my %opt = (
ReadMode 1; ReadMode 1;
$user = ReadLine(); $user = ReadLine();
ReadMode 0; ReadMode 0;
chomp $user;
}; };
if (not $password = delete $opt{password}) { if (not $password = delete $opt{password}) {
print 'Password:'; print 'Password:';
ReadMode 2; ReadMode 2;
$user = ReadLine; $password = ReadLine;
ReadMode 0; ReadMode 0;
chomp $password;
}; };
return ($user, $password); return ($user, $password);
}; };
@@ -61,6 +64,7 @@ GetOptions(\%opt,
password=s password=s
generator=s generator=s
server server
namespaces|n
) )
); );
@@ -69,8 +73,6 @@ my $url = $ARGV[0];
pod2usage( -exit => 1 , verbose => 2 ) if ($opt{help}); pod2usage( -exit => 1 , verbose => 2 ) if ($opt{help});
pod2usage( -exit => 1 , verbose => 1 ) if not ($url); pod2usage( -exit => 1 , verbose => 1 ) if not ($url);
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
local $ENV{HTTP_PROXY} = $opt{proxy} if $opt{proxy}; local $ENV{HTTP_PROXY} = $opt{proxy} if $opt{proxy};
local $ENV{HTTPS_PROXY} = $opt{proxy} if $opt{proxy}; local $ENV{HTTPS_PROXY} = $opt{proxy} if $opt{proxy};
@@ -81,12 +83,11 @@ my $lwp = LWP::UserAgent->new(
); );
$lwp->env_proxy(); # get proxy from environment. Works for both http & https. $lwp->env_proxy(); # get proxy from environment. Works for both http & https.
my $response = $lwp->get($url); my $parser = SOAP::WSDL::Expat::WSDLParser->new({
die $response->message(), "\n" if $response->code != 200; user_agent => $lwp,
});
my $xml = $response->content(); my $definitions = $parser->parse_uri( $url );
my $definitions = $parser->parse_string( $xml );
my %typemap = (); my %typemap = ();
@@ -112,7 +113,7 @@ $generator->set_element_prefix($opt{ element_prefix }) if $generator->can('set_e
$generator->set_interface_prefix($opt{ interface_prefix }) if $generator->can('set_interface_prefix'); $generator->set_interface_prefix($opt{ interface_prefix }) if $generator->can('set_interface_prefix');
$generator->set_OUTPUT_PATH($opt{ base_path }) if $generator->can('set_OUTPUT_PATH'); $generator->set_OUTPUT_PATH($opt{ base_path }) if $generator->can('set_OUTPUT_PATH');
$generator->set_definitions($definitions) if $generator->can('set_definitions'); $generator->set_definitions($definitions) if $generator->can('set_definitions');
$generator->set_wsdl($xml) if $generator->can('set_wsdl'); # $generator->set_wsdl($xml) if $generator->can('set_wsdl');
# start with typelib, as errors will most likely occur here... # start with typelib, as errors will most likely occur here...
$generator->generate(); $generator->generate();
+2
View File
@@ -1,4 +1,5 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
package main;
use strict; use strict;
use warnings; use warnings;
use lib '../../lib'; use lib '../../lib';
@@ -53,3 +54,4 @@ Then run the helloworld.pl from the examples directory. It should print
=head1 DESCRIPTION =head1 DESCRIPTION
=cut =cut
+84
View File
@@ -0,0 +1,84 @@
#!/usr/bin/perl -w
package main;
use strict;
use warnings;
use lib qw(../lib ../../lib);
use MyElements::ListPersonResponse;
use MyServer::TestService::TestPort;
my $server = MyServer::TestService::TestPort->new({
dispatch_to => 'main',
transport_class => 'SOAP::WSDL::Server::CGI', # optional, default
});
$server->handle();
sub ListPerson {
my ($self, $body, $header) = @_;
# body is a ??? object - sorry, POD not implemented yet
# header is a ??? object - sorry, POD not implemented yet
# do something with body and header...
my %person = (
PersonID => { # MyTypes::PersonID
ID => 1, # int
},
Salutation => 'Salutation0', # string
Name => 'Name0', # string
GivenName => 'Martin', # string
DateOfBirth => '1970-01-01', # date
HomeAddress => { # MyTypes::Address
Street => 'Street 0', # string
ZIP => '00000', # string
City => 'City0', # string
Country => 'Country0', # string
PhoneNumber => '++499131123456', # PhoneNumber
MobilePhoneNumber => '++49150123456', # PhoneNumber
},
WorkAddress => { # MyTypes::Address
Street => 'Somestreet 23', # string
ZIP => '12345', # string
City => 'SomeCity', # string
Country => 'Germany', # string
PhoneNumber => '++499131123456', # PhoneNumber
MobilePhoneNumber => '++49150123456', # PhoneNumber
},
Contracts => { # MyTypes::ArrayOfContract
Contract => [
{ # MyTypes::Contract
ContractID => 100000, # long
ContractName => 'SomeContract0', # string
},
{ # MyTypes::Contract
ContractID => 100001, # long
ContractName => 'SomeContract1', # string
},
{ # MyTypes::Contract
ContractID => 100002, # long
ContractName => 'SomeContract2', # string
},
{ # MyTypes::Contract
ContractID => 100003, # long
ContractName => 'SomeContract3', # string
},
],
},
);
return MyElements::ListPersonResponse->new( {
out => { # MyTypes::ArrayOfPerson
NewElement => [
{ %person },
{ %person },
{ %person },
{ %person },
{ %person },
{ %person },
{ %person },
{ %person },
{ %person },
{ %person },
],
},
}
);
}
+5 -2
View File
@@ -1,11 +1,12 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
use strict; use strict;
use warnings; use warnings;
use lib 'lib'; use lib 'lib'; # just needed because interface lies here
# I have to generate the interface using wsdl2perl.pl before # I have to generate the interface using wsdl2perl.pl before
use MyInterfaces::HelloWorld::HelloWorldSoap; use MyInterfaces::HelloWorld::HelloWorldSoap;
# I instantiate a interface class.
my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new(); my $soap = MyInterfaces::HelloWorld::HelloWorldSoap->new();
# I have to lookup the method and synopsis from the interface's pod # I have to lookup the method and synopsis from the interface's pod
@@ -14,8 +15,10 @@ my $result = $soap->sayHello({
givenName => $ARGV[0] || '"Your given name"', givenName => $ARGV[0] || '"Your given name"',
}); });
# SOAP::WSDL::SOAP::Typelib::Fault11 objects are false, but serialize to XML
die $result if not $result; die $result if not $result;
# I have to lookup the output parameter from the interface's POD - or try: # 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 # Will die on bad method names with a list of available methods
print $result->get_sayHelloResult(), "\n"; print $result->get_sayHelloResult(), "\n";
+7 -3
View File
@@ -4,18 +4,22 @@ use warnings;
use XML::Compile::WSDL11; use XML::Compile::WSDL11;
use XML::Compile::Transport::SOAPHTTP; use XML::Compile::Transport::SOAPHTTP;
# I need access to the WSDL around - or use Data::Dumper::Streamer
# for serializing the generated closures into (big) perl files
my $wsdl = XML::Compile::WSDL11->new('wsdl/11_helloworld.wsdl'); my $wsdl = XML::Compile::WSDL11->new('wsdl/11_helloworld.wsdl');
# I have to lookup the methods from the WSDL # I compile a interface method for a single SOAP method from the WSDL
# I have to lookup the method names from the WSDL
my $call = $wsdl->compileClient('sayHello'); my $call = $wsdl->compileClient('sayHello');
# I have to lookup the parameters from the WSDL # I have to lookup the parameters from the WSDL - can be quite tricky
my $result = $call->( my $result = $call->(
name => $ARGV[1] || '"Your name"', name => $ARGV[1] || '"Your name"',
givenName => $ARGV[0] || '"Your given name"', givenName => $ARGV[0] || '"Your given name"',
); );
# XML::Compile::SOAP's client just returns undef in case of failure
die "Error calling soap method" if not defined $result; die "Error calling soap method" if not defined $result;
# I have to lookup the output parameters from the WSDL - or try Dumper # I have to lookup the output parameters from the WSDL - or try Data::Dumper
print $result->{ parameters }->{ sayHelloResult }, "\n"; print $result->{ parameters }->{ sayHelloResult }, "\n";
+6 -4
View File
@@ -1,7 +1,7 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
use strict; #use strict;
use warnings; use warnings;
use SOAP::Lite; use SOAP::Lite +trace;
# I have to lookup the URL from the WSDL # I have to lookup the URL from the WSDL
my $soap = SOAP::Lite->new( my $soap = SOAP::Lite->new(
@@ -13,11 +13,12 @@ $soap->on_action( sub { "urn:HelloWorld#sayHello" });
$soap->autotype(0); $soap->autotype(0);
# I have to lookup the top level element's namespace from the WSDL # I have to lookup the top level element's namespace from the WSDL
$soap->default_ns('urn:HelloWorld');
# I have to encode all parameters as SOAP::Data objects # I have to encode all parameters as SOAP::Data objects
# I have to know the order of parameters # I have to know the order of parameters
my $som = $soap->call( my $som = $soap->call(
SOAP::Data->name("sayHello") "sayHello",
->attr({ xmlns => 'urn:HelloWorld' }),
SOAP::Data->name('name')->value( $ARGV[1] || '"Your name"'), SOAP::Data->name('name')->value( $ARGV[1] || '"Your name"'),
SOAP::Data->name('givenName')->value( $ARGV[0] || '"Your given name"'), SOAP::Data->name('givenName')->value( $ARGV[0] || '"Your given name"'),
); );
@@ -25,3 +26,4 @@ my $som = $soap->call(
die $som->fault->{ faultstring } if ($som->fault); die $som->fault->{ faultstring } if ($som->fault);
print $som->result, "\n"; print $som->result, "\n";
+3 -3
View File
@@ -13,8 +13,8 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
@@ -44,7 +44,7 @@ CountCookies from the namespace http://www.fullerdata.com/FortuneCookie/FortuneC
Constructor. The following data structure may be passed to new(): Constructor. The following data structure may be passed to new():
,
=head1 AUTHOR =head1 AUTHOR
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
use Class::Std::Storable; use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables { # BLOCK to scope variables
my %CountCookiesResult_of :ATTR(:get<CountCookiesResult>); my %CountCookiesResult_of :ATTR(:get<CountCookiesResult>);
@@ -28,7 +30,7 @@ __PACKAGE__->_factory(
CountCookiesResult CountCookiesResult
) ], ) ],
{ {
CountCookiesResult => \%CountCookiesResult_of, CountCookiesResult => \%CountCookiesResult_of,
}, },
{ {
CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int', CountCookiesResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{ {
CountCookiesResult => $some_value, # int CountCookiesResult => $some_value, # int
} },
=head1 AUTHOR =head1 AUTHOR
+7 -5
View File
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
use Class::Std::Storable; use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables { # BLOCK to scope variables
my %BarCodeParam_of :ATTR(:get<BarCodeParam>); my %BarCodeParam_of :ATTR(:get<BarCodeParam>);
@@ -30,8 +32,8 @@ __PACKAGE__->_factory(
BarCodeText BarCodeText
) ], ) ],
{ {
BarCodeParam => \%BarCodeParam_of, BarCodeParam => \%BarCodeParam_of,
BarCodeText => \%BarCodeText_of, BarCodeText => \%BarCodeText_of,
}, },
{ {
BarCodeParam => 'MyTypes::BarCodeData', BarCodeParam => 'MyTypes::BarCodeData',
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
use Class::Std::Storable; use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables { # BLOCK to scope variables
my %GenerateBarCodeResult_of :ATTR(:get<GenerateBarCodeResult>); my %GenerateBarCodeResult_of :ATTR(:get<GenerateBarCodeResult>);
@@ -28,7 +30,7 @@ __PACKAGE__->_factory(
GenerateBarCodeResult GenerateBarCodeResult
) ], ) ],
{ {
GenerateBarCodeResult => \%GenerateBarCodeResult_of, GenerateBarCodeResult => \%GenerateBarCodeResult_of,
}, },
{ {
GenerateBarCodeResult => 'SOAP::WSDL::XSD::Typelib::Builtin::base64Binary', GenerateBarCodeResult => 'SOAP::WSDL::XSD::Typelib::Builtin::base64Binary',
+7 -5
View File
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
use Class::Std::Storable; use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables { # BLOCK to scope variables
my %CountryName_of :ATTR(:get<CountryName>); my %CountryName_of :ATTR(:get<CountryName>);
@@ -28,7 +30,7 @@ __PACKAGE__->_factory(
CountryName CountryName
) ], ) ],
{ {
CountryName => \%CountryName_of, CountryName => \%CountryName_of,
}, },
{ {
CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string', CountryName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{ {
CountryName => $some_value, # string CountryName => $some_value, # string
} },
=head1 AUTHOR =head1 AUTHOR
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
use Class::Std::Storable; use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables { # BLOCK to scope variables
my %GetCitiesByCountryResult_of :ATTR(:get<GetCitiesByCountryResult>); my %GetCitiesByCountryResult_of :ATTR(:get<GetCitiesByCountryResult>);
@@ -28,7 +30,7 @@ __PACKAGE__->_factory(
GetCitiesByCountryResult GetCitiesByCountryResult
) ], ) ],
{ {
GetCitiesByCountryResult => \%GetCitiesByCountryResult_of, GetCitiesByCountryResult => \%GetCitiesByCountryResult_of,
}, },
{ {
GetCitiesByCountryResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', GetCitiesByCountryResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{ {
GetCitiesByCountryResult => $some_value, # string GetCitiesByCountryResult => $some_value, # string
} },
=head1 AUTHOR =head1 AUTHOR
+3 -3
View File
@@ -13,8 +13,8 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
@@ -44,7 +44,7 @@ GetFortuneCookie from the namespace http://www.fullerdata.com/FortuneCookie/Fort
Constructor. The following data structure may be passed to new(): Constructor. The following data structure may be passed to new():
,
=head1 AUTHOR =head1 AUTHOR
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
use Class::Std::Storable; use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables { # BLOCK to scope variables
my %GetFortuneCookieResult_of :ATTR(:get<GetFortuneCookieResult>); my %GetFortuneCookieResult_of :ATTR(:get<GetFortuneCookieResult>);
@@ -28,7 +30,7 @@ __PACKAGE__->_factory(
GetFortuneCookieResult GetFortuneCookieResult
) ], ) ],
{ {
GetFortuneCookieResult => \%GetFortuneCookieResult_of, GetFortuneCookieResult => \%GetFortuneCookieResult_of,
}, },
{ {
GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', GetFortuneCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{ {
GetFortuneCookieResult => $some_value, # string GetFortuneCookieResult => $some_value, # string
} },
=head1 AUTHOR =head1 AUTHOR
+7 -5
View File
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
use Class::Std::Storable; use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables { # BLOCK to scope variables
my %index_of :ATTR(:get<index>); my %index_of :ATTR(:get<index>);
@@ -28,7 +30,7 @@ __PACKAGE__->_factory(
index index
) ], ) ],
{ {
index => \%index_of, index => \%index_of,
}, },
{ {
index => 'SOAP::WSDL::XSD::Typelib::Builtin::int', index => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{ {
index => $some_value, # int index => $some_value, # int
} },
=head1 AUTHOR =head1 AUTHOR
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
use Class::Std::Storable; use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables { # BLOCK to scope variables
my %GetSpecificCookieResult_of :ATTR(:get<GetSpecificCookieResult>); my %GetSpecificCookieResult_of :ATTR(:get<GetSpecificCookieResult>);
@@ -28,7 +30,7 @@ __PACKAGE__->_factory(
GetSpecificCookieResult GetSpecificCookieResult
) ], ) ],
{ {
GetSpecificCookieResult => \%GetSpecificCookieResult_of, GetSpecificCookieResult => \%GetSpecificCookieResult_of,
}, },
{ {
GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', GetSpecificCookieResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{ {
GetSpecificCookieResult => $some_value, # string GetSpecificCookieResult => $some_value, # string
} },
=head1 AUTHOR =head1 AUTHOR
+8 -6
View File
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
use Class::Std::Storable; use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables { # BLOCK to scope variables
my %CityName_of :ATTR(:get<CityName>); my %CityName_of :ATTR(:get<CityName>);
@@ -30,8 +32,8 @@ __PACKAGE__->_factory(
CountryName CountryName
) ], ) ],
{ {
CityName => \%CityName_of, CityName => \%CityName_of,
CountryName => \%CountryName_of, CountryName => \%CountryName_of,
}, },
{ {
CityName => 'SOAP::WSDL::XSD::Typelib::Builtin::string', CityName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -74,7 +76,7 @@ Constructor. The following data structure may be passed to new():
{ {
CityName => $some_value, # string CityName => $some_value, # string
CountryName => $some_value, # string CountryName => $some_value, # string
} },
=head1 AUTHOR =head1 AUTHOR
+7 -5
View File
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
use Class::Std::Storable; use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables { # BLOCK to scope variables
my %GetWeatherResult_of :ATTR(:get<GetWeatherResult>); my %GetWeatherResult_of :ATTR(:get<GetWeatherResult>);
@@ -28,7 +30,7 @@ __PACKAGE__->_factory(
GetWeatherResult GetWeatherResult
) ], ) ],
{ {
GetWeatherResult => \%GetWeatherResult_of, GetWeatherResult => \%GetWeatherResult_of,
}, },
{ {
GetWeatherResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string', GetWeatherResult => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{ {
GetWeatherResult => $some_value, # string GetWeatherResult => $some_value, # string
} },
=head1 AUTHOR =head1 AUTHOR
+111
View File
@@ -0,0 +1,111 @@
package MyElements::ListPerson;
use strict;
use warnings;
{ # BLOCK to scope variables
sub get_xmlns { 'http://www.example.org/benchmark/' }
__PACKAGE__->__set_name('ListPerson');
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %in_of :ATTR(:get<in>);
__PACKAGE__->_factory(
[ qw(
in
) ],
{
in => \%in_of,
},
{
in => 'MyTypes::Person',
}
);
} # end BLOCK
} # end of BLOCK
1;
# __END__
=pod
=head1 NAME
MyElements::ListPerson
=head1 DESCRIPTION
Perl data type class for the XML Schema defined element
ListPerson from the namespace http://www.example.org/benchmark/.
=head1 METHODS
=head2 new
my $element = MyElements::ListPerson->new($data);
Constructor. The following data structure may be passed to new():
{
in => { # MyTypes::Person
PersonID => { # MyTypes::PersonID
ID => $some_value, # int
},
Salutation => $some_value, # string
Name => $some_value, # string
GivenName => $some_value, # string
DateOfBirth => $some_value, # date
HomeAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
WorkAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
Contracts => { # MyTypes::ArrayOfContract
Contract => { # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
},
},
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
@@ -0,0 +1,113 @@
package MyElements::ListPersonResponse;
use strict;
use warnings;
{ # BLOCK to scope variables
sub get_xmlns { 'http://www.example.org/benchmark/' }
__PACKAGE__->__set_name('ListPersonResponse');
__PACKAGE__->__set_nillable();
__PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref();
use base qw(
SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType
);
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %out_of :ATTR(:get<out>);
__PACKAGE__->_factory(
[ qw(
out
) ],
{
out => \%out_of,
},
{
out => 'MyTypes::ArrayOfPerson',
}
);
} # end BLOCK
} # end of BLOCK
1;
# __END__
=pod
=head1 NAME
MyElements::ListPersonResponse
=head1 DESCRIPTION
Perl data type class for the XML Schema defined element
ListPersonResponse from the namespace http://www.example.org/benchmark/.
=head1 METHODS
=head2 new
my $element = MyElements::ListPersonResponse->new($data);
Constructor. The following data structure may be passed to new():
{
out => { # MyTypes::ArrayOfPerson
NewElement => { # MyTypes::Person
PersonID => { # MyTypes::PersonID
ID => $some_value, # int
},
Salutation => $some_value, # string
Name => $some_value, # string
GivenName => $some_value, # string
DateOfBirth => $some_value, # date
HomeAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
WorkAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
Contracts => { # MyTypes::ArrayOfContract
Contract => { # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
},
},
},
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+2 -2
View File
@@ -12,8 +12,8 @@ __PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs(); __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::Builtin::int SOAP::WSDL::XSD::Typelib::Builtin::int
); );
+3 -3
View File
@@ -13,8 +13,8 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
@@ -44,7 +44,7 @@ readNodeCount from the namespace http://www.fullerdata.com/FortuneCookie/Fortune
Constructor. The following data structure may be passed to new(): Constructor. The following data structure may be passed to new():
,
=head1 AUTHOR =head1 AUTHOR
@@ -13,12 +13,14 @@ __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::ComplexType SOAP::WSDL::XSD::Typelib::ComplexType
); );
use Class::Std::Storable; use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType); use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables { # BLOCK to scope variables
my %readNodeCountResult_of :ATTR(:get<readNodeCountResult>); my %readNodeCountResult_of :ATTR(:get<readNodeCountResult>);
@@ -28,7 +30,7 @@ __PACKAGE__->_factory(
readNodeCountResult readNodeCountResult
) ], ) ],
{ {
readNodeCountResult => \%readNodeCountResult_of, readNodeCountResult => \%readNodeCountResult_of,
}, },
{ {
readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int', readNodeCountResult => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
@@ -69,7 +71,7 @@ Constructor. The following data structure may be passed to new():
{ {
readNodeCountResult => $some_value, # int readNodeCountResult => $some_value, # int
} },
=head1 AUTHOR =head1 AUTHOR
+2 -2
View File
@@ -12,8 +12,8 @@ __PACKAGE__->__set_minOccurs();
__PACKAGE__->__set_maxOccurs(); __PACKAGE__->__set_maxOccurs();
__PACKAGE__->__set_ref(); __PACKAGE__->__set_ref();
use base qw( use base qw(
SOAP::WSDL::XSD::Typelib::Element SOAP::WSDL::XSD::Typelib::Element
SOAP::WSDL::XSD::Typelib::Builtin::string SOAP::WSDL::XSD::Typelib::Builtin::string
); );
@@ -1,12 +1,13 @@
package MyInterfaces::BarCode::BarCodeSoap; package MyInterfaces::BarCode::BarCodeSoap;
use strict; use strict;
use warnings; use warnings;
use Class::Std::Storable; use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base); use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before # only load if it hasn't been loaded before
require MyTypemaps::BarCode require MyTypemaps::BarCode
if not MyTypemaps::BarCode->can('get_class'); if not MyTypemaps::BarCode->can('get_class');
sub START { sub START {
$_[0]->set_proxy('http://www.webservicex.net/genericbarcode.asmx') if not $_[2]->{proxy}; $_[0]->set_proxy('http://www.webservicex.net/genericbarcode.asmx') if not $_[2]->{proxy};
@@ -16,8 +17,9 @@ sub START {
sub GenerateBarCode { sub GenerateBarCode {
my ($self, $body, $header) = @_; my ($self, $body, $header) = @_;
die "GenerateBarCode must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({ return $self->SUPER::call({
operation => 'GenerateBarCode', operation => 'GenerateBarCode',
soap_action => 'http://www.webservicex.net/GenerateBarCode', soap_action => 'http://www.webservicex.net/GenerateBarCode',
style => 'document', style => 'document',
body => { body => {
@@ -128,6 +130,6 @@ WebserviceX.NET barcode library that provides the means to create barcodes for p
=head1 AUTHOR =head1 AUTHOR
Generated by SOAP::WSDL on Fri Nov 9 00:18:35 2007 Generated by SOAP::WSDL on Sun Dec 16 20:10:20 2007
=pod =pod
@@ -1,12 +1,13 @@
package MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap; package MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap;
use strict; use strict;
use warnings; use warnings;
use Class::Std::Storable; use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base); use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before # only load if it hasn't been loaded before
require MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie require MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie
if not MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie->can('get_class'); if not MyTypemaps::FullerData_x0020_Fortune_x0020_Cookie->can('get_class');
sub START { sub START {
$_[0]->set_proxy('http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx') if not $_[2]->{proxy}; $_[0]->set_proxy('http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx') if not $_[2]->{proxy};
@@ -16,8 +17,9 @@ sub START {
sub readNodeCount { sub readNodeCount {
my ($self, $body, $header) = @_; my ($self, $body, $header) = @_;
die "readNodeCount must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({ return $self->SUPER::call({
operation => 'readNodeCount', operation => 'readNodeCount',
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/readNodeCount', soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/readNodeCount',
style => 'document', style => 'document',
body => { body => {
@@ -38,8 +40,9 @@ sub readNodeCount {
sub GetFortuneCookie { sub GetFortuneCookie {
my ($self, $body, $header) = @_; my ($self, $body, $header) = @_;
die "GetFortuneCookie must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({ return $self->SUPER::call({
operation => 'GetFortuneCookie', operation => 'GetFortuneCookie',
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetFortuneCookie', soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetFortuneCookie',
style => 'document', style => 'document',
body => { body => {
@@ -60,8 +63,9 @@ sub GetFortuneCookie {
sub CountCookies { sub CountCookies {
my ($self, $body, $header) = @_; my ($self, $body, $header) = @_;
die "CountCookies must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({ return $self->SUPER::call({
operation => 'CountCookies', operation => 'CountCookies',
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/CountCookies', soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/CountCookies',
style => 'document', style => 'document',
body => { body => {
@@ -82,8 +86,9 @@ sub CountCookies {
sub GetSpecificCookie { sub GetSpecificCookie {
my ($self, $body, $header) = @_; my ($self, $body, $header) = @_;
die "GetSpecificCookie must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({ return $self->SUPER::call({
operation => 'GetSpecificCookie', operation => 'GetSpecificCookie',
soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetSpecificCookie', soap_action => 'http://www.fullerdata.com/FortuneCookie/FortuneCookie.asmx/GetSpecificCookie',
style => 'document', style => 'document',
body => { body => {
@@ -117,6 +122,19 @@ __END__
MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap - SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie Web Service MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap - SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie Web Service
=head1 SYNOPSIS
use MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap;
my $interface = MyInterfaces::FullerData_x0020_Fortune_x0020_Cookie::FullerData_x0020_Fortune_x0020_CookieSoap->new();
my $response;
$response = $interface->readNodeCount();
$response = $interface->GetFortuneCookie();
$response = $interface->CountCookies();
$response = $interface->GetSpecificCookie();
=head1 DESCRIPTION =head1 DESCRIPTION
SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie web service SOAP Interface for the FullerData_x0020_Fortune_x0020_Cookie web service
@@ -156,21 +174,21 @@ methods, as long as you meet the structure.
Display the number of nodes specified in fortune XML document Display the number of nodes specified in fortune XML document
$interface->readNodeCount(, $interface->readNodeCount(,,
); );
=head3 GetFortuneCookie =head3 GetFortuneCookie
Get a random fortune cookie from the XML document Get a random fortune cookie from the XML document
$interface->GetFortuneCookie(, $interface->GetFortuneCookie(,,
); );
=head3 CountCookies =head3 CountCookies
Count the actual number of nodes in the XML document of fortunes Count the actual number of nodes in the XML document of fortunes
$interface->CountCookies(, $interface->CountCookies(,,
); );
=head3 GetSpecificCookie =head3 GetSpecificCookie
@@ -179,13 +197,13 @@ Get a specific cookie by the XML node number
$interface->GetSpecificCookie( { $interface->GetSpecificCookie( {
index => $some_value, # int index => $some_value, # int
}, },,
); );
=head1 AUTHOR =head1 AUTHOR
Generated by SOAP::WSDL on Tue Nov 6 20:56:46 2007 Generated by SOAP::WSDL on Sun Dec 16 19:58:30 2007
=pod =pod
@@ -1,12 +1,13 @@
package MyInterfaces::GlobalWeather::GlobalWeatherSoap; package MyInterfaces::GlobalWeather::GlobalWeatherSoap;
use strict; use strict;
use warnings; use warnings;
use Class::Std::Storable; use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base); use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before # only load if it hasn't been loaded before
require MyTypemaps::GlobalWeather require MyTypemaps::GlobalWeather
if not MyTypemaps::GlobalWeather->can('get_class'); if not MyTypemaps::GlobalWeather->can('get_class');
sub START { sub START {
$_[0]->set_proxy('http://www.webservicex.net/globalweather.asmx') if not $_[2]->{proxy}; $_[0]->set_proxy('http://www.webservicex.net/globalweather.asmx') if not $_[2]->{proxy};
@@ -16,8 +17,9 @@ sub START {
sub GetWeather { sub GetWeather {
my ($self, $body, $header) = @_; my ($self, $body, $header) = @_;
die "GetWeather must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({ return $self->SUPER::call({
operation => 'GetWeather', operation => 'GetWeather',
soap_action => 'http://www.webserviceX.NET/GetWeather', soap_action => 'http://www.webserviceX.NET/GetWeather',
style => 'document', style => 'document',
body => { body => {
@@ -38,8 +40,9 @@ sub GetWeather {
sub GetCitiesByCountry { sub GetCitiesByCountry {
my ($self, $body, $header) = @_; my ($self, $body, $header) = @_;
die "GetCitiesByCountry must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({ return $self->SUPER::call({
operation => 'GetCitiesByCountry', operation => 'GetCitiesByCountry',
soap_action => 'http://www.webserviceX.NET/GetCitiesByCountry', soap_action => 'http://www.webserviceX.NET/GetCitiesByCountry',
style => 'document', style => 'document',
body => { body => {
@@ -73,6 +76,17 @@ __END__
MyInterfaces::GlobalWeather::GlobalWeatherSoap - SOAP Interface for the GlobalWeather Web Service MyInterfaces::GlobalWeather::GlobalWeatherSoap - SOAP Interface for the GlobalWeather Web Service
=head1 SYNOPSIS
use MyInterfaces::GlobalWeather::GlobalWeatherSoap;
my $interface = MyInterfaces::GlobalWeather::GlobalWeatherSoap->new();
my $response;
$response = $interface->GetWeather();
$response = $interface->GetCitiesByCountry();
=head1 DESCRIPTION =head1 DESCRIPTION
SOAP Interface for the GlobalWeather web service SOAP Interface for the GlobalWeather web service
@@ -115,7 +129,7 @@ Get weather report for all major cities around the world.
$interface->GetWeather( { $interface->GetWeather( {
CityName => $some_value, # string CityName => $some_value, # string
CountryName => $some_value, # string CountryName => $some_value, # string
}, },,
); );
=head3 GetCitiesByCountry =head3 GetCitiesByCountry
@@ -124,13 +138,13 @@ Get all major cities by country name(full / part).
$interface->GetCitiesByCountry( { $interface->GetCitiesByCountry( {
CountryName => $some_value, # string CountryName => $some_value, # string
}, },,
); );
=head1 AUTHOR =head1 AUTHOR
Generated by SOAP::WSDL on Tue Nov 6 21:00:30 2007 Generated by SOAP::WSDL on Sun Dec 16 20:05:01 2007
=pod =pod
@@ -38,12 +38,8 @@ sub sayHello {
}, $body, $header); }, $body, $header);
} }
1; 1;
__END__ __END__
=pod =pod
@@ -0,0 +1,146 @@
package MyInterfaces::TestService::TestPort;
use strict;
use warnings;
use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before
require MyTypemaps::TestService
if not MyTypemaps::TestService->can('get_class');
sub START {
$_[0]->set_proxy('http://localhost:81/soap-wsdl-test/person.pl') if not $_[2]->{proxy};
$_[0]->set_class_resolver('MyTypemaps::TestService')
if not $_[2]->{class_resolver};
}
sub ListPerson {
my ($self, $body, $header) = @_;
die "ListPerson must be called as object method (\$self is <$self>)" if not blessed($self);
return $self->SUPER::call({
operation => 'ListPerson',
soap_action => 'http://www.example.org/benchmark/ListPerson',
style => 'document',
body => {
'use' => 'literal',
namespace => '',
encodingStyle => '',
parts => [qw( MyElements::ListPerson )],
},
header => {
},
headerfault => {
}
}, $body, $header);
}
1;
__END__
=pod
=head1 NAME
MyInterfaces::TestService::TestPort - SOAP Interface for the TestService Web Service
=head1 SYNOPSIS
use MyInterfaces::TestService::TestPort;
my $interface = MyInterfaces::TestService::TestPort->new();
my $response;
$response = $interface->ListPerson();
=head1 DESCRIPTION
SOAP Interface for the TestService web service
located at http://localhost:81/soap-wsdl-test/person.pl.
=head1 SERVICE TestService
=head2 Port TestPort
=head1 METHODS
=head2 General methods
=head3 new
Constructor.
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
=head2 SOAP Service methods
Method synopsis is displayed with hash refs as parameters.
The commented class names in the method's parameters denote that objects
of the corresponding class can be passed instead of the marked hash ref.
You may pass any combination of objects, hash and list refs to these
methods, as long as you meet the structure.
=head3 ListPerson
$interface->ListPerson( {
in => { # MyTypes::Person
PersonID => { # MyTypes::PersonID
ID => $some_value, # int
},
Salutation => $some_value, # string
Name => $some_value, # string
GivenName => $some_value, # string
DateOfBirth => $some_value, # date
HomeAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
WorkAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
Contracts => { # MyTypes::ArrayOfContract
Contract => { # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
},
},
},,
);
=head1 AUTHOR
Generated by SOAP::WSDL on Mon Dec 3 22:20:49 2007
=pod
@@ -15,7 +15,6 @@ my %dispatch_to :ATTR(:name<dispatch_to>);
my $action_map_ref = { my $action_map_ref = {
'urn:HelloWorld#sayHello' => 'sayHello', 'urn:HelloWorld#sayHello' => 'sayHello',
}; };
sub START { sub START {
@@ -30,7 +29,7 @@ sub START {
} }
sub handle { sub handle {
$transport_of{ ${ $_[0] } }->handle(); $transport_of{ ${ $_[0] } }->handle(@_[1..$#_]);
} }
1; 1;
@@ -0,0 +1,145 @@
package MyServer::TestService::TestPort;
use strict;
use warnings;
use Class::Std::Fast::Storable;
use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before
require MyTypemaps::TestService
if not MyTypemaps::TestService->can('get_class');
my %transport_class_of :ATTR(:name<transport_class> :default<SOAP::WSDL::Server::CGI>);
my %transport_of :ATTR(:name<transport> :default<()>);
my %dispatch_to :ATTR(:name<dispatch_to>);
my $action_map_ref = {
'http://www.example.org/benchmark/ListPerson' => 'ListPerson',
};
sub START {
my ($self, $ident, $arg_ref) = @_;
eval "require $transport_class_of{ $ident }"
or die "Cannot load transport class $transport_class_of{ $ident }: $@";
$transport_of{ $ident } = $transport_class_of{ $ident }->new({
action_map_ref => $action_map_ref,
class_resolver => 'MyTypemaps::TestService',
dispatch_to => $dispatch_to{ $ident },
});
}
sub handle {
$transport_of{ ${ $_[0] } }->handle();
}
1;
__END__
=pod
=head1 NAME
MyInterfaces::TestService::TestPort - SOAP Server Class for the TestService Web Service
=head1 SYNOPSIS
use MyServer::TestService::TestPort;
my $server = MyServer::TestService::TestPort->new({
dispatch_to => 'My::Handler::Class',
transport_class => 'SOAP::WSDL::Server::CGI', # optional, default
});
$server->handle();
=head1 DESCRIPTION
SOAP Server handler for the TestService web service
located at http://localhost:81/soap-wsdl-test/person.pl.
=head1 SERVICE TestService
=head2 Port TestPort
=head1 METHODS
=head2 General methods
=head3 new
Constructor.
The C<dispatch_to> argument is mandatory. It must be a class or object
implementing the SOAP Service methods listed below.
=head2 SOAP Service methods
Your dispatch_to class has to implement the following methods:
The examples below serve as copy-and-paste prototypes to use in your
class.
=head3 ListPerson
sub ListPerson {
my ($self, $body, $header) = @_;
# body is a ??? object - sorry, POD not implemented yet
# header is a ??? object - sorry, POD not implemented yet
# do something with body and header...
return MyElements::ListPersonResponse->new( {
out => { # MyTypes::ArrayOfPerson
NewElement => { # MyTypes::Person
PersonID => { # MyTypes::PersonID
ID => $some_value, # int
},
Salutation => $some_value, # string
Name => $some_value, # string
GivenName => $some_value, # string
DateOfBirth => $some_value, # date
HomeAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
WorkAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
Contracts => { # MyTypes::ArrayOfContract
Contract => { # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
},
},
},
},
);
}
=head1 AUTHOR
Generated by SOAP::WSDL on Mon Dec 3 22:20:32 2007
=pod
+7 -3
View File
@@ -10,13 +10,13 @@ our $typemap_1 = {
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI', 'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
'GenerateBarCode' => 'MyElements::GenerateBarCode', 'GenerateBarCode' => 'MyElements::GenerateBarCode',
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', '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', 'GenerateBarCode/BarCodeParam/Angle' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'GenerateBarCode/BarCodeParam/Width' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11', 'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
'GenerateBarCode/BarCodeParam/BarCodeImageFormat' => 'MyTypes::ImageFormats', 'GenerateBarCode/BarCodeParam/BarCodeImageFormat' => 'MyTypes::ImageFormats',
'GenerateBarCode/BarCodeParam/BGColor' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'GenerateBarCode/BarCodeParam/BGColor' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'GenerateBarCode/BarCodeParam/Ratio' => 'SOAP::WSDL::XSD::Typelib::Builtin::int', 'GenerateBarCode/BarCodeParam/Ratio' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN', 'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
'GenerateBarCode/BarCodeParam/Height' => 'SOAP::WSDL::XSD::Typelib::Builtin::int', 'GenerateBarCode/BarCodeParam/Height' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'GenerateBarCode/BarCodeParam/CheckSum' => 'SOAP::WSDL::XSD::Typelib::Builtin::boolean', 'GenerateBarCode/BarCodeParam/CheckSum' => 'SOAP::WSDL::XSD::Typelib::Builtin::boolean',
'GenerateBarCode/BarCodeParam/checkSumMethod' => 'MyTypes::CheckSumMethod', 'GenerateBarCode/BarCodeParam/checkSumMethod' => 'MyTypes::CheckSumMethod',
@@ -27,8 +27,8 @@ our $typemap_1 = {
'GenerateBarCodeResponse/GenerateBarCodeResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::base64Binary', 'GenerateBarCodeResponse/GenerateBarCodeResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::base64Binary',
'GenerateBarCodeResponse' => 'MyElements::GenerateBarCodeResponse', 'GenerateBarCodeResponse' => 'MyElements::GenerateBarCodeResponse',
'GenerateBarCode/BarCodeParam/Module' => 'SOAP::WSDL::XSD::Typelib::Builtin::int', 'GenerateBarCode/BarCodeParam/Module' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'GenerateBarCode/BarCodeParam' => 'MyTypes::BarCodeData',
'GenerateBarCode/BarCodeParam/showTextPosition' => 'MyTypes::ShowTextPosition', 'GenerateBarCode/BarCodeParam/showTextPosition' => 'MyTypes::ShowTextPosition',
'GenerateBarCode/BarCodeParam' => 'MyTypes::BarCodeData',
'GenerateBarCode/BarCodeParam/FontName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string' 'GenerateBarCode/BarCodeParam/FontName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string'
}; };
; ;
@@ -39,6 +39,10 @@ sub get_class {
return $typemap_1->{ $name }; return $typemap_1->{ $name };
} }
sub get_typemap {
return $typemap_1;
}
1; 1;
__END__ __END__
@@ -13,7 +13,7 @@ our $typemap_1 = {
'GetFortuneCookieResponse' => 'MyElements::GetFortuneCookieResponse', 'GetFortuneCookieResponse' => 'MyElements::GetFortuneCookieResponse',
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11', 'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
'GetSpecificCookie' => 'MyElements::GetSpecificCookie', 'GetSpecificCookie' => 'MyElements::GetSpecificCookie',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN', 'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
'CountCookies' => 'MyElements::CountCookies', 'CountCookies' => 'MyElements::CountCookies',
'GetSpecificCookie/index' => 'SOAP::WSDL::XSD::Typelib::Builtin::int', 'GetSpecificCookie/index' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
@@ -30,6 +30,10 @@ sub get_class {
return $typemap_1->{ $name }; return $typemap_1->{ $name };
} }
sub get_typemap {
return $typemap_1;
}
1; 1;
__END__ __END__
+5 -1
View File
@@ -6,7 +6,7 @@ our $typemap_1 = {
'GetWeatherResponse/GetWeatherResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'GetWeatherResponse/GetWeatherResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'GetWeather' => 'MyElements::GetWeather', 'GetWeather' => 'MyElements::GetWeather',
'GetCitiesByCountryResponse/GetCitiesByCountryResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'GetCitiesByCountryResponse/GetCitiesByCountryResult' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::TOKEN', 'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
'GetWeatherResponse' => 'MyElements::GetWeatherResponse', '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', 'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
@@ -26,6 +26,10 @@ sub get_class {
return $typemap_1->{ $name }; return $typemap_1->{ $name };
} }
sub get_typemap {
return $typemap_1;
}
1; 1;
__END__ __END__
+92
View File
@@ -0,0 +1,92 @@
package MyTypemaps::TestService;
use strict;
use warnings;
our $typemap_1 = {
'ListPersonResponse/out/NewElement/WorkAddress/Street' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/Contracts' => 'MyTypes::ArrayOfContract',
'ListPerson/in/HomeAddress/PhoneNumber' => 'MyTypes::PhoneNumber',
'ListPersonResponse/out/NewElement/HomeAddress' => 'MyTypes::Address',
'ListPersonResponse/out/NewElement/Contracts/Contract' => 'MyTypes::Contract',
'ListPersonResponse/out/NewElement/HomeAddress/ZIP' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/WorkAddress/City' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/HomeAddress' => 'MyTypes::Address',
'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
'ListPerson/in/HomeAddress/City' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/WorkAddress/PhoneNumber' => 'MyTypes::PhoneNumber',
'ListPerson/in/WorkAddress/ZIP' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/Contracts' => 'MyTypes::ArrayOfContract',
'ListPerson/in/WorkAddress/Street' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in' => 'MyTypes::Person',
'ListPersonResponse/out/NewElement/GivenName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/HomeAddress/PhoneNumber' => 'MyTypes::PhoneNumber',
'ListPersonResponse/out/NewElement/HomeAddress/City' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement' => 'MyTypes::Person',
'ListPerson/in/PersonID/ID' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'ListPerson/in/HomeAddress/Street' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/PersonID/ID' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
'ListPerson/in/HomeAddress/Country' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/GivenName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/HomeAddress/MobilePhoneNumber' => 'MyTypes::PhoneNumber',
'ListPerson/in/Name' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/PersonID' => 'MyTypes::PersonID',
'ListPersonResponse/out/NewElement/WorkAddress/MobilePhoneNumber' => 'MyTypes::PhoneNumber',
'ListPersonResponse/out' => 'MyTypes::ArrayOfPerson',
'ListPerson/in/Contracts/Contract' => 'MyTypes::Contract',
'ListPersonResponse/out/NewElement/Name' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/WorkAddress/ZIP' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/DateOfBirth' => 'SOAP::WSDL::XSD::Typelib::Builtin::date',
'ListPersonResponse/out/NewElement/HomeAddress/MobilePhoneNumber' => 'MyTypes::PhoneNumber',
'ListPersonResponse/out/NewElement/HomeAddress/Country' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/HomeAddress/Street' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/Contracts/Contract/ContractName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
'ListPerson/in/Contracts/Contract/ContractName' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse' => 'MyElements::ListPersonResponse',
'ListPersonResponse/out/NewElement/Salutation' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/WorkAddress/City' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
'ListPerson' => 'MyElements::ListPerson',
'ListPerson/in/Salutation' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/WorkAddress/MobilePhoneNumber' => 'MyTypes::PhoneNumber',
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/WorkAddress/Country' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPerson/in/PersonID' => 'MyTypes::PersonID',
'ListPerson/in/HomeAddress/ZIP' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/WorkAddress' => 'MyTypes::Address',
'ListPersonResponse/out/NewElement/DateOfBirth' => 'SOAP::WSDL::XSD::Typelib::Builtin::date',
'ListPerson/in/WorkAddress/PhoneNumber' => 'MyTypes::PhoneNumber',
'ListPersonResponse/out/NewElement/WorkAddress/Country' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'ListPersonResponse/out/NewElement/Contracts/Contract/ContractID' => 'SOAP::WSDL::XSD::Typelib::Builtin::long',
'ListPerson/in/Contracts/Contract/ContractID' => 'SOAP::WSDL::XSD::Typelib::Builtin::long',
'ListPerson/in/WorkAddress' => 'MyTypes::Address'
};
;
sub get_class {
my $name = join '/', @{ $_[1] };
exists $typemap_1->{ $name } or die "Cannot resolve $name via " . __PACKAGE__;
return $typemap_1->{ $name };
}
sub get_typemap {
return $typemap_1;
}
1;
__END__
=pod
=head1 NAME
MyTypemaps::TestService; - typemap for ::TestService;
=head1 DESCRIPTION
Typemap created by SOAP::WSDL for map-based SOAP message parsers.
=cut
+98
View File
@@ -0,0 +1,98 @@
package MyTypes::Address;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %Street_of :ATTR(:get<Street>);
my %ZIP_of :ATTR(:get<ZIP>);
my %City_of :ATTR(:get<City>);
my %Country_of :ATTR(:get<Country>);
my %PhoneNumber_of :ATTR(:get<PhoneNumber>);
my %MobilePhoneNumber_of :ATTR(:get<MobilePhoneNumber>);
__PACKAGE__->_factory(
[ qw(
Street
ZIP
City
Country
PhoneNumber
MobilePhoneNumber
) ],
{
Street => \%Street_of,
ZIP => \%ZIP_of,
City => \%City_of,
Country => \%Country_of,
PhoneNumber => \%PhoneNumber_of,
MobilePhoneNumber => \%MobilePhoneNumber_of,
},
{
Street => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
ZIP => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
City => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
Country => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
PhoneNumber => 'MyTypes::PhoneNumber',
MobilePhoneNumber => 'MyTypes::PhoneNumber',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::Address
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
Address from the namespace http://www.example.org/benchmark/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
Street
ZIP
City
Country
PhoneNumber
MobilePhoneNumber
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+71
View File
@@ -0,0 +1,71 @@
package MyTypes::ArrayOfContract;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %Contract_of :ATTR(:get<Contract>);
__PACKAGE__->_factory(
[ qw(
Contract
) ],
{
Contract => \%Contract_of,
},
{
Contract => 'MyTypes::Contract',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::ArrayOfContract
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
ArrayOfContract from the namespace http://www.example.org/benchmark/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
Contract
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::ArrayOfContract
Contract => { # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+98
View File
@@ -0,0 +1,98 @@
package MyTypes::ArrayOfPerson;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %NewElement_of :ATTR(:get<NewElement>);
__PACKAGE__->_factory(
[ qw(
NewElement
) ],
{
NewElement => \%NewElement_of,
},
{
NewElement => 'MyTypes::Person',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::ArrayOfPerson
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
ArrayOfPerson from the namespace http://www.example.org/benchmark/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
NewElement
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::ArrayOfPerson
NewElement => { # MyTypes::Person
PersonID => { # MyTypes::PersonID
ID => $some_value, # int
},
Salutation => $some_value, # string
Name => $some_value, # string
GivenName => $some_value, # string
DateOfBirth => $some_value, # date
HomeAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
WorkAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
Contracts => { # MyTypes::ArrayOfContract
Contract => { # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
},
},
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+164
View File
@@ -0,0 +1,164 @@
package MyTypes::BarCodeData;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %Height_of :ATTR(:get<Height>);
my %Width_of :ATTR(:get<Width>);
my %Angle_of :ATTR(:get<Angle>);
my %Ratio_of :ATTR(:get<Ratio>);
my %Module_of :ATTR(:get<Module>);
my %Left_of :ATTR(:get<Left>);
my %Top_of :ATTR(:get<Top>);
my %CheckSum_of :ATTR(:get<CheckSum>);
my %FontName_of :ATTR(:get<FontName>);
my %BarColor_of :ATTR(:get<BarColor>);
my %BGColor_of :ATTR(:get<BGColor>);
my %FontSize_of :ATTR(:get<FontSize>);
my %barcodeOption_of :ATTR(:get<barcodeOption>);
my %barcodeType_of :ATTR(:get<barcodeType>);
my %checkSumMethod_of :ATTR(:get<checkSumMethod>);
my %showTextPosition_of :ATTR(:get<showTextPosition>);
my %BarCodeImageFormat_of :ATTR(:get<BarCodeImageFormat>);
__PACKAGE__->_factory(
[ qw(
Height
Width
Angle
Ratio
Module
Left
Top
CheckSum
FontName
BarColor
BGColor
FontSize
barcodeOption
barcodeType
checkSumMethod
showTextPosition
BarCodeImageFormat
) ],
{
Height => \%Height_of,
Width => \%Width_of,
Angle => \%Angle_of,
Ratio => \%Ratio_of,
Module => \%Module_of,
Left => \%Left_of,
Top => \%Top_of,
CheckSum => \%CheckSum_of,
FontName => \%FontName_of,
BarColor => \%BarColor_of,
BGColor => \%BGColor_of,
FontSize => \%FontSize_of,
barcodeOption => \%barcodeOption_of,
barcodeType => \%barcodeType_of,
checkSumMethod => \%checkSumMethod_of,
showTextPosition => \%showTextPosition_of,
BarCodeImageFormat => \%BarCodeImageFormat_of,
},
{
Height => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
Width => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
Angle => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
Ratio => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
Module => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
Left => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
Top => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
CheckSum => 'SOAP::WSDL::XSD::Typelib::Builtin::boolean',
FontName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
BarColor => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
BGColor => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
FontSize => 'SOAP::WSDL::XSD::Typelib::Builtin::float',
barcodeOption => 'MyTypes::BarcodeOption',
barcodeType => 'MyTypes::BarcodeType',
checkSumMethod => 'MyTypes::CheckSumMethod',
showTextPosition => 'MyTypes::ShowTextPosition',
BarCodeImageFormat => 'MyTypes::ImageFormats',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::BarCodeData
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
BarCodeData from the namespace http://www.webservicex.net/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
Height
Width
Angle
Ratio
Module
Left
Top
CheckSum
FontName
BarColor
BGColor
FontSize
barcodeOption
barcodeType
checkSumMethod
showTextPosition
BarCodeImageFormat
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::BarCodeData
Height => $some_value, # int
Width => $some_value, # int
Angle => $some_value, # int
Ratio => $some_value, # int
Module => $some_value, # int
Left => $some_value, # int
Top => $some_value, # int
CheckSum => $some_value, # boolean
FontName => $some_value, # string
BarColor => $some_value, # string
BGColor => $some_value, # string
FontSize => $some_value, # float
barcodeOption => $some_value, # BarcodeOption
barcodeType => $some_value, # BarcodeType
checkSumMethod => $some_value, # CheckSumMethod
showTextPosition => $some_value, # ShowTextPosition
BarCodeImageFormat => $some_value, # ImageFormats
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+56
View File
@@ -0,0 +1,56 @@
package MyTypes::BarcodeOption;
use strict;
use warnings;
sub get_xmlns { 'http://www.webservicex.net/'};
# derivation by restriction
use base qw(
SOAP::WSDL::XSD::Typelib::Builtin::string
);
1;
=pod
=head1 MyTypes::BarcodeOption
=head1 DESCRIPTION
Perl data type class for the XML Schema defined simpleType
BarcodeOption from the namespace http://www.webservicex.net/.
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
like it's base type.
# Description of restrictions not implemented yet.
=head1 METHODS
=head2 new
Constructor.
=head2 get_value / set_value
Getter and setter for the simpleType's value.
=head1 OVERLOADING
Depending on the simple type's base type, the following operations are overloaded
Stringification
Numerification
Boolification
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+56
View File
@@ -0,0 +1,56 @@
package MyTypes::BarcodeType;
use strict;
use warnings;
sub get_xmlns { 'http://www.webservicex.net/'};
# derivation by restriction
use base qw(
SOAP::WSDL::XSD::Typelib::Builtin::string
);
1;
=pod
=head1 MyTypes::BarcodeType
=head1 DESCRIPTION
Perl data type class for the XML Schema defined simpleType
BarcodeType from the namespace http://www.webservicex.net/.
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
like it's base type.
# Description of restrictions not implemented yet.
=head1 METHODS
=head2 new
Constructor.
=head2 get_value / set_value
Getter and setter for the simpleType's value.
=head1 OVERLOADING
Depending on the simple type's base type, the following operations are overloaded
Stringification
Numerification
Boolification
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+56
View File
@@ -0,0 +1,56 @@
package MyTypes::CheckSumMethod;
use strict;
use warnings;
sub get_xmlns { 'http://www.webservicex.net/'};
# derivation by restriction
use base qw(
SOAP::WSDL::XSD::Typelib::Builtin::string
);
1;
=pod
=head1 MyTypes::CheckSumMethod
=head1 DESCRIPTION
Perl data type class for the XML Schema defined simpleType
CheckSumMethod from the namespace http://www.webservicex.net/.
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
like it's base type.
# Description of restrictions not implemented yet.
=head1 METHODS
=head2 new
Constructor.
=head2 get_value / set_value
Getter and setter for the simpleType's value.
=head1 OVERLOADING
Depending on the simple type's base type, the following operations are overloaded
Stringification
Numerification
Boolification
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+74
View File
@@ -0,0 +1,74 @@
package MyTypes::Contract;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %ContractID_of :ATTR(:get<ContractID>);
my %ContractName_of :ATTR(:get<ContractName>);
__PACKAGE__->_factory(
[ qw(
ContractID
ContractName
) ],
{
ContractID => \%ContractID_of,
ContractName => \%ContractName_of,
},
{
ContractID => 'SOAP::WSDL::XSD::Typelib::Builtin::long',
ContractName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::Contract
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
Contract from the namespace http://www.example.org/benchmark/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
ContractID
ContractName
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+56
View File
@@ -0,0 +1,56 @@
package MyTypes::ImageFormats;
use strict;
use warnings;
sub get_xmlns { 'http://www.webservicex.net/'};
# derivation by restriction
use base qw(
SOAP::WSDL::XSD::Typelib::Builtin::string
);
1;
=pod
=head1 MyTypes::ImageFormats
=head1 DESCRIPTION
Perl data type class for the XML Schema defined simpleType
ImageFormats from the namespace http://www.webservicex.net/.
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
like it's base type.
# Description of restrictions not implemented yet.
=head1 METHODS
=head2 new
Constructor.
=head2 get_value / set_value
Getter and setter for the simpleType's value.
=head1 OVERLOADING
Depending on the simple type's base type, the following operations are overloaded
Stringification
Numerification
Boolification
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+131
View File
@@ -0,0 +1,131 @@
package MyTypes::Person;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %PersonID_of :ATTR(:get<PersonID>);
my %Salutation_of :ATTR(:get<Salutation>);
my %Name_of :ATTR(:get<Name>);
my %GivenName_of :ATTR(:get<GivenName>);
my %DateOfBirth_of :ATTR(:get<DateOfBirth>);
my %HomeAddress_of :ATTR(:get<HomeAddress>);
my %WorkAddress_of :ATTR(:get<WorkAddress>);
my %Contracts_of :ATTR(:get<Contracts>);
__PACKAGE__->_factory(
[ qw(
PersonID
Salutation
Name
GivenName
DateOfBirth
HomeAddress
WorkAddress
Contracts
) ],
{
PersonID => \%PersonID_of,
Salutation => \%Salutation_of,
Name => \%Name_of,
GivenName => \%GivenName_of,
DateOfBirth => \%DateOfBirth_of,
HomeAddress => \%HomeAddress_of,
WorkAddress => \%WorkAddress_of,
Contracts => \%Contracts_of,
},
{
PersonID => 'MyTypes::PersonID',
Salutation => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
Name => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
GivenName => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
DateOfBirth => 'SOAP::WSDL::XSD::Typelib::Builtin::date',
HomeAddress => 'MyTypes::Address',
WorkAddress => 'MyTypes::Address',
Contracts => 'MyTypes::ArrayOfContract',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::Person
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
Person from the namespace http://www.example.org/benchmark/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
PersonID
Salutation
Name
GivenName
DateOfBirth
HomeAddress
WorkAddress
Contracts
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::Person
PersonID => { # MyTypes::PersonID
ID => $some_value, # int
},
Salutation => $some_value, # string
Name => $some_value, # string
GivenName => $some_value, # string
DateOfBirth => $some_value, # date
HomeAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
WorkAddress => { # MyTypes::Address
Street => $some_value, # string
ZIP => $some_value, # string
City => $some_value, # string
Country => $some_value, # string
PhoneNumber => $some_value, # PhoneNumber
MobilePhoneNumber => $some_value, # PhoneNumber
},
Contracts => { # MyTypes::ArrayOfContract
Contract => { # MyTypes::Contract
ContractID => $some_value, # long
ContractName => $some_value, # string
},
},
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+68
View File
@@ -0,0 +1,68 @@
package MyTypes::PersonID;
use strict;
use warnings;
use Class::Std::Fast::Storable constructor => 'none';
use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
Class::Std::initialize();
{ # BLOCK to scope variables
my %ID_of :ATTR(:get<ID>);
__PACKAGE__->_factory(
[ qw(
ID
) ],
{
ID => \%ID_of,
},
{
ID => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
}
);
} # end BLOCK
1;
=pod
=head1 NAME
MyTypes::PersonID
=head1 DESCRIPTION
Perl data type class for the XML Schema defined complextype
PersonID from the namespace http://www.example.org/benchmark/.
=head2 PROPERTIES
The following properties may be accessed using get_PROPERTY / set_PROPERTY
methods:
ID
=head1 METHODS
=head2 new
Constructor. The following data structure may be passed to new():
{ # MyTypes::PersonID
ID => $some_value, # int
},
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+56
View File
@@ -0,0 +1,56 @@
package MyTypes::PhoneNumber;
use strict;
use warnings;
sub get_xmlns { 'http://www.example.org/benchmark/'};
# derivation by restriction
use base qw(
SOAP::WSDL::XSD::Typelib::Builtin::string
);
1;
=pod
=head1 MyTypes::PhoneNumber
=head1 DESCRIPTION
Perl data type class for the XML Schema defined simpleType
PhoneNumber from the namespace http://www.example.org/benchmark/.
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
like it's base type.
# Description of restrictions not implemented yet.
=head1 METHODS
=head2 new
Constructor.
=head2 get_value / set_value
Getter and setter for the simpleType's value.
=head1 OVERLOADING
Depending on the simple type's base type, the following operations are overloaded
Stringification
Numerification
Boolification
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+56
View File
@@ -0,0 +1,56 @@
package MyTypes::ShowTextPosition;
use strict;
use warnings;
sub get_xmlns { 'http://www.webservicex.net/'};
# derivation by restriction
use base qw(
SOAP::WSDL::XSD::Typelib::Builtin::string
);
1;
=pod
=head1 MyTypes::ShowTextPosition
=head1 DESCRIPTION
Perl data type class for the XML Schema defined simpleType
ShowTextPosition from the namespace http://www.webservicex.net/.
This clase is derived from SOAP::WSDL::XSD::Typelib::Builtin::string
. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
like it's base type.
# Description of restrictions not implemented yet.
=head1 METHODS
=head2 new
Constructor.
=head2 get_value / set_value
Getter and setter for the simpleType's value.
=head1 OVERLOADING
Depending on the simple type's base type, the following operations are overloaded
Stringification
Numerification
Boolification
Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
=head1 AUTHOR
Generated by SOAP::WSDL
=cut
+12
View File
@@ -0,0 +1,12 @@
use strict;
use warnings;
use lib 'lib';
use MyInterfaces::TestService::TestPort;
my $soap = MyInterfaces::TestService::TestPort->new();
my $result = $soap->ListPerson({})
or die "error calling SOAP method";
print "Found " . @{ $result->get_out()->get_NewElement } . " persons\n";
+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/Person.wsdl');
# I have to lookup the methods from the WSDL
my $call = $wsdl->compileClient('ListPerson');
# I have to lookup the parameters from the WSDL
my $result = $call->({ in => undef});
die "Error calling soap method" if not defined $result;
# I have to lookup the output parameters from the WSDL - or try Dumper
#use Data::Dumper;
#print Dumper $result;
print "Found ", scalar @{ $result->{ parameters }->{ out }->{ seq_NewElement }->[0]->{ NewElement } } , " persons\n";
+121
View File
@@ -0,0 +1,121 @@
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="benchmark"
targetNamespace="http://www.example.org/benchmark/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://www.example.org/benchmark/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<wsdl:types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/benchmark/">
<xsd:element name="ListPerson">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="in" type="tns:Person"
maxOccurs="1" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="ListPersonResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="out" type="tns:ArrayOfPerson" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="Person">
<xsd:sequence>
<xsd:element name="PersonID" type="tns:PersonID" />
<xsd:element name="Salutation" type="xsd:string" />
<xsd:element name="Name" type="xsd:string" />
<xsd:element name="GivenName" type="xsd:string" />
<xsd:element name="DateOfBirth" type="xsd:date" />
<xsd:element name="HomeAddress" type="tns:Address"
maxOccurs="1" minOccurs="1" />
<xsd:element name="WorkAddress" type="tns:Address"
maxOccurs="1" minOccurs="0" />
<xsd:element name="Contracts"
type="tns:ArrayOfContract" />
</xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="PhoneNumber">
<xsd:restriction base="xsd:string"></xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="ArrayOfPerson">
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element name="NewElement" type="tns:Person"
maxOccurs="unbounded" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="PersonID">
<xsd:sequence>
<xsd:element name="ID" type="xsd:int"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Address">
<xsd:sequence>
<xsd:element name="Street" type="xsd:string" />
<xsd:element name="ZIP" type="xsd:string" />
<xsd:element name="City" type="xsd:string" />
<xsd:element name="Country" type="xsd:string" />
<xsd:element name="PhoneNumber" type="tns:PhoneNumber" />
<xsd:element name="MobilePhoneNumber" type="tns:PhoneNumber" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ArrayOfContract">
<xsd:sequence>
<xsd:element name="Contract" type="tns:Contract"
maxOccurs="unbounded" minOccurs="0">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Contract">
<xsd:sequence>
<xsd:element name="ContractID" type="xsd:long" />
<xsd:element name="ContractName" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<wsdl:message name="ListPersonRequest">
<wsdl:part name="parameters" element="tns:ListPerson" />
</wsdl:message>
<wsdl:message name="ListPersonResponse">
<wsdl:part name="parameters" element="tns:ListPersonResponse" />
</wsdl:message>
<wsdl:portType name="NewPortType">
<wsdl:operation name="ListPerson">
<wsdl:input message="tns:ListPersonRequest"></wsdl:input>
<wsdl:output message="tns:ListPersonResponse"></wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="NewBinding" type="tns:NewPortType">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="ListPerson">
<soap:operation
soapAction="http://www.example.org/benchmark/ListPerson" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="TestService">
<wsdl:port name="TestPort" binding="tns:NewBinding">
<soap:address
location="http://localhost:81/soap-wsdl-test/person.pl"></soap:address>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
+95 -30
View File
@@ -14,7 +14,7 @@ use Class::Std::Fast;
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType; use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
use LWP::UserAgent; use LWP::UserAgent;
our $VERSION= '2.00_25'; use version; our $VERSION= qv('2.00.01');
my %no_dispatch_of :ATTR(:name<no_dispatch>); my %no_dispatch_of :ATTR(:name<no_dispatch>);
my %wsdl_of :ATTR(:name<wsdl>); my %wsdl_of :ATTR(:name<wsdl>);
@@ -176,7 +176,7 @@ sub _wsdl_init_methods :PRIVATE {
my $ns = $wsdl->get_targetNamespace(); my $ns = $wsdl->get_targetNamespace();
# get bindings, portType, message, part(s) - use private methods for clear separation... # get bindings, portType, message, part(s) - use private methods for clear separation...
$self->_wsdl_get_service if not ($service_of{ $ident }); $self->_wsdl_get_service();
$self->_wsdl_get_portType(); $self->_wsdl_get_portType();
$method_info_of{ $ident } = {}; $method_info_of{ $ident } = {};
@@ -187,9 +187,10 @@ sub _wsdl_init_methods :PRIVATE {
# get SOAP Action # get SOAP Action
# SOAP-Action is a required HTTP Header, so we need to look it up... # SOAP-Action is a required HTTP Header, so we need to look it up...
# There must be a soapAction uri - or the WSDL is invalid (and
# it's not us to prove that...)
my $soap_binding_operation = $binding_operation->get_operation()->[0]; my $soap_binding_operation = $binding_operation->get_operation()->[0];
$method->{ soap_action } = $soap_binding_operation ? $method->{ soap_action } = $soap_binding_operation->get_soapAction();
$soap_binding_operation->get_soapAction() : $method;
# get parts # get parts
# 1. get operation from port # 1. get operation from port
@@ -204,7 +205,10 @@ sub _wsdl_init_methods :PRIVATE {
my $message = $wsdl->find_message( $ns, $localname ) my $message = $wsdl->find_message( $ns, $localname )
or croak "Message {$ns}$localname not found in WSDL definition"; or croak "Message {$ns}$localname not found in WSDL definition";
if (my $body=$binding_operation->first_input()->first_body()) { # Is body not required? So there must be one? Do we need the "if"?
# if (
my $body=$binding_operation->first_input()->first_body();
# {
if ($body->get_parts()) { if ($body->get_parts()) {
$method->{ parts } = []; # make sure it's empty $method->{ parts } = []; # make sure it's empty
my $message_part_ref = $message->get_part(); my $message_part_ref = $message->get_part();
@@ -216,7 +220,9 @@ sub _wsdl_init_methods :PRIVATE {
grep { $_->get_name() eq $name } @{ $message_part_ref }; grep { $_->get_name() eq $name } @{ $message_part_ref };
} }
} }
} # }
# A body does not need to specify the parts of a messages.
# Use all of the message's parts if it does not.
$method->{ parts } ||= $message->get_part(); $method->{ parts } ||= $message->get_part();
# rpc / encoded methods may have a namespace specified. # rpc / encoded methods may have a namespace specified.
@@ -324,6 +330,17 @@ read L<SOAP::WSDL::Manual>.
For using an interpreting (thus slow and somewhat troublesome) WSDL based For using an interpreting (thus slow and somewhat troublesome) WSDL based
SOAP client, which mimics L<SOAP::Lite|SOAP::Lite>'s API, read on. SOAP client, which mimics L<SOAP::Lite|SOAP::Lite>'s API, read on.
Creating Interface classes is the recommended usage.
Did I say you should create interface classes following the steps in
L<SOAP::WSDL::Manual>?
If you're migrating from earlier versions of SOAP::WSDL, you should read the
MIGRATING documentation.
The stuff below is for users of the 1.2x SOAP::WSDL series. All others,
please refer to L<SOAP::WSDL::Manual>
=head1 SYNOPSIS =head1 SYNOPSIS
my $soap = SOAP::WSDL->new( my $soap = SOAP::WSDL->new(
@@ -495,7 +512,7 @@ it's content.
The object tree has two main functions: It knows how to serialize data passed The object tree has two main functions: It knows how to serialize data passed
as hash ref, and how to render the WSDL elements found into perl classes. as hash ref, and how to render the WSDL elements found into perl classes.
Yup your're right, there's a builting code generation facility. Read Yup you're right; there's a builtin code generation facility. Read
L<SOAP::WSDL::Manual> for using it. L<SOAP::WSDL::Manual> for using it.
=item * no_dispatch =item * no_dispatch
@@ -516,6 +533,28 @@ You may pass the servicename and portname as attributes to wsdlinit, though.
=back =back
=head1 Differences to previous versions
The following functionality is no longer supported:
=head2 Operation overloading
The SOAP standard allows operation overloading - that is, you may specify
SOAP operations with more than one message. The client/server than can
choose which message to send. This SOAP feature is usually used similar
to the use of methods with different argument lists in C++.
Operation overloading is no longer supported. The WS-I Basic profile does
not operation overloading. The same functionality as operation overloading
can be obtained by using a choice declaration in the XML Schema.
=head2 readable
Readable has no effect any more. If you need readable debug output, copy the
SOAP message to your favorite XML editor and run the source format command.
Outputting readable XML requires lots of programming for little use: The
resulting XMl is still quite unreadable.
=head1 Differences to SOAP::Lite =head1 Differences to SOAP::Lite
=head2 readable =head2 readable
@@ -556,7 +595,7 @@ See L<class_resolver|class_resolver> above.
=item * Hash refs =item * Hash refs
This is for convnience: A single hash ref containing the content of the This is for convenience: A single hash ref containing the content of the
SOAP body. SOAP body.
=item * xml =item * xml
@@ -598,6 +637,18 @@ details.
=over =over
=item * $obj == undef does not work in perl 5.8.6 and perl 5.8.7
Due to some strange behaviour in perl 5.8.6 and perl 5.8.7, stringification
overloading is not triggered during comparison with undef.
While this is probably harmless in most cases, it's important to know that
you need to do
defined( $obj->get_value() )
to check for undef values in simpleType objects.
=item * perl 5.8.0 or higher required =item * perl 5.8.0 or higher required
SOAP::WSDL needs perl 5.8.0 or higher. This is due to a bug in perls SOAP::WSDL needs perl 5.8.0 or higher. This is due to a bug in perls
@@ -611,24 +662,26 @@ If you want this changed, email me a copy of the specs, please.
=item * Incomplete XML Schema definitions support =item * Incomplete XML Schema definitions support
XML Schema attribute definitions are not supported yet. This section describes the limitations of SOAP::WSDL, that is the interpreting
SOAP client. For limitations of L<wsdl2perl.pl|wsdl2perl.pl> generated
SOAP clients, see L<SOAP::WSDL::Manual::XSD>.
Importing external definitions is not supported yet. XML Schema attribute definitions are not supported in interpreting mode.
The following XML Schema definitions varieties are not supported: The following XML Schema definitions varieties are not supported in
interpreting mod:
group group
union
simpleContent simpleContent
The following XML Schema definition content model is only partially The following XML Schema definition content model is only partially
supported: supported in interpreting mode:
complexContent - only restriction variety supported complexContent - only restriction variety supported
See L<SOAP::WSDL::Manual::XSD> for details. See L<SOAP::WSDL::Manual::XSD> for details.
=item * Serialization of hash refs dos not work for ambiguos values =item * Serialization of hash refs does not work for ambiguous values
If you have list elements with multiple occurences allowed, SOAP::WSDL If you have list elements with multiple occurences allowed, SOAP::WSDL
has no means of finding out which variant you meant. has no means of finding out which variant you meant.
@@ -638,17 +691,17 @@ Passing in item => [1,2,3] could serialize to
<item>1 2</item><item>3</item> <item>1 2</item><item>3</item>
<item>1</item><item>2 3</item> <item>1</item><item>2 3</item>
Ambiguos data can be avoided by providing data as objects. Ambiguous data can be avoided by providing data as objects.
=item * XML Schema facets =item * XML Schema facets
Almost no XML schema facets are implemented yet. The only facets Almost no XML schema facets are implemented. The only facets
currently implemented are: currently implemented are:
fixed fixed
default default
The following facets have no influence yet: The following facets have no influence:
minLength minLength
maxLength maxLength
@@ -669,16 +722,16 @@ The following facets have no influence yet:
=item * L<SOAP::Lite|SOAP::Lite> =item * L<SOAP::Lite|SOAP::Lite>
Full featured SOAP-library, little WSDL support. Supports rpc-encoded style only. Many protocols supported. Full featured SOAP-library, little WSDL support. Supports rpc-encoded style
only. Many protocols supported.
=item * L<XML::Compile::WSDL|XML::Compile::WSDL> / L<XML::Compile::SOAP|XML::Compile::SOAP> =item * L<XML::Compile::SOAP|XML::Compile::SOAP>
A promising-looking approach derived from a cool functional DOM-based XML schema parser. Creates parser/generator functions for SOAP messages. Includes SOAP Client
and Server implementations. Can validate XML messages.
Will support encoding/decoding of SOAP messages based on WSDL definitions. You might want to give it a try, especially if you need to adhere very
closely to the XML Schema / WSDL specs.
Not yet finished at the time of writing - but you may wish to give it a try, especially
if you need to adhere very closely to the XML Schema / WSDL specs.
=back =back
@@ -706,20 +759,33 @@ became v1.23)
David Bussenschutt, Damian A. Martinez Gelabert, Dennis S. Hennen, Dan Horne, David Bussenschutt, Damian A. Martinez Gelabert, Dennis S. Hennen, Dan Horne,
Peter Orvos, Mark Overmeer, Jon Robens, Isidro Vila Verde and Glenn Wood Peter Orvos, Mark Overmeer, Jon Robens, Isidro Vila Verde and Glenn Wood
spotted bugs and/or suggested improvements in the 1.2x releases. (in alphabetical order) spotted bugs and/or suggested improvements in
the 1.2x releases.
Noah Robin contirbuted lots of documentation fixes, and the mod_perl server.
JT Justman and Noah Robin provided early feedback and bug reports for
the 2.xx pre-releases.
Adam Kennedy checked and suggested improvements on metadata and dependencies
in the 2.xx pre-releases.
Andreas 'ac0v' Specht constantly asked for better performance. Andreas 'ac0v' Specht constantly asked for better performance.
JT Justman provided early feedback for the 2.xx pre-releases. Matt S. Trout encouraged me "to get a non-dev-release out."
CPAN Testers provided most valuable (automated) feedback. Thanks a lot.
Numerous people sent me their real-world WSDL files for testing. Thank you. Numerous people sent me their real-world WSDL files for testing. Thank you.
Paul Kulchenko and Byrne Reese wrote and maintained SOAP::Lite and Paul Kulchenko and Byrne Reese wrote and maintained SOAP::Lite and
thus provided a base (and counterpart) for SOAP::WSDL. thus provided a base (and counterpart) for SOAP::WSDL.
Mark Overmeer wrote XML::Compile::SOAP - competition is good for business.
=head1 LICENSE AND COPYRIGHT =head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter. Copyright 2004-2008 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
@@ -730,10 +796,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 427 $ $Rev: 616 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: WSDL.pm 427 2007-12-02 22:20:24Z kutterma $ $Id: WSDL.pm 616 2008-04-22 21:51:49Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL.pm $
=cut =cut
+42 -18
View File
@@ -5,14 +5,31 @@ use Class::Std::Fast::Storable;
use List::Util qw(first); use List::Util qw(first);
use Carp qw(croak carp confess); use Carp qw(croak carp confess);
our $VERSION='2.00_25'; use version; our $VERSION = qv('2.00.01');
my %id_of :ATTR(:name<id> :default<()>); my %id_of :ATTR(:name<id> :default<()>);
my %name_of :ATTR(:name<name> :default<()>); my %lang_of :ATTR(:name<lang> :default<()>);
my %documentation_of :ATTR(:name<documentation> :default<()>); my %name_of :ATTR(:name<name> :default<()>);
my %targetNamespace_of :ATTR(:name<targetNamespace> :default<()>); my %documentation_of :ATTR(:name<documentation> :default<()>);
my %xmlns_of :ATTR(:name<xmlns> :default<{}>); my %annotation_of :ATTR(:name<annotation> :default<()>);
my %parent_of :ATTR(:name<parent> :default<()>); my %targetNamespace_of :ATTR(:name<targetNamespace> :default<()>);
my %xmlns_of :ATTR(:name<xmlns> :default<{}>);
my %parent_of :ATTR(:name<parent> :default<()>);
my %namespaces_of :ATTR(:default<{}>);
sub namespaces {
return shift->get_xmlns();
}
sub START {
my ($self, $ident, $arg_ref) = @_;
$xmlns_of{ $ident }->{ '#default' } = $self->get_xmlns()->{ '#default' };
$xmlns_of{ $ident }->{ 'xml' } = 'http://www.w3.org/XML/1998/namespace';
$namespaces_of{ $ident }->{ '#default' } = $self->get_xmlns()->{ '#default' };
$namespaces_of{ $ident }->{ 'xml' } = 'http://www.w3.org/XML/1998/namespace';
}
sub DEMOLISH { sub DEMOLISH {
my $self = shift; my $self = shift;
@@ -82,7 +99,12 @@ sub AUTOMETHOD {
return $result_ref->[0]; return $result_ref->[0];
}; };
} }
confess "$subname not found in class " . (ref $self || $self) ;
# return if called from can();
my @caller = caller(2);
return if ($caller[3] eq 'Class::Std::Fast::__ANON__');
# confess "$subname not found in class " . ref $self;
return;
} }
sub init { sub init {
@@ -95,11 +117,6 @@ sub init {
$xmlns_of{ ident $self }->{ $value->{ LocalName } } = $value->{ Value }; $xmlns_of{ ident $self }->{ $value->{ LocalName } } = $value->{ Value };
next; next;
} }
elsif ($value->{ Name } =~m{^xmlns$}xms) {
# just ignore xmlns = for now
# TODO handle xmlns correctly - maybe via setting a prefix ?
next;
}
my $name = $value->{ LocalName }; my $name = $value->{ LocalName };
my $method = "set_$name"; my $method = "set_$name";
@@ -109,17 +126,24 @@ sub init {
} }
sub expand { sub expand {
my ($self, , $qname) = @_; my ($self, $qname) = @_;
my $ns_of = $self->namespaces();
if (not $qname=~m{:}xm) {
die "un-prefixed element name <$qname> found, but no default namespace set\n"
if not defined $ns_of->{ '#default' };
return $ns_of->{ '#default' }, $qname;
}
my ($prefix, $localname) = split /:/x, $qname; my ($prefix, $localname) = split /:/x, $qname;
# my %ns_map = reverse %{ $self->get_xmlns() };
my %ns_map = %{ $self->get_xmlns() };
return ($ns_map{ $prefix }, $localname) if ($ns_map{ $prefix }); return ($ns_of->{ $prefix }, $localname) if ($ns_of->{ $prefix });
if (my $parent = $self->get_parent()) { if (my $parent = $self->get_parent()) {
return $parent->expand($qname); return $parent->expand($qname);
} }
confess "unbound prefix $prefix found for $prefix:$localname. Bound prefixes are" confess "unbound prefix $prefix found for $prefix:$localname. Bound prefixes are"
. join(', ', keys %ns_map); . join(', ', keys %{ $ns_of });
} }
sub _expand; sub _expand;
*_expand = \&expand; *_expand = \&expand;
+2
View File
@@ -5,6 +5,8 @@ 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);
use version; our $VERSION = qv('2.00.01');
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<()>);
+9 -20
View File
@@ -11,7 +11,7 @@ use SOAP::WSDL::Factory::Serializer;
use SOAP::WSDL::Factory::Transport; use SOAP::WSDL::Factory::Transport;
use SOAP::WSDL::Expat::MessageParser; use SOAP::WSDL::Expat::MessageParser;
our $VERSION = '2.00_25'; use version; our $VERSION = qv('2.00.01');
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<()>);
@@ -259,30 +259,19 @@ 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 appending charset
like in like this:
text/xml $soap->set_content_type('text/xml');
Default: Default:
text/xml; charset: utf8 text/xml; charset: utf8
=head3 set_trace
$soap->set_trace(1);
$soap->set_trace( sub { Log::Log4perl::get_logger()->debug( @_ ) } );
When set to a true value, tracing (via warn) is enabled.
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
or whatever you need.
=head2 Features different from SOAP::Lite =head2 Features different from SOAP::Lite
SOAP::WSDL does not aim to be a complete replacement for SOAP::Lite - the SOAP::WSDL does not aim to be a complete replacement for SOAP::Lite - the
SOAP::Lite module has it's strengths and weaknesses and SOAP::WSDL is SOAP::Lite module has its strengths and weaknesses and SOAP::WSDL is
designed as a cure for the weakness of little WSDL support - nothing more, designed as a cure for the weakness of little WSDL support - nothing more,
nothing less. nothing less.
@@ -294,7 +283,7 @@ A few things are quite different from SOAP::Lite, though:
=head3 SOAP request data =head3 SOAP request data
SOAP request data may either be given as message object, or as hash ref (in SOAP request data may either be given as message object, or as a hash ref (in
which case it will automatically be encoded into a message object). which case it will automatically be encoded into a message object).
=head3 Return values =head3 Return values
@@ -314,7 +303,7 @@ The fault object is a SOAP1.1 fault object of the following
C<SOAP::WSDL::SOAP::Typelib::Fault11>. C<SOAP::WSDL::SOAP::Typelib::Fault11>.
SOAP::WSDL::SOAP::Typelib::Fault11 objects are false in boolean context, so SOAP::WSDL::SOAP::Typelib::Fault11 objects are false in boolean context, so
you can just do something like you can just do something like:
my $result = $soap->call($method, $data); my $result = $soap->call($method, $data);
@@ -371,9 +360,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 427 $ $Rev: 616 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Client.pm 427 2007-12-02 22:20:24Z kutterma $ $Id: Client.pm 616 2008-04-22 21:51:49Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
=cut =cut
+23 -39
View File
@@ -4,19 +4,36 @@ use warnings;
use base 'SOAP::WSDL::Client'; use base 'SOAP::WSDL::Client';
use Scalar::Util qw(blessed); use Scalar::Util qw(blessed);
our $VERSION = '2.00_25'; use version; our $VERSION = qv('2.00.01');
sub call { sub call {
my ($self, $method, $body, $header) = @_; my ($self, $method, $body, $header) = @_;
# Treat non-objects special
if (not blessed $body) { if (not blessed $body) {
# make sure there's something sensible in our body data
$body = {} if not defined $body; $body = {} if not defined $body;
my $class = $method->{ body }->{ parts }->[0]; $body = ref $body eq 'ARRAY' ? $body : [ $body ];
eval "require $class" || die $@;
$body = $class->new($body); my @body_from = @{ $body }; # make a copy
# build list of parts as objects initialized with
# parameters given
my @part_from = ();
foreach my $class (@{ $method->{ body }->{ parts } }) {
eval "require $class" || die $@;
push @part_from, $class->new(shift(@body_from) || {});
}
# it's either the first part or a list ref with all parts...
$body = $#part_from ? \@part_from : $part_from[0];
} }
# if we have a header # if we have a header
if (%{ $method->{ header } }) { if (%{ $method->{ header } }) {
# trat non object special - as above, but only for one
if (not blessed $header) { if (not blessed $header) {
my $class = $method->{ header }->{ parts }->[0]; my $class = $method->{ header }->{ parts }->[0];
eval "require $class" || die $@; eval "require $class" || die $@;
@@ -26,39 +43,6 @@ sub call {
return $self->SUPER::call($method, $body, $header); return $self->SUPER::call($method, $body, $header);
} }
#sub __create_methods {
# my ($package, %info_of) = @_;
#
# no strict qw(refs);
# no warnings qw(redefine);
# for my $method (keys %info_of){
# my ($soap_action, @parts);
#
# # up to 2.00_10 we had list refs...
# if (ref $info_of{ $method }eq 'HASH') {
# @parts = @{ $info_of{ $method }->{ parts } };
# $soap_action = $info_of{ $method }->{ soap_action };
# }
# else {
# die "Pre-v2.00_10 Interfaces are no longer supported. Please re-generate your interface.";
# }
#
# *{ "$package\::$method" } = sub {
# my $self = shift;
# my @param = map {
# my $data = shift || {};
# eval "require $_";
# $_->new( $data );
# } @parts;
#
# return $self->SUPER::call( {
# operation => $method,
# soap_action => $soap_action,
# }, @param );
# }
# }
#}
1; 1;
__END__ __END__
@@ -94,9 +78,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 427 $ $Rev: 616 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Base.pm 427 2007-12-02 22:20:24Z kutterma $ $Id: Base.pm 616 2008-04-22 21:51:49Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client/Base.pm $
=cut =cut
+15 -15
View File
@@ -9,22 +9,22 @@ use List::Util qw(first);
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
use base qw(SOAP::WSDL::Base); use base qw(SOAP::WSDL::Base);
our $VERSION='2.00_25'; use version; our $VERSION = qv('2.00.01');
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::Fast::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,
portType => \%portType_of, portType => \%portType_of,
service => \%service_of, service => \%service_of,
); );
# Function factory - we could be writing this method for all %attribute # Function factory - we could be writing this method for all %attribute
@@ -105,7 +105,7 @@ Returns the message matching the namespace/localname pair passed as arguments.
Accessors/Mutators for accessing / setting the E<gt>typesE<lt> child Accessors/Mutators for accessing / setting the E<gt>typesE<lt> child
element(s). element(s).
=head1 LICENSE and COPYRIGHT =head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter. Copyright 2004-2007 Martin Kutter.
@@ -118,9 +118,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 427 $ $Rev: 616 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Definitions.pm 427 2007-12-02 22:20:24Z kutterma $ $Id: Definitions.pm 616 2008-04-22 21:51:49Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Definitions.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Definitions.pm $
=cut =cut
+3 -3
View File
@@ -8,7 +8,7 @@ use SOAP::WSDL::Expat::Message2Hash;
use SOAP::WSDL::Factory::Deserializer; use SOAP::WSDL::Factory::Deserializer;
SOAP::WSDL::Factory::Deserializer->register( '1.1', __PACKAGE__ ); SOAP::WSDL::Factory::Deserializer->register( '1.1', __PACKAGE__ );
our $VERSION='2.00_25'; use version; our $VERSION = qv('2.00.01');
sub BUILD { sub BUILD {
my ($self, $ident, $args_of_ref) = @_; my ($self, $ident, $args_of_ref) = @_;
@@ -152,9 +152,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 427 $ $Rev: 616 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Hash.pm 427 2007-12-02 22:20:24Z kutterma $ $Id: Hash.pm 616 2008-04-22 21:51:49Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/Hash.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/Hash.pm $
=cut =cut
+4 -4
View File
@@ -2,7 +2,7 @@ package SOAP::WSDL::Deserializer::SOM;
use strict; use strict;
use warnings; use warnings;
our $VERSION = '2.00_24'; use version; our $VERSION = qv('2.00.01');
our @ISA; our @ISA;
eval { eval {
@@ -68,7 +68,7 @@ from the L<SOAP::Lite|SOAP::Lite> package.
=head1 USAGE =head1 USAGE
SOAP::WSDL::Deserializer will not auroregister itself - to use it for a particular SOAP::WSDL::Deserializer will not autoregister itself - to use it for a particular
SOAP version just use the following lines: SOAP version just use the following lines:
my $soap_version = '1.1'; # or '1.2', further versions may appear. my $soap_version = '1.1'; # or '1.2', further versions may appear.
@@ -114,9 +114,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 391 $ $Rev: 616 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: SOM.pm 391 2007-11-17 21:56:13Z kutterma $ $Id: SOM.pm 616 2008-04-22 21:51:49Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/SOM.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/SOM.pm $
=cut =cut
+6 -5
View File
@@ -5,7 +5,7 @@ use Class::Std::Fast::Storable;
use SOAP::WSDL::SOAP::Typelib::Fault11; use SOAP::WSDL::SOAP::Typelib::Fault11;
use SOAP::WSDL::Expat::MessageParser; use SOAP::WSDL::Expat::MessageParser;
our $VERSION='2.00_25'; use version; our $VERSION = qv('2.00.01');
my %class_resolver_of :ATTR(:name<class_resolver> :default<()>); my %class_resolver_of :ATTR(:name<class_resolver> :default<()>);
@@ -23,7 +23,8 @@ sub BUILD {
sub deserialize { sub deserialize {
my ($self, $content) = @_; my ($self, $content) = @_;
$parser_of{ ${ $self } } ||= SOAP::WSDL::Expat::MessageParser->new(); $parser_of{ ${ $self } } = SOAP::WSDL::Expat::MessageParser->new()
if not $parser_of{ ${ $self } };
$parser_of{ ${ $self } }->class_resolver( $class_resolver_of{ ident $self } ); $parser_of{ ${ $self } }->class_resolver( $class_resolver_of{ ident $self } );
eval { $parser_of{ ${ $self } }->parse_string( $content ) }; eval { $parser_of{ ${ $self } }->parse_string( $content ) };
if ($@) { if ($@) {
@@ -71,7 +72,7 @@ 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 deserializer for SOAP::WSDL::Client and interface classes generated by
SOAP::WSDL. SOAP::WSDL.
Is you want to use the XSD serializer from SOAP::WSDL, set the outputtree() If you want to use the XSD serializer from SOAP::WSDL, set the outputtree()
property and provide a class_resolver. property and provide a class_resolver.
=head1 METHODS =head1 METHODS
@@ -98,9 +99,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 427 $ $Rev: 616 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: XSD.pm 427 2007-12-02 22:20:24Z kutterma $ $Id: XSD.pm 616 2008-04-22 21:51:49Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/XSD.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Deserializer/XSD.pm $
=cut =cut
+93 -3
View File
@@ -1,17 +1,73 @@
package SOAP::WSDL::Expat::Base; package SOAP::WSDL::Expat::Base;
use strict; use strict;
use warnings; use warnings;
use URI;
use XML::Parser::Expat; use XML::Parser::Expat;
our $VERSION = '2.00_24'; # TODO: convert to Class::Std::Fast based class - hash based classes suck.
use version; our $VERSION = qv('2.00.01');
sub new { sub new {
my ($class, $args) = @_; my ($class, $arg_ref) = @_;
my $self = {}; my $self = {
data => undef,
};
bless $self, $class; bless $self, $class;
$self->set_user_agent($arg_ref->{ user_agent })
if $arg_ref->{ user_agent };
$self->{ parsed } = $arg_ref->{ parsed } if $arg_ref->{ parsed };
return $self; return $self;
} }
sub clone {
my $self = shift;
my $class = ref $self;
my $clone = $class->new($self);
return $clone;
}
sub set_uri { $_[0]->{ uri } = $_[1]; }
sub get_uri { return $_[0]->{ uri }; }
sub set_user_agent { $_[0]->{ user_agent } = $_[1]; }
sub get_user_agent { return $_[0]->{ user_agent }; }
sub set_parsed {
my ($self, $uri) = @_;
$self->{ parsed }->{ $uri } = 1;
return;
}
sub is_parsed {
my ($self, $uri) = @_;
return exists $self->{ parsed }->{ $uri };
}
sub parse_uri {
my $self = shift;
my $uri = shift;
if ($self->is_parsed($uri)){
warn "$uri already imported. Ignoring it\n";
return;
}
$self->set_parsed($uri);
$self->set_uri( $uri );
if (not $self->{ user_agent }) {
require LWP::UserAgent;
$self->{ user_agent } = LWP::UserAgent->new();
}
my $response = $self->{ user_agent }->get($uri);
die $response->message() if $response->code() ne '200';
return $self->parse( $response->content() );
}
sub parse { sub parse {
eval { eval {
$_[0]->_initialize( XML::Parser::Expat->new( Namespaces => 1 ) )->parse( $_[1] ); $_[0]->_initialize( XML::Parser::Expat->new( Namespaces => 1 ) )->parse( $_[1] );
@@ -42,3 +98,37 @@ sub get_data {
} }
1; 1;
=pod
=head1 NAME
SOAP::WSDL::Expat::Base - Base class for XML::Parser::Expat based XML parsers
=head1 DESCRIPTION
Base class for XML::Parser::Expat based XML parsers. All XML::SAX::Expat based
parsers in SOAP::WSDL inherit from this class.
=head1 AUTHOR
Replace the whitespace by @ for E-Mail Address.
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself
=head1 Repository information
$Id: $
$LastChangedDate: 2007-09-10 18:19:23 +0200 (Mo, 10 Sep 2007) $
$LastChangedRevision: 218 $
$LastChangedBy: kutterma $
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $
+8 -5
View File
@@ -4,7 +4,7 @@ use strict;
use warnings; use warnings;
use base qw(SOAP::WSDL::Expat::Base); use base qw(SOAP::WSDL::Expat::Base);
our $VERSION = '2.00_24'; use version; our $VERSION = qv('2.00.01');
sub _initialize { sub _initialize {
my ($self, $parser) = @_; my ($self, $parser) = @_;
@@ -21,7 +21,7 @@ sub _initialize {
my ($_element, $_method, my ($_element, $_method,
$_class, $_parser, %_attrs) = (); $_class, $_parser, %_attrs) = ();
no strict qw(refs); # no strict qw(refs);
$parser->setHandlers( $parser->setHandlers(
Start => sub { Start => sub {
push @$list, $current; push @$list, $current;
@@ -113,13 +113,16 @@ Replace the whitespace by @ for E-Mail Address.
Martin Kutter E<lt>martin.kutter fen-net.deE<gt> Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 COPYING =head1 LICENSE AND COPYRIGHT
This module may be used under the same terms as perl itself. Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself
=head1 Repository information =head1 Repository information
$ID: $ $Id: $
$LastChangedDate: 2007-09-10 18:19:23 +0200 (Mo, 10 Sep 2007) $ $LastChangedDate: 2007-09-10 18:19:23 +0200 (Mo, 10 Sep 2007) $
$LastChangedRevision: 218 $ $LastChangedRevision: 218 $
+47 -21
View File
@@ -4,7 +4,7 @@ use strict;
use warnings; use warnings;
use Carp qw(croak confess); use Carp qw(croak confess);
our $VERSION = q{2.00_25}; use version; our $VERSION = qv('2.00.01');
use SOAP::WSDL::XSD::Typelib::Builtin; use SOAP::WSDL::XSD::Typelib::Builtin;
use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType; use SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType;
@@ -24,7 +24,12 @@ sub new {
}; };
bless $self, $class; bless $self, $class;
$self->load_classes() if ($args->{ class_resolver });
# could be written as && - but Devel::Cover doesn't like that
if ($args->{ class_resolver }) {
$self->load_classes()
if ! exists $LOADED_OF{ $self->{ class_resolver } };
}
return $self; return $self;
} }
@@ -32,7 +37,8 @@ sub class_resolver {
my $self = shift; my $self = shift;
if (@_) { if (@_) {
$self->{ class_resolver } = shift; $self->{ class_resolver } = shift;
$self->load_classes(); $self->load_classes()
if ! exists $LOADED_OF{ $self->{ class_resolver } };
} }
return $self->{ class_resolver }; return $self->{ class_resolver };
} }
@@ -40,15 +46,13 @@ sub class_resolver {
sub load_classes { sub load_classes {
my $self = shift; my $self = shift;
return if $LOADED_OF{ $self->{ class_resolver } };
for (values %{ $self->{ class_resolver }->get_typemap }) { for (values %{ $self->{ class_resolver }->get_typemap }) {
no strict qw(refs); no strict qw(refs);
my $class = $_; my $class = $_;
# a bad test - do you know a better one? # a bad test - do you know a better one?
next if $class eq '__SKIP__'; next if $class eq '__SKIP__';
next if defined @{ "$class\::ISA"}; # check if namespace exists next if defined *{ "$class\::" }; # check if namespace exists
$class =~s{ :: }{/}xmsg; $class =~s{ :: }{/}xmsg;
$class .= '.pm'; $class .= '.pm';
@@ -117,7 +121,7 @@ sub _initialize {
no strict qw(refs); no strict qw(refs);
$parser->setHandlers( $parser->setHandlers(
Start => sub { Start => sub {
# my ($parser, $element, %_attrs) = @_; # my ($parser, $element, %attrs) = @_;
$_leaf = 1; # believe we're a leaf node until we see an end $_leaf = 1; # believe we're a leaf node until we see an end
@@ -128,7 +132,7 @@ sub _initialize {
return &{$content_check{ $depth }} return &{$content_check{ $depth }}
if exists $content_check{ $depth }; if exists $content_check{ $depth };
push @{ $path }, $_[1]; # step down in path push @{ $path }, $_[1]; # step down in path
return if $skip; # skip inside __SKIP__ return if $skip; # skip inside __SKIP__
# resolve class of this element # resolve class of this element
@@ -162,6 +166,9 @@ sub _initialize {
# (circumventing constructor) here. # (circumventing constructor) here.
# That's dirty, but fast. # That's dirty, but fast.
# #
# TODO: check whether this is faster under all perls - there's
# strange benchmark results...
#
# The alternative would read: # The alternative would read:
# $current = $_class->new({ @_[2..$#_] }); # $current = $_class->new({ @_[2..$#_] });
# #
@@ -171,6 +178,21 @@ sub _initialize {
$current = bless \$o, $_class; $current = bless \$o, $_class;
} }
# set attributes if there are any
ATTR: {
if (@_ > 2) {
# die Data::Dumper::Dumper(@_[2..$#_]);
my %attr = @_[2..$#_];
if (my $nil = delete $attr{nil}) {
# TODO: check namespace
if ($nil && $nil ne 'false') {
undef $characters;
last ATTR if not (%attr);
}
}
$current->attr(\%attr);
}
}
$depth++; $depth++;
return; return;
}, },
@@ -191,13 +213,6 @@ sub _initialize {
$depth--; $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 # we only set character values in leaf nodes
if ($_leaf) { if ($_leaf) {
# Use dirty but fast access via global variables. # Use dirty but fast access via global variables.
@@ -207,12 +222,20 @@ sub _initialize {
# $current->set_value( $characters ) if (length($characters)); # $current->set_value( $characters ) if (length($characters));
# #
$SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType::___value $SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType::___value
->{ $$current } = $characters if $characters =~m{ [^\s] }xms; ->{ $$current } = $characters
if defined $characters && defined $current; # =~m{ [^\s] }xms;
} }
# empty characters # empty characters
$characters = q{}; $characters = q{};
# 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;
};
# 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";
@@ -281,16 +304,19 @@ Replace the whitespace by @ for E-Mail Address.
Martin Kutter E<lt>martin.kutter fen-net.deE<gt> Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 COPYING =head1 LICENSE AND COPYRIGHT
This module may be used under the same terms as perl itself. Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself
=head1 Repository information =head1 Repository information
$ID: $ $Id: $
$LastChangedDate: 2007-12-02 23:20:24 +0100 (So, 02 Dez 2007) $ $LastChangedDate: 2008-04-22 23:51:49 +0200 (Di, 22 Apr 2008) $
$LastChangedRevision: 427 $ $LastChangedRevision: 616 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageParser.pm $
+10 -10
View File
@@ -6,7 +6,7 @@ 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'; use version; our $VERSION = qv('2.00.01');
sub parse_start { sub parse_start {
my $self = shift; my $self = shift;
@@ -56,22 +56,22 @@ See L<SOAP::WSDL::Manual::Parser> for details.
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
Martin Kutter E<lt>martin.kutter fen-net.deE<gt> Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 LICENSE AND COPYRIGHT
Copyright 2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 391 $ $Rev: 616 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: MessageStreamParser.pm 391 2007-11-17 21:56:13Z kutterma $ $Id: MessageStreamParser.pm 616 2008-04-22 21:51:49Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageStreamParser.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/MessageStreamParser.pm $
=cut =cut
+147 -3
View File
@@ -5,7 +5,95 @@ use Carp;
use SOAP::WSDL::TypeLookup; use SOAP::WSDL::TypeLookup;
use base qw(SOAP::WSDL::Expat::Base); use base qw(SOAP::WSDL::Expat::Base);
our $VERSION = q{2.00_25}; use version; our $VERSION = qv('2.00.01');
sub _import_children {
my ($self, $name, $imported, $importer, $import_namespace) = @_;
return if not $imported;
my $targetNamespace = $importer->get_targetNamespace();
my $push_method = "push_$name";
my $get_method = "get_$name";
no strict qw(refs);
my $value_ref = $imported->$get_method();
if ($value_ref) {
#print $self->get_uri(), "\n";
#use Data::Dumper;
#print Data::Dumper::Dumper $value_ref;
$value_ref = [ $value_ref ] if (not ref $value_ref eq 'ARRAY');
# set xmlns - can be different from parent
for (@{ $value_ref }) {
# fixup targetNamespace, but don't override
$_->set_targetNamespace( $import_namespace )
if ( ($import_namespace ne $targetNamespace) && ! $_->get_targetNamespace);
# update parent...
$_->set_parent( $importer );
$importer->$push_method($_);
}
# push elements into importing WSDL
#$importer->$push_method(@{ $value_ref })
# if @{ $value_ref };
}
}
sub _import_namespace_definitions {
my $self = shift;
my $arg_ref = shift;
my $importer = $arg_ref->{ importer };
my $imported = $arg_ref->{ imported };
# import namespace definitions, too
my $importer_ns_of = $importer->get_xmlns();
my %xmlns_of = %{ $imported->get_xmlns() };
while (my ($prefix, $url) = each %xmlns_of) {
$importer_ns_of->{ $prefix } = $url;
}
}
sub xml_schema_import {
my $self = shift;
my $schema = shift;
my $parser = $self->clone();
my %attr_of = @_;
my $import_namespace = $attr_of{ namespace };
my $uri = URI->new_abs($attr_of{schemaLocation}, $self->get_uri() );
my $imported = $parser->parse_uri($uri);
# might already be imported - parse_uri just returns in this case
return if not defined $imported;
$self->_import_namespace_definitions({
importer => $schema,
imported => $imported,
});
for my $name ( qw(type element group attribute attributeGroup) ) {
$self->_import_children( $name, $imported, $schema, $import_namespace);
}
}
sub wsdl_import {
my $self = shift;
my $definitions = shift;
my $parser = $self->clone();
my %attr_of = @_;
my $import_namespace = $attr_of{ namespace };
my $uri = URI->new_abs($attr_of{location}, $self->get_uri() );
my $imported = $parser->parse_uri($uri);
# might already be imported - parse_uri just returns in this case
return if not defined $imported;
$self->_import_namespace_definitions({
importer => $definitions,
imported => $imported,
});
for my $name ( qw(types message binding portType service) ) {
$self->_import_children( $name, $imported, $definitions, $import_namespace);
}
}
sub _initialize { sub _initialize {
my ($self, $parser) = @_; my ($self, $parser) = @_;
@@ -36,7 +124,9 @@ sub _initialize {
eval "require $action->{ class }"; eval "require $action->{ class }";
croak $@ if ($@); croak $@ if ($@);
my $obj = $action->{ class }->new({ parent => $current }) my $obj = $action->{ class }->new({ parent => $current,
xmlns => { '#default' => $parser->namespace($localname) }
})
->init( _fixup_attrs( $parser, %attrs ) ); ->init( _fixup_attrs( $parser, %attrs ) );
if ($current) { if ($current) {
@@ -63,7 +153,7 @@ sub _initialize {
$current->init( _fixup_attrs($parser, %attrs) ); $current->init( _fixup_attrs($parser, %attrs) );
} }
elsif ($action->{ type } eq 'METHOD') { elsif ($action->{ type } eq 'METHOD') {
my $method = $action->{ method } || $localname; my $method = $action->{ method };
no strict qw(refs); no strict qw(refs);
# call method with # call method with
@@ -79,6 +169,20 @@ sub _initialize {
: _fixup_attrs($parser, %attrs) : _fixup_attrs($parser, %attrs)
); );
} }
elsif ($action->{type} eq 'HANDLER') {
my $method = $self->can($action->{method});
$method->($self, $current, %attrs);
}
else {
# TODO replace by hash lookup of known namespaces.
my $namespace = $parser->namespace($localname) || q{};
my $part = $namespace eq 'http://schemas.xmlsoap.org/wsdl/'
? 'WSDL 1.1'
: 'XML Schema';
warn "$part element <$localname> is not implemented yet"
if ($localname !~m{ \A (:? annotation | documentation ) \z }xms );
}
return; return;
}, },
@@ -143,3 +247,43 @@ sub _fixup_attrs {
1; 1;
=pod
=head1 NAME
SOAP::WSDL::Expat::WSDLParser - Parse WSDL files into object trees
=head1 SYNOPSIS
my $parser = SOAP::WSDL::Expat::WSDLParser->new();
$parser->parse( $xml );
my $obj = $parser->get_data();
=head1 DESCRIPTION
WSDL parser used by SOAP::WSDL.
=head1 AUTHOR
Replace the whitespace by @ for E-Mail Address.
Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 LICENSE AND COPYRIGHT
Copyright 2004-2007 Martin Kutter.
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself
=head1 Repository information
$Id: WSDLParser.pm 616 2008-04-22 21:51:49Z kutterma $
$LastChangedDate: 2008-04-22 23:51:49 +0200 (Di, 22 Apr 2008) $
$LastChangedRevision: 616 $
$LastChangedBy: kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Expat/WSDLParser.pm $
+3 -3
View File
@@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Deserializer;
use strict; use strict;
use warnings; use warnings;
our $VERSION = '2.00_24'; use version; our $VERSION = qv('2.00.01');
my %DESERIALIZER = ( my %DESERIALIZER = (
'1.1' => 'SOAP::WSDL::Deserializer::XSD', '1.1' => 'SOAP::WSDL::Deserializer::XSD',
@@ -16,7 +16,7 @@ sub register {
sub get_deserializer { sub get_deserializer {
my ($self, $args_of_ref) = @_; my ($self, $args_of_ref) = @_;
$args_of_ref->{ soap_version } ||= '1.1';
# sanity check # sanity check
die "no deserializer registered for SOAP version $args_of_ref->{ soap_version }" die "no deserializer registered for SOAP version $args_of_ref->{ soap_version }"
if not exists ($DESERIALIZER{ $args_of_ref->{ soap_version } }); if not exists ($DESERIALIZER{ $args_of_ref->{ soap_version } });
@@ -137,7 +137,7 @@ passed as a single hash ref:
Copyright 2007 Martin Kutter. All rights reserved. Copyright 2007 Martin Kutter. All rights reserved.
This file is part of SOAP-WSDL. You may distribte/modify it under This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself the same terms as perl itself
=head1 AUTHOR =head1 AUTHOR
+2 -2
View File
@@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Generator;
use strict; use strict;
use warnings; use warnings;
our $VERSION='2.00_24'; use version; our $VERSION = qv('2.00.01');
my %GENERATOR = ( my %GENERATOR = (
'XSD' => 'SOAP::WSDL::Generator::Template::XSD', 'XSD' => 'SOAP::WSDL::Generator::Template::XSD',
@@ -155,7 +155,7 @@ Set user-defined typemap snippet
Copyright 2007 Martin Kutter. All rights reserved. Copyright 2007 Martin Kutter. All rights reserved.
This file is part of SOAP-WSDL. You may distribte/modify it under This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself the same terms as perl itself
=head1 AUTHOR =head1 AUTHOR
+4 -4
View File
@@ -2,7 +2,7 @@ package SOAP::WSDL::Factory::Serializer;
use strict; use strict;
use warnings; use warnings;
our $VERSION='2.00_24'; use version; our $VERSION = qv('2.00.01');
my %SERIALIZER = ( my %SERIALIZER = (
'1.1' => 'SOAP::WSDL::Serializer::XSD', '1.1' => 'SOAP::WSDL::Serializer::XSD',
@@ -16,7 +16,7 @@ sub register {
sub get_serializer { sub get_serializer {
my ($self, $args_of_ref) = @_; my ($self, $args_of_ref) = @_;
$args_of_ref->{ soap_version } ||= '1.1';
# sanity check # sanity check
die "no serializer registered for SOAP version $args_of_ref->{ soap_version }" die "no serializer registered for SOAP version $args_of_ref->{ soap_version }"
if not exists ($SERIALIZER{ $args_of_ref->{ soap_version } }); if not exists ($SERIALIZER{ $args_of_ref->{ soap_version } });
@@ -138,9 +138,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 391 $ $Rev: 616 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Serializer.pm 391 2007-11-17 21:56:13Z kutterma $ $Id: Serializer.pm 616 2008-04-22 21:51:49Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Serializer.pm $
=cut =cut
+33 -26
View File
@@ -1,10 +1,8 @@
package SOAP::WSDL::Factory::Transport; package SOAP::WSDL::Factory::Transport;
use strict; use strict;
use warnings; use warnings;
use version; our $VERSION = qv('2.00.01');
our $VERSION='2.00_25';
# class data
my %registered_transport_of = (); my %registered_transport_of = ();
# Local constants # Local constants
@@ -12,7 +10,7 @@ my %registered_transport_of = ();
my %SOAP_LITE_TRANSPORT_OF = ( my %SOAP_LITE_TRANSPORT_OF = (
ftp => 'SOAP::Transport::FTP', ftp => 'SOAP::Transport::FTP',
http => 'SOAP::Transport::HTTP', http => 'SOAP::Transport::HTTP',
https => 'SOAP::Transport::HTTPS', https => 'SOAP::Transport::HTTP',
mailto => 'SOAP::Transport::MAILTO', mailto => 'SOAP::Transport::MAILTO',
'local' => 'SOAP::Transport::LOCAL', 'local' => 'SOAP::Transport::LOCAL',
jabber => 'SOAP::Transport::JABBER', jabber => 'SOAP::Transport::JABBER',
@@ -32,13 +30,18 @@ sub register {
} }
sub get_transport { sub get_transport {
my ($class, $scheme, %attrs) = @_; my ($class, $url, %attrs) = @_;
$scheme =~s{ \A ([^\:]+) \: .+ }{$1}smx;
if ($registered_transport_of{ $scheme }) { my $scheme = $url;
eval "require $registered_transport_of{ $scheme }" $scheme =~s{ \:.+$ }{}xm;
or die "Cannot load transport class $registered_transport_of{ $scheme } : $@";
if (defined $registered_transport_of{ $scheme }) {
no strict qw(refs);
defined %{ "$registered_transport_of{ $scheme }::" } or
eval "require $registered_transport_of{ $scheme }"
or die "Cannot load transport class $registered_transport_of{ $scheme } : $@";
# try "foo::Client" class first - SOAP::Tranport always requires # try "foo::Client" class first - SOAP::Tranport always requires
# a package withoug the ::Client appended, and then # a package withoug the ::Client appended, and then
@@ -48,28 +51,32 @@ sub get_transport {
# sparse resource ... # sparse resource ...
# ... but we've decided to mimic SOAP::Lite... # ... but we've decided to mimic SOAP::Lite...
# my $protocol_class = $SOAP_LITE_TRANSPORT_OF{ $scheme } . '::Client';
# my $transport;
# eval {
# $transport = $protocol_class->new( %attrs );
# };
# return $transport if not $@;
return $registered_transport_of{ $scheme }->new( %attrs ); return $registered_transport_of{ $scheme }->new( %attrs );
} }
# try SOAP::Lite's Transport module - just skip if not require'able # try SOAP::Lite's Transport module - just skip if not require'able
SOAP_Lite: { SOAP_Lite: {
if (exists $SOAP_LITE_TRANSPORT_OF{ $scheme }) { if (exists $SOAP_LITE_TRANSPORT_OF{ $scheme }) {
eval "require $SOAP_LITE_TRANSPORT_OF{ $scheme }" no strict qw(refs);
or last SOAP_Lite; # behaves interestingly different under different versions of perl
my $protocol_class = $SOAP_LITE_TRANSPORT_OF{ $scheme } . '::Client'; # maybe true even if it's not available
return $protocol_class->new( %attrs ); defined %{ "$SOAP_LITE_TRANSPORT_OF{ $scheme }::" }
} or eval "require $SOAP_LITE_TRANSPORT_OF{ $scheme }"
or last SOAP_Lite;
my $protocol_class = $SOAP_LITE_TRANSPORT_OF{ $scheme } . '::Client';
# may fail if it's not available
my $transport = eval { $protocol_class->new( %attrs ) }
or last SOAP_Lite;
return $transport;
}
} }
if (exists $SOAP_WSDL_TRANSPORT_OF{ $scheme }) { if (exists $SOAP_WSDL_TRANSPORT_OF{ $scheme }) {
eval "require $SOAP_WSDL_TRANSPORT_OF{ $scheme }" no strict qw(refs);
or die "Cannot load transport class $SOAP_WSDL_TRANSPORT_OF{ $scheme } : $@"; defined %{ "$SOAP_WSDL_TRANSPORT_OF{ $scheme }::"}
or eval "require $SOAP_WSDL_TRANSPORT_OF{ $scheme }"
or die "Cannot load transport class $SOAP_WSDL_TRANSPORT_OF{ $scheme } : $@";
return $SOAP_WSDL_TRANSPORT_OF{ $scheme }->new( %attrs ); return $SOAP_WSDL_TRANSPORT_OF{ $scheme }->new( %attrs );
} }
@@ -155,7 +162,7 @@ the class should be used for, and $module is the class' module name.
To auto-register your transport class on loading, execute register() in your To auto-register your transport class on loading, execute register() in your
tranport class (see L<SYNOPSIS|SYNOPSIS> above). tranport class (see L<SYNOPSIS|SYNOPSIS> above).
Multiple protocols ore multiple classes are registered by multiple calls to Multiple protocols or multiple classes are registered by multiple calls to
register(). register().
=head2 Transport plugin package layout =head2 Transport plugin package layout
@@ -236,9 +243,9 @@ Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
=head1 REPOSITORY INFORMATION =head1 REPOSITORY INFORMATION
$Rev: 427 $ $Rev: 616 $
$LastChangedBy: kutterma $ $LastChangedBy: kutterma $
$Id: Transport.pm 427 2007-12-02 22:20:24Z kutterma $ $Id: Transport.pm 616 2008-04-22 21:51:49Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $ $HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Factory/Transport.pm $
=cut =cut
+270
View File
@@ -0,0 +1,270 @@
package SOAP::WSDL::Generator::Iterator::WSDL11;
use strict; use warnings;
use Class::Std::Fast;
use version; our $VERSION = qv('2.00.01');
my %definitions_of :ATTR(:name<definitions> :default<[]>);
my %nodes_of :ATTR(:name<nodes> :default<[]>);
# memoization attributes
my %portType_of :ATTR();
my %types_of :ATTR();
my %METHOD_OF = (
'SOAP::WSDL::Definitions' => 'get_service',
'SOAP::WSDL::Service' => 'get_port',
'SOAP::WSDL::Port' => sub {
my ($self, $node) = @_;
return if ! $node->first_address()
or ! $node->first_address()->isa('SOAP::WSDL::SOAP::Address');
return [ $self->get_definitions()
->find_binding( $node->expand( $node->get_binding() ) ) || () ];
},
'SOAP::WSDL::Binding' => sub {
my ($self, $node) = @_;
# remember referenced portType
$portType_of{ ident $self } = $self->get_definitions()
->find_portType( $node->expand( $node->get_type ) )
or return [];
return $node->get_operation();
},
'SOAP::WSDL::Operation' => sub {
my ($self, $node) = @_;
my $name = $node->get_name();
# get the equally named operation from the portType
my ($op) = grep { $_->get_name() eq $name }
@{ $portType_of{ ident $self }->get_operation() }
or return [];
return [ @{ $op->get_input }, @{ $op->get_output }, @{ $op->get_fault } ]
},
'SOAP::WSDL::OpMessage' => sub {
my ($self, $node) = @_;
return if ( ref $node->get_parent() eq 'SOAP::WSDL::Binding' ); # we're in binding
# TODO maybe allow more messages && overloading by specifying name
return [ $self->get_definitions()->find_message(
$node->expand( $node->get_message() )
) || () ];
},
'SOAP::WSDL::Message' => 'get_part',
'SOAP::WSDL::Part' => sub {
my ($self, $node) = @_;
my $ident = ident $self;
my $types = $types_of{ $ident } = $definitions_of{ $ident }->get_types()->[0]
or return [];
return [
# If we have a type, this type is to be used in document/literal
# as global type. However this is forbidden, at least by WS-I.
# We should store the style/encoding somewhere, and regard it.
# TODO: auto-generate element for RPC bindings
$node->get_type()
? do {
die "unsupported global type <"
. $node->get_type . "> found in part ". $node->get_name();
$types->find_type( $node->expand($node->get_type) )
}
: (),
$node->get_element()
? $types->find_element( $node->expand($node->get_element) )
: (),
];
},
);
sub init {
my ($self, $arg_of) = @_;
my $ident = ident $self;
undef $portType_of{ $ident };
undef $types_of{ $ident };
$nodes_of{ $ident } = [
exists($arg_of->{ node })
? $arg_of->{ node }
: $definitions_of{ ident $self }
];
}
sub get_next {
my $self = shift;
my $ident = ident $self;
my $node = shift @{ $nodes_of{ $ident }};
return if ! defined $node;
unshift @{ $nodes_of{ $ident }}, @{ $self->get_nextNodes( $node ) || [] };
return $node;
}
sub get_nextNodes {
my ($self, $node) = @_;
my $method = $METHOD_OF{ ref $node }
or return [];
return (ref($method) eq 'CODE')
? $method->( $self, $node )
: $node->can($method)->( $node );
}
1;
__END__
=pod
=head1 NAME
SOAP::WSDL::Generator::Iterator::WSDL11 - WSDL 1.1 Iterator
=head1 SYNOPSIS
my $iter = SOAP::WSDL::Generator::Iterator::WSDL11->new({
definitions => $wsdl
});
$iter->init();
while (my $node = $iter->get_next()) {
# do something with node - possibly call _accept with a visitor on it...
}
=head1 DESCRIPTION
Iterator for walking a WSDL 1.1 definition.
The iterator performs a depth-first search along the following path:
service
port
binding
operation
input/output/fault of operation in portType
message
part
type/element in XML schema
If you wonder about this path: This is how to look up which XML Schema element
is associated with a operation from a service/port.
=head2 Example
The nodes are returned in the order denoted in the following example:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 1 -->
<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"
targetNamespace="urn:HelloWorld"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<s:schema elementFormDefault="qualified" targetNamespace="urn:HelloWorld">
<!-- 9 -->
<s:element name="sayHello">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="name" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="givenName" type="s:string" nillable="1" />
</s:sequence>
<s:attribute name="testAttr" type="s:string" use="optional"></s:attribute>
</s:complexType>
</s:element>
<!-- 13 -->
<s:element name="sayHelloResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1"
name="sayHelloResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
</s:schema>
</types>
<!-- 7 -->
<message name="sayHelloSoapIn">
<!-- 8 -->
<part name="parameters" element="s0:sayHello" />
</message>
<!-- 11 -->
<message name="sayHelloSoapOut">
<!-- 12 -->
<part name="parameters" element="s0:sayHelloResponse" />
</message>
<portType name="Service1Soap">
<operation name="sayHello">
<!-- 6 -->
<input message="s0:sayHelloSoapIn" />
<!-- 10 -->
<output message="s0:sayHelloSoapOut" />
</operation>
</portType>
<!-- 4 -->
<binding name="Service1Soap" type="s0:Service1Soap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document" />
<!-- 5 -->
<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>
<!-- 2 -->
<service name="Service1">
<!-- 3 -->
<port name="Service1Soap" binding="s0:Service1Soap">
<soap:address
location="http://localhost:81/soap-wsdl-test/helloworld.pl" />
</port>
</service>
</definitions>
You should not rely too much on this order - it may change. Even though the
current order will probably remain, the nodes currently skipped might
be returned somewhere along the path.
=head1 LICENSE AND COPYRIGHT
Copyright 2004-2008 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: 239 $
$LastChangedBy: kutterma $
$Id: Client.pm 239 2007-09-11 09:45:42Z kutterma $
$HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Client.pm $
=cut
+145
View File
@@ -0,0 +1,145 @@
package SOAP::WSDL::Generator::PrefixResolver;
use strict; use warnings;
use Class::Std::Fast::Storable;
use version; our $VERSION = qv('2.00.01');
my %namespace_prefix_map_of :ATTR(:name<namespace_prefix_map> :default<{}>);
my %namespace_map_of :ATTR(:name<namespace_map> :default<{}>);
my %prefix_of :ATTR(:name<prefix> :default<{}>);
sub resolve_prefix {
my ($self, $type, $namespace, $element) = @_;
my $prefix;
if (not defined($namespace)) {
$prefix = $prefix_of{ $$self }->{ $type }
}
else {
$prefix = $namespace_prefix_map_of{ $$self }->{ $namespace }
|| ( ($namespace_map_of{ $$self }->{ $namespace })
? join ('::', $prefix_of{ $$self }->{ $type }, $namespace_map_of{ $$self }->{ $namespace })
: $prefix_of{ $$self }->{ $type }
);
}
return "${prefix}::";
}
1;
__END__
=pod
=head1 NAME
SOAP::WSDL::Generator::PrefixResolver - prefixes for different classes
=head1 SYNOPSIS
If you want to create your custom prefix resolver:
package MyPrefixResolver;
use strict; use warnings;
use base qw(SOAP::WSDL::Generator::PrefixResolver);
sub resolve_prefix {
my ($self, $type, $namespace, $node) = @_;
# return something special
return $self->SUPER::resolve_prefix($type, $namespace, $node);
}
When generating code:
use MyPrefixResolver;
use SOAP::WSDL::Generator::XSD;
my $generator = SOAP::WSDL::Generator::Template::XSD->new({
prefix_resolver_class => 'MyPrefixResolver',
});
=head1 DESCRIPTION
Prefix resolver class for SOAP::WSDL's code generator. You may subclass it to
apply some custom prefix resolving logic.
Subclasses must implement the following methods:
=over
=item * resolve_prefix
sub resolve_prefix {
my ($self, $namespace, $node) = @_;
# ...
}
resolve_prefix is expected to return a (perl class) prefix. It is called with
the following parameters:
NAME DESCRIPTION
-----------------------------------------------------------------------------
type One of (server|interface|typemap|type|element|attribute)
namespace The targetNamespace of the node to generate a prefix for.
node The node to generate a prefix for
You usually just need type and namespace for prefix resolving. node is
provided for rather funky setups, where you have to choose different prefixes
based on type names or whatever.
Node may be of any of the following classes:
SOAP::WSDL::Service
SOAP::WSDL::XSD::Attribute
SOAP::WSDL::XSD::Element
SOAP::WSDL::XSD::Type
Note that both namespace and node may be undef - you should test for
definedness before doing anything fancy with them.
If you want your prefixes to represent perl class hierarchies, they should
end with '::'.
Example:
Imagine you're generating interfaces for the Acme Pet Shop. Acme Corp. has
set up their datatypes to be global across all interfaces (and products), while
elements are local to the product (the Pet Shop in the example).
All elements are in the urn:Acme namespace.
In addition, there are types in the namespace urn:Acme:Goods, which should go
into the same namespace as types, but be prefixed with 'Goods_'
You may want prefixes (roughly) like this:
Interfaces: Acme::Client::PetShop::
Server: Acme::Server::PetShop::
Types: Acme::Types::
Types (Goods): Acme::Types::Goods_
Elements: Acme::Elements::PetShop::
Typemaps: Acme::Typemaps::PetShop::
=back
=head1 BUGS AND LIMITATIONS
You cannot suffix your types by some rule yet...
=head1 LICENSE AND COPYRIGHT
Copyright 2008 Martin Kutter.
This library is free software. 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: 583 $
$LastChangedBy: kutterma $
$Id: $
$HeadURL: $
=cut
+40 -22
View File
@@ -2,20 +2,25 @@ package SOAP::WSDL::Generator::Template;
use strict; use strict;
use Template; use Template;
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
use Carp;
use SOAP::WSDL::Generator::PrefixResolver;
our $VERSION=q{2.00_25}; use version; our $VERSION = qv('2.00.01');
my %tt_of :ATTR(:get<tt>); my %tt_of :ATTR(:get<tt>);
my %definitions_of :ATTR(:name<definitions> :default<()>); my %definitions_of :ATTR(:name<definitions> :default<()>);
my %server_prefix_of :ATTR(:name<server_prefix> :default<MyServer>); my %server_prefix_of :ATTR(:name<server_prefix> :default<MyServer>);
my %interface_prefix_of :ATTR(:name<interface_prefix> :default<MyInterfaces>); my %interface_prefix_of :ATTR(:name<interface_prefix> :default<MyInterfaces>);
my %typemap_prefix_of :ATTR(:name<typemap_prefix> :default<MyTypemaps>); my %typemap_prefix_of :ATTR(:name<typemap_prefix> :default<MyTypemaps>);
my %type_prefix_of :ATTR(:name<type_prefix> :default<MyTypes>); my %type_prefix_of :ATTR(:name<type_prefix> :default<MyTypes>);
my %element_prefix_of :ATTR(:name<element_prefix> :default<MyElements>); my %element_prefix_of :ATTR(:name<element_prefix> :default<MyElements>);
my %INCLUDE_PATH_of :ATTR(:name<INCLUDE_PATH> :default<()>); my %attribute_prefix_of :ATTR(:name<attribute_prefix> :default<MyAttributes>);
my %EVAL_PERL_of :ATTR(:name<EVAL_PERL> :default<0>); my %INCLUDE_PATH_of :ATTR(:name<INCLUDE_PATH> :default<()>);
my %RECURSION_of :ATTR(:name<RECURSION> :default<0>); my %EVAL_PERL_of :ATTR(:name<EVAL_PERL> :default<0>);
my %OUTPUT_PATH_of :ATTR(:name<OUTPUT_PATH> :default<.>); my %RECURSION_of :ATTR(:name<RECURSION> :default<0>);
my %OUTPUT_PATH_of :ATTR(:name<OUTPUT_PATH> :default<.>);
my %prefix_resolver_class_of :ATTR(:name<prefix_resolver_class> :default<SOAP::WSDL::Generator::PrefixResolver>);
sub START { sub START {
my ($self, $ident, $arg_ref) = @_; my ($self, $ident, $arg_ref) = @_;
@@ -25,29 +30,42 @@ sub _process :PROTECTED {
my ($self, $template, $arg_ref, $output) = @_; my ($self, $template, $arg_ref, $output) = @_;
my $ident = ident $self; my $ident = ident $self;
$tt_of{$ident} = Template->new( # always create a new Template object to
# force re-loading of plugins.
my $tt = Template->new(
DEBUG => 1, DEBUG => 1,
EVAL_PERL => $EVAL_PERL_of{ $ident }, EVAL_PERL => $EVAL_PERL_of{ $ident },
RECURSION => $RECURSION_of{ $ident }, RECURSION => $RECURSION_of{ $ident },
INCLUDE_PATH => $INCLUDE_PATH_of{ $ident }, INCLUDE_PATH => $INCLUDE_PATH_of{ $ident },
OUTPUT_PATH => $OUTPUT_PATH_of{ $ident }, OUTPUT_PATH => $OUTPUT_PATH_of{ $ident },
) PLUGIN_BASE => 'SOAP::WSDL::Generator::Template::Plugin',
if (not $tt_of{ $ident }); );
$tt_of{ $ident }->process( $template, $tt->process( $template,
{ {
context => {
prefix_resolver => $prefix_resolver_class_of{ $$self }->new({
namespace_prefix_map => {
'http://www.w3.org/2001/XMLSchema' => 'SOAP::WSDL::XSD::Typelib::Builtin',
},
namespace_map => {
},
prefix => {
interface => $self->get_interface_prefix,
element => $self->get_element_prefix,
attribute => $self->get_attribute_prefix,
server => $self->get_server_prefix,
type => $self->get_type_prefix,
typemap => $self->get_typemap_prefix,
}
}),
},
definitions => $self->get_definitions, 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 , NO_POD => delete $arg_ref->{ NO_POD } ? 1 : 0 ,
%{ $arg_ref } %{ $arg_ref }
}, },
$output) $output)
or die $INCLUDE_PATH_of{ $ident }, '\\', $template, ' ', $tt_of{ $ident }->error(); or croak $INCLUDE_PATH_of{ $ident }, '\\', $template, ' ', $tt->error();
} }
1; 1;
@@ -0,0 +1,179 @@
package SOAP::WSDL::Generator::Template::Plugin::XSD;
use strict;
use warnings;
use Carp qw(confess);
use Class::Std::Fast::Storable constructor => 'none';
use version; our $VERSION = qv('2.00.01');
my %namespace_prefix_map_of :ATTR(:name<namespace_prefix_map> :default<{}>);
my %namespace_map_of :ATTR(:name<namespace_map> :default<{}>);
my %prefix_of :ATTR(:name<prefix> :default<()>);
my %prefix_resolver_of :ATTR(:name<prefix_resolver> :default<()>);
# create a singleton
sub load { # called as MyPlugin->load($context)
my ($class, $context, @arg_from) = @_;
my $stash = $context->stash();
my $self = bless \do { my $o = Class::Std::Fast::ID() }, $class;
$self->set_prefix_resolver( $stash->{ context }->{ prefix_resolver });
return $self; # returns 'MyPlugin'
}
sub new {
return shift if ref $_[0];
my ($class, $arg_ref) = @_;
my $self = bless \do { my $o = Class::Std::Fast::ID() }, $class;
$self->set_prefix_resolver( $arg_ref->{ prefix_resolver });
return $self; # returns 'MyPlugin'
}
sub _get_prefix {
my ($self, $type, $node) = @_;
my $namespace = defined ($node)
? ref($node)
? $node->get_targetNamespace()
: $node
: undef;
return $self->get_prefix_resolver()->resolve_prefix(
$type,
$namespace,
ref($node)
? $node
: undef
);
}
sub create_xsd_name {
my ($self,$node) = @_;
my $name = $self->_resolve_prefix($node) #. '::'
. $node->get_name();
return $self->perl_name( $name );
}
sub create_typemap_name {
my ($self, $node) = @_;
my $name = $self->_get_prefix('typemap') #. '::'
. $node->get_name();
return $self->perl_name( $name );
}
sub create_server_name {
my ($self, $server, $port) = @_;
my $port_name = $port->get_name();
$port_name =~s{\A (?:.+)\. ([^\.]+) \z}{$1}x;
my $name = join( q{},
$self->_get_prefix('server', $server),
join( '::', $server->get_name(), $port_name)
);
return $self->perl_name( $name );
}
sub create_interface_name {
my ($self, $server, $port) = @_;
my $port_name = $port->get_name();
$port_name =~s{\A (?:.+)\. ([^\.]+) \z}{$1}x;
my $name = join( q{},
$self->_get_prefix('interface', $server),
join( '::', $server->get_name(), $port_name )
);
return $self->perl_name( $name );
}
sub _resolve_prefix {
my ($self, $node) = @_;
confess "no node" if not $node;
if ($node->isa('SOAP::WSDL::XSD::Builtin')) {
return $self->_get_prefix('type', $node)
}
if ( $node->isa('SOAP::WSDL::XSD::SimpleType')
or $node->isa('SOAP::WSDL::XSD::ComplexType')
) {
return $self->_get_prefix('type', $node);
}
if ( $node->isa('SOAP::WSDL::XSD::Element') ) {
return $self->_get_prefix('element', $node);
}
if ( $node->isa('SOAP::WSDL::XSD::Attribute') ) {
return $self->_get_prefix('attribute', $node);
}
}
sub perl_name {
my $self = shift;
my $name = shift;
$name =~s{\-}{_}xmsg;
$name =~s{\.}{::}xmsg;
return $name;
}
sub create_subpackage_name {
my $self = shift;
my $arg_ref = shift;
my $type = ref $arg_ref eq 'HASH' ? $arg_ref->{ value } : $arg_ref;
my @name_from = $type->get_name() || (); ;
my $parent = $type;
my $top_node = $parent;
if (! $parent->get_parent()->isa('SOAP::WSDL::XSD::Schema') ) {
NAMES: while ($parent = $parent->get_parent()) {
$top_node = $parent;
last NAMES if $parent->get_parent()->isa('SOAP::WSDL::XSD::Schema');
# skip empty names - atomic types have no name...
unshift @name_from, $parent->get_name()
if $parent->get_name();
}
}
# create name for top node
my $top_node_name = $self->create_xsd_name($top_node);
my $package_name = join('::_', $top_node_name , (@name_from) ? join('::', @name_from) : () );
return $package_name;
}
sub create_xmlattr_name {
return join '::', shift->create_subpackage_name(shift), 'XmlAttr';
}
1;
=pod
=head1 NAME
SOAP::WSDL::Generator::Template::Plugin::XSD - Template plugin for the XSD generator
=head1 METHODS
=head2 perl_name
XSD.perl_name(element.get_name);
Converts a XML name into a valid perl name (valid for subroutines, variables
or the like).
perl_name takes a crude approach by just replacing . and - (dot and dash)
with a underscore. This may or may not be sufficient, and may or may not
provoke collisions in your XML names.
=head1 LICENSE AND COPYRIGHT
Copyright 2008 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: 564 $
$LastChangedBy: kutterma $
$Id: ComplexType.pm 564 2008-02-23 13:31:39Z kutterma $
$HeadURL: http://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/XSD/Typelib/ComplexType.pm $
=cut
+108 -76
View File
@@ -5,14 +5,15 @@ use Class::Std::Fast::Storable;
use File::Basename; use File::Basename;
use File::Spec; use File::Spec;
our $VERSION = q{2.00_25}; use version; our $VERSION = qv('2.00.01');
use SOAP::WSDL::Generator::Visitor::Typemap; use SOAP::WSDL::Generator::Visitor::Typemap;
use SOAP::WSDL::Generator::Visitor::Typelib; use SOAP::WSDL::Generator::Visitor::Typelib;
use SOAP::WSDL::Generator::Template::Plugin::XSD;
use base qw(SOAP::WSDL::Generator::Template); use base qw(SOAP::WSDL::Generator::Template);
my %output_of :ATTR(:name<output> :default<()>); my %output_of :ATTR(:name<output> :default<()>);
my %typemap_of :ATTR(:name<typemap> :default<({})>); my %typemap_of :ATTR(:name<typemap> :default<({})>);
sub BUILD { sub BUILD {
my ($self, $ident, $arg_ref) = @_; my ($self, $ident, $arg_ref) = @_;
@@ -46,91 +47,104 @@ sub BUILD {
); );
} }
# construct object on call to allow late binding of prefix_resolver class
# and namespace maps (not used yet)
sub get_name_resolver {
my $self = shift;
return SOAP::WSDL::Generator::Template::Plugin::XSD->new({
prefix_resolver => $self->get_prefix_resolver_class()->new({
namespace_prefix_map => {
'http://www.w3.org/2001/XMLSchema' => 'SOAP::WSDL::XSD::Typelib::Builtin',
},
namespace_map => {
},
prefix => {
attribute => $self->get_attribute_prefix,
interface => $self->get_interface_prefix,
element => $self->get_element_prefix,
server => $self->get_server_prefix,
type => $self->get_type_prefix,
typemap => $self->get_typemap_prefix,
}
})
});
}
sub generate { sub generate {
my $self = shift; my $self = shift;
my $opt = shift; my $opt = shift;
$self->generate_typelib( $opt ); $self->generate_typelib( $opt );
# $self->generate_interface( $opt );
$self->generate_typemap( $opt ); $self->generate_typemap( $opt );
} }
sub generate_typelib { sub generate_typelib {
my ($self) = @_; my ($self, $arg_ref) = @_;
# $output_of{ ident $self } = ""; my @schema = exists $arg_ref->{ schema }
my @schema = @{ $self->get_definitions()->first_types()->get_schema() }; ? @{ $arg_ref->{schema} }
for my $type (map { @{ $_->get_type() } , @{ $_->get_element() } } @schema[1..$#schema] ) { : @{ $self->get_definitions()->first_types()->get_schema() };
for my $type (map {
@{ $_->get_type() } ,
@{ $_->get_element() },
@{ $_->get_attribute() }
} @schema[1..$#schema] ) {
$type->_accept( $self ); $type->_accept( $self );
} }
# return $output_of{ ident $self };
return; return;
} }
sub _generate_interface {
my $self = shift;
my $arg_ref = shift;
my $template_name = delete $arg_ref->{ template_name };
my $name_method = delete $arg_ref->{ name_method };
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_name_resolver()->can($name_method)->(
$self->get_name_resolver(),
$service,
$port,
));
print "Creating interface class $output\n";
$self->_process($template_name,
{
service => $service,
port => $port,
NO_POD => $arg_ref->{ NO_POD } ? 1 : 0 ,
},
$output, binmode => ':utf8');
}
}
}
sub generate_server { sub generate_server {
my $self = shift; my ($self, $arg_ref) = @_;
my $ident = ident $self; $arg_ref->{ template_name } = 'Server.tt';
my $arg_ref = shift; $arg_ref->{ name_method } = 'create_server_name';
for my $service (@{ $self->get_definitions->get_service }) { $self->_generate_interface($arg_ref);
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 { sub generate_client {
my $self = shift; my ($self, $arg_ref) = @_;
my $ident = ident $self; $arg_ref->{ template_name } = 'Interface.tt';
my $arg_ref = shift; $arg_ref->{ name_method } = 'create_interface_name';
for my $service (@{ $self->get_definitions->get_service }) { $self->_generate_interface($arg_ref);
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_interface;
*generate_interface = \&generate_client;
sub generate_typemap { sub generate_typemap {
my ($self, $arg_ref) = @_; my ($self, $arg_ref) = @_;
my $visitor = SOAP::WSDL::Generator::Visitor::Typemap->new({ my $visitor = SOAP::WSDL::Generator::Visitor::Typemap->new({
type_prefix => $self->get_type_prefix(), type_prefix => $self->get_type_prefix(),
element_prefix => $self->get_element_prefix(), element_prefix => $self->get_element_prefix(),
@@ -142,13 +156,23 @@ sub generate_typemap {
'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string', 'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
%{ $typemap_of{ident $self }}, %{ $typemap_of{ident $self }},
} },
resolver => $self->get_name_resolver(),
}); });
use SOAP::WSDL::Generator::Iterator::WSDL11;
my $iterator = SOAP::WSDL::Generator::Iterator::WSDL11->new({
definitions => $self->get_definitions });
for my $service (@{ $self->get_definitions->get_service }) { for my $service (@{ $self->get_definitions->get_service }) {
$visitor->visit_Service( $service ); $iterator->init({ node => $service });
while (my $node = $iterator->get_next()) {
$node->_accept( $visitor );
}
my $output = $arg_ref->{ output } my $output = $arg_ref->{ output }
? $arg_ref->{ output } ? $arg_ref->{ output }
: $self->_generate_filename( $self->get_typemap_prefix(), $service->get_name() ); : $self->_generate_filename( $self->get_name_resolver()->create_typemap_name($service) );
print "Creating typemap class $output\n"; print "Creating typemap class $output\n";
$self->_process('Typemap.tt', $self->_process('Typemap.tt',
{ {
@@ -161,18 +185,26 @@ sub generate_typemap {
} }
sub _generate_filename :PRIVATE { sub _generate_filename :PRIVATE {
my ($self, @parts) = @_; my ($self, $name) = @_;
my $name = join '::', @parts;
$name =~s{ \. }{::}xmsg; $name =~s{ \. }{::}xmsg;
$name =~s{ \- }{_}xmsg;
$name =~s{ :: }{/}xmsg; $name =~s{ :: }{/}xmsg;
return "$name.pm"; return "$name.pm";
} }
sub visit_XSD_Attribute {
my ($self, $attribute) = @_;
my $output = defined $output_of{ ident $self }
? $output_of{ ident $self }
: $self->_generate_filename( $self->get_name_resolver()->create_xsd_name($attribute) );
$self->_process('attribute.tt', { attribute => $attribute } , $output);
}
sub visit_XSD_Element { sub visit_XSD_Element {
my ($self, $element) = @_; my ($self, $element) = @_;
my $output = defined $output_of{ ident $self } my $output = defined $output_of{ ident $self }
? $output_of{ ident $self } ? $output_of{ ident $self }
: $self->_generate_filename( $self->get_element_prefix(), $element->get_name() ); : $self->_generate_filename( $self->get_name_resolver()->create_xsd_name($element) );
$self->_process('element.tt', { element => $element } , $output); $self->_process('element.tt', { element => $element } , $output);
} }
@@ -180,7 +212,7 @@ sub visit_XSD_SimpleType {
my ($self, $type) = @_; my ($self, $type) = @_;
my $output = defined $output_of{ ident $self } my $output = defined $output_of{ ident $self }
? $output_of{ ident $self } ? $output_of{ ident $self }
: $self->_generate_filename( $self->get_type_prefix(), $type->get_name() ); : $self->_generate_filename( $self->get_name_resolver()->create_xsd_name($type) );
$self->_process('simpleType.tt', { simpleType => $type } , $output); $self->_process('simpleType.tt', { simpleType => $type } , $output);
} }
@@ -188,7 +220,7 @@ sub visit_XSD_ComplexType {
my ($self, $type) = @_; my ($self, $type) = @_;
my $output = defined $output_of{ ident $self } my $output = defined $output_of{ ident $self }
? $output_of{ ident $self } ? $output_of{ ident $self }
: $self->_generate_filename( $self->get_type_prefix(), $type->get_name() ); : $self->_generate_filename( $self->get_name_resolver()->create_xsd_name($type) );
$self->_process('complexType.tt', { complexType => $type } , $output); $self->_process('complexType.tt', { complexType => $type } , $output);
} }
@@ -1,4 +1,6 @@
package [% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('^.+\.','') %]; [% USE XSD -%]
[% interface_name = XSD.create_interface_name(service, port) -%]
package [% interface_name %];
use strict; use strict;
use warnings; use warnings;
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
@@ -6,20 +8,20 @@ use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base); use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before # only load if it hasn't been loaded before
require [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %] require [% XSD.create_typemap_name(service) %]
if not [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]->can('get_class'); if not [% XSD.create_typemap_name(service) %]->can('get_class');
sub START { sub START {
$_[0]->set_proxy('[% port.first_address.get_location %]') if not $_[2]->{proxy}; $_[0]->set_proxy('[% port.first_address.get_location %]') if not $_[2]->{proxy};
$_[0]->set_class_resolver('[% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]') $_[0]->set_class_resolver('[% XSD.create_typemap_name(service) %]')
if not $_[2]->{class_resolver}; if not $_[2]->{class_resolver};
} }
[% binding = definitions.find_binding( port.expand( port.get_binding ) ); [% binding = definitions.find_binding( port.expand( port.get_binding ) );
FOREACH operation = binding.get_operation; FOREACH operation = binding.get_operation;
%][% INCLUDE Interface/Operation.tt %] %][% INCLUDE Interface/Operation.tt %]
[%
[%
END; END;
%] %]
@@ -28,18 +30,22 @@ sub START {
[% IF NO_POD; STOP; END %] [% IF NO_POD; STOP; END %]
__END__ __END__
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% pod = BLOCK %]=pod[% END -%]
[% head1 = BLOCK %]=head1[% END -%]
[% head2 = BLOCK %]=head2[% END -%]
[% head3 = BLOCK %]=head3[% END -%]
=pod [% pod %]
=head1 NAME [% head1 %] NAME
[% interface_name %] - SOAP Interface for the [% service.get_name %] Web Service
[% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %] - SOAP Interface for the [% service.get_name %] Web Service [% head1 %] SYNOPSIS
=head1 SYNOPSIS use [% interface_name %];
my $interface = [% interface_name %]->new();
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; my $response;
[% FOREACH operation = binding.get_operation; [% FOREACH operation = binding.get_operation;
@@ -47,40 +53,39 @@ __END__
[% END %] [% END %]
=head1 DESCRIPTION [% head1 %] DESCRIPTION
SOAP Interface for the [% service.get_name %] web service SOAP Interface for the [% service.get_name %] web service
located at [% port.first_address.get_location %]. located at [% port.first_address.get_location %].
=head1 SERVICE [% service.get_name %] [% head1 %] SERVICE [% service.get_name %]
[% service.get_documentation %] [% service.get_documentation %]
=head2 Port [% port.get_name %] [% head2 %] Port [% port.get_name %]
[% port.get_documentation %] [% port.get_documentation %]
=head1 METHODS [% head1 %] METHODS
=head2 General methods [% head2 %] General methods
=head3 new [% head3 %] new
Constructor. Constructor.
All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>. All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
=head2 SOAP Service methods [% head2 %] SOAP Service methods
[% INCLUDE Interface/POD/method_info.tt %] [% INCLUDE Interface/POD/method_info.tt %]
[% FOREACH operation = binding.get_operation; [% FOREACH operation = binding.get_operation;
%][% INCLUDE Interface/POD/Operation.tt %] %][% INCLUDE Interface/POD/Operation.tt %]
[% END %] [% END %]
=head1 AUTHOR [% head1 %] AUTHOR
Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %] Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %]
=pod =cut
@@ -1,14 +1,12 @@
[% RETURN IF NOT item; [% RETURN IF NOT item;
type = definitions.find_portType( binding.expand( binding.get_type ) ); type = definitions.find_portType( binding.expand( binding.get_type ) );
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name ); port_op = type.find_operation( type.get_targetNamespace, operation.get_name );
message = definitions.find_message( port_op.first_input.expand( port_op.first_input.get_message ) ); message = definitions.find_message( port_op.first_input.expand( port_op.first_input.get_message ) );
part_from = message.get_part; part_from = message.get_part;
PERL %] PERL %]
my $item = $stash->{ item }; my $item = $stash->{ item };
my $def = $stash->{ definitions }; my $def = $stash->{ definitions };
my $part_from = $stash->{ part_from }; my $part_from = $stash->{ message }->get_part();
my $type_prefix = $stash->{ type_prefix };
my $element_prefix = $stash->{ element_prefix };
my @body_part_from = split m{\s}, $item->get_parts; my @body_part_from = split m{\s}, $item->get_parts;
@@ -17,22 +15,25 @@
@parts = map { @parts = map {
my $part = $_; my $part = $_;
(grep { (grep {
my ($ns, $lname) = $def->expand( $_ ); # my ($ns, $lname) = $def->expand( $_ );
($lname eq $part->get_name) ($_ eq $part->get_name)
} @body_part_from } @body_part_from
) )
? do { ? do {
my $name; my $name;
($name = $part->get_element) ($name = $part->get_element)
? do { ? do {
$name =~s{ ^[^:]+: }{}xms; my $element = $def->first_types->find_element($part->expand($name));
$element_prefix . '::' . $name; my $resolver = $context->plugin('XSD');
} $resolver->create_xsd_name($element);
}
: ($name = $part->get_type) : ($name = $part->get_type)
? do { ? do {
$name =~s{ ^[^:]+: }{}xms; my $element = $def->first_types->find_type($part->expand($name));
$type_prefix . '::' . $name; my $resolver = $context->plugin('XSD');
} $resolver->create_xsd_name($element);
}
: die "input must have either type or element" : die "input must have either type or element"
} }
: () : ()
@@ -44,21 +45,31 @@
my $name; my $name;
($name = $part->get_element) ($name = $part->get_element)
? do { ? do {
$name =~s{ ^[^:]+: }{}xms; my $element = $def->first_types->find_element($part->expand($name));
"$element_prefix\::$name" my $resolver = $context->plugin('XSD');
} $resolver->create_xsd_name($element);
}
: ($name = $part->get_type) : ($name = $part->get_type)
? do { ? do {
$name =~s{ ^[^:]+: }{}xms; my $element = $def->first_types->find_type($part->expand($name));
"$type_prefix\::$name" my $resolver = $context->plugin('XSD');
$resolver->create_xsd_name($element);
} }
: die "input must have either type or element"; : die "input must have either type or element";
} @{ $part_from }; } @{ $part_from };
} }
warn "Multiple parts detected in message " . $stash->{ message }->get_name() . ".\n",
"WS-I BP demands 0 to 1 parts in message body\n"
if (@parts > 1);
$stash->{ parts } = \@parts; $stash->{ parts } = \@parts;
[% END %] [% END %]
'use' => '[% item.get_use %]', [% IF item.get_use != 'literal';
namespace => '[% item.get_namespace %]', THROW NOT_SUPPORTED "Body: SOAP::WSDL supports literal encoding only - ${ item.get_use } found";
encodingStyle => '[% item.get_encodingStyle %]', END %]
parts => [qw( [% parts.join(' ') %] )], 'use' => '[% item.get_use %]',
namespace => '[% item.get_namespace %]',
encodingStyle => '[% item.get_encodingStyle %]',
parts => [qw( [% parts.join(' ') %] )],
@@ -11,27 +11,34 @@
my $def = $stash->{ definitions }; my $def = $stash->{ definitions };
my $type_prefix = $stash->{ type_prefix }; my $type_prefix = $stash->{ type_prefix };
my $element_prefix = $stash->{ element_prefix }; my $element_prefix = $stash->{ element_prefix };
my ($ns, $lname) = $def->expand( $item->get_part() ); #my ($ns, $lname) = $def->expand( $item->get_part() );
my $part_name = $item->get_part();
my ($part) = grep { my ($part) = grep {
$_->get_name eq $lname $_->get_name eq $part_name
&& $_->get_targetNamespace eq $ns } @{ $message->get_part( ) }; } @{ $message->get_part( ) };
my $part_class = do { my $part_class = do {
my $name; my $name;
($name = $part->get_element) ($name = $part->get_element)
? do { ? do {
$name =~s{ ^[^:]+: }{}xms; my $element = $def->first_types->find_element($part->expand($name));
$element_prefix . '::' . $name; my $resolver = $context->plugin('XSD');
$resolver->create_xsd_name($element);
} }
: ($name = $part->get_type) : ($name = $part->get_type)
? do { ? do {
$name =~s{ ^[^:]+: }{}xms; my $element = $def->first_types->find_type($part->expand($name));
$type_prefix . '::' . $name; my $resolver = $context->plugin('XSD');
} $resolver->create_xsd_name($element);
}
: die "input must have either type or element" : die "input must have either type or element"
}; };
$stash->{ part_class } = $part_class; $stash->{ part_class } = $part_class;
[% END; [% END;
%] %]
[% IF item.get_use != 'literal';
THROW NOT_SUPPORTED "Header: SOAP::WSDL supports literal encoding only - ${ item.get_use } found";
END %]
'use' => '[% item.get_use %]', 'use' => '[% item.get_use %]',
namespace => '[% item.get_namespace %]', namespace => '[% item.get_namespace %]',
encodingStyle => '[% item.get_encodingStyle %]', encodingStyle => '[% item.get_encodingStyle %]',
@@ -4,7 +4,12 @@ sub [% operation.get_name %] {
return $self->SUPER::call({ return $self->SUPER::call({
operation => '[% operation.get_name %]', operation => '[% operation.get_name %]',
soap_action => '[% operation.first_operation.get_soapAction %]', soap_action => '[% operation.first_operation.get_soapAction %]',
style => '[% operation.get_style || binding.get_style %]', style => [% style = operation.first_operation.get_style || binding.get_style;
IF style != "document";
THROW NOT_SUPPORTED "SOAP::WSDL supports document encoding only - $style found";
END;
-%]
'[% style %]',
body => { body => {
[% INCLUDE Interface/Body.tt( item = operation.first_input.first_body ); %] [% INCLUDE Interface/Body.tt( item = operation.first_input.first_body ); %]
}, },
@@ -1,8 +1,9 @@
=head3 [% operation.get_name %] [%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% head3 = BLOCK %]=head3[% END -%]
[% head3 %] [% operation.get_name %]
[% type = definitions.find_portType( binding.expand( binding.get_type ) ); [% type = definitions.find_portType( binding.expand( binding.get_type ) );
port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name ); port_op = type.find_operation( definitions.get_targetNamespace, operation.get_name );
port_op.get_documentation %] port_op.get_documentation %]
$interface->[% operation.get_name %]([% INCLUDE Interface/POD/Message.tt %] ); $interface->[% operation.get_name %]([% INCLUDE Interface/POD/Message.tt %] );
@@ -5,3 +5,12 @@ 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 You may pass any combination of objects, hash and list refs to these
methods, as long as you meet the structure. methods, as long as you meet the structure.
List items (i.e. multiple occurences) are not displayed in the synopsis.
You may generally pass a list ref of hash refs (or objects) instead of a hash
ref - this may result in invalid XML if used improperly, though. Note that
SOAP::WSDL always expects list references at maximum depth position.
XML attributes are not displayed in this synopsis and cannot be set using
hash refs. See the respective class' documentation for additional information.
@@ -0,0 +1,2 @@
[% node.get_annotation.0.get_documentation %]
+28 -20
View File
@@ -1,4 +1,7 @@
package [% server_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('^.+\.','') %]; [% USE XSD;
server_name = XSD.create_server_name(service, port);
-%]
package [% server_name %];
use strict; use strict;
use warnings; use warnings;
use Class::Std::Fast::Storable; use Class::Std::Fast::Storable;
@@ -6,8 +9,8 @@ use Scalar::Util qw(blessed);
use base qw(SOAP::WSDL::Client::Base); use base qw(SOAP::WSDL::Client::Base);
# only load if it hasn't been loaded before # only load if it hasn't been loaded before
require [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %] require [% XSD.create_typemap_name(service) %]
if not [% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]->can('get_class'); if not [% XSD.create_typemap_name(service) %]->can('get_class');
my %transport_class_of :ATTR(:name<transport_class> :default<SOAP::WSDL::Server::CGI>); my %transport_class_of :ATTR(:name<transport_class> :default<SOAP::WSDL::Server::CGI>);
my %transport_of :ATTR(:name<transport> :default<()>); my %transport_of :ATTR(:name<transport> :default<()>);
@@ -27,13 +30,13 @@ sub START {
or die "Cannot load transport class $transport_class_of{ $ident }: $@"; or die "Cannot load transport class $transport_class_of{ $ident }: $@";
$transport_of{ $ident } = $transport_class_of{ $ident }->new({ $transport_of{ $ident } = $transport_class_of{ $ident }->new({
action_map_ref => $action_map_ref, action_map_ref => $action_map_ref,
class_resolver => '[% typemap_prefix %]::[% service.get_name.replace('\.', '::') %]', class_resolver => '[% XSD.create_typemap_name(service) %]',
dispatch_to => $dispatch_to{ $ident }, dispatch_to => $dispatch_to{ $ident },
}); });
} }
sub handle { sub handle {
$transport_of{ ${ $_[0] } }->handle(); $transport_of{ ${ $_[0] } }->handle(@_[1..$#_]);
} }
1; 1;
@@ -41,48 +44,53 @@ sub handle {
[% IF NO_POD; STOP; END %] [% IF NO_POD; STOP; END %]
__END__ __END__
[%# work around for CPAN's indexer, which gets disturbed by pod in templates -%]
[% pod = BLOCK %]=pod[% END -%]
[% head1 = BLOCK %]=head1[% END -%]
[% head2 = BLOCK %]=head2[% END -%]
[% head3 = BLOCK %]=head3[% END -%]
=pod [% pod %]
=head1 NAME [% head1 %] NAME
[% interface_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %] - SOAP Server Class for the [% service.get_name %] Web Service [% server_name %] - SOAP Server Class for the [% service.get_name %] Web Service
=head1 SYNOPSIS [% head1 %] SYNOPSIS
use [% server_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %]; use [% server_name %];
my $server = [% server_prefix %]::[% service.get_name.replace('\.', '::') %]::[% port.get_name.replace('\.', '::') %]->new({ my $server = [% server_name %]->new({
dispatch_to => 'My::Handler::Class', dispatch_to => 'My::Handler::Class',
transport_class => 'SOAP::WSDL::Server::CGI', # optional, default transport_class => 'SOAP::WSDL::Server::CGI', # optional, default
}); });
$server->handle(); $server->handle();
=head1 DESCRIPTION [% head1 %] DESCRIPTION
SOAP Server handler for the [% service.get_name %] web service SOAP Server handler for the [% service.get_name %] web service
located at [% port.first_address.get_location %]. located at [% port.first_address.get_location %].
=head1 SERVICE [% service.get_name %] [% head1 %] SERVICE [% service.get_name %]
[% service.get_documentation %] [% service.get_documentation %]
=head2 Port [% port.get_name %] [% head2 %] Port [% port.get_name %]
[% port.get_documentation %] [% port.get_documentation %]
=head1 METHODS [% head1 %] METHODS
=head2 General methods [% head2 %] General methods
=head3 new [% head3 %] new
Constructor. Constructor.
The C<dispatch_to> argument is mandatory. It must be a class or object The C<dispatch_to> argument is mandatory. It must be a class or object
implementing the SOAP Service methods listed below. implementing the SOAP Service methods listed below.
=head2 SOAP Service methods [% head2 %] SOAP Service methods
[% INCLUDE Server/POD/method_info.tt %] [% INCLUDE Server/POD/method_info.tt %]
@@ -90,8 +98,8 @@ implementing the SOAP Service methods listed below.
%][% INCLUDE Server/POD/Operation.tt %] %][% INCLUDE Server/POD/Operation.tt %]
[% END %] [% END %]
=head1 AUTHOR [% head1 %] AUTHOR
Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %] Generated by SOAP::WSDL on [% PERL %]print scalar localtime() [% END %]
=pod =cut

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